ZX Калькулятор

 Уже пробовал использовать калькулятор, но неудачно - программа либо работала криво, либо сбрасывалась(переполнение стека). Вечером нашлось время, и понеслись опыты. На сайте zxpress.ru найдется немало статей, в которых есть некоторые неточности, на которые нет времени указать.

Опыт 1. Операции со стеком.
org $8000
start
ld hl,($5c65);STKEND
push hl
rst $28
db $A1; stkone
db $38 ; end calc
pop hl
ld de,($5c65)
jr $
end start

Как видно в коде я сохранил данные указателя на стек калькулятора. Как он выглядит в отладчике:
Выходит, что на одно число понадобилось 5 байт. Теперь число нужно удалить со стека:
org $8000
start

ld hl,($5c65)
push hl
rst $28
db $A1; stkone
db 2;delete
db $38 ; end calc
pop hl
ld de,($5c65)
jr $
end start

Удаление прошло успешно(: HL=DE.

Опыт 2. Операции
Для удобства в руководствах используются обозначения X,Y,Z, и мне стало совсем непонятно - порядок расположения чисел на стеке, и как выполняются операции.
Написал программу, которая разместит на стеке числа 3 и 1, делит числа и печатает результат - получил 3. Поэтому код стал другим:
org $8000
start
 call $0D6b
 ld a,2
 call $1601

ld hl,($5c65)
push hl
ld a,1
call $2d28;STACK_A https://zxpress.ru/book_articles.php?id=1150
;$2d2b STACK-BC Introduce en la parte superior de la pila de BASIC el valor del registro BC (“last value” = BC).
ld a,3
call $2d28
rst $28
db 5; x/y
db $38 ; end calc
call $2de3;PRINT-FP https://vitsoft.info/zxref.htm
pop hl
ld de,($5c65)
jr $
end start

Получается, что порядок на стеке такой: Y=3,X=1(тут низ стека). Глянул на отладчик:

Э: а почему на стеке только одно число? HL=конец указателя стека, DE=верх, DE-HL=5. Стал копать дальше, и нашел книгу The Spectrum Operating System/Steve Kramer и статью.

Получается, что операция снимает два числа со стека и помещает результат деления.

У моего приятеля был любимый анекдот:

Мужик стоит возле раковины и ожесточенно стирает свои штаны,
приговаривая:" Никому верить нельзя. Никому, никогда верить нельзя!
Никому, блядь, верить нельзя в этой стране!!! НИ-КО-МУ!!! БЛЯДЬ!!! Даже
себе... А ведь только пукнуть хотел!!!".

Так и здесь, лучше не доверять написанному, а удостовериться самому. 
Исходники,.TAP и доки. Остался один неразрешенный вопрос, к которому вернусь позже.

Дополнение. Интереса ради добавил лишние коды 2(delete) - вышло так, что без проверок удаляются данные. В дизассемблере не очень понятно, что происходит - удаляется число на стеке и заканчивается RET.

Комментарии