ROM:0000 ;
ROM:0000 ; +-------------------------------------------------------------------------+
ROM:0000 ; | This file is generated by The Interactive Disassembler (IDA) |
ROM:0000 ; | Copyright (c) 2007 by DataRescue sa/nv, <ida@datarescue.com> |
ROM:0000 ; | Licensed to: Mach EDV Dienstleistungen, Jan Mach, 1 user, adv, 11/2007 |
ROM:0000 ; +-------------------------------------------------------------------------+
ROM:0000 ;
ROM:0000 ; Input MD5 : 1C7D451AFF559ADD17CFFC63D8BE8A64
ROM:0000
ROM:0000 ; File Name : C:\SURA\sura.rom
ROM:0000 ; Format : Binary file
ROM:0000 ; Base Address: 0000h Range: 0000h - 4000h Loaded length: 4000h
ROM:0000
ROM:0000 ; Processor : 8085 []
ROM:0000 ; Target assembler: Table Driven Assembler (TASM) by Speech Technology Inc.
ROM:0000
ROM:0000 ; ===========================================================================
ROM:0000
ROM:0000 ; Segment type: Pure code
ROM:0000
ROM:0000 ; =============== S U B R O U T I N E =======================================
ROM:0000
ROM:0000 ; RST0 = старт. ОЗУ при этом инициализируется, но не очищается.
ROM:0000 ; Т. е. если сделать POKE 50000, 255 а потом X=USR(0), то в памяти по адресу 50000 так и останется лежать байт 255.
ROM:0000 ; При этом, конечно, рабочие области подлежат инициализации, как и упоминалось.
ROM:0000
ROM:0000 START: ; CODE XREF: ROM:0005j
ROM:0000 ; ROM:165Dp ...
ROM:0000
ROM:0000 ; FUNCTION CHUNK AT ROM:1742 SIZE 00000017 BYTES
ROM:0000 ; FUNCTION CHUNK AT ROM:2920 SIZE 00000084 BYTES
ROM:0000
ROM:0000 di
ROM:0001 jmp INIT
ROM:0001 ; End of function START
ROM:0001
ROM:0004 ; ---------------------------------------------------------------------------
ROM:0004 nop
ROM:0005 jmp START ; RST0 = старт. ОЗУ при этом инициализируется, но не очищается.
ROM:0005 ; Т. е. если сделать POKE 50000, 255 а потом X=USR(0), то в памяти по адресу 50000 так и останется лежать байт 255.
ROM:0005 ; При этом, конечно, рабочие области подлежат инициализации, как и упоминалось.
ROM:0008
ROM:0008 ; =============== S U B R O U T I N E =======================================
ROM:0008
ROM:0008 ; RST1 = проверка синтаксиса.
ROM:0008 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:0008 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:0008 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:0008 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:0008
ROM:0008 SYNTAXCHECK: ; CODE XREF: ROM:0559p LET+3p ...
ROM:0008 mov a, m
ROM:0009 xthl
ROM:000A cmp m
ROM:000B inx h
ROM:000C xthl
ROM:000D jnz SYNTAXERROR ; Самая распространённая ошибка №2
ROM:000D ; End of function SYNTAXCHECK
ROM:000D
ROM:0010
ROM:0010 ; =============== S U B R O U T I N E =======================================
ROM:0010
ROM:0010 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:0010 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:0010 ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:0010
ROM:0010 NEXTCHAR: ; CODE XREF: CHECKENOUGHMEM+55p
ROM:0010 ; CHECKENOUGHMEM+6Bp ...
ROM:0010 inx h
ROM:0011 mov a, m
ROM:0012 cpi 3Ah ; ':'
ROM:0014 rnc
ROM:0015 jmp NEXTCHAR2 ; возвращает в A следующий символ ввода из буфера в HL,
ROM:0015 ; End of function NEXTCHAR ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:0015 ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:0018
ROM:0018 ; =============== S U B R O U T I N E =======================================
ROM:0018
ROM:0018 ; RST3 = печатает символ из A на экран.
ROM:0018
ROM:0018 OUTCHAR: ; CODE XREF: INPUTSTR-4Ap
ROM:0018 ; INPUTSTR-26p ...
ROM:0018
ROM:0018 ; FUNCTION CHUNK AT ROM:04B7 SIZE 00000010 BYTES
ROM:0018 ; FUNCTION CHUNK AT ROM:1AAF SIZE 00000027 BYTES
ROM:0018
ROM:0018 push psw
ROM:0019 lda TERMINAL_X ; Переменная, контролирующая текущую X позицию вывода терминала.
ROM:001C ora a
ROM:001D jmp OUTCHAR2
ROM:001D ; End of function OUTCHAR
ROM:001D
ROM:0020
ROM:0020 ; =============== S U B R O U T I N E =======================================
ROM:0020
ROM:0020 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения.
ROM:0020
ROM:0020 COMPAREHLDE: ; CODE XREF: KBDBUFAK2+9p
ROM:0020 ; GETFLOWPTR+17p ...
ROM:0020 mov a, h
ROM:0021 sub d
ROM:0022 rnz
ROM:0023 mov a, l
ROM:0024 sub e
ROM:0025 ret
ROM:0025 ; End of function COMPAREHLDE
ROM:0025
ROM:0025 ; ---------------------------------------------------------------------------
ROM:0026 TERMINAL_Y_0: .db 1 ; Переменная, контролирующая текущую X позицию вывода терминала.
ROM:0027 TERMINAL_X_0: .db 0 ; Переменная, контролирующая текущую Y позицию вывода терминала.
ROM:0028
ROM:0028 ; =============== S U B R O U T I N E =======================================
ROM:0028
ROM:0028 ; RST5 = Проверяет состояние FACCUM.
ROM:0028 ; Возвращает A = 0 и устанавливает Z, если FACCUM == 0, хвост функции устанавливает флаг знака и A соответственно
ROM:0028 ; (0xFF если отрицательно, 0x01 если положительно).
ROM:0028
ROM:0028 FTESTSIGN: ; CODE XREF: ROM:057Bp
ROM:0028 ; FUNCTIONAKp ...
ROM:0028
ROM:0028 ; FUNCTION CHUNK AT ROM:12CA SIZE 0000000A BYTES
ROM:0028
ROM:0028 lda FACCUM+3 ; Аккумулятор для вычислений с плавающей точкой:
ROM:0028 ; 00000000 1 11111111111111111111111
ROM:0028 ; -------- - -----------------------
ROM:0028 ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:002B ora a
ROM:002C jnz FTESTSIGN2
ROM:002F ret
ROM:002F ; End of function FTESTSIGN
ROM:002F
ROM:0030
ROM:0030 ; =============== S U B R O U T I N E =======================================
ROM:0030
ROM:0030 ; Псевдокоманда PUSH (HL).
ROM:0030 ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP.
ROM:0030 ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD.
ROM:0030
ROM:0030 PUSHNEXTWORD: ; CODE XREF: FINDPROGRAMLINE2+8p
ROM:0030 ; FINDPROGRAMLINE2+9p ...
ROM:0030
ROM:0030 ; FUNCTION CHUNK AT ROM:0166 SIZE 00000008 BYTES
ROM:0030
ROM:0030 xthl
ROM:0031 shld NEXTWORD ; Адрес перехода для RST6
ROM:0034 pop h
ROM:0035 jmp PUSHNEXTWORD2
ROM:0035 ; End of function PUSHNEXTWORD
ROM:0035
ROM:0038
ROM:0038 ; =============== S U B R O U T I N E =======================================
ROM:0038
ROM:0038 ; RST7 = обработка прерываний.
ROM:0038 ; Attributes: thunk
ROM:0038
ROM:0038 INTRPT: ; CODE XREF: INTERRPTp
ROM:0038 ; INTERRPT+1p ...
ROM:0038 jmp INTRPT2 ; Обработка прерываний.
ROM:0038 ; End of function INTRPT
ROM:0038
ROM:003B
ROM:003B ; =============== S U B R O U T I N E =======================================
ROM:003B
ROM:003B ; A=символ (вывод символа на экран в текущую позицию курсора).
ROM:003B ; Attributes: thunk
ROM:003B
ROM:003B SYMSCR: ; CODE XREF: OUTCHAR+4A7p
ROM:003B ; STRPRN+Ap
ROM:003B jmp SYMSCR2 ; вывод символа из A на экран в текущую позицию курсора
ROM:003B ; End of function SYMSCR
ROM:003B
ROM:003E ; ---------------------------------------------------------------------------
ROM:003E
ROM:003E FNKEYFL: ; Сбрасывает настройки функциональных клавиш по умолчанию
ROM:003E jmp FNKEYFL2
ROM:0041 ; ---------------------------------------------------------------------------
ROM:0041
ROM:0041 SYMPRN: ; A=символ (вывод символа на печать).
ROM:0041 jmp SYMPRN2
ROM:0044
ROM:0044 ; =============== S U B R O U T I N E =======================================
ROM:0044
ROM:0044 ; CPP=(FA24) цвет точки CZP=(FA25) цвет фона CRG=(FA26) цвет рамки (установка цвета).
ROM:0044 ; Attributes: thunk
ROM:0044
ROM:0044 SETCOLOR: ; CODE XREF: ROM:1A16p
ROM:0044 jmp SETCOLOR2 ; Установка цвета
ROM:0044 ; End of function SETCOLOR
ROM:0044
ROM:0047 ; ---------------------------------------------------------------------------
ROM:0047
ROM:0047 KBDRAW: ; A=номер ряда (A=состояние ряда: опрос ряда клавиатурной матрицы).
ROM:0047 jmp KBDRAW2
ROM:004A
ROM:004A ; =============== S U B R O U T I N E =======================================
ROM:004A
ROM:004A ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM).
ROM:004A
ROM:004A VRAMBTRD: ; CODE XREF: PSET_ASM+2Ap
ROM:004A ; PSET_ASM+41p ...
ROM:004A jmp VRAMRD
ROM:004A ; End of function VRAMBTRD
ROM:004A
ROM:004D ; ---------------------------------------------------------------------------
ROM:004D
ROM:004D VRAMBTWR: ; HL=адрес VRAM, A=байт (запись байта в VRAM).
ROM:004D mov m, a
ROM:004E ret
ROM:004E ; ---------------------------------------------------------------------------
ROM:004F .db 0
ROM:0050
ROM:0050 ; =============== S U B R O U T I N E =======================================
ROM:0050
ROM:0050 ; A=флажки, HL=адрес, D=строка курсора, E=позиция курсора
ROM:0050 ; (A=0 редактирование
ROM:0050 ; A=1 установка курсора
ROM:0050 ; A=2 вывод текста на экран с текущего положения курсора
ROM:0050 ; A=3 установка курсора и вывод текста
ROM:0050 ; A=4 вывод строк)
ROM:0050 ; Attributes: thunk
ROM:0050
ROM:0050 EDIT: ; CODE XREF: INPUTLN-100p
ROM:0050 ; START+1750p ...
ROM:0050 jmp EDIT2 ; Обработка строк редактором
ROM:0050 ; End of function EDIT
ROM:0050
ROM:0053
ROM:0053 ; =============== S U B R O U T I N E =======================================
ROM:0053
ROM:0053 ; BC=счетчик, DE=адрес приема, HL=адрес источника
ROM:0053 ; (пересылка VRAM -> RAM)
ROM:0053
ROM:0053 VRAM2RAM: ; CODE XREF: SALOTR+Ep
ROM:0053 jmp VRAM2RAM_
ROM:0053 ; End of function VRAM2RAM
ROM:0053
ROM:0056
ROM:0056 ; =============== S U B R O U T I N E =======================================
ROM:0056
ROM:0056 ; A=константа, BC=счетчик, HL=адрес (заполнение области константой)
ROM:0056 ; Attributes: thunk
ROM:0056
ROM:0056 FILLAREA: ; CODE XREF: EDIT1+27p
ROM:0056 ; ROM:1C6Ap ...
ROM:0056 jmp FILLAREA2 ; Заполнение области константой
ROM:0056 ; End of function FILLAREA
ROM:0056
ROM:0059
ROM:0059 ; =============== S U B R O U T I N E =======================================
ROM:0059
ROM:0059 ; BC=счетчик, DE=адрес приема, HL=адрес источника
ROM:0059 ; (пересылка VRAM->RAM, VRAM->VRAM)
ROM:0059
ROM:0059 VRAMSEND: ; CODE XREF: EDIT3+40p
ROM:0059 ; KEYSON3+1Bp ...
ROM:0059 jmp VRAM2RAM_
ROM:0059 ; End of function VRAMSEND
ROM:0059
ROM:005C
ROM:005C ; =============== S U B R O U T I N E =======================================
ROM:005C
ROM:005C ; BC=счетчик, DE=адрес приема, HL=адрес источника
ROM:005C ; (пересылка RAM->RAM, RAM->VRAM)
ROM:005C
ROM:005C RAMSEND: ; CODE XREF: RAMSEND+7j
ROM:005C ; INTRPT2+63p ...
ROM:005C mov a, m
ROM:005D stax d
ROM:005E inx d
ROM:005F inx h
ROM:0060 dcx b
ROM:0061 mov a, b
ROM:0062 ora c
ROM:0063 jnz RAMSEND ; BC=счетчик, DE=адрес приема, HL=адрес источника
ROM:0063 ; (пересылка RAM->RAM, RAM->VRAM)
ROM:0066 ret
ROM:0066 ; End of function RAMSEND
ROM:0066
ROM:0067
ROM:0067 ; =============== S U B R O U T I N E =======================================
ROM:0067
ROM:0067 ; A=байт, BC=адрес
ROM:0067 ; (перекодировка A (шестнадцатеричного) в символы)
ROM:0067 ; Attributes: thunk
ROM:0067
ROM:0067 BTDECODE: ; CODE XREF: ROM:1FCBp
ROM:0067 ; ROM:1FCFp
ROM:0067 jmp BTDECODE2 ; Перекодировка A в символы
ROM:0067 ; End of function BTDECODE
ROM:0067
ROM:006A
ROM:006A ; =============== S U B R O U T I N E =======================================
ROM:006A
ROM:006A ; A=режим (установка режима 0, 1, 2)
ROM:006A ; Attributes: thunk
ROM:006A
ROM:006A SETMODE: ; CODE XREF: ROM:1A22p
ROM:006A ; EDIT1+3Cp
ROM:006A jmp SETMODE2 ; Установка режима экрана
ROM:006A ; End of function SETMODE
ROM:006A
ROM:006D
ROM:006D ; =============== S U B R O U T I N E =======================================
ROM:006D
ROM:006D ; A=код (0,1,2):
ROM:006D ; 0 - клавиатура,
ROM:006D ; 1 - джойстик №1,
ROM:006D ; 2 - джойстик №2.
ROM:006D ; (A=код направления: чтение направления,
ROM:006D ; 8 1 2
ROM:006D ; 7<-0->3
ROM:006D ; 6 5 4
ROM:006D ; Attributes: thunk
ROM:006D
ROM:006D JOYDIR: ; CODE XREF: ROM:1A66p
ROM:006D jmp JOYDIR2 ; Чтение направления джойстика
ROM:006D ; End of function JOYDIR
ROM:006D
ROM:0070
ROM:0070 ; =============== S U B R O U T I N E =======================================
ROM:0070
ROM:0070 ; Опрос состояния кнопки.
ROM:0070 ; A=код (0,1,2):
ROM:0070 ; 0 - клавиатура,
ROM:0070 ; 1 - джойстик №1,
ROM:0070 ; 2 - джойстик №2.
ROM:0070 ; (A=состояние кнопки (пробел - клавиатуры),
ROM:0070 ; 0 - не нажата,
ROM:0070 ; 1 - нажата)
ROM:0070 ; Attributes: thunk
ROM:0070
ROM:0070 ASKBTN: ; CODE XREF: ROM:1A59p
ROM:0070 jmp ASKBTN2 ; Опрос состояния кнопки джойстика
ROM:0070 ; End of function ASKBTN
ROM:0070
ROM:0073
ROM:0073 ; =============== S U B R O U T I N E =======================================
ROM:0073
ROM:0073 ; Обработка звука нажатия клавиш и CHR(7) (в зависимости от BEEPF)
ROM:0073 ; Attributes: thunk
ROM:0073
ROM:0073 BELL: ; CODE XREF: ROM:1D4Ep
ROM:0073 jmp BELL2 ; Обработка звука нажатия клавиш и CHR$(&h07) (в зависимости от BEEPF)
ROM:0073 ; End of function BELL
ROM:0073
ROM:0076
ROM:0076 ; =============== S U B R O U T I N E =======================================
ROM:0076
ROM:0076 ; Рисование точки белым цветом (FD90 координата X, FD91 координата Y)
ROM:0076 ; Attributes: thunk
ROM:0076
ROM:0076 PRESETWT: ; CODE XREF: SYMSCR2+C7p
ROM:0076 jmp PRESETWT2 ; Рисование точки белым цветом (FD90 координата X, FD91 координата Y)
ROM:0076 ; End of function PRESETWT
ROM:0076
ROM:0079
ROM:0079 ; =============== S U B R O U T I N E =======================================
ROM:0079
ROM:0079 ; Опрос буфера клавиатуры.
ROM:0079 ; Z=1 буфер пуст,
ROM:0079 ; Z=0 символ в буфере
ROM:0079 ; Attributes: thunk
ROM:0079
ROM:0079 KBDBUFAK: ; CODE XREF: ROM:INKEYp
ROM:0079 jmp KBDBUFAK2 ; Опрос буфера клавиатуры
ROM:0079 ; End of function KBDBUFAK
ROM:0079
ROM:007C
ROM:007C ; =============== S U B R O U T I N E =======================================
ROM:007C
ROM:007C ; Ввод символа из буфера клавиатуры в A.
ROM:007C ; Если буфер пуст - ожидание нажатия.
ROM:007C ; Attributes: thunk
ROM:007C
ROM:007C BUFFERTOA: ; CODE XREF: INPUTSTR2p
ROM:007C ; ROM:1981p
ROM:007C jmp BUFFERTOA2 ; Ввод символа из буфера клавиатуры
ROM:007C ; End of function BUFFERTOA
ROM:007C
ROM:007F
ROM:007F ; =============== S U B R O U T I N E =======================================
ROM:007F
ROM:007F ; Тестирование нажатия УПР+Стоп
ROM:007F ; Attributes: thunk
ROM:007F
ROM:007F TESTBREAKKEY: ; CODE XREF: BUFFERTOA2:loc_240Ap
ROM:007F jmp TESTBREAKKEY2 ; Смотрим, надо ли остановиться?
ROM:007F ; End of function TESTBREAKKEY
ROM:007F
ROM:007F ; ---------------------------------------------------------------------------
ROM:0082 INITTAB2: .db 'P', 'w', 0Ah, 'F', 'v', 0Ah, 'C', 'L', 'L', 'F', 'O'
ROM:0082 .db 'T', 'N', 'E', 'X', 'L', 'D', 'A', 'T', '+', 'I', 'N'
ROM:0082 .db 'P', 'U', 'L', 'D', 'I', '='
ROM:009E
ROM:009E ; =============== S U B R O U T I N E =======================================
ROM:009E
ROM:009E ; Выключает изображение курсора.
ROM:009E ; Attributes: thunk
ROM:009E
ROM:009E CURSOFF: ; CODE XREF: INPUTSTR:loc_4D9p
ROM:009E ; CHECKENOUGHMEM+189Cp
ROM:009E jmp CURSOFF2 ; Выключает изображение курсора
ROM:009E ; End of function CURSOFF
ROM:009E
ROM:00A1
ROM:00A1 ; =============== S U B R O U T I N E =======================================
ROM:00A1
ROM:00A1 ; Включает изображение курсора.
ROM:00A1 ; Attributes: thunk
ROM:00A1
ROM:00A1 CURSON: ; CODE XREF: INPUTSTR+3p
ROM:00A1 ; EDIT1:loc_1B90p
ROM:00A1 jmp CURSON2 ; Включает изображение курсора
ROM:00A1 ; End of function CURSON
ROM:00A1
ROM:00A4
ROM:00A4 ; =============== S U B R O U T I N E =======================================
ROM:00A4
ROM:00A4 ; Выключает нижнюю строку ключей.
ROM:00A4 ; Attributes: thunk
ROM:00A4
ROM:00A4 KEYSOFF: ; CODE XREF: ROM:loc_1B36p
ROM:00A4 jmp KEYSOFF2 ; Выключает нижнюю строку ключей.
ROM:00A4 ; End of function KEYSOFF
ROM:00A4
ROM:00A7
ROM:00A7 ; =============== S U B R O U T I N E =======================================
ROM:00A7
ROM:00A7 ; Включает нижнюю строку ключей.
ROM:00A7 ; Attributes: thunk
ROM:00A7
ROM:00A7 KEYSON: ; CODE XREF: ROM:loc_1B3Cp
ROM:00A7 jmp KEYSON2 ; Включает нижнюю строку ключей.
ROM:00A7 ; End of function KEYSON
ROM:00A7
ROM:00AA
ROM:00AA ; =============== S U B R O U T I N E =======================================
ROM:00AA
ROM:00AA ; Возвращает в аккумулятор длину строки экрана в символах
ROM:00AA ; Attributes: thunk
ROM:00AA
ROM:00AA SCRLEN: ; CODE XREF: ROM:1A2Ap
ROM:00AA jmp SCRLEN2 ; Возвращает в аккумулятор длину строки экрана в символах
ROM:00AA ; End of function SCRLEN
ROM:00AA
ROM:00AD
ROM:00AD ; =============== S U B R O U T I N E =======================================
ROM:00AD
ROM:00AD ; Кто объяснит мне этот кусок - буду благодарен. Вызывается из функции POINT перед тем, как нарисовать точку. Три раза делает RST 7.
ROM:00AD
ROM:00AD INTERRPT: ; CODE XREF: ROM:1F28p
ROM:00AD rst 7 ; RST7 = обработка прерываний.
ROM:00AE rst 7 ; RST7 = обработка прерываний.
ROM:00AF rst 7 ; RST7 = обработка прерываний.
ROM:00AF ; End of function INTERRPT
ROM:00AF
ROM:00B0
ROM:00B0 ; =============== S U B R O U T I N E =======================================
ROM:00B0
ROM:00B0 ; Очистить буфер клавиатуры.
ROM:00B0 ; Attributes: thunk
ROM:00B0
ROM:00B0 KBDBUFCL: ; CODE XREF: CHECKENOUGHMEM+189Fp
ROM:00B0 ; EDIT1:loc_1BA2p
ROM:00B0 jmp KBDBUFCL2 ; Очищает буфер клавиатуры
ROM:00B0 ; End of function KBDBUFCL
ROM:00B0
ROM:00B0 ; ---------------------------------------------------------------------------
ROM:00B3 INITVRAM2RAM_: .db 0F3h, 0CDh, 24h, 0F8h, 78h, 0B1h, 7Eh, 0CAh, 11h, 0F8h
ROM:00B3 ; DATA XREF: START+2964o
ROM:00B3 .db 12h, 13h, 23h, 0Bh, 0C3h, 4, 0F8h, 0CDh, 16h, 0F8h ; Инициализация процедур VRAM2RAM.
ROM:00B3 .db 0FBh, 0C9h, 0F5h, 0CDh, 8Bh, 0F8h, 0D3h, 80h, 0F1h ; Этот блок переносится в ОЗУ по адресу &hF800
ROM:00B3 .db 0C9h, 0F5h, 3Eh, 0FCh, 0C3h, 27h, 0F8h, 0F5h, 3Eh
ROM:00B3 .db 0FFh, 0F5h, 0DBh, 80h, 32h, 7Dh, 0FDh, 0F1h, 0C3h
ROM:00B3 .db 1Ah, 0F8h, 0F3h, 0CDh, 24h, 0F8h, 7Eh, 0C3h, 11h, 0F8h
ROM:00B3 .db 7Dh, 0D6h, 0, 6Fh, 7Ch, 0DEh, 0, 67h, 78h, 0DEh, 0
ROM:00B3 .db 47h, 3Eh, 0, 0DEh, 0, 0C9h, 0D3h, 0, 0C9h, 32h, 51h
ROM:00B3 .db 0F8h, 0DBh, 0, 0C9h, 0D3h, 0, 0C9h, 0C3h, 0F9h, 4
ROM:00B3 .db 0CDh, 24h, 0F8h, 47h, 32h, 62h, 0F8h, 7Eh, 0D3h, 0
ROM:00B3 .db 23h, 78h, 3Ch, 0FEh, 0C0h, 0C2h, 5Ch, 0F8h, 0C3h, 16h
ROM:00B3 .db 0F8h, 0C9h, 0C9h, 0C9h, 0D5h, 11h, 0, 0, 19h, 0D1h
ROM:00B3 .db 0CEh, 0, 0C9h, 52h, 0C7h, 4Fh, 80h, 0CDh, 0AAh, 2
ROM:00B3 .db 0E9h, 0C9h, 52h, 4Eh, 0C4h, 4Ch, 4Fh, 0C7h, 45h, 58h
ROM:00B3 .db 3Eh, 1, 32h, 0EBh, 0FDh, 3Ah, 7Dh, 0FDh, 0C9h
ROM:0147
ROM:0147 ; =============== S U B R O U T I N E =======================================
ROM:0147
ROM:0147 ; Опрос ряда клавиатурной матрицы
ROM:0147
ROM:0147 KBDRAW2: ; CODE XREF: ROM:KBDRAWj
ROM:0147 ; JOYDIR2+19p ...
ROM:0147 di
ROM:0148 push b
ROM:0149 ani 0Fh
ROM:014B mov b, a
ROM:014C in 82h
ROM:014E ani 0F0h
ROM:0150 ora b
ROM:0151 out 82h
ROM:0153 in 81h
ROM:0155 pop b
ROM:0156 ret
ROM:0156 ; End of function KBDRAW2
ROM:0156
ROM:0156 ; ---------------------------------------------------------------------------
ROM:0157 .db 41h
ROM:0158 .db 0CCh ; ¦
ROM:0159 .db 41h ; A
ROM:015A
ROM:015A ; =============== S U B R O U T I N E =======================================
ROM:015A
ROM:015A ; Очищает буфер клавиатуры
ROM:015A
ROM:015A KBDBUFCL2: ; CODE XREF: KBDBUFCLj
ROM:015A ; INTRPT2+12Ep ...
ROM:015A push h
ROM:015B lxi h, KBDBUF ; Буфер клавиатуры
ROM:015E shld INBUF ; Адрес чтения из буфера клавиатуры
ROM:0161 shld OUTBUF ; Адрес записи в буфер клавиатуры
ROM:0164 pop h
ROM:0165 ret
ROM:0165 ; End of function KBDBUFCL2
ROM:0165
ROM:0166 ; ---------------------------------------------------------------------------
ROM:0166 ; START OF FUNCTION CHUNK FOR PUSHNEXTWORD
ROM:0166
ROM:0166 PUSHNEXTWORD2: ; CODE XREF: PUSHNEXTWORD+5j
ROM:0166 mov c, m
ROM:0167 inx h
ROM:0168 mov b, m
ROM:0169 inx h
ROM:016A push b
ROM:016B jmp JMPNXTWD
ROM:016B ; END OF FUNCTION CHUNK FOR PUSHNEXTWORD
ROM:016E
ROM:016E ; =============== S U B R O U T I N E =======================================
ROM:016E
ROM:016E ; Гашение изображения
ROM:016E
ROM:016E ISOOFF: ; CODE XREF: SETMODE3+39p
ROM:016E in 86h
ROM:0170 ani 0EFh
ROM:0172 out 86h
ROM:0174 ret
ROM:0174 ; End of function ISOOFF
ROM:0174
ROM:0175 ; ---------------------------------------------------------------------------
ROM:0175 ; START OF FUNCTION CHUNK FOR SETMODE3
ROM:0175
ROM:0175 ISOON: ; CODE XREF: SETMODE3+41j
ROM:0175 in 86h
ROM:0177 ori 10h
ROM:0179 out 86h
ROM:017B ret
ROM:017B ; END OF FUNCTION CHUNK FOR SETMODE3
ROM:017C
ROM:017C ; =============== S U B R O U T I N E =======================================
ROM:017C
ROM:017C ; Вывод символа из A на печать
ROM:017C
ROM:017C SYMPRN2: ; CODE XREF: ROM:SYMPRNj
ROM:017C ; SYMSCR2+8p
ROM:017C
ROM:017C ; FUNCTION CHUNK AT ROM:227A SIZE 00000054 BYTES
ROM:017C
ROM:017C push psw
ROM:017D
ROM:017D loc_17D: ; CODE XREF: ROM:0189j
ROM:017D call KBD2 ; LOC_17E: RNC
ROM:017D ; .DB 1
ROM:017D ; JZ LOC_227A
ROM:0180 jz loc_227A
ROM:0183 pop psw
ROM:0184 stc
ROM:0185 ret
ROM:0185 ; End of function SYMPRN2
ROM:0185
ROM:0186 ; ---------------------------------------------------------------------------
ROM:0186 add m
ROM:0187 ani 1
ROM:0189 jz loc_17D+1 ; LOC_17E: RNC
ROM:0189 ; .DB 1
ROM:0189 ; JZ LOC_227A
ROM:018C ret
ROM:018D
ROM:018D ; =============== S U B R O U T I N E =======================================
ROM:018D
ROM:018D
ROM:018D MACRO1: ; CODE XREF: INTRPT2+12Bp
ROM:018D push h
ROM:018E lxi h, loc_7CF
ROM:0191
ROM:0191 loc_191: ; CODE XREF: MACRO1+7j
ROM:0191 dcx h
ROM:0192 mov a, l
ROM:0193 ora h
ROM:0194 jnz loc_191
ROM:0197 pop h
ROM:0198 ret
ROM:0198 ; End of function MACRO1
ROM:0198
ROM:0199
ROM:0199 ; =============== S U B R O U T I N E =======================================
ROM:0199
ROM:0199 ; Опрос буфера клавиатуры
ROM:0199
ROM:0199 KBDBUFAK2: ; CODE XREF: KBDBUFAKj
ROM:0199 ; BUFFERTOA2+Dp
ROM:0199 push h
ROM:019A push d
ROM:019B lhld INBUF ; Адрес чтения из буфера клавиатуры
ROM:019E xchg
ROM:019F lhld OUTBUF ; Адрес записи в буфер клавиатуры
ROM:01A2 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения.
ROM:01A3 pop d
ROM:01A4 pop h
ROM:01A5 ret
ROM:01A5 ; End of function KBDBUFAK2
ROM:01A5
ROM:01A6
ROM:01A6 ; =============== S U B R O U T I N E =======================================
ROM:01A6
ROM:01A6 ; Чтение направления джойстика
ROM:01A6
ROM:01A6 JOYDIR2: ; CODE XREF: JOYDIRj
ROM:01A6 dcr a
ROM:01A7 jm loc_1BD
ROM:01AA in 8Ch
ROM:01AC jz loc_1B1
ROM:01AF in 8Dh
ROM:01B1
ROM:01B1 loc_1B1: ; CODE XREF: JOYDIR2+6j
ROM:01B1 lxi h, TAB4+10h ; Дешифратор направлений джойстика
ROM:01B4 cma
ROM:01B5
ROM:01B5 loc_1B5: ; CODE XREF: JOYDIR2+24j
ROM:01B5 ani 0Fh
ROM:01B7 mov e, a
ROM:01B8 mvi d, 0
ROM:01BA dad d
ROM:01BB mov a, m
ROM:01BC ret
ROM:01BD ; ---------------------------------------------------------------------------
ROM:01BD
ROM:01BD loc_1BD: ; CODE XREF: JOYDIR2+1j
ROM:01BD mvi a, 8
ROM:01BF call KBDRAW2 ; Опрос ряда клавиатурной матрицы
ROM:01C2 ei
ROM:01C3 rrc
ROM:01C4 rrc
ROM:01C5 rrc
ROM:01C6 rrc
ROM:01C7 lxi h, TAB4 ; Дешифратор направлений джойстика
ROM:01CA jmp loc_1B5
ROM:01CA ; End of function JOYDIR2
ROM:01CA
ROM:01CA ; ---------------------------------------------------------------------------
ROM:01CD .db 0B8h
ROM:01CE .db 2Ch
ROM:01CF .db 9Ch
ROM:01D0
ROM:01D0 ; =============== S U B R O U T I N E =======================================
ROM:01D0
ROM:01D0 ; Вызывается из SYMPRN2. Проверяет 2 бит EVNTTAB и порта &h86.
ROM:01D0 ; Заметим, что в описании портов у порта &h86 биты 1, 2 и 3 не используются!
ROM:01D0
ROM:01D0 KBD2: ; CODE XREF: SYMPRN2:loc_17Dp
ROM:01D0 ; KBD2+Aj
ROM:01D0 lda EVNTTAB ; Таблица событий.
ROM:01D0 ; (УПР/СТОП + 10 функциональных клавиш)
ROM:01D0 ; Бит 0 - маска события
ROM:01D0 ; Бит 2 - событие
ROM:01D3 ani 4
ROM:01D5 rnz
ROM:01D6 in 86h
ROM:01D8 ani 4
ROM:01DA jnz KBD2 ; Вызывается из SYMPRN2. Проверяет 2 бит EVNTTAB и порта &h86.
ROM:01DA ; Заметим, что в описании портов у порта &h86 биты 1, 2 и 3 не используются!
ROM:01DD ret
ROM:01DD ; End of function KBD2
ROM:01DD
ROM:01DD ; ---------------------------------------------------------------------------
ROM:01DE INITTAB: .db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
ROM:01DE .db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0CFh
ROM:01DE .db 0, 0, 0, 0, 0
ROM:0205 INITKEYS: .db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0Ah, 0, 0Ah, 0, 0, 41h
ROM:0205 ; DATA XREF: START+2970o
ROM:0205 ; PRINTINT2+4Co
ROM:0205 .db 1, 0, 0, 0, 1, 0, 0FEh, 0F7h, 0Ah, 0F9h, 6, 0, 6Bh ; Инициализация переменных.
ROM:0205 .db 2, 1, 0, 89h, 17h, 0, 0, 0, 0, 6, 0, 6Bh, 2, 0FEh ; Этот блок переностися в ОЗУ по адресу &hF8F0
ROM:0205 .db 0F7h, 0D5h, 1, 0, 0, 0, 0, 22h, 17h, 0D5h, 1, 0FFh
ROM:0205 .db 0FFh, 6Eh, 0Ah, 0, 0, 36h, 0F7h, 1, 40h, 3, 40h, 3
ROM:0205 .db 40h, 3, 40h, 0, 40h, 1Fh, 2, 84h, 87h, 0C2h, 20h, 32h
ROM:0205 .db 35h, 36h, 0, 30h, 30h, 30h, 3Fh, 20h, 20h, 20h, 20h
ROM:0205 .db 20h, 45h, 72h, 72h, 6Fh, 72h, 0
ROM:0266 INITKEYS2: .text " in " ; DATA XREF: INITKEYS2TR+1o
ROM:0266 .db 0
ROM:026B aOk: .db 0Ah ; DATA XREF: ROM:1054o
ROM:026B ; CHECKENOUGHMEM+46o
ROM:026B .db 0Ah
ROM:026B .text "Ok"
ROM:026B .db 0Dh
ROM:026B .db 0Ah
ROM:026B .db 0
ROM:0272 aBreak: .db 0Dh ; DATA XREF: TESTBREAKKEY2+24o
ROM:0272 .db 0Ah
ROM:0272 .text "Break"
ROM:0272 .db 0
ROM:027A
ROM:027A ; =============== S U B R O U T I N E =======================================
ROM:027A
ROM:027A ; Сервисная функция.
ROM:027A ; Устанавливает HL в точку соответствующей структуры потока на стеке (Sets HL to point to the appropriate flow struct on the stack.).
ROM:027A ; Если функция вызвана ключевым словом NEXT, то DE указывает на переменную, следующую за ключевым словом NEXT.
ROM:027A ; Таким образом, устанавливает DE как главный указатель программы (i.e. Get program ptr into DE).
ROM:027A ;
ROM:027A
ROM:027A GETFLOWPTR: ; CODE XREF: ROM:053Ep
ROM:027A ; ROM:06E6p ...
ROM:027A lxi h, 4
ROM:027D dad sp
ROM:027E
ROM:027E loc_27E: ; CODE XREF: GETFLOWPTR+1Ej
ROM:027E mov a, m
ROM:027F inx h
ROM:0280 cpi 81h ; 'Б'
ROM:0282 rnz
ROM:0283 mov c, m
ROM:0284 inx h
ROM:0285 mov b, m
ROM:0286 inx h
ROM:0287 push h
ROM:0288 mov l, c
ROM:0289 mov h, b
ROM:028A mov a, d
ROM:028B ora e
ROM:028C xchg
ROM:028D jz loc_292
ROM:0290 xchg
ROM:0291 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения.
ROM:0292
ROM:0292 loc_292: ; CODE XREF: GETFLOWPTR+13j
ROM:0292 lxi b, 0Dh
ROM:0295 pop h
ROM:0296 rz
ROM:0297 dad b
ROM:0298 jmp loc_27E
ROM:0298 ; End of function GETFLOWPTR
ROM:0298
ROM:029B
ROM:029B ; =============== S U B R O U T I N E =======================================
ROM:029B
ROM:029B ; Копирует байты памяти из BC в HL. Копирование идёт задом-наперёд до тех, пор, пока BC не станет равным DE.
ROM:029B ; Идёт оно задом-наперёд потому, что функция может использоваться для блоков отстоящих друг от друга на пару байт.
ROM:029B ; В таком случае, если бы копирование шло напрямую, то блок памяти затёр бы сам себя.
ROM:029B
ROM:029B COPYMEMORYUP: ; CODE XREF: CHECKENOUGHMEM+92p
ROM:029B ; GETVAR2+64p
ROM:029B call CHECKENOUGHMEM ; Проверяет, действительно ли HL больше, чем на 32 байта отстоит от указателя стека.
ROM:029B ; End of function COPYMEMORYUP ; Если HL расположен ближе чем на 32 байта к стеку, то функция падает в OutOfMemory.
ROM:029B
ROM:029E
ROM:029E ; =============== S U B R O U T I N E =======================================
ROM:029E
ROM:029E
ROM:029E COPYMEMORYUP2: ; CODE XREF: MAINTR5+C0p
ROM:029E push b
ROM:029F xthl
ROM:02A0 pop b
ROM:02A1
ROM:02A1 loc_2A1: ; CODE XREF: COPYMEMORYUP2+9j
ROM:02A1 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения.
ROM:02A2 mov a, m
ROM:02A3 stax b
ROM:02A4 rz
ROM:02A5 dcx b
ROM:02A6 dcx h
ROM:02A7 jmp loc_2A1
ROM:02A7 ; End of function COPYMEMORYUP2
ROM:02A7
ROM:02AA
ROM:02AA ; =============== S U B R O U T I N E =======================================
ROM:02AA
ROM:02AA ; Внимание! После вызова CHECKENOUGHVARSPACE идет байт параметра, а не следующая инструкция!
ROM:02AA ; Проверяет, достаточно ли будет памяти при выделении места для C*4 байт начиная с VAR_TOP перед тем как это выделение начнёт затирать стек.
ROM:02AA ; (Или область переменных).
ROM:02AA
ROM:02AA CHECKENOUGHVARSPACE: ; CODE XREF: ROM:0548p
ROM:02AA ; ROM:GOSUBp ...
ROM:02AA xthl
ROM:02AB mov c, m
ROM:02AC inx h
ROM:02AD xthl
ROM:02AE push h
ROM:02AF lhld VAR_TOP ; Адрес начала свободной памяти.
ROM:02AF ; Указывает на верхушку области хранящей массивы и переменные.
ROM:02B2 mvi b, 0
ROM:02B4 dad b
ROM:02B5 dad b
ROM:02B6 call CHECKENOUGHMEM ; Проверяет, действительно ли HL больше, чем на 32 байта отстоит от указателя стека.
ROM:02B6 ; Если HL расположен ближе чем на 32 байта к стеку, то функция падает в OutOfMemory.
ROM:02B9 pop h
ROM:02BA ret
ROM:02BA ; End of function CHECKENOUGHVARSPACE
ROM:02BA
ROM:02BB
ROM:02BB ; =============== S U B R O U T I N E =======================================
ROM:02BB
ROM:02BB ; Проверяет, действительно ли HL больше, чем на 32 байта отстоит от указателя стека.
ROM:02BB ; Если HL расположен ближе чем на 32 байта к стеку, то функция падает в OutOfMemory.
ROM:02BB
ROM:02BB CHECKENOUGHMEM: ; CODE XREF: COPYMEMORYUPp
ROM:02BB ; CHECKENOUGHVARSPACE+Cp ...
ROM:02BB
ROM:02BB ; FUNCTION CHUNK AT ROM:05AD SIZE 0000001E BYTES
ROM:02BB ; FUNCTION CHUNK AT ROM:1021 SIZE 0000000F BYTES
ROM:02BB ; FUNCTION CHUNK AT ROM:1B52 SIZE 0000000E BYTES
ROM:02BB
ROM:02BB push d
ROM:02BC xchg
ROM:02BD lxi h, 0FFDAh
ROM:02C0 dad sp
ROM:02C1 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения.
ROM:02C2 xchg
ROM:02C3 pop d
ROM:02C4 rnc
ROM:02C5
ROM:02C5 OUTOFMEMORY: ; CODE XREF: ROM:06A0j
ROM:02C5 mvi e, 0Ch ; Ошибка Out of memory
ROM:02C7 jmp MAINLOOP1 ; Первая точка входа в главный цикл
ROM:02CA ; ---------------------------------------------------------------------------
ROM:02CA
ROM:02CA loc_2CA: ; CODE XREF: ROM:0844j
ROM:02CA lhld MEMTMP2 ; Используется при вычислении количества памяти в OUTOFMEMORY
ROM:02CD shld BASOPNUM ; Номер оператора Бейсик программы.
ROM:02CD ; Или &hFFFF в командном режиме
ROM:02D0
ROM:02D0 SYNTAXERROR: ; CODE XREF: SYNTAXCHECK+5j
ROM:02D0 ; NEXT2-386j ...
ROM:02D0 mvi e, 2 ; Самая распространённая ошибка №2
ROM:02D0 ; ---------------------------------------------------------------------------
ROM:02D2 .db 1 ; LXI B,....
ROM:02D3 ; ---------------------------------------------------------------------------
ROM:02D3
ROM:02D3 DIVIDEBYZERO: ; CODE XREF: FDIVBYTEN+Fj
ROM:02D3 mvi e, 14h ; Ошибка деления на ноль
ROM:02D3 ; ---------------------------------------------------------------------------
ROM:02D5 .db 1 ; LXI B,....
ROM:02D6 ; ---------------------------------------------------------------------------
ROM:02D6
ROM:02D6 ERROR_: ; CODE XREF: NEXT2+9j
ROM:02D6 mvi e, 0 ; Ошибка
ROM:02D8
ROM:02D8 MAINLOOP1: ; CODE XREF: CHECKENOUGHMEM+Cj
ROM:02D8 ; ROM:061Fj ...
ROM:02D8 call ERRTR ; Первая точка входа в главный цикл
ROM:02DB xra a
ROM:02DC call STOPTR ; Обработка останова
ROM:02DF
ROM:02DF loc_2DF: ; DATA XREF: FNKEYTR+19o
ROM:02DF call PKCHK ; Проверка позиции курсора, печать новой строки и перевода каретки
ROM:02E2 call INPUTPRN ; Печатает пригласительный знак вопроса в команде INPUT и сообщении об ошибке
ROM:02E5 mov e, a
ROM:02E6 mvi d, 0
ROM:02E8 call PRINTINT2 ; Переводит целое число HL в число с плавающей точкой FACCUM.
ROM:02E8 ; Дополнительная точка входа.
ROM:02EB lxi h, INITKEYS+5Ah ; Инициализация переменных.
ROM:02EB ; Этот блок переностися в ОЗУ по адресу &hF8F0
ROM:02EE
ROM:02EE loc_2EE: ; CODE XREF: TESTBREAKKEY2+27j
ROM:02EE call MAINTR ; Подпрограмма главного цикла
ROM:02F1 lhld BASOPNUM ; Номер оператора Бейсик программы.
ROM:02F1 ; Или &hFFFF в командном режиме
ROM:02F4 mov a, l
ROM:02F5 ana h
ROM:02F6 inr a
ROM:02F7 cnz INITKEYS2TR ; Инициализация INITKEYS2
ROM:02FA
ROM:02FA MAIN2: ; CODE XREF: PRNTR1-12E5j
ROM:02FA call CRLF ; Переход с оператора LIST
ROM:02FD
ROM:02FD MAINLOOP3: ; CODE XREF: TESTBREAKKEY2+2Aj
ROM:02FD ; START+1756j ...
ROM:02FD xra a ; Третья точка входа в главный цикл. Переход из INIT2, STOP, CSAVE, OUTCHAR2, INPUTLN
ROM:02FE call EDIT1 ; Опрашивает флаг печати, формирует таблицу событий, Очищает переменную TERMINAL_X,
ROM:02FE ; устанавливает текстовый режим (MODE), очищает буфер клавиатуры и временные переменные
ROM:0301 lxi h, aOk+2
ROM:0304 call MAINTR ; Подпрограмма главного цикла
ROM:0307
ROM:0307 MAIN: ; CODE XREF: ROM:1DF6j
ROM:0307 lxi h, 0FFFFh ; Вторая точка входа в главный цикл. Переход из AUTO
ROM:0307 ; Эта процедура ждёт ввода строки и если строка без номера, то пытается сразу выполнить её (EXEC immediately).
ROM:030A shld BASOPNUM ; Номер оператора Бейсик программы.
ROM:030A ; Или &hFFFF в командном режиме
ROM:030D
ROM:030D loc_30D: ; CODE XREF: CHECKENOUGHMEM+58j
ROM:030D ; CHECKENOUGHMEM+B6j ...
ROM:030D call INPUTLN ; НУ ВОТ, СОБСТВЕННО! ЭТО И ЕСТЬ САМЫЙ ГЛАВНЫЙ ЦИКЛ БЕЙСИК-ИНТЕРПРЕТАТОРА!
ROM:0310 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:0310 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:0310 ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:0311 inr a
ROM:0312 dcr a
ROM:0313 jz loc_30D ; НУ ВОТ, СОБСТВЕННО! ЭТО И ЕСТЬ САМЫЙ ГЛАВНЫЙ ЦИКЛ БЕЙСИК-ИНТЕРПРЕТАТОРА!
ROM:0316 push psw
ROM:0317 call LINENUMBERFROMSTR ; Если строка ввода начинается с номера строки, эта процедура прочитает это число в DE.
ROM:031A push d
ROM:031B call TOKENIZE ; Токенизируем остаток строки.
ROM:031E mov b, a
ROM:031F pop d
ROM:0320 pop psw
ROM:0321 jnc EXEC
ROM:0324
ROM:0324 STOREPROGRAMLINE: ; Сохранение строки программы.
ROM:0324 push d
ROM:0325 push b
ROM:0326 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:0326 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:0326 ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:0327 push psw
ROM:0328 call FINDPROGRAMLINE ; Получает ближайший адрес строки программы в BC
ROM:032B push b
ROM:032C jnc INSERTPROGRAMLINE ; Вставка строки программы.
ROM:032F
ROM:032F REMOVEPROGRAMLINE: ; Удаление строки программы.
ROM:032F xchg
ROM:0330 lhld ENBASPRG ; Адрес конца Бейсик программы.
ROM:0330 ; Указывает на первую ячейку участка памяти, доступного программам.
ROM:0330 ; Всегда следует за последним байтом программы.
ROM:0333
ROM:0333 loc_333: ; CODE XREF: CHECKENOUGHMEM+7Dj
ROM:0333 ldax d
ROM:0334 stax b
ROM:0335 inx b
ROM:0336 inx d
ROM:0337 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения.
ROM:0338 jnc loc_333
ROM:033B mov h, b
ROM:033C mov l, c
ROM:033D inx h
ROM:033E shld ENBASPRG ; Адрес конца Бейсик программы.
ROM:033E ; Указывает на первую ячейку участка памяти, доступного программам.
ROM:033E ; Всегда следует за последним байтом программы.
ROM:0341
ROM:0341 INSERTPROGRAMLINE: ; CODE XREF: CHECKENOUGHMEM+71j
ROM:0341 pop d ; Вставка строки программы.
ROM:0342 pop psw
ROM:0343 jz loc_368
ROM:0346 lhld ENBASPRG ; Адрес конца Бейсик программы.
ROM:0346 ; Указывает на первую ячейку участка памяти, доступного программам.
ROM:0346 ; Всегда следует за последним байтом программы.
ROM:0349 xthl
ROM:034A pop b
ROM:034B dad b
ROM:034C push h
ROM:034D call COPYMEMORYUP ; Копирует байты памяти из BC в HL. Копирование идёт задом-наперёд до тех, пор, пока BC не станет равным DE.
ROM:034D ; Идёт оно задом-наперёд потому, что функция может использоваться для блоков отстоящих друг от друга на пару байт.
ROM:034D ; В таком случае, если бы копирование шло напрямую, то блок памяти затёр бы сам себя.
ROM:0350 pop h
ROM:0351 shld ENBASPRG ; Адрес конца Бейсик программы.
ROM:0351 ; Указывает на первую ячейку участка памяти, доступного программам.
ROM:0351 ; Всегда следует за последним байтом программы.
ROM:0354 xchg
ROM:0355 mov m, h
ROM:0356 inx h
ROM:0357 inx h
ROM:0358 pop d
ROM:0359 mov m, e
ROM:035A inx h
ROM:035B mov m, d
ROM:035C inx h
ROM:035D lxi d, IOBUF ; Буфер ввода-вывода (диск, кассеты)
ROM:0360
ROM:0360 loc_360: ; CODE XREF: CHECKENOUGHMEM+AAj
ROM:0360 ldax d
ROM:0361 mov m, a
ROM:0362 inx h
ROM:0363 inx d
ROM:0364 ora a
ROM:0365 jnz loc_360
ROM:0368
ROM:0368 loc_368: ; CODE XREF: CHECKENOUGHMEM+88j
ROM:0368 ; ROM:105Aj
ROM:0368 call RESETALL ; Обработка бейсик-команды RUN без параметров.
ROM:0368 ; По сути, устанавливает всё готовым для запуска программы, а потом возвращается в EXECNEXT.
ROM:036B inx h
ROM:036C
ROM:036C loc_36C: ; CODE XREF: CHECKENOUGHMEM+C7j
ROM:036C mov d, h
ROM:036D mov e, l
ROM:036E mov a, m
ROM:036F inx h
ROM:0370 ora m
ROM:0371 jz loc_30D ; НУ ВОТ, СОБСТВЕННО! ЭТО И ЕСТЬ САМЫЙ ГЛАВНЫЙ ЦИКЛ БЕЙСИК-ИНТЕРПРЕТАТОРА!
ROM:0374 inx h
ROM:0375 inx h
ROM:0376 inx h
ROM:0377 xra a
ROM:0378
ROM:0378 loc_378: ; CODE XREF: CHECKENOUGHMEM+BFj
ROM:0378 cmp m
ROM:0379 inx h
ROM:037A jnz loc_378
ROM:037D xchg
ROM:037E mov m, e
ROM:037F inx h
ROM:0380 mov m, d
ROM:0381 xchg
ROM:0382 jmp loc_36C
ROM:0382 ; End of function CHECKENOUGHMEM
ROM:0382
ROM:0385
ROM:0385 ; =============== S U B R O U T I N E =======================================
ROM:0385
ROM:0385 ; Получает ближайший адрес строки программы в BC
ROM:0385
ROM:0385 FINDPROGRAMLINE: ; CODE XREF: CHECKENOUGHMEM+6Dp
ROM:0385 ; ROM:04F3p ...
ROM:0385 lhld BGBASPRG ; Адрес начала Бейсик программы
ROM:0385 ; End of function FINDPROGRAMLINE
ROM:0385
ROM:0388
ROM:0388 ; =============== S U B R O U T I N E =======================================
ROM:0388
ROM:0388 ; Получает ближайший адрес строки программы в BC.
ROM:0388 ; Дополнительная точка входа.
ROM:0388
ROM:0388 FINDPROGRAMLINE2: ; CODE XREF: FINDPROGRAMLINE2+12j
ROM:0388 ; GOTOPRE+7p
ROM:0388 mov b, h
ROM:0389 mov c, l
ROM:038A mov a, m
ROM:038B inx h
ROM:038C ora m
ROM:038D dcx h
ROM:038E rz
ROM:038F push b
ROM:0390 rst 6 ; Псевдокоманда PUSH (HL).
ROM:0390 ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP.
ROM:0390 ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD.
ROM:0391 rst 6 ; Псевдокоманда PUSH (HL).
ROM:0391 ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP.
ROM:0391 ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD.
ROM:0392 pop h
ROM:0393 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения.
ROM:0394 pop h
ROM:0395 pop b
ROM:0396 cmc
ROM:0397 rz
ROM:0398 cmc
ROM:0399 rnc
ROM:039A jmp FINDPROGRAMLINE2 ; Получает ближайший адрес строки программы в BC.
ROM:039A ; End of function FINDPROGRAMLINE2 ; Дополнительная точка входа.
ROM:039A
ROM:039D ; ---------------------------------------------------------------------------
ROM:039D
ROM:039D NEW: ; Обработка оператора NEW.
ROM:039D rnz ; Записывает нулевой номер строки в место хранения программы (по сути пустую программу).
ROM:039D ; Обновляет указатель ENBASPRG и переходит в RUN, который делает всю оставшуюся работу.
ROM:039E
ROM:039E ; =============== S U B R O U T I N E =======================================
ROM:039E
ROM:039E ; Сброс бейсик-программы к исходному состоянию
ROM:039E ; Дополнительная точка входа.
ROM:039E
ROM:039E NEW2: ; CODE XREF: START+1753p
ROM:039E ; ROM:loc_19C8p
ROM:039E lhld BGBASPRG ; Адрес начала Бейсик программы
ROM:03A1 xra a
ROM:03A2 mov m, a
ROM:03A3 inx h
ROM:03A4 mov m, a
ROM:03A5 inx h
ROM:03A6 shld ENBASPRG ; Адрес конца Бейсик программы.
ROM:03A6 ; End of function NEW2 ; Указывает на первую ячейку участка памяти, доступного программам.
ROM:03A6 ; Всегда следует за последним байтом программы.
ROM:03A9
ROM:03A9 ; =============== S U B R O U T I N E =======================================
ROM:03A9
ROM:03A9 ; Обработка бейсик-команды RUN без параметров.
ROM:03A9 ; По сути, устанавливает всё готовым для запуска программы, а потом возвращается в EXECNEXT.
ROM:03A9
ROM:03A9 RESETALL: ; CODE XREF: CHECKENOUGHMEM:loc_368p
ROM:03A9 ; ROM:RUNj
ROM:03A9 lhld BGBASPRG ; Адрес начала Бейсик программы
ROM:03AC dcx h
ROM:03AD
ROM:03AD RUNWITH: ; CODE XREF: ROM:CLEARj
ROM:03AD ; ROM:06A8j ...
ROM:03AD shld CURBASLN ; RESETALL дополнительная точка входа.
ROM:03B0 lhld ENDSTRAR ; Конец строковой области
ROM:03B3 shld RUNWITHTMP ; Временная переменная оператора RUN с параметром
ROM:03B6 call READPT ; Сбрасывает указатель оператора READ. При инициализации и при вызове RESTORE
ROM:03B6 ; Resets the data pointer to just before the start of the program
ROM:03B9 lhld ENBASPRG ; Адрес конца Бейсик программы.
ROM:03B9 ; Указывает на первую ячейку участка памяти, доступного программам.
ROM:03B9 ; Всегда следует за последним байтом программы.
ROM:03BC shld BGARRAY ; Адрес начала массивов.
ROM:03BC ; Указывает на начало участка памяти, хранящего массивы.
ROM:03BC ; Следует сразу за участком памяти, выделенным для обычных переменных.
ROM:03BF shld VAR_TOP ; Адрес начала свободной памяти.
ROM:03BF ; End of function RESETALL ; Указывает на верхушку области хранящей массивы и переменные.
ROM:03BF
ROM:03C2
ROM:03C2 ; =============== S U B R O U T I N E =======================================
ROM:03C2
ROM:03C2 ; Инициализирует адрес рабочей области арифметических преобразований,
ROM:03C2 ; обнуляет временные переменные FORTMP, AUTOTR
ROM:03C2
ROM:03C2 RESETSTACK: ; CODE XREF: ERRTR+11j
ROM:03C2 ; ROM:1DF0p ...
ROM:03C2 pop b
ROM:03C3 lhld STKADDR ; Адрес стека
ROM:03C6 sphl
ROM:03C7 lxi h, ARIFMOB ; Рабочая область арифметических преобразований
ROM:03CA shld ARIFMAR ; Адрес рабочей области арифметических преобразований
ROM:03CD lxi h, 0
ROM:03D0 push h
ROM:03D1 shld BRKCONT ; Временная переменная процедур RESETSTACK, TESTBREAKKEY, CONT
ROM:03D4 lhld CURBASLN ; Текущий адрес строки Бейсик программы
ROM:03D7 xra a
ROM:03D8 sta FORTMP ; Временный параметр оператора FOR
ROM:03DB push b
ROM:03DC ret
ROM:03DC ; End of function RESETSTACK
ROM:03DC
ROM:03DD ; ---------------------------------------------------------------------------
ROM:03DD ; START OF FUNCTION CHUNK FOR INPUTLN
ROM:03DD
ROM:03DD loc_3DD: ; CODE XREF: INPUTLN+191Ej
ROM:03DD ; INPUTLN+193Cj
ROM:03DD mvi a, 4
ROM:03DF call EDIT ; A=флажки, HL=адрес, D=строка курсора, E=позиция курсора
ROM:03DF ; (A=0 редактирование
ROM:03DF ; A=1 установка курсора
ROM:03DF ; A=2 вывод текста на экран с текущего положения курсора
ROM:03DF ; A=3 установка курсора и вывод текста
ROM:03DF ; A=4 вывод строк)
ROM:03E2 jmp loc_1E4B
ROM:03E2 ; END OF FUNCTION CHUNK FOR INPUTLN
ROM:03E2 ; ---------------------------------------------------------------------------
ROM:03E5 .db 4
ROM:03E6 ; ---------------------------------------------------------------------------
ROM:03E6 ; START OF FUNCTION CHUNK FOR TOKENIZE
ROM:03E6
ROM:03E6 loc_3E6: ; CODE XREF: TOKENIZE+4j
ROM:03E6 ; TOKENIZE+Aj ...
ROM:03E6 xra a
ROM:03E7 sta MEMTMP ; Временная переменная TOKENIZE
ROM:03EA mvi c, 5
ROM:03EC lxi d, IOBUF ; Буфер ввода-вывода (диск, кассеты)
ROM:03EF
ROM:03EF loc_3EF: ; CODE XREF: TOKENIZE-19D2j
ROM:03EF mov a, m
ROM:03F0 cpi 20h ; ' '
ROM:03F2 jz loc_439
ROM:03F5 mov b, a
ROM:03F6 cpi 22h ; '"'
ROM:03F8 jz loc_459
ROM:03FB ora a
ROM:03FC jz loc_46D
ROM:03FF lda MEMTMP ; Временная переменная TOKENIZE
ROM:0402 ora a
ROM:0403 mov b, a
ROM:0404 mov a, m
ROM:0405 jnz loc_439
ROM:0408 cpi 3Fh ; '?'
ROM:040A mvi a, 95h ; 'Х'
ROM:040C jz loc_439
ROM:040F mov a, m
ROM:0410 cpi 30h ; '0'
ROM:0412 jc loc_41A
ROM:0415 cpi 3Ch ; '<'
ROM:0417 jc loc_439
ROM:041A
ROM:041A loc_41A: ; CODE XREF: TOKENIZE-1A0Cj
ROM:041A push d
ROM:041B lxi d, TAB9+16h ; Сюда ссылается TOKENIZE
ROM:041E push h
ROM:041F
ROM:041F loc_41F: ; CODE XREF: TOKENIZE-19F0j
ROM:041F mvi a, 0D7h ; '+'
ROM:0421 inx d
ROM:0422
ROM:0422 loc_422: ; CODE XREF: TOKENIZE-19B4j
ROM:0422 ldax d
ROM:0423 ani 7Fh
ROM:0425 jz loc_436
ROM:0428 cmp m
ROM:0429 jmp loc_17CC
ROM:042C ; ---------------------------------------------------------------------------
ROM:042C
ROM:042C loc_42C: ; CODE XREF: TOKENIZE:loc_17CCj
ROM:042C ; TOKENIZE-64Cj
ROM:042C ldax d
ROM:042D ora a
ROM:042E jp loc_41F+1
ROM:0431 pop psw
ROM:0432 mov a, b
ROM:0433 ori 80h
ROM:0433 ; END OF FUNCTION CHUNK FOR TOKENIZE
ROM:0433 ; ---------------------------------------------------------------------------
ROM:0435 .db 0F2h ; Є
ROM:0436 ; ---------------------------------------------------------------------------
ROM:0436 ; START OF FUNCTION CHUNK FOR TOKENIZE
ROM:0436
ROM:0436 loc_436: ; CODE XREF: TOKENIZE-19F9j
ROM:0436 pop h
ROM:0437 mov a, m
ROM:0438 pop d
ROM:0439
ROM:0439 loc_439: ; CODE XREF: TOKENIZE-1A2Cj
ROM:0439 ; TOKENIZE-1A19j ...
ROM:0439 inx h
ROM:043A stax d
ROM:043B inx d
ROM:043C inr c
ROM:043D sui 3Ah ; ':'
ROM:043F jz loc_447
ROM:0442 cpi 49h ; 'I'
ROM:0444 jnz loc_44A
ROM:0447
ROM:0447 loc_447: ; CODE XREF: TOKENIZE-19DFj
ROM:0447 sta MEMTMP ; Временная переменная TOKENIZE
ROM:044A
ROM:044A loc_44A: ; CODE XREF: TOKENIZE-19DAj
ROM:044A sui 54h ; 'T'
ROM:044C jnz loc_3EF
ROM:044F mov b, a
ROM:0450
ROM:0450 loc_450: ; CODE XREF: TOKENIZE-19C1j
ROM:0450 mov a, m
ROM:0451 ora a
ROM:0452 jz loc_46D
ROM:0455 cmp b
ROM:0456 jz loc_439
ROM:0459
ROM:0459 loc_459: ; CODE XREF: TOKENIZE-1A26j
ROM:0459 inx h
ROM:045A stax d
ROM:045B inr c
ROM:045C inx d
ROM:045D jmp loc_450
ROM:0460 ; ---------------------------------------------------------------------------
ROM:0460
ROM:0460 loc_460: ; CODE XREF: TOKENIZE-648j
ROM:0460 pop h
ROM:0461 push h
ROM:0462 inr b
ROM:0463 xchg
ROM:0464
ROM:0464 loc_464: ; CODE XREF: TOKENIZE-19B8j
ROM:0464 ora m
ROM:0465 inx h
ROM:0466 jp loc_464
ROM:0469 xchg
ROM:046A jmp loc_422
ROM:046D ; ---------------------------------------------------------------------------
ROM:046D
ROM:046D loc_46D: ; CODE XREF: TOKENIZE-1A22j
ROM:046D ; TOKENIZE-19CCj
ROM:046D lxi h, PRNOP ; Временная переменная. Используется TOKENIZE, INPUTLN, START.
ROM:0470 stax d
ROM:0471 inx d
ROM:0472 stax d
ROM:0473 inx d
ROM:0474 stax d
ROM:0475 ret
ROM:0475 ; END OF FUNCTION CHUNK FOR TOKENIZE
ROM:0476 ; ---------------------------------------------------------------------------
ROM:0476 ; START OF FUNCTION CHUNK FOR INPUTSTR
ROM:0476
ROM:0476 loc_476: ; CODE XREF: INPUTSTR-35j
ROM:0476 cpi 1Ch
ROM:0478 jnz loc_481
ROM:047B lda KSS ; Код символа в позиции курсора
ROM:047E jmp loc_49E
ROM:0481 ; ---------------------------------------------------------------------------
ROM:0481
ROM:0481 loc_481: ; CODE XREF: INPUTSTR-58j
ROM:0481 cpi 1Dh
ROM:0483
ROM:0483 loc_483: ; CODE XREF: ROM:04B4j
ROM:0483 jnz loc_491
ROM:0486 rst 3 ; RST3 = печатает символ из A на экран.
ROM:0487 dcr b
ROM:0488 dcx h
ROM:0489 jnz loc_491
ROM:048C
ROM:048C loc_48C: ; CODE XREF: INPUTSTR+6j
ROM:048C lxi h, IOBUF ; Буфер ввода-вывода (диск, кассеты)
ROM:048F mvi b, 1
ROM:0491
ROM:0491 loc_491: ; CODE XREF: INPUTSTR:loc_483j
ROM:0491 ; INPUTSTR-47j ...
ROM:0491 call INPUTSTR2 ; Ждёт символ из буфера клавиатуры. При коде &h03 переходит к обработке оператора STOP.
ROM:0494 cpi 0Dh
ROM:0496 jz loc_4D9
ROM:0499 cpi 20h ; ' '
ROM:049B jc loc_476
ROM:049E
ROM:049E loc_49E: ; CODE XREF: INPUTSTR-52j
ROM:049E mov c, a
ROM:049F mov a, b
ROM:04A0 ana a
ROM:04A1 jz loc_491
ROM:04A4 mov m, c
ROM:04A5 inr a
ROM:04A6 sta FPTMP ; Временная переменная для работы с числами с плавающей точкой.
ROM:04A9 mov a, c
ROM:04AA rst 3 ; RST3 = печатает символ из A на экран.
ROM:04AB inx h
ROM:04AC inr b
ROM:04AD jmp loc_491
ROM:04AD ; END OF FUNCTION CHUNK FOR INPUTSTR
ROM:04B0 ; ---------------------------------------------------------------------------
ROM:04B0 mov m, c
ROM:04B1 inx h
ROM:04B2 inr b
ROM:04B3 rst 3 ; RST3 = печатает символ из A на экран.
ROM:04B4 jmp loc_483+2
ROM:04B7 ; ---------------------------------------------------------------------------
ROM:04B7 ; START OF FUNCTION CHUNK FOR OUTCHAR
ROM:04B7
ROM:04B7 OUTCHAR2: ; CODE XREF: OUTCHAR+5j
ROM:04B7 jnz loc_1AAF
ROM:04BA pop psw
ROM:04BB push psw
ROM:04BC push b
ROM:04BD push d
ROM:04BE push h
ROM:04BF call SYMSCR ; A=символ (вывод символа на экран в текущую позицию курсора).
ROM:04C2
ROM:04C2 loc_4C2: ; CODE XREF: OUTCHAR+1AA8j
ROM:04C2 ; OUTCHAR+1AB4j
ROM:04C2 pop h
ROM:04C3 pop d
ROM:04C4 pop b
ROM:04C5 pop psw
ROM:04C6 ret
ROM:04C6 ; END OF FUNCTION CHUNK FOR OUTCHAR
ROM:04C7
ROM:04C7 ; =============== S U B R O U T I N E =======================================
ROM:04C7
ROM:04C7 ; Ждёт символ из буфера клавиатуры. При коде &h03 переходит к обработке оператора STOP.
ROM:04C7
ROM:04C7 INPUTSTR2: ; CODE XREF: INPUTSTR:loc_491p
ROM:04C7 call BUFFERTOA ; Ввод символа из буфера клавиатуры в A.
ROM:04C7 ; Если буфер пуст - ожидание нажатия.
ROM:04CA cpi 3
ROM:04CC rnz
ROM:04CD jmp STOP ; Обработка бейсик оператора STOP
ROM:04CD ; End of function INPUTSTR2
ROM:04CD
ROM:04D0
ROM:04D0 ; =============== S U B R O U T I N E =======================================
ROM:04D0
ROM:04D0 ; Выводит вопросительный знак и ждёт ввода строки
ROM:04D0
ROM:04D0 INPUTSTR: ; CODE XREF: ROM:086Ap
ROM:04D0 ; ROM:089Bp
ROM:04D0
ROM:04D0 ; FUNCTION CHUNK AT ROM:0476 SIZE 0000003A BYTES
ROM:04D0 ; FUNCTION CHUNK AT ROM:04D9 SIZE 00000006 BYTES
ROM:04D0
ROM:04D0 call INPUTPRN ; Печатает пригласительный знак вопроса в команде INPUT и сообщении об ошибке
ROM:04D3 call CURSON ; Включает изображение курсора.
ROM:04D6 jmp loc_48C
ROM:04D6 ; End of function INPUTSTR
ROM:04D6
ROM:04D9 ; ---------------------------------------------------------------------------
ROM:04D9 ; START OF FUNCTION CHUNK FOR INPUTSTR
ROM:04D9
ROM:04D9 loc_4D9: ; CODE XREF: INPUTSTR-3Aj
ROM:04D9 call CURSOFF ; Выключает изображение курсора.
ROM:04DC jmp TERMINATEINPUT
ROM:04DC ; END OF FUNCTION CHUNK FOR INPUTSTR
ROM:04DF
ROM:04DF ; =============== S U B R O U T I N E =======================================
ROM:04DF
ROM:04DF ; Вводит строку без отображения курсора
ROM:04DF
ROM:04DF INPUTLN: ; CODE XREF: CHECKENOUGHMEM:loc_30Dp
ROM:04DF
ROM:04DF ; FUNCTION CHUNK AT ROM:03DD SIZE 00000008 BYTES
ROM:04DF ; FUNCTION CHUNK AT ROM:07D7 SIZE 00000005 BYTES
ROM:04DF ; FUNCTION CHUNK AT ROM:1DF9 SIZE 00000025 BYTES
ROM:04DF ; FUNCTION CHUNK AT ROM:1E33 SIZE 00000049 BYTES
ROM:04DF
ROM:04DF call INPUTLN2 ; Вводит строку без отображения курсора. Основная часть функции.
ROM:04E2 jz loc_1DF9
ROM:04E5 jmp loc_1E4B
ROM:04E5 ; End of function INPUTLN
ROM:04E5
ROM:04E8
ROM:04E8 ; =============== S U B R O U T I N E =======================================
ROM:04E8
ROM:04E8 ; Вводит строку без отображения курсора. Основная часть функции.
ROM:04E8
ROM:04E8 INPUTLN2: ; CODE XREF: INPUTLNp
ROM:04E8 ; INPUTLN+1955p
ROM:04E8 lhld EITMP ; Временная переменная. Используется в INPUTLN, ERRTR2
ROM:04EB mov a, h
ROM:04EC ora l
ROM:04ED ret
ROM:04ED ; End of function INPUTLN2
ROM:04ED
ROM:04EE ; ---------------------------------------------------------------------------
ROM:04EE
ROM:04EE LIST: ; CODE XREF: ROM:18A2j
ROM:04EE ; ROM:1B4Fj
ROM:04EE call LINENUMBERFROMSTR ; Обработка бейсик-команды LIST
ROM:04F1 rnz
ROM:04F2 pop b
ROM:04F3 call FINDPROGRAMLINE ; Получает ближайший адрес строки программы в BC
ROM:04F6 push b
ROM:04F7 ; START OF FUNCTION CHUNK FOR PRNTR1
ROM:04F7
ROM:04F7 loc_4F7: ; CODE XREF: PRNTR1+7j
ROM:04F7 ; PRNTR1+A5Cj
ROM:04F7 pop h
ROM:04F8 rst 6 ; Псевдокоманда PUSH (HL).
ROM:04F8 ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP.
ROM:04F8 ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD.
ROM:04F9
ROM:04F9 loc_4F9: ; DATA XREF: RAM:NEXTWORDo
ROM:04F9 pop b
ROM:04FA mov a, b
ROM:04FB ora c
ROM:04FC jz MAIN2 ; Переход с оператора LIST
ROM:04FF call TESTBREAKKEY2 ; Смотрим, надо ли остановиться?
ROM:0502 push b
ROM:0503 call CRLF ; Печатает перевод строки и возврат каретки
ROM:0506 rst 6 ; Псевдокоманда PUSH (HL).
ROM:0506 ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP.
ROM:0506 ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD.
ROM:0507 xthl
ROM:0508 call PRINTINT ; Переводит целое число HL в число с плавающей точкой FACCUM.
ROM:0508 ; В частности, печатает номер строки Бейсик-программы, выполняющейся в данный момент времени.
ROM:050B mvi a, 20h ; ' '
ROM:050D
ROM:050D loc_50D: ; CODE XREF: PRNTR1+A51j
ROM:050D pop h
ROM:050E jmp loc_17EB
ROM:0511 ; ---------------------------------------------------------------------------
ROM:0511
ROM:0511 loc_511: ; CODE XREF: PRNTR1+Cj
ROM:0511 ; PRNTR1+17j
ROM:0511 call PRNTR1 ; Подпрограмма обработчика печати
ROM:0514 jp loc_17EB
ROM:0517 call MACRO7
ROM:051A mov c, a
ROM:051B push h
ROM:051C lxi d, __CLS ; Загрузка в DE таблицы токенов __CLS
ROM:051F
ROM:051F loc_51F: ; CODE XREF: PRNTR1-12B9j
ROM:051F push d
ROM:0520
ROM:0520 loc_520: ; CODE XREF: PRNTR1-12BEj
ROM:0520 ldax d
ROM:0521 inx d
ROM:0522 ora a
ROM:0523 jp loc_520
ROM:0526 dcr c
ROM:0527 pop h
ROM:0528 jnz loc_51F
ROM:052B
ROM:052B loc_52B: ; CODE XREF: PRNTR1-12AFj
ROM:052B mov a, m
ROM:052C ora a
ROM:052D jmp loc_17D9
ROM:0530 ; ---------------------------------------------------------------------------
ROM:0530
ROM:0530 loc_530: ; CODE XREF: PRNTR1:loc_17D9j
ROM:0530 rst 3 ; RST3 = печатает символ из A на экран.
ROM:0531 inx h
ROM:0532 jmp loc_52B
ROM:0532 ; END OF FUNCTION CHUNK FOR PRNTR1
ROM:0535 ; ---------------------------------------------------------------------------
ROM:0535
ROM:0535 FOR: ; Бейсик оператор FOR
ROM:0535 mvi a, 64h ; 'd' ; Хотя FOR указывает на начало цикла программы, этот обработчик вызывается один раз.
ROM:0535 ; Последующие итерации цикла возвращаются к последующим выражениям или строкам программы, а не к самому FOR.
ROM:0537 sta FORTMP ; Временный параметр оператора FOR
ROM:053A call LET ; Обработка бейсик-оператора LET
ROM:053D xthl
ROM:053E call GETFLOWPTR ; Сервисная функция.
ROM:053E ; Устанавливает HL в точку соответствующей структуры потока на стеке (Sets HL to point to the appropriate flow struct on the stack.).
ROM:053E ; Если функция вызвана ключевым словом NEXT, то DE указывает на переменную, следующую за ключевым словом NEXT.
ROM:053E ; Таким образом, устанавливает DE как главный указатель программы (i.e. Get program ptr into DE).
ROM:053E ;
ROM:0541 pop d
ROM:0542 jnz loc_547
ROM:0545 dad b
ROM:0546 sphl
ROM:0547
ROM:0547 loc_547: ; CODE XREF: ROM:0542j
ROM:0547 xchg
ROM:0548 call CHECKENOUGHVARSPACE ; Внимание! После вызова CHECKENOUGHVARSPACE идет байт параметра, а не следующая инструкция!
ROM:0548 ; Проверяет, достаточно ли будет памяти при выделении места для C*4 байт начиная с VAR_TOP перед тем как это выделение начнёт затирать стек.
ROM:0548 ; (Или область переменных).
ROM:0548 ; ---------------------------------------------------------------------------
ROM:054B .db 8 ; Параметр CHECKENOUGHVARSPACE
ROM:054C ; ---------------------------------------------------------------------------
ROM:054C push h
ROM:054D call DATA ; Обработка бейсик-команд DATA и REM. Обратите внимание на комментарий ниже.
ROM:054D ; 06FB: REM: MVI C, 0
ROM:054D ; MVI B, 0
ROM:054D ; LOC_6FF: MOV A, C
ROM:054D ; .....
ROM:054D ;
ROM:054D ; FINDNEXTSTATEMENT:
ROM:0550 ; ---------------------------------------------------------------------------
ROM:0550 xthl
ROM:0551 push h
ROM:0552 lhld BASOPNUM ; Номер оператора Бейсик программы.
ROM:0552 ; Или &hFFFF в командном режиме
ROM:0555 xthl
ROM:0556 call COMPUTE3 ; Вычисление выражений. Вызов из EVALTERM.
ROM:0559 rst 1 ; RST1 = проверка синтаксиса.
ROM:0559 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:0559 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:0559 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:0559 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:0559 ; ---------------------------------------------------------------------------
ROM:055A .db 9Eh ; TO (токен 158 (&h9E))
ROM:055B ; ---------------------------------------------------------------------------
ROM:055B call EVALEXPRESSION ; Вычисляет выражение, возвращая результат в FACCUM. Выражение должно быть комбинацией термов и операторов.
ROM:055E push h
ROM:055F call FCOPYTOBCDE ; Перемещение числа с плавающей точкой из FACCUM в BCDE
ROM:0562 pop h
ROM:0563 push b
ROM:0564 push d
ROM:0565 lxi b, 8100h
ROM:0568 mov d, c
ROM:0569 mov e, d
ROM:056A mov a, m
ROM:056B cpi 0A3h ; 'г' ; Ждём токен STEP
ROM:056D mvi a, 1
ROM:056F jnz PUSHSTEPVALUE ; Толкает значение STEP на стек.
ROM:0572 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:0572 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:0572 ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:0573 call EVALEXPRESSION ; Вычисляет выражение, возвращая результат в FACCUM. Выражение должно быть комбинацией термов и операторов.
ROM:0576 push h
ROM:0577 call FCOPYTOBCDE ; Перемещение числа с плавающей точкой из FACCUM в BCDE
ROM:057A pop h
ROM:057B rst 5 ; RST5 = Проверяет состояние FACCUM.
ROM:057B ; Возвращает A = 0 и устанавливает Z, если FACCUM == 0, хвост функции устанавливает флаг знака и A соответственно
ROM:057B ; (0xFF если отрицательно, 0x01 если положительно).
ROM:057C
ROM:057C PUSHSTEPVALUE: ; CODE XREF: ROM:056Fj
ROM:057C push b ; Толкает значение STEP на стек.
ROM:057D push d
ROM:057E push psw
ROM:057F inx sp
ROM:0580 push h
ROM:0581 lhld CURBASLN ; Текущий адрес строки Бейсик программы
ROM:0584 xthl
ROM:0585 ; START OF FUNCTION CHUNK FOR NEXT2
ROM:0585
ROM:0585 NEXTRET: ; CODE XREF: NEXT2+35j
ROM:0585 mvi b, 81h ; 'Б'
ROM:0587 push b
ROM:0588 inx sp
ROM:0589
ROM:0589 EXECNEXT: ; CODE XREF: NEXT2+3Fj
ROM:0589 ; DATA XREF: CHECKENOUGHMEM+2F3o ...
ROM:0589 call PRNFLCL ; Сюда вернётся бейсик интерпретатор после отработки команды RUN, RETURN, после обработки ошибок.
ROM:0589 ; Вычисляет одно выражение, передвигается на следующее выражение или на новую стоку, если в текущей строке нет больше выражений.
ROM:0589 ;
ROM:058C nop
ROM:058D call TESTBREAKKEY2 ; Смотрим, надо ли остановиться?
ROM:0590 shld CURBASLN ; Текущий адрес строки Бейсик программы
ROM:0593 mov a, m
ROM:0594 cpi 3Ah ; ':'
ROM:0596 jz EXEC_
ROM:0599 ora a
ROM:059A jnz SYNTAXERROR ; Самая распространённая ошибка №2
ROM:059D inx h
ROM:059E mov a, m
ROM:059F inx h
ROM:05A0 ora m
ROM:05A1 inx h
ROM:05A2 jz MAIN_ ; Ссылка из EXECNEXT
ROM:05A5 mov e, m
ROM:05A6 inx h
ROM:05A7 mov d, m
ROM:05A8 xchg
ROM:05A9 call TRACEPRN ; Обработка трассировки. Печатает квадратные скобки и номер выполняющейся в данный момент строки Бейсик-программы.
ROM:05AC xchg
ROM:05AC ; END OF FUNCTION CHUNK FOR NEXT2
ROM:05AD ; START OF FUNCTION CHUNK FOR CHECKENOUGHMEM
ROM:05AD
ROM:05AD EXEC_: ; CODE XREF: NEXT2-38Aj
ROM:05AD ; CHECKENOUGHMEM+18A2j
ROM:05AD rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:05AD ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:05AD ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:05AE lxi d, EXECNEXT ; Сюда вернётся бейсик интерпретатор после отработки команды RUN, RETURN, после обработки ошибок.
ROM:05AE ; Вычисляет одно выражение, передвигается на следующее выражение или на новую стоку, если в текущей строке нет больше выражений.
ROM:05AE ;
ROM:05B1 push d
ROM:05B2
ROM:05B2 loc_5B2: ; CODE XREF: ROM:078Cj
ROM:05B2 rz
ROM:05B3
ROM:05B3 loc_5B3: ; CODE XREF: ROM:076Cj
ROM:05B3 sui 80h ; 'А'
ROM:05B5 jc LET ; Обработка бейсик-оператора LET
ROM:05B8 cpi 1Dh
ROM:05BA jnc SYNTAXERROR2
ROM:05BD
ROM:05BD loc_5BD: ; CODE XREF: CHECKENOUGHMEM+D72j
ROM:05BD rlc
ROM:05BE mov c, a
ROM:05BF mvi b, 0
ROM:05C1 xchg
ROM:05C2 lxi h, _CLS ; Адрес таблицы операторов и функций _CLS
ROM:05C5 dad b
ROM:05C6 mov c, m
ROM:05C7 inx h
ROM:05C8 mov b, m
ROM:05C9 push b
ROM:05CA xchg
ROM:05CA ; END OF FUNCTION CHUNK FOR CHECKENOUGHMEM
ROM:05CB
ROM:05CB ; =============== S U B R O U T I N E =======================================
ROM:05CB
ROM:05CB ; Сравнивает следующий символ (HL) с двоеточием
ROM:05CB
ROM:05CB DDCMP: ; CODE XREF: DDCMP+7j
ROM:05CB ; MAINTR2+18p
ROM:05CB inx h
ROM:05CC mov a, m
ROM:05CD cpi 3Ah ; ':'
ROM:05CF rnc
ROM:05D0
ROM:05D0 NEXTCHAR2: ; CODE XREF: NEXTCHAR+5j
ROM:05D0 cpi 20h ; ' ' ; возвращает в A следующий символ ввода из буфера в HL,
ROM:05D0 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:05D0 ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:05D2 jz DDCMP ; Сравнивает следующий символ (HL) с двоеточием
ROM:05D5 cpi 30h ; '0'
ROM:05D7 cmc
ROM:05D8 inr a
ROM:05D9 dcr a
ROM:05DA ret
ROM:05DA ; End of function DDCMP
ROM:05DA
ROM:05DB
ROM:05DB ; =============== S U B R O U T I N E =======================================
ROM:05DB
ROM:05DB ; Сбрасывает указатель оператора READ. При инициализации и при вызове RESTORE
ROM:05DB ; Resets the data pointer to just before the start of the program
ROM:05DB
ROM:05DB READPT: ; CODE XREF: RESETALL+Dp
ROM:05DB ; ROM:RESTOREj
ROM:05DB xchg
ROM:05DC lhld BGBASPRG ; Адрес начала Бейсик программы
ROM:05DF dcx h
ROM:05E0
ROM:05E0 loc_5E0: ; CODE XREF: ROM:08DDj
ROM:05E0 ; ROM:1A50j
ROM:05E0 shld READPTR ; Указатель для READ
ROM:05E3 xchg
ROM:05E4 ret
ROM:05E4 ; End of function READPT
ROM:05E4
ROM:05E4 ; ---------------------------------------------------------------------------
ROM:05E5 .db 0, 0, 0, 0, 0
ROM:05EA
ROM:05EA ; =============== S U B R O U T I N E =======================================
ROM:05EA
ROM:05EA ; Смотрим, надо ли остановиться?
ROM:05EA
ROM:05EA TESTBREAKKEY2: ; CODE XREF: TESTBREAKKEYj
ROM:05EA ; PRNTR1-12E2p ...
ROM:05EA call TESTBREAKKEYTR ; Обработка нажатия Break
ROM:05ED ani 4
ROM:05EF rz
ROM:05F0
ROM:05F0 STOP: ; CODE XREF: INPUTSTR2+6j
ROM:05F0 ori 0C3h ; Обработка бейсик оператора STOP
ROM:05F2
ROM:05F2 loc_5F2: ; CODE XREF: ROM:1A78j
ROM:05F2 shld CURBASLN ; Текущий адрес строки Бейсик программы
ROM:05F5
ROM:05F5 loc_5F5: ; CODE XREF: ROM:0872j
ROM:05F5 pop b
ROM:05F6
ROM:05F6 MAIN_: ; CODE XREF: NEXT2-37Ej
ROM:05F6 push psw ; Ссылка из EXECNEXT
ROM:05F7 lhld BASOPNUM ; Номер оператора Бейсик программы.
ROM:05F7 ; Или &hFFFF в командном режиме
ROM:05FA mov a, l
ROM:05FB ana h
ROM:05FC inr a
ROM:05FD jz loc_609
ROM:0600 shld CONTTMP ; Временная переменная оператора CONT
ROM:0603 lhld CURBASLN ; Текущий адрес строки Бейсик программы
ROM:0606 shld BRKCONT ; Временная переменная процедур RESETSTACK, TESTBREAKKEY, CONT
ROM:0609
ROM:0609 loc_609: ; CODE XREF: TESTBREAKKEY2+13j
ROM:0609 xra a
ROM:060A call STOPTR ; Обработка останова
ROM:060D pop psw
ROM:060E lxi h, aBreak ; "\r\nBreak"
ROM:0611 jnz loc_2EE
ROM:0614 jmp MAINLOOP3 ; Третья точка входа в главный цикл. Переход из INIT2, STOP, CSAVE, OUTCHAR2, INPUTLN
ROM:0614 ; End of function TESTBREAKKEY2
ROM:0614
ROM:0617 ; ---------------------------------------------------------------------------
ROM:0617
ROM:0617 CONT: ; Обработка бейсик-команды CONT
ROM:0617 rnz
ROM:0618 mvi e, 20h ; ' '
ROM:061A lhld BRKCONT ; Временная переменная процедур RESETSTACK, TESTBREAKKEY, CONT
ROM:061D mov a, h
ROM:061E ora l
ROM:061F jz MAINLOOP1 ; Первая точка входа в главный цикл
ROM:0622 xchg
ROM:0623 lhld CONTTMP ; Временная переменная оператора CONT
ROM:0626 shld BASOPNUM ; Номер оператора Бейсик программы.
ROM:0626 ; Или &hFFFF в командном режиме
ROM:0629 xchg
ROM:062A ret
ROM:062B ; ---------------------------------------------------------------------------
ROM:062B call GETINTPARAM ; Получаем в A целочисленный параметр для команды Бейсика
ROM:062E rnz
ROM:062F inr a
ROM:0630 cpi 48h ; 'H'
ROM:0632 jnc FUNCTIONCALLERROR ; Ошибка вызова функции
ROM:0635 sta PRMTMP ; Архаичная временная переменная. Нигде не используется.
ROM:0638 ret
ROM:0639
ROM:0639 ; =============== S U B R O U T I N E =======================================
ROM:0639
ROM:0639 ; Если символ, на который указывает HL алфавитный, то флаг переноса сбрасывается. А если нет - то установится.
ROM:0639 ; Т. е. является ли (M) буквой?
ROM:0639
ROM:0639 CHARISALPHA: ; CODE XREF: EVALTERM+8p
ROM:0639 ; GETVAR2p ...
ROM:0639 mov a, m
ROM:063A cpi 41h ; 'A'
ROM:063C rc
ROM:063D cpi 5Bh ; '['
ROM:063F cmc
ROM:0640 ret
ROM:0640 ; End of function CHARISALPHA
ROM:0640
ROM:0641
ROM:0641 ; =============== S U B R O U T I N E =======================================
ROM:0641
ROM:0641 ; Получает индекс массива встречающегося в выражении или операторе DIM.
ROM:0641 ; Индекс возвращается в виде целого положительного числа в CDE.
ROM:0641
ROM:0641 GETSUBSCRIPT: ; CODE XREF: GETVAR2+88p
ROM:0641 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:0641 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:0641 ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:0642
ROM:0642 loc_642: ; CODE XREF: ROM:0685p
ROM:0642 ; ROM:1064p
ROM:0642 call EVALEXPRESSION ; Вычисляет выражение, возвращая результат в FACCUM. Выражение должно быть комбинацией термов и операторов.
ROM:0642 ; End of function GETSUBSCRIPT
ROM:0642
ROM:0645
ROM:0645 ; =============== S U B R O U T I N E =======================================
ROM:0645
ROM:0645 ; Проверка результата функции.
ROM:0645
ROM:0645 FUNCTIONAK: ; CODE XREF: GETINTPARAM:loc_FBCp
ROM:0645 ; ROM:105Dp
ROM:0645 rst 5 ; RST5 = Проверяет состояние FACCUM.
ROM:0645 ; Возвращает A = 0 и устанавливает Z, если FACCUM == 0, хвост функции устанавливает флаг знака и A соответственно
ROM:0645 ; (0xFF если отрицательно, 0x01 если положительно).
ROM:0646 jm FUNCTIONCALLERROR ; Ошибка вызова функции
ROM:0646 ; End of function FUNCTIONAK
ROM:0646
ROM:0649
ROM:0649 ; =============== S U B R O U T I N E =======================================
ROM:0649
ROM:0649 ; Получение целого числа из числа с плавающей точкой
ROM:0649
ROM:0649 INTFROMFLOAT: ; CODE XREF: ROM:0A7Cp
ROM:0649 ; ROM:0A88p ...
ROM:0649 lda FACCUM+3 ; Аккумулятор для вычислений с плавающей точкой:
ROM:0649 ; 00000000 1 11111111111111111111111
ROM:0649 ; -------- - -----------------------
ROM:0649 ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:064C cpi 90h ; 'Р'
ROM:064E call FASINTEGERTR ; Обработчик перевода числа с плавающей точкой в целое
ROM:0651 lxi b, 9080h
ROM:0654 lxi d, 0
ROM:0657 call FCOMPARE ; Сравнение чисел с плавающей точкой.
ROM:0657 ; Сравнивает FACCUM и BCDE. Результат возвращается в A.
ROM:0657 ; FACCUM > BCDE, A = 0x01.
ROM:0657 ; FACCUM < BCDE, A = 0xFF.
ROM:0657 ; FACCUM = BCDE, A = 0.
ROM:065A mov d, c
ROM:065B rz
ROM:065C
ROM:065C FUNCTIONCALLERROR: ; CODE XREF: ROM:0632j
ROM:065C ; FUNCTIONAK+1j ...
ROM:065C mvi e, 8 ; Ошибка вызова функции
ROM:065E jmp MAINLOOP1 ; Первая точка входа в главный цикл
ROM:065E ; End of function INTFROMFLOAT
ROM:065E
ROM:0661
ROM:0661 ; =============== S U B R O U T I N E =======================================
ROM:0661
ROM:0661 ; Возвращает в DE номер бейсик-строки из параметра GOTO, LIST, GOSUB, RESTORE, ON...
ROM:0661 ; А также номер строки в самой бейсик-программе.
ROM:0661 ; Чуть подробнее: Получает номер строки из указателя на строку.
ROM:0661 ; Указатель строки передается в HL, и целый результат возвращается в DE.
ROM:0661 ; Лидирующие пробелы пропускаются, и возврат происходит при найденном первом символе не являющемся цифрой.
ROM:0661 ; Максимально допустимое число строк 65529. Синтаксическая ошибка появится, если значение первых четырех цифр более 6552.
ROM:0661 ; Одной из интересных особенностей этой функции является то, что он устанавливает Z, если найден правильный номер (или строка была пустой),
ROM:0661 ; или NZ, если строка не начинается с номера.
ROM:0661 ;
ROM:0661
ROM:0661 LINENUMBERFROMSTR: ; CODE XREF: CHECKENOUGHMEM+5Cp
ROM:0661 ; ROM:LISTp ...
ROM:0661 dcx h
ROM:0662
ROM:0662 loc_662: ; CODE XREF: ROM:076Fp
ROM:0662 lxi d, 0
ROM:0665
ROM:0665 NEXTLINENUMCHAR: ; CODE XREF: LINENUMBERFROMSTR+1Ej
ROM:0665 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:0665 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:0665 ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:0666 rnc
ROM:0667 push h
ROM:0668 push psw
ROM:0669 lxi h, 1998h
ROM:066C rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения.
ROM:066D jc SYNTAXERROR ; Самая распространённая ошибка №2
ROM:0670 mov h, d
ROM:0671 mov l, e
ROM:0672 dad d
ROM:0673 dad h
ROM:0674 dad d
ROM:0675 dad h
ROM:0676 pop psw
ROM:0677 sui 30h ; '0'
ROM:0679 mov e, a
ROM:067A mvi d, 0
ROM:067C dad d
ROM:067D xchg
ROM:067E pop h
ROM:067F jmp NEXTLINENUMCHAR
ROM:067F ; End of function LINENUMBERFROMSTR
ROM:067F
ROM:0682 ; ---------------------------------------------------------------------------
ROM:0682
ROM:0682 CLEAR: ; Обработка бейсик-оператора CLEAR
ROM:0682 jz RUNWITH
ROM:0685 call loc_642
ROM:0688 dcx h
ROM:0689 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:0689 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:0689 ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:068A rnz
ROM:068B push h
ROM:068C lhld ENDSTRAR ; Конец строковой области
ROM:068F mov a, l
ROM:0690 sub e
ROM:0691 mov e, a
ROM:0692 mov a, h
ROM:0693 sbb d
ROM:0694 mov d, a
ROM:0695 jc SYNTAXERROR ; Самая распространённая ошибка №2
ROM:0698 lhld ENBASPRG ; Адрес конца Бейсик программы.
ROM:0698 ; Указывает на первую ячейку участка памяти, доступного программам.
ROM:0698 ; Всегда следует за последним байтом программы.
ROM:069B lxi b, 28h ; '('
ROM:069E dad b
ROM:069F rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения.
ROM:06A0 jnc OUTOFMEMORY ; Ошибка Out of memory
ROM:06A3 xchg
ROM:06A4 shld STKADDR ; Адрес стека
ROM:06A7 pop h
ROM:06A8 jmp RUNWITH ; RESETALL дополнительная точка входа.
ROM:06AB ; ---------------------------------------------------------------------------
ROM:06AB
ROM:06AB RUN: ; Обработка бейсик команды RUN. Запуск бейсик программы
ROM:06AB jz RESETALL
ROM:06AE call RUNWITH ; Если есть параметр (номер строки, с которой запускается программа)
ROM:06B1 lxi b, EXECNEXT ; Сюда вернётся бейсик интерпретатор после отработки команды RUN, RETURN, после обработки ошибок.
ROM:06B1 ; Вычисляет одно выражение, передвигается на следующее выражение или на новую стоку, если в текущей строке нет больше выражений.
ROM:06B1 ;
ROM:06B4 jmp loc_6C6
ROM:06B7 ; ---------------------------------------------------------------------------
ROM:06B7
ROM:06B7 GOSUB: ; Gosub сохраняет структуру потока в стеке, а затем переходит к Goto.
ROM:06B7 call CHECKENOUGHVARSPACE ; Структура потока это __GOSUB с предшествующем номером строки с GoSub оператором,
ROM:06B7 ; в свою очередь, ему предшествует указатель на строку следующую после строки с GoSub оператором.
ROM:06B7 ; ---------------------------------------------------------------------------
ROM:06BA .db 3
ROM:06BB ; ---------------------------------------------------------------------------
ROM:06BB pop b
ROM:06BC push h
ROM:06BD push h
ROM:06BE lhld BASOPNUM ; Номер оператора Бейсик программы.
ROM:06BE ; Или &hFFFF в командном режиме
ROM:06C1 xthl
ROM:06C2 mvi d, 8Ch ; 'М' ; Токен GOSUB
ROM:06C4 push d
ROM:06C5 inx sp
ROM:06C6
ROM:06C6 loc_6C6: ; CODE XREF: ROM:06B4j
ROM:06C6 push b
ROM:06C7
ROM:06C7 GOTO: ; CODE XREF: ROM:0789j
ROM:06C7 call LINENUMBERFROMSTR ; Обработка бейсик-команды GOTO
ROM:06CA call DATA+2 ; Обработка бейсик-команд DATA и REM. Обратите внимание на комментарий ниже.
ROM:06CA ; 06FB: REM: MVI C, 0
ROM:06CA ; MVI B, 0
ROM:06CA ; LOC_6FF: MOV A, C
ROM:06CA ; .....
ROM:06CA ;
ROM:06CA ; FINDNEXTSTATEMENT:
ROM:06CD
ROM:06CD ; =============== S U B R O U T I N E =======================================
ROM:06CD
ROM:06CD ; Подготавливает переход на строку бейсик-программы
ROM:06CD
ROM:06CD GOTOPRE: ; CODE XREF: ROM:1A4Cp
ROM:06CD ; ERRTR+25j
ROM:06CD push h
ROM:06CE lhld BASOPNUM ; Номер оператора Бейсик программы.
ROM:06CE ; Или &hFFFF в командном режиме
ROM:06D1 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения.
ROM:06D2 pop h
ROM:06D3 inx h
ROM:06D4 cc FINDPROGRAMLINE2 ; Получает ближайший адрес строки программы в BC.
ROM:06D4 ; Дополнительная точка входа.
ROM:06D7 cnc FINDPROGRAMLINE ; Получает ближайший адрес строки программы в BC
ROM:06DA mov h, b
ROM:06DB mov l, c
ROM:06DC dcx h
ROM:06DD rc
ROM:06DE mvi e, 0Eh
ROM:06E0 jmp MAINLOOP1 ; Первая точка входа в главный цикл
ROM:06E0 ; End of function GOTOPRE
ROM:06E0
ROM:06E3 ; ---------------------------------------------------------------------------
ROM:06E3
ROM:06E3 RETURN: ; Обработка бейсик-команды RETURN
ROM:06E3 rnz
ROM:06E4 mvi d, 0FFh
ROM:06E6 call GETFLOWPTR ; Сервисная функция.
ROM:06E6 ; Устанавливает HL в точку соответствующей структуры потока на стеке (Sets HL to point to the appropriate flow struct on the stack.).
ROM:06E6 ; Если функция вызвана ключевым словом NEXT, то DE указывает на переменную, следующую за ключевым словом NEXT.
ROM:06E6 ; Таким образом, устанавливает DE как главный указатель программы (i.e. Get program ptr into DE).
ROM:06E6 ;
ROM:06E9 sphl
ROM:06EA cpi 8Ch ; 'М' ; Токен GOSUB
ROM:06EC mvi e, 4
ROM:06EE jnz MAINLOOP1 ; Первая точка входа в главный цикл
ROM:06F1 pop h
ROM:06F2 shld BASOPNUM ; Номер оператора Бейсик программы.
ROM:06F2 ; Или &hFFFF в командном режиме
ROM:06F5 lxi h, EXECNEXT ; Сюда вернётся бейсик интерпретатор после отработки команды RUN, RETURN, после обработки ошибок.
ROM:06F5 ; Вычисляет одно выражение, передвигается на следующее выражение или на новую стоку, если в текущей строке нет больше выражений.
ROM:06F5 ;
ROM:06F8 xthl
ROM:06F9
ROM:06F9 ; =============== S U B R O U T I N E =======================================
ROM:06F9
ROM:06F9 ; Обработка бейсик-команд DATA и REM. Обратите внимание на комментарий ниже.
ROM:06F9 ; 06FB: REM: MVI C, 0
ROM:06F9 ; MVI B, 0
ROM:06F9 ; LOC_6FF: MOV A, C
ROM:06F9 ; .....
ROM:06F9 ;
ROM:06F9 ; FINDNEXTSTATEMENT:
ROM:06F9 ; Attributes: noreturn
ROM:06F9
ROM:06F9 DATA: ; CODE XREF: ROM:054Dp
ROM:06F9 ; ROM:loc_8FBp ...
ROM:06F9 lxi b, loc_E3A
ROM:06FC nop
ROM:06FD mvi b, 0
ROM:06FF
ROM:06FF loc_6FF: ; CODE XREF: DATA+11j
ROM:06FF mov a, c
ROM:0700 mov c, b
ROM:0701 mov b, a
ROM:0702
ROM:0702 loc_702: ; CODE XREF: DATA+14j
ROM:0702 mov a, m
ROM:0703 ora a
ROM:0704 rz
ROM:0705 cmp b
ROM:0706 rz
ROM:0707 inx h
ROM:0708 cpi 22h ; '"'
ROM:070A jz loc_6FF
ROM:070D jmp loc_702
ROM:070D ; End of function DATA
ROM:070D
ROM:0710
ROM:0710 ; =============== S U B R O U T I N E =======================================
ROM:0710
ROM:0710 ; Обработка бейсик-оператора LET
ROM:0710
ROM:0710 LET: ; CODE XREF: ROM:053Ap
ROM:0710 ; CHECKENOUGHMEM+2FAj
ROM:0710 call GETVAR ; Поиск и инициализация переменной.
ROM:0710 ; HL указывает на имя переменной, которая встретилась во время интерпретации.
ROM:0710 ; Функция возвращает в DE указатель на значение переменной.
ROM:0710 ; Если переменная не существует, то функция выделяет ей память и инициализирует её.
ROM:0713 rst 1 ; RST1 = проверка синтаксиса.
ROM:0713 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:0713 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:0713 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:0713 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:0713 ; ---------------------------------------------------------------------------
ROM:0714 .db 0ACh ; = (токен 172 (&hAC))
ROM:0715 ; ---------------------------------------------------------------------------
ROM:0715
ROM:0715 ASSIGNVAR: ; Присваивает результат Бейсик-выражения на которое указывает HL переменной, на которую указывает DE.
ROM:0715 lda LETTMP
ROM:0718 push psw
ROM:0719 push d
ROM:071A call COMPUTE ; Вычисление выражений. Вызов из EVALEXPRESSION, IF, PRINT, EVALTERM.
ROM:071D xthl
ROM:071E shld CURBASLN ; Текущий адрес строки Бейсик программы
ROM:0721 pop d
ROM:0722 pop psw
ROM:0723 push d
ROM:0724 rar
ROM:0725 call COMPUTE4 ; Вычисление выражений. Вызов из ASSIGNVAR.
ROM:0728 jz loc_755
ROM:072B
ROM:072B loc_72B: ; CODE XREF: ROM:08BBj
ROM:072B push h
ROM:072C lhld FACCUM ; Аккумулятор для вычислений с плавающей точкой:
ROM:072C ; 00000000 1 11111111111111111111111
ROM:072C ; -------- - -----------------------
ROM:072C ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:072F push h
ROM:0730 inx h
ROM:0731 inx h
ROM:0732 rst 6 ; Псевдокоманда PUSH (HL).
ROM:0732 ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP.
ROM:0732 ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD.
ROM:0733 pop d
ROM:0734 lhld STKADDR ; Адрес стека
ROM:0737 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения.
ROM:0738 pop d
ROM:0739 jnc loc_745
ROM:073C lhld ENBASPRG ; Адрес конца Бейсик программы.
ROM:073C ; Указывает на первую ячейку участка памяти, доступного программам.
ROM:073C ; Всегда следует за последним байтом программы.
ROM:073F rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения.
ROM:0740 mov l, e
ROM:0741 mov h, d
ROM:0742 cnc MAINTR4 ; Обработка главного цикла. Вызов из ASSIGNVAR.
ROM:0745
ROM:0745 loc_745: ; CODE XREF: LET+29j
ROM:0745 ldax d
ROM:0746 push psw
ROM:0747 xra a
ROM:0748 stax d
ROM:0749 call FAPREP3 ; Подготовка FACCUM, ARIFMAR.
ROM:0749 ; Дополнительная точка входа.
ROM:074C pop psw
ROM:074D mov m, a
ROM:074E xchg
ROM:074F pop h
ROM:0750 call FCOPYTOMEM2 ; Копирование числа с плавающей точкой в память. Дополнительная точка входа.
ROM:0753 pop h
ROM:0754 ret
ROM:0755 ; ---------------------------------------------------------------------------
ROM:0755
ROM:0755 loc_755: ; CODE XREF: LET+18j
ROM:0755 push h
ROM:0756 call FCOPYTOMEM ; Копирование числа с плавающей точкой в память, на которую указывает HL
ROM:0759 pop d
ROM:075A pop h
ROM:075B ret
ROM:075B ; End of function LET
ROM:075B
ROM:075C ; ---------------------------------------------------------------------------
ROM:075C
ROM:075C loc_75C: ; CODE XREF: ROM:1D56j
ROM:075C call GETINTPARAM ; Получаем в A целочисленный параметр для команды Бейсика
ROM:075F mov a, m
ROM:0760 mov b, a
ROM:0761 cpi 8Ch ; 'М'
ROM:0763 jz loc_769
ROM:0766 rst 1 ; RST1 = проверка синтаксиса.
ROM:0766 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:0766 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:0766 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:0766 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:0766 ; ---------------------------------------------------------------------------
ROM:0767 .db 88h ; Бейсик оператор GOTO (токен 136 (&h88))
ROM:0768 ; ---------------------------------------------------------------------------
ROM:0768 dcx h
ROM:0769
ROM:0769 loc_769: ; CODE XREF: ROM:0763j
ROM:0769 mov c, e
ROM:076A
ROM:076A loc_76A: ; CODE XREF: ROM:0775j
ROM:076A dcr c
ROM:076B mov a, b
ROM:076C jz loc_5B3
ROM:076F call loc_662
ROM:0772 cpi 2Ch ; ','
ROM:0774 rnz
ROM:0775 jmp loc_76A
ROM:0778 ; ---------------------------------------------------------------------------
ROM:0778
ROM:0778 IF: ; Бейсик-оператор IF
ROM:0778 call COMPUTE
ROM:077B mov a, m
ROM:077C cpi 88h ; 'И' ; Токен GOTO
ROM:077E jz loc_784
ROM:0781 rst 1 ; RST1 = проверка синтаксиса.
ROM:0781 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:0781 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:0781 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:0781 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:0781 ; ---------------------------------------------------------------------------
ROM:0782 .db 0A1h ; THEN (токен 161 (&hA1))
ROM:0783 ; ---------------------------------------------------------------------------
ROM:0783 dcx h
ROM:0784
ROM:0784 loc_784: ; CODE XREF: ROM:077Ej
ROM:0784 rst 5 ; RST5 = Проверяет состояние FACCUM.
ROM:0784 ; Возвращает A = 0 и устанавливает Z, если FACCUM == 0, хвост функции устанавливает флаг знака и A соответственно
ROM:0784 ; (0xFF если отрицательно, 0x01 если положительно).
ROM:0785 jz DATA+2 ; Обработка бейсик-команд DATA и REM. Обратите внимание на комментарий ниже.
ROM:0785 ; 06FB: REM: MVI C, 0
ROM:0785 ; MVI B, 0
ROM:0785 ; LOC_6FF: MOV A, C
ROM:0785 ; .....
ROM:0785 ;
ROM:0785 ; FINDNEXTSTATEMENT:
ROM:0788 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:0788 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:0788 ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:0789 jc GOTO ; Обработка бейсик-команды GOTO
ROM:078C jmp loc_5B2
ROM:078F ; ---------------------------------------------------------------------------
ROM:078F dcx h
ROM:0790
ROM:0790 loc_790: ; CODE XREF: ROM:07D4j
ROM:0790 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:0790 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:0790 ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:0791
ROM:0791 PRINT: ; CODE XREF: ROM:1B47j
ROM:0791 jz CRLF ; Бейсик-оператор PRINT
ROM:0794
ROM:0794 loc_794: ; CODE XREF: ROM:082Aj
ROM:0794 rz
ROM:0795 cpi 9Dh ; 'Э' ; Токен TAB
ROM:0797 jz loc_808
ROM:079A cpi 9Fh ; 'Я' ; Токен SPC
ROM:079C jz loc_808
ROM:079F push h
ROM:07A0 cpi 2Ch ; ','
ROM:07A2 jz loc_7F4
ROM:07A5 cpi 3Bh ; ';'
ROM:07A7 jz loc_828
ROM:07AA pop b
ROM:07AB call COMPUTE ; Вычисление выражений. Вызов из EVALEXPRESSION, IF, PRINT, EVALTERM.
ROM:07AE dcx h
ROM:07AF push h
ROM:07B0 lda LETTMP ; Временная переменная оператора LET, EVALTERM, COMPUTE, GETVAR
ROM:07B3 ora a
ROM:07B4 jnz loc_7D0
ROM:07B7 call FOUT ; Печатает число с плавающей точкой на терминал.
ROM:07BA call MAINTR2 ; Обработка главного цикла. Вызов из PRINT и STR.
ROM:07BD lhld FACCUM ; Аккумулятор для вычислений с плавающей точкой:
ROM:07BD ; 00000000 1 11111111111111111111111
ROM:07BD ; -------- - -----------------------
ROM:07BD ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:07C0 lda FPTMP ; Временная переменная для работы с числами с плавающей точкой.
ROM:07C3 add m
ROM:07C4 cpi 40h ; '@'
ROM:07C6 cnc CRLF ; Печатает перевод строки и возврат каретки
ROM:07C9 call loc_D96
ROM:07CC mvi a, 20h ; ' '
ROM:07CE rst 3 ; RST3 = печатает символ из A на экран.
ROM:07CF
ROM:07CF loc_7CF: ; DATA XREF: MACRO1+1o
ROM:07CF xra a
ROM:07D0
ROM:07D0 loc_7D0: ; CODE XREF: ROM:07B4j
ROM:07D0 cnz loc_D96
ROM:07D3 pop h
ROM:07D4 jmp loc_790
ROM:07D7 ; ---------------------------------------------------------------------------
ROM:07D7 ; START OF FUNCTION CHUNK FOR INPUTLN
ROM:07D7
ROM:07D7 TERMINATEINPUT: ; CODE XREF: INPUTSTR+Cj
ROM:07D7 ; INPUTLN+1959j
ROM:07D7 mvi m, 0
ROM:07D9 lxi h, PRNOP ; Временная переменная. Используется TOKENIZE, INPUTLN, START.
ROM:07D9 ; END OF FUNCTION CHUNK FOR INPUTLN
ROM:07DC
ROM:07DC ; =============== S U B R O U T I N E =======================================
ROM:07DC
ROM:07DC ; Проверка позиции курсора, печать новой строки и перевода каретки
ROM:07DC
ROM:07DC PKCHK: ; CODE XREF: CHECKENOUGHMEM:loc_2DFp
ROM:07DC ; ROM:07F9p
ROM:07DC lda PK ; Позиция курсора
ROM:07DF ora a
ROM:07E0 jnz CRLF ; Печатает перевод строки и возврат каретки
ROM:07E3 nop
ROM:07E4
ROM:07E4 loc_7E4: ; CODE XREF: CRLF+6j
ROM:07E4 xra a
ROM:07E4 ; End of function PKCHK
ROM:07E4
ROM:07E5
ROM:07E5 ; =============== S U B R O U T I N E =======================================
ROM:07E5
ROM:07E5 ; Сохранение A в FPTMP
ROM:07E5
ROM:07E5 PKCHK2: ; CODE XREF: MAINTR+10p
ROM:07E5 sta FPTMP ; Временная переменная для работы с числами с плавающей точкой.
ROM:07E8 ret
ROM:07E8 ; End of function PKCHK2
ROM:07E8
ROM:07E9
ROM:07E9 ; =============== S U B R O U T I N E =======================================
ROM:07E9
ROM:07E9 ; Печатает перевод строки и возврат каретки
ROM:07E9
ROM:07E9 CRLF: ; CODE XREF: CHECKENOUGHMEM:MAIN2p
ROM:07E9 ; PRNTR1-12DEp ...
ROM:07E9 mvi a, 0Dh
ROM:07EB rst 3 ; RST3 = печатает символ из A на экран.
ROM:07EC mvi a, 0Ah
ROM:07EE rst 3 ; RST3 = печатает символ из A на экран.
ROM:07EF jmp loc_7E4
ROM:07EF ; End of function CRLF
ROM:07EF
ROM:07F2 ; ---------------------------------------------------------------------------
ROM:07F2 rpe
ROM:07F3 rlc
ROM:07F4
ROM:07F4 loc_7F4: ; CODE XREF: ROM:07A2j
ROM:07F4 lda FPTMP ; Временная переменная для работы с числами с плавающей точкой.
ROM:07F7 cpi 30h ; '0'
ROM:07F9 cnc PKCHK ; Проверка позиции курсора, печать новой строки и перевода каретки
ROM:07FC jnc loc_828
ROM:07FF
ROM:07FF loc_7FF: ; CODE XREF: ROM:0801j
ROM:07FF sui 0Eh
ROM:0801 jnc loc_7FF
ROM:0804 cma
ROM:0805 jmp loc_81F
ROM:0808 ; ---------------------------------------------------------------------------
ROM:0808
ROM:0808 loc_808: ; CODE XREF: ROM:0797j
ROM:0808 ; ROM:079Cj
ROM:0808 push psw
ROM:0809 call loc_FB8
ROM:080C rst 1 ; RST1 = проверка синтаксиса.
ROM:080C ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:080C ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:080C ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:080C ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:080C ; ---------------------------------------------------------------------------
ROM:080D .db ')'
ROM:080E ; ---------------------------------------------------------------------------
ROM:080E dcx h
ROM:080F pop psw
ROM:0810 cpi 9Fh ; 'Я'
ROM:0812 push h
ROM:0813 mov a, e
ROM:0814 jz loc_820
ROM:0817 lda PK ; Позиция курсора
ROM:081A cma
ROM:081B add e
ROM:081C jnc loc_828
ROM:081F
ROM:081F loc_81F: ; CODE XREF: ROM:0805j
ROM:081F inr a
ROM:0820
ROM:0820 loc_820: ; CODE XREF: ROM:0814j
ROM:0820 mov b, a
ROM:0821 mvi a, 20h ; ' '
ROM:0823
ROM:0823 loc_823: ; CODE XREF: ROM:0825j
ROM:0823 rst 3 ; RST3 = печатает символ из A на экран.
ROM:0824 dcr b
ROM:0825 jnz loc_823
ROM:0828
ROM:0828 loc_828: ; CODE XREF: ROM:07A7j
ROM:0828 ; ROM:07FCj ...
ROM:0828 pop h
ROM:0829 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:0829 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:0829 ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:082A jmp loc_794
ROM:082A ; ---------------------------------------------------------------------------
ROM:082D byte_82D: .db 3Fh, 0F0h, 0EFh, 0F7h, 0F4h, 0EFh, 0F2h, 0E9h, 0F4h
ROM:082D ; DATA XREF: ROM:0848o
ROM:082D .db 0E5h, 20h, 0F7h, 0F7h, 0EFh, 0E4h, 0Dh, 0Ah, 0, 0C5h
ROM:0840 ; ---------------------------------------------------------------------------
ROM:0840
ROM:0840 loc_840: ; CODE XREF: ROM:08CEj
ROM:0840 lda IFINPUT ; =0 если INPUT
ROM:0843 ora a
ROM:0844 jnz loc_2CA
ROM:0847 pop b
ROM:0848 lxi h, byte_82D
ROM:084B call MAINTR ; Подпрограмма главного цикла
ROM:084E lhld CURBASLN ; Текущий адрес строки Бейсик программы
ROM:0851 ret
ROM:0852 ; ---------------------------------------------------------------------------
ROM:0852
ROM:0852 INPUT: ; Бейсик-оператор INPUT
ROM:0852 cpi 22h ; '"'
ROM:0854 nop
ROM:0855 nop
ROM:0856 nop
ROM:0857 nop
ROM:0858 nop
ROM:0859 jnz loc_866
ROM:085C call loc_D50
ROM:085F rst 1 ; RST1 = проверка синтаксиса.
ROM:085F ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:085F ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:085F ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:085F ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:085F ; ---------------------------------------------------------------------------
ROM:0860 .db ';'
ROM:0861 ; ---------------------------------------------------------------------------
ROM:0861 push h
ROM:0862 call loc_D96
ROM:0865 pop h
ROM:0866
ROM:0866 loc_866: ; CODE XREF: ROM:0859j
ROM:0866 push h
ROM:0867 call MAINLOOP2 ; Вход в главный цикл из INPUT и DEF
ROM:086A call INPUTSTR ; Выводит вопросительный знак и ждёт ввода строки
ROM:086D inx h
ROM:086E mov a, m
ROM:086F ora a
ROM:0870 dcx h
ROM:0871 pop b
ROM:0872 jz loc_5F5
ROM:0875 push b
ROM:0876 jmp loc_87E
ROM:0879 ; ---------------------------------------------------------------------------
ROM:0879
ROM:0879 READ: ; Обработка команды READ
ROM:0879 push h
ROM:087A lhld READPTR ; Указатель для READ
ROM:087A ; ---------------------------------------------------------------------------
ROM:087D .db 0F6h ; Ў ; ORI AF
ROM:087E ; ---------------------------------------------------------------------------
ROM:087E
ROM:087E loc_87E: ; CODE XREF: ROM:0876j
ROM:087E xra a
ROM:087F sta IFINPUT ; =0 если INPUT
ROM:0882 xthl
ROM:0883
ROM:0883 loc_883: ; CODE XREF: ROM:08D4j
ROM:0883 lxi b, loc_2CCE+1 ; LOC_0884: RST 1
ROM:0883 ; DB 2CH; ','
ROM:0883 ; CALL GETVAR
ROM:0886 call GETVAR ; Поиск и инициализация переменной.
ROM:0886 ; HL указывает на имя переменной, которая встретилась во время интерпретации.
ROM:0886 ; Функция возвращает в DE указатель на значение переменной.
ROM:0886 ; Если переменная не существует, то функция выделяет ей память и инициализирует её.
ROM:0889 xthl
ROM:088A push d
ROM:088B mov a, m
ROM:088C cpi 2Ch ; ','
ROM:088E jz GOTDATAITEM ; Получаем кусочек информации из DATA
ROM:0891 lda IFINPUT ; =0 если INPUT
ROM:0894 ora a
ROM:0895 jnz loc_8FB
ROM:0898 mvi a, 3Fh ; '?'
ROM:089A rst 3 ; RST3 = печатает символ из A на экран.
ROM:089B call INPUTSTR ; Выводит вопросительный знак и ждёт ввода строки
ROM:089E
ROM:089E GOTDATAITEM: ; CODE XREF: ROM:088Ej
ROM:089E ; ROM:091Aj
ROM:089E lda LETTMP ; Получаем кусочек информации из DATA
ROM:08A1 ora a
ROM:08A2 jz loc_8BE
ROM:08A5 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:08A5 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:08A5 ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:08A6 mov d, a
ROM:08A7 mov b, a
ROM:08A8 cpi 22h ; '"'
ROM:08AA jz loc_8B2
ROM:08AD mvi d, 3Ah ; ':'
ROM:08AF mvi b, 2Ch ; ','
ROM:08B1 dcx h
ROM:08B2
ROM:08B2 loc_8B2: ; CODE XREF: ROM:08AAj
ROM:08B2 call loc_D53
ROM:08B5 xchg
ROM:08B6 lxi h, loc_8C7
ROM:08B9 xthl
ROM:08BA push d
ROM:08BB jmp loc_72B
ROM:08BE ; ---------------------------------------------------------------------------
ROM:08BE
ROM:08BE loc_8BE: ; CODE XREF: ROM:08A2j
ROM:08BE rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:08BE ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:08BE ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:08BF call FIN ; Функция читающая число с плавающей точкой из ASCII-текста.
ROM:08BF ; Читает строку и конвертирует её в число с плавающей точкой в FACCUM.
ROM:08C2 xthl
ROM:08C3 call FCOPYTOMEM ; Копирование числа с плавающей точкой в память, на которую указывает HL
ROM:08C6 pop h
ROM:08C7
ROM:08C7 loc_8C7: ; DATA XREF: ROM:08B6o
ROM:08C7 dcx h
ROM:08C8 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:08C8 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:08C8 ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:08C9 jz loc_8D1
ROM:08CC cpi 2Ch ; ','
ROM:08CE jnz loc_840
ROM:08D1
ROM:08D1 loc_8D1: ; CODE XREF: ROM:08C9j
ROM:08D1 xthl
ROM:08D2 dcx h
ROM:08D3 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:08D3 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:08D3 ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:08D4 jnz loc_883+1 ; LOC_0884: RST 1
ROM:08D4 ; DB 2CH; ','
ROM:08D4 ; CALL GETVAR
ROM:08D7 pop d
ROM:08D8 lda IFINPUT ; =0 если INPUT
ROM:08DB ora a
ROM:08DC xchg
ROM:08DD jnz loc_5E0
ROM:08E0 ora m
ROM:08E1 lxi h, loc_8EA
ROM:08E4 push d
ROM:08E5 cnz MAINTR ; Подпрограмма главного цикла
ROM:08E8 pop h
ROM:08E9 ret
ROM:08EA ; ---------------------------------------------------------------------------
ROM:08EA
ROM:08EA loc_8EA: ; DATA XREF: ROM:08E1o
ROM:08EA cmc
ROM:08EB cpe KBDBUF+64h
ROM:08EE xri 0E9h
ROM:08F0 push h
ROM:08F1 rim
ROM:08F2 cpo 0EEE1h
ROM:08F5 sphl
ROM:08F6 push h
ROM:08F7 dcr c
ROM:08F8 ldax b
ROM:08F9 nop
ROM:08FA nop
ROM:08FB
ROM:08FB loc_8FB: ; CODE XREF: ROM:0895j
ROM:08FB ; ROM:0917j
ROM:08FB call DATA ; Обработка бейсик-команд DATA и REM. Обратите внимание на комментарий ниже.
ROM:08FB ; 06FB: REM: MVI C, 0
ROM:08FB ; MVI B, 0
ROM:08FB ; LOC_6FF: MOV A, C
ROM:08FB ; .....
ROM:08FB ;
ROM:08FB ; FINDNEXTSTATEMENT:
ROM:08FE ; ---------------------------------------------------------------------------
ROM:08FE ora a
ROM:08FF jnz loc_914
ROM:0902 inx h
ROM:0903 rst 6 ; Псевдокоманда PUSH (HL).
ROM:0903 ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP.
ROM:0903 ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD.
ROM:0904 mov a, c
ROM:0905 ora b
ROM:0906 mvi e, 6
ROM:0908 jz MAINLOOP1 ; Первая точка входа в главный цикл
ROM:090B pop b
ROM:090C mov e, m
ROM:090D inx h
ROM:090E mov d, m
ROM:090F xchg
ROM:0910 shld MEMTMP2 ; Используется при вычислении количества памяти в OUTOFMEMORY
ROM:0913 xchg
ROM:0914
ROM:0914 loc_914: ; CODE XREF: ROM:08FFj
ROM:0914 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:0914 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:0914 ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:0915 cpi 83h ; 'Г'
ROM:0917 jnz loc_8FB
ROM:091A jmp GOTDATAITEM ; Получаем кусочек информации из DATA
ROM:091D ; ---------------------------------------------------------------------------
ROM:091D
ROM:091D NEXT: ; Обработка команды NEXT
ROM:091D lxi d, 0
ROM:0920
ROM:0920 ; =============== S U B R O U T I N E =======================================
ROM:0920
ROM:0920 ; Обработка команды NEXT. Дополнительная точка входа.
ROM:0920
ROM:0920 NEXT2: ; CODE XREF: NEXT2+43p
ROM:0920
ROM:0920 ; FUNCTION CHUNK AT ROM:0585 SIZE 00000028 BYTES
ROM:0920
ROM:0920 cnz GETVAR ; Поиск и инициализация переменной.
ROM:0920 ; HL указывает на имя переменной, которая встретилась во время интерпретации.
ROM:0920 ; Функция возвращает в DE указатель на значение переменной.
ROM:0920 ; Если переменная не существует, то функция выделяет ей память и инициализирует её.
ROM:0923 shld CURBASLN ; Текущий адрес строки Бейсик программы
ROM:0926 call GETFLOWPTR ; Сервисная функция.
ROM:0926 ; Устанавливает HL в точку соответствующей структуры потока на стеке (Sets HL to point to the appropriate flow struct on the stack.).
ROM:0926 ; Если функция вызвана ключевым словом NEXT, то DE указывает на переменную, следующую за ключевым словом NEXT.
ROM:0926 ; Таким образом, устанавливает DE как главный указатель программы (i.e. Get program ptr into DE).
ROM:0926 ;
ROM:0929 jnz ERROR_ ; Ошибка
ROM:092C sphl
ROM:092D push d
ROM:092E mov a, m
ROM:092F inx h
ROM:0930 push psw
ROM:0931 push d
ROM:0932 call FLOADFROMMEM ; Загружает FACCUM числом с плавающей точкой из ячеек памяти, на которые указывает HL.
ROM:0932 ;
ROM:0935 xthl
ROM:0936 push h
ROM:0937 call loc_1073
ROM:093A pop h
ROM:093B call FCOPYTOMEM ; Копирование числа с плавающей точкой в память, на которую указывает HL
ROM:093E pop h
ROM:093F call FLOADBCDEFROMMEM ; Загружает число с плавающей точкой в BCDE из ячеек памяти, на которые указывает HL.
ROM:093F ; Т. е. загрузка из M в BCDE
ROM:0942 push h
ROM:0943 call FCOMPARE ; Сравнение чисел с плавающей точкой.
ROM:0943 ; Сравнивает FACCUM и BCDE. Результат возвращается в A.
ROM:0943 ; FACCUM > BCDE, A = 0x01.
ROM:0943 ; FACCUM < BCDE, A = 0xFF.
ROM:0943 ; FACCUM = BCDE, A = 0.
ROM:0946 pop h
ROM:0947 pop b
ROM:0948 sub b
ROM:0949 call FLOADBCDEFROMMEM ; Загружает число с плавающей точкой в BCDE из ячеек памяти, на которые указывает HL.
ROM:0949 ; Т. е. загрузка из M в BCDE
ROM:094C jz loc_958
ROM:094F xchg
ROM:0950 shld BASOPNUM ; Номер оператора Бейсик программы.
ROM:0950 ; Или &hFFFF в командном режиме
ROM:0953 mov l, c
ROM:0954 mov h, b
ROM:0955 jmp NEXTRET
ROM:0958 ; ---------------------------------------------------------------------------
ROM:0958
ROM:0958 loc_958: ; CODE XREF: NEXT2+2Cj
ROM:0958 sphl
ROM:0959 lhld CURBASLN ; Текущий адрес строки Бейсик программы
ROM:095C mov a, m
ROM:095D cpi 2Ch ; ','
ROM:095F jnz EXECNEXT ; Сюда вернётся бейсик интерпретатор после отработки команды RUN, RETURN, после обработки ошибок.
ROM:095F ; Вычисляет одно выражение, передвигается на следующее выражение или на новую стоку, если в текущей строке нет больше выражений.
ROM:095F ;
ROM:0962 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:0962 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:0962 ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:0963 call NEXT2 ; Обработка команды NEXT. Дополнительная точка входа.
ROM:0963 ; End of function NEXT2
ROM:0963
ROM:0966
ROM:0966 ; =============== S U B R O U T I N E =======================================
ROM:0966
ROM:0966 ; Вычисляет выражение, возвращая результат в FACCUM. Выражение должно быть комбинацией термов и операторов.
ROM:0966
ROM:0966 EVALEXPRESSION: ; CODE XREF: ROM:055Bp
ROM:0966 ; ROM:0573p ...
ROM:0966 call COMPUTE ; Вычисление выражений. Вызов из EVALEXPRESSION, IF, PRINT, EVALTERM.
ROM:0966 ; End of function EVALEXPRESSION
ROM:0966
ROM:0969
ROM:0969 ; =============== S U B R O U T I N E =======================================
ROM:0969
ROM:0969 ; Вычисление выражений. Вызов из EVALTERM.
ROM:0969
ROM:0969 COMPUTE3: ; CODE XREF: ROM:0556p
ROM:0969 ; COMPUTE2+12p ...
ROM:0969 ori 37h
ROM:0969 ; End of function COMPUTE3
ROM:0969
ROM:096B
ROM:096B ; =============== S U B R O U T I N E =======================================
ROM:096B
ROM:096B ; Вычисление выражений. Вызов из ASSIGNVAR.
ROM:096B
ROM:096B COMPUTE4: ; CODE XREF: LET+15p
ROM:096B ; ROM:0AB8p
ROM:096B lda LETTMP ; Временная переменная оператора LET, EVALTERM, COMPUTE, GETVAR
ROM:096E adc a
ROM:096F rpe
ROM:0970 mvi e, 18h
ROM:0972 jmp MAINLOOP1 ; Первая точка входа в главный цикл
ROM:0972 ; End of function COMPUTE4
ROM:0972
ROM:0975
ROM:0975 ; =============== S U B R O U T I N E =======================================
ROM:0975
ROM:0975 ; Вычисление выражений. Вызов из EVALEXPRESSION, IF, PRINT, EVALTERM.
ROM:0975
ROM:0975 COMPUTE: ; CODE XREF: LET+Ap ROM:IFp ...
ROM:0975 dcx h
ROM:0976 mvi d, 0
ROM:0976 ; End of function COMPUTE
ROM:0976
ROM:0978
ROM:0978 ; =============== S U B R O U T I N E =======================================
ROM:0978
ROM:0978 ; Вычисление выражений. Дополнительная точка входа.
ROM:0978
ROM:0978 COMPUTE2: ; CODE XREF: COMPUTE2+6Aj
ROM:0978 ; EVALTERM+3Bp ...
ROM:0978
ROM:0978 ; FUNCTION CHUNK AT ROM:0A9E SIZE 00000012 BYTES
ROM:0978 ; FUNCTION CHUNK AT ROM:0E77 SIZE 00000037 BYTES
ROM:0978
ROM:0978 push d
ROM:0979 call CHECKENOUGHVARSPACE ; Внимание! После вызова CHECKENOUGHVARSPACE идет байт параметра, а не следующая инструкция!
ROM:0979 ; Проверяет, достаточно ли будет памяти при выделении места для C*4 байт начиная с VAR_TOP перед тем как это выделение начнёт затирать стек.
ROM:0979 ; (Или область переменных).
ROM:0979 ; ---------------------------------------------------------------------------
ROM:097C .db 1
ROM:097D ; ---------------------------------------------------------------------------
ROM:097D call EVALTERM ; Обработка следующего символа из буфера.
ROM:097D ; Вычисляет терм в выражении.
ROM:097D ; Это может быть числовая константа, переменная, вызов функции, также имеющий выражения в своих аргументах или выражения в скобках.
ROM:0980 shld CURBASPTR ; Область сохранения текущего адреса Бейсик программы.
ROM:0983
ROM:0983 ARITHPARSE: ; CODE XREF: EVALTERM+128j
ROM:0983 ; DATA XREF: COMPUTE2+5Bo
ROM:0983 lhld CURBASPTR ; Вычисление арифметических выражений.
ROM:0986
ROM:0986 loc_986: ; DATA XREF: COMPUTE2+52Eo
ROM:0986 pop b
ROM:0987 mov a, b
ROM:0988 cpi 78h ; 'x'
ROM:098A cnc COMPUTE3 ; Вычисление выражений. Вызов из EVALTERM.
ROM:098D mov a, m
ROM:098E mvi d, 0
ROM:0990
ROM:0990 loc_990: ; CODE XREF: COMPUTE2+2Fj
ROM:0990 sui 0ABh ; 'л'
ROM:0992 jc loc_9AA
ROM:0995 cpi 3
ROM:0997 jnc loc_9AA
ROM:099A cpi 1
ROM:099C ral
ROM:099D xra d
ROM:099E cmp d
ROM:099F mov d, a
ROM:09A0 jc SYNTAXERROR ; Самая распространённая ошибка №2
ROM:09A3 shld COMPTMP ; Временная переменная, использующаяся при вычислениях.
ROM:09A6 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:09A6 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:09A6 ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:09A7 jmp loc_990
ROM:09AA ; ---------------------------------------------------------------------------
ROM:09AA
ROM:09AA loc_9AA: ; CODE XREF: COMPUTE2+1Aj
ROM:09AA ; COMPUTE2+1Fj
ROM:09AA mov a, d
ROM:09AB ora a
ROM:09AC jnz loc_A9E
ROM:09AF mov a, m
ROM:09B0 shld COMPTMP ; Временная переменная, использующаяся при вычислениях.
ROM:09B3 sui 0A4h ; 'д'
ROM:09B5 rc
ROM:09B6 cpi 7
ROM:09B8 rnc
ROM:09B9 mov e, a
ROM:09BA lda LETTMP ; Временная переменная оператора LET, EVALTERM, COMPUTE, GETVAR
ROM:09BD dcr a
ROM:09BE ora e
ROM:09BF mov a, e
ROM:09C0 jz loc_E77
ROM:09C3 rlc
ROM:09C4 add e
ROM:09C5 mov e, a
ROM:09C6 lxi h, KW_ARITH_OP_FNS ; FADD = 144C
ROM:09C9 dad d
ROM:09CA mov a, b
ROM:09CB mov d, m
ROM:09CC cmp d
ROM:09CD rnc
ROM:09CE inx h
ROM:09CF call COMPUTE3 ; Вычисление выражений. Вызов из EVALTERM.
ROM:09D2
ROM:09D2 loc_9D2: ; CODE XREF: COMPUTE2+135j
ROM:09D2 push b
ROM:09D3 lxi b, ARITHPARSE ; Вычисление арифметических выражений.
ROM:09D6 push b
ROM:09D7 mov b, e
ROM:09D8 mov c, d
ROM:09D9 call FPUSH ; Записывает число с плавающей точкой на стек.
ROM:09DC mov e, b
ROM:09DD mov d, c
ROM:09DE rst 6 ; Псевдокоманда PUSH (HL).
ROM:09DE ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP.
ROM:09DE ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD.
ROM:09DF lhld COMPTMP ; Временная переменная, использующаяся при вычислениях.
ROM:09E2 jmp COMPUTE2 ; Вычисление выражений. Дополнительная точка входа.
ROM:09E2 ; End of function COMPUTE2
ROM:09E2
ROM:09E5
ROM:09E5 ; =============== S U B R O U T I N E =======================================
ROM:09E5
ROM:09E5 ; Обработка следующего символа из буфера.
ROM:09E5 ; Вычисляет терм в выражении.
ROM:09E5 ; Это может быть числовая константа, переменная, вызов функции, также имеющий выражения в своих аргументах или выражения в скобках.
ROM:09E5
ROM:09E5 EVALTERM: ; CODE XREF: COMPUTE2+5p
ROM:09E5 ; EVALTERM+10j ...
ROM:09E5
ROM:09E5 ; FUNCTION CHUNK AT ROM:0A1E SIZE 00000058 BYTES
ROM:09E5 ; FUNCTION CHUNK AT ROM:0AF9 SIZE 00000017 BYTES
ROM:09E5 ; FUNCTION CHUNK AT ROM:0CCD SIZE 00000035 BYTES
ROM:09E5 ; FUNCTION CHUNK AT ROM:178D SIZE 00000010 BYTES
ROM:09E5
ROM:09E5 xra a
ROM:09E6 sta LETTMP ; Временная переменная оператора LET, EVALTERM, COMPUTE, GETVAR
ROM:09E9 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:09E9 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:09E9 ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:09EA jc FIN ; Функция читающая число с плавающей точкой из ASCII-текста.
ROM:09EA ; Читает строку и конвертирует её в число с плавающей точкой в FACCUM.
ROM:09ED call CHARISALPHA ; Если символ, на который указывает HL алфавитный, то флаг переноса сбрасывается. А если нет - то установится.
ROM:09ED ; Т. е. является ли (M) буквой?
ROM:09F0 jnc EVALVARTERM ; Вычисление переменной. Вызов GETVAR возвращает адрес значения переменной в DE, который затем перемещается в HL.
ROM:09F0 ; Далее вызов FLOADFROMMEM записывает в FACCUM значение этой переменной.
ROM:09F3 cpi 0A4h ; 'д' ; __PLUS
ROM:09F5 jz EVALTERM ; Обработка следующего символа из буфера.
ROM:09F5 ; Вычисляет терм в выражении.
ROM:09F5 ; Это может быть числовая константа, переменная, вызов функции, также имеющий выражения в своих аргументах или выражения в скобках.
ROM:09F8 cpi 2Eh ; '.'
ROM:09FA jz FIN ; Функция читающая число с плавающей точкой из ASCII-текста.
ROM:09FA ; Читает строку и конвертирует её в число с плавающей точкой в FACCUM.
ROM:09FD cpi 0A5h ; 'е' ; __MINUS
ROM:09FF jz EVALMINUSTERM
ROM:0A02 cpi 22h ; '"'
ROM:0A04 jz loc_D50
ROM:0A07 cpi 0A2h ; 'в' ; __NOT
ROM:0A09 jz loc_AF9
ROM:0A0C
ROM:0A0C loc_A0C: ; __FN
ROM:0A0C cpi 0A0h ; 'а'
ROM:0A0E jz loc_CCD
ROM:0A11 sui 0AEh ; 'о' ; inline fn
ROM:0A13 jnc EVALINLINEFN ; Вычисляет функцию. Получаем смещение в KW_INLINE_FNS таблице в BC и сохраняем это на стек.
ROM:0A13 ; End of function EVALTERM ;
ROM:0A13
ROM:0A16
ROM:0A16 ; =============== S U B R O U T I N E =======================================
ROM:0A16
ROM:0A16 ; Вычисление значения в скобках
ROM:0A16
ROM:0A16 BRACKETS: ; CODE XREF: EVALTERM:loc_A65p
ROM:0A16 ; EVALTERM+2ECp
ROM:0A16 rst 1 ; RST1 = проверка синтаксиса.
ROM:0A16 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:0A16 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:0A16 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:0A16 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:0A16 ; ---------------------------------------------------------------------------
ROM:0A17 .db '('
ROM:0A18 ; ---------------------------------------------------------------------------
ROM:0A18
ROM:0A18 loc_A18: ; CODE XREF: ROM:1C7Dp
ROM:0A18 call COMPUTE ; Вычисление выражений. Вызов из EVALEXPRESSION, IF, PRINT, EVALTERM.
ROM:0A1B rst 1 ; RST1 = проверка синтаксиса.
ROM:0A1B ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:0A1B ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:0A1B ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:0A1B ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:0A1B ; ---------------------------------------------------------------------------
ROM:0A1C .db ')'
ROM:0A1D ; ---------------------------------------------------------------------------
ROM:0A1D ret
ROM:0A1D ; End of function BRACKETS
ROM:0A1D
ROM:0A1E ; ---------------------------------------------------------------------------
ROM:0A1E ; START OF FUNCTION CHUNK FOR EVALTERM
ROM:0A1E
ROM:0A1E EVALMINUSTERM: ; CODE XREF: EVALTERM+1Aj
ROM:0A1E mvi d, 7Dh ; '}'
ROM:0A20 call COMPUTE2 ; Вычисление выражений. Дополнительная точка входа.
ROM:0A23 lhld CURBASPTR ; Область сохранения текущего адреса Бейсик программы.
ROM:0A26 push h
ROM:0A27 call FNEGATE ; Меняет знак FACCUM. FACCUM=-FACCUM
ROM:0A2A
ROM:0A2A FNRETURN: ; DATA XREF: EVALTERM+84o
ROM:0A2A call COMPUTE3 ; Сюда вернёмся после выполнения функций (токены более 174 (&hAE))
ROM:0A2D pop h
ROM:0A2E ret
ROM:0A2F ; ---------------------------------------------------------------------------
ROM:0A2F
ROM:0A2F EVALVARTERM: ; CODE XREF: EVALTERM+Bj
ROM:0A2F call GETVAR ; Вычисление переменной. Вызов GETVAR возвращает адрес значения переменной в DE, который затем перемещается в HL.
ROM:0A2F ; Далее вызов FLOADFROMMEM записывает в FACCUM значение этой переменной.
ROM:0A32 push h
ROM:0A33 xchg
ROM:0A34 shld FACCUM ; Аккумулятор для вычислений с плавающей точкой:
ROM:0A34 ; 00000000 1 11111111111111111111111
ROM:0A34 ; -------- - -----------------------
ROM:0A34 ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:0A37 lda LETTMP ; Временная переменная оператора LET, EVALTERM, COMPUTE, GETVAR
ROM:0A3A ora a
ROM:0A3B cz FLOADFROMMEM ; Загружает FACCUM числом с плавающей точкой из ячеек памяти, на которые указывает HL.
ROM:0A3B ;
ROM:0A3E pop h
ROM:0A3F ret
ROM:0A40 ; ---------------------------------------------------------------------------
ROM:0A40
ROM:0A40 EVALINLINEFN: ; CODE XREF: EVALTERM+2Ej
ROM:0A40 mvi b, 0 ; Вычисляет функцию. Получаем смещение в KW_INLINE_FNS таблице в BC и сохраняем это на стек.
ROM:0A40 ;
ROM:0A42 rlc
ROM:0A43 mov c, a
ROM:0A44 push b
ROM:0A45 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:0A45 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:0A45 ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:0A46 mov a, c
ROM:0A47 cpi 39h ; '9'
ROM:0A49 jmp loc_178D
ROM:0A4C ; ---------------------------------------------------------------------------
ROM:0A4C
ROM:0A4C loc_A4C: ; CODE XREF: EVALTERM+DADj
ROM:0A4C rst 1 ; RST1 = проверка синтаксиса.
ROM:0A4C ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:0A4C ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:0A4C ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:0A4C ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:0A4C ; ---------------------------------------------------------------------------
ROM:0A4D .db '('
ROM:0A4E ; ---------------------------------------------------------------------------
ROM:0A4E call COMPUTE ; Вычисление выражений. Вызов из EVALEXPRESSION, IF, PRINT, EVALTERM.
ROM:0A51 rst 1 ; RST1 = проверка синтаксиса.
ROM:0A51 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:0A51 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:0A51 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:0A51 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:0A51 ; ---------------------------------------------------------------------------
ROM:0A52 .db ','
ROM:0A53 ; ---------------------------------------------------------------------------
ROM:0A53 call COMPUTE3+1 ; Вычисление выражений. Вызов из EVALTERM.
ROM:0A56 xchg
ROM:0A57 lhld FACCUM ; Аккумулятор для вычислений с плавающей точкой:
ROM:0A57 ; 00000000 1 11111111111111111111111
ROM:0A57 ; -------- - -----------------------
ROM:0A57 ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:0A5A xthl
ROM:0A5B push h
ROM:0A5C xchg
ROM:0A5D call GETINTPARAM ; Получаем в A целочисленный параметр для команды Бейсика
ROM:0A60 xchg
ROM:0A61 xthl
ROM:0A62 jmp loc_A6D ; Адрес таблицы функций _SGN
ROM:0A65 ; ---------------------------------------------------------------------------
ROM:0A65
ROM:0A65 loc_A65: ; CODE XREF: EVALTERM:loc_178Dj
ROM:0A65 call BRACKETS ; Вычисление значения в скобках
ROM:0A68
ROM:0A68 loc_A68: ; CODE XREF: EVALTERM+DB2j
ROM:0A68 xthl
ROM:0A69 lxi d, FNRETURN ; Сюда вернёмся после выполнения функций (токены более 174 (&hAE))
ROM:0A6C push d
ROM:0A6D
ROM:0A6D loc_A6D: ; CODE XREF: EVALTERM+7Dj
ROM:0A6D lxi b, _SGN ; Адрес таблицы функций _SGN
ROM:0A70 dad b
ROM:0A71 mov c, m
ROM:0A72 inx h
ROM:0A73 mov h, m
ROM:0A74 mov l, c
ROM:0A75 pchl
ROM:0A75 ; END OF FUNCTION CHUNK FOR EVALTERM
ROM:0A76 ; ---------------------------------------------------------------------------
ROM:0A76 ori 0AFh
ROM:0A78 push psw
ROM:0A79 call COMPUTE3 ; Вычисление выражений. Вызов из EVALTERM.
ROM:0A7C call INTFROMFLOAT ; Получение целого числа из числа с плавающей точкой
ROM:0A7F pop psw
ROM:0A80 xchg
ROM:0A81 pop b
ROM:0A82 xthl
ROM:0A83 xchg
ROM:0A84 call FLOADFROMBCDE ; Загружает число в FACCUM из BCDE.
ROM:0A87 push psw
ROM:0A88 call INTFROMFLOAT ; Получение целого числа из числа с плавающей точкой
ROM:0A8B pop psw
ROM:0A8C pop b
ROM:0A8D mov a, c
ROM:0A8E lxi h, LONGINT ; Получение длинного целого
ROM:0A91 jnz loc_A99
ROM:0A94 ana e
ROM:0A95 mov c, a
ROM:0A96 mov a, b
ROM:0A97 ana d
ROM:0A98 pchl
ROM:0A99 ; ---------------------------------------------------------------------------
ROM:0A99
ROM:0A99 loc_A99: ; CODE XREF: ROM:0A91j
ROM:0A99 ora e
ROM:0A9A mov c, a
ROM:0A9B mov a, b
ROM:0A9C ora d
ROM:0A9D pchl
ROM:0A9E ; ---------------------------------------------------------------------------
ROM:0A9E ; START OF FUNCTION CHUNK FOR COMPUTE2
ROM:0A9E
ROM:0A9E loc_A9E: ; CODE XREF: COMPUTE2+34j
ROM:0A9E lxi h, loc_AB0
ROM:0AA1 lda LETTMP ; Временная переменная оператора LET, EVALTERM, COMPUTE, GETVAR
ROM:0AA4 rar
ROM:0AA5 mov a, d
ROM:0AA6 ral
ROM:0AA7 mov e, a
ROM:0AA8 mvi d, 64h ; 'd'
ROM:0AAA mov a, b
ROM:0AAB cmp d
ROM:0AAC rnc
ROM:0AAD jmp loc_9D2
ROM:0AAD ; END OF FUNCTION CHUNK FOR COMPUTE2
ROM:0AB0 ; ---------------------------------------------------------------------------
ROM:0AB0
ROM:0AB0 loc_AB0: ; DATA XREF: COMPUTE2:loc_A9Eo
ROM:0AB0 ora d
ROM:0AB1 ldax b
ROM:0AB2 mov a, c
ROM:0AB3 ora a
ROM:0AB4 rar
ROM:0AB5 pop b
ROM:0AB6 pop d
ROM:0AB7 push psw
ROM:0AB8 call COMPUTE4 ; Вычисление выражений. Вызов из ASSIGNVAR.
ROM:0ABB lxi h, loc_AEF
ROM:0ABE push h
ROM:0ABF jz FCOMPARE ; Сравнение чисел с плавающей точкой.
ROM:0ABF ; Сравнивает FACCUM и BCDE. Результат возвращается в A.
ROM:0ABF ; FACCUM > BCDE, A = 0x01.
ROM:0ABF ; FACCUM < BCDE, A = 0xFF.
ROM:0ABF ; FACCUM = BCDE, A = 0.
ROM:0AC2 xra a
ROM:0AC3 sta LETTMP ; Временная переменная оператора LET, EVALTERM, COMPUTE, GETVAR
ROM:0AC6 push d
ROM:0AC7 call FAPREP ; Подготовка FACCUM, ARIFMAR
ROM:0ACA pop d
ROM:0ACB rst 6 ; Псевдокоманда PUSH (HL).
ROM:0ACB ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP.
ROM:0ACB ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD.
ROM:0ACC rst 6 ; Псевдокоманда PUSH (HL).
ROM:0ACC ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP.
ROM:0ACC ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD.
ROM:0ACD call FAPREP3 ; Подготовка FACCUM, ARIFMAR.
ROM:0ACD ; Дополнительная точка входа.
ROM:0AD0 call FLOADBCDEFROMMEM ; Загружает число с плавающей точкой в BCDE из ячеек памяти, на которые указывает HL.
ROM:0AD0 ; Т. е. загрузка из M в BCDE
ROM:0AD3 pop h
ROM:0AD4 xthl
ROM:0AD5 mov d, l
ROM:0AD6 pop h
ROM:0AD7
ROM:0AD7 loc_AD7: ; CODE XREF: ROM:0AE8j
ROM:0AD7 mov a, e
ROM:0AD8 ora d
ROM:0AD9 rz
ROM:0ADA mov a, d
ROM:0ADB ora a
ROM:0ADC cma
ROM:0ADD rz
ROM:0ADE xra a
ROM:0ADF cmp e
ROM:0AE0 inr a
ROM:0AE1 rnc
ROM:0AE2 dcr d
ROM:0AE3 dcr e
ROM:0AE4 ldax b
ROM:0AE5 cmp m
ROM:0AE6 inx h
ROM:0AE7 inx b
ROM:0AE8 jz loc_AD7
ROM:0AEB cmc
ROM:0AEC jmp loc_12D0
ROM:0AEF ; ---------------------------------------------------------------------------
ROM:0AEF
ROM:0AEF loc_AEF: ; DATA XREF: ROM:0ABBo
ROM:0AEF inr a
ROM:0AF0 adc a
ROM:0AF1 pop b
ROM:0AF2 ana b
ROM:0AF3 adi 0FFh
ROM:0AF5 sbb a
ROM:0AF6 jmp FCHARTOFLOAT ; Конвертирует знаковое число (байт) в A в число с плавающей точкой в FACCUM.
ROM:0AF9 ; ---------------------------------------------------------------------------
ROM:0AF9 ; START OF FUNCTION CHUNK FOR EVALTERM
ROM:0AF9
ROM:0AF9 loc_AF9: ; CODE XREF: EVALTERM+24j
ROM:0AF9 mvi d, 5Ah ; 'Z'
ROM:0AFB call COMPUTE2 ; Вычисление выражений. Дополнительная точка входа.
ROM:0AFE call COMPUTE3 ; Вычисление выражений. Вызов из EVALTERM.
ROM:0B01 call INTFROMFLOAT ; Получение целого числа из числа с плавающей точкой
ROM:0B04 mov a, e
ROM:0B05 cma
ROM:0B06 mov c, a
ROM:0B07 mov a, d
ROM:0B08 cma
ROM:0B09 call LONGINT ; Получение длинного целого
ROM:0B0C pop b
ROM:0B0D jmp ARITHPARSE ; Вычисление арифметических выражений.
ROM:0B0D ; END OF FUNCTION CHUNK FOR EVALTERM
ROM:0B10 ; ---------------------------------------------------------------------------
ROM:0B10
ROM:0B10 loc_B10: ; DATA XREF: ROM:DIMo
ROM:0B10 dcx h
ROM:0B11 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:0B11 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:0B11 ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:0B12 rz
ROM:0B13 rst 1 ; RST1 = проверка синтаксиса.
ROM:0B13 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:0B13 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:0B13 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:0B13 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:0B13 ; ---------------------------------------------------------------------------
ROM:0B14 .db ','
ROM:0B15 ; ---------------------------------------------------------------------------
ROM:0B15
ROM:0B15 DIM: ; Обработка бейсик-оператора DIM
ROM:0B15 lxi b, loc_B10
ROM:0B18 push b
ROM:0B18 ; ---------------------------------------------------------------------------
ROM:0B19 .db 0F6h ; Ў ; Засада!
ROM:0B19 ; ORI AF
ROM:0B19 ; STA DIM_OR_EVAL
ROM:0B1A ; ---------------------------------------------------------------------------
ROM:0B1A
ROM:0B1A GETVAR: ; CODE XREF: LETp ROM:0886p ...
ROM:0B1A xra a ; Поиск и инициализация переменной.
ROM:0B1A ; HL указывает на имя переменной, которая встретилась во время интерпретации.
ROM:0B1A ; Функция возвращает в DE указатель на значение переменной.
ROM:0B1A ; Если переменная не существует, то функция выделяет ей память и инициализирует её.
ROM:0B1B sta DIM_OR_EVAL ; Флаг используемый GETARRAYVAR для определения: определяем ли мы массив с помощью DIM, или осуществляем доступ к элементу существующего массива,
ROM:0B1B ; что могло бы быть сделано при помощи EVALTERM.
ROM:0B1E mov b, m
ROM:0B1F
ROM:0B1F ; =============== S U B R O U T I N E =======================================
ROM:0B1F
ROM:0B1F ; Поиск и инициализация переменной.
ROM:0B1F ; Дополнительная точка входа.
ROM:0B1F
ROM:0B1F GETVAR2: ; CODE XREF: DEFFNA+9p
ROM:0B1F
ROM:0B1F ; FUNCTION CHUNK AT ROM:0BF3 SIZE 00000087 BYTES
ROM:0B1F
ROM:0B1F call CHARISALPHA ; Если символ, на который указывает HL алфавитный, то флаг переноса сбрасывается. А если нет - то установится.
ROM:0B1F ; Т. е. является ли (M) буквой?
ROM:0B22 jc SYNTAXERROR ; Самая распространённая ошибка №2
ROM:0B25 xra a
ROM:0B26 mov c, a
ROM:0B27 sta LETTMP ; Временная переменная оператора LET, EVALTERM, COMPUTE, GETVAR
ROM:0B2A rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:0B2A ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:0B2A ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:0B2B jc loc_B34
ROM:0B2E call CHARISALPHA ; Если символ, на который указывает HL алфавитный, то флаг переноса сбрасывается. А если нет - то установится.
ROM:0B2E ; Т. е. является ли (M) буквой?
ROM:0B31 jc loc_B3F
ROM:0B34
ROM:0B34 loc_B34: ; CODE XREF: GETVAR2+Cj
ROM:0B34 mov c, a
ROM:0B35
ROM:0B35 loc_B35: ; CODE XREF: GETVAR2+17j
ROM:0B35 ; GETVAR2+1Dj
ROM:0B35 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:0B35 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:0B35 ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:0B36 jc loc_B35
ROM:0B39 call CHARISALPHA ; Если символ, на который указывает HL алфавитный, то флаг переноса сбрасывается. А если нет - то установится.
ROM:0B39 ; Т. е. является ли (M) буквой?
ROM:0B3C jnc loc_B35
ROM:0B3F
ROM:0B3F loc_B3F: ; CODE XREF: GETVAR2+12j
ROM:0B3F sui 24h ; '$'
ROM:0B41 jnz loc_B4C
ROM:0B44 inr a
ROM:0B45 sta LETTMP ; Временная переменная оператора LET, EVALTERM, COMPUTE, GETVAR
ROM:0B48 rrc
ROM:0B49 add c
ROM:0B4A mov c, a
ROM:0B4B rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:0B4B ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:0B4B ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:0B4C
ROM:0B4C loc_B4C: ; CODE XREF: GETVAR2+22j
ROM:0B4C lda FORTMP ; Временный параметр оператора FOR
ROM:0B4F add m
ROM:0B50 cpi 28h ; '('
ROM:0B52 jz GETARRAYVAR ; Даёт доступ или размещает в памяти переменную-массив. DIM_OR_EVAL показывает, имеем ли мы дело с описанием массива (оператор DIM), или осуществляется доступ к элементу массива.
ROM:0B52 ; В первом случае DIM_OR_EVAL равен &hEF иначе он равен нулю.
ROM:0B55 xra a
ROM:0B56 sta FORTMP ; Временный параметр оператора FOR
ROM:0B59 push h
ROM:0B5A lhld BGARRAY ; Адрес начала массивов.
ROM:0B5A ; Указывает на начало участка памяти, хранящего массивы.
ROM:0B5A ; Следует сразу за участком памяти, выделенным для обычных переменных.
ROM:0B5D xchg
ROM:0B5E lhld ENBASPRG ; Адрес конца Бейсик программы.
ROM:0B5E ; Указывает на первую ячейку участка памяти, доступного программам.
ROM:0B5E ; Всегда следует за последним байтом программы.
ROM:0B61
ROM:0B61 loc_B61: ; CODE XREF: GETVAR2+56j
ROM:0B61 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения.
ROM:0B62 jz ALLOCNEWVAR ; Готовимся разместить новую переменную. Проверяем адрес возврата, для того чтобы узнать, что нас вызывает.
ROM:0B62 ; Если это вычислитель выражений, то мы выходим без выделения памяти для переменной.
ROM:0B62 ; Notice that (assuming we haven't been called by the evaluator) the prog ptr on the stack is kept in place.
ROM:0B62 ;
ROM:0B65 mov a, c
ROM:0B66 sub m
ROM:0B67 inx h
ROM:0B68 jnz loc_B6D
ROM:0B6B mov a, b
ROM:0B6C sub m
ROM:0B6D
ROM:0B6D loc_B6D: ; CODE XREF: GETVAR2+49j
ROM:0B6D inx h
ROM:0B6E jz loc_B9B
ROM:0B71 inx h
ROM:0B72 inx h
ROM:0B73 inx h
ROM:0B74 inx h
ROM:0B75 jmp loc_B61
ROM:0B78 ; ---------------------------------------------------------------------------
ROM:0B78
ROM:0B78 ALLOCNEWVAR: ; CODE XREF: GETVAR2+43j
ROM:0B78 push b ; Готовимся разместить новую переменную. Проверяем адрес возврата, для того чтобы узнать, что нас вызывает.
ROM:0B78 ; Если это вычислитель выражений, то мы выходим без выделения памяти для переменной.
ROM:0B78 ; Notice that (assuming we haven't been called by the evaluator) the prog ptr on the stack is kept in place.
ROM:0B78 ;
ROM:0B79 lxi b, 6
ROM:0B7C lhld VAR_TOP ; Адрес начала свободной памяти.
ROM:0B7C ; Указывает на верхушку области хранящей массивы и переменные.
ROM:0B7F push h
ROM:0B80 dad b
ROM:0B81 pop b
ROM:0B82 push h
ROM:0B83 call COPYMEMORYUP ; Копирует байты памяти из BC в HL. Копирование идёт задом-наперёд до тех, пор, пока BC не станет равным DE.
ROM:0B83 ; Идёт оно задом-наперёд потому, что функция может использоваться для блоков отстоящих друг от друга на пару байт.
ROM:0B83 ; В таком случае, если бы копирование шло напрямую, то блок памяти затёр бы сам себя.
ROM:0B86 pop h
ROM:0B87 shld VAR_TOP ; Адрес начала свободной памяти.
ROM:0B87 ; Указывает на верхушку области хранящей массивы и переменные.
ROM:0B8A mov h, b
ROM:0B8B mov l, c
ROM:0B8C shld BGARRAY ; Адрес начала массивов.
ROM:0B8C ; Указывает на начало участка памяти, хранящего массивы.
ROM:0B8C ; Следует сразу за участком памяти, выделенным для обычных переменных.
ROM:0B8F
ROM:0B8F INITVARLOOP: ; CODE XREF: GETVAR2+74j
ROM:0B8F dcx h ; Инициализирует новую переменную до нуля.
ROM:0B90 mvi m, 0
ROM:0B92 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения.
ROM:0B93 jnz INITVARLOOP ; Инициализирует новую переменную до нуля.
ROM:0B96 pop d
ROM:0B97 mov m, e
ROM:0B98 inx h
ROM:0B99 mov m, d
ROM:0B9A inx h
ROM:0B9B
ROM:0B9B loc_B9B: ; CODE XREF: GETVAR2+4Fj
ROM:0B9B xchg
ROM:0B9C pop h
ROM:0B9D ret
ROM:0B9E ; ---------------------------------------------------------------------------
ROM:0B9E
ROM:0B9E GETARRAYVAR: ; CODE XREF: GETVAR2+33j
ROM:0B9E push h ; Даёт доступ или размещает в памяти переменную-массив. DIM_OR_EVAL показывает, имеем ли мы дело с описанием массива (оператор DIM), или осуществляется доступ к элементу массива.
ROM:0B9E ; В первом случае DIM_OR_EVAL равен &hEF иначе он равен нулю.
ROM:0B9F lhld DIM_OR_EVAL ; Флаг используемый GETARRAYVAR для определения: определяем ли мы массив с помощью DIM, или осуществляем доступ к элементу существующего массива,
ROM:0B9F ; что могло бы быть сделано при помощи EVALTERM.
ROM:0BA2 xthl
ROM:0BA3 mvi d, 0
ROM:0BA5
ROM:0BA5 loc_BA5: ; CODE XREF: GETVAR2+96j
ROM:0BA5 push d
ROM:0BA6 push b
ROM:0BA7 call GETSUBSCRIPT ; Получает индекс массива встречающегося в выражении или операторе DIM.
ROM:0BA7 ; Индекс возвращается в виде целого положительного числа в CDE.
ROM:0BAA pop b
ROM:0BAB pop psw
ROM:0BAC xchg
ROM:0BAD xthl
ROM:0BAE push h
ROM:0BAF xchg
ROM:0BB0 inr a
ROM:0BB1 mov d, a
ROM:0BB2 mov a, m
ROM:0BB3 cpi 2Ch ; ','
ROM:0BB5 jz loc_BA5
ROM:0BB8 rst 1 ; RST1 = проверка синтаксиса.
ROM:0BB8 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:0BB8 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:0BB8 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:0BB8 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:0BB8 ; ---------------------------------------------------------------------------
ROM:0BB9 .db ')'
ROM:0BBA ; ---------------------------------------------------------------------------
ROM:0BBA shld CURBASPTR ; Область сохранения текущего адреса Бейсик программы.
ROM:0BBD pop h
ROM:0BBE shld DIM_OR_EVAL ; Флаг используемый GETARRAYVAR для определения: определяем ли мы массив с помощью DIM, или осуществляем доступ к элементу существующего массива,
ROM:0BBE ; что могло бы быть сделано при помощи EVALTERM.
ROM:0BC1 push d
ROM:0BC2 lhld BGARRAY ; Адрес начала массивов.
ROM:0BC2 ; Указывает на начало участка памяти, хранящего массивы.
ROM:0BC2 ; Следует сразу за участком памяти, выделенным для обычных переменных.
ROM:0BC5
ROM:0BC5 loc_BC5: ; CODE XREF: GETVAR2+BEj
ROM:0BC5 mvi a, 19h ; LOC_BC5+1: DAD D
ROM:0BC5 ; XCHG
ROM:0BC7 xchg
ROM:0BC8 lhld VAR_TOP ; Адрес начала свободной памяти.
ROM:0BC8 ; Указывает на верхушку области хранящей массивы и переменные.
ROM:0BCB xchg
ROM:0BCC rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения.
ROM:0BCD jz loc_BF3
ROM:0BD0 mov a, m
ROM:0BD1 cmp c
ROM:0BD2 inx h
ROM:0BD3 jnz loc_BD8
ROM:0BD6 mov a, m
ROM:0BD7 cmp b
ROM:0BD8
ROM:0BD8 loc_BD8: ; CODE XREF: GETVAR2+B4j
ROM:0BD8 inx h
ROM:0BD9 mov e, m
ROM:0BDA inx h
ROM:0BDB mov d, m
ROM:0BDC inx h
ROM:0BDD jnz loc_BC5+1 ; LOC_BC5+1: DAD D
ROM:0BDD ; XCHG
ROM:0BE0 lda DIM_OR_EVAL ; Флаг используемый GETARRAYVAR для определения: определяем ли мы массив с помощью DIM, или осуществляем доступ к элементу существующего массива,
ROM:0BE0 ; что могло бы быть сделано при помощи EVALTERM.
ROM:0BE3 ora a
ROM:0BE4 mvi e, 12h
ROM:0BE6 jnz MAINLOOP1 ; Первая точка входа в главный цикл
ROM:0BE9 pop psw
ROM:0BEA cmp m
ROM:0BEB jz loc_C52
ROM:0BEB ; End of function GETVAR2
ROM:0BEB
ROM:0BEE ; START OF FUNCTION CHUNK FOR MACRO5
ROM:0BEE
ROM:0BEE loc_BEE: ; CODE XREF: GETVAR2+10Cj
ROM:0BEE ; GETVAR2+140j ...
ROM:0BEE mvi e, 10h
ROM:0BF0 jmp MAINLOOP1 ; Первая точка входа в главный цикл
ROM:0BF0 ; END OF FUNCTION CHUNK FOR MACRO5
ROM:0BF3 ; ---------------------------------------------------------------------------
ROM:0BF3 ; START OF FUNCTION CHUNK FOR GETVAR2
ROM:0BF3
ROM:0BF3 loc_BF3: ; CODE XREF: GETVAR2+AEj
ROM:0BF3 lxi d, 4
ROM:0BF6 mov m, c
ROM:0BF7 inx h
ROM:0BF8 mov m, b
ROM:0BF9 inx h
ROM:0BFA pop psw
ROM:0BFB sta VARSRCH_ ; pchl
ROM:0BFE call loc_F87E
ROM:0C01 nop
ROM:0C02 shld COMPTMP ; Временная переменная, использующаяся при вычислениях.
ROM:0C05 inx h
ROM:0C06 inx h
ROM:0C07 mov b, c
ROM:0C08 mov m, b
ROM:0C09 inx h
ROM:0C0A
ROM:0C0A loc_C0A: ; CODE XREF: GETVAR2+105j
ROM:0C0A lda DIM_OR_EVAL ; Флаг используемый GETARRAYVAR для определения: определяем ли мы массив с помощью DIM, или осуществляем доступ к элементу существующего массива,
ROM:0C0A ; что могло бы быть сделано при помощи EVALTERM.
ROM:0C0D ora a
ROM:0C0E mov a, b
ROM:0C0F lxi b, 0Bh
ROM:0C12 jz loc_C17
ROM:0C15 pop b
ROM:0C16 inx b
ROM:0C17
ROM:0C17 loc_C17: ; CODE XREF: GETVAR2+F3j
ROM:0C17 mov m, c
ROM:0C18 inx h
ROM:0C19 mov m, b
ROM:0C1A inx h
ROM:0C1B push psw
ROM:0C1C push h
ROM:0C1D call MACRO5 ; Вызывается из GETVAR
ROM:0C20 xchg
ROM:0C21 pop h
ROM:0C22 pop b
ROM:0C23 dcr b
ROM:0C24 jnz loc_C0A
ROM:0C27 mov b, d
ROM:0C28 mov c, e
ROM:0C29 xchg
ROM:0C2A dad d
ROM:0C2B jc loc_BEE
ROM:0C2E call CHECKENOUGHMEM ; Проверяет, действительно ли HL больше, чем на 32 байта отстоит от указателя стека.
ROM:0C2E ; Если HL расположен ближе чем на 32 байта к стеку, то функция падает в OutOfMemory.
ROM:0C31 shld VAR_TOP ; Адрес начала свободной памяти.
ROM:0C31 ; Указывает на верхушку области хранящей массивы и переменные.
ROM:0C34
ROM:0C34 loc_C34: ; CODE XREF: GETVAR2+119j
ROM:0C34 dcx h
ROM:0C35 mvi m, 0
ROM:0C37 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения.
ROM:0C38 jnz loc_C34
ROM:0C3B inx b
ROM:0C3C mov h, a
ROM:0C3D lda DIM_OR_EVAL ; Флаг используемый GETARRAYVAR для определения: определяем ли мы массив с помощью DIM, или осуществляем доступ к элементу существующего массива,
ROM:0C3D ; что могло бы быть сделано при помощи EVALTERM.
ROM:0C40 ora a
ROM:0C41 lda VARSRCH_ ; pchl
ROM:0C44 mov l, a
ROM:0C45 dad h
ROM:0C46 dad b
ROM:0C47 xchg
ROM:0C48 lhld COMPTMP ; Временная переменная, использующаяся при вычислениях.
ROM:0C4B mov m, e
ROM:0C4C inx h
ROM:0C4D mov m, d
ROM:0C4E inx h
ROM:0C4F jnz loc_C74
ROM:0C52
ROM:0C52 loc_C52: ; CODE XREF: GETVAR2+CCj
ROM:0C52 inx h
ROM:0C53 lxi b, 0
ROM:0C56
ROM:0C56 loc_C56: ; CODE XREF: GETVAR2+14Dj
ROM:0C56 mvi d, 0E1h ; 'с'
ROM:0C58 mov e, m
ROM:0C59 inx h
ROM:0C5A mov d, m
ROM:0C5B inx h
ROM:0C5C xthl
ROM:0C5D push psw
ROM:0C5E rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения.
ROM:0C5F jnc loc_BEE
ROM:0C62 push h
ROM:0C63 call MACRO5 ; Вызывается из GETVAR
ROM:0C66 pop d
ROM:0C67 dad d
ROM:0C68 pop psw
ROM:0C69 dcr a
ROM:0C6A mov b, h
ROM:0C6B mov c, l
ROM:0C6C jnz loc_C56+1
ROM:0C6F dad h
ROM:0C70 dad h
ROM:0C71 pop b
ROM:0C72 dad b
ROM:0C73 xchg
ROM:0C74
ROM:0C74 loc_C74: ; CODE XREF: GETVAR2+130j
ROM:0C74 lhld CURBASPTR ; Область сохранения текущего адреса Бейсик программы.
ROM:0C77 dcx h
ROM:0C78 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:0C78 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:0C78 ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:0C79 ret
ROM:0C79 ; END OF FUNCTION CHUNK FOR GETVAR2
ROM:0C7A ; ---------------------------------------------------------------------------
ROM:0C7A
ROM:0C7A FRE: ; Обработка бейсик-функции FRE
ROM:0C7A lhld VAR_TOP
ROM:0C7D xchg
ROM:0C7E lxi h, 0
ROM:0C81 dad sp
ROM:0C82 lda LETTMP ; Временная переменная оператора LET, EVALTERM, COMPUTE, GETVAR
ROM:0C85 ora a
ROM:0C86 jz loc_C96
ROM:0C89 call FAPREP ; Подготовка FACCUM, ARIFMAR
ROM:0C8C call loc_DD2
ROM:0C8F lhld STKADDR ; Адрес стека
ROM:0C92 xchg
ROM:0C93 lhld RUNWITHTMP ; Временная переменная оператора RUN с параметром
ROM:0C96
ROM:0C96 loc_C96: ; CODE XREF: ROM:0C86j
ROM:0C96 mov a, l
ROM:0C97 sub e
ROM:0C98 mov c, a
ROM:0C99 mov a, h
ROM:0C9A sbb d
ROM:0C9B
ROM:0C9B ; =============== S U B R O U T I N E =======================================
ROM:0C9B
ROM:0C9B ; Получение длинного целого
ROM:0C9B
ROM:0C9B LONGINT: ; CODE XREF: EVALTERM+124p
ROM:0C9B ; DATA XREF: ROM:0A8Eo
ROM:0C9B mov b, c
ROM:0C9C
ROM:0C9C INLONGINT: ; CODE XREF: ROM:0CADj
ROM:0C9C ; ROM:1D1Ej ...
ROM:0C9C mov d, b ; Ввод длинного целого.
ROM:0C9D mvi e, 0
ROM:0C9F lxi h, LETTMP ; Временная переменная оператора LET, EVALTERM, COMPUTE, GETVAR
ROM:0CA2 mov m, e
ROM:0CA3 mvi b, 90h ; 'Р'
ROM:0CA5 jmp LONGINT2 ; Получение длинного целого. Дополнительная точка входа.
ROM:0CA5 ; End of function LONGINT
ROM:0CA5
ROM:0CA8 ; ---------------------------------------------------------------------------
ROM:0CA8
ROM:0CA8 POS: ; Обработка бейсик функции POS
ROM:0CA8 lda PK
ROM:0CAB
ROM:0CAB SHORTINT: ; CODE XREF: ROM:0F01j
ROM:0CAB ; ROM:0F7Dj ...
ROM:0CAB mov b, a ; Получение короткого целого из A
ROM:0CAC xra a
ROM:0CAD jmp INLONGINT ; Ввод длинного целого.
ROM:0CB0 ; ---------------------------------------------------------------------------
ROM:0CB0
ROM:0CB0 DEF: ; Определение функции
ROM:0CB0 call DEFFNA
ROM:0CB3 lxi b, DATA ; Обработка бейсик-команд DATA и REM. Обратите внимание на комментарий ниже.
ROM:0CB3 ; 06FB: REM: MVI C, 0
ROM:0CB3 ; MVI B, 0
ROM:0CB3 ; LOC_6FF: MOV A, C
ROM:0CB3 ; .....
ROM:0CB3 ;
ROM:0CB3 ; FINDNEXTSTATEMENT:
ROM:0CB6 push b
ROM:0CB7 push d
ROM:0CB8 call MAINLOOP2 ; Вход в главный цикл из INPUT и DEF
ROM:0CBB rst 1 ; RST1 = проверка синтаксиса.
ROM:0CBB ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:0CBB ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:0CBB ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:0CBB ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:0CBB ; ---------------------------------------------------------------------------
ROM:0CBC .db '('
ROM:0CBD ; ---------------------------------------------------------------------------
ROM:0CBD call GETVAR ; Поиск и инициализация переменной.
ROM:0CBD ; HL указывает на имя переменной, которая встретилась во время интерпретации.
ROM:0CBD ; Функция возвращает в DE указатель на значение переменной.
ROM:0CBD ; Если переменная не существует, то функция выделяет ей память и инициализирует её.
ROM:0CC0 call COMPUTE3 ; Вычисление выражений. Вызов из EVALTERM.
ROM:0CC3 rst 1 ; RST1 = проверка синтаксиса.
ROM:0CC3 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:0CC3 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:0CC3 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:0CC3 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:0CC3 ; ---------------------------------------------------------------------------
ROM:0CC4 .db ')'
ROM:0CC5 ; ---------------------------------------------------------------------------
ROM:0CC5 rst 1 ; RST1 = проверка синтаксиса.
ROM:0CC5 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:0CC5 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:0CC5 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:0CC5 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:0CC5 ; ---------------------------------------------------------------------------
ROM:0CC6 .db 0ACh ; = (токен 172 (&hAC))
ROM:0CC7 ; ---------------------------------------------------------------------------
ROM:0CC7 mov b, h
ROM:0CC8 mov c, l
ROM:0CC9 xthl
ROM:0CCA jmp loc_CF9
ROM:0CCD ; ---------------------------------------------------------------------------
ROM:0CCD ; START OF FUNCTION CHUNK FOR EVALTERM
ROM:0CCD
ROM:0CCD loc_CCD: ; CODE XREF: EVALTERM+29j
ROM:0CCD call DEFFNA ; Обработка DEF FN
ROM:0CD0 push d
ROM:0CD1 call BRACKETS ; Вычисление значения в скобках
ROM:0CD4 call COMPUTE3 ; Вычисление выражений. Вызов из EVALTERM.
ROM:0CD7 xthl
ROM:0CD8 rst 6 ; Псевдокоманда PUSH (HL).
ROM:0CD8 ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP.
ROM:0CD8 ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD.
ROM:0CD9 pop d
ROM:0CDA rst 6 ; Псевдокоманда PUSH (HL).
ROM:0CDA ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP.
ROM:0CDA ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD.
ROM:0CDB pop h
ROM:0CDC rst 6 ; Псевдокоманда PUSH (HL).
ROM:0CDC ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP.
ROM:0CDC ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD.
ROM:0CDD rst 6 ; Псевдокоманда PUSH (HL).
ROM:0CDD ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP.
ROM:0CDD ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD.
ROM:0CDE dcx h
ROM:0CDF dcx h
ROM:0CE0 dcx h
ROM:0CE1 dcx h
ROM:0CE2 push h
ROM:0CE3 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения.
ROM:0CE4 push d
ROM:0CE5 mvi e, 22h ; '"'
ROM:0CE7 jz MAINLOOP1 ; Первая точка входа в главный цикл
ROM:0CEA call FCOPYTOMEM ; Копирование числа с плавающей точкой в память, на которую указывает HL
ROM:0CED pop h
ROM:0CEE call EVALEXPRESSION ; Вычисляет выражение, возвращая результат в FACCUM. Выражение должно быть комбинацией термов и операторов.
ROM:0CF1 dcx h
ROM:0CF2 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:0CF2 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:0CF2 ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:0CF3 jnz SYNTAXERROR ; Самая распространённая ошибка №2
ROM:0CF6 pop h
ROM:0CF7 pop d
ROM:0CF8 pop b
ROM:0CF9
ROM:0CF9 loc_CF9: ; CODE XREF: ROM:0CCAj
ROM:0CF9 mov m, c
ROM:0CFA inx h
ROM:0CFB mov m, b
ROM:0CFC
ROM:0CFC loc_CFC: ; CODE XREF: MAINTR3+6j
ROM:0CFC inx h
ROM:0CFD mov m, e
ROM:0CFE inx h
ROM:0CFF mov m, d
ROM:0D00 pop h
ROM:0D01 ret
ROM:0D01 ; END OF FUNCTION CHUNK FOR EVALTERM
ROM:0D02
ROM:0D02 ; =============== S U B R O U T I N E =======================================
ROM:0D02
ROM:0D02 ; Вход в главный цикл из INPUT и DEF
ROM:0D02
ROM:0D02 MAINLOOP2: ; CODE XREF: ROM:0867p
ROM:0D02 ; ROM:0CB8p
ROM:0D02 push h
ROM:0D03 lhld BASOPNUM ; Номер оператора Бейсик программы.
ROM:0D03 ; Или &hFFFF в командном режиме
ROM:0D06 inx h
ROM:0D07 mov a, h
ROM:0D08 ora l
ROM:0D09 pop h
ROM:0D0A rnz
ROM:0D0B mvi e, 16h
ROM:0D0D jmp MAINLOOP1 ; Первая точка входа в главный цикл
ROM:0D0D ; End of function MAINLOOP2
ROM:0D0D
ROM:0D10
ROM:0D10 ; =============== S U B R O U T I N E =======================================
ROM:0D10
ROM:0D10 ; Обработка DEF FN
ROM:0D10
ROM:0D10 DEFFNA: ; CODE XREF: ROM:DEFp
ROM:0D10 ; EVALTERM:loc_CCDp
ROM:0D10 rst 1 ; RST1 = проверка синтаксиса.
ROM:0D10 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:0D10 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:0D10 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:0D10 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:0D10 ; ---------------------------------------------------------------------------
ROM:0D11 .db 0A0h ; FN (токен 160 (&hA0))
ROM:0D12 ; ---------------------------------------------------------------------------
ROM:0D12 mvi a, 80h ; 'А'
ROM:0D14 sta FORTMP ; Временный параметр оператора FOR
ROM:0D17 ora m
ROM:0D18 mov b, a
ROM:0D19 call GETVAR2 ; Поиск и инициализация переменной.
ROM:0D19 ; Дополнительная точка входа.
ROM:0D1C jmp COMPUTE3 ; Вычисление выражений. Вызов из EVALTERM.
ROM:0D1C ; End of function DEFFNA
ROM:0D1C
ROM:0D1F ; ---------------------------------------------------------------------------
ROM:0D1F
ROM:0D1F STR: ; Бейсик-функция STR
ROM:0D1F call COMPUTE3
ROM:0D22 call FOUT ; Печатает число с плавающей точкой на терминал.
ROM:0D25 call MAINTR2 ; Обработка главного цикла. Вызов из PRINT и STR.
ROM:0D28 call FAPREP ; Подготовка FACCUM, ARIFMAR
ROM:0D2B lxi b, loc_F10
ROM:0D2E push b
ROM:0D2F
ROM:0D2F ; =============== S U B R O U T I N E =======================================
ROM:0D2F
ROM:0D2F ; Обработка главного цикла. Вызов из ASSIGNVAR.
ROM:0D2F
ROM:0D2F MAINTR4: ; CODE XREF: LET+32p
ROM:0D2F ; MAINTR2+23p
ROM:0D2F mov a, m
ROM:0D30 inx h
ROM:0D31 inx h
ROM:0D32 push h
ROM:0D33 call MAINTR5 ; Подпрограмма главного цикла.
ROM:0D36 pop h
ROM:0D37 rst 6 ; Псевдокоманда PUSH (HL).
ROM:0D37 ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP.
ROM:0D37 ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD.
ROM:0D38 pop b
ROM:0D39 call MAINTR3 ; Сохранение A в MAINTR2TMP
ROM:0D3C push h
ROM:0D3D mov l, a
ROM:0D3E call MAINTR6 ; Проверка L, загрузка в A из (BC), выгрузка в (DE) в цикле
ROM:0D41 pop d
ROM:0D42 ret
ROM:0D42 ; End of function MAINTR4
ROM:0D42
ROM:0D43
ROM:0D43 ; =============== S U B R O U T I N E =======================================
ROM:0D43
ROM:0D43 ; Вызов MAINTR5 и переход в MAINTR3
ROM:0D43
ROM:0D43 MAINTR7: ; CODE XREF: COMPUTE2+518p
ROM:0D43 ; ROM:0F06p ...
ROM:0D43 call MAINTR5 ; Подпрограмма главного цикла.
ROM:0D43 ; End of function MAINTR7
ROM:0D43
ROM:0D46
ROM:0D46 ; =============== S U B R O U T I N E =======================================
ROM:0D46
ROM:0D46 ; Сохранение A в MAINTR2TMP
ROM:0D46
ROM:0D46 MAINTR3: ; CODE XREF: MAINTR4+Ap
ROM:0D46 ; MAINTR2+1Fp ...
ROM:0D46 lxi h, MAINTR2TMP ; Временный массив MAINTR
ROM:0D49 push h
ROM:0D4A mov m, a
ROM:0D4B inx h
ROM:0D4C jmp loc_CFC
ROM:0D4C ; End of function MAINTR3
ROM:0D4C
ROM:0D4F
ROM:0D4F ; =============== S U B R O U T I N E =======================================
ROM:0D4F
ROM:0D4F ; Обработка главного цикла. Вызов из PRINT и STR.
ROM:0D4F
ROM:0D4F MAINTR2: ; CODE XREF: ROM:07BAp
ROM:0D4F ; ROM:0D25p ...
ROM:0D4F dcx h
ROM:0D50
ROM:0D50 loc_D50: ; CODE XREF: ROM:085Cp
ROM:0D50 ; EVALTERM+1Fj
ROM:0D50 mvi b, 22h ; '"'
ROM:0D52 mov d, b
ROM:0D53
ROM:0D53 loc_D53: ; CODE XREF: ROM:loc_8B2p
ROM:0D53 push h
ROM:0D54 mvi c, 0FFh
ROM:0D56
ROM:0D56 loc_D56: ; CODE XREF: MAINTR2+13j
ROM:0D56 inx h
ROM:0D57 mov a, m
ROM:0D58 inr c
ROM:0D59 ora a
ROM:0D5A jz loc_D65
ROM:0D5D cmp d
ROM:0D5E jz loc_D65
ROM:0D61 cmp b
ROM:0D62 jnz loc_D56
ROM:0D65
ROM:0D65 loc_D65: ; CODE XREF: MAINTR2+Bj
ROM:0D65 ; MAINTR2+Fj
ROM:0D65 cpi 22h ; '"'
ROM:0D67 cz DDCMP ; Сравнивает следующий символ (HL) с двоеточием
ROM:0D6A xthl
ROM:0D6B inx h
ROM:0D6C xchg
ROM:0D6D mov a, c
ROM:0D6E call MAINTR3 ; Сохранение A в MAINTR2TMP
ROM:0D71 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения.
ROM:0D72 cc MAINTR4 ; Обработка главного цикла. Вызов из ASSIGNVAR.
ROM:0D75
ROM:0D75 loc_D75: ; CODE XREF: COMPUTE2+533j
ROM:0D75 ; ROM:0F11j ...
ROM:0D75 lxi d, MAINTR2TMP ; Временный массив MAINTR
ROM:0D78 lhld ARIFMAR ; Адрес рабочей области арифметических преобразований
ROM:0D7B shld FACCUM ; Аккумулятор для вычислений с плавающей точкой:
ROM:0D7B ; 00000000 1 11111111111111111111111
ROM:0D7B ; -------- - -----------------------
ROM:0D7B ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:0D7E mvi a, 1
ROM:0D80 sta LETTMP ; Временная переменная оператора LET, EVALTERM, COMPUTE, GETVAR
ROM:0D83 call FCOPYTOMEM2 ; Копирование числа с плавающей точкой в память. Дополнительная точка входа.
ROM:0D86 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения.
ROM:0D87 mvi e, 1Eh
ROM:0D89 jz MAINLOOP1 ; Первая точка входа в главный цикл
ROM:0D8C shld ARIFMAR ; Адрес рабочей области арифметических преобразований
ROM:0D8F pop h
ROM:0D90 mov a, m
ROM:0D91 ret
ROM:0D91 ; End of function MAINTR2
ROM:0D91
ROM:0D92 ; ---------------------------------------------------------------------------
ROM:0D92
ROM:0D92 loc_D92: ; DATA XREF: PRINTINT2+6o
ROM:0D92 inx h
ROM:0D93
ROM:0D93 ; =============== S U B R O U T I N E =======================================
ROM:0D93
ROM:0D93 ; Подпрограмма главного цикла
ROM:0D93
ROM:0D93 MAINTR: ; CODE XREF: CHECKENOUGHMEM:loc_2EEp
ROM:0D93 ; CHECKENOUGHMEM+49p ...
ROM:0D93 call MAINTR2 ; Обработка главного цикла. Вызов из PRINT и STR.
ROM:0D96
ROM:0D96 loc_D96: ; CODE XREF: ROM:07C9p
ROM:0D96 ; ROM:loc_7D0p ...
ROM:0D96 call FAPREP ; Подготовка FACCUM, ARIFMAR
ROM:0D99 call FLOADBCDEFROMMEM ; Загружает число с плавающей точкой в BCDE из ячеек памяти, на которые указывает HL.
ROM:0D99 ; Т. е. загрузка из M в BCDE
ROM:0D9C inr e
ROM:0D9D
ROM:0D9D loc_D9D: ; CODE XREF: MAINTR+14j
ROM:0D9D dcr e
ROM:0D9E rz
ROM:0D9F ldax b
ROM:0DA0 rst 3 ; RST3 = печатает символ из A на экран.
ROM:0DA1 cpi 0Dh
ROM:0DA3 cz PKCHK2 ; Сохранение A в FPTMP
ROM:0DA6 inx b
ROM:0DA7 jmp loc_D9D
ROM:0DA7 ; End of function MAINTR
ROM:0DA7
ROM:0DAA
ROM:0DAA ; =============== S U B R O U T I N E =======================================
ROM:0DAA
ROM:0DAA ; Подпрограмма главного цикла.
ROM:0DAA
ROM:0DAA MAINTR5: ; CODE XREF: MAINTR4+4p
ROM:0DAA ; MAINTR7p ...
ROM:0DAA
ROM:0DAA ; FUNCTION CHUNK AT ROM:0E52 SIZE 00000025 BYTES
ROM:0DAA
ROM:0DAA ora a
ROM:0DAB
ROM:0DAB loc_DAB: ; DATA XREF: MAINTR5+24o
ROM:0DAB mvi c, 0F1h ; 'ё'
ROM:0DAD push psw
ROM:0DAE lhld STKADDR ; Адрес стека
ROM:0DB1 xchg
ROM:0DB2 lhld RUNWITHTMP ; Временная переменная оператора RUN с параметром
ROM:0DB5 cma
ROM:0DB6 mov c, a
ROM:0DB7 mvi b, 0FFh
ROM:0DB9 dad b
ROM:0DBA inx h
ROM:0DBB rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения.
ROM:0DBC jc loc_DC6
ROM:0DBF shld RUNWITHTMP ; Временная переменная оператора RUN с параметром
ROM:0DC2 inx h
ROM:0DC3 xchg
ROM:0DC4 pop psw
ROM:0DC5 ret
ROM:0DC6 ; ---------------------------------------------------------------------------
ROM:0DC6
ROM:0DC6 loc_DC6: ; CODE XREF: MAINTR5+12j
ROM:0DC6 pop psw
ROM:0DC7 mvi e, 1Ah
ROM:0DC9 jz MAINLOOP1 ; Первая точка входа в главный цикл
ROM:0DCC cmp a
ROM:0DCD push psw
ROM:0DCE lxi b, loc_DAB+1
ROM:0DD1 push b
ROM:0DD2
ROM:0DD2 loc_DD2: ; CODE XREF: ROM:0C8Cp
ROM:0DD2 lhld ENDSTRAR ; Конец строковой области
ROM:0DD5
ROM:0DD5 loc_DD5: ; CODE XREF: MAINTR5+CAj
ROM:0DD5 shld RUNWITHTMP ; Временная переменная оператора RUN с параметром
ROM:0DD8 lxi h, 0
ROM:0DDB push h
ROM:0DDC lhld STKADDR ; Адрес стека
ROM:0DDF push h
ROM:0DE0 lxi h, ARIFMOB ; Рабочая область арифметических преобразований
ROM:0DE3
ROM:0DE3 loc_DE3: ; DATA XREF: MAINTR5+3Fo
ROM:0DE3 xchg
ROM:0DE4 lhld ARIFMAR ; Адрес рабочей области арифметических преобразований
ROM:0DE7 xchg
ROM:0DE8 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения.
ROM:0DE9 lxi b, loc_DE3
ROM:0DEC jnz loc_E2F
ROM:0DEF lhld ENBASPRG ; Адрес конца Бейсик программы.
ROM:0DEF ; Указывает на первую ячейку участка памяти, доступного программам.
ROM:0DEF ; Всегда следует за последним байтом программы.
ROM:0DF2
ROM:0DF2 loc_DF2: ; CODE XREF: MAINTR5+58j
ROM:0DF2 xchg
ROM:0DF3 lhld BGARRAY ; Адрес начала массивов.
ROM:0DF3 ; Указывает на начало участка памяти, хранящего массивы.
ROM:0DF3 ; Следует сразу за участком памяти, выделенным для обычных переменных.
ROM:0DF6 xchg
ROM:0DF7 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения.
ROM:0DF8 jz loc_E06
ROM:0DFB mov a, m
ROM:0DFC inx h
ROM:0DFD inx h
ROM:0DFE ora a
ROM:0DFF call MACRO2
ROM:0E02 jmp loc_DF2
ROM:0E05 ; ---------------------------------------------------------------------------
ROM:0E05
ROM:0E05 loc_E05: ; CODE XREF: MAINTR5+6Cj
ROM:0E05 pop b
ROM:0E06
ROM:0E06 loc_E06: ; CODE XREF: MAINTR5+4Ej
ROM:0E06 ; MAINTR5+7Fj
ROM:0E06 xchg
ROM:0E07 lhld VAR_TOP ; Адрес начала свободной памяти.
ROM:0E07 ; Указывает на верхушку области хранящей массивы и переменные.
ROM:0E0A xchg
ROM:0E0B rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения.
ROM:0E0C jz loc_E52
ROM:0E0F call FLOADBCDEFROMMEM ; Загружает число с плавающей точкой в BCDE из ячеек памяти, на которые указывает HL.
ROM:0E0F ; Т. е. загрузка из M в BCDE
ROM:0E12 mov a, e
ROM:0E13 push h
ROM:0E14 dad b
ROM:0E15 ora a
ROM:0E16 jp loc_E05
ROM:0E19 shld COMPTMP ; Временная переменная, использующаяся при вычислениях.
ROM:0E1C pop h
ROM:0E1D mov c, m
ROM:0E1E mvi b, 0
ROM:0E20 dad b
ROM:0E21 dad b
ROM:0E22 inx h
ROM:0E23
ROM:0E23 loc_E23: ; DATA XREF: MAINTR5+82o
ROM:0E23 xchg
ROM:0E24 lhld COMPTMP ; Временная переменная, использующаяся при вычислениях.
ROM:0E27 xchg
ROM:0E28 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения.
ROM:0E29 jz loc_E06
ROM:0E2C lxi b, loc_E23
ROM:0E2F
ROM:0E2F loc_E2F: ; CODE XREF: MAINTR5+42j
ROM:0E2F push b
ROM:0E30 ori 80h
ROM:0E30 ; End of function MAINTR5
ROM:0E30
ROM:0E32
ROM:0E32 ; =============== S U B R O U T I N E =======================================
ROM:0E32
ROM:0E32
ROM:0E32 MACRO2: ; CODE XREF: MAINTR5+55p
ROM:0E32 rst 6 ; Псевдокоманда PUSH (HL).
ROM:0E32 ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP.
ROM:0E32 ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD.
ROM:0E33 rst 6 ; Псевдокоманда PUSH (HL).
ROM:0E33 ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP.
ROM:0E33 ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD.
ROM:0E34 pop d
ROM:0E35 pop b
ROM:0E36 rp
ROM:0E37 mov a, c
ROM:0E38 ora a
ROM:0E39 rz
ROM:0E3A
ROM:0E3A loc_E3A: ; DATA XREF: DATAo
ROM:0E3A mov b, h
ROM:0E3B mov c, l
ROM:0E3C lhld RUNWITHTMP ; Временная переменная оператора RUN с параметром
ROM:0E3F rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения.
ROM:0E40 mov h, b
ROM:0E41 mov l, c
ROM:0E42 rc
ROM:0E43 pop h
ROM:0E44 xthl
ROM:0E45 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения.
ROM:0E46 xthl
ROM:0E47 push h
ROM:0E48 mov h, b
ROM:0E49 mov l, c
ROM:0E4A rnc
ROM:0E4B pop b
ROM:0E4C pop psw
ROM:0E4D pop psw
ROM:0E4E push h
ROM:0E4F push d
ROM:0E50 push b
ROM:0E51 ret
ROM:0E51 ; End of function MACRO2
ROM:0E51
ROM:0E52 ; ---------------------------------------------------------------------------
ROM:0E52 ; START OF FUNCTION CHUNK FOR MAINTR5
ROM:0E52
ROM:0E52 loc_E52: ; CODE XREF: MAINTR5+62j
ROM:0E52 pop d
ROM:0E53 pop h
ROM:0E54 mov a, l
ROM:0E55 ora h
ROM:0E56 rz
ROM:0E57 dcx h
ROM:0E58 mov b, m
ROM:0E59 dcx h
ROM:0E5A mov c, m
ROM:0E5B push h
ROM:0E5C dcx h
ROM:0E5D dcx h
ROM:0E5E mov l, m
ROM:0E5F mvi h, 0
ROM:0E61 dad b
ROM:0E62 mov d, b
ROM:0E63 mov e, c
ROM:0E64 dcx h
ROM:0E65 mov b, h
ROM:0E66 mov c, l
ROM:0E67 lhld RUNWITHTMP ; Временная переменная оператора RUN с параметром
ROM:0E6A call COPYMEMORYUP2
ROM:0E6D pop h
ROM:0E6E mov m, c
ROM:0E6F inx h
ROM:0E70 mov m, b
ROM:0E71 mov l, c
ROM:0E72 mov h, b
ROM:0E73 dcx h
ROM:0E74 jmp loc_DD5
ROM:0E74 ; END OF FUNCTION CHUNK FOR MAINTR5
ROM:0E77 ; ---------------------------------------------------------------------------
ROM:0E77 ; START OF FUNCTION CHUNK FOR COMPUTE2
ROM:0E77
ROM:0E77 loc_E77: ; CODE XREF: COMPUTE2+48j
ROM:0E77 push b
ROM:0E78 push h
ROM:0E79 lhld FACCUM ; Аккумулятор для вычислений с плавающей точкой:
ROM:0E79 ; 00000000 1 11111111111111111111111
ROM:0E79 ; -------- - -----------------------
ROM:0E79 ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:0E7C xthl
ROM:0E7D call EVALTERM ; Обработка следующего символа из буфера.
ROM:0E7D ; Вычисляет терм в выражении.
ROM:0E7D ; Это может быть числовая константа, переменная, вызов функции, также имеющий выражения в своих аргументах или выражения в скобках.
ROM:0E80 xthl
ROM:0E81 call COMPUTE3+1 ; Вычисление выражений. Вызов из EVALTERM.
ROM:0E84 mov a, m
ROM:0E85 push h
ROM:0E86 lhld FACCUM ; Аккумулятор для вычислений с плавающей точкой:
ROM:0E86 ; 00000000 1 11111111111111111111111
ROM:0E86 ; -------- - -----------------------
ROM:0E86 ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:0E89 push h
ROM:0E8A add m
ROM:0E8B mvi e, 1Ch
ROM:0E8D jc MAINLOOP1 ; Первая точка входа в главный цикл
ROM:0E90 call MAINTR7 ; Вызов MAINTR5 и переход в MAINTR3
ROM:0E93 pop d
ROM:0E94 call FAPREP3 ; Подготовка FACCUM, ARIFMAR.
ROM:0E94 ; Дополнительная точка входа.
ROM:0E97 xthl
ROM:0E98 call FAPREP2 ; Подготовка FACCUM, ARIFMAR.
ROM:0E98 ; Дополнительная точка входа.
ROM:0E9B push h
ROM:0E9C lhld CHARTBL ; Таблица символов функции CHR
ROM:0E9F xchg
ROM:0EA0 call MACRO3
ROM:0EA3 call MACRO3
ROM:0EA6 lxi h, loc_986
ROM:0EA9 xthl
ROM:0EAA push h
ROM:0EAB jmp loc_D75
ROM:0EAB ; END OF FUNCTION CHUNK FOR COMPUTE2
ROM:0EAE
ROM:0EAE ; =============== S U B R O U T I N E =======================================
ROM:0EAE
ROM:0EAE
ROM:0EAE MACRO3: ; CODE XREF: COMPUTE2+528p
ROM:0EAE ; COMPUTE2+52Bp
ROM:0EAE pop h
ROM:0EAF xthl
ROM:0EB0 rst 6 ; Псевдокоманда PUSH (HL).
ROM:0EB0 ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP.
ROM:0EB0 ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD.
ROM:0EB1 rst 6 ; Псевдокоманда PUSH (HL).
ROM:0EB1 ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP.
ROM:0EB1 ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD.
ROM:0EB2 pop b
ROM:0EB3 pop h
ROM:0EB3 ; End of function MACRO3
ROM:0EB3
ROM:0EB4
ROM:0EB4 ; =============== S U B R O U T I N E =======================================
ROM:0EB4
ROM:0EB4 ; Проверка L, загрузка в A из (BC), выгрузка в (DE) в цикле
ROM:0EB4
ROM:0EB4 MAINTR6: ; CODE XREF: MAINTR4+Fp
ROM:0EB4 ; ROM:0F3Ap ...
ROM:0EB4 inr l
ROM:0EB5
ROM:0EB5 loc_EB5: ; CODE XREF: MAINTR6+7j
ROM:0EB5 dcr l
ROM:0EB6 rz
ROM:0EB7 ldax b
ROM:0EB8 stax d
ROM:0EB9 inx b
ROM:0EBA inx d
ROM:0EBB jmp loc_EB5
ROM:0EBB ; End of function MAINTR6
ROM:0EBB
ROM:0EBE
ROM:0EBE ; =============== S U B R O U T I N E =======================================
ROM:0EBE
ROM:0EBE ; Подпрограмма вычисления выражений.
ROM:0EBE
ROM:0EBE COMPUTETR2: ; CODE XREF: COMPUTETR3p
ROM:0EBE ; COMPUTETR1+4p
ROM:0EBE call COMPUTE3+1 ; Вычисление выражений. Вызов из EVALTERM.
ROM:0EBE ; End of function COMPUTETR2
ROM:0EBE
ROM:0EC1
ROM:0EC1 ; =============== S U B R O U T I N E =======================================
ROM:0EC1
ROM:0EC1 ; Подготовка FACCUM, ARIFMAR
ROM:0EC1
ROM:0EC1 FAPREP: ; CODE XREF: ROM:0AC7p
ROM:0EC1 ; ROM:0C89p ...
ROM:0EC1 lhld FACCUM ; Аккумулятор для вычислений с плавающей точкой:
ROM:0EC1 ; End of function FAPREP ; 00000000 1 11111111111111111111111
ROM:0EC1 ; -------- - -----------------------
ROM:0EC1 ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:0EC4
ROM:0EC4 ; =============== S U B R O U T I N E =======================================
ROM:0EC4
ROM:0EC4 ; Подготовка FACCUM, ARIFMAR.
ROM:0EC4 ; Дополнительная точка входа.
ROM:0EC4
ROM:0EC4 FAPREP2: ; CODE XREF: COMPUTE2+520p
ROM:0EC4 xchg
ROM:0EC4 ; End of function FAPREP2
ROM:0EC4
ROM:0EC5
ROM:0EC5 ; =============== S U B R O U T I N E =======================================
ROM:0EC5
ROM:0EC5 ; Подготовка FACCUM, ARIFMAR.
ROM:0EC5 ; Дополнительная точка входа.
ROM:0EC5
ROM:0EC5 FAPREP3: ; CODE XREF: LET+39p
ROM:0EC5 ; ROM:0ACDp ...
ROM:0EC5 lhld ARIFMAR ; Адрес рабочей области арифметических преобразований
ROM:0EC8 dcx h
ROM:0EC9 mov b, m
ROM:0ECA dcx h
ROM:0ECB mov c, m
ROM:0ECC dcx h
ROM:0ECD dcx h
ROM:0ECE rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения.
ROM:0ECF xchg
ROM:0ED0 rnz
ROM:0ED1 shld ARIFMAR ; Адрес рабочей области арифметических преобразований
ROM:0ED4 push d
ROM:0ED5 mov d, b
ROM:0ED6 mov e, c
ROM:0ED7 dcx d
ROM:0ED8 mov c, m
ROM:0ED9 lhld RUNWITHTMP ; Временная переменная оператора RUN с параметром
ROM:0EDC rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения.
ROM:0EDD jnz loc_EE5
ROM:0EE0 mov b, a
ROM:0EE1 dad b
ROM:0EE2 shld RUNWITHTMP ; Временная переменная оператора RUN с параметром
ROM:0EE5
ROM:0EE5 loc_EE5: ; CODE XREF: FAPREP3+18j
ROM:0EE5 pop h
ROM:0EE6 ret
ROM:0EE6 ; End of function FAPREP3
ROM:0EE6
ROM:0EE7 ; ---------------------------------------------------------------------------
ROM:0EE7
ROM:0EE7 LEN: ; Бейсик-функция LEN
ROM:0EE7 lxi b, SHORTINT
ROM:0EEA push b
ROM:0EEB
ROM:0EEB ; =============== S U B R O U T I N E =======================================
ROM:0EEB
ROM:0EEB ; Подпрограмма вычисления выражений.
ROM:0EEB
ROM:0EEB COMPUTETR3: ; CODE XREF: ROM:ASCp
ROM:0EEB ; ROM:VALp
ROM:0EEB call COMPUTETR2 ; Подпрограмма вычисления выражений.
ROM:0EEE xra a
ROM:0EEF mov d, a
ROM:0EF0 sta LETTMP ; Временная переменная оператора LET, EVALTERM, COMPUTE, GETVAR
ROM:0EF3 mov a, m
ROM:0EF4 ora a
ROM:0EF5 ret
ROM:0EF5 ; End of function COMPUTETR3
ROM:0EF5
ROM:0EF6 ; ---------------------------------------------------------------------------
ROM:0EF6
ROM:0EF6 ASC: ; Бейсик-функция ASC
ROM:0EF6 call COMPUTETR3
ROM:0EF9 jz FUNCTIONCALLERROR ; Ошибка вызова функции
ROM:0EFC inx h
ROM:0EFD inx h
ROM:0EFE rst 6 ; Псевдокоманда PUSH (HL).
ROM:0EFE ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP.
ROM:0EFE ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD.
ROM:0EFF pop h
ROM:0F00 mov a, m
ROM:0F01 jmp SHORTINT ; Получение короткого целого из A
ROM:0F04 ; ---------------------------------------------------------------------------
ROM:0F04
ROM:0F04 CHR: ; Бейсик-функция CHR
ROM:0F04 mvi a, 1
ROM:0F06 call MAINTR7 ; Вызов MAINTR5 и переход в MAINTR3
ROM:0F09 call loc_FBC
ROM:0F0C lhld CHARTBL ; Таблица символов функции CHR
ROM:0F0F mov m, e
ROM:0F10
ROM:0F10 loc_F10: ; CODE XREF: ROM:1999j
ROM:0F10 ; DATA XREF: ROM:0D2Bo
ROM:0F10 pop b
ROM:0F11 jmp loc_D75
ROM:0F14 ; ---------------------------------------------------------------------------
ROM:0F14
ROM:0F14 LEFT: ; Бейсик-функция LEFT
ROM:0F14 call FUNKQUOTE
ROM:0F17 xra a
ROM:0F18
ROM:0F18 loc_F18: ; CODE XREF: ROM:0F4Bj
ROM:0F18 xthl
ROM:0F19 mov c, a
ROM:0F1A
ROM:0F1A loc_F1A: ; DATA XREF: ROM:0F64o
ROM:0F1A push h
ROM:0F1B mov a, m
ROM:0F1C cmp b
ROM:0F1D jc loc_F21+1 ; loc_F21+1:MVI C,0
ROM:0F20 mov a, b
ROM:0F21
ROM:0F21 loc_F21: ; CODE XREF: ROM:0F1Dj
ROM:0F21 lxi d, 0Eh
ROM:0F24 push b
ROM:0F25 call MAINTR5 ; Подпрограмма главного цикла.
ROM:0F28 pop b
ROM:0F29 pop h
ROM:0F2A push h
ROM:0F2B inx h
ROM:0F2C inx h
ROM:0F2D mov b, m
ROM:0F2E inx h
ROM:0F2F mov h, m
ROM:0F30 mov l, b
ROM:0F31 mvi b, 0
ROM:0F33 dad b
ROM:0F34 mov b, h
ROM:0F35 mov c, l
ROM:0F36 call MAINTR3 ; Сохранение A в MAINTR2TMP
ROM:0F39 mov l, a
ROM:0F3A call MAINTR6 ; Проверка L, загрузка в A из (BC), выгрузка в (DE) в цикле
ROM:0F3D pop d
ROM:0F3E call FAPREP3 ; Подготовка FACCUM, ARIFMAR.
ROM:0F3E ; Дополнительная точка входа.
ROM:0F41 jmp loc_D75
ROM:0F44 ; ---------------------------------------------------------------------------
ROM:0F44
ROM:0F44 RIGHT: ; Бейсик-функция RIGHT
ROM:0F44 call FUNKQUOTE
ROM:0F47 pop d
ROM:0F48 push d
ROM:0F49 ldax d
ROM:0F4A sub b
ROM:0F4B jmp loc_F18
ROM:0F4E ; ---------------------------------------------------------------------------
ROM:0F4E
ROM:0F4E MID: ; Бейсик-функция MID
ROM:0F4E xchg
ROM:0F4F mov a, m
ROM:0F50 call loc_FA2
ROM:0F53 push b
ROM:0F54 mvi e, 0FFh
ROM:0F56 cpi 29h ; ')'
ROM:0F58 jz loc_F60
ROM:0F5B rst 1 ; RST1 = проверка синтаксиса.
ROM:0F5B ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:0F5B ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:0F5B ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:0F5B ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:0F5B ; ---------------------------------------------------------------------------
ROM:0F5C .db ','
ROM:0F5D ; ---------------------------------------------------------------------------
ROM:0F5D call GETINTPARAM ; Получаем в A целочисленный параметр для команды Бейсика
ROM:0F60
ROM:0F60 loc_F60: ; CODE XREF: ROM:0F58j
ROM:0F60 rst 1 ; RST1 = проверка синтаксиса.
ROM:0F60 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:0F60 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:0F60 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:0F60 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:0F60 ; ---------------------------------------------------------------------------
ROM:0F61 .db ')'
ROM:0F62 ; ---------------------------------------------------------------------------
ROM:0F62 pop psw
ROM:0F63 xthl
ROM:0F64 lxi b, loc_F1A
ROM:0F67 push b
ROM:0F68 dcr a
ROM:0F69 cmp m
ROM:0F6A mvi b, 0
ROM:0F6C rnc
ROM:0F6D mov c, a
ROM:0F6E mov a, m
ROM:0F6F sub c
ROM:0F70 cmp e
ROM:0F71 mov b, a
ROM:0F72 rc
ROM:0F73 mov b, e
ROM:0F74 ret
ROM:0F75 ; ---------------------------------------------------------------------------
ROM:0F75
ROM:0F75 INP: ; Бейсик-функция INP
ROM:0F75 call loc_FBC
ROM:0F78 call loc_F84D
ROM:0F7B nop
ROM:0F7C nop
ROM:0F7D jmp SHORTINT ; Получение короткого целого из A
ROM:0F80 ; ---------------------------------------------------------------------------
ROM:0F80
ROM:0F80 OUT: ; Бейсик-оператор OUT
ROM:0F80 call loc_FAC
ROM:0F83 jmp loc_F853
ROM:0F86 ; ---------------------------------------------------------------------------
ROM:0F86 call loc_FAC
ROM:0F89 push psw
ROM:0F8A mvi e, 0
ROM:0F8C dcx h
ROM:0F8D rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:0F8D ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:0F8D ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:0F8E jz loc_F96
ROM:0F91 rst 1 ; RST1 = проверка синтаксиса.
ROM:0F91 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:0F91 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:0F91 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:0F91 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:0F91 ; ---------------------------------------------------------------------------
ROM:0F92 .db ','
ROM:0F93 ; ---------------------------------------------------------------------------
ROM:0F93 call GETINTPARAM ; Получаем в A целочисленный параметр для команды Бейсика
ROM:0F96
ROM:0F96 loc_F96: ; CODE XREF: ROM:0F8Ej
ROM:0F96 pop b
ROM:0F97
ROM:0F97 loc_F97: ; CODE XREF: ROM:0F9Bj
ROM:0F97 in 0
ROM:0F99 xra e
ROM:0F9A ana b
ROM:0F9B jz loc_F97
ROM:0F9E ret
ROM:0F9F
ROM:0F9F ; =============== S U B R O U T I N E =======================================
ROM:0F9F
ROM:0F9F ; Проверка окончания определения функции.
ROM:0F9F
ROM:0F9F FUNKQUOTE: ; CODE XREF: ROM:LEFTp
ROM:0F9F ; ROM:RIGHTp
ROM:0F9F xchg
ROM:0FA0 rst 1 ; RST1 = проверка синтаксиса.
ROM:0FA0 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:0FA0 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:0FA0 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:0FA0 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:0FA0 ; ---------------------------------------------------------------------------
ROM:0FA1 .db ')'
ROM:0FA2 ; ---------------------------------------------------------------------------
ROM:0FA2
ROM:0FA2 loc_FA2: ; CODE XREF: ROM:0F50p
ROM:0FA2 pop b
ROM:0FA3 pop d
ROM:0FA4 push b
ROM:0FA5 mov b, e
ROM:0FA6 inr b
ROM:0FA7 dcr b
ROM:0FA8 jz FUNCTIONCALLERROR ; Ошибка вызова функции
ROM:0FAB ret
ROM:0FAB ; End of function FUNKQUOTE
ROM:0FAB
ROM:0FAC ; ---------------------------------------------------------------------------
ROM:0FAC
ROM:0FAC loc_FAC: ; CODE XREF: ROM:OUTp
ROM:0FAC ; ROM:0F86p
ROM:0FAC call GETINTPARAM ; Получаем в A целочисленный параметр для команды Бейсика
ROM:0FAF sta loc_F850+1
ROM:0FB2 sta loc_F853+1
ROM:0FB5 rst 1 ; RST1 = проверка синтаксиса.
ROM:0FB5 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:0FB5 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:0FB5 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:0FB5 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:0FB5 ; ---------------------------------------------------------------------------
ROM:0FB6 .db ','
ROM:0FB7 .db 6
ROM:0FB8 ; ---------------------------------------------------------------------------
ROM:0FB8
ROM:0FB8 loc_FB8: ; CODE XREF: ROM:0809p
ROM:0FB8 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:0FB8 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:0FB8 ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:0FB9
ROM:0FB9 ; =============== S U B R O U T I N E =======================================
ROM:0FB9
ROM:0FB9 ; Получаем в A целочисленный параметр для команды Бейсика
ROM:0FB9
ROM:0FB9 GETINTPARAM: ; CODE XREF: ROM:062Bp
ROM:0FB9 ; ROM:loc_75Cp ...
ROM:0FB9 call EVALEXPRESSION ; Вычисляет выражение, возвращая результат в FACCUM. Выражение должно быть комбинацией термов и операторов.
ROM:0FBC
ROM:0FBC loc_FBC: ; CODE XREF: ROM:0F09p
ROM:0FBC ; ROM:INPp ...
ROM:0FBC call FUNCTIONAK ; Проверка результата функции.
ROM:0FBF mov a, d
ROM:0FC0 ora a
ROM:0FC1 jnz FUNCTIONCALLERROR ; Ошибка вызова функции
ROM:0FC4 dcx h
ROM:0FC5 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:0FC5 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:0FC5 ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:0FC6 mov a, e
ROM:0FC7 ret
ROM:0FC7 ; End of function GETINTPARAM
ROM:0FC7
ROM:0FC8 ; ---------------------------------------------------------------------------
ROM:0FC8
ROM:0FC8 VAL: ; Бейсик-функция VAL
ROM:0FC8 call COMPUTETR3
ROM:0FCB jz FZERO ; Устанавливает FACCUM в ноль.
ROM:0FCE mov e, a
ROM:0FCF inx h
ROM:0FD0 inx h
ROM:0FD1 rst 6 ; Псевдокоманда PUSH (HL).
ROM:0FD1 ; Сначала мы записываем адрес возврата в переменную NEXTWORD, которая образует вместе с JMPNXTWD инструкцию JMP.
ROM:0FD1 ; Затем мы читаем слово (HL) в BC и толкаем его на стек. А потом переходим по адресу JMPNXTWD.
ROM:0FD2 mov h, b
ROM:0FD3 mov l, c
ROM:0FD4 dad d
ROM:0FD5 mov b, m
ROM:0FD6 mov m, d
ROM:0FD7 xthl
ROM:0FD8 push b
ROM:0FD9 mov a, m
ROM:0FDA call BINHEX ; Обработчик двоичных и шестнадцатеричных чисел в VAL
ROM:0FDD pop b
ROM:0FDE pop h
ROM:0FDF mov m, b
ROM:0FE0 ret
ROM:0FE1
ROM:0FE1 ; =============== S U B R O U T I N E =======================================
ROM:0FE1
ROM:0FE1 ; Подпрограмма работы с лентой. Подготовка к загрузке.
ROM:0FE1
ROM:0FE1 TAPE: ; CODE XREF: ROM:1034p
ROM:0FE1 ; ROM:loc_1040p ...
ROM:0FE1 mov a, m
ROM:0FE2 xri 95h
ROM:0FE4 sta CASCMP ; Флаг сравнения
ROM:0FE7 jnz TAPE2 ; Локальная метка TAPE. Подготовка к выгрузке.
ROM:0FEA inx h
ROM:0FEB
ROM:0FEB TAPE2: ; CODE XREF: TAPE+6j
ROM:0FEB ; ROM:SAVEp ...
ROM:0FEB xchg ; Локальная метка TAPE. Подготовка к выгрузке.
ROM:0FEC lxi h, 2020h
ROM:0FEF shld STRNL ; Адрес строки выводимой на печать подпрограммой STRPRN
ROM:0FF2 shld TAPETMP ; Временная переменная процедуры TAPE
ROM:0FF5 shld TAPETMP2 ; Временная переменная процедуры TAPE
ROM:0FF8 xchg
ROM:0FF9 call COMPUTETR1 ; Подпрограмма вычисления выражений.
ROM:0FFC mvi a, 6
ROM:0FFE push h
ROM:0FFF mov l, e
ROM:1000 lxi d, STRNL ; Адрес строки выводимой на печать подпрограммой STRPRN
ROM:1003 call MACRO13
ROM:1006 pop h
ROM:1007 ret
ROM:1007 ; End of function TAPE
ROM:1007
ROM:1008
ROM:1008 ; =============== S U B R O U T I N E =======================================
ROM:1008
ROM:1008
ROM:1008 MACRO13: ; CODE XREF: TAPE+22p
ROM:1008 ; ROM:1B22p
ROM:1008 cmp l
ROM:1009 jc loc_100D
ROM:100C mov a, l
ROM:100D
ROM:100D loc_100D: ; CODE XREF: MACRO13+1j
ROM:100D push h
ROM:100E mov l, a
ROM:100F push psw
ROM:1010 call MAINTR6 ; Проверка L, загрузка в A из (BC), выгрузка в (DE) в цикле
ROM:1013 pop psw
ROM:1014 pop h
ROM:1015 ret
ROM:1015 ; End of function MACRO13
ROM:1015
ROM:1016
ROM:1016 ; =============== S U B R O U T I N E =======================================
ROM:1016
ROM:1016
ROM:1016 MACRO4: ; CODE XREF: ROM:18B0p
ROM:1016 ; ROM:19F1p ...
ROM:1016 mov a, h
ROM:1017 cma
ROM:1018 mov h, a
ROM:1019 mov a, l
ROM:101A cma
ROM:101B mov l, a
ROM:101C inx h
ROM:101D dad d
ROM:101E mov b, h
ROM:101F mov c, l
ROM:1020 ret
ROM:1020 ; End of function MACRO4
ROM:1020
ROM:1021 ; ---------------------------------------------------------------------------
ROM:1021 ; START OF FUNCTION CHUNK FOR CHECKENOUGHMEM
ROM:1021
ROM:1021 SYNTAXERROR2: ; CODE XREF: CHECKENOUGHMEM+2FFj
ROM:1021 cpi 56h ; 'V'
ROM:1023
ROM:1023 loc_1023: ; CODE XREF: ROM:1038j
ROM:1023 jc SYNTAXERROR ; Самая распространённая ошибка №2
ROM:1026 cpi 75h ; 'u'
ROM:1028 jnc SYNTAXERROR ; Самая распространённая ошибка №2
ROM:102B sui 11h
ROM:102D jmp loc_5BD
ROM:102D ; END OF FUNCTION CHUNK FOR CHECKENOUGHMEM
ROM:102D ; ---------------------------------------------------------------------------
ROM:1030 L_1030: .db 10h
ROM:1031 ; ---------------------------------------------------------------------------
ROM:1031
ROM:1031 L_1031: ; Инициализация переменных.
ROM:1031 lxi h, INITKEYS+48h ; Этот блок переностися в ОЗУ по адресу &hF8F0
ROM:1034 call TAPE ; Подпрограмма работы с лентой. Подготовка к загрузке.
ROM:1037 cmp m
ROM:1038 jnz loc_1023
ROM:103B lhld BGBASPRG ; Адрес начала Бейсик программы
ROM:103E
ROM:103E loc_103E: ; CODE XREF: ROM:104Aj
ROM:103E mvi b, 4
ROM:1040
ROM:1040 loc_1040: ; CODE XREF: ROM:104Ej
ROM:1040 call TAPE ; Подпрограмма работы с лентой. Подготовка к загрузке.
ROM:1043 mov m, a
ROM:1044 call CHECKENOUGHMEM ; Проверяет, действительно ли HL больше, чем на 32 байта отстоит от указателя стека.
ROM:1044 ; Если HL расположен ближе чем на 32 байта к стеку, то функция падает в OutOfMemory.
ROM:1047 mov a, m
ROM:1048 ora a
ROM:1049 inx h
ROM:104A jnz loc_103E
ROM:104D dcr b
ROM:104E jnz loc_1040
ROM:1051 shld ENBASPRG ; Адрес конца Бейсик программы.
ROM:1051 ; Указывает на первую ячейку участка памяти, доступного программам.
ROM:1051 ; Всегда следует за последним байтом программы.
ROM:1054 lxi h, aOk ; "\n\nOk\r\n"
ROM:1057 call MAINTR ; Подпрограмма главного цикла
ROM:105A jmp loc_368
ROM:105D ; ---------------------------------------------------------------------------
ROM:105D call FUNCTIONAK ; Проверка результата функции.
ROM:1060 ldax d
ROM:1061 jmp SHORTINT ; Получение короткого целого из A
ROM:1064 ; ---------------------------------------------------------------------------
ROM:1064 call loc_642
ROM:1067
ROM:1067 loc_1067: ; CODE XREF: ROM:1733j
ROM:1067 ; ROM:1A92j
ROM:1067 push d
ROM:1068 rst 1 ; RST1 = проверка синтаксиса.
ROM:1068 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:1068 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:1068 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:1068 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:1068 ; ---------------------------------------------------------------------------
ROM:1069 .db ',' ; Ожидаем появление запятой
ROM:106A ; ---------------------------------------------------------------------------
ROM:106A call GETINTPARAM ; Получаем в A целочисленный параметр для команды Бейсика
ROM:106D pop d
ROM:106E stax d ; А тут собственно и происходит POKE.
ROM:106E ; В DE - адрес, в A - байт
ROM:106F ret
ROM:1070
ROM:1070 ; =============== S U B R O U T I N E =======================================
ROM:1070
ROM:1070 ; Прибавляет 0.5 к FACCUM.
ROM:1070 ; Используется DECIMAL_POWERS
ROM:1070
ROM:1070 FADDONEHALF: ; CODE XREF: PRINTINT2:PREPARETOPRINTp
ROM:1070 ; SIN+27p
ROM:1070 lxi h, DECIMAL_POWERS
ROM:1073
ROM:1073 loc_1073: ; CODE XREF: NEXT2+17p
ROM:1073 ; ROM:15BBp ...
ROM:1073 call FLOADBCDEFROMMEM ; Загружает число с плавающей точкой в BCDE из ячеек памяти, на которые указывает HL.
ROM:1073 ; Т. е. загрузка из M в BCDE
ROM:1076 jmp FADD2 ; FACCUM = FACCUM + BCDEONSTK
ROM:1076 ; End of function FADDONEHALF
ROM:1076
ROM:1079
ROM:1079 ; =============== S U B R O U T I N E =======================================
ROM:1079
ROM:1079 ; FACCUM = FACCUM - BCDEONSTK
ROM:1079
ROM:1079 FSUB2: ; CODE XREF: ROM:119Dp
ROM:1079 ; SIN+1Fp
ROM:1079 ; DATA XREF: ...
ROM:1079 call FLOADBCDEFROMMEM ; Загружает число с плавающей точкой в BCDE из ячеек памяти, на которые указывает HL.
ROM:1079 ; Т. е. загрузка из M в BCDE
ROM:107C
ROM:107C loc_107C: ; DATA XREF: ROM:17A1o
ROM:107C lxi h, 0D1C1h ; FACCUM = FACCUM - BCDEONSTK
ROM:107C ;
ROM:107C ; 107D:FSUB:POP B
ROM:107C ; POP D
ROM:107F
ROM:107F loc_107F: ; CODE XREF: ROM:15C5p
ROM:107F ; SIN+19p
ROM:107F call FNEGATE ; Меняет знак FACCUM. FACCUM=-FACCUM
ROM:107F ; End of function FSUB2
ROM:107F
ROM:1082
ROM:1082 ; =============== S U B R O U T I N E =======================================
ROM:1082
ROM:1082 ; FACCUM = FACCUM + BCDEONSTK
ROM:1082
ROM:1082 FADD2: ; CODE XREF: FADDONEHALF+6j
ROM:1082 ; ROM:1191p ...
ROM:1082
ROM:1082 ; FUNCTION CHUNK AT ROM:10ED SIZE 0000002D BYTES
ROM:1082
ROM:1082 mov a, b
ROM:1083 ora a
ROM:1084 rz
ROM:1085 lda FACCUM+3 ; Аккумулятор для вычислений с плавающей точкой:
ROM:1085 ; 00000000 1 11111111111111111111111
ROM:1085 ; -------- - -----------------------
ROM:1085 ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:1088 ora a
ROM:1089 jz FLOADFROMBCDE ; Загружает число в FACCUM из BCDE.
ROM:108C sub b
ROM:108D jnc loc_109C
ROM:1090 cma
ROM:1091 inr a
ROM:1092 xchg
ROM:1093 call FPUSH ; Записывает число с плавающей точкой на стек.
ROM:1096 xchg
ROM:1097 call FLOADFROMBCDE ; Загружает число в FACCUM из BCDE.
ROM:109A pop b
ROM:109B pop d
ROM:109C
ROM:109C loc_109C: ; CODE XREF: FADD2+Bj
ROM:109C cpi 19h
ROM:109E rnc
ROM:109F push psw
ROM:10A0 call FUNPACKMANTISSAS ; Распаковывает мантиссы FACCUM и BCDE. Восстанавливает пропавший старший бит, но при этом теряет бит знака у обоих упакованных чисел.
ROM:10A0 ; Для компенсации потери знакового бита функция возвращает комбинацию обоих знаковых битов. Функция меняет знак FACCUM и потом ксорит его со знаком BCDE и возвращает результат в 7-м бите A.
ROM:10A0 ; В результате в A появляется +ve если знаковые биты разные и -ve если знаковые биты совпадают:
ROM:10A0 ;
ROM:10A0 ; FACCUM | negated FACCUM | BCDE | result after XOR
ROM:10A0 ; + - + -
ROM:10A0 ; + - - +
ROM:10A0 ; - + + +
ROM:10A0 ; - + - -
ROM:10A3 mov h, a
ROM:10A4 pop psw
ROM:10A5 call FMANTISSARTMULT ; Сдвигает мантиссу в CDE вправо на A позиций.
ROM:10A5 ; Заметьте, что потеряные биты накапливаются в B, так что их можно использовать далее при округлении.
ROM:10A8 ora h
ROM:10A9 lxi h, FACCUM ; Аккумулятор для вычислений с плавающей точкой:
ROM:10A9 ; 00000000 1 11111111111111111111111
ROM:10A9 ; -------- - -----------------------
ROM:10A9 ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:10AC jp FSUBMANTISSAS ; Вычитает из мантиссы FACCUM мантиссу BCDEONSTK
ROM:10AF call FADDMANTISSAS ; Складывает мантиссы, на первую указывает HL вторая содержится в CDE.
ROM:10B2 jnc loc_1108
ROM:10B5 inx h
ROM:10B6 inr m
ROM:10B7 jz OVERFLOW ; Ошибка переполнения.
ROM:10BA mvi l, 1
ROM:10BC call FMANTISSARTONCE ; Сдвигает мантиссу в CDE вправо на один бит.
ROM:10BF jmp loc_1108
ROM:10C2 ; ---------------------------------------------------------------------------
ROM:10C2
ROM:10C2 FSUBMANTISSAS: ; CODE XREF: FADD2+2Aj
ROM:10C2 xra a ; Вычитает из мантиссы FACCUM мантиссу BCDEONSTK
ROM:10C3 sub b
ROM:10C4 mov b, a
ROM:10C5 mov a, m
ROM:10C6 sbb e
ROM:10C7 mov e, a
ROM:10C8 inx h
ROM:10C9 mov a, m
ROM:10CA sbb d
ROM:10CB mov d, a
ROM:10CC inx h
ROM:10CD mov a, m
ROM:10CE sbb c
ROM:10CF mov c, a
ROM:10D0
ROM:10D0 loc_10D0: ; CODE XREF: LONGINT2+Bj
ROM:10D0 ; INT+14p
ROM:10D0 cc FNEGATEINT ; Меняет знак у 32-битного целого, содержащегося в CDEB путем вычитания его из нуля.
ROM:10D0 ; Также переворачивает знак у FTEMP.
ROM:10D0 ; Используется FASINTEGER и FADD2.
ROM:10D3
ROM:10D3 loc_10D3: ; CODE XREF: ROM:1653p
ROM:10D3 ; DATA XREF: FMUL3+14o
ROM:10D3 mov l, b
ROM:10D4 mov h, e
ROM:10D5 xra a
ROM:10D6
ROM:10D6 loc_10D6: ; CODE XREF: FADD2+63j
ROM:10D6 mov b, a
ROM:10D7 mov a, c
ROM:10D8 ora a
ROM:10D9 jnz loc_10F5
ROM:10DC mov c, d
ROM:10DD mov d, h
ROM:10DE mov h, l
ROM:10DF mov l, a
ROM:10E0 mov a, b
ROM:10E1 sui 8
ROM:10E3 cpi 0E0h ; 'р'
ROM:10E5 jnz loc_10D6
ROM:10E5 ; End of function FADD2
ROM:10E5
ROM:10E8
ROM:10E8 ; =============== S U B R O U T I N E =======================================
ROM:10E8
ROM:10E8 ; Устанавливает FACCUM в ноль.
ROM:10E8
ROM:10E8 FZERO: ; CODE XREF: ROM:0FCBj
ROM:10E8 ; FADD2+82j ...
ROM:10E8 xra a
ROM:10E9
ROM:10E9 loc_10E9: ; CODE XREF: ROM:1565j
ROM:10E9 sta FACCUM+3 ; Аккумулятор для вычислений с плавающей точкой:
ROM:10E9 ; 00000000 1 11111111111111111111111
ROM:10E9 ; -------- - -----------------------
ROM:10E9 ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:10EC ret
ROM:10EC ; End of function FZERO
ROM:10EC
ROM:10ED ; ---------------------------------------------------------------------------
ROM:10ED ; START OF FUNCTION CHUNK FOR FADD2
ROM:10ED
ROM:10ED loc_10ED: ; CODE XREF: FADD2:loc_10F5j
ROM:10ED dcr b
ROM:10EE dad h
ROM:10EF mov a, d
ROM:10F0 ral
ROM:10F1 mov d, a
ROM:10F2 mov a, c
ROM:10F3 adc a
ROM:10F4 mov c, a
ROM:10F5
ROM:10F5 loc_10F5: ; CODE XREF: FADD2+57j
ROM:10F5 jp loc_10ED
ROM:10F8 mov a, b
ROM:10F9 mov e, h
ROM:10FA mov b, l
ROM:10FB ora a
ROM:10FC jz loc_1108
ROM:10FF lxi h, FACCUM+3 ; Аккумулятор для вычислений с плавающей точкой:
ROM:10FF ; 00000000 1 11111111111111111111111
ROM:10FF ; -------- - -----------------------
ROM:10FF ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:1102 add m
ROM:1103 mov m, a
ROM:1104 jnc FZERO ; Устанавливает FACCUM в ноль.
ROM:1107 rz
ROM:1108
ROM:1108 loc_1108: ; CODE XREF: FADD2+30j
ROM:1108 ; FADD2+3Dj ...
ROM:1108 mov a, b
ROM:1109
ROM:1109 loc_1109: ; CODE XREF: ROM:1260j
ROM:1109 lxi h, FACCUM+3 ; Аккумулятор для вычислений с плавающей точкой:
ROM:1109 ; 00000000 1 11111111111111111111111
ROM:1109 ; -------- - -----------------------
ROM:1109 ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:110C ora a
ROM:110D cm FMANTISSAINC ; Увелививает мантиссу в CDE и смотрит, нет ли переполнения.
ROM:1110 mov b, m
ROM:1111 inx h
ROM:1112 mov a, m
ROM:1113 ani 80h
ROM:1115 xra c
ROM:1116 mov c, a
ROM:1117 jmp FLOADFROMBCDE ; Загружает число в FACCUM из BCDE.
ROM:1117 ; END OF FUNCTION CHUNK FOR FADD2
ROM:111A
ROM:111A ; =============== S U B R O U T I N E =======================================
ROM:111A
ROM:111A ; Увелививает мантиссу в CDE и смотрит, нет ли переполнения.
ROM:111A
ROM:111A FMANTISSAINC: ; CODE XREF: FADD2+8Bp
ROM:111A ; FASINTEGER+1Ap
ROM:111A inr e
ROM:111B rnz
ROM:111C inr d
ROM:111D rnz
ROM:111E inr c
ROM:111F rnz
ROM:1120 mvi c, 80h ; 'А'
ROM:1122 inr m
ROM:1123 rnz
ROM:1124
ROM:1124 OVERFLOW: ; CODE XREF: FADD2+35j
ROM:1124 ; ROM:1287j ...
ROM:1124 mvi e, 0Ah ; Ошибка переполнения.
ROM:1126 jmp MAINLOOP1 ; Первая точка входа в главный цикл
ROM:1126 ; End of function FMANTISSAINC
ROM:1126
ROM:1129
ROM:1129 ; =============== S U B R O U T I N E =======================================
ROM:1129
ROM:1129 ; Складывает мантиссы, на первую указывает HL вторая содержится в CDE.
ROM:1129
ROM:1129 FADDMANTISSAS: ; CODE XREF: FADD2+2Dp
ROM:1129 ; PRINTINT2+83p
ROM:1129 mov a, m
ROM:112A add e
ROM:112B mov e, a
ROM:112C inx h
ROM:112D mov a, m
ROM:112E adc d
ROM:112F mov d, a
ROM:1130 inx h
ROM:1131 mov a, m
ROM:1132 adc c
ROM:1133 mov c, a
ROM:1134 ret
ROM:1134 ; End of function FADDMANTISSAS
ROM:1134
ROM:1135
ROM:1135 ; =============== S U B R O U T I N E =======================================
ROM:1135
ROM:1135 ; Меняет знак у 32-битного целого, содержащегося в CDEB путем вычитания его из нуля.
ROM:1135 ; Также переворачивает знак у FTEMP.
ROM:1135 ; Используется FASINTEGER и FADD2.
ROM:1135
ROM:1135 FNEGATEINT: ; CODE XREF: FADD2:loc_10D0p
ROM:1135 ; FASINTEGER+1Fp
ROM:1135 lxi h, FTEMP ; Временная переменная, используемая для хранения знака и экспоненты числа с плавающей точкой во время вычислений.
ROM:1138 mov a, m ; FTEMP
ROM:1139 cma
ROM:113A mov m, a
ROM:113B xra a
ROM:113C mov l, a
ROM:113D sub b
ROM:113E mov b, a
ROM:113F mov a, l
ROM:1140 sbb e
ROM:1141 mov e, a
ROM:1142 mov a, l
ROM:1143 sbb d
ROM:1144 mov d, a
ROM:1145 mov a, l
ROM:1146 sbb c
ROM:1147 mov c, a
ROM:1148 ret
ROM:1148 ; End of function FNEGATEINT
ROM:1148
ROM:1149
ROM:1149 ; =============== S U B R O U T I N E =======================================
ROM:1149
ROM:1149 ; Сдвигает мантиссу в CDE вправо на A позиций.
ROM:1149 ; Заметьте, что потеряные биты накапливаются в B, так что их можно использовать далее при округлении.
ROM:1149
ROM:1149 FMANTISSARTMULT: ; CODE XREF: FADD2+23p
ROM:1149 ; FASINTEGER+15p
ROM:1149 mvi b, 0
ROM:114B
ROM:114B loc_114B: ; CODE XREF: FMANTISSARTMULT+Cj
ROM:114B sui 8
ROM:114D jc loc_1158
ROM:1150 mov b, e
ROM:1151 mov e, d
ROM:1152 mov d, c
ROM:1153 mvi c, 0
ROM:1155 jmp loc_114B
ROM:1158 ; ---------------------------------------------------------------------------
ROM:1158
ROM:1158 loc_1158: ; CODE XREF: FMANTISSARTMULT+4j
ROM:1158 adi 9
ROM:115A mov l, a
ROM:115B
ROM:115B loc_115B: ; CODE XREF: FMANTISSARTONCE+Bj
ROM:115B xra a
ROM:115C dcr l
ROM:115D rz
ROM:115E mov a, c
ROM:115E ; End of function FMANTISSARTMULT
ROM:115E
ROM:115F
ROM:115F ; =============== S U B R O U T I N E =======================================
ROM:115F
ROM:115F ; Сдвигает мантиссу в CDE вправо на один бит.
ROM:115F
ROM:115F FMANTISSARTONCE: ; CODE XREF: FADD2+3Ap
ROM:115F rar
ROM:1160 mov c, a
ROM:1161 mov a, d
ROM:1162 rar
ROM:1163 mov d, a
ROM:1164 mov a, e
ROM:1165 rar
ROM:1166 mov e, a
ROM:1167 mov a, b
ROM:1168 rar
ROM:1169 mov b, a
ROM:116A jmp loc_115B
ROM:116A ; End of function FMANTISSARTONCE
ROM:116A
ROM:116D ; ---------------------------------------------------------------------------
ROM:116D
ROM:116D loc_116D: ; DATA XREF: ROM:119Ao
ROM:116D ; ROM:15B8o
ROM:116D nop
ROM:116E nop
ROM:116F nop
ROM:1170 add c
ROM:1171
ROM:1171 loc_1171: ; DATA XREF: ROM:11A0o
ROM:1171 inx b
ROM:1172 xra d
ROM:1173 mov d, m
ROM:1174 dad d
ROM:1175 add b
ROM:1176 pop psw
ROM:1177 shld 8076h
ROM:117A mov b, l
ROM:117B xra d
ROM:117C ldsi 82h ; 'В'
ROM:117E
ROM:117E LOG: ; CODE XREF: ROM:1591p
ROM:117E rst 5 ; Обработка Бейсик-функции LOG.
ROM:117F jpe FUNCTIONCALLERROR ; Ошибка вызова функции
ROM:1182 lxi h, FACCUM+3 ; Аккумулятор для вычислений с плавающей точкой:
ROM:1182 ; 00000000 1 11111111111111111111111
ROM:1182 ; -------- - -----------------------
ROM:1182 ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:1185 mov a, m
ROM:1186 lxi b, 8035h
ROM:1189 lxi d, 4F3h
ROM:118C sub b
ROM:118D push psw
ROM:118E mov m, b
ROM:118F push d
ROM:1190 push b
ROM:1191 call FADD2 ; FACCUM = FACCUM + BCDEONSTK
ROM:1194 pop b
ROM:1195 pop d
ROM:1196 inr b
ROM:1197 call loc_121A
ROM:119A lxi h, loc_116D
ROM:119D call FSUB2 ; FACCUM = FACCUM - BCDEONSTK
ROM:11A0 lxi h, loc_1171
ROM:11A3 call loc_15FA
ROM:11A6 lxi b, 8080h
ROM:11A9 lxi d, 0
ROM:11AC call FADD2 ; FACCUM = FACCUM + BCDEONSTK
ROM:11AF pop psw
ROM:11B0 call FADDPROC ; Прибавляет значение цифры находящейся в A к FACCUM.
ROM:11B3
ROM:11B3 ; =============== S U B R O U T I N E =======================================
ROM:11B3
ROM:11B3 ; FACCUM = FACCUM * BCDEONSTK
ROM:11B3
ROM:11B3 FMUL2: ; CODE XREF: ROM:15BEp
ROM:11B3 lxi b, 8031h
ROM:11B6 lxi d, 7218h
ROM:11B6 ; End of function FMUL2
ROM:11B6
ROM:11B9
ROM:11B9 loc_11B9: ; DATA XREF: ROM:17A4o
ROM:11B9 lxi h, 0D1C1h ; FACCUM = FACCUM * BCDEONSTK
ROM:11B9 ;
ROM:11B9 ; 11BA:FMUL:POP B
ROM:11B9 ; POP D
ROM:11BC
ROM:11BC ; =============== S U B R O U T I N E =======================================
ROM:11BC
ROM:11BC ; Обработка FACCUM = FACCUM * BCDEONSTK
ROM:11BC
ROM:11BC FMUL3: ; CODE XREF: ROM:1596p
ROM:11BC ; ROM:15A2p ...
ROM:11BC
ROM:11BC ; FUNCTION CHUNK AT ROM:1207 SIZE 00000005 BYTES
ROM:11BC
ROM:11BC rst 5 ; RST5 = Проверяет состояние FACCUM.
ROM:11BC ; Возвращает A = 0 и устанавливает Z, если FACCUM == 0, хвост функции устанавливает флаг знака и A соответственно
ROM:11BC ; (0xFF если отрицательно, 0x01 если положительно).
ROM:11BD rz
ROM:11BE mvi l, 0
ROM:11C0 call FEXPONENTADD ; Используется в FDIV и в FMUL.Работает с экспоненциальной частью аргументов.
ROM:11C0 ; Складывает их для FMUL и вычитает их для FDIV.
ROM:11C0 ; На входе L=0 при сложении и L=FF при вычитании.
ROM:11C3 mov a, c
ROM:11C4 sta loc_F877+1
ROM:11C7 xchg
ROM:11C8 shld loc_F872+1
ROM:11CB lxi b, 0
ROM:11CE mov d, b
ROM:11CF mov e, b
ROM:11D0 lxi h, loc_10D3
ROM:11D3 push h
ROM:11D4 lxi h, loc_11DC
ROM:11D7 push h
ROM:11D8 push h
ROM:11D9 lxi h, FACCUM ; Аккумулятор для вычислений с плавающей точкой:
ROM:11D9 ; 00000000 1 11111111111111111111111
ROM:11D9 ; -------- - -----------------------
ROM:11D9 ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:11DC
ROM:11DC loc_11DC: ; DATA XREF: FMUL3+18o
ROM:11DC mov a, m
ROM:11DD inx h
ROM:11DE ora a
ROM:11DF jz loc_1207
ROM:11E2 push h
ROM:11E3 xchg
ROM:11E4 mvi e, 8
ROM:11E6
ROM:11E6 loc_11E6: ; CODE XREF: FMUL3+45j
ROM:11E6 rar
ROM:11E7 mov d, a
ROM:11E8 mov a, c
ROM:11E9 jnc loc_11F4
ROM:11EC call BASSUB2
ROM:11EF nop
ROM:11F0 nop
ROM:11F1 nop
ROM:11F2 nop
ROM:11F3 nop
ROM:11F4
ROM:11F4 loc_11F4: ; CODE XREF: FMUL3+2Dj
ROM:11F4 rar
ROM:11F5 mov c, a
ROM:11F6 mov a, h
ROM:11F7 rar
ROM:11F8 mov h, a
ROM:11F9 mov a, l
ROM:11FA rar
ROM:11FB mov l, a
ROM:11FC mov a, b
ROM:11FD rar
ROM:11FE mov b, a
ROM:11FF dcr e
ROM:1200 mov a, d
ROM:1201 jnz loc_11E6
ROM:1204 xchg
ROM:1204 ; End of function FMUL3
ROM:1204
ROM:1205 ; START OF FUNCTION CHUNK FOR FEXPONENTADD
ROM:1205
ROM:1205 loc_1205: ; CODE XREF: FEXPONENTADD+15j
ROM:1205 pop h
ROM:1206 ret
ROM:1206 ; END OF FUNCTION CHUNK FOR FEXPONENTADD
ROM:1207 ; ---------------------------------------------------------------------------
ROM:1207 ; START OF FUNCTION CHUNK FOR FMUL3
ROM:1207
ROM:1207 loc_1207: ; CODE XREF: FMUL3+23j
ROM:1207 mov b, e
ROM:1208 mov e, d
ROM:1209 mov d, c
ROM:120A mov c, a
ROM:120B ret
ROM:120B ; END OF FUNCTION CHUNK FOR FMUL3
ROM:120C
ROM:120C ; =============== S U B R O U T I N E =======================================
ROM:120C
ROM:120C ; Делит FACCUM на 10. Используется в FOUT для представления чисел в нормальном виде при печати.
ROM:120C
ROM:120C FDIVBYTEN: ; CODE XREF: FIN+52p
ROM:120C ; PRINTINT2:loc_149Fp
ROM:120C call FPUSH ; Записывает число с плавающей точкой на стек.
ROM:120F lxi b, 8420h
ROM:1212 lxi d, 0
ROM:1215 call FLOADFROMBCDE ; Загружает число в FACCUM из BCDE.
ROM:1218
ROM:1218 FDIV: ; CODE XREF: ROM:16D5j
ROM:1218 ; DATA XREF: ROM:17A7o
ROM:1218 pop b ; FACCUM = FACCUM / BCDEONSTK
ROM:1219 pop d
ROM:121A
ROM:121A loc_121A: ; CODE XREF: ROM:1197p SIN+Ep ...
ROM:121A rst 5 ; RST5 = Проверяет состояние FACCUM.
ROM:121A ; Возвращает A = 0 и устанавливает Z, если FACCUM == 0, хвост функции устанавливает флаг знака и A соответственно
ROM:121A ; (0xFF если отрицательно, 0x01 если положительно).
ROM:121B jz DIVIDEBYZERO ; Ошибка деления на ноль
ROM:121E mvi l, 0FFh
ROM:1220 call FEXPONENTADD ; Используется в FDIV и в FMUL.Работает с экспоненциальной частью аргументов.
ROM:1220 ; Складывает их для FMUL и вычитает их для FDIV.
ROM:1220 ; На входе L=0 при сложении и L=FF при вычитании.
ROM:1223 inr m
ROM:1224 inr m
ROM:1225 dcx h
ROM:1226 mov a, m
ROM:1227 sta loc_F842+1
ROM:122A dcx h
ROM:122B mov a, m
ROM:122C sta loc_F83E+1
ROM:122F dcx h
ROM:1230 mov a, m
ROM:1231 sta loc_F83A+1
ROM:1234 mov b, c
ROM:1235 xchg
ROM:1236 xra a
ROM:1237 mov c, a
ROM:1238 mov d, a
ROM:1239 mov e, a
ROM:123A sta loc_F845+1
ROM:123D
ROM:123D FDIVLOOP: ; CODE XREF: ROM:127Bj
ROM:123D ; ROM:1284j
ROM:123D push h ; Главный цикл FDIV
ROM:123E push b
ROM:123F call BASSUB1
ROM:1242 jmp loc_124F
ROM:1245 ; ---------------------------------------------------------------------------
ROM:1245 nop
ROM:1246 mov h, a
ROM:1247 mov a, b
ROM:1248 sbi 0ADh ; 'н'
ROM:124A mov b, a
ROM:124B mvi a, 0
ROM:124D sbi 0
ROM:124F
ROM:124F loc_124F: ; CODE XREF: FDIVBYTEN+36j
ROM:124F cmc
ROM:1250 jnc loc_125A
ROM:1253 sta loc_F845+1
ROM:1256 pop psw
ROM:1257 pop psw
ROM:1258 stc
ROM:1258 ; End of function FDIVBYTEN
ROM:1258
ROM:1258 ; ---------------------------------------------------------------------------
ROM:1259 .db 0D2h
ROM:125A ; ---------------------------------------------------------------------------
ROM:125A
ROM:125A loc_125A: ; CODE XREF: FDIVBYTEN+44j
ROM:125A pop b
ROM:125B pop h
ROM:125C mov a, c
ROM:125D inr a
ROM:125E dcr a
ROM:125F rar
ROM:1260 jm loc_1109
ROM:1263 ral
ROM:1264 mov a, e
ROM:1265 ral
ROM:1266 mov e, a
ROM:1267 mov a, d
ROM:1268 ral
ROM:1269 mov d, a
ROM:126A mov a, c
ROM:126B ral
ROM:126C mov c, a
ROM:126D dad h
ROM:126E mov a, b
ROM:126F ral
ROM:1270 mov b, a
ROM:1271 lda loc_F845+1
ROM:1274 ral
ROM:1275 sta loc_F845+1
ROM:1278 mov a, c
ROM:1279 ora d
ROM:127A ora e
ROM:127B jnz FDIVLOOP ; Главный цикл FDIV
ROM:127E push h
ROM:127F lxi h, FACCUM+3 ; Аккумулятор для вычислений с плавающей точкой:
ROM:127F ; 00000000 1 11111111111111111111111
ROM:127F ; -------- - -----------------------
ROM:127F ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:1282 dcr m
ROM:1283 pop h
ROM:1284 jnz FDIVLOOP ; Главный цикл FDIV
ROM:1287 jmp OVERFLOW ; Ошибка переполнения.
ROM:128A
ROM:128A ; =============== S U B R O U T I N E =======================================
ROM:128A
ROM:128A ; Используется в FDIV и в FMUL.Работает с экспоненциальной частью аргументов.
ROM:128A ; Складывает их для FMUL и вычитает их для FDIV.
ROM:128A ; На входе L=0 при сложении и L=FF при вычитании.
ROM:128A
ROM:128A FEXPONENTADD: ; CODE XREF: FMUL3+4p
ROM:128A ; FDIVBYTEN+14p
ROM:128A
ROM:128A ; FUNCTION CHUNK AT ROM:1205 SIZE 00000002 BYTES
ROM:128A
ROM:128A mov a, b
ROM:128B ora a
ROM:128C jz loc_12AC
ROM:128F mov a, l
ROM:1290 lxi h, FACCUM+3 ; Аккумулятор для вычислений с плавающей точкой:
ROM:1290 ; 00000000 1 11111111111111111111111
ROM:1290 ; -------- - -----------------------
ROM:1290 ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:1293 xra m
ROM:1294 add b
ROM:1295 mov b, a
ROM:1296 rar
ROM:1297 xra b
ROM:1298 mov a, b
ROM:1299 jp loc_12AB
ROM:129C adi 80h ; 'А'
ROM:129E mov m, a
ROM:129F jz loc_1205
ROM:12A2 call FUNPACKMANTISSAS ; Распаковывает мантиссы FACCUM и BCDE. Восстанавливает пропавший старший бит, но при этом теряет бит знака у обоих упакованных чисел.
ROM:12A2 ; Для компенсации потери знакового бита функция возвращает комбинацию обоих знаковых битов. Функция меняет знак FACCUM и потом ксорит его со знаком BCDE и возвращает результат в 7-м бите A.
ROM:12A2 ; В результате в A появляется +ve если знаковые биты разные и -ve если знаковые биты совпадают:
ROM:12A2 ;
ROM:12A2 ; FACCUM | negated FACCUM | BCDE | result after XOR
ROM:12A2 ; + - + -
ROM:12A2 ; + - - +
ROM:12A2 ; - + + +
ROM:12A2 ; - + - -
ROM:12A5 mov m, a
ROM:12A6 dcx h
ROM:12A7 ret
ROM:12A8 ; ---------------------------------------------------------------------------
ROM:12A8
ROM:12A8 loc_12A8: ; CODE XREF: ROM:15AAj
ROM:12A8 ; ROM:15B4j
ROM:12A8 rst 5 ; RST5 = Проверяет состояние FACCUM.
ROM:12A8 ; Возвращает A = 0 и устанавливает Z, если FACCUM == 0, хвост функции устанавливает флаг знака и A соответственно
ROM:12A8 ; (0xFF если отрицательно, 0x01 если положительно).
ROM:12A9 cma
ROM:12AA pop h
ROM:12AB
ROM:12AB loc_12AB: ; CODE XREF: FEXPONENTADD+Fj
ROM:12AB ora a
ROM:12AC
ROM:12AC loc_12AC: ; CODE XREF: FEXPONENTADD+2j
ROM:12AC pop h
ROM:12AD jp FZERO ; Устанавливает FACCUM в ноль.
ROM:12B0 jmp OVERFLOW ; Ошибка переполнения.
ROM:12B0 ; End of function FEXPONENTADD
ROM:12B0
ROM:12B3
ROM:12B3 ; =============== S U B R O U T I N E =======================================
ROM:12B3
ROM:12B3 ; Умножает FACCUM на 10.
ROM:12B3
ROM:12B3 FMULBYTEN: ; CODE XREF: DECIMALSHIFTUP2+1p
ROM:12B3 ; FIN+71p
ROM:12B3 call FCOPYTOBCDE ; Перемещение числа с плавающей точкой из FACCUM в BCDE
ROM:12B6 mov a, b
ROM:12B7 ora a
ROM:12B8 rz
ROM:12B9 adi 2
ROM:12BB jc OVERFLOW ; Ошибка переполнения.
ROM:12BE mov b, a
ROM:12BF call FADD2 ; FACCUM = FACCUM + BCDEONSTK
ROM:12C2 lxi h, FACCUM+3 ; Аккумулятор для вычислений с плавающей точкой:
ROM:12C2 ; 00000000 1 11111111111111111111111
ROM:12C2 ; -------- - -----------------------
ROM:12C2 ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:12C5 inr m
ROM:12C6 rnz
ROM:12C7 jmp OVERFLOW ; Ошибка переполнения.
ROM:12C7 ; End of function FMULBYTEN
ROM:12C7
ROM:12CA ; ---------------------------------------------------------------------------
ROM:12CA ; START OF FUNCTION CHUNK FOR FTESTSIGN
ROM:12CA
ROM:12CA FTESTSIGN2: ; CODE XREF: FTESTSIGN+4j
ROM:12CA lda FACCUM+2 ; Аккумулятор для вычислений с плавающей точкой:
ROM:12CA ; 00000000 1 11111111111111111111111
ROM:12CA ; -------- - -----------------------
ROM:12CA ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:12CD
ROM:12CD loc_12CD: ; DATA XREF: FCOMPARE+5o
ROM:12CD cpi 2Fh ; '/'
ROM:12CF ral
ROM:12D0
ROM:12D0 loc_12D0: ; CODE XREF: ROM:0AECj
ROM:12D0 sbb a
ROM:12D1 rnz
ROM:12D2 inr a
ROM:12D3 ret
ROM:12D3 ; END OF FUNCTION CHUNK FOR FTESTSIGN
ROM:12D4 ; ---------------------------------------------------------------------------
ROM:12D4
ROM:12D4 SGN: ; Бейсик-функция SGN
ROM:12D4 rst 5
ROM:12D5
ROM:12D5 ; =============== S U B R O U T I N E =======================================
ROM:12D5
ROM:12D5 ; Конвертирует знаковое число (байт) в A в число с плавающей точкой в FACCUM.
ROM:12D5
ROM:12D5 FCHARTOFLOAT: ; CODE XREF: ROM:0AF6j
ROM:12D5 ; FADDPROC+3p
ROM:12D5 mvi b, 88h ; 'И'
ROM:12D7 lxi d, 0
ROM:12D7 ; End of function FCHARTOFLOAT
ROM:12D7
ROM:12DA
ROM:12DA ; =============== S U B R O U T I N E =======================================
ROM:12DA
ROM:12DA ; Получение длинного целого. Дополнительная точка входа.
ROM:12DA
ROM:12DA LONGINT2: ; CODE XREF: LONGINT+Aj
ROM:12DA ; PRINTINT2+3p
ROM:12DA lxi h, FACCUM+3 ; Аккумулятор для вычислений с плавающей точкой:
ROM:12DA ; 00000000 1 11111111111111111111111
ROM:12DA ; -------- - -----------------------
ROM:12DA ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:12DD mov c, a
ROM:12DE mov m, b
ROM:12DF mvi b, 0
ROM:12E1 inx h
ROM:12E2 mvi m, 80h ; 'А'
ROM:12E4 ral
ROM:12E5 jmp loc_10D0
ROM:12E5 ; End of function LONGINT2
ROM:12E5
ROM:12E8 ; ---------------------------------------------------------------------------
ROM:12E8
ROM:12E8 ABS: ; Бейсик-функция ABS
ROM:12E8 rst 5
ROM:12E9 rp
ROM:12EA
ROM:12EA ; =============== S U B R O U T I N E =======================================
ROM:12EA
ROM:12EA ; Меняет знак FACCUM. FACCUM=-FACCUM
ROM:12EA
ROM:12EA FNEGATE: ; CODE XREF: EVALTERM+42p
ROM:12EA ; FSUB2:loc_107Fp ...
ROM:12EA lxi h, FACCUM+2 ; Аккумулятор для вычислений с плавающей точкой:
ROM:12EA ; 00000000 1 11111111111111111111111
ROM:12EA ; -------- - -----------------------
ROM:12EA ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:12ED mov a, m
ROM:12EE xri 80h
ROM:12F0 mov m, a
ROM:12F1 ret
ROM:12F1 ; End of function FNEGATE
ROM:12F1
ROM:12F2
ROM:12F2 ; =============== S U B R O U T I N E =======================================
ROM:12F2
ROM:12F2 ; Записывает число с плавающей точкой на стек.
ROM:12F2
ROM:12F2 FPUSH: ; CODE XREF: COMPUTE2+61p
ROM:12F2 ; FADD2+11p ...
ROM:12F2 xchg
ROM:12F3 lhld FACCUM ; Аккумулятор для вычислений с плавающей точкой:
ROM:12F3 ; 00000000 1 11111111111111111111111
ROM:12F3 ; -------- - -----------------------
ROM:12F3 ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:12F6 xthl
ROM:12F7 push h
ROM:12F8 lhld FACCUM+2 ; Аккумулятор для вычислений с плавающей точкой:
ROM:12F8 ; 00000000 1 11111111111111111111111
ROM:12F8 ; -------- - -----------------------
ROM:12F8 ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:12FB xthl
ROM:12FC push h
ROM:12FD xchg
ROM:12FE ret
ROM:12FE ; End of function FPUSH
ROM:12FE
ROM:12FF
ROM:12FF ; =============== S U B R O U T I N E =======================================
ROM:12FF
ROM:12FF ; Загружает FACCUM числом с плавающей точкой из ячеек памяти, на которые указывает HL.
ROM:12FF ;
ROM:12FF
ROM:12FF FLOADFROMMEM: ; CODE XREF: NEXT2+12p
ROM:12FF ; EVALTERM+56p ...
ROM:12FF call FLOADBCDEFROMMEM ; Загружает число с плавающей точкой в BCDE из ячеек памяти, на которые указывает HL.
ROM:12FF ; End of function FLOADFROMMEM ; Т. е. загрузка из M в BCDE
ROM:12FF
ROM:1302
ROM:1302 ; =============== S U B R O U T I N E =======================================
ROM:1302
ROM:1302 ; Загружает число в FACCUM из BCDE.
ROM:1302
ROM:1302 FLOADFROMBCDE: ; CODE XREF: ROM:0A84p
ROM:1302 ; FADD2+7j ...
ROM:1302 xchg
ROM:1303 shld FACCUM ; Аккумулятор для вычислений с плавающей точкой:
ROM:1303 ; 00000000 1 11111111111111111111111
ROM:1303 ; -------- - -----------------------
ROM:1303 ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:1306 mov h, b
ROM:1307 mov l, c
ROM:1308 shld FACCUM+2 ; Аккумулятор для вычислений с плавающей точкой:
ROM:1308 ; 00000000 1 11111111111111111111111
ROM:1308 ; -------- - -----------------------
ROM:1308 ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:130B xchg
ROM:130C ret
ROM:130C ; End of function FLOADFROMBCDE
ROM:130C
ROM:130D
ROM:130D ; =============== S U B R O U T I N E =======================================
ROM:130D
ROM:130D ; Перемещение числа с плавающей точкой из FACCUM в BCDE
ROM:130D
ROM:130D FCOPYTOBCDE: ; CODE XREF: ROM:055Fp
ROM:130D ; ROM:0577p ...
ROM:130D lxi h, FACCUM ; Аккумулятор для вычислений с плавающей точкой:
ROM:130D ; End of function FCOPYTOBCDE ; 00000000 1 11111111111111111111111
ROM:130D ; -------- - -----------------------
ROM:130D ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:1310
ROM:1310 ; =============== S U B R O U T I N E =======================================
ROM:1310
ROM:1310 ; Загружает число с плавающей точкой в BCDE из ячеек памяти, на которые указывает HL.
ROM:1310 ; Т. е. загрузка из M в BCDE
ROM:1310
ROM:1310 FLOADBCDEFROMMEM: ; CODE XREF: NEXT2+1Fp
ROM:1310 ; NEXT2+29p ...
ROM:1310 mov e, m
ROM:1311 inx h
ROM:1312 mov d, m
ROM:1313 inx h
ROM:1314 mov c, m
ROM:1315 inx h
ROM:1316 mov b, m
ROM:1316 ; End of function FLOADBCDEFROMMEM
ROM:1316
ROM:1317
ROM:1317 ; =============== S U B R O U T I N E =======================================
ROM:1317
ROM:1317 ; Подпрограмма PRINTINT
ROM:1317
ROM:1317 INCHLRETURN: ; CODE XREF: PRINTINT2+66p
ROM:1317 ; PRINTINT2+A0p
ROM:1317 inx h
ROM:1318 ret
ROM:1318 ; End of function INCHLRETURN
ROM:1318
ROM:1319
ROM:1319 ; =============== S U B R O U T I N E =======================================
ROM:1319
ROM:1319 ; Копирование числа с плавающей точкой в память, на которую указывает HL
ROM:1319
ROM:1319 FCOPYTOMEM: ; CODE XREF: LET+46p
ROM:1319 ; ROM:08C3p ...
ROM:1319 lxi d, FACCUM ; Аккумулятор для вычислений с плавающей точкой:
ROM:1319 ; End of function FCOPYTOMEM ; 00000000 1 11111111111111111111111
ROM:1319 ; -------- - -----------------------
ROM:1319 ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:131C
ROM:131C ; =============== S U B R O U T I N E =======================================
ROM:131C
ROM:131C ; Копирование числа с плавающей точкой в память. Дополнительная точка входа.
ROM:131C
ROM:131C FCOPYTOMEM2: ; CODE XREF: LET+40p
ROM:131C ; MAINTR2+34p
ROM:131C mvi b, 4
ROM:131E
ROM:131E FCOPYLOOP: ; CODE XREF: FCOPYTOMEM2+7j
ROM:131E ldax d
ROM:131F mov m, a
ROM:1320 inx d
ROM:1321 inx h
ROM:1322 dcr b
ROM:1323 jnz FCOPYLOOP
ROM:1326 ret
ROM:1326 ; End of function FCOPYTOMEM2
ROM:1326
ROM:1327
ROM:1327 ; =============== S U B R O U T I N E =======================================
ROM:1327
ROM:1327 ; Распаковывает мантиссы FACCUM и BCDE. Восстанавливает пропавший старший бит, но при этом теряет бит знака у обоих упакованных чисел.
ROM:1327 ; Для компенсации потери знакового бита функция возвращает комбинацию обоих знаковых битов. Функция меняет знак FACCUM и потом ксорит его со знаком BCDE и возвращает результат в 7-м бите A.
ROM:1327 ; В результате в A появляется +ve если знаковые биты разные и -ve если знаковые биты совпадают:
ROM:1327 ;
ROM:1327 ; FACCUM | negated FACCUM | BCDE | result after XOR
ROM:1327 ; + - + -
ROM:1327 ; + - - +
ROM:1327 ; - + + +
ROM:1327 ; - + - -
ROM:1327
ROM:1327 FUNPACKMANTISSAS: ; CODE XREF: FADD2+1Ep
ROM:1327 ; FEXPONENTADD+18p ...
ROM:1327 lxi h, FACCUM+2 ; Аккумулятор для вычислений с плавающей точкой:
ROM:1327 ; 00000000 1 11111111111111111111111
ROM:1327 ; -------- - -----------------------
ROM:1327 ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:132A mov a, m
ROM:132B rlc
ROM:132C stc
ROM:132D rar
ROM:132E mov m, a
ROM:132F cmc
ROM:1330 rar
ROM:1331 inx h
ROM:1332 inx h
ROM:1333 mov m, a
ROM:1334 mov a, c
ROM:1335 rlc
ROM:1336 stc
ROM:1337 rar
ROM:1338 mov c, a
ROM:1339 rar
ROM:133A xra m
ROM:133B ret
ROM:133B ; End of function FUNPACKMANTISSAS
ROM:133B
ROM:133C
ROM:133C ; =============== S U B R O U T I N E =======================================
ROM:133C
ROM:133C ; Сравнение чисел с плавающей точкой.
ROM:133C ; Сравнивает FACCUM и BCDE. Результат возвращается в A.
ROM:133C ; FACCUM > BCDE, A = 0x01.
ROM:133C ; FACCUM < BCDE, A = 0xFF.
ROM:133C ; FACCUM = BCDE, A = 0.
ROM:133C
ROM:133C FCOMPARE: ; CODE XREF: INTFROMFLOAT+Ep
ROM:133C ; NEXT2+23p ...
ROM:133C mov a, b
ROM:133D ora a
ROM:133E jz FTESTSIGN ; RST5 = Проверяет состояние FACCUM.
ROM:133E ; Возвращает A = 0 и устанавливает Z, если FACCUM == 0, хвост функции устанавливает флаг знака и A соответственно
ROM:133E ; (0xFF если отрицательно, 0x01 если положительно).
ROM:1341 lxi h, loc_12CD+1
ROM:1344 push h
ROM:1345 rst 5 ; RST5 = Проверяет состояние FACCUM.
ROM:1345 ; Возвращает A = 0 и устанавливает Z, если FACCUM == 0, хвост функции устанавливает флаг знака и A соответственно
ROM:1345 ; (0xFF если отрицательно, 0x01 если положительно).
ROM:1346 mov a, c
ROM:1347 rz
ROM:1348 lxi h, FACCUM+2 ; Аккумулятор для вычислений с плавающей точкой:
ROM:1348 ; 00000000 1 11111111111111111111111
ROM:1348 ; -------- - -----------------------
ROM:1348 ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:134B xra m
ROM:134C mov a, c
ROM:134D rm
ROM:134E call FISEQUAL ; Тест на равенство FACCUM и BCDE
ROM:1351 rar
ROM:1352 xra c
ROM:1353 ret
ROM:1353 ; End of function FCOMPARE
ROM:1353
ROM:1354
ROM:1354 ; =============== S U B R O U T I N E =======================================
ROM:1354
ROM:1354 ; Тест на равенство FACCUM и BCDE
ROM:1354
ROM:1354 FISEQUAL: ; CODE XREF: FCOMPARE+12p
ROM:1354 inx h
ROM:1355 mov a, b
ROM:1356 cmp m
ROM:1357 rnz
ROM:1358 dcx h
ROM:1359 mov a, c
ROM:135A cmp m
ROM:135B rnz
ROM:135C dcx h
ROM:135D mov a, d
ROM:135E cmp m
ROM:135F rnz
ROM:1360 dcx h
ROM:1361 mov a, e
ROM:1362 sub m
ROM:1363 rnz
ROM:1364 pop h
ROM:1365 pop h
ROM:1366 ret
ROM:1366 ; End of function FISEQUAL
ROM:1366
ROM:1367
ROM:1367 ; =============== S U B R O U T I N E =======================================
ROM:1367
ROM:1367 ; Перевод числа с плавающей точкой в целое.
ROM:1367 ; Возвращает целую часть FACCUM в CDE.
ROM:1367
ROM:1367 FASINTEGER: ; CODE XREF: INT+Bp
ROM:1367 ; PRINTINT2+46p ...
ROM:1367 mov b, a
ROM:1368 mov c, a
ROM:1369 mov d, a
ROM:136A mov e, a
ROM:136B ora a
ROM:136C rz
ROM:136D
ROM:136D FASINTEGER_ASM: ; Ассемблерная точка входа в процедуру перевода числа с плавающей точкой в целое
ROM:136D push h
ROM:136E call FCOPYTOBCDE ; Перемещение числа с плавающей точкой из FACCUM в BCDE
ROM:1371 call FUNPACKMANTISSAS ; Распаковывает мантиссы FACCUM и BCDE. Восстанавливает пропавший старший бит, но при этом теряет бит знака у обоих упакованных чисел.
ROM:1371 ; Для компенсации потери знакового бита функция возвращает комбинацию обоих знаковых битов. Функция меняет знак FACCUM и потом ксорит его со знаком BCDE и возвращает результат в 7-м бите A.
ROM:1371 ; В результате в A появляется +ve если знаковые биты разные и -ve если знаковые биты совпадают:
ROM:1371 ;
ROM:1371 ; FACCUM | negated FACCUM | BCDE | result after XOR
ROM:1371 ; + - + -
ROM:1371 ; + - - +
ROM:1371 ; - + + +
ROM:1371 ; - + - -
ROM:1374 xra m
ROM:1375 mov h, a
ROM:1376 cm FMANTISSADEC ; Декремент мантиссы находящейся в CDE.
ROM:1379 mvi a, 98h ; 'Ш'
ROM:137B sub b
ROM:137C call FMANTISSARTMULT ; Сдвигает мантиссу в CDE вправо на A позиций.
ROM:137C ; Заметьте, что потеряные биты накапливаются в B, так что их можно использовать далее при округлении.
ROM:137F mov a, h
ROM:1380 ral
ROM:1381 cc FMANTISSAINC ; Увелививает мантиссу в CDE и смотрит, нет ли переполнения.
ROM:1384 mvi b, 0
ROM:1386 cc FNEGATEINT ; Меняет знак у 32-битного целого, содержащегося в CDEB путем вычитания его из нуля.
ROM:1386 ; Также переворачивает знак у FTEMP.
ROM:1386 ; Используется FASINTEGER и FADD2.
ROM:1389 pop h
ROM:138A ret
ROM:138A ; End of function FASINTEGER
ROM:138A
ROM:138B
ROM:138B ; =============== S U B R O U T I N E =======================================
ROM:138B
ROM:138B ; Декремент мантиссы находящейся в CDE.
ROM:138B
ROM:138B FMANTISSADEC: ; CODE XREF: FASINTEGER+Fp
ROM:138B dcx d
ROM:138C mov a, d
ROM:138D ana e
ROM:138E inr a
ROM:138F rnz
ROM:1390 dcr c
ROM:1391 ret
ROM:1391 ; End of function FMANTISSADEC
ROM:1391
ROM:1392
ROM:1392 ; =============== S U B R O U T I N E =======================================
ROM:1392
ROM:1392 ; Бейсик-функция INT.
ROM:1392
ROM:1392 INT: ; CODE XREF: ROM:1575p
ROM:1392 ; ROM:15ADp ...
ROM:1392 lxi h, FACCUM+3 ; Аккумулятор для вычислений с плавающей точкой:
ROM:1392 ; 00000000 1 11111111111111111111111
ROM:1392 ; -------- - -----------------------
ROM:1392 ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:1395 mov a, m
ROM:1396 cpi 98h ; 'Ш'
ROM:1398 lda FACCUM ; Аккумулятор для вычислений с плавающей точкой:
ROM:1398 ; 00000000 1 11111111111111111111111
ROM:1398 ; -------- - -----------------------
ROM:1398 ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:139B rnc
ROM:139C mov a, m
ROM:139D call FASINTEGER ; Перевод числа с плавающей точкой в целое.
ROM:139D ; Возвращает целую часть FACCUM в CDE.
ROM:13A0 mvi m, 98h ; 'Ш'
ROM:13A2 mov a, e
ROM:13A3 push psw
ROM:13A4 mov a, c
ROM:13A5 ral
ROM:13A6 call loc_10D0
ROM:13A9 pop psw
ROM:13AA ret
ROM:13AA ; End of function INT
ROM:13AA
ROM:13AB
ROM:13AB ; =============== S U B R O U T I N E =======================================
ROM:13AB
ROM:13AB ; Вызывается из GETVAR
ROM:13AB
ROM:13AB MACRO5: ; CODE XREF: GETVAR2+FEp
ROM:13AB ; GETVAR2+144p
ROM:13AB
ROM:13AB ; FUNCTION CHUNK AT ROM:0BEE SIZE 00000005 BYTES
ROM:13AB
ROM:13AB lxi h, 0
ROM:13AE mov a, b
ROM:13AF ora c
ROM:13B0 rz
ROM:13B1 mvi a, 10h
ROM:13B3
ROM:13B3 loc_13B3: ; CODE XREF: MACRO5+17j
ROM:13B3 dad h
ROM:13B4 jc loc_BEE
ROM:13B7 xchg
ROM:13B8 dad h
ROM:13B9 xchg
ROM:13BA jnc loc_13C1
ROM:13BD dad b
ROM:13BE jc loc_BEE
ROM:13C1
ROM:13C1 loc_13C1: ; CODE XREF: MACRO5+Fj
ROM:13C1 dcr a
ROM:13C2 jnz loc_13B3
ROM:13C5 ret
ROM:13C5 ; End of function MACRO5
ROM:13C5
ROM:13C6
ROM:13C6 ; =============== S U B R O U T I N E =======================================
ROM:13C6
ROM:13C6 ; Функция читающая число с плавающей точкой из ASCII-текста.
ROM:13C6 ; Читает строку и конвертирует её в число с плавающей точкой в FACCUM.
ROM:13C6
ROM:13C6 FIN: ; CODE XREF: ROM:08BFp
ROM:13C6 ; EVALTERM+5j ...
ROM:13C6
ROM:13C6 ; FUNCTION CHUNK AT ROM:142F SIZE 00000017 BYTES
ROM:13C6 ; FUNCTION CHUNK AT ROM:1451 SIZE 0000000C BYTES
ROM:13C6
ROM:13C6 cpi 2Dh ; '-'
ROM:13C8 push psw
ROM:13C9 jz loc_13D2
ROM:13CC cpi 2Bh ; '+'
ROM:13CE jz loc_13D2
ROM:13D1 dcx h
ROM:13D2
ROM:13D2 loc_13D2: ; CODE XREF: FIN+3j FIN+8j
ROM:13D2 call FZERO ; Устанавливает FACCUM в ноль.
ROM:13D5 mov b, a
ROM:13D6 mov d, a
ROM:13D7 mov e, a
ROM:13D8 cma
ROM:13D9 mov c, a
ROM:13DA
ROM:13DA FINLOOP: ; CODE XREF: FIN+45j FIN+7Dj
ROM:13DA rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:13DA ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:13DA ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:13DB jc PROCESSDIGIT
ROM:13DE cpi 2Eh ; '.'
ROM:13E0 jz loc_140A
ROM:13E3 cpi 45h ; 'E'
ROM:13E5 jnz SCALERESULT
ROM:13E8 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:13E8 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:13E8 ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:13E9 push h
ROM:13EA lxi h, loc_13FE
ROM:13ED xthl
ROM:13EE dcr d
ROM:13EF cpi 0A5h ; 'е' ; Токен __MINUS
ROM:13F1 rz
ROM:13F2 cpi 2Dh ; '-'
ROM:13F4 rz
ROM:13F5 inr d
ROM:13F6 cpi 2Bh ; '+'
ROM:13F8 rz
ROM:13F9 cpi 0A4h ; 'д' ; Токен __PLUS
ROM:13FB rz
ROM:13FC pop psw
ROM:13FD dcx h
ROM:13FE
ROM:13FE loc_13FE: ; CODE XREF: FIN+94j
ROM:13FE ; DATA XREF: FIN+24o
ROM:13FE rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:13FE ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:13FE ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:13FF jc DOEXPONENTDIGIT
ROM:1402 inr d
ROM:1403 jnz SCALERESULT
ROM:1406 xra a
ROM:1407 sub e
ROM:1408 mov e, a
ROM:1409 inr c
ROM:140A
ROM:140A loc_140A: ; CODE XREF: FIN+1Aj
ROM:140A inr c
ROM:140B jz FINLOOP
ROM:140E
ROM:140E SCALERESULT: ; CODE XREF: FIN+1Fj FIN+3Dj
ROM:140E push h
ROM:140F mov a, e
ROM:1410 sub b
ROM:1411
ROM:1411 DECIMALLOOP: ; CODE XREF: FIN:DECIMALLOOPENDj
ROM:1411 cp DECIMALSHIFTUP ; Вспомогательная функция FIN.
ROM:1414 jp DECIMALLOOPEND
ROM:1417 push psw
ROM:1418 call FDIVBYTEN ; Делит FACCUM на 10. Используется в FOUT для представления чисел в нормальном виде при печати.
ROM:141B pop psw
ROM:141C inr a
ROM:141D
ROM:141D DECIMALLOOPEND: ; CODE XREF: FIN+4Ej
ROM:141D jnz DECIMALLOOP
ROM:1420 pop d
ROM:1421 pop psw
ROM:1422 cz FNEGATE ; Меняет знак FACCUM. FACCUM=-FACCUM
ROM:1425 xchg
ROM:1426 ret
ROM:1426 ; End of function FIN
ROM:1426
ROM:1427
ROM:1427 ; =============== S U B R O U T I N E =======================================
ROM:1427
ROM:1427 ; Вспомогательная функция FIN.
ROM:1427
ROM:1427 DECIMALSHIFTUP: ; CODE XREF: FIN:DECIMALLOOPp
ROM:1427 rz
ROM:1427 ; End of function DECIMALSHIFTUP
ROM:1427
ROM:1428
ROM:1428 ; =============== S U B R O U T I N E =======================================
ROM:1428
ROM:1428 ; Вспомогательная функция FIN. Дополнительная точка входа.
ROM:1428
ROM:1428 DECIMALSHIFTUP2: ; CODE XREF: PRINTINT2+32p
ROM:1428 push psw
ROM:1429 call FMULBYTEN ; Умножает FACCUM на 10.
ROM:142C pop psw
ROM:142D dcr a
ROM:142E ret
ROM:142E ; End of function DECIMALSHIFTUP2
ROM:142E
ROM:142F ; ---------------------------------------------------------------------------
ROM:142F ; START OF FUNCTION CHUNK FOR FIN
ROM:142F
ROM:142F PROCESSDIGIT: ; CODE XREF: FIN+15j
ROM:142F push d
ROM:1430 mov d, a
ROM:1431 mov a, b
ROM:1432 adc c
ROM:1433 mov b, a
ROM:1434 push b
ROM:1435 push h
ROM:1436 push d
ROM:1437 call FMULBYTEN ; Умножает FACCUM на 10.
ROM:143A pop psw
ROM:143B sui 30h ; '0'
ROM:143D call FADDPROC ; Прибавляет значение цифры находящейся в A к FACCUM.
ROM:1440 pop h
ROM:1441 pop b
ROM:1442 pop d
ROM:1443 jmp FINLOOP
ROM:1443 ; END OF FUNCTION CHUNK FOR FIN
ROM:1446
ROM:1446 ; =============== S U B R O U T I N E =======================================
ROM:1446
ROM:1446 ; Прибавляет значение цифры находящейся в A к FACCUM.
ROM:1446
ROM:1446 FADDPROC: ; CODE XREF: ROM:11B0p
ROM:1446 ; FIN+77p
ROM:1446 call FPUSH ; Записывает число с плавающей точкой на стек.
ROM:1449 call FCHARTOFLOAT ; Конвертирует знаковое число (байт) в A в число с плавающей точкой в FACCUM.
ROM:144C
ROM:144C FADD: ; DATA XREF: ROM:179Eo
ROM:144C pop b ; FACCUM = FACCUM + BCDEONSTK. Ещё одна точка входа.
ROM:144D pop d
ROM:144E jmp FADD2 ; FACCUM = FACCUM + BCDEONSTK
ROM:144E ; End of function FADDPROC
ROM:144E
ROM:1451 ; ---------------------------------------------------------------------------
ROM:1451 ; START OF FUNCTION CHUNK FOR FIN
ROM:1451
ROM:1451 DOEXPONENTDIGIT: ; CODE XREF: FIN+39j
ROM:1451 mov a, e
ROM:1452 rlc
ROM:1453 rlc
ROM:1454 add e
ROM:1455 rlc
ROM:1456 add m
ROM:1457 sui 30h ; '0'
ROM:1459 mov e, a
ROM:145A jmp loc_13FE
ROM:145A ; END OF FUNCTION CHUNK FOR FIN
ROM:145D
ROM:145D ; =============== S U B R O U T I N E =======================================
ROM:145D
ROM:145D ; Инициализация INITKEYS2
ROM:145D
ROM:145D INITKEYS2TR: ; CODE XREF: CHECKENOUGHMEM+3Cp
ROM:145D push h
ROM:145E lxi h, INITKEYS2 ; " in "
ROM:1461 call MAINTR ; Подпрограмма главного цикла
ROM:1464 pop h
ROM:1464 ; End of function INITKEYS2TR
ROM:1464
ROM:1465
ROM:1465 ; =============== S U B R O U T I N E =======================================
ROM:1465
ROM:1465 ; Переводит целое число HL в число с плавающей точкой FACCUM.
ROM:1465 ; В частности, печатает номер строки Бейсик-программы, выполняющейся в данный момент времени.
ROM:1465
ROM:1465 PRINTINT: ; CODE XREF: PRNTR1-12D9p
ROM:1465 ; INPUTLN+1925p ...
ROM:1465 xchg
ROM:1465 ; End of function PRINTINT
ROM:1465
ROM:1466
ROM:1466 ; =============== S U B R O U T I N E =======================================
ROM:1466
ROM:1466 ; Переводит целое число HL в число с плавающей точкой FACCUM.
ROM:1466 ; Дополнительная точка входа.
ROM:1466
ROM:1466 PRINTINT2: ; CODE XREF: CHECKENOUGHMEM+2Dp
ROM:1466 xra a
ROM:1467 mvi b, 98h ; 'Ш'
ROM:1469 call LONGINT2 ; Получение длинного целого. Дополнительная точка входа.
ROM:146C lxi h, loc_D92
ROM:146F push h
ROM:1470
ROM:1470 FOUT: ; CODE XREF: ROM:07B7p
ROM:1470 ; ROM:0D22p
ROM:1470 lxi h, FBUFFER ; Печатает число с плавающей точкой на терминал.
ROM:1473 push h
ROM:1474 rst 5 ; RST5 = Проверяет состояние FACCUM.
ROM:1474 ; Возвращает A = 0 и устанавливает Z, если FACCUM == 0, хвост функции устанавливает флаг знака и A соответственно
ROM:1474 ; (0xFF если отрицательно, 0x01 если положительно).
ROM:1475 mvi m, 20h ; ' '
ROM:1477 jp DOZERO
ROM:147A mvi m, 2Dh ; '-'
ROM:147C
ROM:147C DOZERO: ; CODE XREF: PRINTINT2+11j
ROM:147C inx h
ROM:147D mvi m, 30h ; '0'
ROM:147F jz NULLTERMPREV
ROM:1482 push h
ROM:1483 cm FNEGATE ; Меняет знак FACCUM. FACCUM=-FACCUM
ROM:1486 xra a
ROM:1487 push psw
ROM:1488 call TOUNDER1000000 ; Делит FACCUM на 10 до тех пор, пока он не станет менее 1000000.
ROM:148B
ROM:148B TOOVER100000: ; CODE XREF: PRINTINT2+36j
ROM:148B lxi b, 9143h
ROM:148E lxi d, 4FF8h
ROM:1491 call FCOMPARE ; Сравнение чисел с плавающей точкой.
ROM:1491 ; Сравнивает FACCUM и BCDE. Результат возвращается в A.
ROM:1491 ; FACCUM > BCDE, A = 0x01.
ROM:1491 ; FACCUM < BCDE, A = 0xFF.
ROM:1491 ; FACCUM = BCDE, A = 0.
ROM:1494 jpo PREPARETOPRINT
ROM:1497 pop psw
ROM:1498 call DECIMALSHIFTUP2 ; Вспомогательная функция FIN. Дополнительная точка входа.
ROM:149B push psw
ROM:149C jmp TOOVER100000
ROM:149F ; ---------------------------------------------------------------------------
ROM:149F
ROM:149F loc_149F: ; CODE XREF: TOUNDER1000000+Aj
ROM:149F call FDIVBYTEN ; Делит FACCUM на 10. Используется в FOUT для представления чисел в нормальном виде при печати.
ROM:14A2 pop psw
ROM:14A3 inr a
ROM:14A4 push psw
ROM:14A5 call TOUNDER1000000 ; Делит FACCUM на 10 до тех пор, пока он не станет менее 1000000.
ROM:14A8
ROM:14A8 PREPARETOPRINT: ; CODE XREF: PRINTINT2+2Ej
ROM:14A8 call FADDONEHALF ; Прибавляет 0.5 к FACCUM.
ROM:14A8 ; Используется DECIMAL_POWERS
ROM:14AB inr a
ROM:14AC call FASINTEGER ; Перевод числа с плавающей точкой в целое.
ROM:14AC ; Возвращает целую часть FACCUM в CDE.
ROM:14AF call FLOADFROMBCDE ; Загружает число в FACCUM из BCDE.
ROM:14B2 lxi b, INITKEYS+1 ; Инициализация переменных.
ROM:14B2 ; Этот блок переностися в ОЗУ по адресу &hF8F0
ROM:14B5 pop psw
ROM:14B6 add c
ROM:14B7 jm loc_14C3
ROM:14BA cpi 7
ROM:14BC jnc loc_14C3
ROM:14BF inr a
ROM:14C0 mov b, a
ROM:14C1 mvi a, 1
ROM:14C3
ROM:14C3 loc_14C3: ; CODE XREF: PRINTINT2+51j
ROM:14C3 ; PRINTINT2+56j
ROM:14C3 dcr a
ROM:14C4 pop h
ROM:14C5 push psw
ROM:14C6 lxi d, DECPOW100000
ROM:14C9
ROM:14C9 NEXTDIGIT: ; CODE XREF: PRINTINT2+90j
ROM:14C9 dcr b
ROM:14CA mvi m, 2Eh ; '.'
ROM:14CC cz INCHLRETURN ; Подпрограмма PRINTINT
ROM:14CF push b
ROM:14D0 push h
ROM:14D1 push d
ROM:14D2 call FCOPYTOBCDE ; Перемещение числа с плавающей точкой из FACCUM в BCDE
ROM:14D5 pop h
ROM:14D6 mvi b, 2Fh ; '/'
ROM:14D8
ROM:14D8 DIGITLOOP: ; CODE XREF: PRINTINT2+80j
ROM:14D8 inr b
ROM:14D9 mov a, e
ROM:14DA sub m
ROM:14DB mov e, a
ROM:14DC inx h
ROM:14DD mov a, d
ROM:14DE sbb m
ROM:14DF mov d, a
ROM:14E0 inx h
ROM:14E1 mov a, c
ROM:14E2 sbb m
ROM:14E3 mov c, a
ROM:14E4 dcx h
ROM:14E5 dcx h
ROM:14E6 jnc DIGITLOOP
ROM:14E9 call FADDMANTISSAS ; Складывает мантиссы, на первую указывает HL вторая содержится в CDE.
ROM:14EC inx h
ROM:14ED
ROM:14ED loc_14ED: ; Загружает число в FACCUM из BCDE.
ROM:14ED call FLOADFROMBCDE
ROM:14F0 xchg
ROM:14F1 pop h
ROM:14F2 mov m, b
ROM:14F3 inx h
ROM:14F4 pop b
ROM:14F5 dcr c
ROM:14F6 jnz NEXTDIGIT
ROM:14F9 dcr b
ROM:14FA jz loc_1509
ROM:14FD
ROM:14FD loc_14FD: ; CODE XREF: PRINTINT2+9Bj
ROM:14FD dcx h
ROM:14FE mov a, m
ROM:14FF cpi 30h ; '0'
ROM:1501 jz loc_14FD
ROM:1504 cpi 2Eh ; '.'
ROM:1506 cnz INCHLRETURN ; Подпрограмма PRINTINT
ROM:1509
ROM:1509 loc_1509: ; CODE XREF: PRINTINT2+94j
ROM:1509 pop psw
ROM:150A jz NULLTERM
ROM:150D mvi m, 45h ; 'E'
ROM:150F inx h
ROM:1510 mvi m, 2Bh ; '+'
ROM:1512 jp loc_1519
ROM:1515 mvi m, 2Dh ; '-'
ROM:1517 cma
ROM:1518 inr a
ROM:1519
ROM:1519 loc_1519: ; CODE XREF: PRINTINT2+ACj
ROM:1519 mvi b, 2Fh ; '/'
ROM:151B
ROM:151B EXPDIGITLOOP: ; CODE XREF: PRINTINT2+B8j
ROM:151B inr b
ROM:151C sui 0Ah
ROM:151E jnc EXPDIGITLOOP
ROM:1521 adi 3Ah ; ':'
ROM:1523 inx h
ROM:1524 mov m, b
ROM:1525
ROM:1525 NULLTERMPREV: ; CODE XREF: PRINTINT2+19j
ROM:1525 inx h
ROM:1526 mov m, a
ROM:1527 inx h
ROM:1528
ROM:1528 NULLTERM: ; CODE XREF: PRINTINT2+A4j
ROM:1528 mov m, c
ROM:1529 pop h
ROM:152A ret
ROM:152A ; End of function PRINTINT2
ROM:152A
ROM:152B
ROM:152B ; =============== S U B R O U T I N E =======================================
ROM:152B
ROM:152B ; Делит FACCUM на 10 до тех пор, пока он не станет менее 1000000.
ROM:152B
ROM:152B TOUNDER1000000: ; CODE XREF: PRINTINT2+22p
ROM:152B ; PRINTINT2+3Fp
ROM:152B lxi b, 9474h
ROM:152E lxi d, 23F7h
ROM:1531 call FCOMPARE ; Сравнение чисел с плавающей точкой.
ROM:1531 ; Сравнивает FACCUM и BCDE. Результат возвращается в A.
ROM:1531 ; FACCUM > BCDE, A = 0x01.
ROM:1531 ; FACCUM < BCDE, A = 0xFF.
ROM:1531 ; FACCUM = BCDE, A = 0.
ROM:1534 pop h
ROM:1535 jpo loc_149F
ROM:1538 pchl
ROM:1538 ; End of function TOUNDER1000000
ROM:1538
ROM:1538 ; ---------------------------------------------------------------------------
ROM:1539 DECIMAL_POWERS: .db 0 ; DATA XREF: FADDONEHALFo
ROM:1539 ; ROM:1557o
ROM:153A ONEHALF: .db 0, 0, 80h
ROM:153D DECPOW100000: .db 0A0h, 86h, 1 ; DATA XREF: PRINTINT2+60o
ROM:1540 DECPOW10000: .db 10h, 27h, 0
ROM:1543 DECPOW1000: .db 0E8h, 3, 0
ROM:1546 DECPOW100: .db 64h, 0, 0
ROM:1549 DECPOW10: .db 0Ah, 0, 0
ROM:154C DECPOW1: .db 1, 0, 0
ROM:154F
ROM:154F ; =============== S U B R O U T I N E =======================================
ROM:154F
ROM:154F ; Вызов FNEGATE
ROM:154F
ROM:154F FNEGATE2: ; CODE XREF: ROM:1589p
ROM:154F ; ROM:16D9p
ROM:154F lxi h, FNEGATE ; Меняет знак FACCUM. FACCUM=-FACCUM
ROM:1552 xthl
ROM:1553 pchl
ROM:1553 ; End of function FNEGATE2
ROM:1553
ROM:1554 ; ---------------------------------------------------------------------------
ROM:1554
ROM:1554 SQR: ; Бейсик-функция SQR
ROM:1554 call FPUSH
ROM:1557 lxi h, DECIMAL_POWERS
ROM:155A call FLOADFROMMEM ; Загружает FACCUM числом с плавающей точкой из ячеек памяти, на которые указывает HL.
ROM:155A ;
ROM:155D pop b
ROM:155E pop d
ROM:155F rst 5 ; RST5 = Проверяет состояние FACCUM.
ROM:155F ; Возвращает A = 0 и устанавливает Z, если FACCUM == 0, хвост функции устанавливает флаг знака и A соответственно
ROM:155F ; (0xFF если отрицательно, 0x01 если положительно).
ROM:1560 jz EXP ; Бейсик-функция EXP
ROM:1563 mov a, b
ROM:1564 ora a
ROM:1565 jz loc_10E9
ROM:1568 push d
ROM:1569 push b
ROM:156A mov a, c
ROM:156B ori 7Fh
ROM:156D call FCOPYTOBCDE ; Перемещение числа с плавающей точкой из FACCUM в BCDE
ROM:1570 jp loc_1581
ROM:1573 push d
ROM:1574 push b
ROM:1575 call INT ; Бейсик-функция INT.
ROM:1578 pop b
ROM:1579 pop d
ROM:157A push psw
ROM:157B call FCOMPARE ; Сравнение чисел с плавающей точкой.
ROM:157B ; Сравнивает FACCUM и BCDE. Результат возвращается в A.
ROM:157B ; FACCUM > BCDE, A = 0x01.
ROM:157B ; FACCUM < BCDE, A = 0xFF.
ROM:157B ; FACCUM = BCDE, A = 0.
ROM:157E pop h
ROM:157F mov a, h
ROM:1580 rar
ROM:1581
ROM:1581 loc_1581: ; CODE XREF: ROM:1570j
ROM:1581 pop h
ROM:1582 shld FACCUM+2 ; Аккумулятор для вычислений с плавающей точкой:
ROM:1582 ; 00000000 1 11111111111111111111111
ROM:1582 ; -------- - -----------------------
ROM:1582 ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:1585 pop h
ROM:1586 shld FACCUM ; Аккумулятор для вычислений с плавающей точкой:
ROM:1586 ; 00000000 1 11111111111111111111111
ROM:1586 ; -------- - -----------------------
ROM:1586 ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:1589 cc FNEGATE2 ; Вызов FNEGATE
ROM:158C cz FNEGATE ; Меняет знак FACCUM. FACCUM=-FACCUM
ROM:158F push d
ROM:1590 push b
ROM:1591 call LOG ; Обработка Бейсик-функции LOG.
ROM:1594 pop b
ROM:1595 pop d
ROM:1596 call FMUL3 ; Обработка FACCUM = FACCUM * BCDEONSTK
ROM:1599
ROM:1599 EXP: ; CODE XREF: ROM:1560j
ROM:1599 call FPUSH ; Бейсик-функция EXP
ROM:159C lxi b, 8138h
ROM:159F lxi d, 0AA3Bh
ROM:15A2 call FMUL3 ; Обработка FACCUM = FACCUM * BCDEONSTK
ROM:15A5 lda FACCUM+3 ; Аккумулятор для вычислений с плавающей точкой:
ROM:15A5 ; 00000000 1 11111111111111111111111
ROM:15A5 ; -------- - -----------------------
ROM:15A5 ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:15A8 cpi 88h ; 'И'
ROM:15AA jnc loc_12A8
ROM:15AD call INT ; Бейсик-функция INT.
ROM:15B0 adi 80h ; 'А'
ROM:15B2 adi 2
ROM:15B4 jc loc_12A8
ROM:15B7 push psw
ROM:15B8 lxi h, loc_116D
ROM:15BB call loc_1073
ROM:15BE call FMUL2 ; FACCUM = FACCUM * BCDEONSTK
ROM:15C1 pop psw
ROM:15C2 pop b
ROM:15C3 pop d
ROM:15C4 push psw
ROM:15C5 call loc_107F
ROM:15C8 call FNEGATE ; Меняет знак FACCUM. FACCUM=-FACCUM
ROM:15CB lxi h, TAB1 ; Системная таблица. Используется функцией EXP.
ROM:15CE call loc_1609
ROM:15D1 lxi d, 0
ROM:15D4 pop b
ROM:15D5 mov c, d
ROM:15D6 jmp FMUL3 ; Обработка FACCUM = FACCUM * BCDEONSTK
ROM:15D6 ; ---------------------------------------------------------------------------
ROM:15D9 TAB1: .db 8, 40h, 2Eh, 94h, 74h, 70h, 4Fh, 2Eh, 77h, 6Eh, 2
ROM:15D9 ; DATA XREF: ROM:15CBo
ROM:15D9 .db 88h, 7Ah, 0E6h, 0A0h, 2Ah, 7Ch, 50h, 0AAh, 0AAh, 7Eh ; Системная таблица. Используется функцией EXP.
ROM:15D9 .db 0FFh, 0FFh, 7Fh, 7Fh, 0, 0, 80h, 81h, 0, 0, 0, 81h
ROM:15FA ; ---------------------------------------------------------------------------
ROM:15FA
ROM:15FA loc_15FA: ; CODE XREF: ROM:11A3p
ROM:15FA ; SIN+3Dj ...
ROM:15FA call FPUSH ; Записывает число с плавающей точкой на стек.
ROM:15FD lxi d, 11BAh
ROM:1600 push d
ROM:1601 push h
ROM:1602 call FCOPYTOBCDE ; Перемещение числа с плавающей точкой из FACCUM в BCDE
ROM:1605 call FMUL3 ; Обработка FACCUM = FACCUM * BCDEONSTK
ROM:1608 pop h
ROM:1609
ROM:1609 loc_1609: ; CODE XREF: ROM:15CEp
ROM:1609 call FPUSH ; Записывает число с плавающей точкой на стек.
ROM:160C mov a, m
ROM:160D inx h
ROM:160E call FLOADFROMMEM ; Загружает FACCUM числом с плавающей точкой из ячеек памяти, на которые указывает HL.
ROM:160E ;
ROM:1611
ROM:1611 loc_1611: ; CODE XREF: ROM:1627j
ROM:1611 mvi b, 0F1h ; 'ё'
ROM:1613 pop b
ROM:1614 pop d
ROM:1615 dcr a
ROM:1616 rz
ROM:1617 push d
ROM:1618 push b
ROM:1619 push psw
ROM:161A push h
ROM:161B call FMUL3 ; Обработка FACCUM = FACCUM * BCDEONSTK
ROM:161E pop h
ROM:161F call FLOADBCDEFROMMEM ; Загружает число с плавающей точкой в BCDE из ячеек памяти, на которые указывает HL.
ROM:161F ; Т. е. загрузка из M в BCDE
ROM:1622 push h
ROM:1623 call FADD2 ; FACCUM = FACCUM + BCDEONSTK
ROM:1626 pop h
ROM:1627 jmp loc_1611+1 ; loc_1611+1:POP PSW
ROM:162A ; ---------------------------------------------------------------------------
ROM:162A
ROM:162A RND: ; Бейсик-функция RND
ROM:162A rst 5
ROM:162B jm loc_1647
ROM:162E lxi h, loc_F87A
ROM:1631 call FLOADFROMMEM ; Загружает FACCUM числом с плавающей точкой из ячеек памяти, на которые указывает HL.
ROM:1631 ;
ROM:1634 rz
ROM:1635 lxi b, 9835h
ROM:1638 lxi d, 447Ah
ROM:163B call FMUL3 ; Обработка FACCUM = FACCUM * BCDEONSTK
ROM:163E lxi b, 6828h
ROM:1641 lxi d, 0B146h
ROM:1644 call FADD2 ; FACCUM = FACCUM + BCDEONSTK
ROM:1647
ROM:1647 loc_1647: ; CODE XREF: ROM:162Bj
ROM:1647 call FCOPYTOBCDE ; Перемещение числа с плавающей точкой из FACCUM в BCDE
ROM:164A mov a, e
ROM:164B mov e, c
ROM:164C mov c, a
ROM:164D mvi m, 80h ; 'А'
ROM:164F dcx h
ROM:1650 mov b, m
ROM:1651 mvi m, 80h ; 'А'
ROM:1653 call loc_10D3
ROM:1656 lxi h, loc_F87A
ROM:1659 jmp FCOPYTOMEM ; Копирование числа с плавающей точкой в память, на которую указывает HL
ROM:165C ; ---------------------------------------------------------------------------
ROM:165C mov d, d
ROM:165D rst 0 ; RST0 = старт. ОЗУ при этом инициализируется, но не очищается.
ROM:165D ; Т. е. если сделать POKE 50000, 255 а потом X=USR(0), то в памяти по адресу 50000 так и останется лежать байт 255.
ROM:165D ; При этом, конечно, рабочие области подлежат инициализации, как и упоминалось.
ROM:165E mov c, a
ROM:165F add b
ROM:1660
ROM:1660 ; =============== S U B R O U T I N E =======================================
ROM:1660
ROM:1660 ; Бейсик-функция COS
ROM:1660
ROM:1660 COS: ; CODE XREF: ROM:16D2p
ROM:1660 lxi h, COST ; Константа, использующаяся при расчёте косинуса.
ROM:1663 call loc_1073
ROM:1663 ; End of function COS
ROM:1663
ROM:1666
ROM:1666 ; =============== S U B R O U T I N E =======================================
ROM:1666
ROM:1666 ; Бейсик-функция SIN
ROM:1666
ROM:1666 SIN: ; CODE XREF: ROM:16C6p
ROM:1666 call FPUSH ; Записывает число с плавающей точкой на стек.
ROM:1669 lxi b, 8349h
ROM:166C lxi d, 0FDBh
ROM:166F call FLOADFROMBCDE ; Загружает число в FACCUM из BCDE.
ROM:1672 pop b
ROM:1673 pop d
ROM:1674 call loc_121A
ROM:1677 call FPUSH ; Записывает число с плавающей точкой на стек.
ROM:167A call INT ; Бейсик-функция INT.
ROM:167D pop b
ROM:167E pop d
ROM:167F call loc_107F
ROM:1682 lxi h, SINT ; Константа, использующаяся при расчёте синуса.
ROM:1685 call FSUB2 ; FACCUM = FACCUM - BCDEONSTK
ROM:1688 rst 5 ; RST5 = Проверяет состояние FACCUM.
ROM:1688 ; Возвращает A = 0 и устанавливает Z, если FACCUM == 0, хвост функции устанавливает флаг знака и A соответственно
ROM:1688 ; (0xFF если отрицательно, 0x01 если положительно).
ROM:1689 stc
ROM:168A jp loc_1692
ROM:168D call FADDONEHALF ; Прибавляет 0.5 к FACCUM.
ROM:168D ; Используется DECIMAL_POWERS
ROM:1690 rst 5 ; RST5 = Проверяет состояние FACCUM.
ROM:1690 ; Возвращает A = 0 и устанавливает Z, если FACCUM == 0, хвост функции устанавливает флаг знака и A соответственно
ROM:1690 ; (0xFF если отрицательно, 0x01 если положительно).
ROM:1691 ora a
ROM:1692
ROM:1692 loc_1692: ; CODE XREF: SIN+24j
ROM:1692 push psw
ROM:1693 cp FNEGATE ; Меняет знак FACCUM. FACCUM=-FACCUM
ROM:1696 lxi h, SINT ; Константа, использующаяся при расчёте синуса.
ROM:1699 call loc_1073
ROM:169C pop psw
ROM:169D cnc FNEGATE ; Меняет знак FACCUM. FACCUM=-FACCUM
ROM:16A0 lxi h, SINT2 ; Константа, использующаяся при расчёте синуса.
ROM:16A3 jmp loc_15FA
ROM:16A3 ; End of function SIN
ROM:16A3
ROM:16A3 ; ---------------------------------------------------------------------------
ROM:16A6 COST: .db 0DBh ; - ; DATA XREF: COSo ROM:16F9o
ROM:16A6 ; Константа, использующаяся при расчёте косинуса.
ROM:16A7 .db 0Fh
ROM:16A8 .db 49h ; I
ROM:16A9 .db 81h ; Б
ROM:16AA SINT: .db 0 ; DATA XREF: SIN+1Co SIN+30o
ROM:16AA ; Константа, использующаяся при расчёте синуса.
ROM:16AB .db 0
ROM:16AC .db 0
ROM:16AD .db 7Fh ;
ROM:16AE SINT2: .db 5 ; DATA XREF: SIN+3Ao
ROM:16AE ; Константа, использующаяся при расчёте синуса.
ROM:16AF TAYLOR_SERIES: .db 0BAh, 0D7h, 1Eh, 86h, 64h, 26h, 99h, 87h, 58h, 34h ; Серия Тейлора
ROM:16AF .db 23h, 87h, 0E0h, 5Dh, 0A5h, 86h, 0DAh, 0Fh, 49h, 83h
ROM:16C3 ; ---------------------------------------------------------------------------
ROM:16C3
ROM:16C3 TAN: ; Бейсик-функция TAN
ROM:16C3 call FPUSH
ROM:16C6 call SIN ; Бейсик-функция SIN
ROM:16C9 pop b
ROM:16CA pop h
ROM:16CB call FPUSH ; Записывает число с плавающей точкой на стек.
ROM:16CE xchg
ROM:16CF call FLOADFROMBCDE ; Загружает число в FACCUM из BCDE.
ROM:16D2 call COS ; Бейсик-функция COS
ROM:16D5 jmp FDIV ; FACCUM = FACCUM / BCDEONSTK
ROM:16D8 ; ---------------------------------------------------------------------------
ROM:16D8
ROM:16D8 ATN: ; Бейсик-функция ATN
ROM:16D8 rst 5
ROM:16D9 cm FNEGATE2 ; Вызов FNEGATE
ROM:16DC cm FNEGATE ; Меняет знак FACCUM. FACCUM=-FACCUM
ROM:16DF lda FACCUM+3 ; Аккумулятор для вычислений с плавающей точкой:
ROM:16DF ; 00000000 1 11111111111111111111111
ROM:16DF ; -------- - -----------------------
ROM:16DF ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:16E2 cpi 81h ; 'Б'
ROM:16E4 jc loc_16F3
ROM:16E7 lxi b, 8100h
ROM:16EA mov d, c
ROM:16EB mov e, c
ROM:16EC call loc_121A
ROM:16EF lxi h, FSUB2 ; FACCUM = FACCUM - BCDEONSTK
ROM:16F2 push h
ROM:16F3
ROM:16F3 loc_16F3: ; CODE XREF: ROM:16E4j
ROM:16F3 lxi h, ATNT
ROM:16F6 call loc_15FA
ROM:16F9 lxi h, COST ; Константа, использующаяся при расчёте косинуса.
ROM:16FC ret
ROM:16FC ; ---------------------------------------------------------------------------
ROM:16FD ATNT: .db 9 ; DATA XREF: ROM:loc_16F3o
ROM:16FE .db 4Ah
ROM:16FF .db 0D7h
ROM:1700 KEYSTAB: .db 3Bh, 78h, 2, 6Eh, 84h, 7Bh, 0FEh, 0C1h, 2Fh, 7Ch, 74h
ROM:1700 ; DATA XREF: KEYSOFF2+5o
ROM:1700 .db 31h, 9Ah, 7Dh, 84h, 3Dh, 5Ah, 7Dh, 0C8h, 7Fh, 91h ; Системная таблица обработчика функциональных клавиш.
ROM:1700 .db 7Eh, 0E4h, 0BBh, 4Ch, 7Eh, 6Ch, 0AAh, 0AAh, 7Fh, 0
ROM:1700 .db 0, 0, 81h, 0, 0
ROM:1724 ; ---------------------------------------------------------------------------
ROM:1724
ROM:1724 PEEK: ; Обработка Бейсик оператора PEEK
ROM:1724 rst 5
ROM:1725 call INTFROMFLOAT ; После этого вызова в DE у нас адрес
ROM:1728 ldax d ; Тут собственно и есть фунцкия PEEK. В A попадает нужный байт.
ROM:1729 jmp SHORTINT ; Получение короткого целого из A
ROM:172C ; ---------------------------------------------------------------------------
ROM:172C
ROM:172C POKE: ; Обработка Бейсик оператора POKE
ROM:172C call EVALEXPRESSION
ROM:172F rst 5 ; RST5 = Проверяет состояние FACCUM.
ROM:172F ; Возвращает A = 0 и устанавливает Z, если FACCUM == 0, хвост функции устанавливает флаг знака и A соответственно
ROM:172F ; (0xFF если отрицательно, 0x01 если положительно).
ROM:1730 call INTFROMFLOAT ; После этого вызова в DE у нас адрес
ROM:1733 jmp loc_1067
ROM:1736 ; ---------------------------------------------------------------------------
ROM:1736
ROM:1736 USR: ; Бейсик-оператор USR
ROM:1736 rst 5
ROM:1737 call INTFROMFLOAT ; Получение целого числа из числа с плавающей точкой
ROM:173A xchg
ROM:173B call USRTR ; Подпрограмма USR
ROM:173E jmp SHORTINT ; Получение короткого целого из A
ROM:1741
ROM:1741 ; =============== S U B R O U T I N E =======================================
ROM:1741
ROM:1741 ; Подпрограмма USR
ROM:1741
ROM:1741 USRTR: ; CODE XREF: ROM:173Bp
ROM:1741 pchl
ROM:1741 ; End of function USRTR
ROM:1741
ROM:1742 ; ---------------------------------------------------------------------------
ROM:1742 ; START OF FUNCTION CHUNK FOR START
ROM:1742
ROM:1742 INIT2: ; CODE XREF: START+29A1j
ROM:1742 mvi a, 2Ch ; ','
ROM:1744 sta PRNOP ; Временная переменная. Используется TOKENIZE, INPUTLN, START.
ROM:1747 xra a
ROM:1748 sta 4000h
ROM:174B lxi h, PROMPT ; Начальная заставка.
ROM:174E mvi a, 2
ROM:1750 call EDIT ; A=флажки, HL=адрес, D=строка курсора, E=позиция курсора
ROM:1750 ; (A=0 редактирование
ROM:1750 ; A=1 установка курсора
ROM:1750 ; A=2 вывод текста на экран с текущего положения курсора
ROM:1750 ; A=3 установка курсора и вывод текста
ROM:1750 ; A=4 вывод строк)
ROM:1753 call NEW2 ; Сброс бейсик-программы к исходному состоянию
ROM:1753 ; Дополнительная точка входа.
ROM:1756 jmp MAINLOOP3 ; Третья точка входа в главный цикл. Переход из INIT2, STOP, CSAVE, OUTCHAR2, INPUTLN
ROM:1756 ; END OF FUNCTION CHUNK FOR START
ROM:1756 ; ---------------------------------------------------------------------------
ROM:1759 PROMPT: .db 0Ch, 'Ё', 'ы', '8', '0', '0', '0', ' ', 'B', 'A', 'S'
ROM:1759 ; DATA XREF: START+174Bo
ROM:1759 .db 'I', 'C', ' ', ' ', '1', '9', '8', '7', ' ', ' ', '+' ; Начальная заставка.
ROM:1759 .db '+', 'T', 'L', 'г', 'T', ' ', '1', '.', '2', 0Dh, 0Ah
ROM:1759 .db '4', '6', '8', '7', '3', ' ', 'B', 'y', 't', 'e', 's'
ROM:1759 .db ' ', 'f', 'r', 'e', 'e', 0Dh, 0Ah, 0
ROM:178D ; ---------------------------------------------------------------------------
ROM:178D ; START OF FUNCTION CHUNK FOR EVALTERM
ROM:178D
ROM:178D loc_178D: ; CODE XREF: EVALTERM+64j
ROM:178D jc loc_A65
ROM:1790 cpi 3Fh ; '?'
ROM:1792 jc loc_A4C
ROM:1795 cpi 4Fh ; 'O'
ROM:1797 jc loc_A68
ROM:179A jmp SYNTAXERROR ; Самая распространённая ошибка №2
ROM:179A ; END OF FUNCTION CHUNK FOR EVALTERM
ROM:179A ; ---------------------------------------------------------------------------
ROM:179D KW_ARITH_OP_FNS:.db 79h ; y ; DATA XREF: COMPUTE2+4Eo
ROM:179D ; FADD = 144C
ROM:179E .dw FADD ; FACCUM = FACCUM + BCDEONSTK. Ещё одна точка входа.
ROM:17A0 .db 79h ; y ; FSUB = 107D
ROM:17A1 .dw loc_107C+1 ; FACCUM = FACCUM - BCDEONSTK
ROM:17A1 ;
ROM:17A1 ; 107D:FSUB:POP B
ROM:17A1 ; POP D
ROM:17A3 .db 7Bh ; { ; FMUL = 11BA
ROM:17A4 .dw loc_11B9+1 ; FACCUM = FACCUM * BCDEONSTK
ROM:17A4 ;
ROM:17A4 ; 11BA:FMUL:POP B
ROM:17A4 ; POP D
ROM:17A6 .db 7Bh ; { ; FDIV = 1218
ROM:17A7 .dw FDIV ; FACCUM = FACCUM / BCDEONSTK
ROM:17A9 ; ---------------------------------------------------------------------------
ROM:17A9 mov a, a
ROM:17AA mov e, l
ROM:17AB dcr d
ROM:17AC mov d, b
ROM:17AD mov m, a
ROM:17AE ldax b
ROM:17AF mov b, m
ROM:17B0 hlt
ROM:17B1 ldax b
ROM:17B2
ROM:17B2 LOCATE: ; Бейсик оператор LOCATE
ROM:17B2 call GETINTPARAM
ROM:17B5 mov e, a
ROM:17B6 push d
ROM:17B7 rst 1 ; RST1 = проверка синтаксиса.
ROM:17B7 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:17B7 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:17B7 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:17B7 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:17B8 inr l
ROM:17B9 call GETINTPARAM ; Получаем в A целочисленный параметр для команды Бейсика
ROM:17BC pop d
ROM:17BD mov d, a
ROM:17BE mvi a, 1
ROM:17C0 push h
ROM:17C1 call EDIT ; A=флажки, HL=адрес, D=строка курсора, E=позиция курсора
ROM:17C1 ; (A=0 редактирование
ROM:17C1 ; A=1 установка курсора
ROM:17C1 ; A=2 вывод текста на экран с текущего положения курсора
ROM:17C1 ; A=3 установка курсора и вывод текста
ROM:17C1 ; A=4 вывод строк)
ROM:17C4 pop h
ROM:17C5 ret
ROM:17C6 ; ---------------------------------------------------------------------------
ROM:17C6
ROM:17C6 CLS: ; Бейсик-оператор CLS
ROM:17C6 push h
ROM:17C7 mvi a, 0Ch
ROM:17C9 rst 3 ; RST3 = печатает символ из A на экран.
ROM:17CA pop h
ROM:17CB ret
ROM:17CC ; ---------------------------------------------------------------------------
ROM:17CC ; START OF FUNCTION CHUNK FOR TOKENIZE
ROM:17CC
ROM:17CC loc_17CC: ; CODE XREF: TOKENIZE-19F5j
ROM:17CC jz loc_42C
ROM:17CF ori 20h
ROM:17D1 cmp m
ROM:17D2 jz loc_42C
ROM:17D5 ldax d
ROM:17D6 jmp loc_460
ROM:17D6 ; END OF FUNCTION CHUNK FOR TOKENIZE
ROM:17D9 ; ---------------------------------------------------------------------------
ROM:17D9 ; START OF FUNCTION CHUNK FOR PRNTR1
ROM:17D9
ROM:17D9 loc_17D9: ; CODE XREF: PRNTR1-12B4j
ROM:17D9 jp loc_530
ROM:17DC ani 7Fh
ROM:17DE jmp loc_2230
ROM:17DE ; END OF FUNCTION CHUNK FOR PRNTR1
ROM:17E1
ROM:17E1 ; =============== S U B R O U T I N E =======================================
ROM:17E1
ROM:17E1 ; Подпрограмма обработчика печати
ROM:17E1
ROM:17E1 PRNTR1: ; CODE XREF: PRNTR1:loc_511p
ROM:17E1 ; PRNTR1:loc_17F0p
ROM:17E1
ROM:17E1 ; FUNCTION CHUNK AT ROM:04F7 SIZE 0000003E BYTES
ROM:17E1 ; FUNCTION CHUNK AT ROM:17D9 SIZE 00000008 BYTES
ROM:17E1 ; FUNCTION CHUNK AT ROM:17EB SIZE 00000010 BYTES
ROM:17E1 ; FUNCTION CHUNK AT ROM:2230 SIZE 00000010 BYTES
ROM:17E1
ROM:17E1 rst 3 ; RST3 = печатает символ из A на экран.
ROM:17E2 mov a, m
ROM:17E3 ora a
ROM:17E4 inx h
ROM:17E5 rnz
ROM:17E6 inx sp
ROM:17E7 inx sp
ROM:17E8 jmp loc_4F7
ROM:17E8 ; End of function PRNTR1
ROM:17E8
ROM:17EB ; ---------------------------------------------------------------------------
ROM:17EB ; START OF FUNCTION CHUNK FOR PRNTR1
ROM:17EB
ROM:17EB loc_17EB: ; CODE XREF: PRNTR1-12D3j
ROM:17EB ; PRNTR1-12CDj
ROM:17EB cpi 22h ; '"'
ROM:17ED jnz loc_511
ROM:17F0
ROM:17F0 loc_17F0: ; CODE XREF: PRNTR1+14j
ROM:17F0 call PRNTR1 ; Подпрограмма обработчика печати
ROM:17F3 cpi 22h ; '"'
ROM:17F5 jnz loc_17F0
ROM:17F8 jmp loc_511
ROM:17F8 ; END OF FUNCTION CHUNK FOR PRNTR1
ROM:17FB
ROM:17FB ; =============== S U B R O U T I N E =======================================
ROM:17FB
ROM:17FB ; Рисование точки белым цветом (FD90 координата X, FD91 координата Y)
ROM:17FB
ROM:17FB PRESETWT2: ; CODE XREF: PRESETWTj
ROM:17FB ; ROM:1BD0p ...
ROM:17FB
ROM:17FB ; FUNCTION CHUNK AT ROM:1829 SIZE 00000003 BYTES
ROM:17FB
ROM:17FB mvi b, 10h
ROM:17FD jmp loc_180C
ROM:1800 ; ---------------------------------------------------------------------------
ROM:1800
ROM:1800 PRESET: ; Обработка Бейсик оператора PRESET
ROM:1800 inx h
ROM:1801 lxi b, X1 ; Первый графический курсор, координата X
ROM:1804 call PSETTR ; Обработка PSET/PRESET/LINE. Получение всех параметров.
ROM:1804 ; Есть ли токен STEP. Заполняем PSETX, PSETY. Указал ли цвет и если да, то читаем его.
ROM:1807 jz loc_1829
ROM:180A mvi b, 11h
ROM:180C
ROM:180C loc_180C: ; CODE XREF: PRESETWT2+2j
ROM:180C lda PSETC ; Цвет точки у команды PSET
ROM:180F sta PRESETC ; Временное значение цвета для команды PRESET
ROM:1812 mov a, b
ROM:1813 sta PSETC ; Цвет точки у команды PSET
ROM:1816 call PSET_ASM ; Тут ассемблерная обработка команды PSET. Все параметры получены.
ROM:1819 push psw
ROM:181A lda PRESETC ; Временное значение цвета для команды PRESET
ROM:181D sta PSETC ; Цвет точки у команды PSET
ROM:1820 pop psw
ROM:1821 ret
ROM:1821 ; End of function PRESETWT2
ROM:1821
ROM:1822 ; ---------------------------------------------------------------------------
ROM:1822
ROM:1822 PSET: ; Обработка Бейсик оператора PSET
ROM:1822 inx h
ROM:1823 lxi b, X1 ; Первый графический курсор, координата X
ROM:1826 call PSETTR ; Обработка PSET/PRESET/LINE. Получение всех параметров.
ROM:1826 ; Есть ли токен STEP. Заполняем PSETX, PSETY. Указал ли цвет и если да, то читаем его.
ROM:1829 ; START OF FUNCTION CHUNK FOR PRESETWT2
ROM:1829
ROM:1829 loc_1829: ; CODE XREF: PRESETWT2+Cj
ROM:1829 cz PSETCLR ; Обрабатываем параметр цвет у команды PSET
ROM:1829 ; END OF FUNCTION CHUNK FOR PRESETWT2
ROM:182C
ROM:182C ; =============== S U B R O U T I N E =======================================
ROM:182C
ROM:182C ; Тут ассемблерная обработка команды PSET. Все параметры получены.
ROM:182C
ROM:182C PSET_ASM: ; CODE XREF: PRESETWT2+1Bp
ROM:182C ; LINE_ASM+6Bp
ROM:182C push h
ROM:182D lhld X1 ; Первый графический курсор, координата X
ROM:1830 mov a, h
ROM:1831 cpi 0C0h ; 'L' ; Сравниваем координату с 192 (&hC0)
ROM:1833 jnc loc_1876
ROM:1836 ani 0F8h
ROM:1838 rrc
ROM:1839 rrc
ROM:183A rrc
ROM:183B mov d, a
ROM:183C mov a, h
ROM:183D ani 7
ROM:183F mov e, a
ROM:1840 mov a, l
ROM:1841 ani 0F8h
ROM:1843 ora e
ROM:1844 mov e, a
ROM:1845 mov a, l
ROM:1846 call PSETBIT ; Обработка отдельного бита в команде PSET
ROM:1849 lda PSETC ; Цвет точки у команды PSET
ROM:184C mov c, a
ROM:184D lhld GTBL1 ; Адрес таблицы точек изображения в режиме 2
ROM:1850 dad d
ROM:1851 mov d, h
ROM:1852 mov e, l
ROM:1853 cpi 10h ; Цветов всего 15
ROM:1855 push d
ROM:1856 call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM).
ROM:1859 mov d, a
ROM:185A mov a, b
ROM:185B jc loc_1867
ROM:185E jz loc_1878
ROM:1861 cma
ROM:1862 ana d
ROM:1863 mov m, a
ROM:1864 jmp loc_1874
ROM:1867 ; ---------------------------------------------------------------------------
ROM:1867
ROM:1867 loc_1867: ; CODE XREF: PSET_ASM+2Fj
ROM:1867 ora d
ROM:1868 mov m, a
ROM:1869 mov a, h
ROM:186A xri 20h
ROM:186C mov h, a
ROM:186D call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM).
ROM:1870 ani 0F0h
ROM:1872 ora c
ROM:1873 mov m, a
ROM:1874
ROM:1874 loc_1874: ; CODE XREF: PSET_ASM+38j
ROM:1874 ; PSET_ASM+54j
ROM:1874 mov a, d
ROM:1875 pop d
ROM:1876
ROM:1876 loc_1876: ; CODE XREF: PSET_ASM+7j
ROM:1876 ; LINE_ASM+32j ...
ROM:1876 pop h
ROM:1877 ret
ROM:1878 ; ---------------------------------------------------------------------------
ROM:1878
ROM:1878 loc_1878: ; CODE XREF: PSET_ASM+32j
ROM:1878 mov a, h
ROM:1879 xri 20h
ROM:187B mov h, a
ROM:187C call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM).
ROM:187F mov c, a
ROM:1880 jmp loc_1874
ROM:1880 ; End of function PSET_ASM
ROM:1880
ROM:1880 ; ---------------------------------------------------------------------------
ROM:1883 BITS80: .db 10000000b ; DATA XREF: PSETBIT+5o
ROM:1884 BITS40: .db 1000000b
ROM:1885 BITS20: .db 100000b
ROM:1886 BITS10: .db 10000b
ROM:1887 BITS08: .db 1000b
ROM:1888 BITS04: .db 100b
ROM:1889 BITS02: .db 10b
ROM:188A BITS01: .db 1
ROM:188B ; ---------------------------------------------------------------------------
ROM:188B
ROM:188B SAVE: ; Обработка оператора SAVE
ROM:188B call TAPE2
ROM:188E push h
ROM:188F mvi a, 81h ; 'Б'
ROM:1891 call SALOTR ; Подпрограмма обработки ленточных команд SAVE, LOAD и CSAVE, CLOAD и BSAVE, BLOAD
ROM:1894 mvi a, 1
ROM:1896 sta TERMINAL_X ; Переменная, контролирующая текущую X позицию вывода терминала.
ROM:1899 lxi h, IOBUF ; Буфер ввода-вывода (диск, кассеты)
ROM:189C shld OUTTMP ; Временная переменная редактора
ROM:189F xra a
ROM:18A0 mov m, a
ROM:18A1 pop h
ROM:18A2 jmp LIST ; Обработка бейсик-команды LIST
ROM:18A5 ; ---------------------------------------------------------------------------
ROM:18A5
ROM:18A5 CSAVE: ; Обработка оператора CSAVE
ROM:18A5 call TAPE2
ROM:18A8 push h
ROM:18A9 lhld ENBASPRG ; Адрес конца Бейсик программы.
ROM:18A9 ; Указывает на первую ячейку участка памяти, доступного программам.
ROM:18A9 ; Всегда следует за последним байтом программы.
ROM:18AC xchg
ROM:18AD lhld BGBASPRG ; Адрес начала Бейсик программы
ROM:18B0 call MACRO4
ROM:18B3 lhld BGBASPRG ; Адрес начала Бейсик программы
ROM:18B6 mvi a, 83h ; 'Г'
ROM:18B8
ROM:18B8 loc_18B8: ; CODE XREF: ROM:18D1j
ROM:18B8 ; ROM:19A6j ...
ROM:18B8 call SALOTR ; Подпрограмма обработки ленточных команд SAVE, LOAD и CSAVE, CLOAD и BSAVE, BLOAD
ROM:18BB ei
ROM:18BC shld INTAR+4 ; Рабочая область обработки прерываний
ROM:18BF pop h
ROM:18C0 jc MAINLOOP3 ; Третья точка входа в главный цикл. Переход из INIT2, STOP, CSAVE, OUTCHAR2, INPUTLN
ROM:18C3 ret
ROM:18C4 ; ---------------------------------------------------------------------------
ROM:18C4
ROM:18C4 CLOAD: ; Обработка оператора CLOAD
ROM:18C4 call TAPE
ROM:18C7 lxi d, loc_18D4
ROM:18CA push d
ROM:18CB push h
ROM:18CC lhld BGBASPRG ; Адрес начала Бейсик программы
ROM:18CF mvi a, 3
ROM:18D1 jmp loc_18B8
ROM:18D4 ; ---------------------------------------------------------------------------
ROM:18D4
ROM:18D4 loc_18D4: ; DATA XREF: ROM:18C7o
ROM:18D4 lda CASCMP ; Флаг сравнения
ROM:18D7 ana a
ROM:18D8 rz
ROM:18D9 xchg
ROM:18DA lhld INTAR+4 ; Рабочая область обработки прерываний
ROM:18DD lxi b, TMPBUF+11Dh ; Временный буфер CLOAD
ROM:18E0 dad b
ROM:18E1 shld ENBASPRG ; Адрес конца Бейсик программы.
ROM:18E1 ; Указывает на первую ячейку участка памяти, доступного программам.
ROM:18E1 ; Всегда следует за последним байтом программы.
ROM:18E4 xchg
ROM:18E5 ret
ROM:18E6
ROM:18E6 ; =============== S U B R O U T I N E =======================================
ROM:18E6
ROM:18E6 ; Подготавливаем параметры для LINE
ROM:18E6
ROM:18E6 LINETR: ; CODE XREF: ROM:1902p
ROM:18E6 ; ROM:GETp
ROM:18E6 inx h
ROM:18E7 lxi b, X1 ; Первый графический курсор, координата X
ROM:18EA cpi 0A5h ; 'е'
ROM:18EC jz loc_18F4
ROM:18EF call PSETTR ; Обработка PSET/PRESET/LINE. Получение всех параметров.
ROM:18EF ; Есть ли токен STEP. Заполняем PSETX, PSETY. Указал ли цвет и если да, то читаем его.
ROM:18F2 rst 1 ; RST1 = проверка синтаксиса.
ROM:18F2 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:18F2 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:18F2 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:18F2 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:18F2 ; ---------------------------------------------------------------------------
ROM:18F3 .db 0A5h ; - (токен 165 (&hA5))
ROM:18F4 ; ---------------------------------------------------------------------------
ROM:18F4
ROM:18F4 loc_18F4: ; CODE XREF: LINETR+6j
ROM:18F4 mov a, m
ROM:18F5 inx h
ROM:18F6 lxi b, X2 ; Второй графический курсор, координата X
ROM:18F9 call PSETTR ; Обработка PSET/PRESET/LINE. Получение всех параметров.
ROM:18F9 ; Есть ли токен STEP. Заполняем PSETX, PSETY. Указал ли цвет и если да, то читаем его.
ROM:18FC ret
ROM:18FC ; End of function LINETR
ROM:18FC
ROM:18FD ; ---------------------------------------------------------------------------
ROM:18FD
ROM:18FD LINE: ; Обработка Бейсик оператора LINE
ROM:18FD cpi 84h ; 'Д'
ROM:18FF jz SYNTAXERROR ; Самая распространённая ошибка №2
ROM:1902 call LINETR ; Подготавливаем параметры для LINE
ROM:1905 jz LINEBBF ; Обработка оператора LINE с параметрами B и BF
ROM:1908
ROM:1908 ; =============== S U B R O U T I N E =======================================
ROM:1908
ROM:1908 ; Тут ассемблерная обработка команды LINE. Все параметры получены.
ROM:1908
ROM:1908 LINE_ASM: ; CODE XREF: LINEBTR+4p
ROM:1908 ; ROM:1BBDj
ROM:1908 push h
ROM:1909 lxi h, 100h
ROM:190C shld LINE100 ; Параметр команды LINE
ROM:190F
ROM:190F loc_190F:
ROM:190F lxi h, 1
ROM:1912 shld LINE1 ; Параметр команды LINE
ROM:1915 call LINECLC ; Расчет точек для LINE
ROM:1918 mov a, e
ROM:1919 cmp d
ROM:191A jnc loc_1933
ROM:191D mov b, e
ROM:191E mov e, d
ROM:191F mov d, b
ROM:1920 lda LINE1 ; Параметр команды LINE
ROM:1923 sta LINE100 ; Параметр команды LINE
ROM:1926 lda LINE100_ ; Параметр команды LINE
ROM:1929 sta LINE1_ ; Параметр команды LINE
ROM:192C xra a
ROM:192D sta LINE1 ; Параметр команды LINE
ROM:1930 sta LINE100_ ; Параметр команды LINE
ROM:1933
ROM:1933 loc_1933: ; CODE XREF: LINE_ASM+12j
ROM:1933 mov a, e
ROM:1934 rar
ROM:1935 mov c, a
ROM:1936 mvi b, 1
ROM:1938
ROM:1938 loc_1938: ; CODE XREF: LINE_ASM+70j
ROM:1938 mov a, e
ROM:1939 cmp b
ROM:193A jc loc_1876
ROM:193D lhld X1 ; Первый графический курсор, координата X
ROM:1940 lda LINE1 ; Параметр команды LINE
ROM:1943 add l
ROM:1944 sta X1 ; Первый графический курсор, координата X
ROM:1947 lda LINE1_ ; Параметр команды LINE
ROM:194A add h
ROM:194B sta Y1 ; Первый графический курсор, координата Y
ROM:194E mov a, d
ROM:194F add c
ROM:1950 mov c, a
ROM:1951 inr b
ROM:1952 jz loc_1876
ROM:1955 jc loc_195E
ROM:1958 mov a, e
ROM:1959 cmp c
ROM:195A jnc loc_1971
ROM:195D mov a, c
ROM:195E
ROM:195E loc_195E: ; CODE XREF: LINE_ASM+4Dj
ROM:195E sub e
ROM:195F mov c, a
ROM:1960 lhld X1 ; Первый графический курсор, координата X
ROM:1963 lda LINE100 ; Параметр команды LINE
ROM:1966 add l
ROM:1967 sta X1 ; Первый графический курсор, координата X
ROM:196A lda LINE100_ ; Параметр команды LINE
ROM:196D add h
ROM:196E sta Y1 ; Первый графический курсор, координата Y
ROM:1971
ROM:1971 loc_1971: ; CODE XREF: LINE_ASM+52j
ROM:1971 push b
ROM:1972 push d
ROM:1973 call PSET_ASM ; Тут ассемблерная обработка команды PSET. Все параметры получены.
ROM:1976 pop d
ROM:1977 pop b
ROM:1978 jmp loc_1938
ROM:1978 ; End of function LINE_ASM
ROM:1978
ROM:197B ; ---------------------------------------------------------------------------
ROM:197B
ROM:197B INKEY: ; Обработка бейсик-функции INKEY
ROM:197B call KBDBUFAK
ROM:197E jz loc_1989
ROM:1981 call BUFFERTOA ; Ввод символа из буфера клавиатуры в A.
ROM:1981 ; Если буфер пуст - ожидание нажатия.
ROM:1984 sta INTAR+20h ; Рабочая область обработки прерываний
ROM:1987 mvi a, 1
ROM:1989
ROM:1989 loc_1989: ; CODE XREF: ROM:197Ej
ROM:1989 ; ROM:1FD3j
ROM:1989 push psw
ROM:198A call MAINTR7 ; Вызов MAINTR5 и переход в MAINTR3
ROM:198D pop psw
ROM:198E lhld CHARTBL ; Таблица символов функции CHR
ROM:1991 xchg
ROM:1992 lxi b, INTAR+20h ; Рабочая область обработки прерываний
ROM:1995 mov l, a
ROM:1996
ROM:1996 loc_1996: ; Проверка L, загрузка в A из (BC), выгрузка в (DE) в цикле
ROM:1996 call MAINTR6
ROM:1999 jmp loc_F10
ROM:199C ; ---------------------------------------------------------------------------
ROM:199C
ROM:199C BLOAD: ; Обработка оператора BLOAD
ROM:199C call TAPE
ROM:199F mvi a, 2
ROM:19A1 lxi d, loc_19A9
ROM:19A4 push d
ROM:19A5 push h
ROM:19A6 jmp loc_18B8
ROM:19A9 ; ---------------------------------------------------------------------------
ROM:19A9
ROM:19A9 loc_19A9: ; DATA XREF: ROM:19A1o
ROM:19A9 mov a, m
ROM:19AA cpi 2Ch ; ','
ROM:19AC rnz
ROM:19AD inx h
ROM:19AE mov a, m
ROM:19AF cpi 52h ; 'R'
ROM:19B1 jnz SYNTAXERROR ; Самая распространённая ошибка №2
ROM:19B4 lhld INTAR+4 ; Рабочая область обработки прерываний
ROM:19B7 pchl
ROM:19B8 ; ---------------------------------------------------------------------------
ROM:19B8
ROM:19B8 LOAD: ; Обработка оператора LOAD
ROM:19B8 call TAPE
ROM:19BB mvi a, 1
ROM:19BD lxi d, loc_19C8
ROM:19C0 push d
ROM:19C1 push h
ROM:19C2 lhld LOADADDR ; Адрес загрузки для LOAD
ROM:19C5 jmp loc_18B8
ROM:19C8 ; ---------------------------------------------------------------------------
ROM:19C8
ROM:19C8 loc_19C8: ; DATA XREF: ROM:19BDo
ROM:19C8 call NEW2 ; Сброс бейсик-программы к исходному состоянию
ROM:19C8 ; Дополнительная точка входа.
ROM:19CB lhld LOADADDR ; Адрес загрузки для LOAD
ROM:19CE shld EITMP ; Временная переменная. Используется в INPUTLN, ERRTR2
ROM:19D1 lxi h, 0FFFFh
ROM:19D4 shld BASOPNUM ; Номер оператора Бейсик программы.
ROM:19D4 ; Или &hFFFF в командном режиме
ROM:19D7 jmp loc_30D ; НУ ВОТ, СОБСТВЕННО! ЭТО И ЕСТЬ САМЫЙ ГЛАВНЫЙ ЦИКЛ БЕЙСИК-ИНТЕРПРЕТАТОРА!
ROM:19DA ; ---------------------------------------------------------------------------
ROM:19DA
ROM:19DA BSAVE: ; Обработка оператора BSAVE
ROM:19DA call TAPE2
ROM:19DD call GETPRM2 ; Ждем появление запятой и считываем параметр, следующий за ней
ROM:19E0 push d
ROM:19E1 call GETPRM2 ; Ждем появление запятой и считываем параметр, следующий за ней
ROM:19E4 push d
ROM:19E5 call GETPRM2 ; Ждем появление запятой и считываем параметр, следующий за ней
ROM:19E8 shld INTAR+4 ; Рабочая область обработки прерываний
ROM:19EB pop b
ROM:19EC pop h
ROM:19ED push d
ROM:19EE push h
ROM:19EF mov d, b
ROM:19F0 mov e, c
ROM:19F1 call MACRO4
ROM:19F4 pop h
ROM:19F5 pop d
ROM:19F6 push h
ROM:19F7 lhld INTAR+4 ; Рабочая область обработки прерываний
ROM:19FA xthl
ROM:19FB mvi a, 82h ; 'В'
ROM:19FD jmp loc_18B8
ROM:1A00 ; ---------------------------------------------------------------------------
ROM:1A00
ROM:1A00 COLOR: ; Обработка Бейсик оператора COLOR
ROM:1A00 call GETINTPARAM
ROM:1A03 sta CPP ; цвет изображения
ROM:1A06 rst 1 ; RST1 = проверка синтаксиса.
ROM:1A06 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:1A06 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:1A06 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:1A06 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:1A06 ; ---------------------------------------------------------------------------
ROM:1A07 .db ','
ROM:1A08 ; ---------------------------------------------------------------------------
ROM:1A08 call GETINTPARAM ; Получаем в A целочисленный параметр для команды Бейсика
ROM:1A0B sta CZP ; цвет фона
ROM:1A0E rst 1 ; RST1 = проверка синтаксиса.
ROM:1A0E ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:1A0E ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:1A0E ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:1A0E ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:1A0E ; ---------------------------------------------------------------------------
ROM:1A0F .db ','
ROM:1A10 ; ---------------------------------------------------------------------------
ROM:1A10 call GETINTPARAM ; Получаем в A целочисленный параметр для команды Бейсика
ROM:1A13 sta CRG ; цвет рамки
ROM:1A16 call SETCOLOR ; CPP=(FA24) цвет точки CZP=(FA25) цвет фона CRG=(FA26) цвет рамки (установка цвета).
ROM:1A19 ret
ROM:1A1A ; ---------------------------------------------------------------------------
ROM:1A1A
ROM:1A1A SCREEN: ; Обработка Бейсик оператора SCREEN
ROM:1A1A call GETINTPARAM
ROM:1A1D cpi 3 ; Режим может быть только 0, 1 и 2
ROM:1A1F jnc SYNTAXERROR ; Самая распространённая ошибка №2
ROM:1A22 call SETMODE ; A=режим (установка режима 0, 1, 2)
ROM:1A25 ret
ROM:1A26 ; ---------------------------------------------------------------------------
ROM:1A26
ROM:1A26 WIDTH: ; Обработка оператора WIDTH
ROM:1A26 call GETINTPARAM
ROM:1A29 push h
ROM:1A2A call SCRLEN ; Возвращает в аккумулятор длину строки экрана в символах
ROM:1A2D pop h
ROM:1A2E jc SYNTAXERROR ; Самая распространённая ошибка №2
ROM:1A31 ret
ROM:1A32 ; ---------------------------------------------------------------------------
ROM:1A32
ROM:1A32 MOTOR: ; Обработка бейсик-оператора MOTOR
ROM:1A32 rz
ROM:1A33 cpi 91h ; 'С'
ROM:1A35 in 82h
ROM:1A37 inx h
ROM:1A38 jnz loc_1A40
ROM:1A3B ori 10h
ROM:1A3D out 82h
ROM:1A3F ret
ROM:1A40 ; ---------------------------------------------------------------------------
ROM:1A40
ROM:1A40 loc_1A40: ; CODE XREF: ROM:1A38j
ROM:1A40 ani 0EFh
ROM:1A42 out 82h
ROM:1A44 ret
ROM:1A45 ; ---------------------------------------------------------------------------
ROM:1A45
ROM:1A45 RESTORE: ; Обработка бейсик оператора RESTORE
ROM:1A45 jz READPT
ROM:1A48 call LINENUMBERFROMSTR ; Возвращает в DE номер бейсик-строки из параметра GOTO, LIST, GOSUB, RESTORE, ON...
ROM:1A48 ; А также номер строки в самой бейсик-программе.
ROM:1A48 ; Чуть подробнее: Получает номер строки из указателя на строку.
ROM:1A48 ; Указатель строки передается в HL, и целый результат возвращается в DE.
ROM:1A48 ; Лидирующие пробелы пропускаются, и возврат происходит при найденном первом символе не являющемся цифрой.
ROM:1A48 ; Максимально допустимое число строк 65529. Синтаксическая ошибка появится, если значение первых четырех цифр более 6552.
ROM:1A48 ; Одной из интересных особенностей этой функции является то, что он устанавливает Z, если найден правильный номер (или строка была пустой),
ROM:1A48 ; или NZ, если строка не начинается с номера.
ROM:1A48 ;
ROM:1A4B push h
ROM:1A4C call GOTOPRE ; Подготавливает переход на строку бейсик-программы
ROM:1A4F pop d
ROM:1A50 jmp loc_5E0
ROM:1A53 ; ---------------------------------------------------------------------------
ROM:1A53
ROM:1A53 STRIG: ; Обработка бейсик функции STRIG
ROM:1A53 mvi b, 5
ROM:1A55 call KEYRQ ; Опрос игровых манипуляторов
ROM:1A58 push h
ROM:1A59 call ASKBTN ; Опрос состояния кнопки.
ROM:1A59 ; A=код (0,1,2):
ROM:1A59 ; 0 - клавиатура,
ROM:1A59 ; 1 - джойстик №1,
ROM:1A59 ; 2 - джойстик №2.
ROM:1A59 ; (A=состояние кнопки (пробел - клавиатуры),
ROM:1A59 ; 0 - не нажата,
ROM:1A59 ; 1 - нажата)
ROM:1A5C pop h
ROM:1A5D jmp SHORTINT ; Получение короткого целого из A
ROM:1A60 ; ---------------------------------------------------------------------------
ROM:1A60
ROM:1A60 STICK: ; JОбработка бейсик функции STICK
ROM:1A60 mvi b, 3
ROM:1A62 call KEYRQ ; Опрос игровых манипуляторов
ROM:1A65 push h
ROM:1A66 call JOYDIR ; A=код (0,1,2):
ROM:1A66 ; 0 - клавиатура,
ROM:1A66 ; 1 - джойстик №1,
ROM:1A66 ; 2 - джойстик №2.
ROM:1A66 ; (A=код направления: чтение направления,
ROM:1A66 ; 8 1 2
ROM:1A66 ; 7<-0->3
ROM:1A66 ; 6 5 4
ROM:1A69 pop h
ROM:1A6A jmp SHORTINT ; Получение короткого целого из A
ROM:1A6D
ROM:1A6D ; =============== S U B R O U T I N E =======================================
ROM:1A6D
ROM:1A6D ; Опрос игровых манипуляторов
ROM:1A6D
ROM:1A6D KEYRQ: ; CODE XREF: ROM:1A55p
ROM:1A6D ; ROM:1A62p ...
ROM:1A6D push b
ROM:1A6E call loc_FBC
ROM:1A71 pop b
ROM:1A72 cmp b
ROM:1A73 jnc FUNCTIONCALLERROR ; Ошибка вызова функции
ROM:1A76 ret
ROM:1A76 ; End of function KEYRQ
ROM:1A76
ROM:1A77 ; ---------------------------------------------------------------------------
ROM:1A77
ROM:1A77 END: ; Обработка бейсик оператора END
ROM:1A77 ana a
ROM:1A78 jmp loc_5F2
ROM:1A7B ; ---------------------------------------------------------------------------
ROM:1A7B
ROM:1A7B CSRLIN: ; Обработка бейсик функции CSRLIN
ROM:1A7B lda SK
ROM:1A7E jmp SHORTINT ; Получение короткого целого из A
ROM:1A81 ; ---------------------------------------------------------------------------
ROM:1A81
ROM:1A81 VPEEK: ; Обработка бейсик функции VPEEK
ROM:1A81 call VPEEKTR
ROM:1A84 xchg
ROM:1A85 call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM).
ROM:1A88 xchg
ROM:1A89 jmp SHORTINT ; Получение короткого целого из A
ROM:1A8C ; ---------------------------------------------------------------------------
ROM:1A8C
ROM:1A8C VPOKE: ; Обработка бейсик функции VPOKE
ROM:1A8C call EVALEXPRESSION
ROM:1A8F call VPEEKTR ; Подпрограмма обработки функции VPEEK
ROM:1A92 jmp loc_1067
ROM:1A95
ROM:1A95 ; =============== S U B R O U T I N E =======================================
ROM:1A95
ROM:1A95 ; Подпрограмма обработки функции VPEEK
ROM:1A95
ROM:1A95 VPEEKTR: ; CODE XREF: ROM:VPEEKp
ROM:1A95 ; ROM:1A8Fp
ROM:1A95 rst 5 ; RST5 = Проверяет состояние FACCUM.
ROM:1A95 ; Возвращает A = 0 и устанавливает Z, если FACCUM == 0, хвост функции устанавливает флаг знака и A соответственно
ROM:1A95 ; (0xFF если отрицательно, 0x01 если положительно).
ROM:1A96 call INTFROMFLOAT ; Получение целого числа из числа с плавающей точкой
ROM:1A99
ROM:1A99 loc_1A99: ; CODE XREF: ROM:1D30p
ROM:1A99 mov a, d
ROM:1A9A ani 0C0h
ROM:1A9C jnz FUNCTIONCALLERROR ; Ошибка вызова функции
ROM:1A9F in 84h
ROM:1AA1 ani 0C0h
ROM:1AA3 ora d
ROM:1AA4 mov d, a
ROM:1AA5 ret
ROM:1AA5 ; End of function VPEEKTR
ROM:1AA5
ROM:1AA6
ROM:1AA6 ; =============== S U B R O U T I N E =======================================
ROM:1AA6
ROM:1AA6 ; Подпрограмма обработки Бейсик оператора LINE с параметром B
ROM:1AA6
ROM:1AA6 LINEBTR: ; CODE XREF: ROM:1AE1p
ROM:1AA6 ; ROM:1AE7p ...
ROM:1AA6 push d
ROM:1AA7 shld X2 ; Второй графический курсор, координата X
ROM:1AAA call LINE_ASM ; Тут ассемблерная обработка команды LINE. Все параметры получены.
ROM:1AAD pop d
ROM:1AAE ret
ROM:1AAE ; End of function LINEBTR
ROM:1AAE
ROM:1AAF ; ---------------------------------------------------------------------------
ROM:1AAF ; START OF FUNCTION CHUNK FOR OUTCHAR
ROM:1AAF
ROM:1AAF loc_1AAF: ; CODE XREF: OUTCHAR:OUTCHAR2j
ROM:1AAF pop psw
ROM:1AB0 push psw
ROM:1AB1 push b
ROM:1AB2 push d
ROM:1AB3 push h
ROM:1AB4 lhld OUTTMP ; Временная переменная редактора
ROM:1AB7 mov m, a
ROM:1AB8 inx h
ROM:1AB9 shld OUTTMP ; Временная переменная редактора
ROM:1ABC lxi d, IOBUF+100h ; Буфер ввода-вывода (диск, кассеты)
ROM:1ABF rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения.
ROM:1AC0 jnz loc_4C2
ROM:1AC3 lxi h, IOBUF ; Буфер ввода-вывода (диск, кассеты)
ROM:1AC6 shld OUTTMP ; Временная переменная редактора
ROM:1AC9 call EDITTR1 ; Подпрограмма редактора. Вызывается из EDIT1 и OUTCHAR.
ROM:1ACC jnc loc_4C2
ROM:1ACF xra a
ROM:1AD0 sta TERMINAL_X ; Переменная, контролирующая текущую X позицию вывода терминала.
ROM:1AD3 jmp MAINLOOP3 ; Третья точка входа в главный цикл. Переход из INIT2, STOP, CSAVE, OUTCHAR2, INPUTLN
ROM:1AD3 ; END OF FUNCTION CHUNK FOR OUTCHAR
ROM:1AD6 ; ---------------------------------------------------------------------------
ROM:1AD6
ROM:1AD6 LINEB: ; CODE XREF: ROM:1BC4j
ROM:1AD6 push h ; Обработка Бейсик оператора LINE с параметром B
ROM:1AD7 lhld X1 ; Первый графический курсор, координата X
ROM:1ADA xchg
ROM:1ADB lhld X2 ; Второй графический курсор, координата X
ROM:1ADE mov a, h
ROM:1ADF mov h, d
ROM:1AE0 mov d, a
ROM:1AE1 call LINEBTR ; Подпрограмма обработки Бейсик оператора LINE с параметром B
ROM:1AE4 mov a, h
ROM:1AE5 mov h, d
ROM:1AE6 mov d, a
ROM:1AE7 call LINEBTR ; Подпрограмма обработки Бейсик оператора LINE с параметром B
ROM:1AEA mov l, e
ROM:1AEB call LINEBTR ; Подпрограмма обработки Бейсик оператора LINE с параметром B
ROM:1AEE mov h, d
ROM:1AEF call LINEBTR ; Подпрограмма обработки Бейсик оператора LINE с параметром B
ROM:1AF2 pop h
ROM:1AF3 ret
ROM:1AF4 ; ---------------------------------------------------------------------------
ROM:1AF4
ROM:1AF4 KEY: ; Обработка оператора KEY
ROM:1AF4 push h
ROM:1AF5 cpi 0DFh ; '-' ; KEY OFF
ROM:1AF7 jz loc_1B36
ROM:1AFA cpi 91h ; 'С' ; KEY ON
ROM:1AFC jz loc_1B3C
ROM:1AFF pop h
ROM:1B00 call GETINTPARAM ; Получаем в A целочисленный параметр для команды Бейсика
ROM:1B03 cpi 0Bh
ROM:1B05 jnc SYNTAXERROR ; Самая распространённая ошибка №2
ROM:1B08 ana a
ROM:1B09 jz SYNTAXERROR ; Самая распространённая ошибка №2
ROM:1B0C dcr a
ROM:1B0D xchg
ROM:1B0E mov l, a
ROM:1B0F dad h
ROM:1B10 dad h
ROM:1B11 dad h
ROM:1B12 dad h
ROM:1B13 lxi b, FNKTXT ; Текст функциональных клавиш
ROM:1B16 dad b
ROM:1B17 xchg
ROM:1B18 rst 1 ; RST1 = проверка синтаксиса.
ROM:1B18 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:1B18 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:1B18 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:1B18 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:1B18 ; ---------------------------------------------------------------------------
ROM:1B19 .db ','
ROM:1B1A ; ---------------------------------------------------------------------------
ROM:1B1A push d
ROM:1B1B call COMPUTETR1 ; Подпрограмма вычисления выражений.
ROM:1B1E xthl
ROM:1B1F xchg
ROM:1B20 mvi a, 10h
ROM:1B22 call MACRO13
ROM:1B25 pop h
ROM:1B26 sui 10h
ROM:1B28 rc
ROM:1B29 cma
ROM:1B2A inr a
ROM:1B2B mov c, a
ROM:1B2C
ROM:1B2C loc_1B2C: ; CODE XREF: ROM:1B33j
ROM:1B2C mov a, c
ROM:1B2D ana a
ROM:1B2E rnz
ROM:1B2F xra a
ROM:1B30 stax d
ROM:1B31 inx d
ROM:1B32 dcr c
ROM:1B33 jmp loc_1B2C
ROM:1B36 ; ---------------------------------------------------------------------------
ROM:1B36
ROM:1B36 loc_1B36: ; CODE XREF: ROM:1AF7j
ROM:1B36 call KEYSOFF ; Выключает нижнюю строку ключей.
ROM:1B39 pop h
ROM:1B3A rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:1B3A ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:1B3A ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:1B3B ret
ROM:1B3C ; ---------------------------------------------------------------------------
ROM:1B3C
ROM:1B3C loc_1B3C: ; CODE XREF: ROM:1AFCj
ROM:1B3C call KEYSON ; Включает нижнюю строку ключей.
ROM:1B3F pop h
ROM:1B40 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:1B40 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:1B40 ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:1B41 ret
ROM:1B42 ; ---------------------------------------------------------------------------
ROM:1B42
ROM:1B42 LPRINT: ; Обработка команды LPRINT
ROM:1B42 mvi a, 1
ROM:1B44 sta PRNFL ; Флаг печати (Для LLIST, LPRINT равен 1)
ROM:1B47 jmp PRINT ; Бейсик-оператор PRINT
ROM:1B4A ; ---------------------------------------------------------------------------
ROM:1B4A
ROM:1B4A LLIST: ; Обработка команды LLIST
ROM:1B4A mvi a, 1
ROM:1B4C sta PRNFL ; Флаг печати (Для LLIST, LPRINT равен 1)
ROM:1B4F jmp LIST ; Обработка бейсик-команды LIST
ROM:1B52 ; ---------------------------------------------------------------------------
ROM:1B52 ; START OF FUNCTION CHUNK FOR CHECKENOUGHMEM
ROM:1B52
ROM:1B52 EXEC: ; CODE XREF: CHECKENOUGHMEM+66j
ROM:1B52 mvi a, 3
ROM:1B54 sta EVNTTAB ; Таблица событий.
ROM:1B54 ; (УПР/СТОП + 10 функциональных клавиш)
ROM:1B54 ; Бит 0 - маска события
ROM:1B54 ; Бит 2 - событие
ROM:1B57 call CURSOFF ; Выключает изображение курсора.
ROM:1B5A call KBDBUFCL ; Очистить буфер клавиатуры.
ROM:1B5D jmp EXEC_
ROM:1B5D ; END OF FUNCTION CHUNK FOR CHECKENOUGHMEM
ROM:1B60
ROM:1B60 ; =============== S U B R O U T I N E =======================================
ROM:1B60
ROM:1B60 ; Обработка останова
ROM:1B60
ROM:1B60 STOPTR: ; CODE XREF: CHECKENOUGHMEM+21p
ROM:1B60 ; TESTBREAKKEY2+20p
ROM:1B60 sta ASITT ; Временная переменная. Используется в AUTO, STOP, INPUTLN, TOKENIZE, TRETLINE
ROM:1B60 ; End of function STOPTR
ROM:1B60
ROM:1B63
ROM:1B63 ; =============== S U B R O U T I N E =======================================
ROM:1B63
ROM:1B63 ; Опрашивает флаг печати, формирует таблицу событий, Очищает переменную TERMINAL_X,
ROM:1B63 ; устанавливает текстовый режим (MODE), очищает буфер клавиатуры и временные переменные
ROM:1B63
ROM:1B63 EDIT1: ; CODE XREF: CHECKENOUGHMEM+43p
ROM:1B63 ; ROM:1DF3p
ROM:1B63 push d
ROM:1B64 lda PRNFL ; Флаг печати (Для LLIST, LPRINT равен 1)
ROM:1B67 ana a
ROM:1B68 cnz CRLF ; Печатает перевод строки и возврат каретки
ROM:1B6B sta EVNTTAB ; Таблица событий.
ROM:1B6B ; (УПР/СТОП + 10 функциональных клавиш)
ROM:1B6B ; Бит 0 - маска события
ROM:1B6B ; Бит 2 - событие
ROM:1B6E sta PRNFL ; Флаг печати (Для LLIST, LPRINT равен 1)
ROM:1B71 lda TERMINAL_X ; Переменная, контролирующая текущую X позицию вывода терминала.
ROM:1B74 ana a
ROM:1B75 jz loc_1B90
ROM:1B78 xra a
ROM:1B79 sta TERMINAL_X ; Переменная, контролирующая текущую X позицию вывода терминала.
ROM:1B7C lxi h, IOBUF+100h ; Буфер ввода-вывода (диск, кассеты)
ROM:1B7F xchg
ROM:1B80 lhld OUTTMP ; Временная переменная редактора
ROM:1B83 push h
ROM:1B84 call MACRO4
ROM:1B87 pop h
ROM:1B88 mvi a, 1Ah
ROM:1B8A call FILLAREA ; A=константа, BC=счетчик, HL=адрес (заполнение области константой)
ROM:1B8D call EDITTR1 ; Подпрограмма редактора. Вызывается из EDIT1 и OUTCHAR.
ROM:1B90
ROM:1B90 loc_1B90: ; CODE XREF: EDIT1+12j
ROM:1B90 call CURSON ; Включает изображение курсора.
ROM:1B93 pop d
ROM:1B94 lda MODE ; Режим экрана
ROM:1B97 cpi 2
ROM:1B99 jc loc_1BA2
ROM:1B9C lda OLDRES ; Старый режим
ROM:1B9F call SETMODE ; A=режим (установка режима 0, 1, 2)
ROM:1BA2
ROM:1BA2 loc_1BA2: ; CODE XREF: EDIT1+36j
ROM:1BA2 call KBDBUFCL ; Очистить буфер клавиатуры.
ROM:1BA2 ; End of function EDIT1
ROM:1BA2
ROM:1BA5
ROM:1BA5 ; =============== S U B R O U T I N E =======================================
ROM:1BA5
ROM:1BA5 ; Подпрограмма обработчика ошибок.
ROM:1BA5
ROM:1BA5 ERRTR2: ; CODE XREF: ERRTR+18p
ROM:1BA5 lxi h, 0
ROM:1BA8 shld ERRES ; Временная переменная обработчика ошибок.
ROM:1BAB shld EITMP ; Временная переменная. Используется в INPUTLN, ERRTR2
ROM:1BAE shld ERRTRTMP ; Временная переменная обработчика ошибок ERRTR, ERRTR2 и RESUME.
ROM:1BB1 ret
ROM:1BB1 ; End of function ERRTR2
ROM:1BB1
ROM:1BB2
ROM:1BB2 ; =============== S U B R O U T I N E =======================================
ROM:1BB2
ROM:1BB2 ; Очищает флаг печати (PRNFL=0, т. е. вывод на экран)
ROM:1BB2
ROM:1BB2 PRNFLCL: ; CODE XREF: NEXT2:EXECNEXTp
ROM:1BB2 xra a
ROM:1BB3 sta PRNFL ; Флаг печати (Для LLIST, LPRINT равен 1)
ROM:1BB6 ret
ROM:1BB6 ; End of function PRNFLCL
ROM:1BB6
ROM:1BB7 ; ---------------------------------------------------------------------------
ROM:1BB7
ROM:1BB7 LINEBBF: ; CODE XREF: ROM:1905j
ROM:1BB7 call loc_1CDB ; Обработка оператора LINE с параметрами B и BF
ROM:1BBA cnz PSETCLR ; Обрабатываем параметр цвет у команды PSET
ROM:1BBD jnz LINE_ASM ; Тут ассемблерная обработка команды LINE. Все параметры получены.
ROM:1BC0 rst 1 ; RST1 = проверка синтаксиса.
ROM:1BC0 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:1BC0 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:1BC0 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:1BC0 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:1BC0 ; ---------------------------------------------------------------------------
ROM:1BC1 .db 'B' ; Ожидается парметр B (будет нарисован прямоугольник)
ROM:1BC2 ; ---------------------------------------------------------------------------
ROM:1BC2 cpi 46h ; 'F' ; Ожидается параметр F (будет нарисован заштрихований прямоугольник)
ROM:1BC4 jnz LINEB ; Обработка Бейсик оператора LINE с параметром B
ROM:1BC7
ROM:1BC7 LINEBF: ; Обработка Бейсик оператора LINE с параметром BF
ROM:1BC7 inx h
ROM:1BC8 push h
ROM:1BC9 call LINECLC ; Расчет точек для LINE
ROM:1BCC shld X1 ; Первый графический курсор, координата X
ROM:1BCF push d
ROM:1BD0 call PRESETWT2 ; Рисование точки белым цветом (FD90 координата X, FD91 координата Y)
ROM:1BD3 pop h
ROM:1BD4 mov a, b
ROM:1BD5 dcr a
ROM:1BD6 ora b
ROM:1BD7 mov b, a
ROM:1BD8 lda PSETC ; Цвет точки у команды PSET
ROM:1BDB mov c, a
ROM:1BDC rlc
ROM:1BDD rlc
ROM:1BDE rlc
ROM:1BDF rlc
ROM:1BE0 mov c, a
ROM:1BE1 push d
ROM:1BE2 lda X1 ; Первый графический курсор, координата X
ROM:1BE5 ani 7
ROM:1BE7 mov e, a
ROM:1BE8 mvi a, 8
ROM:1BEA sub e
ROM:1BEB mov e, a
ROM:1BEC mov a, l
ROM:1BED sub e
ROM:1BEE pop d
ROM:1BEF jc loc_1C03
ROM:1BF2 inr b
ROM:1BF3 jz loc_1BF7
ROM:1BF6 dcr b
ROM:1BF7
ROM:1BF7 loc_1BF7: ; CODE XREF: ROM:1BF3j
ROM:1BF7 ; ROM:1C00j
ROM:1BF7 mov l, a
ROM:1BF8 call LINEBFTR ; Подпрограмма обработки Бейсик оператора LINE с параметром BF
ROM:1BFB mvi b, 0
ROM:1BFD mov a, l
ROM:1BFE sui 8
ROM:1C00 jnc loc_1BF7
ROM:1C03
ROM:1C03 loc_1C03: ; CODE XREF: ROM:1BEFj
ROM:1C03 mov a, l
ROM:1C04 push h
ROM:1C05 push b
ROM:1C06 call PSETBIT ; Обработка отдельного бита в команде PSET
ROM:1C09 mov a, b
ROM:1C0A rrc
ROM:1C0B mov b, a
ROM:1C0C dcr a
ROM:1C0D ora b
ROM:1C0E cma
ROM:1C0F pop b
ROM:1C10 mov b, a
ROM:1C11 pop h
ROM:1C12 call LINEBFTR ; Подпрограмма обработки Бейсик оператора LINE с параметром BF
ROM:1C15 pop h
ROM:1C16 ret
ROM:1C17
ROM:1C17 ; =============== S U B R O U T I N E =======================================
ROM:1C17
ROM:1C17 ; Подпрограмма обработки Бейсик оператора LINE с параметром BF
ROM:1C17
ROM:1C17 LINEBFTR: ; CODE XREF: ROM:1BF8p
ROM:1C17 ; ROM:1C12p
ROM:1C17 push h
ROM:1C18 push d
ROM:1C19 xchg
ROM:1C1A
ROM:1C1A loc_1C1A: ; CODE XREF: LINEBFTR+38j
ROM:1C1A mov a, b
ROM:1C1B ora a
ROM:1C1C jz loc_1C26
ROM:1C1F cma
ROM:1C20 mov e, a
ROM:1C21 call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM).
ROM:1C24 ana e
ROM:1C25 ora b
ROM:1C26
ROM:1C26 loc_1C26: ; CODE XREF: LINEBFTR+5j
ROM:1C26 mov m, a
ROM:1C27 mov a, h
ROM:1C28 xri 20h
ROM:1C2A mov h, a
ROM:1C2B mov a, b
ROM:1C2C ora a
ROM:1C2D mov a, c
ROM:1C2E jz loc_1C3C
ROM:1C31 rlc
ROM:1C32 rlc
ROM:1C33 rlc
ROM:1C34 rlc
ROM:1C35 mov e, a
ROM:1C36 call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM).
ROM:1C39 ani 0F0h
ROM:1C3B ora e
ROM:1C3C
ROM:1C3C loc_1C3C: ; CODE XREF: LINEBFTR+17j
ROM:1C3C mov m, a
ROM:1C3D mov a, h
ROM:1C3E xri 20h
ROM:1C40 mov h, a
ROM:1C41 inx h
ROM:1C42 mov a, l
ROM:1C43 ani 7
ROM:1C45 jnz loc_1C4E
ROM:1C48 dcx h
ROM:1C49 inr h
ROM:1C4A mov a, l
ROM:1C4B ani 0F8h
ROM:1C4D mov l, a
ROM:1C4E
ROM:1C4E loc_1C4E: ; CODE XREF: LINEBFTR+2Ej
ROM:1C4E dcr d
ROM:1C4F jnz loc_1C1A
ROM:1C52 pop d
ROM:1C53 lxi h, 8
ROM:1C56 dad d
ROM:1C57 xchg
ROM:1C58 pop h
ROM:1C59 ret
ROM:1C59 ; End of function LINEBFTR
ROM:1C59
ROM:1C5A ; ---------------------------------------------------------------------------
ROM:1C5A
ROM:1C5A SPACE: ; Обработка оператора SPACE
ROM:1C5A call loc_FBC
ROM:1C5D mvi d, 20h ; ' '
ROM:1C5F
ROM:1C5F loc_1C5F: ; CODE XREF: ROM:1C8Fj
ROM:1C5F push d
ROM:1C60 call MAINTR7 ; Вызов MAINTR5 и переход в MAINTR3
ROM:1C63 pop b
ROM:1C64 lhld CHARTBL ; Таблица символов функции CHR
ROM:1C67 mov a, b
ROM:1C68 mvi b, 0
ROM:1C6A call FILLAREA ; A=константа, BC=счетчик, HL=адрес (заполнение области константой)
ROM:1C6D pop b
ROM:1C6E jmp loc_D75
ROM:1C71 ; ---------------------------------------------------------------------------
ROM:1C71
ROM:1C71 STRING: ; Обработка оператора STRING
ROM:1C71 pop h
ROM:1C72 xthl
ROM:1C73 call GETINTPARAM ; Получаем в A целочисленный параметр для команды Бейсика
ROM:1C76 ora a
ROM:1C77 jz FUNCTIONCALLERROR ; Ошибка вызова функции
ROM:1C7A push d
ROM:1C7B rst 1 ; RST1 = проверка синтаксиса.
ROM:1C7B ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:1C7B ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:1C7B ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:1C7B ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:1C7B ; ---------------------------------------------------------------------------
ROM:1C7C .db ','
ROM:1C7D ; ---------------------------------------------------------------------------
ROM:1C7D call loc_A18
ROM:1C80 lda LETTMP ; Временная переменная оператора LET, EVALTERM, COMPUTE, GETVAR
ROM:1C83 ora a
ROM:1C84 jnz loc_1C92
ROM:1C87 call loc_FBC
ROM:1C8A
ROM:1C8A loc_1C8A: ; CODE XREF: ROM:1C9Bj
ROM:1C8A pop d
ROM:1C8B mov d, a
ROM:1C8C mov a, e
ROM:1C8D xthl
ROM:1C8E push h
ROM:1C8F jmp loc_1C5F
ROM:1C92 ; ---------------------------------------------------------------------------
ROM:1C92
ROM:1C92 loc_1C92: ; CODE XREF: ROM:1C84j
ROM:1C92 call loc_1CA1
ROM:1C95 mov a, e
ROM:1C96 ora a
ROM:1C97 jz FUNCTIONCALLERROR ; Ошибка вызова функции
ROM:1C9A ldax b
ROM:1C9B jmp loc_1C8A
ROM:1C9E
ROM:1C9E ; =============== S U B R O U T I N E =======================================
ROM:1C9E
ROM:1C9E ; Подпрограмма вычисления выражений.
ROM:1C9E
ROM:1C9E COMPUTETR1: ; CODE XREF: TAPE+18p
ROM:1C9E ; ROM:1B1Bp
ROM:1C9E call COMPUTE ; Вычисление выражений. Вызов из EVALEXPRESSION, IF, PRINT, EVALTERM.
ROM:1CA1
ROM:1CA1 loc_1CA1: ; CODE XREF: ROM:loc_1C92p
ROM:1CA1 push h
ROM:1CA2 call COMPUTETR2 ; Подпрограмма вычисления выражений.
ROM:1CA5 call FLOADBCDEFROMMEM ; Загружает число с плавающей точкой в BCDE из ячеек памяти, на которые указывает HL.
ROM:1CA5 ; Т. е. загрузка из M в BCDE
ROM:1CA8 pop h
ROM:1CA9 ret
ROM:1CA9 ; End of function COMPUTETR1
ROM:1CA9
ROM:1CAA
ROM:1CAA ; =============== S U B R O U T I N E =======================================
ROM:1CAA
ROM:1CAA ; Обработка отдельного бита в команде PSET
ROM:1CAA
ROM:1CAA PSETBIT: ; CODE XREF: PSET_ASM+1Ap
ROM:1CAA ; ROM:1C06p
ROM:1CAA ani 7
ROM:1CAC mov c, a
ROM:1CAD mvi b, 0
ROM:1CAF lxi h, BITS80
ROM:1CB2 dad b
ROM:1CB3 mov b, m
ROM:1CB4 ret
ROM:1CB4 ; End of function PSETBIT
ROM:1CB4
ROM:1CB5
ROM:1CB5 ; =============== S U B R O U T I N E =======================================
ROM:1CB5
ROM:1CB5 ; Обработка PSET/PRESET/LINE. Получение всех параметров.
ROM:1CB5 ; Есть ли токен STEP. Заполняем PSETX, PSETY. Указал ли цвет и если да, то читаем его.
ROM:1CB5
ROM:1CB5 PSETTR: ; CODE XREF: PRESETWT2+9p
ROM:1CB5 ; ROM:1826p ...
ROM:1CB5 cpi 0A3h ; 'г'
ROM:1CB7 jz loc_1CC0 ; Если в A токен STEP (&hA3)
ROM:1CBA xra a
ROM:1CBB stax b
ROM:1CBC inx b
ROM:1CBD stax b
ROM:1CBE dcx b
ROM:1CBF dcx h
ROM:1CC0
ROM:1CC0 loc_1CC0: ; CODE XREF: PSETTR+2j
ROM:1CC0 rst 1 ; RST1 = проверка синтаксиса.
ROM:1CC0 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:1CC0 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:1CC0 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:1CC0 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:1CC0 ; ---------------------------------------------------------------------------
ROM:1CC1 .db 28h ; ( ; Ждем открывающуюся скобку
ROM:1CC2 ; ---------------------------------------------------------------------------
ROM:1CC2 call GETPRM ; Получаем первый параметр (координату X)
ROM:1CC5 call PSETTRPRM ; Подготавливаем параметр (координата X или Y), переданный в команду PSET
ROM:1CC8 stax b
ROM:1CC9 mov a, d
ROM:1CCA sta PSETX ; Координата X команды PSET в виде байта
ROM:1CCD inx b
ROM:1CCE call GETPRM2 ; Получаем второй параметр (координату Y)
ROM:1CD1 call PSETTRPRM ; Подготавливаем параметр (координата X или Y), переданный в команду PSET
ROM:1CD4 stax b
ROM:1CD5 mov a, d
ROM:1CD6 sta PSETY ; Координата Y команды PSET в виде байта
ROM:1CD9 rst 1 ; RST1 = проверка синтаксиса.
ROM:1CD9 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:1CD9 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:1CD9 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:1CD9 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:1CD9 ; ---------------------------------------------------------------------------
ROM:1CDA .db ')' ; Ждем закрывающуюся скобку
ROM:1CDB ; ---------------------------------------------------------------------------
ROM:1CDB
ROM:1CDB loc_1CDB: ; CODE XREF: ROM:LINEBBFp
ROM:1CDB ; PSETCLR+Bj ...
ROM:1CDB mov a, m
ROM:1CDC cpi 2Ch ; ',' ; Ждём запятую. Если она есть, то после неё идёт цвет точки (или другой второй параметр).
ROM:1CDE rnz
ROM:1CDF inx h
ROM:1CE0 ret
ROM:1CE0 ; End of function PSETTR
ROM:1CE0
ROM:1CE1
ROM:1CE1 ; =============== S U B R O U T I N E =======================================
ROM:1CE1
ROM:1CE1 ; Обрабатываем параметр цвет у команды PSET
ROM:1CE1
ROM:1CE1 PSETCLR: ; CODE XREF: PRESETWT2:loc_1829p
ROM:1CE1 ; ROM:1BBAp
ROM:1CE1 call GETINTPARAM ; Получаем в A целочисленный параметр для команды Бейсика
ROM:1CE4 cpi 10h ; Цвет не может быть больше 15
ROM:1CE6 jnc SYNTAXERROR ; Самая распространённая ошибка №2
ROM:1CE9 sta PSETC ; Цвет точки у команды PSET
ROM:1CEC jmp loc_1CDB
ROM:1CEC ; End of function PSETCLR
ROM:1CEC
ROM:1CEF
ROM:1CEF ; =============== S U B R O U T I N E =======================================
ROM:1CEF
ROM:1CEF ; Подготавливаем параметр (координата X или Y), переданный в команду PSET
ROM:1CEF
ROM:1CEF PSETTRPRM: ; CODE XREF: PSETTR+10p
ROM:1CEF ; PSETTR+1Cp
ROM:1CEF push h
ROM:1CF0 ldax b
ROM:1CF1 mvi h, 0
ROM:1CF3 mov l, a
ROM:1CF4 dad d
ROM:1CF5 xchg
ROM:1CF6 pop h
ROM:1CF7 mov a, d
ROM:1CF8 ana a
ROM:1CF9 mov a, e
ROM:1CFA rz
ROM:1CFB mvi a, 0FFh
ROM:1CFD rp
ROM:1CFE mov a, d
ROM:1CFF cma
ROM:1D00 mov d, a
ROM:1D01 mov a, e
ROM:1D02 cma
ROM:1D03 mov e, a
ROM:1D04 inx d
ROM:1D05 mov a, d
ROM:1D06 ora a
ROM:1D07 mvi d, 0FFh
ROM:1D09 mvi a, 0
ROM:1D0B rnz
ROM:1D0C mov d, e
ROM:1D0D ret
ROM:1D0D ; End of function PSETTRPRM
ROM:1D0D
ROM:1D0E ; ---------------------------------------------------------------------------
ROM:1D0E
ROM:1D0E BASE_: ; Обработка оператора BASE
ROM:1D0E mvi b, 7
ROM:1D10 call KEYRQ ; Опрос игровых манипуляторов
ROM:1D13 push h
ROM:1D14 lxi h, ABS1 ; Адрес буфера экрана режима 0 и 1
ROM:1D17 rlc
ROM:1D18 mov e, a
ROM:1D19 dad d
ROM:1D1A mov b, m
ROM:1D1B inx h
ROM:1D1C mov a, m
ROM:1D1D pop h
ROM:1D1E jmp INLONGINT ; Ввод длинного целого.
ROM:1D21 ; ---------------------------------------------------------------------------
ROM:1D21
ROM:1D21 BASE: ; Обработка оператора BASE
ROM:1D21 call EVALEXPRESSION
ROM:1D24 mvi b, 7
ROM:1D26 call KEYRQ ; Опрос игровых манипуляторов
ROM:1D29 rlc
ROM:1D2A mov e, a
ROM:1D2B push d
ROM:1D2C call GETPRM2 ; Ждем появление запятой и считываем параметр, следующий за ней
ROM:1D2F xthl
ROM:1D30 call loc_1A99
ROM:1D33 lxi b, ABS1 ; Адрес буфера экрана режима 0 и 1
ROM:1D36 dad b
ROM:1D37 mov m, e
ROM:1D38 inx h
ROM:1D39 mov m, d
ROM:1D3A pop h
ROM:1D3B ret
ROM:1D3C ; ---------------------------------------------------------------------------
ROM:1D3C
ROM:1D3C BEEP: ; Обработка оператора BEEP
ROM:1D3C jz loc_1D47
ROM:1D3F call TRTR ; Обработчик TR
ROM:1D42 sta BEEPF ; BEEP флаг
ROM:1D45 inx h
ROM:1D46 ret
ROM:1D47 ; ---------------------------------------------------------------------------
ROM:1D47
ROM:1D47 loc_1D47: ; CODE XREF: ROM:BEEPj
ROM:1D47 push h
ROM:1D48 lxi h, BEEPF ; BEEP флаг
ROM:1D4B mov a, m
ROM:1D4C mvi m, 1
ROM:1D4E call BELL ; Обработка звука нажатия клавиш и CHR(7) (в зависимости от BEEPF)
ROM:1D51 mov m, a
ROM:1D52 pop h
ROM:1D53 ret
ROM:1D54 ; ---------------------------------------------------------------------------
ROM:1D54
ROM:1D54 ON: ; Обработка конструкции ON ERROR
ROM:1D54 cpi 97h ; 'Ч'
ROM:1D56 jnz loc_75C
ROM:1D59 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:1D59 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:1D59 ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:1D5A rst 1 ; RST1 = проверка синтаксиса.
ROM:1D5A ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:1D5A ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:1D5A ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:1D5A ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:1D5A ; ---------------------------------------------------------------------------
ROM:1D5B .db 88h ; Бейсик оператор GOTO (токен 136 (&h88))
ROM:1D5C ; ---------------------------------------------------------------------------
ROM:1D5C call LINENUMBERFROMSTR ; Возвращает в DE номер бейсик-строки из параметра GOTO, LIST, GOSUB, RESTORE, ON...
ROM:1D5C ; А также номер строки в самой бейсик-программе.
ROM:1D5C ; Чуть подробнее: Получает номер строки из указателя на строку.
ROM:1D5C ; Указатель строки передается в HL, и целый результат возвращается в DE.
ROM:1D5C ; Лидирующие пробелы пропускаются, и возврат происходит при найденном первом символе не являющемся цифрой.
ROM:1D5C ; Максимально допустимое число строк 65529. Синтаксическая ошибка появится, если значение первых четырех цифр более 6552.
ROM:1D5C ; Одной из интересных особенностей этой функции является то, что он устанавливает Z, если найден правильный номер (или строка была пустой),
ROM:1D5C ; или NZ, если строка не начинается с номера.
ROM:1D5C ;
ROM:1D5F xchg
ROM:1D60 shld ERRES ; Временная переменная обработчика ошибок.
ROM:1D63 xchg
ROM:1D64 ret
ROM:1D65 ; ---------------------------------------------------------------------------
ROM:1D65
ROM:1D65 ERROR: ; Обработка оператора ERROR
ROM:1D65 call GETINTPARAM
ROM:1D68 dcr a
ROM:1D69 rlc
ROM:1D6A jmp loc_3150
ROM:1D6D ; ---------------------------------------------------------------------------
ROM:1D6D
ROM:1D6D ERL: ; Обработка оператора ERL
ROM:1D6D xchg
ROM:1D6E lhld ERLTMP ; Временная переменная функции ERL
ROM:1D71 xchg
ROM:1D72 mov a, d
ROM:1D73 mov b, e
ROM:1D74 jmp INLONGINT ; Ввод длинного целого.
ROM:1D77 ; ---------------------------------------------------------------------------
ROM:1D77
ROM:1D77 ERR: ; Обработка оператора ERR
ROM:1D77 lda ERRTMP
ROM:1D7A jmp SHORTINT ; Получение короткого целого из A
ROM:1D7D
ROM:1D7D ; =============== S U B R O U T I N E =======================================
ROM:1D7D
ROM:1D7D ; Обработка ошибок.
ROM:1D7D
ROM:1D7D ERRTR: ; CODE XREF: CHECKENOUGHMEM:MAINLOOP1p
ROM:1D7D call RRCAE ; Загружает в A из E, вращает вправо и инкременитирует
ROM:1D80 sta ERRTMP ; Код ошибки функции ERR
ROM:1D83 lhld BASOPNUM ; Номер оператора Бейсик программы.
ROM:1D83 ; Или &hFFFF в командном режиме
ROM:1D86 shld ERLTMP ; Временная переменная функции ERL
ROM:1D89 lhld ERRES ; Временная переменная обработчика ошибок.
ROM:1D8C mov a, h
ROM:1D8D ora l
ROM:1D8E jz RESETSTACK ; Инициализирует адрес рабочей области арифметических преобразований,
ROM:1D8E ; обнуляет временные переменные FORTMP, AUTOTR
ROM:1D91 shld ERRTRTMP2 ; Временная переменная обработчика ошибок ERRTR
ROM:1D94 xchg
ROM:1D95 call ERRTR2 ; Подпрограмма обработчика ошибок.
ROM:1D98 lxi b, EXECNEXT ; Сюда вернётся бейсик интерпретатор после отработки команды RUN, RETURN, после обработки ошибок.
ROM:1D98 ; Вычисляет одно выражение, передвигается на следующее выражение или на новую стоку, если в текущей строке нет больше выражений.
ROM:1D98 ;
ROM:1D9B push b
ROM:1D9C lhld CURBASLN ; Текущий адрес строки Бейсик программы
ROM:1D9F shld ERRTRTMP ; Временная переменная обработчика ошибок ERRTR, ERRTR2 и RESUME.
ROM:1DA2 jmp GOTOPRE ; Подготавливает переход на строку бейсик-программы
ROM:1DA2 ; End of function ERRTR
ROM:1DA2
ROM:1DA5 ; ---------------------------------------------------------------------------
ROM:1DA5
ROM:1DA5 RESUME: ; Обработка бейсик-оператора RESUME
ROM:1DA5 lhld ERRTRTMP
ROM:1DA8 mov a, h
ROM:1DA9 ora l
ROM:1DAA mvi e, 28h ; '('
ROM:1DAC jz MAINLOOP1 ; Первая точка входа в главный цикл
ROM:1DAF xchg
ROM:1DB0 lhld ERRTRTMP2 ; Временная переменная обработчика ошибок ERRTR
ROM:1DB3 shld ERRES ; Временная переменная обработчика ошибок.
ROM:1DB6 xchg
ROM:1DB7 inx h
ROM:1DB8 jmp DATA+2 ; Обработка бейсик-команд DATA и REM. Обратите внимание на комментарий ниже.
ROM:1DB8 ; 06FB: REM: MVI C, 0
ROM:1DB8 ; MVI B, 0
ROM:1DB8 ; LOC_6FF: MOV A, C
ROM:1DB8 ; .....
ROM:1DB8 ;
ROM:1DB8 ; FINDNEXTSTATEMENT:
ROM:1DBB
ROM:1DBB ; =============== S U B R O U T I N E =======================================
ROM:1DBB
ROM:1DBB ; Печатает пригласительный знак вопроса в команде INPUT и сообщении об ошибке
ROM:1DBB
ROM:1DBB INPUTPRN: ; CODE XREF: CHECKENOUGHMEM+27p
ROM:1DBB ; INPUTSTRp
ROM:1DBB mvi a, 3Fh ; '?'
ROM:1DBD rst 3 ; RST3 = печатает символ из A на экран.
ROM:1DBE mvi a, 20h ; ' '
ROM:1DC0 rst 3 ; RST3 = печатает символ из A на экран.
ROM:1DC0 ; End of function INPUTPRN
ROM:1DC0
ROM:1DC1
ROM:1DC1 ; =============== S U B R O U T I N E =======================================
ROM:1DC1
ROM:1DC1 ; Загружает в A из E, вращает вправо и инкременитирует
ROM:1DC1
ROM:1DC1 RRCAE: ; CODE XREF: ERRTRp
ROM:1DC1 mov a, e
ROM:1DC2 rrc
ROM:1DC3 inr a
ROM:1DC4 ret
ROM:1DC4 ; End of function RRCAE
ROM:1DC4
ROM:1DC5 ; ---------------------------------------------------------------------------
ROM:1DC5
ROM:1DC5 AUTO: ; Обработка бейсик команды AUTO
ROM:1DC5 jz loc_1DE3
ROM:1DC8 cpi 2Ch ; ',' ; команда может быть и вида AUTO ,10
ROM:1DCA jz loc_1DD5
ROM:1DCD call GETPRM ; Считываем параметр для Бейсик команды
ROM:1DD0 xchg
ROM:1DD1 shld AUTONUM ; Номер AUTO
ROM:1DD4 xchg
ROM:1DD5
ROM:1DD5 loc_1DD5: ; CODE XREF: ROM:1DCAj
ROM:1DD5 call loc_1CDB
ROM:1DD8 jnz loc_1DE3 ; команда может быть также вида AUTO 10,
ROM:1DDB call GETPRM ; Считываем параметр для Бейсик команды
ROM:1DDE xchg
ROM:1DDF shld AUTOINC ; Инкремент AUTO
ROM:1DE2 xchg
ROM:1DE3
ROM:1DE3 loc_1DE3: ; CODE XREF: ROM:AUTOj
ROM:1DE3 ; ROM:1DD8j
ROM:1DE3 xchg
ROM:1DE4 lhld AUTONUM ; Номер AUTO
ROM:1DE7 shld AITMP ; Временная переменная. Используется в командах AUTO и INPUTLN
ROM:1DEA mvi a, 1
ROM:1DEC sta ASITT ; Временная переменная. Используется в AUTO, STOP, INPUTLN, TOKENIZE, TRETLINE
ROM:1DEF xchg
ROM:1DF0 call RESETSTACK ; Инициализирует адрес рабочей области арифметических преобразований,
ROM:1DF0 ; обнуляет временные переменные FORTMP, AUTOTR
ROM:1DF3 call EDIT1 ; Опрашивает флаг печати, формирует таблицу событий, Очищает переменную TERMINAL_X,
ROM:1DF3 ; устанавливает текстовый режим (MODE), очищает буфер клавиатуры и временные переменные
ROM:1DF6 jmp MAIN ; Вторая точка входа в главный цикл. Переход из AUTO
ROM:1DF6 ; Эта процедура ждёт ввода строки и если строка без номера, то пытается сразу выполнить её (EXEC immediately).
ROM:1DF9 ; ---------------------------------------------------------------------------
ROM:1DF9 ; START OF FUNCTION CHUNK FOR INPUTLN
ROM:1DF9
ROM:1DF9 loc_1DF9: ; CODE XREF: INPUTLN+3j
ROM:1DF9 lda ASITT ; Временная переменная. Используется в AUTO, STOP, INPUTLN, TOKENIZE, TRETLINE
ROM:1DFC ora a
ROM:1DFD jz loc_3DD
ROM:1E00 lhld AITMP ; Временная переменная. Используется в командах AUTO и INPUTLN
ROM:1E03 push h
ROM:1E04 call PRINTINT ; Переводит целое число HL в число с плавающей точкой FACCUM.
ROM:1E04 ; В частности, печатает номер строки Бейсик-программы, выполняющейся в данный момент времени.
ROM:1E07 pop h
ROM:1E08 xchg
ROM:1E09 lhld AUTOINC ; Инкремент AUTO
ROM:1E0C dad d
ROM:1E0D shld AITMP ; Временная переменная. Используется в командах AUTO и INPUTLN
ROM:1E10 call FINDPROGRAMLINE ; Получает ближайший адрес строки программы в BC
ROM:1E13 mvi a, 20h ; ' '
ROM:1E15 jnc loc_1E1A
ROM:1E18 mvi a, 2Ah ; '*'
ROM:1E1A
ROM:1E1A loc_1E1A: ; CODE XREF: INPUTLN+1936j
ROM:1E1A rst 3 ; RST3 = печатает символ из A на экран.
ROM:1E1B jmp loc_3DD
ROM:1E1B ; END OF FUNCTION CHUNK FOR INPUTLN
ROM:1E1E
ROM:1E1E ; =============== S U B R O U T I N E =======================================
ROM:1E1E
ROM:1E1E ; Токенизирует строковый буфер, замещая ключевые слова их ID.
ROM:1E1E ; Возвращает длинну токенизируемой строки в C, при A=0.
ROM:1E1E ; Далее загружает в B ноль, поэтому длина строки в BC получается 16 битная.
ROM:1E1E
ROM:1E1E TOKENIZE: ; CODE XREF: CHECKENOUGHMEM+60p
ROM:1E1E
ROM:1E1E ; FUNCTION CHUNK AT ROM:03E6 SIZE 0000004F BYTES
ROM:1E1E ; FUNCTION CHUNK AT ROM:0436 SIZE 00000040 BYTES
ROM:1E1E ; FUNCTION CHUNK AT ROM:17CC SIZE 0000000D BYTES
ROM:1E1E
ROM:1E1E lda ASITT ; Временная переменная. Используется в AUTO, STOP, INPUTLN, TOKENIZE, TRETLINE
ROM:1E21 ora a
ROM:1E22 jz loc_3E6
ROM:1E25 mov a, m
ROM:1E26 cpi 2Ah ; '*'
ROM:1E28 jnz loc_3E6
ROM:1E2B rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:1E2B ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:1E2B ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:1E2C jnz loc_3E6
ROM:1E2F pop h
ROM:1E30 jmp loc_30D ; НУ ВОТ, СОБСТВЕННО! ЭТО И ЕСТЬ САМЫЙ ГЛАВНЫЙ ЦИКЛ БЕЙСИК-ИНТЕРПРЕТАТОРА!
ROM:1E30 ; End of function TOKENIZE
ROM:1E30
ROM:1E33 ; ---------------------------------------------------------------------------
ROM:1E33 ; START OF FUNCTION CHUNK FOR INPUTLN
ROM:1E33
ROM:1E33 loc_1E33: ; CODE XREF: INPUTLN+1976j
ROM:1E33 xchg
ROM:1E34 call INPUTLN2 ; Вводит строку без отображения курсора. Основная часть функции.
ROM:1E37 xchg
ROM:1E38 jz TERMINATEINPUT
ROM:1E3B mvi m, 0
ROM:1E3D inx h
ROM:1E3E inx h
ROM:1E3F shld EITMP ; Временная переменная. Используется в INPUTLN, ERRTR2
ROM:1E42 xchg
ROM:1E43 dcx h
ROM:1E44 ret
ROM:1E45 ; ---------------------------------------------------------------------------
ROM:1E45
ROM:1E45 loc_1E45: ; CODE XREF: INPUTLN+197Aj
ROM:1E45 call RESETSTACK ; Инициализирует адрес рабочей области арифметических преобразований,
ROM:1E45 ; обнуляет временные переменные FORTMP, AUTOTR
ROM:1E48 jmp MAINLOOP3 ; Третья точка входа в главный цикл. Переход из INIT2, STOP, CSAVE, OUTCHAR2, INPUTLN
ROM:1E4B ; ---------------------------------------------------------------------------
ROM:1E4B
ROM:1E4B loc_1E4B: ; CODE XREF: INPUTLN-FDj
ROM:1E4B ; INPUTLN+6j
ROM:1E4B lxi b, 0D1Ah
ROM:1E4E lxi d, 61h ; 'a'
ROM:1E51 dcx h
ROM:1E52
ROM:1E52 loc_1E52: ; CODE XREF: INPUTLN+1986j
ROM:1E52 ; INPUTLN+1990j ...
ROM:1E52 inx h
ROM:1E53 mov a, m
ROM:1E54 cmp b
ROM:1E55 jz loc_1E33
ROM:1E58 cmp c
ROM:1E59 jz loc_1E45
ROM:1E5C cpi 22h ; '"'
ROM:1E5E mov a, d
ROM:1E5F jnz loc_1E64
ROM:1E62 cma
ROM:1E63 mov d, a
ROM:1E64
ROM:1E64 loc_1E64: ; CODE XREF: INPUTLN+1980j
ROM:1E64 ana a
ROM:1E65 jnz loc_1E52
ROM:1E68 mov a, m
ROM:1E69 nop
ROM:1E6A nop
ROM:1E6B nop
ROM:1E6C nop
ROM:1E6D cpi 7Bh ; '{'
ROM:1E6F jnc loc_1E52
ROM:1E72 cmp e
ROM:1E73 jc loc_1E52
ROM:1E76 ani 0DFh
ROM:1E78 mov m, a
ROM:1E79 jmp loc_1E52
ROM:1E79 ; END OF FUNCTION CHUNK FOR INPUTLN
ROM:1E7C ; ---------------------------------------------------------------------------
ROM:1E7C mvi m, 20h ; ' '
ROM:1E7E jmp loc_1E52
ROM:1E81
ROM:1E81 ; =============== S U B R O U T I N E =======================================
ROM:1E81
ROM:1E81 ; Ждем появление запятой и считываем параметр, следующий за ней
ROM:1E81
ROM:1E81 GETPRM2: ; CODE XREF: ROM:19DDp
ROM:1E81 ; ROM:19E1p ...
ROM:1E81 rst 1 ; RST1 = проверка синтаксиса.
ROM:1E81 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:1E81 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:1E81 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:1E81 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:1E81 ; ---------------------------------------------------------------------------
ROM:1E82 .db ','
ROM:1E83 ; ---------------------------------------------------------------------------
ROM:1E83
ROM:1E83 GETPRM: ; CODE XREF: PSETTR+Dp
ROM:1E83 ; ROM:1DCDp ...
ROM:1E83 push b ; Считываем параметр для Бейсик команды
ROM:1E84 call EVALEXPRESSION ; Вычисляет выражение, возвращая результат в FACCUM. Выражение должно быть комбинацией термов и операторов.
ROM:1E87 rst 5 ; RST5 = Проверяет состояние FACCUM.
ROM:1E87 ; Возвращает A = 0 и устанавливает Z, если FACCUM == 0, хвост функции устанавливает флаг знака и A соответственно
ROM:1E87 ; (0xFF если отрицательно, 0x01 если положительно).
ROM:1E88 call INTFROMFLOAT ; Получение целого числа из числа с плавающей точкой
ROM:1E8B pop b
ROM:1E8C ret
ROM:1E8C ; End of function GETPRM2
ROM:1E8C
ROM:1E8D ; ---------------------------------------------------------------------------
ROM:1E8D rst 5 ; RST5 = Проверяет состояние FACCUM.
ROM:1E8D ; Возвращает A = 0 и устанавливает Z, если FACCUM == 0, хвост функции устанавливает флаг знака и A соответственно
ROM:1E8D ; (0xFF если отрицательно, 0x01 если положительно).
ROM:1E8E call INTFROMFLOAT ; Получение целого числа из числа с плавающей точкой
ROM:1E91 ret
ROM:1E92
ROM:1E92 ; =============== S U B R O U T I N E =======================================
ROM:1E92
ROM:1E92 ; Расчет точек для LINE
ROM:1E92
ROM:1E92 LINECLC: ; CODE XREF: LINE_ASM+Dp
ROM:1E92 ; ROM:1BC9p
ROM:1E92 lhld X1 ; Первый графический курсор, координата X
ROM:1E95 lda X2 ; Второй графический курсор, координата X
ROM:1E98 sub l
ROM:1E99 mov e, a
ROM:1E9A jnc loc_1EA8
ROM:1E9D cma
ROM:1E9E inr a
ROM:1E9F mov e, a
ROM:1EA0 mov a, l
ROM:1EA1 sub e
ROM:1EA2 mov l, a
ROM:1EA3 mvi a, 0FFh
ROM:1EA5 sta LINE1 ; Параметр команды LINE
ROM:1EA8
ROM:1EA8 loc_1EA8: ; CODE XREF: LINECLC+8j
ROM:1EA8 lda Y2 ; Второй графический курсор, координата Y
ROM:1EAB sub h
ROM:1EAC mov d, a
ROM:1EAD rnc
ROM:1EAE cma
ROM:1EAF inr a
ROM:1EB0 mov d, a
ROM:1EB1 mov a, h
ROM:1EB2 sub d
ROM:1EB3 mov h, a
ROM:1EB4 mvi a, 0FFh
ROM:1EB6 sta LINE100_ ; Параметр команды LINE
ROM:1EB9 ret
ROM:1EB9 ; End of function LINECLC
ROM:1EB9
ROM:1EBA ; ---------------------------------------------------------------------------
ROM:1EBA
ROM:1EBA TR: ; Обработка Бейсик команд TRON/TROFF
ROM:1EBA call TRTR
ROM:1EBD sta TRFLAG ; Флаг трассировки
ROM:1EC0 inx h
ROM:1EC1 ret
ROM:1EC2
ROM:1EC2 ; =============== S U B R O U T I N E =======================================
ROM:1EC2
ROM:1EC2 ; Обработчик TR
ROM:1EC2
ROM:1EC2 TRTR: ; CODE XREF: ROM:1D3Fp
ROM:1EC2 ; ROM:TRp
ROM:1EC2 cpi 91h ; 'С'
ROM:1EC4 rz ; Ожидаем токен ON
ROM:1EC5 cpi 0DFh ; '-' ; Ожидаем токен OFF
ROM:1EC7 jnz SYNTAXERROR ; Самая распространённая ошибка №2
ROM:1ECA xra a
ROM:1ECB ret
ROM:1ECB ; End of function TRTR
ROM:1ECB
ROM:1ECC ; ---------------------------------------------------------------------------
ROM:1ECC pop h
ROM:1ECD xthl
ROM:1ECE call GETVAR ; Поиск и инициализация переменной.
ROM:1ECE ; HL указывает на имя переменной, которая встретилась во время интерпретации.
ROM:1ECE ; Функция возвращает в DE указатель на значение переменной.
ROM:1ECE ; Если переменная не существует, то функция выделяет ей память и инициализирует её.
ROM:1ED1 rst 1 ; RST1 = проверка синтаксиса.
ROM:1ED1 ; Байт идущий сразу после инструкции RST1 не есть следующая инструкция,
ROM:1ED1 ; но ключевое слово или оператор идентификатор, который, как ожидают, появится в программе в этой точке.
ROM:1ED1 ; Если ключевое слово или оператор не присутствует, то возникает Синтаксическая ошибка,
ROM:1ED1 ; но, если он присутствует, то адрес возврата увеличивается на один байт - и функция попадает в NEXTCHAR.
ROM:1ED1 ; ---------------------------------------------------------------------------
ROM:1ED2 .db 0AAh ; OR (токен 170 (&hAA))
ROM:1ED3 ; ---------------------------------------------------------------------------
ROM:1ED3 jmp loc_1F65
ROM:1ED6
ROM:1ED6 ; =============== S U B R O U T I N E =======================================
ROM:1ED6
ROM:1ED6 ; Обработка трассировки. Печатает квадратные скобки и номер выполняющейся в данный момент строки Бейсик-программы.
ROM:1ED6
ROM:1ED6 TRACEPRN: ; CODE XREF: NEXT2-377p
ROM:1ED6 shld BASOPNUM ; Номер оператора Бейсик программы.
ROM:1ED6 ; Или &hFFFF в командном режиме
ROM:1ED9 lda TRFLAG ; Флаг трассировки
ROM:1EDC ana a
ROM:1EDD rz
ROM:1EDE push d
ROM:1EDF mvi a, 5Bh ; '['
ROM:1EE1 rst 3 ; RST3 = печатает символ из A на экран.
ROM:1EE2 call PRINTINT ; Переводит целое число HL в число с плавающей точкой FACCUM.
ROM:1EE2 ; В частности, печатает номер строки Бейсик-программы, выполняющейся в данный момент времени.
ROM:1EE5 mvi a, 5Dh ; ']'
ROM:1EE7 rst 3 ; RST3 = печатает символ из A на экран.
ROM:1EE8 pop d
ROM:1EE9 ret
ROM:1EE9 ; End of function TRACEPRN
ROM:1EE9
ROM:1EEA ; ---------------------------------------------------------------------------
ROM:1EEA
ROM:1EEA POINT: ; Обработка оператора POINT
ROM:1EEA pop h
ROM:1EEB xthl
ROM:1EEC inx h
ROM:1EED lxi b, X1 ; Первый графический курсор, координата X
ROM:1EF0 call PSETTR ; Обработка PSET/PRESET/LINE. Получение всех параметров.
ROM:1EF0 ; Есть ли токен STEP. Заполняем PSETX, PSETY. Указал ли цвет и если да, то читаем его.
ROM:1EF3 lda PSETX ; Координата X команды PSET в виде байта
ROM:1EF6 ora d
ROM:1EF7 jnz loc_1F34
ROM:1EFA lda MODE ; Режим экрана
ROM:1EFD cpi 2
ROM:1EFF jnz loc_1F16
ROM:1F02 call PRESETWT2 ; Рисование точки белым цветом (FD90 координата X, FD91 координата Y)
ROM:1F05 ana b
ROM:1F06 mov a, c
ROM:1F07 jnz loc_1F0E
ROM:1F0A rrc
ROM:1F0B rrc
ROM:1F0C rrc
ROM:1F0D rrc
ROM:1F0E
ROM:1F0E loc_1F0E: ; CODE XREF: ROM:1F07j
ROM:1F0E ani 0Fh
ROM:1F10 mov e, a
ROM:1F11
ROM:1F11 loc_1F11: ; CODE XREF: ROM:1F30j
ROM:1F11 mvi d, 0
ROM:1F13 jmp loc_1F65
ROM:1F16 ; ---------------------------------------------------------------------------
ROM:1F16
ROM:1F16 loc_1F16: ; CODE XREF: ROM:1EFFj
ROM:1F16 push h
ROM:1F17 lhld X1 ; Первый графический курсор, координата X
ROM:1F1A xchg
ROM:1F1B lhld DLSF ; Длина строки экрана
ROM:1F1E mov a, d
ROM:1F1F cmp h
ROM:1F20 jnc loc_1F33
ROM:1F23 mov a, e
ROM:1F24 cmp l
ROM:1F25 jnc loc_1F33
ROM:1F28 call INTERRPT ; Кто объяснит мне этот кусок - буду благодарен. Вызывается из функции POINT перед тем, как нарисовать точку. Три раза делает RST 7.
ROM:1F2B call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM).
ROM:1F2E pop h
ROM:1F2F mov e, a
ROM:1F30 jmp loc_1F11
ROM:1F33 ; ---------------------------------------------------------------------------
ROM:1F33
ROM:1F33 loc_1F33: ; CODE XREF: ROM:1F20j
ROM:1F33 ; ROM:1F25j
ROM:1F33 pop h
ROM:1F34
ROM:1F34 loc_1F34: ; CODE XREF: ROM:1EF7j
ROM:1F34 lxi d, 0FFFFh
ROM:1F37 jmp loc_1F65
ROM:1F3A ; ---------------------------------------------------------------------------
ROM:1F3A ; START OF FUNCTION CHUNK FOR BINHEX
ROM:1F3A
ROM:1F3A H_: ; CODE XREF: BINHEX+10j
ROM:1F3A pop h
ROM:1F3B xthl
ROM:1F3C mvi b, 4
ROM:1F3E lxi d, loc_1F65
ROM:1F41 push d
ROM:1F42 lxi d, 0
ROM:1F45 dcx h
ROM:1F46
ROM:1F46 loc_1F46: ; CODE XREF: BINHEX-3Dj
ROM:1F46 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:1F46 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:1F46 ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:1F47 rz
ROM:1F48 jc loc_1F55
ROM:1F4B ani 0DFh
ROM:1F4D cpi 41h ; 'A'
ROM:1F4F rc
ROM:1F50 cpi 47h ; 'G'
ROM:1F52 rnc
ROM:1F53 sui 7
ROM:1F55
ROM:1F55 loc_1F55: ; CODE XREF: BINHEX-55j
ROM:1F55 ani 0Fh
ROM:1F57 xchg
ROM:1F58 dad h
ROM:1F59 dad h
ROM:1F5A dad h
ROM:1F5B dad h
ROM:1F5C xchg
ROM:1F5D ora e
ROM:1F5E mov e, a
ROM:1F5F dcr b
ROM:1F60 jnz loc_1F46
ROM:1F63 pop b
ROM:1F64 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:1F64 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:1F64 ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:1F65
ROM:1F65 loc_1F65: ; CODE XREF: ROM:1ED3j
ROM:1F65 ; ROM:1F13j ...
ROM:1F65 mov a, d
ROM:1F66 mov b, e
ROM:1F67 xthl
ROM:1F68 push h
ROM:1F69 jmp INLONGINT ; Ввод длинного целого.
ROM:1F6C ; ---------------------------------------------------------------------------
ROM:1F6C
ROM:1F6C B_: ; CODE XREF: BINHEX+15j
ROM:1F6C pop h ; Обработка двоичных чисел.
ROM:1F6D xthl
ROM:1F6E mvi b, 10h
ROM:1F70 lxi d, loc_1F65
ROM:1F73 push d
ROM:1F74 lxi d, 0
ROM:1F77 dcx h
ROM:1F78
ROM:1F78 loc_1F78: ; CODE XREF: BINHEX-17j
ROM:1F78 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:1F78 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:1F78 ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:1F79 rz
ROM:1F7A rnc
ROM:1F7B cpi 32h ; '2'
ROM:1F7D rnc
ROM:1F7E ani 1
ROM:1F80 xchg
ROM:1F81 dad h
ROM:1F82 xchg
ROM:1F83 ora e
ROM:1F84 mov e, a
ROM:1F85 dcr b
ROM:1F86 jnz loc_1F78
ROM:1F89 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:1F89 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:1F89 ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:1F8A ret
ROM:1F8A ; END OF FUNCTION CHUNK FOR BINHEX
ROM:1F8B
ROM:1F8B ; =============== S U B R O U T I N E =======================================
ROM:1F8B
ROM:1F8B ; Обработчик перевода числа с плавающей точкой в целое
ROM:1F8B
ROM:1F8B FASINTEGERTR: ; CODE XREF: INTFROMFLOAT+5p
ROM:1F8B pop b
ROM:1F8C jc FASINTEGER ; Перевод числа с плавающей точкой в целое.
ROM:1F8C ; Возвращает целую часть FACCUM в CDE.
ROM:1F8F push b
ROM:1F90 rnz
ROM:1F91 mov b, a
ROM:1F92 lda FACCUM+2 ; Аккумулятор для вычислений с плавающей точкой:
ROM:1F92 ; 00000000 1 11111111111111111111111
ROM:1F92 ; -------- - -----------------------
ROM:1F92 ; 8 бит экспонента 1 бит знак 23 бита мантисс
ROM:1F95 ani 80h
ROM:1F97 rnz
ROM:1F98 mov a, b
ROM:1F99 pop b
ROM:1F9A jmp FASINTEGER ; Перевод числа с плавающей точкой в целое.
ROM:1F9A ; End of function FASINTEGERTR ; Возвращает целую часть FACCUM в CDE.
ROM:1F9A
ROM:1F9D
ROM:1F9D ; =============== S U B R O U T I N E =======================================
ROM:1F9D
ROM:1F9D ; Обработчик двоичных и шестнадцатеричных чисел в VAL
ROM:1F9D
ROM:1F9D BINHEX: ; CODE XREF: ROM:0FDAp
ROM:1F9D
ROM:1F9D ; FUNCTION CHUNK AT ROM:1F3A SIZE 00000051 BYTES
ROM:1F9D
ROM:1F9D cpi 26h ; '&'
ROM:1F9F jnz FIN ; Функция читающая число с плавающей точкой из ASCII-текста.
ROM:1F9F ; Читает строку и конвертирует её в число с плавающей точкой в FACCUM.
ROM:1FA2 rst 2 ; RST2 = возвращает в A следующий символ ввода из буфера в HL,
ROM:1FA2 ; пропуская пробелы. Флаг переноса устанавливается, если вернулся символ не буквенно-цифровой,
ROM:1FA2 ; также нулевой флаг устанавливается, если был достигнут нулевой символ.
ROM:1FA3 inx h
ROM:1FA4 ani 0DFh
ROM:1FA6 push h
ROM:1FA7 lxi h, loc_1876
ROM:1FAA push h
ROM:1FAB cpi 48h ; 'H'
ROM:1FAD jz H_
ROM:1FB0 cpi 42h ; 'B'
ROM:1FB2 jz B_ ; Обработка двоичных чисел.
ROM:1FB5 pop h
ROM:1FB6 xthl
ROM:1FB7 pop h
ROM:1FB8 jmp FZERO ; Устанавливает FACCUM в ноль.
ROM:1FB8 ; End of function BINHEX
ROM:1FB8
ROM:1FBB ; ---------------------------------------------------------------------------
ROM:1FBB
ROM:1FBB HEX: ; Обработчик бейсик-функции HEX
ROM:1FBB rst 5
ROM:1FBC call INTFROMFLOAT ; Получение целого числа из числа с плавающей точкой
ROM:1FBF lxi b, INTAR+20h ; Рабочая область обработки прерываний
ROM:1FC2 mov a, d
ROM:1FC3 ana a
ROM:1FC4 mvi d, 2
ROM:1FC6 jz loc_1FCE
ROM:1FC9 mvi d, 4
ROM:1FCB call BTDECODE ; A=байт, BC=адрес
ROM:1FCB ; (перекодировка A (шестнадцатеричного) в символы)
ROM:1FCE
ROM:1FCE loc_1FCE: ; CODE XREF: ROM:1FC6j
ROM:1FCE mov a, e
ROM:1FCF call BTDECODE ; A=байт, BC=адрес
ROM:1FCF ; (перекодировка A (шестнадцатеричного) в символы)
ROM:1FD2 mov a, d
ROM:1FD3 jmp loc_1989
ROM:1FD6 ; ---------------------------------------------------------------------------
ROM:1FD6
ROM:1FD6 PUT: ; Бейсик-оператор PUT
ROM:1FD6 inx h
ROM:1FD7 lxi b, X1 ; Первый графический курсор, координата X
ROM:1FDA call PSETTR ; Обработка PSET/PRESET/LINE. Получение всех параметров.
ROM:1FDA ; Есть ли токен STEP. Заполняем PSETX, PSETY. Указал ли цвет и если да, то читаем его.
ROM:1FDD call VARRTR ; Подпрограмма работы с видеомассивом. Используется в PUT и GET
ROM:1FE0 xchg
ROM:1FE1 push d
ROM:1FE2 call PUTTR ; Подпрограмма-обработчик PUT
ROM:1FE5 pop h
ROM:1FE6 ret
ROM:1FE7
ROM:1FE7 ; =============== S U B R O U T I N E =======================================
ROM:1FE7
ROM:1FE7 ; Подпрограмма работы с видеомассивом. Используется в PUT и GET
ROM:1FE7
ROM:1FE7 VARRTR: ; CODE XREF: ROM:1FDDp
ROM:1FE7 ; ROM:2154p
ROM:1FE7 jnz SYNTAXERROR ; Самая распространённая ошибка №2
ROM:1FEA call GETVAR ; Поиск и инициализация переменной.
ROM:1FEA ; HL указывает на имя переменной, которая встретилась во время интерпретации.
ROM:1FEA ; Функция возвращает в DE указатель на значение переменной.
ROM:1FEA ; Если переменная не существует, то функция выделяет ей память и инициализирует её.
ROM:1FED xchg
ROM:1FEE lxi b, TMPBUF+11Dh ; Временный буфер CLOAD
ROM:1FF1 dad b
ROM:1FF2 xchg
ROM:1FF3 ret
ROM:1FF3 ; End of function VARRTR
ROM:1FF3
ROM:1FF4
ROM:1FF4 ; =============== S U B R O U T I N E =======================================
ROM:1FF4
ROM:1FF4 ; Подпрограмма-обработчик PUT
ROM:1FF4
ROM:1FF4 PUTTR: ; CODE XREF: ROM:1FE2p
ROM:1FF4 lda Y1 ; Первый графический курсор, координата Y
ROM:1FF7 cpi 0C0h ; 'L'
ROM:1FF9 rnc
ROM:1FFA push h
ROM:1FFB call PRESETWT2 ; Рисование точки белым цветом (FD90 координата X, FD91 координата Y)
ROM:1FFE pop h
ROM:1FFF push b
ROM:2000 lxi b, 9
ROM:2003 dad b
ROM:2004 pop b
ROM:2005 lda PSETX ; Координата X команды PSET в виде байта
ROM:2008 rrc
ROM:2009 rrc
ROM:200A rrc
ROM:200B ani 1Fh
ROM:200D mov c, a
ROM:200E mov a, m
ROM:200F sub c
ROM:2010 rc
ROM:2011 rz
ROM:2012 sta VIDEO1 ; Видео-переменная. Используется в PUTTR и VIDEOTR
ROM:2015 inx h
ROM:2016 mov a, c
ROM:2017 ora a
ROM:2018 jnz loc_2023
ROM:201B lda PSETY ; Координата Y команды PSET в виде байта
ROM:201E mov c, a
ROM:201F mov a, m
ROM:2020 jmp loc_2039
ROM:2023 ; ---------------------------------------------------------------------------
ROM:2023
ROM:2023 loc_2023: ; CODE XREF: PUTTR+24j
ROM:2023 push d
ROM:2024 mov e, m
ROM:2025 mvi d, 0
ROM:2027 push h
ROM:2028 lxi h, 0
ROM:202B
ROM:202B loc_202B: ; CODE XREF: PUTTR+39j
ROM:202B dad d
ROM:202C dcr c
ROM:202D jnz loc_202B
ROM:2030 pop d
ROM:2031 dad h
ROM:2032 lda PSETY ; Координата Y команды PSET в виде байта
ROM:2035 mov c, a
ROM:2036 ldax d
ROM:2037 dad d
ROM:2038 pop d
ROM:2039
ROM:2039 loc_2039: ; CODE XREF: PUTTR+2Cj
ROM:2039 inx h
ROM:203A sub c
ROM:203B rz
ROM:203C rc
ROM:203D sta VIDEO2 ; Видео-переменная. Используется в PUTTR и VIDEOTR
ROM:2040 lda PSETX ; Координата X команды PSET в виде байта
ROM:2043 ani 7
ROM:2045 jz loc_2051
ROM:2048 mov c, a
ROM:2049 mvi a, 80h ; 'А'
ROM:204B
ROM:204B loc_204B: ; CODE XREF: PUTTR+59j
ROM:204B rlc
ROM:204C dcr c
ROM:204D jnz loc_204B
ROM:2050 mov b, a
ROM:2051
ROM:2051 loc_2051: ; CODE XREF: PUTTR+51j
ROM:2051 mvi a, 80h ; 'А'
ROM:2053 mvi c, 0
ROM:2055 push d
ROM:2056 mvi d, 8
ROM:2058
ROM:2058 loc_2058: ; CODE XREF: PUTTR+6Bj
ROM:2058 cmp b
ROM:2059 jz loc_2064
ROM:205C rrc
ROM:205D inr c
ROM:205E dcr d
ROM:205F jnz loc_2058
ROM:2062 pop d
ROM:2063 ret
ROM:2064 ; ---------------------------------------------------------------------------
ROM:2064
ROM:2064 loc_2064: ; CODE XREF: PUTTR+65j
ROM:2064 pop d
ROM:2065
ROM:2065 loc_2065: ; CODE XREF: PUTTR+73j
ROM:2065 ora b
ROM:2066 ral
ROM:2067 jnc loc_2065
ROM:206A sta VIDEO3 ; Видео-переменная. Используется в PUTTR и VIDEOTR
ROM:206D cma
ROM:206E sta PUTTRTMP ; Временная переменная PUTTR
ROM:2071 mov a, c
ROM:2072 sta PUTTRTMP2 ; Временная переменная PUTTR
ROM:2075 ora a
ROM:2076 jz loc_2080
ROM:2079 lda VIDEO1 ; Видео-переменная. Используется в PUTTR и VIDEOTR
ROM:207C inr a
ROM:207D sta VIDEO1 ; Видео-переменная. Используется в PUTTR и VIDEOTR
ROM:2080
ROM:2080 loc_2080: ; CODE XREF: PUTTR+82j
ROM:2080 push d
ROM:2081 push d
ROM:2082 lda PSETY ; Координата Y команды PSET в виде байта
ROM:2085 rlc
ROM:2086 mov e, a
ROM:2087 mvi d, 0
ROM:2089 xchg
ROM:208A shld VIDEOBUF ; Видеобуфер. Используется командами PUT и GET (PUTTR, VIDEOTR)
ROM:208D xchg
ROM:208E lxi d, VIDEOBUF+2 ; Видеобуфер. Используется командами PUT и GET (PUTTR, VIDEOTR)
ROM:2091 lda PSETX ; Координата X команды PSET в виде байта
ROM:2094 ora a
ROM:2095 jz loc_20C4
ROM:2098 lda VIDEO3 ; Видео-переменная. Используется в PUTTR и VIDEOTR
ROM:209B ora a
ROM:209C jz loc_20C4
ROM:209F push d
ROM:20A0 xchg
ROM:20A1 lhld VIDEOBUF ; Видеобуфер. Используется командами PUT и GET (PUTTR, VIDEOTR)
ROM:20A4 dad d
ROM:20A5 pop d
ROM:20A6 lda VIDEO2 ; Видео-переменная. Используется в PUTTR и VIDEOTR
ROM:20A9 sta VIDEO4 ; Видео-переменная. Используется в PUTTR и VIDEOTR
ROM:20AC
ROM:20AC loc_20AC: ; CODE XREF: PUTTR+CAj
ROM:20AC call PUTTR2 ; Обработчик PUT. Подпрограмма.
ROM:20AF lda VIDEO3 ; Видео-переменная. Используется в PUTTR и VIDEOTR
ROM:20B2 ana c
ROM:20B3 stax d
ROM:20B4 inx d
ROM:20B5 inx h
ROM:20B6 inx h
ROM:20B7 lda VIDEO4 ; Видео-переменная. Используется в PUTTR и VIDEOTR
ROM:20BA dcr a
ROM:20BB sta VIDEO4 ; Видео-переменная. Используется в PUTTR и VIDEOTR
ROM:20BE jnz loc_20AC
ROM:20C1 jmp loc_20CF
ROM:20C4 ; ---------------------------------------------------------------------------
ROM:20C4
ROM:20C4 loc_20C4: ; CODE XREF: PUTTR+A1j
ROM:20C4 ; PUTTR+A8j
ROM:20C4 lda VIDEO2 ; Видео-переменная. Используется в PUTTR и VIDEOTR
ROM:20C7 mov c, a
ROM:20C8 xra a
ROM:20C9
ROM:20C9 loc_20C9: ; CODE XREF: PUTTR+D8j
ROM:20C9 stax d
ROM:20CA inx d
ROM:20CB dcr c
ROM:20CC jnz loc_20C9
ROM:20CC ; End of function PUTTR
ROM:20CC
ROM:20CF ; START OF FUNCTION CHUNK FOR VIDEOTR
ROM:20CF
ROM:20CF loc_20CF: ; CODE XREF: PUTTR+CDj
ROM:20CF ; VIDEOTR+4Dj
ROM:20CF lxi b, VIDEOBUF+2 ; Видеобуфер. Используется командами PUT и GET (PUTTR, VIDEOTR)
ROM:20D2 xchg
ROM:20D3 lhld VIDEOBUF ; Видеобуфер. Используется командами PUT и GET (PUTTR, VIDEOTR)
ROM:20D6 dad d
ROM:20D7 lda VIDEO2 ; Видео-переменная. Используется в PUTTR и VIDEOTR
ROM:20DA sta VIDEO4 ; Видео-переменная. Используется в PUTTR и VIDEOTR
ROM:20DD pop d
ROM:20DE
ROM:20DE loc_20DE: ; CODE XREF: VIDEOTR+3Bj
ROM:20DE ldax b
ROM:20DF push b
ROM:20E0 mov b, a
ROM:20E1 call PUTTR2 ; Обработчик PUT. Подпрограмма.
ROM:20E1 ; END OF FUNCTION CHUNK FOR VIDEOTR
ROM:20E1 ; ---------------------------------------------------------------------------
ROM:20E4 .db 3Ah ; :
ROM:20E5
ROM:20E5 ; =============== S U B R O U T I N E =======================================
ROM:20E5
ROM:20E5 ; Подпрограмма обработки видео. Нигде не используется.
ROM:20E5
ROM:20E5 VIDEOTR:
ROM:20E5
ROM:20E5 ; FUNCTION CHUNK AT ROM:20CF SIZE 00000015 BYTES
ROM:20E5
ROM:20E5 mvi b, 0FEh ; '¦'
ROM:20E7 ana c
ROM:20E8 ora b
ROM:20E9 stax d
ROM:20EA lda VIDEO3 ; Видео-переменная. Используется в PUTTR и VIDEOTR
ROM:20ED ana c
ROM:20EE pop b
ROM:20EF stax b
ROM:20F0 inx b
ROM:20F1 inx h
ROM:20F2 push d
ROM:20F3 mov a, d
ROM:20F4 xri 20h
ROM:20F6 mov d, a
ROM:20F7 xchg
ROM:20F8 call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM).
ROM:20FB xchg
ROM:20FC ani 0F0h
ROM:20FE ora m
ROM:20FF stax d
ROM:2100 inx h
ROM:2101 pop d
ROM:2102 call MACRO6
ROM:2105 mov a, d
ROM:2106 ani 1Fh
ROM:2108 cpi 18h
ROM:210A jc loc_2119
ROM:210D lda VIDEO4 ; Видео-переменная. Используется в PUTTR и VIDEOTR
ROM:2110 dcr a
ROM:2111 rlc
ROM:2112 mov c, a
ROM:2113 mvi b, 0
ROM:2115 dad b
ROM:2116 jmp loc_2123
ROM:2119 ; ---------------------------------------------------------------------------
ROM:2119
ROM:2119 loc_2119: ; CODE XREF: VIDEOTR+25j
ROM:2119 lda VIDEO4 ; Видео-переменная. Используется в PUTTR и VIDEOTR
ROM:211C dcr a
ROM:211D sta VIDEO4 ; Видео-переменная. Используется в PUTTR и VIDEOTR
ROM:2120 jnz loc_20DE
ROM:2123
ROM:2123 loc_2123: ; CODE XREF: VIDEOTR+31j
ROM:2123 pop d
ROM:2124 mov a, e
ROM:2125 adi 8
ROM:2127 mov e, a
ROM:2128 rc
ROM:2129 push d
ROM:212A push d
ROM:212B lda VIDEO1 ; Видео-переменная. Используется в PUTTR и VIDEOTR
ROM:212E dcr a
ROM:212F sta VIDEO1 ; Видео-переменная. Используется в PUTTR и VIDEOTR
ROM:2132 jnz loc_20CF
ROM:2135 pop d
ROM:2136 pop d
ROM:2137 ret
ROM:2137 ; End of function VIDEOTR
ROM:2137
ROM:2138
ROM:2138 ; =============== S U B R O U T I N E =======================================
ROM:2138
ROM:2138 ; Обработчик PUT. Подпрограмма.
ROM:2138
ROM:2138 PUTTR2: ; CODE XREF: PUTTR:loc_20ACp
ROM:2138 ; VIDEOTR-4p
ROM:2138 lda PUTTRTMP2 ; Временная переменная PUTTR
ROM:213B inr a
ROM:213C mov c, a
ROM:213D mov a, m
ROM:213E
ROM:213E loc_213E: ; CODE XREF: PUTTR2+8j
ROM:213E rrc
ROM:213F dcr c
ROM:2140 jnz loc_213E
ROM:2143 rlc
ROM:2144 mov c, a
ROM:2145 ret
ROM:2145 ; End of function PUTTR2
ROM:2145
ROM:2146
ROM:2146 ; =============== S U B R O U T I N E =======================================
ROM:2146
ROM:2146
ROM:2146 MACRO6: ; CODE XREF: VIDEOTR+1Dp
ROM:2146 ; VIDEOTR2+6Dp
ROM:2146 inr e
ROM:2147 mov a, e
ROM:2148 ani 7
ROM:214A rnz
ROM:214B mov a, e
ROM:214C sui 8
ROM:214E mov e, a
ROM:214F inr d
ROM:2150 ret
ROM:2150 ; End of function MACRO6
ROM:2150
ROM:2151 ; ---------------------------------------------------------------------------
ROM:2151
ROM:2151 GET: ; Бейсик-оператор GET
ROM:2151 call LINETR
ROM:2154 call VARRTR ; Подпрограмма работы с видеомассивом. Используется в PUT и GET
ROM:2157 push h
ROM:2158 xchg
ROM:2159 call VIDEOTR2 ; Подпрограмма обработки видео. Используется в GET.
ROM:215C pop h
ROM:215D ret
ROM:215E
ROM:215E ; =============== S U B R O U T I N E =======================================
ROM:215E
ROM:215E ; Подпрограмма обработки видео. Используется в GET.
ROM:215E
ROM:215E VIDEOTR2: ; CODE XREF: ROM:2159p
ROM:215E lda X1 ; Первый графический курсор, координата X
ROM:2161 mov c, a
ROM:2162 lda X2 ; Второй графический курсор, координата X
ROM:2165 sub c
ROM:2166 inr a
ROM:2167 mov c, a
ROM:2168 ani 0F8h
ROM:216A rrc
ROM:216B rrc
ROM:216C rrc
ROM:216D mov b, a
ROM:216E mov a, c
ROM:216F ani 7
ROM:2171 jz loc_2175
ROM:2174 inr b
ROM:2175
ROM:2175 loc_2175: ; CODE XREF: VIDEOTR2+13j
ROM:2175 lda Y1 ; Первый графический курсор, координата Y
ROM:2178 mov c, a
ROM:2179 lda Y2 ; Второй графический курсор, координата Y
ROM:217C sub c
ROM:217D inr a
ROM:217E sta VIDEO2 ; Видео-переменная. Используется в PUTTR и VIDEOTR
ROM:2181 mov c, a
ROM:2182 inx h
ROM:2183 inx h
ROM:2184 mov e, m
ROM:2185 inx h
ROM:2186 mov d, m
ROM:2187 inx h
ROM:2188 mvi a, 7
ROM:218A
ROM:218A loc_218A: ; CODE XREF: VIDEOTR2+31j
ROM:218A dcx d
ROM:218B jc loc_2211
ROM:218E dcr a
ROM:218F jnz loc_218A
ROM:2192 mvi a, 5
ROM:2194
ROM:2194 loc_2194: ; CODE XREF: VIDEOTR2+38j
ROM:2194 inx h
ROM:2195 dcr a
ROM:2196 jnz loc_2194
ROM:2199 mov a, b
ROM:219A sta VIDEO1 ; Видео-переменная. Используется в PUTTR и VIDEOTR
ROM:219D mov m, b
ROM:219E inx h
ROM:219F mov m, c
ROM:21A0 inx h
ROM:21A1 mov b, d
ROM:21A2 mov c, e
ROM:21A3 push h
ROM:21A4 push b
ROM:21A5 call PRESETWT2 ; Рисование точки белым цветом (FD90 координата X, FD91 координата Y)
ROM:21A8 pop b
ROM:21A9 pop h
ROM:21AA xchg
ROM:21AB
ROM:21AB loc_21AB: ; CODE XREF: VIDEOTR2+87j
ROM:21AB lda VIDEO2 ; Видео-переменная. Используется в PUTTR и VIDEOTR
ROM:21AE sta VIDEO4 ; Видео-переменная. Используется в PUTTR и VIDEOTR
ROM:21B1 push h
ROM:21B2
ROM:21B2 loc_21B2: ; CODE XREF: VIDEOTR2+78j
ROM:21B2 call VIDEOTR3 ; Подпрограмма обработки видео. Используется в GET.
ROM:21B5 call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM).
ROM:21B8 stax d
ROM:21B9 inx d
ROM:21BA push h
ROM:21BB mov a, h
ROM:21BC xri 20h
ROM:21BE mov h, a
ROM:21BF call VIDEOTR3 ; Подпрограмма обработки видео. Используется в GET.
ROM:21C2 call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM).
ROM:21C5 ani 0Fh
ROM:21C7 pop h
ROM:21C8 stax d
ROM:21C9 inx d
ROM:21CA xchg
ROM:21CB call MACRO6
ROM:21CE xchg
ROM:21CF lda VIDEO4 ; Видео-переменная. Используется в PUTTR и VIDEOTR
ROM:21D2 dcr a
ROM:21D3 sta VIDEO4 ; Видео-переменная. Используется в PUTTR и VIDEOTR
ROM:21D6 jnz loc_21B2
ROM:21D9 pop h
ROM:21DA mov a, l
ROM:21DB adi 8
ROM:21DD mov l, a
ROM:21DE lda VIDEO1 ; Видео-переменная. Используется в PUTTR и VIDEOTR
ROM:21E1 dcr a
ROM:21E2 sta VIDEO1 ; Видео-переменная. Используется в PUTTR и VIDEOTR
ROM:21E5 jnz loc_21AB
ROM:21E8 lhld VIDEO2 ; Видео-переменная. Используется в PUTTR и VIDEOTR
ROM:21EB dad h
ROM:21EC mov a, h
ROM:21ED cma
ROM:21EE mov h, a
ROM:21EF mov a, l
ROM:21F0 cma
ROM:21F1 mov l, a
ROM:21F2 inx h
ROM:21F3 dad d
ROM:21F4
ROM:21F4 loc_21F4: ; CODE XREF: VIDEOTR2+ABj
ROM:21F4 call VIDEOTR3 ; Подпрограмма обработки видео. Используется в GET.
ROM:21F7 xra a
ROM:21F8 stax d
ROM:21F9 inx d
ROM:21FA inx h
ROM:21FB call VIDEOTR3 ; Подпрограмма обработки видео. Используется в GET.
ROM:21FE mov a, m
ROM:21FF stax d
ROM:2200 inx d
ROM:2201 inx h
ROM:2202 lda VIDEO2 ; Видео-переменная. Используется в PUTTR и VIDEOTR
ROM:2205 dcr a
ROM:2206 sta VIDEO2 ; Видео-переменная. Используется в PUTTR и VIDEOTR
ROM:2209 jnz loc_21F4
ROM:220C ret
ROM:220C ; End of function VIDEOTR2
ROM:220C
ROM:220D
ROM:220D ; =============== S U B R O U T I N E =======================================
ROM:220D
ROM:220D ; Подпрограмма обработки видео. Используется в GET.
ROM:220D
ROM:220D VIDEOTR3: ; CODE XREF: VIDEOTR2:loc_21B2p
ROM:220D ; VIDEOTR2+61p ...
ROM:220D dcx b
ROM:220E mov a, c
ROM:220F ora b
ROM:2210 rnz
ROM:2211
ROM:2211 loc_2211: ; CODE XREF: VIDEOTR2+2Dj
ROM:2211 mvi e, 10h
ROM:2213 jmp MAINLOOP1 ; Первая точка входа в главный цикл
ROM:2213 ; End of function VIDEOTR3
ROM:2213
ROM:2216
ROM:2216 ; =============== S U B R O U T I N E =======================================
ROM:2216
ROM:2216
ROM:2216 MACRO7: ; CODE XREF: PRNTR1-12CAp
ROM:2216 mvi b, 0
ROM:2218 sui 7Fh ; ''
ROM:221A cpi 0Fh
ROM:221C jz loc_2227
ROM:221F cpi 4
ROM:2221 jz loc_2227
ROM:2224 cpi 73h ; 's'
ROM:2226 rnz
ROM:2227
ROM:2227 loc_2227: ; CODE XREF: MACRO7+6j
ROM:2227 ; MACRO7+Bj
ROM:2227 mvi b, 1
ROM:2229 ret
ROM:2229 ; End of function MACRO7
ROM:2229
ROM:2229 ; ---------------------------------------------------------------------------
ROM:222A TAB7: .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:2230 ; ---------------------------------------------------------------------------
ROM:2230 ; START OF FUNCTION CHUNK FOR PRNTR1
ROM:2230
ROM:2230 loc_2230: ; CODE XREF: PRNTR1-3j
ROM:2230 inr b
ROM:2231 dcr b
ROM:2232 jz loc_50D
ROM:2235 pop h
ROM:2236
ROM:2236 loc_2236: ; CODE XREF: PRNTR1+A59j
ROM:2236 rst 3 ; RST3 = печатает символ из A на экран.
ROM:2237 mov a, m
ROM:2238 ora a
ROM:2239 inx h
ROM:223A jnz loc_2236
ROM:223D jmp loc_4F7
ROM:223D ; END OF FUNCTION CHUNK FOR PRNTR1
ROM:2240
ROM:2240 ; =============== S U B R O U T I N E =======================================
ROM:2240
ROM:2240 ; Обработка нажатия Break
ROM:2240
ROM:2240 TESTBREAKKEYTR: ; CODE XREF: TESTBREAKKEY2p
ROM:2240 lda EVNTTAB ; Таблица событий.
ROM:2240 ; (УПР/СТОП + 10 функциональных клавиш)
ROM:2240 ; Бит 0 - маска события
ROM:2240 ; Бит 2 - событие
ROM:2243 ani 4
ROM:2245 rnz
ROM:2246 lda STOPFLG ; STOP-флаг
ROM:2249 ana a
ROM:224A rz
ROM:224B call CURSON2 ; Включает изображение курсора
ROM:224E
ROM:224E loc_224E: ; CODE XREF: TESTBREAKKEYTR+12j
ROM:224E lda STOPFLG ; STOP-флаг
ROM:2251 ana a
ROM:2252 jnz loc_224E
ROM:2255 call CURSOFF2 ; Выключает изображение курсора
ROM:2258 xra a
ROM:2259 ret
ROM:2259 ; End of function TESTBREAKKEYTR
ROM:2259
ROM:2259 ; ---------------------------------------------------------------------------
ROM:225A TAB2: .db 0F0h, 0D1h, 0D2h, 0E8h, 0D5h, 0D6h, 0E6h, 0D4h, 0E7h
ROM:225A ; DATA XREF: SYMPRN2+2112o
ROM:225A .db 0DAh, 0DBh, 0DCh, 0DDh, 0DEh, 0DFh, 0E0h, 0E1h, 0F1h
ROM:225A .db 0E2h, 0E3h, 0E4h, 0E5h, 0D8h, 0D3h, 0EEh, 0EDh, 0D9h
ROM:225A .db 0EAh, 0EFh, 0EBh, 0E9h, 0ECh
ROM:227A ; ---------------------------------------------------------------------------
ROM:227A ; START OF FUNCTION CHUNK FOR SYMPRN2
ROM:227A
ROM:227A loc_227A: ; CODE XREF: SYMPRN2+4j
ROM:227A pop psw
ROM:227B cpi 0C0h ; 'L'
ROM:227D jc loc_22C1
ROM:2280 push d
ROM:2281 mov d, a
ROM:2282 lda TITL ; Переменная SYMPRN2
ROM:2285 cpi 2
ROM:2287 mov a, d
ROM:2288 jz loc_22C0
ROM:228B ani 1Fh
ROM:228D push h
ROM:228E lxi h, TAB2
ROM:2291 add l
ROM:2292 mov l, a
ROM:2293 mov e, m
ROM:2294 mov a, d
ROM:2295 cpi 0E0h ; 'р'
ROM:2297 mov a, e
ROM:2298 jc loc_229D
ROM:229B sui 30h ; '0'
ROM:229D
ROM:229D loc_229D: ; CODE XREF: SYMPRN2+211Cj
ROM:229D pop h
ROM:229E mov e, a
ROM:229F mvi d, 0
ROM:22A1 lda TITL ; Переменная SYMPRN2
ROM:22A4 cpi 0
ROM:22A6 mov a, e
ROM:22A7 jnz loc_22BF
ROM:22AA mvi d, 0Fh
ROM:22AC cpi 0A8h ; 'и'
ROM:22AE jc loc_22BF
ROM:22B1 dcr d
ROM:22B2 cpi 0D1h ; 'T'
ROM:22B4 jc loc_22BF
ROM:22B7 mvi d, 0FFh
ROM:22B9 cpi 0D8h ; '+'
ROM:22BB jc loc_22BF
ROM:22BE dcr d
ROM:22BF
ROM:22BF loc_22BF: ; CODE XREF: SYMPRN2+212Bj
ROM:22BF ; SYMPRN2+2132j ...
ROM:22BF add d
ROM:22C0
ROM:22C0 loc_22C0: ; CODE XREF: SYMPRN2+210Cj
ROM:22C0 pop d
ROM:22C1
ROM:22C1 loc_22C1: ; CODE XREF: SYMPRN2+2101j
ROM:22C1 out 85h
ROM:22C3 in 86h
ROM:22C5 ani 7Fh
ROM:22C7 out 86h
ROM:22C9 ori 80h
ROM:22CB out 86h
ROM:22CD ret
ROM:22CD ; END OF FUNCTION CHUNK FOR SYMPRN2
ROM:22CD ; ---------------------------------------------------------------------------
ROM:22CE TAB3: .db 0FDh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:22CE .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 2
ROM:2400
ROM:2400 ; =============== S U B R O U T I N E =======================================
ROM:2400
ROM:2400 ; Ввод символа из буфера клавиатуры
ROM:2400
ROM:2400 BUFFERTOA2: ; CODE XREF: BUFFERTOAj
ROM:2400 ; EDIT2:loc_2AD2p
ROM:2400 push b
ROM:2401 push h
ROM:2402 push d
ROM:2403 lxi h, EVNTTAB ; Таблица событий.
ROM:2403 ; (УПР/СТОП + 10 функциональных клавиш)
ROM:2403 ; Бит 0 - маска события
ROM:2403 ; Бит 2 - событие
ROM:2406 mov a, m
ROM:2407 push psw
ROM:2408 mvi m, 1
ROM:240A
ROM:240A loc_240A: ; CODE XREF: BUFFERTOA2+10j
ROM:240A call TESTBREAKKEY ; Тестирование нажатия УПР+Стоп
ROM:240D call KBDBUFAK2 ; Опрос буфера клавиатуры
ROM:2410 jz loc_240A
ROM:2413 lhld INBUF ; Адрес чтения из буфера клавиатуры
ROM:2416 mov b, m
ROM:2417 inx h
ROM:2418 lxi d, KBDTMP ; Переменная процедуры ввода из буфера.
ROM:241B rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения.
ROM:241C jnz loc_2422
ROM:241F lxi h, KBDBUF ; Буфер клавиатуры
ROM:2422
ROM:2422 loc_2422: ; CODE XREF: BUFFERTOA2+1Cj
ROM:2422 shld INBUF ; Адрес чтения из буфера клавиатуры
ROM:2425 pop psw
ROM:2426 sta EVNTTAB ; Таблица событий.
ROM:2426 ; (УПР/СТОП + 10 функциональных клавиш)
ROM:2426 ; Бит 0 - маска события
ROM:2426 ; Бит 2 - событие
ROM:2429 mov a, b
ROM:242A pop d
ROM:242B pop h
ROM:242C pop b
ROM:242D ret
ROM:242D ; End of function BUFFERTOA2
ROM:242D
ROM:242E
ROM:242E ; =============== S U B R O U T I N E =======================================
ROM:242E
ROM:242E ; Опрос состояния кнопки джойстика
ROM:242E
ROM:242E ASKBTN2: ; CODE XREF: ASKBTNj
ROM:242E dcr a
ROM:242F jm loc_244B
ROM:2432 push psw
ROM:2433 cpi 2
ROM:2435 in 8Dh
ROM:2437 jnc loc_243C
ROM:243A in 8Ch
ROM:243C
ROM:243C loc_243C: ; CODE XREF: ASKBTN2+9j
ROM:243C mov b, a
ROM:243D pop psw
ROM:243E ani 1
ROM:2440 mvi a, 10h
ROM:2442 jz loc_2446
ROM:2445 rlc
ROM:2446
ROM:2446 loc_2446: ; CODE XREF: ASKBTN2+14j
ROM:2446 ana b
ROM:2447 rz
ROM:2448 mvi a, 1
ROM:244A ret
ROM:244B ; ---------------------------------------------------------------------------
ROM:244B
ROM:244B loc_244B: ; CODE XREF: ASKBTN2+1j
ROM:244B mvi a, 8
ROM:244D call KBDRAW2 ; Опрос ряда клавиатурной матрицы
ROM:2450 cma
ROM:2451 ei
ROM:2452 ani 1
ROM:2454 ret
ROM:2454 ; End of function ASKBTN2
ROM:2454
ROM:2454 ; ---------------------------------------------------------------------------
ROM:2455 TAB4: .db 0, 3, 5, 4, 1, 2, 0, 3, 7, 0, 6, 5, 8, 1, 7, 0, 0
ROM:2455 ; DATA XREF: JOYDIR2+21o
ROM:2455 .db 5, 1, 0, 3, 4, 2, 3, 7, 6, 8, 7, 0, 5, 1, 0 ; Дешифратор направлений джойстика
ROM:2475
ROM:2475 ; =============== S U B R O U T I N E =======================================
ROM:2475
ROM:2475 ; Подпрограмма установки видео-режимов.
ROM:2475
ROM:2475 SETMODE3: ; CODE XREF: INTRPT2:loc_24EFp
ROM:2475 ; SETMODE2:loc_28B3p
ROM:2475
ROM:2475 ; FUNCTION CHUNK AT ROM:0175 SIZE 00000007 BYTES
ROM:2475
ROM:2475 lda ABS2 ; Старший байт адреса буфера экрана в режимах 0 и 1
ROM:2478 rrc
ROM:2479 rrc
ROM:247A nop
ROM:247B out 90h
ROM:247D lda AGS2 ; Старший байт адреса знакогенератора в режимах 0 и 1
ROM:247D ; Старший байт адреса буфера экрана режима 2
ROM:2480 rrc
ROM:2481 rrc
ROM:2482 nop
ROM:2483 out 91h
ROM:2485 lda GTBL2 ; Старший байт адреса таблицы точек изображения в режиме 2
ROM:2488 rrc
ROM:2489 rrc
ROM:248A cma
ROM:248B out 92h
ROM:248D lda CTBL2 ; Старший байт адреса таблицы цвета в режиме 2
ROM:2490 rrc
ROM:2491 rrc
ROM:2492 cma
ROM:2493 out 93h
ROM:2495 lda MODE ; Режим экрана
ROM:2498 cpi 1
ROM:249A rnz ; Если текущий режим работы не 1, то возвращаемся
ROM:249B lda MODE1FLG ; Флаги режима 1
ROM:249E ana a
ROM:249F jz loc_24A7
ROM:24A2 xra a
ROM:24A3 sta MODE1FLG ; Флаги режима 1
ROM:24A6 ret
ROM:24A7 ; ---------------------------------------------------------------------------
ROM:24A7
ROM:24A7 loc_24A7: ; CODE XREF: SETMODE3+2Aj
ROM:24A7 xra a
ROM:24A8 sta SCRTMP1 ; Экранные временные переменные.
ROM:24AB lhld CLRT ; Адрес таблицы цвета режима 1
ROM:24AE call ISOOFF ; Гашение изображения
ROM:24B1 mvi a, 0A0h ; 'а'
ROM:24B3 call loc_F859
ROM:24B6 jmp ISOON
ROM:24B6 ; End of function SETMODE3
ROM:24B6
ROM:24B9
ROM:24B9 ; =============== S U B R O U T I N E =======================================
ROM:24B9
ROM:24B9 ; Заполнение области константой
ROM:24B9
ROM:24B9 FILLAREA2: ; CODE XREF: FILLAREAj
ROM:24B9 push d
ROM:24BA mov d, a
ROM:24BB
ROM:24BB loc_24BB: ; CODE XREF: FILLAREA2+8j
ROM:24BB mov m, a
ROM:24BC inx h
ROM:24BD dcx b
ROM:24BE mov a, b
ROM:24BF ora c
ROM:24C0 mov a, d
ROM:24C1 jnz loc_24BB
ROM:24C4 pop d
ROM:24C5 ret
ROM:24C5 ; End of function FILLAREA2
ROM:24C5
ROM:24C6
ROM:24C6 ; =============== S U B R O U T I N E =======================================
ROM:24C6
ROM:24C6 ; Тут вообще муть несусветная! Но интересно жутко!
ROM:24C6
ROM:24C6 PCHL4002: ; CODE XREF: START+298Dp
ROM:24C6 ; START+2994p ...
ROM:24C6 lxi d, 4000h
ROM:24C9 ldax d
ROM:24CA cpi 41h ; 'A'
ROM:24CC rnz
ROM:24CD inx d
ROM:24CE ldax d
ROM:24CF cpi 42h ; 'B'
ROM:24D1 rnz
ROM:24D2 inx d
ROM:24D3 ldax d
ROM:24D4 mov l, a
ROM:24D5 inx d
ROM:24D6 ldax d
ROM:24D7 mov h, a
ROM:24D8 pchl
ROM:24D8 ; End of function PCHL4002
ROM:24D8
ROM:24D9
ROM:24D9 ; =============== S U B R O U T I N E =======================================
ROM:24D9
ROM:24D9 ; Обработка прерываний.
ROM:24D9
ROM:24D9 INTRPT2: ; CODE XREF: INTRPTj
ROM:24D9 call INTCATH
ROM:24DC push b
ROM:24DD push d
ROM:24DE push h
ROM:24DF push psw
ROM:24E0 lda SCRTMP1 ; Экранные временные переменные.
ROM:24E3 ana a
ROM:24E4 jnz loc_24EF
ROM:24E7 lda INTTMP ; Переменная обработчика прерываний
ROM:24EA ani 7
ROM:24EC jnz loc_24F2
ROM:24EF
ROM:24EF loc_24EF: ; CODE XREF: INTRPT2+Bj
ROM:24EF call SETMODE3 ; Подпрограмма установки видео-режимов.
ROM:24F2
ROM:24F2 loc_24F2: ; CODE XREF: INTRPT2+13j
ROM:24F2 ; INTRPT2+131j
ROM:24F2 lxi h, OLDKBDMT+0Ah ; Старое состояние матрицы клавиатуры
ROM:24F5 push h
ROM:24F6 lxi h, INTAR+8 ; Рабочая область обработки прерываний
ROM:24F9 lxi d, OLDKBDMT ; Старое состояние матрицы клавиатуры
ROM:24FC in 82h
ROM:24FE ani 0F0h
ROM:2500 mov b, a
ROM:2501 mvi c, 1
ROM:2503
ROM:2503 loc_2503: ; CODE XREF: INTRPT2+46j
ROM:2503 xthl
ROM:2504 inx h
ROM:2505 out 82h
ROM:2507 in 81h
ROM:2509 cma
ROM:250A cmp m
ROM:250B jz loc_2511
ROM:250E mov m, a
ROM:250F mvi c, 0
ROM:2511
ROM:2511 loc_2511: ; CODE XREF: INTRPT2+32j
ROM:2511 ldax d
ROM:2512 cma
ROM:2513 ana m
ROM:2514 xthl
ROM:2515 mov m, a
ROM:2516 inx h
ROM:2517 inx d
ROM:2518 mov a, b
ROM:2519 ani 0Fh
ROM:251B inr b
ROM:251C cpi 9
ROM:251E mov a, b
ROM:251F jnz loc_2503
ROM:2522 pop h
ROM:2523 mov a, c
ROM:2524 ana a
ROM:2525 jz loc_25EC
ROM:2528 lda TIMCT ; Таймер (+1 каждые 20ms)
ROM:252B ana a
ROM:252C jnz loc_2545
ROM:252F inr a
ROM:2530 sta TIMCT ; Таймер (+1 каждые 20ms)
ROM:2533 lxi b, 0Ah
ROM:2536 lxi d, OLDKBDMT ; Старое состояние матрицы клавиатуры
ROM:2539 lxi h, NEWKBDMT ; Новое состояние матрицы клавиатуры
ROM:253C call RAMSEND ; BC=счетчик, DE=адрес приема, HL=адрес источника
ROM:253C ; (пересылка RAM->RAM, RAM->VRAM)
ROM:253F lxi h, INTAR+8 ; Рабочая область обработки прерываний
ROM:2542 jmp loc_2565
ROM:2545 ; ---------------------------------------------------------------------------
ROM:2545
ROM:2545 loc_2545: ; CODE XREF: INTRPT2+53j
ROM:2545 cpi 32h ; '2'
ROM:2547 jc loc_25E8
ROM:254A lxi h, OLDKBDMT ; Старое состояние матрицы клавиатуры
ROM:254D mvi c, 0Ah
ROM:254F xra a
ROM:2550
ROM:2550 loc_2550: ; CODE XREF: INTRPT2+7Aj
ROM:2550 ora m
ROM:2551 inx h
ROM:2552 dcr c
ROM:2553 jnz loc_2550
ROM:2556 ana a
ROM:2557 jz loc_25EB
ROM:255A lda INTTMP ; Переменная обработчика прерываний
ROM:255D ani 3
ROM:255F jnz loc_25EF
ROM:2562 lxi h, OLDKBDMT ; Старое состояние матрицы клавиатуры
ROM:2565
ROM:2565 loc_2565: ; CODE XREF: INTRPT2+69j
ROM:2565 push h
ROM:2566 lhld NEWKBDMT+6 ; Новое состояние матрицы клавиатуры
ROM:2569 mov a, l
ROM:256A ani 1Fh
ROM:256C mov l, a
ROM:256D mov a, h
ROM:256E ani 40h
ROM:2570 ora l
ROM:2571 mov b, a
ROM:2572 lxi h, INTTMP2 ; Переменная обработчика прерываний
ROM:2575 lda INTAR+0Eh ; Рабочая область обработки прерываний
ROM:2578 ani 10h
ROM:257A jz loc_2582
ROM:257D mov a, b
ROM:257E ani 4Dh
ROM:2580 xra m
ROM:2581 mov m, a
ROM:2582
ROM:2582 loc_2582: ; CODE XREF: INTRPT2+A1j
ROM:2582 mov a, b
ROM:2583 xra m
ROM:2584 lxi h, INSF2 ; Флаги режимов клавиатуры
ROM:2587 mov b, m
ROM:2588 mov m, a
ROM:2589 mov h, a
ROM:258A push psw
ROM:258B xra b
ROM:258C ani 1
ROM:258E cnz FNKEYTR ; Подпрограмма-обработчик функциональных клавиш
ROM:2591 pop psw
ROM:2592 call PORT8682 ; Работа с портами &h86 и &h82
ROM:2595 mov h, a
ROM:2596 lxi b, 3Fh ; '?'
ROM:2599 ani 1
ROM:259B jz loc_25A0
ROM:259E mvi b, 20h ; ' '
ROM:25A0
ROM:25A0 loc_25A0: ; CODE XREF: INTRPT2+C2j
ROM:25A0 mov a, h
ROM:25A1 mvi d, 20h ; ' '
ROM:25A3 ani 8
ROM:25A5 jz loc_25AA
ROM:25A8 mvi d, 80h ; 'А'
ROM:25AA
ROM:25AA loc_25AA: ; CODE XREF: INTRPT2+CCj
ROM:25AA mvi e, 0FFh
ROM:25AC mov a, b
ROM:25AD xra d
ROM:25AE mov d, a
ROM:25AF mov a, b
ROM:25B0 rrc
ROM:25B1 mov b, a
ROM:25B2 mov a, h
ROM:25B3 ani 4
ROM:25B5 jz loc_25C1
ROM:25B8 mvi c, 1Fh
ROM:25BA lxi d, 80BFh
ROM:25BD mov a, b
ROM:25BE rlc
ROM:25BF ora d
ROM:25C0 mov d, a
ROM:25C1
ROM:25C1 loc_25C1: ; CODE XREF: INTRPT2+DCj
ROM:25C1 mov a, h
ROM:25C2 ani 2
ROM:25C4 jz loc_25CC
ROM:25C7 lxi d, 1Fh
ROM:25CA mvi c, 0
ROM:25CC
ROM:25CC loc_25CC: ; CODE XREF: INTRPT2+EBj
ROM:25CC xchg
ROM:25CD shld INTAR+2 ; Рабочая область обработки прерываний
ROM:25D0 push b
ROM:25D1 pop h
ROM:25D2 shld INTAR ; Рабочая область обработки прерываний
ROM:25D5 pop h
ROM:25D6 mvi c, 0
ROM:25D8
ROM:25D8 loc_25D8: ; CODE XREF: INTRPT2+109j
ROM:25D8 mov a, m
ROM:25D9 ana a
ROM:25DA cnz KBD ; Подпрограмма-обработчик клавиатуры
ROM:25DD inx h
ROM:25DE inr c
ROM:25DF mov a, c
ROM:25E0 cpi 0Ah
ROM:25E2 jnz loc_25D8
ROM:25E5 jmp loc_25EF
ROM:25E8 ; ---------------------------------------------------------------------------
ROM:25E8
ROM:25E8 loc_25E8: ; CODE XREF: INTRPT2+6Ej
ROM:25E8 lda TIMCT ; Таймер (+1 каждые 20ms)
ROM:25EB
ROM:25EB loc_25EB: ; CODE XREF: INTRPT2+7Ej
ROM:25EB inr a
ROM:25EC
ROM:25EC loc_25EC: ; CODE XREF: INTRPT2+4Cj
ROM:25EC sta TIMCT ; Таймер (+1 каждые 20ms)
ROM:25EF
ROM:25EF loc_25EF: ; CODE XREF: INTRPT2+86j
ROM:25EF ; INTRPT2+10Cj
ROM:25EF lda INTTMP ; Переменная обработчика прерываний
ROM:25F2 inr a
ROM:25F3 sta INTTMP ; Переменная обработчика прерываний
ROM:25F6 lda INTTMP3 ; Переменная обработчика прерываний
ROM:25F9 ana a
ROM:25FA cnz BELL2 ; Обработка звука нажатия клавиш и CHR$(&h07) (в зависимости от BEEPF)
ROM:25FD jmp loc_260D
ROM:2600 ; ---------------------------------------------------------------------------
ROM:2600 ana a
ROM:2601 jz loc_260D
ROM:2604 call MACRO1
ROM:2607 call KBDBUFCL2 ; Очищает буфер клавиатуры
ROM:260A jmp loc_24F2
ROM:260D ; ---------------------------------------------------------------------------
ROM:260D
ROM:260D loc_260D: ; CODE XREF: INTRPT2+124j
ROM:260D ; INTRPT2+128j
ROM:260D pop psw
ROM:260E pop h
ROM:260F pop d
ROM:2610 pop b
ROM:2611 ei
ROM:2612 ret
ROM:2612 ; End of function INTRPT2
ROM:2612
ROM:2613
ROM:2613 ; =============== S U B R O U T I N E =======================================
ROM:2613
ROM:2613 ; Подпрограмма-обработчик клавиатуры
ROM:2613
ROM:2613 KBD: ; CODE XREF: INTRPT2+101p
ROM:2613
ROM:2613 ; FUNCTION CHUNK AT ROM:26E6 SIZE 00000050 BYTES
ROM:2613
ROM:2613 push h
ROM:2614 lxi h, TAB5
ROM:2617 mov b, a
ROM:2618 mov a, c
ROM:2619 rlc
ROM:261A rlc
ROM:261B rlc
ROM:261C mov e, a
ROM:261D mvi d, 0
ROM:261F dad d
ROM:2620 mvi e, 10h
ROM:2622 mov a, c
ROM:2623 cpi 6
ROM:2625 jc loc_2636
ROM:2628 cpi 8
ROM:262A jc loc_2636
ROM:262D lda INSF2 ; Флаги режимов клавиатуры
ROM:2630 ani 40h
ROM:2632 jz loc_2636
ROM:2635 dad d
ROM:2636
ROM:2636 loc_2636: ; CODE XREF: KBD+12j KBD+17j ...
ROM:2636 mvi a, 1
ROM:2638
ROM:2638 loc_2638: ; CODE XREF: KBD+8Ej
ROM:2638 mov e, a
ROM:2639 ana b
ROM:263A jz loc_269E
ROM:263D mov a, m
ROM:263E ana a
ROM:263F jz loc_269E
ROM:2642 cpi 0FFh
ROM:2644 jnz loc_2686
ROM:2647 lda INSF2 ; Флаги режимов клавиатуры
ROM:264A ani 2
ROM:264C lda EVNTTAB ; Таблица событий.
ROM:264C ; (УПР/СТОП + 10 функциональных клавиш)
ROM:264C ; Бит 0 - маска события
ROM:264C ; Бит 2 - событие
ROM:264F jz loc_266C
ROM:2652 rrc
ROM:2653 jnc loc_269E
ROM:2656 rlc
ROM:2657 ori 4
ROM:2659 sta EVNTTAB ; Таблица событий.
ROM:2659 ; (УПР/СТОП + 10 функциональных клавиш)
ROM:2659 ; Бит 0 - маска события
ROM:2659 ; Бит 2 - событие
ROM:265C lda KSS ; Код символа в позиции курсора
ROM:265F push h
ROM:2660 lhld SMK ; Адрес курсора
ROM:2663 mov m, a
ROM:2664 pop h
ROM:2665 xra a
ROM:2666 sta STOPFLG ; STOP-флаг
ROM:2669 jmp loc_269E
ROM:266C ; ---------------------------------------------------------------------------
ROM:266C
ROM:266C loc_266C: ; CODE XREF: KBD+3Cj
ROM:266C ani 2
ROM:266E jz loc_269E
ROM:2671 lda STOPFLG ; STOP-флаг
ROM:2674 cma
ROM:2675
ROM:2675 loc_2675: ; CODE XREF: ROM:314Cj
ROM:2675 sta STOPFLG ; STOP-флаг
ROM:2678 jmp loc_269E
ROM:267B ; ---------------------------------------------------------------------------
ROM:267B cz CURSOFF2 ; Выключает изображение курсора
ROM:267E pop psw
ROM:267F cnz CURSON2 ; Включает изображение курсора
ROM:2682
ROM:2682 loc_2682: ; CODE XREF: ROM:3146j
ROM:2682 pop h
ROM:2683 jmp loc_269E
ROM:2686 ; ---------------------------------------------------------------------------
ROM:2686
ROM:2686 loc_2686: ; CODE XREF: KBD+31j
ROM:2686 cpi 0F1h ; 'ё'
ROM:2688 jnc loc_26E6
ROM:268B mov d, a
ROM:268C mov a, c
ROM:268D cpi 2
ROM:268F jc loc_26A6
ROM:2692 cpi 6
ROM:2694 jc loc_26BF
ROM:2697 mov a, d
ROM:2698
ROM:2698 loc_2698: ; CODE XREF: KBD+9Dj KBD+A9j ...
ROM:2698 sta INTTMP3 ; Переменная обработчика прерываний
ROM:269B call KBD1 ; Подпрограмма-обработчик клавиатуры
ROM:269E
ROM:269E loc_269E: ; CODE XREF: KBD+27j KBD+2Cj ...
ROM:269E inx h
ROM:269F mov a, e
ROM:26A0 rlc
ROM:26A1 jnc loc_2638
ROM:26A4 pop h
ROM:26A5 ret
ROM:26A6 ; ---------------------------------------------------------------------------
ROM:26A6
ROM:26A6 loc_26A6: ; CODE XREF: KBD+7Cj
ROM:26A6 push h
ROM:26A7 lhld INTAR ; Рабочая область обработки прерываний
ROM:26AA mov a, l
ROM:26AB ana d
ROM:26AC xra h
ROM:26AD pop h
ROM:26AE cpi 20h ; ' '
ROM:26B0 jnc loc_2698
ROM:26B3 push psw
ROM:26B4 mvi a, 1
ROM:26B6 call KBD1 ; Подпрограмма-обработчик клавиатуры
ROM:26B9 pop psw
ROM:26BA adi 40h ; '@'
ROM:26BC jmp loc_2698
ROM:26BF ; ---------------------------------------------------------------------------
ROM:26BF
ROM:26BF loc_26BF: ; CODE XREF: KBD+81j
ROM:26BF push h
ROM:26C0 lhld INTAR+2 ; Рабочая область обработки прерываний
ROM:26C3 mov a, l
ROM:26C4 ana d
ROM:26C5 xra h
ROM:26C6 mov h, a
ROM:26C7 mov a, d
ROM:26C8 ani 20h
ROM:26CA xra h
ROM:26CB pop h
ROM:26CC jmp loc_2698
ROM:26CC ; End of function KBD
ROM:26CC
ROM:26CF
ROM:26CF ; =============== S U B R O U T I N E =======================================
ROM:26CF
ROM:26CF ; Подпрограмма-обработчик клавиатуры
ROM:26CF
ROM:26CF KBD1: ; CODE XREF: KBD+88p KBD+A3p ...
ROM:26CF push d
ROM:26D0 push h
ROM:26D1 lhld OUTBUF ; Адрес записи в буфер клавиатуры
ROM:26D4 lxi d, KBDTMP ; Переменная процедуры ввода из буфера.
ROM:26D7 mov m, a
ROM:26D8 inx h
ROM:26D9 rst 4 ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения.
ROM:26DA jnz loc_26E0
ROM:26DD lxi h, KBDBUF ; Буфер клавиатуры
ROM:26E0
ROM:26E0 loc_26E0: ; CODE XREF: KBD1+Bj
ROM:26E0 shld OUTBUF ; Адрес записи в буфер клавиатуры
ROM:26E3 pop h
ROM:26E4 pop d
ROM:26E5 ret
ROM:26E5 ; End of function KBD1
ROM:26E5
ROM:26E6 ; ---------------------------------------------------------------------------
ROM:26E6 ; START OF FUNCTION CHUNK FOR KBD
ROM:26E6
ROM:26E6 loc_26E6: ; CODE XREF: KBD+75j
ROM:26E6 push b
ROM:26E7 push h
ROM:26E8 ani 7
ROM:26EA mov c, a
ROM:26EB lda INSF2 ; Флаги режимов клавиатуры
ROM:26EE ani 1
ROM:26F0 mov a, c
ROM:26F1 jz loc_26F6
ROM:26F4 adi 5
ROM:26F6
ROM:26F6 loc_26F6: ; CODE XREF: KBD+DEj
ROM:26F6 dcr a
ROM:26F7 mov b, a
ROM:26F8 rlc
ROM:26F9 mov c, a
ROM:26FA lhld BASOPNUM ; Номер оператора Бейсик программы.
ROM:26FA ; Или &hFFFF в командном режиме
ROM:26FD inx h
ROM:26FE mov a, h
ROM:26FF ora l
ROM:2700 mov a, c
ROM:2701 jnz loc_271F
ROM:2704 rlc
ROM:2705 rlc
ROM:2706 rlc
ROM:2707 mov c, a
ROM:2708 mvi b, 0
ROM:270A lxi h, FNKTXT ; Текст функциональных клавиш
ROM:270D dad b
ROM:270E
ROM:270E loc_270E: ; CODE XREF: KBD+104j
ROM:270E mov a, m
ROM:270F ana a
ROM:2710 jz loc_271A
ROM:2713 call KBD1 ; Подпрограмма-обработчик клавиатуры
ROM:2716 inx h
ROM:2717 jmp loc_270E
ROM:271A ; ---------------------------------------------------------------------------
ROM:271A
ROM:271A loc_271A: ; CODE XREF: KBD+FDj KBD+120j
ROM:271A pop h
ROM:271B pop b
ROM:271C jmp loc_2698
ROM:271F ; ---------------------------------------------------------------------------
ROM:271F
ROM:271F loc_271F: ; CODE XREF: KBD+EEj
ROM:271F add b
ROM:2720 mvi b, 0
ROM:2722 mov c, a
ROM:2723 lxi h, KBDTMPBUF ; Временный буфер клавиатуры
ROM:2726 dad b
ROM:2727 mov a, m
ROM:2728 rrc
ROM:2729 jnc loc_272E
ROM:272C ori 2
ROM:272E
ROM:272E loc_272E: ; CODE XREF: KBD+116j
ROM:272E rlc
ROM:272F mov m, a
ROM:2730 sta SCRTMP3 ; Экранные временные переменные.
ROM:2733 jmp loc_271A
ROM:2733 ; END OF FUNCTION CHUNK FOR KBD
ROM:2736
ROM:2736 ; =============== S U B R O U T I N E =======================================
ROM:2736
ROM:2736 ; Подпрограмма-обработчик функциональных клавиш
ROM:2736
ROM:2736 FNKEYTR: ; CODE XREF: INTRPT2+B5p
ROM:2736 ; KEYSON2+22j ...
ROM:2736
ROM:2736 ; FUNCTION CHUNK AT ROM:2778 SIZE 0000005E BYTES
ROM:2736
ROM:2736 lda MSK ; Количество строк экрана
ROM:2739 cpi 18h
ROM:273B rz
ROM:273C lxi d, FNKTXT ; Текст функциональных клавиш
ROM:273F mov a, h
ROM:2740 lxi h, 0
ROM:2743 rar
ROM:2744 jnc loc_274A
ROM:2747 lxi h, 50h ; 'P'
ROM:274A
ROM:274A loc_274A: ; CODE XREF: FNKEYTR+Ej
ROM:274A dad d
ROM:274B push h
ROM:274C lhld ABS1 ; Адрес буфера экрана режима 0 и 1
ROM:274F lxi d, loc_2DF+1
ROM:2752 xchg
ROM:2753 lda DLSM ; Максимальная длина строк 32 или 64
ROM:2756 ani 0BFh
ROM:2758 jnz loc_275C
ROM:275B dad h
ROM:275C
ROM:275C loc_275C: ; CODE XREF: FNKEYTR+22j
ROM:275C dad d
ROM:275D pop d
ROM:275E lda SPN ; Пропусков в начале строки
ROM:2761 mov c, a
ROM:2762 mvi b, 0
ROM:2764 dad b
ROM:2765 xchg
ROM:2766 lda DLSF ; Длина строки экрана
ROM:2769 cpi 9
ROM:276B jz loc_27CA
ROM:276E jnc loc_2778
ROM:276E ; End of function FNKEYTR
ROM:276E
ROM:2771
ROM:2771 ; =============== S U B R O U T I N E =======================================
ROM:2771
ROM:2771
ROM:2771 MACRO8: ; CODE XREF: FNKEYTR+5Bp
ROM:2771 ; FNKEYTR+9Cp
ROM:2771 xchg
ROM:2772 mvi b, 20h ; ' '
ROM:2774 call MACRO9
ROM:2777 ret
ROM:2777 ; End of function MACRO8
ROM:2777
ROM:2778 ; ---------------------------------------------------------------------------
ROM:2778 ; START OF FUNCTION CHUNK FOR FNKEYTR
ROM:2778
ROM:2778 loc_2778: ; CODE XREF: FNKEYTR+38j
ROM:2778 mvi c, 6
ROM:277A mvi b, 28h ; '('
ROM:277C
ROM:277C loc_277C: ; CODE XREF: FNKEYTR+51j
ROM:277C cmp b
ROM:277D jnc loc_278A
ROM:2780 push psw
ROM:2781 mov a, b
ROM:2782 sui 5
ROM:2784 mov b, a
ROM:2785 pop psw
ROM:2786 dcr c
ROM:2787 jnz loc_277C
ROM:278A
ROM:278A loc_278A: ; CODE XREF: FNKEYTR+47j
ROM:278A sub b
ROM:278B rar
ROM:278C inr a
ROM:278D dcr a
ROM:278E push psw
ROM:278F aci 0
ROM:2791 call MACRO8
ROM:2794 xchg
ROM:2795 pop psw
ROM:2796
ROM:2796 loc_2796: ; CODE XREF: FNKEYTR+97j
ROM:2796 push psw
ROM:2797 mvi b, 5
ROM:2799 inr c
ROM:279A
ROM:279A loc_279A: ; CODE XREF: FNKEYTR+91j
ROM:279A pop psw
ROM:279B jz loc_27A5
ROM:279E dcr a
ROM:279F push psw
ROM:27A0 push b
ROM:27A1 inr c
ROM:27A2 jmp loc_27A7
ROM:27A5 ; ---------------------------------------------------------------------------
ROM:27A5
ROM:27A5 loc_27A5: ; CODE XREF: FNKEYTR+65j
ROM:27A5 push psw
ROM:27A6 push b
ROM:27A7
ROM:27A7 loc_27A7: ; CODE XREF: FNKEYTR+6Cj
ROM:27A7 push h
ROM:27A8
ROM:27A8 loc_27A8: ; CODE XREF: FNKEYTR+7Ej
ROM:27A8 mov a, m
ROM:27A9 cpi 20h ; ' '
ROM:27AB jnc loc_27B0
ROM:27AE mvi a, 20h ; ' '
ROM:27B0
ROM:27B0 loc_27B0: ; CODE XREF: FNKEYTR+75j
ROM:27B0 stax d
ROM:27B1 inx h
ROM:27B2 inx d
ROM:27B3 dcr c
ROM:27B4 jnz loc_27A8
ROM:27B7 pop h
ROM:27B8 pop b
ROM:27B9 dcr b
ROM:27BA jz loc_27D0
ROM:27BD mvi a, 20h ; ' '
ROM:27BF stax d
ROM:27C0 inx d
ROM:27C1 push b
ROM:27C2 lxi b, 10h
ROM:27C5 dad b
ROM:27C6 pop b
ROM:27C7 jmp loc_279A
ROM:27CA ; ---------------------------------------------------------------------------
ROM:27CA
ROM:27CA loc_27CA: ; CODE XREF: FNKEYTR+35j
ROM:27CA mvi c, 0
ROM:27CC xra a
ROM:27CD jmp loc_2796
ROM:27D0 ; ---------------------------------------------------------------------------
ROM:27D0
ROM:27D0 loc_27D0: ; CODE XREF: FNKEYTR+84j
ROM:27D0 pop psw
ROM:27D1 rz
ROM:27D2 call MACRO8
ROM:27D5 ret
ROM:27D5 ; END OF FUNCTION CHUNK FOR FNKEYTR
ROM:27D5 ; ---------------------------------------------------------------------------
ROM:27D6 TAB5: .db ' ', '!', 22h, '#', '$', '%', '&', 27h, '(', ')', ','
ROM:27D6 ; DATA XREF: KBD+1o
ROM:27D6 .db '-', '.', ':', ';', '?', '{', '|', '}', '~', '', '`'
ROM:27D6 .db 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K'
ROM:27D6 .db 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V'
ROM:27D6 .db 'W', 'X', 'Y', 'Z', 0, 0, 0, 0, 0, 'ё', 'Є', 'є', 'Ї'
ROM:27D6 .db 'ї', 1Bh, 9, 0FFh, 8, 0, 0Dh, ' ', 0Ch, 12h, '', 1Dh
ROM:27D6 .db 1Eh, 1Fh, 1Ch, 0Bh, 19h, 18h, 2, 6, 0Eh, 0Fh, 0, ' '
ROM:27D6 .db 0Ch, 12h, '', '4', '8', '2', '6', '7', '9', '5', '1'
ROM:27D6 .db '3', '.', '0', 0
ROM:2836
ROM:2836 ; =============== S U B R O U T I N E =======================================
ROM:2836
ROM:2836 ; Установка цвета
ROM:2836
ROM:2836 SETCOLOR2: ; CODE XREF: SETCOLORj
ROM:2836 ; SETMODE2+61p ...
ROM:2836 push h
ROM:2837 lhld CPP ; цвет изображения
ROM:283A mov a, h
ROM:283B rlc
ROM:283C rlc
ROM:283D rlc
ROM:283E rlc
ROM:283F ora l
ROM:2840 mov h, a
ROM:2841 lda MODE ; Режим экрана
ROM:2844 cpi 1
ROM:2846 mov a, h
ROM:2847 jz loc_2851
ROM:284A jnc loc_2861
ROM:284D out 88h
ROM:284F pop h
ROM:2850 ret
ROM:2851 ; ---------------------------------------------------------------------------
ROM:2851
ROM:2851 loc_2851: ; CODE XREF: SETCOLOR2+11j
ROM:2851 lhld CLRT ; Адрес таблицы цвета режима 1
ROM:2854 push b
ROM:2855 lxi b, 20h ; ' '
ROM:2858 call FILLAREA ; A=константа, BC=счетчик, HL=адрес (заполнение области константой)
ROM:285B mvi a, 1
ROM:285D sta SCRTMP1 ; Экранные временные переменные.
ROM:2860 pop b
ROM:2861
ROM:2861 loc_2861: ; CODE XREF: SETCOLOR2+14j
ROM:2861 lda CRG ; цвет рамки
ROM:2864 rrc
ROM:2865 rrc
ROM:2866 rrc
ROM:2867 rrc
ROM:2868 out 88h
ROM:286A mov a, h
ROM:286B pop h
ROM:286C ret
ROM:286C ; End of function SETCOLOR2
ROM:286C
ROM:286D
ROM:286D ; =============== S U B R O U T I N E =======================================
ROM:286D
ROM:286D ; Установка режима экрана
ROM:286D
ROM:286D SETMODE2: ; CODE XREF: SETMODEj
ROM:286D ; START+2986p
ROM:286D push b
ROM:286E push d
ROM:286F push h
ROM:2870 lxi h, MODE ; Режим экрана
ROM:2873 mov b, m
ROM:2874 mov m, a
ROM:2875 inx h
ROM:2876 mov c, a
ROM:2877 mov a, b
ROM:2878 cpi 2
ROM:287A jz loc_287E
ROM:287D mov m, a
ROM:287E
ROM:287E loc_287E: ; CODE XREF: SETMODE2+Dj
ROM:287E mov a, c
ROM:287F cpi 1
ROM:2881 push psw
ROM:2882 lxi d, DLSM ; Максимальная длина строк 32 или 64
ROM:2885 lxi b, 13h
ROM:2888 lxi h, TAB6
ROM:288B pop psw
ROM:288C mvi a, 20h ; ' '
ROM:288E jc loc_289A
ROM:2891 dad b
ROM:2892 mvi a, 0
ROM:2894 jz loc_289A
ROM:2897 dad b
ROM:2898 mvi a, 10h
ROM:289A
ROM:289A loc_289A: ; CODE XREF: SETMODE2+21j
ROM:289A ; SETMODE2+27j
ROM:289A push psw
ROM:289B call RAMSEND ; BC=счетчик, DE=адрес приема, HL=адрес источника
ROM:289B ; (пересылка RAM->RAM, RAM->VRAM)
ROM:289E lda MODE ; Режим экрана
ROM:28A1 cpi 2
ROM:28A3 lhld AGS1 ; Адрес знакогенератора режима 0 и 1
ROM:28A3 ; Адрес буфера экрана режима 2
ROM:28A6 jz loc_28D6
ROM:28A9 xchg
ROM:28AA lxi b, 800h
ROM:28AD lxi h, ZNAKGEN ; Начало знакогенератора.
ROM:28B0 call DIRAMSEND ; Запрещает прерывания и вызывает RAMSEND
ROM:28B3
ROM:28B3 loc_28B3: ; CODE XREF: SETMODE2+77j
ROM:28B3 call SETMODE3 ; Подпрограмма установки видео-режимов.
ROM:28B6 pop psw
ROM:28B7 mov b, a
ROM:28B8 in 84h
ROM:28BA ani 0CFh
ROM:28BC ora b
ROM:28BD push psw
ROM:28BE di
ROM:28BF mvi a, 20h ; ' '
ROM:28C1 out 84h
ROM:28C3 xra a
ROM:28C4 out 88h
ROM:28C6 mvi a, 0Ch
ROM:28C8 call SYMSCR2 ; вывод символа из A на экран в текущую позицию курсора
ROM:28CB pop psw
ROM:28CC out 84h
ROM:28CE call SETCOLOR2 ; Установка цвета
ROM:28D1 ei
ROM:28D2 pop h
ROM:28D3 pop d
ROM:28D4 pop b
ROM:28D5 ret
ROM:28D6 ; ---------------------------------------------------------------------------
ROM:28D6
ROM:28D6 loc_28D6: ; CODE XREF: SETMODE2+39j
ROM:28D6 mvi b, 0
ROM:28D8 mvi c, 3
ROM:28DA
ROM:28DA loc_28DA: ; CODE XREF: SETMODE2+70j
ROM:28DA ; SETMODE2+74j
ROM:28DA mov m, b
ROM:28DB inx h
ROM:28DC inr b
ROM:28DD jnz loc_28DA
ROM:28E0 dcr c
ROM:28E1 jnz loc_28DA
ROM:28E4 jmp loc_28B3
ROM:28E4 ; End of function SETMODE2
ROM:28E4
ROM:28E4 ; ---------------------------------------------------------------------------
ROM:28E7 TAB6: .db 40h, 1, 26h, 17h, 19h, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0
ROM:28E7 ; DATA XREF: SETMODE2+1Bo
ROM:28E7 .db 0, 0, 0, 0, 20h, 2, 1Ch, 17h, 2, 0, 0, 0, 4, 0, 8
ROM:28E7 .db 0, 0, 0, 0, 0, 94h, 0, 34h, 20h, 1, 1Eh, 18h, 1, 0
ROM:28E7 .db 0, 0, 0, 0, 18h, 0, 0, 0, 0, 0, 0, 0, 20h
ROM:2920 ; ---------------------------------------------------------------------------
ROM:2920 ; START OF FUNCTION CHUNK FOR START
ROM:2920
ROM:2920 INIT: ; CODE XREF: START+1j
ROM:2920 mvi a, 81h ; 'Б'
ROM:2922 out 87h
ROM:2924 mvi a, 0
ROM:2926 out 84h
ROM:2928 mvi a, 82h ; 'В'
ROM:292A out 83h
ROM:292C mvi a, 0FCh ; '№'
ROM:292E out 80h
ROM:2930 mvi a, 0DFh ; '-'
ROM:2932 out 86h
ROM:2934 mvi a, 5
ROM:2936 out 87h
ROM:2938 mvi a, 77h ; 'w'
ROM:293A out 88h
ROM:293C
ROM:293C loc_293C: ; CODE XREF: START+2951j
ROM:293C lxi b, 0
ROM:293F lxi h, 0F000h
ROM:2942
ROM:2942 loc_2942: ; CODE XREF: START+294Cj
ROM:2942 xra a
ROM:2943 mov m, a
ROM:2944 cmp m
ROM:2945 jz loc_2949
ROM:2948 inx b
ROM:2949
ROM:2949 loc_2949: ; CODE XREF: START+2945j
ROM:2949 inx h
ROM:294A mov a, h
ROM:294B ora l
ROM:294C jnz loc_2942
ROM:294F mov a, b
ROM:2950 ora c
ROM:2951 jnz loc_293C
ROM:2954 lxi sp, BGSTRAR ; По этому адресу (&hF7FF) инициализируется SP при INIT
ROM:2957 lxi b, 0
ROM:295A push b
ROM:295B cma
ROM:295C out 88h
ROM:295E lxi b, 94h ; 'Ф'
ROM:2961 lxi d, VRAM2RAM_ ; Подпрограмма пересылки из VRAM в RAM
ROM:2964 lxi h, INITVRAM2RAM_ ; Инициализация процедур VRAM2RAM.
ROM:2964 ; Этот блок переносится в ОЗУ по адресу &hF800
ROM:2967 call RAMSEND ; BC=счетчик, DE=адрес приема, HL=адрес источника
ROM:2967 ; (пересылка RAM->RAM, RAM->VRAM)
ROM:296A lxi b, 61h ; 'a'
ROM:296D lxi d, STARTFL ; Заполняется с этого адреса из &h0205 при старте системы.
ROM:2970 lxi h, INITKEYS ; Инициализация переменных.
ROM:2970 ; Этот блок переностися в ОЗУ по адресу &hF8F0
ROM:2973 call RAMSEND ; BC=счетчик, DE=адрес приема, HL=адрес источника
ROM:2973 ; (пересылка RAM->RAM, RAM->VRAM)
ROM:2976 xra a
ROM:2977 mov h, a
ROM:2978 mov l, a
ROM:2979 lxi b, 4000h
ROM:297C call FILLAREA ; A=константа, BC=счетчик, HL=адрес (заполнение области константой)
ROM:297F mvi a, 0Fh
ROM:2981 sta CPP ; цвет изображения
ROM:2984 mvi a, 0
ROM:2986 call SETMODE2 ; Установка режима экрана
ROM:2989 mvi a, 0F4h ; 'Ї'
ROM:298B out 80h
ROM:298D call PCHL4002 ; Тут вообще муть несусветная! Но интересно жутко!
ROM:2990 mvi a, 0F8h ; '°'
ROM:2992 out 80h
ROM:2994 call PCHL4002 ; Тут вообще муть несусветная! Но интересно жутко!
ROM:2997 mvi a, 0FCh ; '№'
ROM:2999 out 80h
ROM:299B call PCHL4002 ; Тут вообще муть несусветная! Но интересно жутко!
ROM:299E call FNKEYFL2 ; Сбрасывает настройки функциональных клавиш по умолчанию
ROM:29A1 jmp INIT2
ROM:29A1 ; END OF FUNCTION CHUNK FOR START
ROM:29A4
ROM:29A4 ; =============== S U B R O U T I N E =======================================
ROM:29A4
ROM:29A4 ; Сбрасывает настройки функциональных клавиш по умолчанию
ROM:29A4
ROM:29A4 FNKEYFL2: ; CODE XREF: ROM:FNKEYFLj
ROM:29A4 ; START+299Ep ...
ROM:29A4 lxi d, FNKTXT ; Текст функциональных клавиш
ROM:29A7 lxi h, aColor ; "color "
ROM:29AA mvi c, 0Ah
ROM:29AC
ROM:29AC loc_29AC: ; CODE XREF: FNKEYFL2+1Ej
ROM:29AC push d
ROM:29AD
ROM:29AD loc_29AD: ; CODE XREF: FNKEYFL2+11j
ROM:29AD xra a
ROM:29AE ora m
ROM:29AF jz loc_29B8
ROM:29B2 stax d
ROM:29B3 inx d
ROM:29B4 inx h
ROM:29B5 jmp loc_29AD
ROM:29B8 ; ---------------------------------------------------------------------------
ROM:29B8
ROM:29B8 loc_29B8: ; CODE XREF: FNKEYFL2+Bj
ROM:29B8 inx h
ROM:29B9 pop d
ROM:29BA push h
ROM:29BB lxi h, 10h
ROM:29BE dad d
ROM:29BF xchg
ROM:29C0 pop h
ROM:29C1 dcr c
ROM:29C2 jnz loc_29AC
ROM:29C5 ret
ROM:29C5 ; End of function FNKEYFL2
ROM:29C5
ROM:29C6
ROM:29C6 ; =============== S U B R O U T I N E =======================================
ROM:29C6
ROM:29C6 ; Выключает нижнюю строку ключей.
ROM:29C6
ROM:29C6 KEYSOFF2: ; CODE XREF: KEYSOFFj
ROM:29C6 mvi a, 18h
ROM:29C8 sta MSK ; Количество строк экрана
ROM:29CB lxi d, KEYSTAB ; Системная таблица обработчика функциональных клавиш.
ROM:29CE call KEYSOFF3 ; Подпрограмма выключения функциональных клавиш
ROM:29D1 call SPACES2 ; Заполнение областей на экране пробелами. Дополнительная точка входа.
ROM:29D4 ret
ROM:29D4 ; End of function KEYSOFF2
ROM:29D4
ROM:29D5
ROM:29D5 ; =============== S U B R O U T I N E =======================================
ROM:29D5
ROM:29D5 ; Включает нижнюю строку ключей.
ROM:29D5
ROM:29D5 KEYSON2: ; CODE XREF: KEYSONj
ROM:29D5 call CURSOR2 ; Подпрограмма отображения курсора.
ROM:29D8 mov a, d
ROM:29D9 sui 16h
ROM:29DB jc loc_29EB
ROM:29DE inr a
ROM:29DF
ROM:29DF loc_29DF: ; CODE XREF: KEYSON2+13j
ROM:29DF push psw
ROM:29E0 call KEYSON3 ; Подпрограмма включения функциональных клавиш
ROM:29E3 call UP ; Перевод курсора вверх
ROM:29E6 pop psw
ROM:29E7 dcr a
ROM:29E8 jnz loc_29DF
ROM:29EB
ROM:29EB loc_29EB: ; CODE XREF: KEYSON2+6j
ROM:29EB call FNKEYFL2 ; Сбрасывает настройки функциональных клавиш по умолчанию
ROM:29EE mvi a, 17h
ROM:29F0 sta MSK ; Количество строк экрана
ROM:29F3 lda INSF2 ; Флаги режимов клавиатуры
ROM:29F6 mov h, a
ROM:29F7 jmp FNKEYTR ; Подпрограмма-обработчик функциональных клавиш
ROM:29F7 ; End of function KEYSON2
ROM:29F7
ROM:29F7 ; ---------------------------------------------------------------------------
ROM:29FA aColor: .text "color " ; DATA XREF: FNKEYFL2+3o
ROM:29FA .db 0
ROM:2A01 aAuto: .text "auto "
ROM:2A01 .db 0
ROM:2A07 aGoto: .text "goto "
ROM:2A07 .db 0
ROM:2A0D aList_0: .text "list "
ROM:2A0D .db 0
ROM:2A13 aRun_0: .text "run"
ROM:2A13 .db 0Dh
ROM:2A13 .db 0
ROM:2A18 aColor1544: .text "color 15,4,4"
ROM:2A18 .db 0Dh
ROM:2A18 .db 0
ROM:2A26 aCload: .text "cload"
ROM:2A26 .db 22h
ROM:2A26 .db 0
ROM:2A2D aCont: .text "cont"
ROM:2A2D .db 0
ROM:2A32 aList: .text "list"
ROM:2A32 .db 0
ROM:2A37 aRun: .text "run"
ROM:2A37 .db 0Dh
ROM:2A37 .db 0
ROM:2A3C
ROM:2A3C ; =============== S U B R O U T I N E =======================================
ROM:2A3C
ROM:2A3C ; Записывает по адресу в BC три байта - &h0D, &h0A, &h00
ROM:2A3C
ROM:2A3C ODOAOO: ; CODE XREF: EDIT5+7Dp
ROM:2A3C mvi a, 0Dh
ROM:2A3E stax b
ROM:2A3F inx b
ROM:2A40 mvi a, 0Ah
ROM:2A42 stax b
ROM:2A43 inx b
ROM:2A44 xra a
ROM:2A45 stax b
ROM:2A46 ret
ROM:2A46 ; End of function ODOAOO
ROM:2A46
ROM:2A47
ROM:2A47 ; =============== S U B R O U T I N E =======================================
ROM:2A47
ROM:2A47 ; Перекодировка A в символы
ROM:2A47
ROM:2A47 BTDECODE2: ; CODE XREF: BTDECODEj
ROM:2A47 push d
ROM:2A48 mov d, a
ROM:2A49 rlc
ROM:2A4A rlc
ROM:2A4B rlc
ROM:2A4C rlc
ROM:2A4D call MACRO10
ROM:2A50 mov a, d
ROM:2A51 call MACRO10
ROM:2A54 pop d
ROM:2A55 ret
ROM:2A55 ; End of function BTDECODE2
ROM:2A55
ROM:2A56
ROM:2A56 ; =============== S U B R O U T I N E =======================================
ROM:2A56
ROM:2A56
ROM:2A56 MACRO10: ; CODE XREF: BTDECODE2+6p
ROM:2A56 ; BTDECODE2+Ap
ROM:2A56 ani 0Fh
ROM:2A58 cpi 0Ah
ROM:2A5A jc loc_2A5F
ROM:2A5D adi 7
ROM:2A5F
ROM:2A5F loc_2A5F: ; CODE XREF: MACRO10+4j
ROM:2A5F adi 30h ; '0'
ROM:2A61 stax b
ROM:2A62 inx b
ROM:2A63 ret
ROM:2A63 ; End of function MACRO10
ROM:2A63
ROM:2A64
ROM:2A64 ; =============== S U B R O U T I N E =======================================
ROM:2A64
ROM:2A64 ; Возвращает в аккумулятор длину строки экрана в символах
ROM:2A64
ROM:2A64 SCRLEN2: ; CODE XREF: SCRLENj
ROM:2A64 cpi 1
ROM:2A66 rc
ROM:2A67 mov e, a
ROM:2A68 lxi h, SPK ; Пропусков в конце строки
ROM:2A6B mvi m, 0
ROM:2A6D lda DLSM ; Максимальная длина строк 32 или 64
ROM:2A70 cpi 40h ; '@'
ROM:2A72 jnz loc_2A79
ROM:2A75 mvi m, 18h
ROM:2A77 mvi a, 28h ; '('
ROM:2A79
ROM:2A79 loc_2A79: ; CODE XREF: SCRLEN2+Ej
ROM:2A79 cmp e
ROM:2A7A rc
ROM:2A7B sub e
ROM:2A7C rrc
ROM:2A7D mov d, a
ROM:2A7E ani 1Fh
ROM:2A80 add m
ROM:2A81 mov m, a
ROM:2A82 mov a, d
ROM:2A83 rlc
ROM:2A84 ani 1
ROM:2A86 add d
ROM:2A87 ani 1Fh
ROM:2A89 sta SPN ; Пропусков в начале строки
ROM:2A8C mov a, e
ROM:2A8D sta DLSF ; Длина строки экрана
ROM:2A90 call CLRSCR ; Очистка экрана (Печать CHR$(&h0C))
ROM:2A93 ora a
ROM:2A94 ret
ROM:2A94 ; End of function SCRLEN2
ROM:2A94
ROM:2A95
ROM:2A95 ; =============== S U B R O U T I N E =======================================
ROM:2A95
ROM:2A95 ; Обработка строк редактором
ROM:2A95
ROM:2A95 EDIT2: ; CODE XREF: EDITj
ROM:2A95 push b
ROM:2A96 sta EDITTMP ; Временная переменная редактора
ROM:2A99 ani 1
ROM:2A9B jz loc_2AB4
ROM:2A9E lda DLSF ; Длина строки экрана
ROM:2AA1 mov c, a
ROM:2AA2 lda MSK ; Количество строк экрана
ROM:2AA5 mov b, a
ROM:2AA6 cmp d
ROM:2AA7 jnc loc_2AAB
ROM:2AAA mov d, b
ROM:2AAB
ROM:2AAB loc_2AAB: ; CODE XREF: EDIT2+12j
ROM:2AAB mov a, c
ROM:2AAC cmp e
ROM:2AAD jnc loc_2AB1
ROM:2AB0 mov e, c
ROM:2AB1
ROM:2AB1 loc_2AB1: ; CODE XREF: EDIT2+18j
ROM:2AB1 call EDIT3 ; Подпрограмма редактора
ROM:2AB4
ROM:2AB4 loc_2AB4: ; CODE XREF: EDIT2+6j
ROM:2AB4 lda EDITTMP ; Временная переменная редактора
ROM:2AB7 ani 2
ROM:2AB9 jz loc_2ACA
ROM:2ABC
ROM:2ABC loc_2ABC: ; CODE XREF: EDIT2+32j
ROM:2ABC mov a, m
ROM:2ABD ana a
ROM:2ABE jz loc_2ACA
ROM:2AC1 push h
ROM:2AC2 cnz SYMSCR2 ; вывод символа из A на экран в текущую позицию курсора
ROM:2AC5 pop h
ROM:2AC6 inx h
ROM:2AC7 jmp loc_2ABC
ROM:2ACA ; ---------------------------------------------------------------------------
ROM:2ACA
ROM:2ACA loc_2ACA: ; CODE XREF: EDIT2+24j
ROM:2ACA ; EDIT2+29j
ROM:2ACA lda EDITTMP ; Временная переменная редактора
ROM:2ACD ani 4
ROM:2ACF jz loc_2AF6
ROM:2AD2
ROM:2AD2 loc_2AD2: ; CODE XREF: EDIT2+4Dj
ROM:2AD2 call BUFFERTOA2 ; Ввод символа из буфера клавиатуры
ROM:2AD5 cpi 3
ROM:2AD7 jz loc_2AF8
ROM:2ADA cpi 0Dh
ROM:2ADC jz loc_2AE5
ROM:2ADF call SYMSCR2 ; вывод символа из A на экран в текущую позицию курсора
ROM:2AE2 jmp loc_2AD2
ROM:2AE5 ; ---------------------------------------------------------------------------
ROM:2AE5
ROM:2AE5 loc_2AE5: ; CODE XREF: EDIT2+47j
ROM:2AE5 call CARRET ; Печать возврата каретки (печать CHR$(&h0D))
ROM:2AE8 push d
ROM:2AE9 call UP ; Перевод курсора вверх
ROM:2AEC call EDIT5 ; Подпрограмма редактора
ROM:2AEF pop d
ROM:2AF0 call EDIT3 ; Подпрограмма редактора
ROM:2AF3
ROM:2AF3 loc_2AF3: ; CODE XREF: EDIT2+6Fj
ROM:2AF3 lxi h, IOBUF ; Буфер ввода-вывода (диск, кассеты)
ROM:2AF6
ROM:2AF6 loc_2AF6: ; CODE XREF: EDIT2+3Aj
ROM:2AF6 pop b
ROM:2AF7 ret
ROM:2AF8 ; ---------------------------------------------------------------------------
ROM:2AF8
ROM:2AF8 loc_2AF8: ; CODE XREF: EDIT2+42j
ROM:2AF8 call CARRET ; Печать возврата каретки (печать CHR$(&h0D))
ROM:2AFB mvi a, 0Dh
ROM:2AFD sta IOBUF ; Буфер ввода-вывода (диск, кассеты)
ROM:2B00 xra a
ROM:2B01 sta ASITT ; Временная переменная. Используется в AUTO, STOP, INPUTLN, TOKENIZE, TRETLINE
ROM:2B04 jmp loc_2AF3
ROM:2B04 ; End of function EDIT2
ROM:2B04
ROM:2B07
ROM:2B07 ; =============== S U B R O U T I N E =======================================
ROM:2B07
ROM:2B07 ; вывод символа из A на экран в текущую позицию курсора
ROM:2B07
ROM:2B07 SYMSCR2: ; CODE XREF: SYMSCRj
ROM:2B07 ; SETMODE2+5Bp ...
ROM:2B07
ROM:2B07 ; FUNCTION CHUNK AT ROM:2B9E SIZE 000000AB BYTES
ROM:2B07 ; FUNCTION CHUNK AT ROM:2CC7 SIZE 00000022 BYTES
ROM:2B07 ; FUNCTION CHUNK AT ROM:2D08 SIZE 0000001B BYTES
ROM:2B07 ; FUNCTION CHUNK AT ROM:2D2F SIZE 00000018 BYTES
ROM:2B07 ; FUNCTION CHUNK AT ROM:2D4F SIZE 0000001A BYTES
ROM:2B07 ; FUNCTION CHUNK AT ROM:2D8B SIZE 00000045 BYTES
ROM:2B07
ROM:2B07 mov b, a
ROM:2B08 lda PRNFL ; Флаг печати (Для LLIST, LPRINT равен 1)
ROM:2B0B cpi 1
ROM:2B0D mov a, b
ROM:2B0E push psw
ROM:2B0F cnc SYMPRN2 ; Вывод символа из A на печать
ROM:2B12 pop psw
ROM:2B13 rz
ROM:2B14 mov b, a
ROM:2B15 lxi h, SGF ; Флаг графического символа
ROM:2B18 cpi 20h ; ' '
ROM:2B1A jc loc_2B2D
ROM:2B1D mov a, m
ROM:2B1E ana a
ROM:2B1F mov a, b
ROM:2B20 jz loc_2B89
ROM:2B23 sui 40h ; '@'
ROM:2B25 mov b, a
ROM:2B26 mvi m, 0
ROM:2B28 jmp loc_2B89
ROM:2B2B ; ---------------------------------------------------------------------------
ROM:2B2B
ROM:2B2B GRAPH: ; CODE XREF: SYMSCR2+28j
ROM:2B2B mov m, a ; Обработка признака графического символа
ROM:2B2C ret
ROM:2B2D ; ---------------------------------------------------------------------------
ROM:2B2D
ROM:2B2D loc_2B2D: ; CODE XREF: SYMSCR2+13j
ROM:2B2D cpi 1
ROM:2B2F jz GRAPH ; Обработка признака графического символа
ROM:2B32 call CHKMODE ; Проверяет режим экрана на 2. Если да, то A=B
ROM:2B35 jz loc_2B9E
ROM:2B38 cpi 2
ROM:2B3A jz FHOME ; Перемещает курсор в начало физической строки
ROM:2B3D cpi 6
ROM:2B3F jz FEND ; Перемещает курсор в конец физической строки
ROM:2B42 cpi 7
ROM:2B44 jz BELL2 ; Обработка звука нажатия клавиш и CHR$(&h07) (в зависимости от BEEPF)
ROM:2B47 cpi 8
ROM:2B49 jz BKSPC
ROM:2B4C cpi 9
ROM:2B4E jz TABTR ; Переход к следующей табулированной позиции
ROM:2B51 cpi 0Bh
ROM:2B53 jz RHOME
ROM:2B56 cpi 0Ch
ROM:2B58 jz CLRSCR ; Очистка экрана (Печать CHR$(&h0C))
ROM:2B5B cpi 0Dh
ROM:2B5D jz CARRET ; Печать возврата каретки (печать CHR$(&h0D))
ROM:2B60 cpi 0Eh
ROM:2B62 jz LEND ; Перемещает курсор в конец логической строки.
ROM:2B65 cpi 0Fh
ROM:2B67 jz LHOME
ROM:2B6A cpi 12h
ROM:2B6C jz INSERT
ROM:2B6F cpi 19h
ROM:2B71 jz REND ; Перемещает курсор в правый нижний угол экрана
ROM:2B74 cpi 1Ch
ROM:2B76 jz RIGHT ; Перевод курсора вправо
ROM:2B79 cpi 1Dh
ROM:2B7B jz LEFT ; Перевод курсора влево
ROM:2B7E cpi 1Eh
ROM:2B80 jz UP ; Перевод курсора вверх
ROM:2B83 cpi 1Fh
ROM:2B85 jz DOWN
ROM:2B88 ret
ROM:2B89 ; ---------------------------------------------------------------------------
ROM:2B89
ROM:2B89 loc_2B89: ; CODE XREF: SYMSCR2+19j
ROM:2B89 ; SYMSCR2+21j
ROM:2B89 call CHKMODE ; Проверяет режим экрана на 2. Если да, то A=B
ROM:2B8C jz loc_2BCD
ROM:2B8F cpi 7Fh ; ''
ROM:2B91 jz loc_2D97
ROM:2B94 jmp SYMSCR3 ; Вывод символа из A на экран в текущую позицию курсора. Подпрограмма.
ROM:2B94 ; End of function SYMSCR2
ROM:2B94
ROM:2B97
ROM:2B97 ; =============== S U B R O U T I N E =======================================
ROM:2B97
ROM:2B97 ; Проверяет режим экрана на 2. Если да, то A=B
ROM:2B97
ROM:2B97 CHKMODE: ; CODE XREF: SYMSCR2+2Bp
ROM:2B97 ; SYMSCR2:loc_2B89p ...
ROM:2B97 lda MODE ; Режим экрана
ROM:2B9A cpi 2
ROM:2B9C mov a, b
ROM:2B9D ret
ROM:2B9D ; End of function CHKMODE
ROM:2B9D
ROM:2B9E ; ---------------------------------------------------------------------------
ROM:2B9E ; START OF FUNCTION CHUNK FOR SYMSCR2
ROM:2B9E
ROM:2B9E loc_2B9E: ; CODE XREF: SYMSCR2+2Ej
ROM:2B9E cpi 0Dh
ROM:2BA0 jz loc_2BC6
ROM:2BA3 cpi 0Ch
ROM:2BA5 rnz
ROM:2BA6 xra a
ROM:2BA7 lhld GTBL1 ; Адрес таблицы точек изображения в режиме 2
ROM:2BAA lxi b, 1800h
ROM:2BAD call FILLAREA ; A=константа, BC=счетчик, HL=адрес (заполнение области константой)
ROM:2BB0 call SETCOLOR2 ; Установка цвета
ROM:2BB3 lhld CTBL1 ; Адрес таблицы цвета в режиме 2
ROM:2BB6 lxi b, 1800h
ROM:2BB9 call FILLAREA ; A=константа, BC=счетчик, HL=адрес (заполнение области константой)
ROM:2BBC lxi h, 0
ROM:2BBF shld X1 ; Первый графический курсор, координата X
ROM:2BC2 shld X2 ; Второй графический курсор, координата X
ROM:2BC5 ret
ROM:2BC6 ; ---------------------------------------------------------------------------
ROM:2BC6
ROM:2BC6 loc_2BC6: ; CODE XREF: SYMSCR2+99j
ROM:2BC6 xra a
ROM:2BC7 sta X1 ; Первый графический курсор, координата X
ROM:2BCA jmp loc_2C3A
ROM:2BCD ; ---------------------------------------------------------------------------
ROM:2BCD
ROM:2BCD loc_2BCD: ; CODE XREF: SYMSCR2+85j
ROM:2BCD push psw
ROM:2BCE call PRESETWT ; Рисование точки белым цветом (FD90 координата X, FD91 координата Y)
ROM:2BD1 lda Y1 ; Первый графический курсор, координата Y
ROM:2BD4 sta SYMTMP ; Временная переменная. Используется SYMSCR.
ROM:2BD7 pop psw
ROM:2BD8 xchg
ROM:2BD9 shld INTAR+20h ; Рабочая область обработки прерываний
ROM:2BDC mvi h, 0
ROM:2BDE lxi d, ZNAKGEN ; Начало знакогенератора.
ROM:2BE1 mov l, a
ROM:2BE2 dad h
ROM:2BE3 dad h
ROM:2BE4 dad h
ROM:2BE5 dad d
ROM:2BE6 push h
ROM:2BE7 mvi c, 0
ROM:2BE9 mov a, b
ROM:2BEA mov d, c
ROM:2BEB mov e, m
ROM:2BEC xchg
ROM:2BED
ROM:2BED loc_2BED: ; CODE XREF: SYMSCR2+E9j
ROM:2BED dad h
ROM:2BEE inr c
ROM:2BEF rrc
ROM:2BF0 jnc loc_2BED
ROM:2BF3 mov b, c
ROM:2BF4 lda PSETC ; Цвет точки у команды PSET
ROM:2BF7 mov c, a
ROM:2BF8 xchg
ROM:2BF9 lhld INTAR+20h ; Рабочая область обработки прерываний
ROM:2BFC call VRAMTR2 ; Подпрограмма работы с видеопамятью. Используется в SYMSCR2.
ROM:2BFF pop h
ROM:2C00 inx h
ROM:2C01 mvi a, 7
ROM:2C03 sta INTAR+22h ; Рабочая область обработки прерываний
ROM:2C06
ROM:2C06 loc_2C06: ; CODE XREF: SYMSCR2+127j
ROM:2C06 mvi d, 0
ROM:2C08 mov e, m
ROM:2C09 inx h
ROM:2C0A push h
ROM:2C0B push b
ROM:2C0C xchg
ROM:2C0D
ROM:2C0D loc_2C0D: ; CODE XREF: SYMSCR2+108j
ROM:2C0D dad h
ROM:2C0E dcr b
ROM:2C0F jnz loc_2C0D
ROM:2C12 xchg
ROM:2C13 lhld INTAR+20h ; Рабочая область обработки прерываний
ROM:2C16 inr l
ROM:2C17 mov a, l
ROM:2C18 ani 7
ROM:2C1A jnz loc_2C22
ROM:2C1D mov a, l
ROM:2C1E sui 8
ROM:2C20 mov l, a
ROM:2C21 inr h
ROM:2C22
ROM:2C22 loc_2C22: ; CODE XREF: SYMSCR2+113j
ROM:2C22 shld INTAR+20h ; Рабочая область обработки прерываний
ROM:2C25 pop b
ROM:2C26 call VRAMTR2 ; Подпрограмма работы с видеопамятью. Используется в SYMSCR2.
ROM:2C29 lxi h, INTAR+22h ; Рабочая область обработки прерываний
ROM:2C2C dcr m
ROM:2C2D pop h
ROM:2C2E jnz loc_2C06
ROM:2C31 lda X1 ; Первый графический курсор, координата X
ROM:2C34 adi 8
ROM:2C36 sta X1 ; Первый графический курсор, координата X
ROM:2C39 rnc
ROM:2C3A
ROM:2C3A loc_2C3A: ; CODE XREF: SYMSCR2+C3j
ROM:2C3A lda Y1 ; Первый графический курсор, координата Y
ROM:2C3D adi 8
ROM:2C3F cpi 0BFh ; '¬'
ROM:2C41 jc loc_2C45
ROM:2C44 xra a
ROM:2C45
ROM:2C45 loc_2C45: ; CODE XREF: SYMSCR2+13Aj
ROM:2C45 sta Y1 ; Первый графический курсор, координата Y
ROM:2C48 ret
ROM:2C48 ; END OF FUNCTION CHUNK FOR SYMSCR2
ROM:2C49
ROM:2C49 ; =============== S U B R O U T I N E =======================================
ROM:2C49
ROM:2C49 ; Подпрограмма работы с видеопамятью. Используется в SYMSCR2.
ROM:2C49
ROM:2C49 VRAMTR1: ; CODE XREF: VRAMTR2+Ap
ROM:2C49 ; VRAMTR2+12p
ROM:2C49 push h
ROM:2C4A call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM).
ROM:2C4D ora d
ROM:2C4E mov m, a
ROM:2C4F mov a, h
ROM:2C50 xri 20h
ROM:2C52 mov h, a
ROM:2C53 call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM).
ROM:2C56 ani 0F0h
ROM:2C58 ora c
ROM:2C59 mov m, a
ROM:2C5A pop h
ROM:2C5B mov a, l
ROM:2C5C adi 8
ROM:2C5E mov l, a
ROM:2C5F ret
ROM:2C5F ; End of function VRAMTR1
ROM:2C5F
ROM:2C60
ROM:2C60 ; =============== S U B R O U T I N E =======================================
ROM:2C60
ROM:2C60 ; Подпрограмма работы с видеопамятью. Используется в SYMSCR2.
ROM:2C60
ROM:2C60 VRAMTR2: ; CODE XREF: SYMSCR2+F5p
ROM:2C60 ; SYMSCR2+11Fp
ROM:2C60 lda SYMTMP ; Временная переменная. Используется SYMSCR.
ROM:2C63 inr a
ROM:2C64 cpi 0C0h ; 'L'
ROM:2C66 rnc
ROM:2C67 sta SYMTMP ; Временная переменная. Используется SYMSCR.
ROM:2C6A call VRAMTR1 ; Подпрограмма работы с видеопамятью. Используется в SYMSCR2.
ROM:2C6D rc
ROM:2C6E mov a, e
ROM:2C6F ora a
ROM:2C70 rz
ROM:2C71 mov d, a
ROM:2C72 call VRAMTR1 ; Подпрограмма работы с видеопамятью. Используется в SYMSCR2.
ROM:2C75 ret
ROM:2C75 ; End of function VRAMTR2
ROM:2C75
ROM:2C76
ROM:2C76 ; =============== S U B R O U T I N E =======================================
ROM:2C76
ROM:2C76 ; Очистка экрана (Печать CHR$(&h0C))
ROM:2C76
ROM:2C76 CLRSCR: ; CODE XREF: SCRLEN2+2Cp
ROM:2C76 ; SYMSCR2+51j
ROM:2C76 call KBDBUFCL2 ; Очищает буфер клавиатуры
ROM:2C79 call CURSOR ; Отображение курсора.
ROM:2C7C lhld ABS1 ; Адрес буфера экрана режима 0 и 1
ROM:2C7F lda SPN ; Пропусков в начале строки
ROM:2C82 mov l, a
ROM:2C83 shld SMK ; Адрес курсора
ROM:2C86 lxi h, KSS ; Код символа в позиции курсора
ROM:2C89 mvi m, 20h ; ' '
ROM:2C8B lhld ABS1 ; Адрес буфера экрана режима 0 и 1
ROM:2C8E mvi c, 18h
ROM:2C90
ROM:2C90 loc_2C90: ; CODE XREF: CLRSCR+1Ej
ROM:2C90 call SPACES ; Заполнение областей на экране пробелами
ROM:2C93 dcr c
ROM:2C94 jnz loc_2C90
ROM:2C97 lxi h, SCLNTAB ; Таблица состояния строк экранного редактора
ROM:2C9A mvi a, 19h
ROM:2C9C mvi b, 80h ; 'А'
ROM:2C9E call MACRO9
ROM:2CA1 lda INSF2 ; Флаги режимов клавиатуры
ROM:2CA4 mov h, a
ROM:2CA5 call FNKEYTR ; Подпрограмма-обработчик функциональных клавиш
ROM:2CA8 lxi d, 0
ROM:2CAB jmp loc_2D00
ROM:2CAB ; End of function CLRSCR
ROM:2CAB
ROM:2CAE
ROM:2CAE ; =============== S U B R O U T I N E =======================================
ROM:2CAE
ROM:2CAE ; Заполнение областей на экране пробелами
ROM:2CAE
ROM:2CAE SPACES: ; CODE XREF: CLRSCR:loc_2C90p
ROM:2CAE ; KEYSON3+1Fp
ROM:2CAE lda SPN ; Пропусков в начале строки
ROM:2CB1 mvi b, 0
ROM:2CB3 call MACRO9
ROM:2CB3 ; End of function SPACES
ROM:2CB3
ROM:2CB6
ROM:2CB6 ; =============== S U B R O U T I N E =======================================
ROM:2CB6
ROM:2CB6 ; Заполнение областей на экране пробелами. Дополнительная точка входа.
ROM:2CB6
ROM:2CB6 SPACES2: ; CODE XREF: KEYSOFF2+Bp
ROM:2CB6 ; INSERTTR+83p
ROM:2CB6 lda DLSF ; Длина строки экрана
ROM:2CB9 mvi b, 20h ; ' '
ROM:2CBB call MACRO9
ROM:2CBE call SPACES3 ; Заполнение областей на экране пробелами. Дополнительная точка входа.
ROM:2CC1 mvi b, 0
ROM:2CC3 call MACRO9
ROM:2CC6 ret
ROM:2CC6 ; End of function SPACES2
ROM:2CC6
ROM:2CC7 ; ---------------------------------------------------------------------------
ROM:2CC7 ; START OF FUNCTION CHUNK FOR SYMSCR2
ROM:2CC7
ROM:2CC7 INSERT: ; CODE XREF: SYMSCR2+65j
ROM:2CC7 lda INSF ; Флаг вставки
ROM:2CCA ana a
ROM:2CCB jnz loc_2CE0
ROM:2CCE
ROM:2CCE loc_2CCE: ; DATA XREF: ROM:loc_883o
ROM:2CCE lxi h, CURISO ; Изображение курсора
ROM:2CD1 mov b, a
ROM:2CD2 mvi a, 4
ROM:2CD4 sta INSF ; Флаг вставки
ROM:2CD7 call MACRO9
ROM:2CDA call CURSOR2 ; Подпрограмма отображения курсора.
ROM:2CDD jmp loc_2D00
ROM:2CE0 ; ---------------------------------------------------------------------------
ROM:2CE0
ROM:2CE0 loc_2CE0: ; CODE XREF: SYMSCR2+1C4j
ROM:2CE0 call CURSOR ; Отображение курсора.
ROM:2CE3 jmp loc_2D00
ROM:2CE6 ; ---------------------------------------------------------------------------
ROM:2CE6
ROM:2CE6 RIGHT: ; CODE XREF: SYMSCR2+6Fj
ROM:2CE6 call CURSOR ; Перевод курсора вправо
ROM:2CE6 ; END OF FUNCTION CHUNK FOR SYMSCR2
ROM:2CE9
ROM:2CE9 ; =============== S U B R O U T I N E =======================================
ROM:2CE9
ROM:2CE9 ; Обработка перемещения курсора вправо
ROM:2CE9
ROM:2CE9 RIGHT2: ; CODE XREF: SYMSCR3+13p
ROM:2CE9 cmp e
ROM:2CEA jnz loc_2D04
ROM:2CED mvi e, 0
ROM:2CEF
ROM:2CEF loc_2CEF: ; CODE XREF: SYMSCR2+204j
ROM:2CEF mov a, b
ROM:2CF0 cmp d
ROM:2CF1 jz loc_2CF8
ROM:2CF4 inr d
ROM:2CF5 jmp loc_2D00
ROM:2CF8 ; ---------------------------------------------------------------------------
ROM:2CF8
ROM:2CF8 loc_2CF8: ; CODE XREF: RIGHT2+8j
ROM:2CF8 call KEYSON3 ; Подпрограмма включения функциональных клавиш
ROM:2CFB mvi a, 20h ; ' '
ROM:2CFD sta KSS ; Код символа в позиции курсора
ROM:2D00
ROM:2D00 loc_2D00: ; CODE XREF: CLRSCR+35j
ROM:2D00 ; SYMSCR2+1D6j ...
ROM:2D00 call EDIT3 ; Подпрограмма редактора
ROM:2D03 ret
ROM:2D04 ; ---------------------------------------------------------------------------
ROM:2D04
ROM:2D04 loc_2D04: ; CODE XREF: RIGHT2+1j
ROM:2D04 inr e
ROM:2D05 jmp loc_2D00
ROM:2D05 ; End of function RIGHT2
ROM:2D05
ROM:2D08 ; ---------------------------------------------------------------------------
ROM:2D08 ; START OF FUNCTION CHUNK FOR SYMSCR2
ROM:2D08
ROM:2D08 DOWN: ; CODE XREF: SYMSCR2+7Ej
ROM:2D08 ; CARRET+6j
ROM:2D08 call CURSOR ; Отображение курсора.
ROM:2D0B jmp loc_2CEF
ROM:2D0E ; ---------------------------------------------------------------------------
ROM:2D0E
ROM:2D0E LEFT: ; CODE XREF: SYMSCR2+74j
ROM:2D0E call CURSOR ; Перевод курсора влево
ROM:2D11 xra a
ROM:2D12 cmp e
ROM:2D13 jnz loc_2D1F
ROM:2D16 cmp d
ROM:2D17 jz loc_2D00
ROM:2D1A mov e, c
ROM:2D1B dcr d
ROM:2D1C jmp loc_2D00
ROM:2D1F ; ---------------------------------------------------------------------------
ROM:2D1F
ROM:2D1F loc_2D1F: ; CODE XREF: SYMSCR2+20Cj
ROM:2D1F dcr e
ROM:2D20 jmp loc_2D00
ROM:2D20 ; END OF FUNCTION CHUNK FOR SYMSCR2
ROM:2D23
ROM:2D23 ; =============== S U B R O U T I N E =======================================
ROM:2D23
ROM:2D23 ; Перевод курсора вверх
ROM:2D23
ROM:2D23 UP: ; CODE XREF: KEYSON2+Ep
ROM:2D23 ; EDIT2+54p ...
ROM:2D23 call CURSOR ; Отображение курсора.
ROM:2D26 xra a
ROM:2D27 cmp d
ROM:2D28 jz loc_2D00
ROM:2D2B dcr d
ROM:2D2C jmp loc_2D00
ROM:2D2C ; End of function UP
ROM:2D2C
ROM:2D2F ; ---------------------------------------------------------------------------
ROM:2D2F ; START OF FUNCTION CHUNK FOR SYMSCR2
ROM:2D2F
ROM:2D2F RHOME: ; CODE XREF: SYMSCR2+4Cj
ROM:2D2F call CURSOR ; Отображение курсора.
ROM:2D32 lxi d, 0
ROM:2D35 jmp loc_2D00
ROM:2D38 ; ---------------------------------------------------------------------------
ROM:2D38
ROM:2D38 REND: ; CODE XREF: SYMSCR2+6Aj
ROM:2D38 call CURSOR ; Перемещает курсор в правый нижний угол экрана
ROM:2D3B mov d, b
ROM:2D3C mov e, c
ROM:2D3D jmp loc_2D00
ROM:2D40 ; ---------------------------------------------------------------------------
ROM:2D40
ROM:2D40 FEND: ; CODE XREF: SYMSCR2+38j
ROM:2D40 call CURSOR ; Перемещает курсор в конец физической строки
ROM:2D43 mov e, c
ROM:2D44 jmp loc_2D00
ROM:2D44 ; END OF FUNCTION CHUNK FOR SYMSCR2
ROM:2D47
ROM:2D47 ; =============== S U B R O U T I N E =======================================
ROM:2D47
ROM:2D47 ; Перемещает курсор в начало физической строки
ROM:2D47
ROM:2D47 FHOME: ; CODE XREF: SYMSCR2+33j
ROM:2D47 ; CARRET+3p
ROM:2D47 call CURSOR ; Отображение курсора.
ROM:2D4A mvi e, 0
ROM:2D4C jmp loc_2D00
ROM:2D4C ; End of function FHOME
ROM:2D4C
ROM:2D4F ; ---------------------------------------------------------------------------
ROM:2D4F ; START OF FUNCTION CHUNK FOR SYMSCR2
ROM:2D4F
ROM:2D4F LHOME: ; CODE XREF: SYMSCR2+60j
ROM:2D4F call CURSOR ; Отображение курсора.
ROM:2D52 call CUREND2 ; Перемещает курсор в конец логической строки. Дополнительная подпрограмма.
ROM:2D55
ROM:2D55 loc_2D55: ; CODE XREF: SYMSCR2+25Bj
ROM:2D55 mvi a, 80h ; 'А'
ROM:2D57 ana m
ROM:2D58 jnz loc_2D65
ROM:2D5B mov a, d
ROM:2D5C ana a
ROM:2D5D jz loc_2D65
ROM:2D60 dcx h
ROM:2D61 dcr d
ROM:2D62 jmp loc_2D55
ROM:2D65 ; ---------------------------------------------------------------------------
ROM:2D65
ROM:2D65 loc_2D65: ; CODE XREF: SYMSCR2+251j
ROM:2D65 ; SYMSCR2+256j
ROM:2D65 mov e, b
ROM:2D66 jmp loc_2D00
ROM:2D66 ; END OF FUNCTION CHUNK FOR SYMSCR2
ROM:2D69
ROM:2D69 ; =============== S U B R O U T I N E =======================================
ROM:2D69
ROM:2D69 ; Перемещает курсор в конец логической строки.
ROM:2D69
ROM:2D69 LEND: ; CODE XREF: SYMSCR2+5Bj
ROM:2D69 ; CARRETp
ROM:2D69 call CURSOR ; Отображение курсора.
ROM:2D6C call CUREND2 ; Перемещает курсор в конец логической строки. Дополнительная подпрограмма.
ROM:2D6C ; End of function LEND
ROM:2D6C
ROM:2D6F
ROM:2D6F ; =============== S U B R O U T I N E =======================================
ROM:2D6F
ROM:2D6F ; Перемещает курсор в конец логической строки. Дополнительная подпрограмма.
ROM:2D6F
ROM:2D6F CUREND3: ; CODE XREF: CUREND3+Dj
ROM:2D6F ; INSERTTR+Fp
ROM:2D6F mvi a, 80h ; 'А'
ROM:2D71 inx h
ROM:2D72 ana m
ROM:2D73 jnz loc_2D7F
ROM:2D76 inr d
ROM:2D77 mov a, d
ROM:2D78 cmp b
ROM:2D79 jz loc_2D80
ROM:2D7C jmp CUREND3 ; Перемещает курсор в конец логической строки. Дополнительная подпрограмма.
ROM:2D7F ; ---------------------------------------------------------------------------
ROM:2D7F
ROM:2D7F loc_2D7F: ; CODE XREF: CUREND3+4j
ROM:2D7F dcx h
ROM:2D80
ROM:2D80 loc_2D80: ; CODE XREF: CUREND3+Aj
ROM:2D80 mvi a, 7Fh ; ''
ROM:2D82 ana m
ROM:2D83 mov e, a
ROM:2D84 jz loc_2D00
ROM:2D87 dcr e
ROM:2D88 jmp loc_2D00
ROM:2D88 ; End of function CUREND3
ROM:2D88
ROM:2D8B ; ---------------------------------------------------------------------------
ROM:2D8B ; START OF FUNCTION CHUNK FOR SYMSCR2
ROM:2D8B
ROM:2D8B BKSPC: ; CODE XREF: SYMSCR2+42j
ROM:2D8B call CURSOR ; Отображение курсора.
ROM:2D8E mov a, e
ROM:2D8F ana a
ROM:2D90 jz loc_2D97
ROM:2D93 dcr e
ROM:2D94 call EDIT3 ; Подпрограмма редактора
ROM:2D97
ROM:2D97 loc_2D97: ; CODE XREF: SYMSCR2+8Aj
ROM:2D97 ; SYMSCR2+289j
ROM:2D97 call CURSOR2 ; Подпрограмма отображения курсора.
ROM:2D9A call BKSPC2 ; Подпрограмма обработки BACKSPACE
ROM:2D9D lhld SMK ; Адрес курсора
ROM:2DA0 call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM).
ROM:2DA3 sta KSS ; Код символа в позиции курсора
ROM:2DA6 call CURSOR2 ; Подпрограмма отображения курсора.
ROM:2DA9 jmp loc_2D00
ROM:2DAC ; ---------------------------------------------------------------------------
ROM:2DAC
ROM:2DAC TABTR: ; CODE XREF: SYMSCR2+47j
ROM:2DAC call CURSOR ; Переход к следующей табулированной позиции
ROM:2DAF xra a
ROM:2DB0
ROM:2DB0 loc_2DB0: ; CODE XREF: SYMSCR2+2B0j
ROM:2DB0 ; SYMSCR2+2B3j
ROM:2DB0 adi 8
ROM:2DB2 cmp c
ROM:2DB3 jnc loc_2DCB
ROM:2DB6 cmp e
ROM:2DB7 jc loc_2DB0
ROM:2DBA jz loc_2DB0
ROM:2DBD
ROM:2DBD loc_2DBD: ; CODE XREF: SYMSCR2+2C6j
ROM:2DBD sub e
ROM:2DBE mov c, a
ROM:2DBF
ROM:2DBF loc_2DBF: ; CODE XREF: SYMSCR2+2C0j
ROM:2DBF mvi a, 20h ; ' '
ROM:2DC1 push b
ROM:2DC2 call SYMSCR3 ; Вывод символа из A на экран в текущую позицию курсора. Подпрограмма.
ROM:2DC5 pop b
ROM:2DC6 dcr c
ROM:2DC7 jnz loc_2DBF
ROM:2DCA ret
ROM:2DCB ; ---------------------------------------------------------------------------
ROM:2DCB
ROM:2DCB loc_2DCB: ; CODE XREF: SYMSCR2+2ACj
ROM:2DCB mov a, c
ROM:2DCC inr a
ROM:2DCD jmp loc_2DBD
ROM:2DCD ; END OF FUNCTION CHUNK FOR SYMSCR2
ROM:2DD0
ROM:2DD0 ; =============== S U B R O U T I N E =======================================
ROM:2DD0
ROM:2DD0 ; Вывод символа из A на экран в текущую позицию курсора. Подпрограмма.
ROM:2DD0
ROM:2DD0 SYMSCR3: ; CODE XREF: SYMSCR2+8Dj
ROM:2DD0 ; SYMSCR2+2BBp
ROM:2DD0 push psw
ROM:2DD1 lda INSF ; Флаг вставки
ROM:2DD4 ana a
ROM:2DD5 cnz INSERTTR ; Подпрограмма обработки вставки символа
ROM:2DD8 pop psw
ROM:2DD9 sta KSS ; Код символа в позиции курсора
ROM:2DDC lhld SMK ; Адрес курсора
ROM:2DDF mov m, a
ROM:2DE0 call CURSOR2 ; Подпрограмма отображения курсора.
ROM:2DE3 call RIGHT2 ; Обработка перемещения курсора вправо
ROM:2DE6 call CURSOR2 ; Подпрограмма отображения курсора.
ROM:2DE9 call CUREND2 ; Перемещает курсор в конец логической строки. Дополнительная подпрограмма.
ROM:2DEC ora e
ROM:2DED jz loc_2DFB
ROM:2DF0 mov a, m
ROM:2DF1 ani 7Fh
ROM:2DF3 cmp e
ROM:2DF4 rnc
ROM:2DF5 mov a, m
ROM:2DF6 ani 80h
ROM:2DF8 ora e
ROM:2DF9 mov m, a
ROM:2DFA ret
ROM:2DFB ; ---------------------------------------------------------------------------
ROM:2DFB
ROM:2DFB loc_2DFB: ; CODE XREF: SYMSCR3+1Dj
ROM:2DFB mov a, m
ROM:2DFC ani 7Fh
ROM:2DFE mov m, a
ROM:2DFF dcx h
ROM:2E00 mov a, m
ROM:2E01 ani 80h
ROM:2E03 mov b, a
ROM:2E04 lda DLSF ; Длина строки экрана
ROM:2E07 ora b
ROM:2E08 mov m, a
ROM:2E09 ret
ROM:2E09 ; End of function SYMSCR3
ROM:2E09
ROM:2E0A
ROM:2E0A ; =============== S U B R O U T I N E =======================================
ROM:2E0A
ROM:2E0A ; Подпрограмма обработки вставки символа
ROM:2E0A
ROM:2E0A INSERTTR: ; CODE XREF: SYMSCR3+5p
ROM:2E0A call CURSOR2 ; Подпрограмма отображения курсора.
ROM:2E0D push b
ROM:2E0E call CUREND2 ; Перемещает курсор в конец логической строки. Дополнительная подпрограмма.
ROM:2E11 pop b
ROM:2E12 mov a, m
ROM:2E13 ani 7Fh
ROM:2E15 cmp e
ROM:2E16 rc
ROM:2E17 rz
ROM:2E18 push d
ROM:2E19 call CUREND3 ; Перемещает курсор в конец логической строки. Дополнительная подпрограмма.
ROM:2E1C mov a, e
ROM:2E1D cmp c
ROM:2E1E jc loc_2E38
ROM:2E21 mov a, d
ROM:2E22 cmp b
ROM:2E23 jc loc_2E62
ROM:2E26 push b
ROM:2E27 push h
ROM:2E28 call KEYSON3 ; Подпрограмма включения функциональных клавиш
ROM:2E2B mvi a, 20h ; ' '
ROM:2E2D sta KSS ; Код символа в позиции курсора
ROM:2E30 pop h
ROM:2E31 pop b
ROM:2E32 xthl
ROM:2E33 dcr h
ROM:2E34 xthl
ROM:2E35
ROM:2E35 loc_2E35: ; CODE XREF: INSERTTR+5Dj
ROM:2E35 ; INSERTTR+89j
ROM:2E35 mvi e, 0
ROM:2E37 mov m, e
ROM:2E38
ROM:2E38 loc_2E38: ; CODE XREF: INSERTTR+14j
ROM:2E38 inr m
ROM:2E39 inr e
ROM:2E3A pop h
ROM:2E3B xchg
ROM:2E3C push h
ROM:2E3D call EDIT3 ; Подпрограмма редактора
ROM:2E40 call CUR2MEM ; Загружает код символа из KSS в A, и сохраняет его по адресу SMK (адрес курсора)
ROM:2E43
ROM:2E43 loc_2E43: ; CODE XREF: INSERTTR+53j
ROM:2E43 mov b, a
ROM:2E44 xthl
ROM:2E45 call COMPAREHLDE ; RST4 = Сравнивает HL и DE с таким же логическим результатом (C и Z флагов) как для стандартного восьмибитного сравнения.
ROM:2E48 xthl
ROM:2E49 jz loc_2E60
ROM:2E4C mov a, e
ROM:2E4D inr e
ROM:2E4E cmp c
ROM:2E4F jnz loc_2E58
ROM:2E52 call LINECHK ; Проверяет пропуски в начале и в конце строк
ROM:2E55 inr d
ROM:2E56 mvi e, 0
ROM:2E58
ROM:2E58 loc_2E58: ; CODE XREF: INSERTTR+45j
ROM:2E58 inx h
ROM:2E59 call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM).
ROM:2E5C mov m, b
ROM:2E5D jmp loc_2E43
ROM:2E60 ; ---------------------------------------------------------------------------
ROM:2E60
ROM:2E60 loc_2E60: ; CODE XREF: INSERTTR+3Fj
ROM:2E60 pop h
ROM:2E61 ret
ROM:2E62 ; ---------------------------------------------------------------------------
ROM:2E62
ROM:2E62 loc_2E62: ; CODE XREF: INSERTTR+19j
ROM:2E62 inr d
ROM:2E63 inx h
ROM:2E64 mov a, m
ROM:2E65 cpi 80h ; 'А'
ROM:2E67 jz loc_2E35
ROM:2E6A push b
ROM:2E6B push d
ROM:2E6C push h
ROM:2E6D push b
ROM:2E6E mvi e, 0
ROM:2E70 call KEYSOFF3 ; Подпрограмма выключения функциональных клавиш
ROM:2E73 pop b
ROM:2E74 push h
ROM:2E75 lda DLSM ; Максимальная длина строк 32 или 64
ROM:2E78 mov e, a
ROM:2E79 mov a, b
ROM:2E7A inr c
ROM:2E7B sub d
ROM:2E7C mov b, a
ROM:2E7D cnz INSERTTR2 ; Подпрограмма обработки вставки символа. Дополнительная точка входа.
ROM:2E80 pop h
ROM:2E81 xthl
ROM:2E82 push h
ROM:2E83 mvi e, 1
ROM:2E85 mov c, e
ROM:2E86 mov a, b
ROM:2E87 ora a
ROM:2E88 cnz INSERTTR2 ; Подпрограмма обработки вставки символа. Дополнительная точка входа.
ROM:2E8B pop h
ROM:2E8C xthl
ROM:2E8D call SPACES2 ; Заполнение областей на экране пробелами. Дополнительная точка входа.
ROM:2E90 pop h
ROM:2E91 pop d
ROM:2E92 pop b
ROM:2E93 jmp loc_2E35
ROM:2E93 ; End of function INSERTTR
ROM:2E93
ROM:2E96
ROM:2E96 ; =============== S U B R O U T I N E =======================================
ROM:2E96
ROM:2E96 ; Подпрограмма обработки вставки символа. Дополнительная точка входа.
ROM:2E96
ROM:2E96 INSERTTR2: ; CODE XREF: INSERTTR+73p
ROM:2E96 ; INSERTTR+7Ep ...
ROM:2E96 push b
ROM:2E97 push h
ROM:2E98 call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM).
ROM:2E9B
ROM:2E9B loc_2E9B: ; CODE XREF: INSERTTR2+Ej
ROM:2E9B mvi d, 0
ROM:2E9D dad d
ROM:2E9E mov d, a
ROM:2E9F call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM).
ROM:2EA2 mov m, d
ROM:2EA3 dcr b
ROM:2EA4 jnz loc_2E9B
ROM:2EA7 pop h
ROM:2EA8 inx h
ROM:2EA9 pop b
ROM:2EAA dcr c
ROM:2EAB jnz INSERTTR2 ; Подпрограмма обработки вставки символа. Дополнительная точка входа.
ROM:2EAE ret
ROM:2EAE ; End of function INSERTTR2
ROM:2EAE
ROM:2EAF
ROM:2EAF ; =============== S U B R O U T I N E =======================================
ROM:2EAF
ROM:2EAF ; Печать возврата каретки (печать CHR$(&h0D))
ROM:2EAF
ROM:2EAF CARRET: ; CODE XREF: EDIT2:loc_2AE5p
ROM:2EAF ; EDIT2:loc_2AF8p ...
ROM:2EAF call LEND ; Перемещает курсор в конец логической строки.
ROM:2EB2 call FHOME ; Перемещает курсор в начало физической строки
ROM:2EB5 jmp DOWN
ROM:2EB5 ; End of function CARRET
ROM:2EB5
ROM:2EB8
ROM:2EB8 ; =============== S U B R O U T I N E =======================================
ROM:2EB8
ROM:2EB8 ; Подпрограмма редактора
ROM:2EB8
ROM:2EB8 EDIT5: ; CODE XREF: EDIT2+57p
ROM:2EB8 call CURSOR ; Отображение курсора.
ROM:2EBB lxi h, SCLNTAB ; Таблица состояния строк экранного редактора
ROM:2EBE mov a, m
ROM:2EBF ori 80h
ROM:2EC1 mov m, a
ROM:2EC2 mvi c, 0
ROM:2EC4
ROM:2EC4 loc_2EC4: ; CODE XREF: EDIT5+1Aj
ROM:2EC4 mov a, m
ROM:2EC5 ani 80h
ROM:2EC7 jz loc_2ECB
ROM:2ECA mov e, c
ROM:2ECB
ROM:2ECB loc_2ECB: ; CODE XREF: EDIT5+Fj
ROM:2ECB mov a, c
ROM:2ECC cmp d
ROM:2ECD jz loc_2ED5
ROM:2ED0 inr c
ROM:2ED1 inx h
ROM:2ED2 jmp loc_2EC4
ROM:2ED5 ; ---------------------------------------------------------------------------
ROM:2ED5
ROM:2ED5 loc_2ED5: ; CODE XREF: EDIT5+15j
ROM:2ED5 mov d, e
ROM:2ED6 mvi e, 0
ROM:2ED8 call CUREND2 ; Перемещает курсор в конец логической строки. Дополнительная подпрограмма.
ROM:2EDB mov b, h
ROM:2EDC mov c, l
ROM:2EDD lxi h, IOBUF ; Буфер ввода-вывода (диск, кассеты)
ROM:2EE0
ROM:2EE0 loc_2EE0: ; CODE XREF: EDIT5+76j
ROM:2EE0 push d
ROM:2EE1 call EDIT3 ; Подпрограмма редактора
ROM:2EE4 xchg
ROM:2EE5 lhld SMK ; Адрес курсора
ROM:2EE8 ldax b
ROM:2EE9 ani 7Fh
ROM:2EEB jz loc_2F33
ROM:2EEE push b
ROM:2EEF mov c, a
ROM:2EF0 lda KSS ; Код символа в позиции курсора
ROM:2EF3 jmp loc_2EF9
ROM:2EF6 ; ---------------------------------------------------------------------------
ROM:2EF6
ROM:2EF6 loc_2EF6: ; CODE XREF: EDIT5+53j
ROM:2EF6 call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM).
ROM:2EF9
ROM:2EF9 loc_2EF9: ; CODE XREF: EDIT5+3Bj
ROM:2EF9 mov b, a
ROM:2EFA cpi 20h ; ' '
ROM:2EFC jnc loc_2F06
ROM:2EFF adi 40h ; '@'
ROM:2F01 mov b, a
ROM:2F02 mvi a, 1
ROM:2F04 stax d
ROM:2F05 inx d
ROM:2F06
ROM:2F06 loc_2F06: ; CODE XREF: EDIT5+44j
ROM:2F06 mov a, b
ROM:2F07 stax d
ROM:2F08 inx d
ROM:2F09 inx h
ROM:2F0A dcr c
ROM:2F0B jnz loc_2EF6
ROM:2F0E lxi b, IOBUF+116h ; Буфер ввода-вывода (диск, кассеты)
ROM:2F11 mov a, d
ROM:2F12 cmp b
ROM:2F13 jc loc_2F1F
ROM:2F16 mov a, e
ROM:2F17 cmp c
ROM:2F18 jc loc_2F1F
ROM:2F1B pop b
ROM:2F1C jmp loc_2F33
ROM:2F1F ; ---------------------------------------------------------------------------
ROM:2F1F
ROM:2F1F loc_2F1F: ; CODE XREF: EDIT5+5Bj
ROM:2F1F ; EDIT5+60j
ROM:2F1F pop b
ROM:2F20 inx b
ROM:2F21 ldax b
ROM:2F22 ani 80h
ROM:2F24 jnz loc_2F33
ROM:2F27 xchg
ROM:2F28 pop d
ROM:2F29 inr d
ROM:2F2A lda MSK ; Количество строк экрана
ROM:2F2D cmp d
ROM:2F2E jnz loc_2EE0
ROM:2F31 xchg
ROM:2F32 push d
ROM:2F33
ROM:2F33 loc_2F33: ; CODE XREF: EDIT5+33j
ROM:2F33 ; EDIT5+64j ...
ROM:2F33 mov b, d
ROM:2F34 mov c, e
ROM:2F35 call ODOAOO ; Записывает по адресу в BC три байта - &h0D, &h0A, &h00
ROM:2F38 pop d
ROM:2F39 lxi h, SCLNTAB ; Таблица состояния строк экранного редактора
ROM:2F3C lda MSK ; Количество строк экрана
ROM:2F3F mov b, a
ROM:2F40
ROM:2F40 loc_2F40: ; CODE XREF: EDIT5+91j
ROM:2F40 mov a, m
ROM:2F41 ana a
ROM:2F42 jnz loc_2F47
ROM:2F45 mvi m, 80h ; 'А'
ROM:2F47
ROM:2F47 loc_2F47: ; CODE XREF: EDIT5+8Aj
ROM:2F47 inx h
ROM:2F48 dcr b
ROM:2F49 jnz loc_2F40
ROM:2F4C ret
ROM:2F4C ; End of function EDIT5
ROM:2F4C
ROM:2F4D
ROM:2F4D ; =============== S U B R O U T I N E =======================================
ROM:2F4D
ROM:2F4D
ROM:2F4D MACRO9: ; CODE XREF: MACRO8+3p
ROM:2F4D ; CLRSCR+28p ...
ROM:2F4D ana a
ROM:2F4E rz
ROM:2F4F mov m, b
ROM:2F50 inx h
ROM:2F51 dcr a
ROM:2F52 jnz MACRO9
ROM:2F55 ret
ROM:2F55 ; End of function MACRO9
ROM:2F55
ROM:2F56
ROM:2F56 ; =============== S U B R O U T I N E =======================================
ROM:2F56
ROM:2F56 ; Отображение курсора.
ROM:2F56
ROM:2F56 CURSOR: ; CODE XREF: CLRSCR+3p
ROM:2F56 ; SYMSCR2:loc_2CE0p ...
ROM:2F56 xra a
ROM:2F57 sta INSF ; Флаг вставки
ROM:2F5A mvi b, 0FFh
ROM:2F5C mvi a, 8
ROM:2F5E lxi h, CURISO ; Изображение курсора
ROM:2F61 call MACRO9
ROM:2F64 mvi m, 1
ROM:2F64 ; End of function CURSOR
ROM:2F64
ROM:2F66
ROM:2F66 ; =============== S U B R O U T I N E =======================================
ROM:2F66
ROM:2F66 ; Подпрограмма отображения курсора.
ROM:2F66
ROM:2F66 CURSOR2: ; CODE XREF: KEYSON2p
ROM:2F66 ; SYMSCR2+1D3p ...
ROM:2F66 lhld PK ; Позиция курсора
ROM:2F69 xchg
ROM:2F6A lda MSK ; Количество строк экрана
ROM:2F6D dcr a
ROM:2F6E mov b, a
ROM:2F6F lda DLSF ; Длина строки экрана
ROM:2F72 dcr a
ROM:2F73 mov c, a
ROM:2F74 ret
ROM:2F74 ; End of function CURSOR2
ROM:2F74
ROM:2F75
ROM:2F75 ; =============== S U B R O U T I N E =======================================
ROM:2F75
ROM:2F75 ; Загружает код символа из KSS в A, и сохраняет его по адресу SMK (адрес курсора)
ROM:2F75
ROM:2F75 CUR2MEM: ; CODE XREF: INSERTTR+36p
ROM:2F75 ; EDIT3+3p ...
ROM:2F75 lda KSS ; Код символа в позиции курсора
ROM:2F78 lhld SMK ; Адрес курсора
ROM:2F7B mov m, a
ROM:2F7C ret
ROM:2F7C ; End of function CUR2MEM
ROM:2F7C
ROM:2F7D
ROM:2F7D ; =============== S U B R O U T I N E =======================================
ROM:2F7D
ROM:2F7D ; Подпрограмма выключения функциональных клавиш
ROM:2F7D
ROM:2F7D KEYSOFF3: ; CODE XREF: KEYSOFF2+8p
ROM:2F7D ; INSERTTR+66p ...
ROM:2F7D lhld ABS1 ; Адрес буфера экрана режима 0 и 1
ROM:2F80 lda DLSM ; Максимальная длина строк 32 или 64
ROM:2F83 mvi b, 0
ROM:2F85 mov c, a
ROM:2F86 mov a, d
ROM:2F87
ROM:2F87 loc_2F87: ; CODE XREF: KEYSOFF3+10j
ROM:2F87 ana a
ROM:2F88 jz loc_2F90
ROM:2F8B dad b
ROM:2F8C dcr a
ROM:2F8D jmp loc_2F87
ROM:2F90 ; ---------------------------------------------------------------------------
ROM:2F90
ROM:2F90 loc_2F90: ; CODE XREF: KEYSOFF3+Bj
ROM:2F90 mov a, e
ROM:2F91 mov c, a
ROM:2F92 lda SPN ; Пропусков в начале строки
ROM:2F95 add c
ROM:2F96 mov c, a
ROM:2F97 mvi b, 0
ROM:2F99 dad b
ROM:2F9A ret
ROM:2F9A ; End of function KEYSOFF3
ROM:2F9A
ROM:2F9B
ROM:2F9B ; =============== S U B R O U T I N E =======================================
ROM:2F9B
ROM:2F9B ; Подпрограмма редактора
ROM:2F9B
ROM:2F9B EDIT3: ; CODE XREF: EDIT2:loc_2AB1p
ROM:2F9B ; EDIT2+5Bp ...
ROM:2F9B push b
ROM:2F9C push d
ROM:2F9D push h
ROM:2F9E call CUR2MEM ; Загружает код символа из KSS в A, и сохраняет его по адресу SMK (адрес курсора)
ROM:2FA1 xchg
ROM:2FA2 shld PK ; Позиция курсора
ROM:2FA5 xchg
ROM:2FA6 call KEYSOFF3 ; Подпрограмма выключения функциональных клавиш
ROM:2FA9 shld SMK ; Адрес курсора
ROM:2FAC call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM).
ROM:2FAF sta KSS ; Код символа в позиции курсора
ROM:2FB2 mov d, a
ROM:2FB3 lda SCRTMP2 ; Экранные временные переменные.
ROM:2FB6 ana a
ROM:2FB7 mov a, d
ROM:2FB8 jnz loc_2FEF
ROM:2FBB mvi m, 0BFh ; '¬'
ROM:2FBD lhld AGS1 ; Адрес знакогенератора режима 0 и 1
ROM:2FBD ; Адрес буфера экрана режима 2
ROM:2FC0 mov d, h
ROM:2FC1 mov e, l
ROM:2FC2 lxi b, 5F8h
ROM:2FC5 dad b
ROM:2FC6 xchg
ROM:2FC7 rlc
ROM:2FC8 rlc
ROM:2FC9 rlc
ROM:2FCA mov b, a
ROM:2FCB ani 0F8h
ROM:2FCD mov c, a
ROM:2FCE mov a, b
ROM:2FCF ani 7
ROM:2FD1 mov b, a
ROM:2FD2 dad b
ROM:2FD3 push d
ROM:2FD4 lxi d, INTAR+18h ; Рабочая область обработки прерываний
ROM:2FD7 push d
ROM:2FD8 lxi b, 8
ROM:2FDB call VRAMSEND ; BC=счетчик, DE=адрес приема, HL=адрес источника
ROM:2FDB ; (пересылка VRAM->RAM, VRAM->VRAM)
ROM:2FDE pop h
ROM:2FDF pop d
ROM:2FE0 lxi b, CURISO ; Изображение курсора
ROM:2FE3 ldax b
ROM:2FE4
ROM:2FE4 loc_2FE4: ; CODE XREF: EDIT3+51j
ROM:2FE4 xra m
ROM:2FE5 stax d
ROM:2FE6 inx b
ROM:2FE7 inx d
ROM:2FE8 inx h
ROM:2FE9 ldax b
ROM:2FEA cpi 1
ROM:2FEC jnz loc_2FE4
ROM:2FEF
ROM:2FEF loc_2FEF: ; CODE XREF: EDIT3+1Dj
ROM:2FEF pop h
ROM:2FF0 pop d
ROM:2FF1 pop b
ROM:2FF2 ret
ROM:2FF2 ; End of function EDIT3
ROM:2FF2
ROM:2FF3
ROM:2FF3 ; =============== S U B R O U T I N E =======================================
ROM:2FF3
ROM:2FF3 ; Выключает изображение курсора
ROM:2FF3
ROM:2FF3 CURSOFF2: ; CODE XREF: CURSOFFj
ROM:2FF3 ; TESTBREAKKEYTR+15p ...
ROM:2FF3 push h
ROM:2FF4 call CUR2MEM ; Загружает код символа из KSS в A, и сохраняет его по адресу SMK (адрес курсора)
ROM:2FF7 mvi a, 0FFh
ROM:2FF9 sta SCRTMP2 ; Экранные временные переменные.
ROM:2FFC pop h
ROM:2FFD ret
ROM:2FFD ; End of function CURSOFF2
ROM:2FFD
ROM:2FFE
ROM:2FFE ; =============== S U B R O U T I N E =======================================
ROM:2FFE
ROM:2FFE ; Включает изображение курсора
ROM:2FFE
ROM:2FFE CURSON2: ; CODE XREF: CURSONj
ROM:2FFE ; TESTBREAKKEYTR+Bp ...
ROM:2FFE push h
ROM:2FFF lhld PK ; Позиция курсора
ROM:3002 xchg
ROM:3003 xra a
ROM:3004 sta SCRTMP2 ; Экранные временные переменные.
ROM:3007 call CHKMODE ; Проверяет режим экрана на 2. Если да, то A=B
ROM:300A cnz EDIT3 ; Подпрограмма редактора
ROM:300D xchg
ROM:300E pop h
ROM:300F ret
ROM:300F ; End of function CURSON2
ROM:300F
ROM:3010
ROM:3010 ; =============== S U B R O U T I N E =======================================
ROM:3010
ROM:3010 ; Перемещает курсор в конец логической строки. Дополнительная подпрограмма.
ROM:3010
ROM:3010 CUREND2: ; CODE XREF: SYMSCR2+24Bp
ROM:3010 ; LEND+3p ...
ROM:3010 mov c, d
ROM:3011 xra a
ROM:3012 mov b, a
ROM:3013 lxi h, SCLNTAB ; Таблица состояния строк экранного редактора
ROM:3016 dad b
ROM:3017 ret
ROM:3017 ; End of function CUREND2
ROM:3017
ROM:3018
ROM:3018 ; =============== S U B R O U T I N E =======================================
ROM:3018
ROM:3018
ROM:3018 MACRO11: ; CODE XREF: KEYSON3+15p
ROM:3018 push d
ROM:3019 xchg
ROM:301A lxi h, 0
ROM:301D ana a
ROM:301E jz loc_3026
ROM:3021
ROM:3021 loc_3021: ; CODE XREF: MACRO11+Bj
ROM:3021 dad d
ROM:3022 dcr a
ROM:3023 jnz loc_3021
ROM:3026
ROM:3026 loc_3026: ; CODE XREF: MACRO11+6j
ROM:3026 pop d
ROM:3027 ret
ROM:3027 ; End of function MACRO11
ROM:3027
ROM:3028
ROM:3028 ; =============== S U B R O U T I N E =======================================
ROM:3028
ROM:3028 ; Подпрограмма включения функциональных клавиш
ROM:3028
ROM:3028 KEYSON3: ; CODE XREF: KEYSON2+Bp
ROM:3028 ; RIGHT2:loc_2CF8p ...
ROM:3028 push d
ROM:3029 call CUR2MEM ; Загружает код символа из KSS в A, и сохраняет его по адресу SMK (адрес курсора)
ROM:302C mov c, d
ROM:302D lhld ABS1 ; Адрес буфера экрана режима 0 и 1
ROM:3030 mov d, h
ROM:3031 mov e, l
ROM:3032 lda DLSM ; Максимальная длина строк 32 или 64
ROM:3035 mov b, a
ROM:3036 add l
ROM:3037 mov l, a
ROM:3038 push h
ROM:3039 mov l, b
ROM:303A mvi h, 0
ROM:303C mov a, c
ROM:303D call MACRO11
ROM:3040 mov b, h
ROM:3041 mov c, l
ROM:3042 pop h
ROM:3043 call VRAMSEND ; BC=счетчик, DE=адрес приема, HL=адрес источника
ROM:3043 ; (пересылка VRAM->RAM, VRAM->VRAM)
ROM:3046 xchg
ROM:3047 call SPACES ; Заполнение областей на экране пробелами
ROM:304A pop d
ROM:304B push d
ROM:304C mov c, d
ROM:304D lxi d, SCLNTAB ; Таблица состояния строк экранного редактора
ROM:3050 mov h, d
ROM:3051 mov l, e
ROM:3052 inx h
ROM:3053 call VRAMSEND ; BC=счетчик, DE=адрес приема, HL=адрес источника
ROM:3053 ; (пересылка VRAM->RAM, VRAM->VRAM)
ROM:3056 mvi a, 80h ; 'А'
ROM:3058 stax d
ROM:3059 pop d
ROM:305A ret
ROM:305A ; End of function KEYSON3
ROM:305A
ROM:305B
ROM:305B ; =============== S U B R O U T I N E =======================================
ROM:305B
ROM:305B ; Подпрограмма обработки BACKSPACE
ROM:305B
ROM:305B BKSPC2: ; CODE XREF: SYMSCR2+293p
ROM:305B
ROM:305B ; FUNCTION CHUNK AT ROM:30A4 SIZE 0000002B BYTES
ROM:305B
ROM:305B call CUREND2 ; Перемещает курсор в конец логической строки. Дополнительная подпрограмма.
ROM:305E push h
ROM:305F call CURSOR2 ; Подпрограмма отображения курсора.
ROM:3062 mov d, c
ROM:3063 lhld SMK ; Адрес курсора
ROM:3066 mvi m, 20h ; ' '
ROM:3068
ROM:3068 loc_3068: ; CODE XREF: BKSPC2+26j
ROM:3068 mov b, h
ROM:3069 mov c, l
ROM:306A mov a, d
ROM:306B cmp e
ROM:306C jz loc_3084
ROM:306F inr e
ROM:3070 inx h
ROM:3071 xthl
ROM:3072 mov a, m
ROM:3073 xthl
ROM:3074 ani 7Fh
ROM:3076 cmp e
ROM:3077 jz loc_30B9
ROM:307A jc loc_30CD
ROM:307D
ROM:307D loc_307D: ; CODE XREF: BKSPC2+37j
ROM:307D call VRAMBTRD ; HL=адрес (A=байт: чтение байта из видео-ОЗУ VRAM).
ROM:3080 stax b
ROM:3081 jmp loc_3068
ROM:3084 ; ---------------------------------------------------------------------------
ROM:3084
ROM:3084 loc_3084: ; CODE XREF: BKSPC2+11j
ROM:3084 xthl
ROM:3085 inx h
ROM:3086 mov a, m
ROM:3087 ani 80h
ROM:3089 jnz loc_30A4
ROM:308C mov e, a
ROM:308D xthl
ROM:308E call LINECHK ; Проверяет пропуски в начале и в конце строк
ROM:3091 inx h
ROM:3092 jmp loc_307D
ROM:3092 ; End of function BKSPC2
ROM:3092
ROM:3095
ROM:3095 ; =============== S U B R O U T I N E =======================================
ROM:3095
ROM:3095 ; Проверяет пропуски в начале и в конце строк
ROM:3095
ROM:3095 LINECHK: ; CODE XREF: INSERTTR+48p
ROM:3095 ; BKSPC2+33p
ROM:3095 lda SPN ; Пропусков в начале строки
ROM:3098 push b
ROM:3099 mov c, a
ROM:309A mvi b, 0
ROM:309C lda SPK ; Пропусков в конце строки
ROM:309F add c
ROM:30A0 mov c, a
ROM:30A1 dad b
ROM:30A2 pop b
ROM:30A3 ret
ROM:30A3 ; End of function LINECHK
ROM:30A3
ROM:30A4 ; ---------------------------------------------------------------------------
ROM:30A4 ; START OF FUNCTION CHUNK FOR BKSPC2
ROM:30A4
ROM:30A4 loc_30A4: ; CODE XREF: BKSPC2+2Ej
ROM:30A4 dcx h
ROM:30A5 mov a, m
ROM:30A6 ani 7Fh
ROM:30A8 xthl
ROM:30A9 mov h, a
ROM:30AA mov a, e
ROM:30AB cmp h
ROM:30AC mov a, h
ROM:30AD jc loc_30B9
ROM:30B0 mvi b, 80h ; 'А'
ROM:30B2 ana a
ROM:30B3 jz loc_30C7
ROM:30B6 jmp loc_30CD
ROM:30B9 ; ---------------------------------------------------------------------------
ROM:30B9
ROM:30B9 loc_30B9: ; CODE XREF: BKSPC2+1Cj
ROM:30B9 ; BKSPC2+52j
ROM:30B9 mov h, a
ROM:30BA mvi a, 20h ; ' '
ROM:30BC stax b
ROM:30BD mov a, h
ROM:30BE mvi b, 80h ; 'А'
ROM:30C0 cpi 2
ROM:30C2 jc loc_30C7
ROM:30C5 dcr a
ROM:30C6 mov b, a
ROM:30C7
ROM:30C7 loc_30C7: ; CODE XREF: BKSPC2+58j
ROM:30C7 ; BKSPC2+67j
ROM:30C7 xthl
ROM:30C8 mov a, m
ROM:30C9 ani 80h
ROM:30CB ora b
ROM:30CC mov m, a
ROM:30CD
ROM:30CD loc_30CD: ; CODE XREF: BKSPC2+1Fj
ROM:30CD ; BKSPC2+5Bj
ROM:30CD pop h
ROM:30CE ret
ROM:30CE ; END OF FUNCTION CHUNK FOR BKSPC2
ROM:30CF
ROM:30CF ; =============== S U B R O U T I N E =======================================
ROM:30CF
ROM:30CF ; Работа с портами &h86 и &h82
ROM:30CF
ROM:30CF PORT8682: ; CODE XREF: INTRPT2+B9p
ROM:30CF push psw
ROM:30D0 mov b, a
ROM:30D1 in 86h
ROM:30D3 call MACRO12
ROM:30D6 out 86h
ROM:30D8 mov a, b
ROM:30D9 rlc
ROM:30DA mov b, a
ROM:30DB in 82h
ROM:30DD call MACRO12
ROM:30E0 out 82h
ROM:30E2 pop psw
ROM:30E3 ret
ROM:30E3 ; End of function PORT8682
ROM:30E3
ROM:30E4
ROM:30E4 ; =============== S U B R O U T I N E =======================================
ROM:30E4
ROM:30E4
ROM:30E4 MACRO12: ; CODE XREF: PORT8682+4p
ROM:30E4 ; PORT8682+Ep
ROM:30E4 ani 0DFh
ROM:30E6 mov c, a
ROM:30E7 mov a, b
ROM:30E8 rlc
ROM:30E9 rlc
ROM:30EA mov b, a
ROM:30EB ani 20h
ROM:30ED ora c
ROM:30EE ret
ROM:30EE ; End of function MACRO12
ROM:30EE
ROM:30EF
ROM:30EF ; =============== S U B R O U T I N E =======================================
ROM:30EF
ROM:30EF ; Обработка звука нажатия клавиш и CHR$(&h07) (в зависимости от BEEPF)
ROM:30EF
ROM:30EF BELL2: ; CODE XREF: BELLj
ROM:30EF ; INTRPT2+121p ...
ROM:30EF push psw
ROM:30F0 push b
ROM:30F1 cpi 7
ROM:30F3 jz loc_30FD
ROM:30F6 lda BEEPF ; BEEP флаг
ROM:30F9 ana a
ROM:30FA jz loc_310F
ROM:30FD
ROM:30FD loc_30FD: ; CODE XREF: BELL2+4j
ROM:30FD in 82h
ROM:30FF mvi b, 3Fh ; '?'
ROM:3101
ROM:3101 loc_3101: ; CODE XREF: BELL2+1Dj
ROM:3101 mvi c, 16h
ROM:3103
ROM:3103 loc_3103: ; CODE XREF: BELL2+15j
ROM:3103 dcr c
ROM:3104 jnz loc_3103
ROM:3107 xri 80h
ROM:3109 out 82h
ROM:310B dcr b
ROM:310C jnz loc_3101
ROM:310F
ROM:310F loc_310F: ; CODE XREF: BELL2+Bj
ROM:310F pop b
ROM:3110 xra a
ROM:3111 sta INTTMP3 ; Переменная обработчика прерываний
ROM:3114 pop psw
ROM:3115 ret
ROM:3115 ; End of function BELL2
ROM:3115
ROM:3115 ; ---------------------------------------------------------------------------
ROM:3116 TAB8: .db 68h, 38h, 2Ch, 20h, 6Ch, 6Fh, 67h, 69h, 6Eh, 67h
ROM:3120 ; ---------------------------------------------------------------------------
ROM:3120
ROM:3120 SPACES3: ; CODE XREF: SPACES2+8p
ROM:3120 lda MODE ; Заполнение областей на экране пробелами. Дополнительная точка входа.
ROM:3123 cpi 0
ROM:3125 lda SPK ; Пропусков в конце строки
ROM:3128 rnz
ROM:3129 sui 5
ROM:312B call MACRO9
ROM:312E mvi a, 5
ROM:3130 mov m, a
ROM:3131 inr a
ROM:3132 inx h
ROM:3133 mov m, a
ROM:3134 mvi a, 0Dh
ROM:3136 inx h
ROM:3137 mov m, a
ROM:3138 inr a
ROM:3139 inx h
ROM:313A mov m, a
ROM:313B inx h
ROM:313C mvi a, 1
ROM:313E ret
ROM:313F ; ---------------------------------------------------------------------------
ROM:313F nop
ROM:3140 lhld BASOPNUM ; Номер оператора Бейсик программы.
ROM:3140 ; Или &hFFFF в командном режиме
ROM:3143 inx h
ROM:3144 mov a, l
ROM:3145 ora h
ROM:3146 jz loc_2682
ROM:3149 lda STOPFLG ; STOP-флаг
ROM:314C jmp loc_2675
ROM:314C ; ---------------------------------------------------------------------------
ROM:314F .db 0FFh
ROM:3150 ; ---------------------------------------------------------------------------
ROM:3150
ROM:3150 loc_3150: ; CODE XREF: ROM:1D6Aj
ROM:3150 mov e, a
ROM:3151 jmp MAINLOOP1 ; Первая точка входа в главный цикл
ROM:3154
ROM:3154 ; =============== S U B R O U T I N E =======================================
ROM:3154
ROM:3154 ; Запрещает прерывания и вызывает RAMSEND
ROM:3154
ROM:3154 DIRAMSEND: ; CODE XREF: SETMODE2+43p
ROM:3154 di
ROM:3155 call RAMSEND ; BC=счетчик, DE=адрес приема, HL=адрес источника
ROM:3155 ; (пересылка RAM->RAM, RAM->VRAM)
ROM:3158 ret
ROM:3158 ; End of function DIRAMSEND
ROM:3158
ROM:3158 ; ---------------------------------------------------------------------------
ROM:3159 TAB9: .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh ; Сюда ссылается TOKENIZE
ROM:3159 .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:3159 .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:3170 __CLS: .text "CLL" ; DATA XREF: PRNTR1-12C5o
ROM:3173 __FOR: .text "FOT"
ROM:3176 __NEXT: .text "NEXL"
ROM:317A __DATA: .text "DAT+"
ROM:317E __INPUT: .text "INPUL"
ROM:3183 __DIM: .text "DI="
ROM:3186 __READ: .text "REA-"
ROM:318A __LOCATE: .text "LOCAT+"
ROM:3190 __GOTO: .text "GOT¦"
ROM:3194 __RUN: .text "RU+"
ROM:3197 __IF: .text "I¦"
ROM:3199 __RESTORE: .text "RESTOR+"
ROM:31A0 __GOSUB: .text "GOSUT"
ROM:31A5 __RETURN: .text "RETUR+"
ROM:31AB __REM: .text "RE="
ROM:31AE __STOP: .text "STO¦"
ROM:31B2 __OUT: .text "OUL"
ROM:31B5 __ON: .text "O+"
ROM:31B7 __PSET: .text "PSEL"
ROM:31BB __LINE: .text "LIN+"
ROM:31BF __POKE: .text "POK+"
ROM:31C3 __PRINT: .text "PRINL"
ROM:31C8 __DEF: .text "DE¦"
ROM:31CB __ERROR: .text "ERROT"
ROM:31D0 __LIST: .text "LISL"
ROM:31D4 __CLEAR: .text "CLEAT"
ROM:31D9 __CLOAD: .text "CLOA-"
ROM:31DE __CSAVE: .text "CSAV+"
ROM:31E3 __NEW: .text "NE+"
ROM:31E6 __TAB_: .text "TABи" ; (токен 157 (&h9D))
ROM:31EA __TO: .text "T¦" ; (токен 158 (&h9E))
ROM:31EC __SPC_: .text "SPCи" ; (токен 159 (&h9F))
ROM:31F0 __FN: .text "F+" ; (токен 160 (&hA0))
ROM:31F2 __THEN: .text "THE+" ; (токен 161 (&hA1))
ROM:31F6 __NOT: .text "NOL" ; (токен 162 (&hA2))
ROM:31F9 __STEP: .text "STE¦" ; (токен 163 (&hA3))
ROM:31FD __PLUS: .text "л" ; (токен 164 (&hA4))
ROM:31FE __MINUS: .text "н" ; (токен 165 (&hA5))
ROM:31FF __MUL: .text "к" ; (токен 166 (&hA6))
ROM:3200 __DIV: .text "п" ; (токен 167 (&hA7))
ROM:3201 __POW: .text "¦" ; (токен 168 (&hA8))
ROM:3202 __AND: .text "AN-" ; (токен 169 (&hA9))
ROM:3205 __OR: .text "OT" ; (токен 170 (&hAA))
ROM:3207 __GT: .text "-" ; (токен 171 (&hAB))
ROM:3208 __EQ: .text "-" ; (токен 172 (&hAC))
ROM:3209 __LS: .text "-" ; (токен 173 (&hAD))
ROM:320A __SGN: .text "SG+"
ROM:320D __INT: .text "INL"
ROM:3210 __ABS: .text "ABL"
ROM:3213 __USR: .text "UST"
ROM:3216 __FRE: .text "FR+"
ROM:3219 __INP: .text "IN¦"
ROM:321C __POS: .text "POL"
ROM:321F __SQR: .text "SQT"
ROM:3222 __RND: .text "RN-"
ROM:3225 __LOG: .text "LO¦"
ROM:3228 __EXP: .text "EX¦"
ROM:322B __COS: .text "COL"
ROM:322E __SIN: .text "SI+"
ROM:3231 __TAN: .text "TA+"
ROM:3234 __ATN: .text "AT+"
ROM:3237 __PEEK: .text "PEET"
ROM:323B __LEN: .text "LE+"
ROM:323E __STR$: .text "STRд"
ROM:3242 __VAL: .text "VA¦"
ROM:3245 __ASC: .text "AS+"
ROM:3248 __CHR$: .text "CHRд"
ROM:324C __HEX$: .text "HEXд"
ROM:3250 __SPACE$: .text "SPACEд"
ROM:3256 __VPEEK: .text "VPEET"
ROM:325B __BIN$: .text "BINд"
ROM:325F __STICK: .text "STICT"
ROM:3264 __INPUT$: .text "INPUTд"
ROM:326A __STRIG: .text "STRI¦"
ROM:326F __BASE$: .text "BASEи"
ROM:3274 __LEFT$: .text "LEFTд"
ROM:3279 __RIGHT$: .text "RIGHTд"
ROM:327F __MID$: .text "MIDд"
ROM:3283 __ERR: .text "ERT"
ROM:3286 __ERL: .text "ER¦"
ROM:3289 __CSRLIN: .text "CSRLI+"
ROM:328F __H: .text "&L"
ROM:3291 __B: .text "&T"
ROM:3293 __INKEY$: .text "INKEYд"
ROM:3299 __POINT: .text "POINL"
ROM:329E __STRING$: .text "STRING$и"
ROM:32A6 __SCREEN: .text "SCREE+"
ROM:32AC __WIDTH: .text "WIDTL"
ROM:32B1 __GET: .text "GEL"
ROM:32B4 __PUT: .text "PUL"
ROM:32B7 __DRAW: .text "DRA+"
ROM:32BB __LPRINT: .text "LPRINL"
ROM:32C1 __LLIST: .text "LLISL"
ROM:32C6 __KEY: .text "KE-"
ROM:32C9 __PLAY: .text "PLA-"
ROM:32CD __OFF: .text "OF¦"
ROM:32D0 __PAINT: .text "PAINL"
ROM:32D5 __BLOAD: .text "BLOA-"
ROM:32DA __BSAVE: .text "BSAV+"
ROM:32DF __LOAD: .text "LOA-"
ROM:32E3 __SAVE: .text "SAV+"
ROM:32E7 __SOUND: .text "SOUN-"
ROM:32EC __AUTO: .text "AUT¦"
ROM:32F0 __TR: .text "TT"
ROM:32F2 __BEEP: .text "BEE¦"
ROM:32F6 __MOTOR: .text "MOTOT"
ROM:32FB __PRESET: .text "PRESEL"
ROM:3301 __RESUME: .text "RESUM+"
ROM:3307 __END: .text "EN-"
ROM:330A __VPOKE: .text "VPOK+"
ROM:330F __LET: .text "LEL"
ROM:3312 __BASE: .text "BAS+"
ROM:3316 __COLOR: .text "COLOT"
ROM:331B __CONT: .text "CONL"
ROM:331F .db 0A7h
ROM:3320 TAB10: .db 0, 0C9h, 3Ah, 0EFh, 14h, 0FEh, 35h, 0CAh, 51h, 19h
ROM:3320 .db 0CDh, 68h, 38h, 3, 62h, 61h, 64h, 20h, 73h, 65h, 63h
ROM:3335 _CLS: .dw 17C6h ; DATA XREF: CHECKENOUGHMEM+307o
ROM:3335 ; Бейсик оператор CLS (токен 128 (&h80))
ROM:3337 _FOR: .dw 535h ; Бейсик оператор FOR (токен 129 (&h81))
ROM:3339 _NEXT: .dw 91Dh ; Бейсик оператор NEXT (токен 130 (&h82))
ROM:333B _DATA: .dw 6F9h ; Бейсик оператор DATA (токен 131 (&h83))
ROM:333D _INPUT: .dw 852h ; Бейсик оператор INPUT (токен 132 (&h84))
ROM:333F _DIM: .dw 0B15h ; Бейсик оператор DIM (токен 133 (&h85))
ROM:3341 _READ: .dw 879h ; Бейсик оператор READ (токен 134 (&h86))
ROM:3343 _LOCATE: .dw 17B2h ; Бейсик оператор LOCATE (токен 135 (&h87))
ROM:3345 _GOTO: .dw 6C7h ; Бейсик оператор GOTO (токен 136 (&h88))
ROM:3347 _RUN: .dw 6ABh ; Бейсик оператор RUN (токен 137 (&h89))
ROM:3349 _IF: .dw 778h ; Бейсик оператор IF (токен 138 (&h8A))
ROM:334B _RESTORE: .dw 1A45h ; Бейсик оператор RESTORE (токен 139 (&h8B))
ROM:334D _GOSUB: .dw 6B7h ; Бейсик оператор GOSUB (токен 140 (&h8C))
ROM:334F _RETURN: .dw 6E3h ; Бейсик оператор RETURN (токен 141 (&h8D))
ROM:3351 _REM: .dw 6FBh ; Бейсик оператор REM
ROM:3351 ; Внимание! Точка входа не может быть отмечена в дизассемблерном листинге,
ROM:3351 ; т. к. указывает в середину инструкции опреатора DATA!
ROM:3351 ; (токен 142 (&h8E))
ROM:3353 _STOP: .dw 5F0h ; Бейсик оператор STOP (токен 143 (&h8F))
ROM:3355 _OUT: .dw 0F80h ; Бейсик оператор OUT (токен 144 (&h90))
ROM:3357 _ON: .dw 1D54h ; Бейсик оператор ON (токен 145 (&h91))
ROM:3359 _PSET: .dw 1822h ; Бейсик оператор PSET (токен 146 (&h92))
ROM:335B _LINE: .dw 18FDh ; Бейсик оператор LINE (токен 147 (&h93))
ROM:335D _POKE: .dw 172Ch ; Бейсик оператор POKE (токен 148 (&h94))
ROM:335F _PRINT: .dw 791h ; Бейсик оператор PRINT (токен 149 (&h95))
ROM:3361 _DEF: .dw 0CB0h ; Бейсик оператор DEF (токен 150 (&h96))
ROM:3363 _ERROR: .dw 1D65h ; Бейсик оператор ERROR (токен 151 (&h97))
ROM:3365 _LIST: .dw 4EEh ; Бейсик оператор LIST (токен 152 (&h98))
ROM:3367 _CLEAR: .dw 682h ; Бейсик оператор CLEAR (токен 153 (&h99))
ROM:3369 _CLOAD: .dw 18C4h ; Бейсик оператор CLOAD (токен 154 (&h9A))
ROM:336B _CSAVE: .dw 18A5h ; Бейсик оператор CSAVE (токен 155 (&h9B))
ROM:336D _NEW: .dw 39Dh ; Бейсик оператор NEW (токен 156 (&h9C))
ROM:336F _SGN: .dw 12D4h ; DATA XREF: EVALTERM:loc_A6Do
ROM:336F ; Бейсик функция SGN (токен 174 (&hAE))
ROM:3371 _INT: .dw 1392h ; Бейсик функция INT (токен 175 (&hAF))
ROM:3373 _ABS: .dw 12E8h ; Бейсик функция ABS (токен 176 (&hB0))
ROM:3375 _USR: .dw 1736h ; Бейсик функция USR (токен 177 (&hB1))
ROM:3377 _FRE: .dw 0C7Ah ; Бейсик функция FRE (токен 178 (&hB2))
ROM:3379 _INP: .dw 0F75h ; Бейсик функция INP (токен 179 (&hB3))
ROM:337B _POS: .dw 0CA8h ; Бейсик функция POS (токен 180 (&hB4))
ROM:337D _SQR: .dw 1554h ; Бейсик функция SQR (токен 181 (&hB5))
ROM:337F _RND: .dw 162Ah ; Бейсик функция RND (токен 182 (&hB6))
ROM:3381 _LOG: .dw 117Eh ; Бейсик функция LOG (токен 183 (&hB7))
ROM:3383 _EXP: .dw 1599h ; Бейсик функция EXP (токен 184 (&hB8))
ROM:3385 _COS: .dw 1660h ; Бейсик функция COS (токен 185 (&hB9))
ROM:3387 _SIN: .dw 1666h ; Бейсик функция SIN (токен 186 (&hBA))
ROM:3389 _TAN: .dw 16C3h ; Бейсик функция TAN (токен 187 (&hBB))
ROM:338B _ATN: .dw 16D8h ; Бейсик функция ATN (токен 188 (&hBC))
ROM:338D _PEEK: .dw 1724h ; Бейсик функция PEEK (токен 189 (&hBD))
ROM:338F _LEN: .dw 0EE7h ; Бейсик функция LEN (токен 190 (&hBE))
ROM:3391 _STR: .dw 0D1Fh ; Бейсик функция STR (токен 191 (&hBF))
ROM:3393 _VAL: .dw 0FC8h ; Бейсик функция VAL (токен 192 (&hC0))
ROM:3395 _ASC: .dw 0EF6h ; Бейсик функция ASC (токен 193 (&hC1))
ROM:3397 _CHR: .dw 0F04h ; Бейсик функция CHR (токен 194 (&hC2))
ROM:3399 _HEX: .dw 1FBBh ; Бейсик функция HEX (токен 195 (&hC3))
ROM:339B _SPACE: .dw 1C5Ah ; Бейсик функция SPACE (токен 196 (&hC4))
ROM:339D _VPEEK: .dw 1A81h ; Бейсик функция VPEEK (токен 197 (&hC5))
ROM:339F _2D0_1: .dw 2D0h ; (токен 198 (&hC6))
ROM:33A1 _STICK: .dw 1A60h ; Бейсик функция STICK (токен 199 (&hC7))
ROM:33A3 _2D0_2: .dw 2D0h ; (токен 200 (&hC8))
ROM:33A5 _STRIG: .dw 1A53h ; Бейсик функция STRIG (токен 201 (&hC9))
ROM:33A7 _BASE_: .dw 1D0Eh ; ??? (токен 202 (&hCA))
ROM:33A9 _LEFT: .dw 0F14h ; Бейсик функция LEFT (токен 203 (&hCB))
ROM:33AB _RIGHT: .dw 0F44h ; Бейсик функция RIGHT (токен 204 (&hCC))
ROM:33AD _MID: .dw 0F4Eh ; Бейсик функция MID (токен 205 (&hCD))
ROM:33AF _ERR: .dw 1D77h ; Бейсик функция ERR (токен 206 (&hCE))
ROM:33B1 _ERL: .dw 1D6Dh ; Бейсик функция ERL (токен 207 (&hCF))
ROM:33B3 _CSRLIN: .dw 1A7Bh ; Бейсик функция CSRLIN (токен 208 (&hD0))
ROM:33B5 _H: .dw 1F3Ah ; Бейсик функция &h (токен 209 (&hD1))
ROM:33B7 _B: .dw 1F6Ch ; Бейсик функция &b (токен 210 (&hD2))
ROM:33B9 _INKEY: .dw 197Bh ; Бейсик функция INKEY (токен 211 (&hD3))
ROM:33BB _POINT: .dw 1EEAh ; Бейсик функция POINT (токен 212 (&hD4))
ROM:33BD _STRING: .dw 1C71h ; Бейсик функция STRING (токен 213 (&hD5))
ROM:33BF _SCREEN: .dw 1A1Ah ; Бейсик функция SCREEN (токен 214 (&hD6))
ROM:33C1 _WIDTH: .dw 1A26h ; Бейсик функция WIDTH (токен 215 (&hD7))
ROM:33C3 _GET: .dw 2151h ; Бейсик оператор GET (токен 216 (&hD8))
ROM:33C5 _PUT: .dw 1FD6h ; Бейсик оператор PUT (токен 217 (&hD9))
ROM:33C7 _2D0_3: .dw 2D0h ; (токен 218 (&hDA))
ROM:33C9 _LPRINT: .dw 1B42h ; Бейсик оператор LPRINT (токен 219 (&hDB))
ROM:33CB _LLIST: .dw 1B4Ah ; Бейсик оператор LLIST (токен 220 (&hDC))
ROM:33CD _KEY: .dw 1AF4h ; Бейсик оператор KEY (токен 221 (&hDD))
ROM:33CF _2D0_4: .dw 2D0h ; (токен 222 (&hDE))
ROM:33D1 _2D0_5: .dw 2D0h ; (токен 223 (&hDF))
ROM:33D3 _2D0_6: .dw 2D0h ; (токен 224 (&hE0))
ROM:33D5 _BLOAD: .dw 199Ch ; Бейсик оператор BLOAD (токен 225 (&hE1))
ROM:33D7 _BSAVE: .dw 19DAh ; Бейсик оператор BSAVE (токен 226 (&hE2))
ROM:33D9 _LOAD: .dw 19B8h ; Бейсик оператор LOAD (токен 227 (&hE3))
ROM:33DB _SAVE: .dw 188Bh ; Бейсик оператор SAVE (токен 228 (&hE4))
ROM:33DD _2D0_7: .dw 2D0h ; (токен 229 (&hE5))
ROM:33DF _AUTO: .dw 1DC5h ; Бейсик оператор AUTO (токен 230 (&hE6))
ROM:33E1 _TR: .dw 1EBAh ; Бейсик оператор TR (токен 231 (&hE7))
ROM:33E3 _BEEP: .dw 1D3Ch ; Бейсик оператор BEEP (токен 232 (&hE8))
ROM:33E5 _MOTOR: .dw 1A32h ; Бейсик оператор MOTOR (токен 233 (&hE9))
ROM:33E7 _PRESET: .dw 1800h ; Бейсик оператор PRESET (токен 234 (&hEA))
ROM:33E9 _RESUME: .dw 1DA5h ; Бейсик оператор RESUME (токен 235 (&hEB))
ROM:33EB _END: .dw 1A77h ; Бейсик оператор END (токен 236 (&hEC))
ROM:33ED _VPOKE: .dw 1A8Ch ; Бейсик оператор VPOKE (токен 237 (&hED))
ROM:33EF _LET: .dw 710h ; Бейсик оператор LET (токен 238 (&hEE))
ROM:33F1 _BASE: .dw 1D21h ; Бейсик оператор BASE (токен 239 (&hEF))
ROM:33F3 _COLOR: .dw 1A00h ; Бейсик оператор COLOR (токен 240 (&hF0))
ROM:33F5 _CONT: .dw 617h ; Бейсик оператор CONT (токен 241 (&hF1))
ROM:33F7 _REM_2: .dw 6FBh ; Бейсик оператор REM
ROM:33F7 ; Внимание! Точка входа не может быть отмечена в дизассемблерном листинге, т. к. указывает в середину инструкции опреатора DATA!
ROM:33F9 .db 0B3h
ROM:33FA .db 16h
ROM:33FB .db 0AFh
ROM:33FC .db 77h ; w
ROM:33FD .db 23h
ROM:33FE .db 77h ; w
ROM:33FF .db 3Dh ; =
ROM:3400
ROM:3400 ; =============== S U B R O U T I N E =======================================
ROM:3400
ROM:3400 ; Подпрограмма обработки ленточных команд SAVE, LOAD и CSAVE, CLOAD и BSAVE, BLOAD
ROM:3400
ROM:3400 SALOTR: ; CODE XREF: ROM:1891p
ROM:3400 ; ROM:loc_18B8p
ROM:3400
ROM:3400 ; FUNCTION CHUNK AT ROM:34AD SIZE 00000009 BYTES
ROM:3400 ; FUNCTION CHUNK AT ROM:34CA SIZE 00000071 BYTES
ROM:3400 ; FUNCTION CHUNK AT ROM:35A5 SIZE 0000001F BYTES
ROM:3400
ROM:3400 inr a
ROM:3401 push h
ROM:3402 push psw
ROM:3403 push b
ROM:3404 push d
ROM:3405 lxi b, 6
ROM:3408 lxi d, PSETX ; Координата X команды PSET в виде байта
ROM:340B lxi h, STRNL ; Адрес строки выводимой на печать подпрограммой STRPRN
ROM:340E call VRAM2RAM ; BC=счетчик, DE=адрес приема, HL=адрес источника
ROM:340E ; (пересылка VRAM -> RAM)
ROM:3411 lxi h, SALOTMP ; Временная переменная подпрограммы работы с лентой SALOTR
ROM:3414 xra a
ROM:3415 sta SALOTMP2 ; Временная переменная SALOTR
ROM:3418 cmp m
ROM:3419 jnz loc_3428
ROM:341C lxi h, 1911h
ROM:341F shld SALOTMP ; Временная переменная подпрограммы работы с лентой SALOTR
ROM:3422 lxi h, 2F31h
ROM:3425 shld SALOTMP3 ; Временная переменная подпрограммы работы с лентой SALOTR
ROM:3428
ROM:3428 loc_3428: ; CODE XREF: SALOTR+19j
ROM:3428 pop d
ROM:3429 pop b
ROM:342A pop psw
ROM:342B pop h
ROM:342C ora a
ROM:342D jp loc_34CA
ROM:3430 ani 3
ROM:3432 jz loc_3469
ROM:3435 cpi 2
ROM:3437 jz loc_34AD
ROM:343A mvi a, 0D0h ; '¦'
ROM:343C push h
ROM:343D push d
ROM:343E call SALOTR2 ; Подпрограмма обработки ленточных команд. Дополнительная точка входа.
ROM:3441 dad b
ROM:3442 inx h
ROM:3443 shld SL1 ; Переменная SALOTR
ROM:3446 pop h
ROM:3447 shld SL2 ; Переменная SALOTR
ROM:344A pop h
ROM:344B shld FMA ; Адрес, использующийся при заполнении памяти в подпрограмме FILLMEMA
ROM:344E jc loc_34C6
ROM:3451 push b
ROM:3452 push h
ROM:3453 lxi h, FMA ; Адрес, использующийся при заполнении памяти в подпрограмме FILLMEMA
ROM:3456 lxi b, 6
ROM:3459 xra a
ROM:345A call SLTR ; Подпрограмма работы с лентой
ROM:345D pop h
ROM:345E pop b
ROM:345F jc loc_34C6
ROM:3462 inx b
ROM:3463 call SLTR2 ; Подпрограмма работы с лентой
ROM:3466 jmp loc_34C3
ROM:3469 ; ---------------------------------------------------------------------------
ROM:3469
ROM:3469 loc_3469: ; CODE XREF: SALOTR+32j
ROM:3469 mvi a, 0D3h ; 'L'
ROM:346B call SALOTR2 ; Подпрограмма обработки ленточных команд. Дополнительная точка входа.
ROM:346E jc loc_34C6
ROM:3471 xra a
ROM:3472 call FILLMEMA ; Заполняет константой взятой из A облать памяти длиной 0Ah, начиная с адреса FMA
ROM:3475 call SLTR ; Подпрограмма работы с лентой
ROM:3478 jc loc_34C6
ROM:347B lxi h, FMA ; Адрес, использующийся при заполнении памяти в подпрограмме FILLMEMA
ROM:347E lxi b, 0Ah
ROM:3481 call SLTR2 ; Подпрограмма работы с лентой
ROM:3484 jc loc_34C6
ROM:3487 xra a
ROM:3488 call SLTR3 ; Подпрограмма работы с лентой
ROM:348B jmp loc_34C3
ROM:348B ; End of function SALOTR
ROM:348B
ROM:348E
ROM:348E ; =============== S U B R O U T I N E =======================================
ROM:348E
ROM:348E ; Заполняет константой взятой из A облать памяти длиной 0Ah, начиная с адреса FMA
ROM:348E
ROM:348E FILLMEMA: ; CODE XREF: SALOTR+72p
ROM:348E ; SALOTR2+2p
ROM:348E push h
ROM:348F push b
ROM:3490 lxi h, FMA ; Адрес, использующийся при заполнении памяти в подпрограмме FILLMEMA
ROM:3493 lxi b, 0Ah
ROM:3496 call FILLAREA ; A=константа, BC=счетчик, HL=адрес (заполнение области константой)
ROM:3499 pop b
ROM:349A pop h
ROM:349B ret
ROM:349B ; End of function FILLMEMA
ROM:349B
ROM:349C
ROM:349C ; =============== S U B R O U T I N E =======================================
ROM:349C
ROM:349C ; Подпрограмма обработки ленточных команд. Дополнительная точка входа.
ROM:349C
ROM:349C SALOTR2: ; CODE XREF: SALOTR+3Ep
ROM:349C ; SALOTR+6Bp ...
ROM:349C push h
ROM:349D push b
ROM:349E call FILLMEMA ; Заполняет константой взятой из A облать памяти длиной 0Ah, начиная с адреса FMA
ROM:34A1 lxi h, FMA ; Адрес, использующийся при заполнении памяти в подпрограмме FILLMEMA
ROM:34A4 lxi b, 10h
ROM:34A7 call SLTR ; Подпрограмма работы с лентой
ROM:34AA pop b
ROM:34AB pop h
ROM:34AC ret
ROM:34AC ; End of function SALOTR2
ROM:34AC
ROM:34AD ; ---------------------------------------------------------------------------
ROM:34AD ; START OF FUNCTION CHUNK FOR SALOTR
ROM:34AD
ROM:34AD loc_34AD: ; CODE XREF: SALOTR+37j
ROM:34AD mvi a, 0EAh ; 'ъ'
ROM:34AF call SALOTR2 ; Подпрограмма обработки ленточных команд. Дополнительная точка входа.
ROM:34B2 jc loc_34C6
ROM:34B5 ret
ROM:34B5 ; END OF FUNCTION CHUNK FOR SALOTR
ROM:34B6
ROM:34B6 ; =============== S U B R O U T I N E =======================================
ROM:34B6
ROM:34B6 ; Подпрограмма редактора. Вызывается из EDIT1 и OUTCHAR.
ROM:34B6
ROM:34B6 EDITTR1: ; CODE XREF: OUTCHAR+1AB1p
ROM:34B6 ; EDIT1+2Ap
ROM:34B6 lxi b, 100h
ROM:34B9 lxi h, IOBUF ; Буфер ввода-вывода (диск, кассеты)
ROM:34BC xra a
ROM:34BD call SLTR ; Подпрограмма работы с лентой
ROM:34C0 jc loc_34C6
ROM:34C3
ROM:34C3 loc_34C3: ; CODE XREF: SALOTR+66j
ROM:34C3 ; SALOTR+8Bj
ROM:34C3 call EDITTR3 ; Подпрограмма редактора.
ROM:34C6
ROM:34C6 loc_34C6: ; CODE XREF: SALOTR+4Ej
ROM:34C6 ; SALOTR+5Fj ...
ROM:34C6 call MOTORON ; Включает мотор магнитофона (бит 5 порта 82h)
ROM:34C9 ret
ROM:34C9 ; End of function EDITTR1
ROM:34C9
ROM:34CA ; ---------------------------------------------------------------------------
ROM:34CA ; START OF FUNCTION CHUNK FOR SALOTR
ROM:34CA
ROM:34CA loc_34CA: ; CODE XREF: SALOTR+2Dj
ROM:34CA ani 3
ROM:34CC jz loc_3505
ROM:34CF cpi 2
ROM:34D1 jz loc_35A5
ROM:34D4 mvi a, 0D0h ; '¦'
ROM:34D6 call TAPETR ; Подпрограмма работы с лентой
ROM:34D9 jc loc_34C6
ROM:34DC lxi h, FMA ; Адрес, использующийся при заполнении памяти в подпрограмме FILLMEMA
ROM:34DF lxi b, 6
ROM:34E2 call TAPETR2 ; Подпрограмма работы с лентой
ROM:34E5 jc loc_34C6
ROM:34E8 lhld SL1 ; Переменная SALOTR
ROM:34EB xchg
ROM:34EC lhld FMA ; Адрес, использующийся при заполнении памяти в подпрограмме FILLMEMA
ROM:34EF mov a, h
ROM:34F0 cma
ROM:34F1 mov h, a
ROM:34F2 mov a, l
ROM:34F3 cma
ROM:34F4 mov l, a
ROM:34F5 inx h
ROM:34F6 dad d
ROM:34F7 mov b, h
ROM:34F8 mov c, l
ROM:34F9 lhld FMA ; Адрес, использующийся при заполнении памяти в подпрограмме FILLMEMA
ROM:34FC call TAPEIN ; Ввод с ленты
ROM:34FF lhld SL2 ; Переменная SALOTR
ROM:3502 jmp loc_34C6
ROM:3505 ; ---------------------------------------------------------------------------
ROM:3505
ROM:3505 loc_3505: ; CODE XREF: SALOTR+CCj
ROM:3505 mvi a, 0D3h ; 'L'
ROM:3507 push h
ROM:3508 call TAPETR ; Подпрограмма работы с лентой
ROM:350B pop h
ROM:350C jc loc_34C6
ROM:350F push h
ROM:3510 call INMAG ; Ввод с магнитофона (бит 7 порта 82)
ROM:3513 pop h
ROM:3514 jc loc_34C6
ROM:3517
ROM:3517 loc_3517: ; CODE XREF: SALOTR+12Fj
ROM:3517 mvi b, 0Bh
ROM:3519
ROM:3519 loc_3519: ; CODE XREF: SALOTR+135j
ROM:3519 push h
ROM:351A push b
ROM:351B call INMAGTR ; Обработка ввода с магнитофона (BIPROC)
ROM:351E pop b
ROM:351F pop h
ROM:3520 jc loc_34C6
ROM:3523 cpi 0
ROM:3525 jz loc_3532
ROM:3528 call VERIFYERR ; Проверяет записанное на кассету, сообщает об ошибке, если надо
ROM:352B jc loc_34C6
ROM:352E inx h
ROM:352F jmp loc_3517
ROM:3532 ; ---------------------------------------------------------------------------
ROM:3532
ROM:3532 loc_3532: ; CODE XREF: SALOTR+125j
ROM:3532 mov m, a
ROM:3533 inx h
ROM:3534 dcr b
ROM:3535 jnz loc_3519
ROM:3538 jmp loc_34C6
ROM:3538 ; END OF FUNCTION CHUNK FOR SALOTR
ROM:353B
ROM:353B ; =============== S U B R O U T I N E =======================================
ROM:353B
ROM:353B ; Подпрограмма работы с лентой
ROM:353B
ROM:353B TAPETR: ; CODE XREF: SALOTR+D6p
ROM:353B ; SALOTR+108p ...
ROM:353B
ROM:353B ; FUNCTION CHUNK AT ROM:355C SIZE 0000003B BYTES
ROM:353B
ROM:353B push psw
ROM:353C
ROM:353C loc_353C: ; CODE XREF: TAPETR+59j
ROM:353C lxi b, 10h
ROM:353F lxi h, FMA ; Адрес, использующийся при заполнении памяти в подпрограмме FILLMEMA
ROM:3542 call TAPETR2 ; Подпрограмма работы с лентой
ROM:3545 jnc loc_355C
ROM:3548 pop b
ROM:3549 ret
ROM:3549 ; End of function TAPETR
ROM:3549
ROM:354A
ROM:354A ; =============== S U B R O U T I N E =======================================
ROM:354A
ROM:354A ; Подпрограмма работы с лентой
ROM:354A
ROM:354A TAPETR2: ; CODE XREF: SALOTR+E2p
ROM:354A ; TAPETR+7p
ROM:354A lda CASCMP ; Флаг сравнения
ROM:354D push psw
ROM:354E mvi a, 0FFh
ROM:3550 sta CASCMP ; Флаг сравнения
ROM:3553 call TAPETR3 ; Подпрограмма работы с лентой
ROM:3556 pop b
ROM:3557 mov a, b
ROM:3558 sta CASCMP ; Флаг сравнения
ROM:355B ret
ROM:355B ; End of function TAPETR2
ROM:355B
ROM:355C ; ---------------------------------------------------------------------------
ROM:355C ; START OF FUNCTION CHUNK FOR TAPETR
ROM:355C
ROM:355C loc_355C: ; CODE XREF: TAPETR+Aj
ROM:355C mvi c, 0Ah
ROM:355E lxi h, FMA ; Адрес, использующийся при заполнении памяти в подпрограмме FILLMEMA
ROM:3561 pop psw
ROM:3562
ROM:3562 loc_3562: ; CODE XREF: TAPETR+2Dj
ROM:3562 cmp m
ROM:3563 jnz TAPETR ; Подпрограмма работы с лентой
ROM:3566 inx h
ROM:3567 dcr c
ROM:3568 jnz loc_3562
ROM:356B push psw
ROM:356C mvi b, 6
ROM:356E lxi d, PSETX ; Координата X команды PSET в виде байта
ROM:3571
ROM:3571 loc_3571: ; CODE XREF: TAPETR+3Ej
ROM:3571 ldax d
ROM:3572 cmp m
ROM:3573 jnz loc_3589
ROM:3576 inx h
ROM:3577 inx d
ROM:3578 dcr b
ROM:3579 jnz loc_3571
ROM:357C pop d
ROM:357D lxi h, aFound ; "Found:"
ROM:3580 mvi a, 2
ROM:3582 call EDIT ; A=флажки, HL=адрес, D=строка курсора, E=позиция курсора
ROM:3582 ; (A=0 редактирование
ROM:3582 ; A=1 установка курсора
ROM:3582 ; A=2 вывод текста на экран с текущего положения курсора
ROM:3582 ; A=3 установка курсора и вывод текста
ROM:3582 ; A=4 вывод строк)
ROM:3585 call STRPRN ; Печать строки с переводом каретки, адрес строки расположен по STRNL
ROM:3588 ret
ROM:3589 ; ---------------------------------------------------------------------------
ROM:3589
ROM:3589 loc_3589: ; CODE XREF: TAPETR+38j
ROM:3589 lxi h, aSkip ; "Skip :"
ROM:358C mvi a, 2
ROM:358E call EDIT ; A=флажки, HL=адрес, D=строка курсора, E=позиция курсора
ROM:358E ; (A=0 редактирование
ROM:358E ; A=1 установка курсора
ROM:358E ; A=2 вывод текста на экран с текущего положения курсора
ROM:358E ; A=3 установка курсора и вывод текста
ROM:358E ; A=4 вывод строк)
ROM:3591 call STRPRN ; Печать строки с переводом каретки, адрес строки расположен по STRNL
ROM:3594 jmp loc_353C
ROM:3594 ; END OF FUNCTION CHUNK FOR TAPETR
ROM:3597
ROM:3597 ; =============== S U B R O U T I N E =======================================
ROM:3597
ROM:3597 ; Печать строки с переводом каретки, адрес строки расположен по STRNL
ROM:3597
ROM:3597 STRPRN: ; CODE XREF: TAPETR+4Ap
ROM:3597 ; TAPETR+56p
ROM:3597 mvi a, 2
ROM:3599 lxi h, STRNL ; Адрес строки выводимой на печать подпрограммой STRPRN
ROM:359C call EDIT ; A=флажки, HL=адрес, D=строка курсора, E=позиция курсора
ROM:359C ; (A=0 редактирование
ROM:359C ; A=1 установка курсора
ROM:359C ; A=2 вывод текста на экран с текущего положения курсора
ROM:359C ; A=3 установка курсора и вывод текста
ROM:359C ; A=4 вывод строк)
ROM:359F mvi a, 0Dh
ROM:35A1 call SYMSCR ; A=символ (вывод символа на экран в текущую позицию курсора).
ROM:35A4 ret
ROM:35A4 ; End of function STRPRN
ROM:35A4
ROM:35A5 ; ---------------------------------------------------------------------------
ROM:35A5 ; START OF FUNCTION CHUNK FOR SALOTR
ROM:35A5
ROM:35A5 loc_35A5: ; CODE XREF: SALOTR+D1j
ROM:35A5 push h
ROM:35A6 mvi a, 0EAh ; 'ъ'
ROM:35A8 call TAPETR ; Подпрограмма работы с лентой
ROM:35AB pop h
ROM:35AC jc loc_34C6
ROM:35AF
ROM:35AF loc_35AF: ; CODE XREF: SALOTR+1BEj
ROM:35AF lxi b, 100h
ROM:35B2 call TAPETR3 ; Подпрограмма работы с лентой
ROM:35B5 call MOTORON ; Включает мотор магнитофона (бит 5 порта 82h)
ROM:35B8 rc
ROM:35B9 dcx h
ROM:35BA mvi a, 1Ah
ROM:35BC cmp m
ROM:35BD inx h
ROM:35BE jnz loc_35AF
ROM:35C1 jmp loc_34C6
ROM:35C1 ; END OF FUNCTION CHUNK FOR SALOTR
ROM:35C4
ROM:35C4 ; =============== S U B R O U T I N E =======================================
ROM:35C4
ROM:35C4 ; Подпрограмма работы с лентой
ROM:35C4
ROM:35C4 TAPETR3: ; CODE XREF: TAPETR2+9p
ROM:35C4 ; SALOTR+1B2p
ROM:35C4 push h
ROM:35C5 push b
ROM:35C6 call INMAG ; Ввод с магнитофона (бит 7 порта 82)
ROM:35C9 pop b
ROM:35CA pop h
ROM:35CB rc
ROM:35CB ; End of function TAPETR3
ROM:35CB
ROM:35CC
ROM:35CC ; =============== S U B R O U T I N E =======================================
ROM:35CC
ROM:35CC ; Ввод с ленты
ROM:35CC
ROM:35CC TAPEIN: ; CODE XREF: SALOTR+FCp
ROM:35CC ; TAPEIN+Fj
ROM:35CC push h
ROM:35CD push b
ROM:35CE call INMAGTR ; Обработка ввода с магнитофона (BIPROC)
ROM:35D1 pop b
ROM:35D2 pop h
ROM:35D3 call VERIFYERR ; Проверяет записанное на кассету, сообщает об ошибке, если надо
ROM:35D6 rc
ROM:35D7 dcx b
ROM:35D8 inx h
ROM:35D9 mov a, b
ROM:35DA ora c
ROM:35DB jnz TAPEIN ; Ввод с ленты
ROM:35DE ret
ROM:35DE ; End of function TAPEIN
ROM:35DE
ROM:35DF
ROM:35DF ; =============== S U B R O U T I N E =======================================
ROM:35DF
ROM:35DF ; Проверяет записанное на кассету, сообщает об ошибке, если надо
ROM:35DF
ROM:35DF VERIFYERR: ; CODE XREF: SALOTR+128p
ROM:35DF ; TAPEIN+7p
ROM:35DF push psw
ROM:35E0 lda CASCMP ; Флаг сравнения
ROM:35E3 ora a
ROM:35E4 jnz loc_35F8
ROM:35E7 pop psw
ROM:35E8 cmp m
ROM:35E9 jz locret_35FA
ROM:35EC push psw
ROM:35ED lxi h, aVerifyError ; "Verify error\r"
ROM:35F0 mvi a, 2
ROM:35F2 call EDIT ; A=флажки, HL=адрес, D=строка курсора, E=позиция курсора
ROM:35F2 ; (A=0 редактирование
ROM:35F2 ; A=1 установка курсора
ROM:35F2 ; A=2 вывод текста на экран с текущего положения курсора
ROM:35F2 ; A=3 установка курсора и вывод текста
ROM:35F2 ; A=4 вывод строк)
ROM:35F5 pop psw
ROM:35F6 stc
ROM:35F7 ret
ROM:35F8 ; ---------------------------------------------------------------------------
ROM:35F8
ROM:35F8 loc_35F8: ; CODE XREF: VERIFYERR+5j
ROM:35F8 pop psw
ROM:35F9 mov m, a
ROM:35FA
ROM:35FA locret_35FA: ; CODE XREF: VERIFYERR+Aj
ROM:35FA ret
ROM:35FA ; End of function VERIFYERR
ROM:35FA
ROM:35FB
ROM:35FB ; =============== S U B R O U T I N E =======================================
ROM:35FB
ROM:35FB ; Подпрограмма работы с лентой
ROM:35FB
ROM:35FB SLTR: ; CODE XREF: SALOTR+5Ap
ROM:35FB ; SALOTR+75p ...
ROM:35FB push h
ROM:35FC push b
ROM:35FD call MOTOROFF ; Выключает мотор магнитофона (бит 5 порта 82h)
ROM:3600 pop b
ROM:3601 pop h
ROM:3602
ROM:3602 SLTR2: ; CODE XREF: SALOTR+63p
ROM:3602 ; SALOTR+81p ...
ROM:3602 push b ; Подпрограмма работы с лентой
ROM:3603 push h
ROM:3604 mov a, m
ROM:3605 call SLTR3 ; Подпрограмма работы с лентой
ROM:3608 pop h
ROM:3609 pop b
ROM:360A rc
ROM:360B inx h
ROM:360C dcx b
ROM:360D mov a, b
ROM:360E ora c
ROM:360F jnz SLTR2 ; Подпрограмма работы с лентой
ROM:3612 ret
ROM:3612 ; End of function SLTR
ROM:3612
ROM:3613
ROM:3613 ; =============== S U B R O U T I N E =======================================
ROM:3613
ROM:3613 ; Подпрограмма редактора.
ROM:3613
ROM:3613 EDITTR3: ; CODE XREF: EDITTR1:loc_34C3p
ROM:3613 push b
ROM:3614 push psw
ROM:3615 lxi b, 0
ROM:3618
ROM:3618 loc_3618: ; CODE XREF: EDITTR3+8j
ROM:3618 dcx b
ROM:3619 mov a, b
ROM:361A ora c
ROM:361B jnz loc_3618
ROM:361E pop psw
ROM:361F pop b
ROM:3620 ret
ROM:3620 ; End of function EDITTR3
ROM:3620
ROM:3621
ROM:3621 ; =============== S U B R O U T I N E =======================================
ROM:3621
ROM:3621 ; Включает мотор магнитофона (бит 5 порта 82h)
ROM:3621
ROM:3621 MOTORON: ; CODE XREF: EDITTR1:loc_34C6p
ROM:3621 ; SALOTR+1B5p
ROM:3621 push psw
ROM:3622 in 82h
ROM:3624 xri 10h
ROM:3626 out 82h
ROM:3628 pop psw
ROM:3629 ei
ROM:362A ret
ROM:362A ; End of function MOTORON
ROM:362A
ROM:362B
ROM:362B ; =============== S U B R O U T I N E =======================================
ROM:362B
ROM:362B ; Выключает мотор магнитофона (бит 5 порта 82h)
ROM:362B
ROM:362B MOTOROFF: ; CODE XREF: SLTR+2p
ROM:362B
ROM:362B ; FUNCTION CHUNK AT ROM:3772 SIZE 0000000A BYTES
ROM:362B
ROM:362B ora a
ROM:362C push psw
ROM:362D in 82h
ROM:362F ori 10h
ROM:3631 out 82h
ROM:3633 lxi h, 0
ROM:3636
ROM:3636 TPROC: ; CODE XREF: MOTOROFF+Ej
ROM:3636 dcx h
ROM:3637 mov a, h
ROM:3638 ora l
ROM:3639 jnz TPROC
ROM:363C pop psw
ROM:363D mvi a, 10h
ROM:363F jz loc_3644
ROM:3642 add a
ROM:3643 add a
ROM:3644
ROM:3644 loc_3644: ; CODE XREF: MOTOROFF+14j
ROM:3644 mov b, a
ROM:3645 mvi c, 0
ROM:3647 di
ROM:3648
ROM:3648 TOPROC: ; CODE XREF: MOTOROFF+26j
ROM:3648 call SLTR6 ; Подпрограмма работы с лентой
ROM:364B call NULLSUB ; Пустая процедура
ROM:364E dcx b
ROM:364F mov a, b
ROM:3650 ora c
ROM:3651 jnz TOPROC
ROM:3654 call INMAG2 ; Ввод с магнитофона
ROM:3657 jc loc_3772
ROM:365A ret
ROM:365A ; End of function MOTOROFF
ROM:365A
ROM:365B
ROM:365B ; =============== S U B R O U T I N E =======================================
ROM:365B
ROM:365B ; Подпрограмма работы с лентой
ROM:365B
ROM:365B SLTR3: ; CODE XREF: SALOTR+88p
ROM:365B ; SLTR+Ap
ROM:365B lhld SALOTMP3 ; Временная переменная подпрограммы работы с лентой SALOTR
ROM:365E
ROM:365E BOPROC:
ROM:365E push psw
ROM:365F mov a, l
ROM:3660 sui 0Fh
ROM:3662 mov l, a
ROM:3663 call OUTMAG ; Вывод на магнитофон (бит 7 порта 82)
ROM:3666 pop psw
ROM:3667 mvi b, 8
ROM:3669
ROM:3669 loc_3669: ; CODE XREF: SLTR3+16j
ROM:3669 rrc
ROM:366A cc SLTR5 ; Подпрограмма работы с лентой
ROM:366D cnc SLTR4 ; Подпрограмма работы с лентой
ROM:3670 dcr b
ROM:3671 jnz loc_3669
ROM:3674 call SLTR5 ; Подпрограмма работы с лентой
ROM:3677 call SLTR5 ; Подпрограмма работы с лентой
ROM:367A call INMAG2 ; Ввод с магнитофона
ROM:367D jc loc_3772
ROM:3680 ret
ROM:3680 ; End of function SLTR3
ROM:3680
ROM:3681
ROM:3681 ; =============== S U B R O U T I N E =======================================
ROM:3681
ROM:3681 ; Подпрограмма работы с лентой
ROM:3681
ROM:3681 SLTR4: ; CODE XREF: SLTR3+12p
ROM:3681 lhld SALOTMP3 ; Временная переменная подпрограммы работы с лентой SALOTR
ROM:3684 call OUTMAG ; Вывод на магнитофон (бит 7 порта 82)
ROM:3684 ; End of function SLTR4
ROM:3684
ROM:3687
ROM:3687 ; =============== S U B R O U T I N E =======================================
ROM:3687
ROM:3687 ; Пустая процедура
ROM:3687
ROM:3687 NULLSUB: ; CODE XREF: MOTOROFF+20p
ROM:3687 ret
ROM:3687 ; End of function NULLSUB
ROM:3687
ROM:3688
ROM:3688 ; =============== S U B R O U T I N E =======================================
ROM:3688
ROM:3688 ; Подпрограмма работы с лентой
ROM:3688
ROM:3688 SLTR5: ; CODE XREF: SLTR3+Fp
ROM:3688 ; SLTR3+19p ...
ROM:3688 call SLTR6 ; Подпрограмма работы с лентой
ROM:368B xthl
ROM:368C xthl
ROM:368D nop
ROM:368E nop
ROM:368F call SLTR6 ; Подпрограмма работы с лентой
ROM:3692 ret
ROM:3692 ; End of function SLTR5
ROM:3692
ROM:3693
ROM:3693 ; =============== S U B R O U T I N E =======================================
ROM:3693
ROM:3693 ; Подпрограмма работы с лентой
ROM:3693
ROM:3693 SLTR6: ; CODE XREF: MOTOROFF:TOPROCp
ROM:3693 ; SLTR5p ...
ROM:3693 lhld SALOTMP ; Временная переменная подпрограммы работы с лентой SALOTR
ROM:3693 ; End of function SLTR6
ROM:3693
ROM:3696
ROM:3696 ; =============== S U B R O U T I N E =======================================
ROM:3696
ROM:3696 ; Вывод на магнитофон (бит 7 порта 82)
ROM:3696
ROM:3696 OUTMAG: ; CODE XREF: SLTR3+8p
ROM:3696 ; SLTR4+3p
ROM:3696 push psw
ROM:3697
ROM:3697 loc_3697: ; CODE XREF: OUTMAG+2j
ROM:3697 dcr l
ROM:3698 jnz loc_3697
ROM:369B in 82h
ROM:369D xri 40h
ROM:369F out 82h
ROM:36A1
ROM:36A1 loc_36A1: ; CODE XREF: OUTMAG+Cj
ROM:36A1 dcr h
ROM:36A2 jnz loc_36A1
ROM:36A5 in 82h
ROM:36A7 xri 40h
ROM:36A9 out 82h
ROM:36AB pop psw
ROM:36AC ret
ROM:36AC ; End of function OUTMAG
ROM:36AC
ROM:36AD
ROM:36AD ; =============== S U B R O U T I N E =======================================
ROM:36AD
ROM:36AD ; Ввод с магнитофона
ROM:36AD
ROM:36AD INMAG3: ; CODE XREF: INMAG+1Dp
ROM:36AD ; INMAGTR+9p ...
ROM:36AD mvi e, 0
ROM:36AF
ROM:36AF loc_36AF: ; CODE XREF: INMAG3+Ej
ROM:36AF mov a, d
ROM:36B0 cma
ROM:36B1 mov d, a
ROM:36B2
ROM:36B2 loc_36B2: ; CODE XREF: INMAG3+Aj
ROM:36B2 in 8Dh
ROM:36B4 inr e
ROM:36B5 rz
ROM:36B6 xra d
ROM:36B7 jp loc_36B2
ROM:36BA dcr c
ROM:36BB jnz loc_36AF
ROM:36BE ora a
ROM:36BF mov a, e
ROM:36C0 ret
ROM:36C0 ; End of function INMAG3
ROM:36C0
ROM:36C1
ROM:36C1 ; =============== S U B R O U T I N E =======================================
ROM:36C1
ROM:36C1 ; Ввод с магнитофона (бит 7 порта 82)
ROM:36C1
ROM:36C1 INMAG: ; CODE XREF: SALOTR+110p
ROM:36C1 ; TAPETR3+2p
ROM:36C1 di
ROM:36C2 in 82h
ROM:36C4 ori 10h
ROM:36C6 ani 0BFh
ROM:36C8 out 82h
ROM:36CA
ROM:36CA TIPROC:
ROM:36CA push h
ROM:36CB
ROM:36CB loc_36CB: ; CODE XREF: INMAG+20j
ROM:36CB ; INMAG+29j
ROM:36CB pop h
ROM:36CC call INMAG2 ; Ввод с магнитофона
ROM:36CF jc loc_3756
ROM:36D2 lxi h, 400h
ROM:36D5 push h
ROM:36D6 lxi h, 0
ROM:36D9 shld INMAGTMP ; Временная переменна INMAG
ROM:36DC
ROM:36DC loc_36DC: ; CODE XREF: INMAG+36j
ROM:36DC mvi c, 4
ROM:36DE call INMAG3 ; Ввод с магнитофона
ROM:36E1 jz loc_36CB
ROM:36E4 adi 2
ROM:36E6 ani 0F0h
ROM:36E8 cmp b
ROM:36E9 mov b, a
ROM:36EA jnz loc_36CB
ROM:36ED mov a, d
ROM:36EE mvi d, 0
ROM:36F0 dad d
ROM:36F1 xthl
ROM:36F2 mov d, a
ROM:36F3 dcx h
ROM:36F4 mov a, h
ROM:36F5 ora l
ROM:36F6 xthl
ROM:36F7 jnz loc_36DC
ROM:36FA pop b
ROM:36FB mov a, h
ROM:36FC inr a
ROM:36FD rrc
ROM:36FE rrc
ROM:36FF rrc
ROM:3700 ani 1Fh
ROM:3702 mov h, a
ROM:3703 rar
ROM:3704 mov l, a
ROM:3705 shld INMAGTMP2 ; Временная переменна INMAG
ROM:3708 add h
ROM:3709 inr a
ROM:370A sta INMAGTMP3 ; Временная переменна INMAG
ROM:370D ret
ROM:370D ; End of function INMAG
ROM:370D
ROM:370E
ROM:370E ; =============== S U B R O U T I N E =======================================
ROM:370E
ROM:370E ; Обработка ввода с магнитофона (BIPROC)
ROM:370E
ROM:370E INMAGTR: ; CODE XREF: SALOTR+11Bp
ROM:370E ; TAPEIN+2p
ROM:370E lda INMAGTMP3 ; Временная переменна INMAG
ROM:3711 mov b, a
ROM:3712 lhld INMAGTMP2 ; Временная переменна INMAG
ROM:3715
ROM:3715 loc_3715: ; CODE XREF: INMAGTR+10j
ROM:3715 ; INMAGTR+18j
ROM:3715 mvi c, 1
ROM:3717 call INMAG3 ; Ввод с магнитофона
ROM:371A jz loc_3756
ROM:371D cmp h
ROM:371E jc loc_3715
ROM:3721 inr c
ROM:3722 call INMAG3 ; Ввод с магнитофона
ROM:3725 cmp l
ROM:3726 jc loc_3715
ROM:3729 lxi h, 8
ROM:372C
ROM:372C loc_372C: ; CODE XREF: INMAGTR+3Aj
ROM:372C mvi c, 2
ROM:372E call INMAG3 ; Ввод с магнитофона
ROM:3731 jz loc_3772
ROM:3734 cmp b
ROM:3735 jnc loc_3744
ROM:3738 mvi c, 2
ROM:373A call INMAG3 ; Ввод с магнитофона
ROM:373D jz loc_3772
ROM:3740 cmp b
ROM:3741 jnc loc_3772
ROM:3744
ROM:3744 loc_3744: ; CODE XREF: INMAGTR+27j
ROM:3744 mov a, h
ROM:3745 rar
ROM:3746 mov h, a
ROM:3747 dcr l
ROM:3748 jnz loc_372C
ROM:374B lxi d, INMAGTMP ; Временная переменна INMAG
ROM:374E ldax d
ROM:374F add h
ROM:3750 stax d
ROM:3751 call INMAG2 ; Ввод с магнитофона
ROM:3754 mov a, h
ROM:3755 rnc
ROM:3756
ROM:3756 loc_3756: ; CODE XREF: INMAG+Ej
ROM:3756 ; INMAGTR+Cj
ROM:3756 jmp loc_3772
ROM:3756 ; End of function INMAGTR
ROM:3756
ROM:3759
ROM:3759 ; =============== S U B R O U T I N E =======================================
ROM:3759
ROM:3759 ; Ввод с магнитофона
ROM:3759
ROM:3759 INMAG2: ; CODE XREF: MOTOROFF+29p
ROM:3759 ; SLTR3+1Fp ...
ROM:3759 in 82h
ROM:375B ani 0F0h
ROM:375D ori 6
ROM:375F out 82h
ROM:3761 in 81h
ROM:3763 ani 2
ROM:3765 rnz
ROM:3766 in 82h
ROM:3768 inr a
ROM:3769 out 82h
ROM:376B in 81h
ROM:376D ani 10h
ROM:376F rnz
ROM:3770 stc
ROM:3771 ret
ROM:3771 ; End of function INMAG2
ROM:3771
ROM:3772 ; ---------------------------------------------------------------------------
ROM:3772 ; START OF FUNCTION CHUNK FOR MOTOROFF
ROM:3772
ROM:3772 loc_3772: ; CODE XREF: MOTOROFF+2Cj
ROM:3772 ; SLTR3+22j ...
ROM:3772 mvi a, 2
ROM:3774 lxi h, aDeviceIOError ; "Device I/O error\r"
ROM:3777 call EDIT ; A=флажки, HL=адрес, D=строка курсора, E=позиция курсора
ROM:3777 ; (A=0 редактирование
ROM:3777 ; A=1 установка курсора
ROM:3777 ; A=2 вывод текста на экран с текущего положения курсора
ROM:3777 ; A=3 установка курсора и вывод текста
ROM:3777 ; A=4 вывод строк)
ROM:377A stc
ROM:377B ret
ROM:377B ; END OF FUNCTION CHUNK FOR MOTOROFF
ROM:377B ; ---------------------------------------------------------------------------
ROM:377C aDeviceIOError: .text "Device I/O error" ; DATA XREF: MOTOROFF+149o
ROM:377C .db 0Dh
ROM:377C .db 0
ROM:378E aSkip: .text "Skip :" ; DATA XREF: TAPETR:loc_3589o
ROM:378E .db 0
ROM:3795 aFound: .text "Found:" ; DATA XREF: TAPETR+42o
ROM:3795 .db 0
ROM:379C aVerifyError: .text "Verify error" ; DATA XREF: VERIFYERR+Eo
ROM:379C .db 0Dh
ROM:379C .db 0
ROM:37AA .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:37AA .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:37AA .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:37AA .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:37AA .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:37AA .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:37AA .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:37AA .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:37AA .db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
ROM:37AA .db 0FFh, 0FFh, 0FFh, 0FFh, 0FCh
ROM:3800 ZNAKGEN: .block 1 ; DATA XREF: SETMODE2+40o
ROM:3800 ; SYMSCR2+D7o
ROM:3800 ; end of 'ROM' ; Начало знакогенератора.
ROM:3800
RAM:F000 ; ===========================================================================
RAM:F000
RAM:F000 ; Segment type: Regular
RAM:F000 .org 0F000h
RAM:F000 .block 2EFh
RAM:F2EF unk_F2EF: .block 1
RAM:F2F0 .block 345h
RAM:F635 ENBASSTK: .block 100h ; Конец стека Бейсик интерпретатора
RAM:F735 BGBASSTK: .block 1 ; Начало стека Бейсик интерпретатора
RAM:F736 ENSTRAR: .block 0C9h ; Строковая область 200 байт.
RAM:F736 ; (размер устанавливается оператором CLEAR)
RAM:F7FF BGSTRAR: .block 1 ; DATA XREF: START+2954o
RAM:F7FF ; По этому адресу (&hF7FF) инициализируется SP при INIT
RAM:F800 ; ---------------------------------------------------------------------------
RAM:F800
RAM:F800 VRAM2RAM_: ; DATA XREF: START+2961o
RAM:F800 di ; Подпрограмма пересылки из VRAM в RAM
RAM:F801 call RAMON ; Подпрограмма включения RAM
RAM:F804
RAM:F804 loc_F804: ; CODE XREF: RAM:F80Ej
RAM:F804 mov a, b
RAM:F805 ora c
RAM:F806 mov a, m
RAM:F807 jz loc_F811
RAM:F80A stax d
RAM:F80B inx d
RAM:F80C inx h
RAM:F80D dcx b
RAM:F80E jmp loc_F804
RAM:F811 ; ---------------------------------------------------------------------------
RAM:F811
RAM:F811 loc_F811: ; CODE XREF: RAM:F807j
RAM:F811 ; RAM:F836j
RAM:F811 call MODETR ; Установка режима для VRAM2RAM_
RAM:F814 ei
RAM:F815 ret
RAM:F816
RAM:F816 ; =============== S U B R O U T I N E =======================================
RAM:F816
RAM:F816 ; Установка режима для VRAM2RAM_
RAM:F816
RAM:F816 MODETR: ; CODE XREF: RAM:loc_F811p
RAM:F816 ; RAM:F86Bj
RAM:F816 push psw
RAM:F817 call loc_F88B
RAM:F81A
RAM:F81A loc_F81A: ; CODE XREF: RAMON+Aj
RAM:F81A out 80h
RAM:F81C pop psw
RAM:F81D ret
RAM:F81D ; End of function MODETR
RAM:F81D
RAM:F81E ; ---------------------------------------------------------------------------
RAM:F81E
RAM:F81E ROMON: ; Подпрограмма включения ROM
RAM:F81E push psw
RAM:F81F mvi a, 0FCh ; '№'
RAM:F821 jmp loc_F827
RAM:F824
RAM:F824 ; =============== S U B R O U T I N E =======================================
RAM:F824
RAM:F824 ; Подпрограмма включения RAM
RAM:F824
RAM:F824 RAMON: ; CODE XREF: RAM:F801p
RAM:F824 ; RAM:F832p ...
RAM:F824 push psw
RAM:F825 mvi a, 0FFh
RAM:F827
RAM:F827 loc_F827: ; CODE XREF: RAM:F821j
RAM:F827 push psw
RAM:F828 in 80h
RAM:F82A sta INTAR+26h ; Рабочая область обработки прерываний
RAM:F82D pop psw
RAM:F82E jmp loc_F81A
RAM:F82E ; End of function RAMON
RAM:F82E
RAM:F831 ; ---------------------------------------------------------------------------
RAM:F831
RAM:F831 VRAMRD: ; Подпрограмма чтения байта из VRAM
RAM:F831 di
RAM:F832 call RAMON ; Подпрограмма включения RAM
RAM:F835 mov a, m
RAM:F836 jmp loc_F811
RAM:F839 ; ---------------------------------------------------------------------------
RAM:F839
RAM:F839 BASSUB1: ; Подпрограмма Бейсика.
RAM:F839 mov a, l ; Используется при FMUL
RAM:F83A
RAM:F83A loc_F83A:
RAM:F83A sui 0
RAM:F83C mov l, a
RAM:F83D mov a, h
RAM:F83E
RAM:F83E loc_F83E:
RAM:F83E sbi 0
RAM:F840 mov h, a
RAM:F841 mov a, b
RAM:F842
RAM:F842 loc_F842:
RAM:F842 sbi 0
RAM:F844 mov b, a
RAM:F845
RAM:F845 loc_F845: ; DATA XREF: FDIVBYTEN+2Ew
RAM:F845 ; FDIVBYTEN+47w ...
RAM:F845 mvi a, 0
RAM:F847 sbi 0
RAM:F849 ret
RAM:F84A ; ---------------------------------------------------------------------------
RAM:F84A out 0
RAM:F84C ret
RAM:F84D ; ---------------------------------------------------------------------------
RAM:F84D
RAM:F84D loc_F84D:
RAM:F84D sta loc_F850+1
RAM:F850
RAM:F850 loc_F850: ; DATA XREF: ROM:0FAFw
RAM:F850 ; RAM:loc_F84Dw
RAM:F850 in 0
RAM:F852 ret
RAM:F853 ; ---------------------------------------------------------------------------
RAM:F853
RAM:F853 loc_F853:
RAM:F853 out 0
RAM:F855 ret
RAM:F855 ; ---------------------------------------------------------------------------
RAM:F856 JMPNXTWD: .db 0C3h ; + ; Инструкция перехода для rst6
RAM:F857 NEXTWORD: .dw loc_4F9 ; Адрес перехода для RST6
RAM:F859 ; ---------------------------------------------------------------------------
RAM:F859
RAM:F859 loc_F859: ; Подпрограмма включения RAM
RAM:F859 call RAMON
RAM:F85C
RAM:F85C loc_F85C: ; CODE XREF: RAM:F868j
RAM:F85C mov b, a
RAM:F85D sta loc_F861+1
RAM:F860 mov a, m
RAM:F861
RAM:F861 loc_F861: ; DATA XREF: RAM:F85Dw
RAM:F861 out 0
RAM:F863 inx h
RAM:F864 mov a, b
RAM:F865 inr a
RAM:F866 cpi 0C0h ; 'L'
RAM:F868 jnz loc_F85C
RAM:F86B jmp MODETR ; Установка режима для VRAM2RAM_
RAM:F86B ; ---------------------------------------------------------------------------
RAM:F86E INTCATH: .db 0C9h ; г ; C9 C9 C9 перехват прерывания (надо сюда записать C3 и два байта адреса)
RAM:F86F .db 0C9h ; г
RAM:F870 .db 0C9h ; г
RAM:F871 ; ---------------------------------------------------------------------------
RAM:F871
RAM:F871 BASSUB2: ; Подпрограмма Бейсика.
RAM:F871 push d ; Используется при FMUL
RAM:F872
RAM:F872 loc_F872:
RAM:F872 lxi d, 0
RAM:F875 dad d
RAM:F876 pop d
RAM:F877
RAM:F877 loc_F877:
RAM:F877 aci 0
RAM:F879 ret
RAM:F87A ; ---------------------------------------------------------------------------
RAM:F87A
RAM:F87A loc_F87A: ; DATA XREF: ROM:162Eo
RAM:F87A ; ROM:1656o
RAM:F87A mov d, d
RAM:F87B rst 0 ; RST0 = старт. ОЗУ при этом инициализируется, но не очищается.
RAM:F87B ; Т. е. если сделать POKE 50000, 255 а потом X=USR(0), то в памяти по адресу 50000 так и останется лежать байт 255.
RAM:F87B ; При этом, конечно, рабочие области подлежат инициализации, как и упоминалось.
RAM:F87C mov c, a
RAM:F87D add b
RAM:F87E
RAM:F87E loc_F87E: ; Внимание! После вызова CHECKENOUGHVARSPACE идет байт параметра, а не следующая инструкция!
RAM:F87E call CHECKENOUGHVARSPACE ; Проверяет, достаточно ли будет памяти при выделении места для C*4 байт начиная с VAR_TOP перед тем как это выделение начнёт затирать стек.
RAM:F87E ; (Или область переменных).
RAM:F87E ; ---------------------------------------------------------------------------
RAM:F881 VARSRCH_: .db 0E9h ; pchl
RAM:F882 ; ---------------------------------------------------------------------------
RAM:F882 ret
RAM:F882 ; ---------------------------------------------------------------------------
RAM:F883 .db 52h
RAM:F884 .db 4Eh
RAM:F885 .db 0C4h
RAM:F886 .db 4Ch ; L
RAM:F887 .db 4Fh ; O
RAM:F888 .db 0C7h
RAM:F889 .db 45h
RAM:F88A .db 58h
RAM:F88B ; ---------------------------------------------------------------------------
RAM:F88B
RAM:F88B loc_F88B: ; CODE XREF: MODETR+1p
RAM:F88B mvi a, 1
RAM:F88D sta MODE1FLG ; Флаги режима 1
RAM:F890 lda INTAR+26h ; Рабочая область обработки прерываний
RAM:F893 ret
RAM:F893 ; ---------------------------------------------------------------------------
RAM:F894 DISKRSRV: .block 5Ch ; Резерв для перехвата обработки дисковых операций
RAM:F8F0 STARTFL: .db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; DATA XREF: START+296Do
RAM:F8F0 ; Заполняется с этого адреса из &h0205 при старте системы.
RAM:F8FA AUTONUM: .dw 0Ah ; Номер AUTO
RAM:F8FC AUTOINC: .dw 0Ah ; Инкремент AUTO
RAM:F8FE LOADADDR: .dw 4100h ; Адрес загрузки для LOAD
RAM:F900 PRMTMP: .db 1 ; Архаичная временная переменная. Нигде не используется.
RAM:F901 FPTMP: .db 0 ; Временная переменная для работы с числами с плавающей точкой.
RAM:F902 TERMINAL_X: .db 0 ; DATA XREF: OUTCHAR+1r
RAM:F902 ; ROM:1896w ...
RAM:F902 ; Переменная, контролирующая текущую X позицию вывода терминала.
RAM:F903 DIM_OR_EVAL: .db 0 ; DATA XREF: ROM:0B1Bw
RAM:F903 ; GETVAR2+80r ...
RAM:F903 ; Флаг используемый GETARRAYVAR для определения: определяем ли мы массив с помощью DIM, или осуществляем доступ к элементу существующего массива,
RAM:F903 ; что могло бы быть сделано при помощи EVALTERM.
RAM:F904 LETTMP: .db 1 ; DATA XREF: LET:ASSIGNVARr
RAM:F904 ; ROM:07B0r ...
RAM:F904 ; Временная переменная оператора LET, EVALTERM, COMPUTE, GETVAR
RAM:F905 MEMTMP: .db 0 ; Временная переменная TOKENIZE
RAM:F906 ENDSTRAR: .dw ENSTRAR+0C8h ; Конец строковой области
RAM:F908 ARIFMAR: .dw ARIFMOB ; Адрес рабочей области арифметических преобразований
RAM:F90A ARIFMOB: .db 6, 0, 6Bh, 2, 1, 0, 89h, 17h, 0, 0, 0, 0
RAM:F90A ; DATA XREF: RESETSTACK+5o
RAM:F90A ; MAINTR5+36o ...
RAM:F90A ; Рабочая область арифметических преобразований
RAM:F916 MAINTR2TMP: .dw 6 ; DATA XREF: MAINTR3o
RAM:F916 ; MAINTR2:loc_D75o
RAM:F916 ; Временный массив MAINTR
RAM:F918 CHARTBL: .dw 26Bh ; Таблица символов функции CHR
RAM:F91A RUNWITHTMP: .dw 0F7FEh ; Временная переменная оператора RUN с параметром
RAM:F91C COMPTMP: .dw 1D5h ; Временная переменная, использующаяся при вычислениях.
RAM:F91E MEMTMP2: .dw 0 ; DATA XREF: CHECKENOUGHMEM:loc_2CAr
RAM:F91E ; ROM:0910w
RAM:F91E ; Используется при вычислении количества памяти в OUTOFMEMORY
RAM:F920 FORTMP: .db 0 ; Временный параметр оператора FOR
RAM:F921 IFINPUT: .db 0 ; DATA XREF: ROM:loc_840r
RAM:F921 ; ROM:087Fw ...
RAM:F921 ; =0 если INPUT
RAM:F922 CURBASLN: .dw 1722h ; Текущий адрес строки Бейсик программы
RAM:F924 CURBASPTR: .dw 1D5h ; Область сохранения текущего адреса Бейсик программы.
RAM:F926 BASOPNUM: .dw 0FFFFh ; DATA XREF: CHECKENOUGHMEM+12w
RAM:F926 ; CHECKENOUGHMEM+36r ...
RAM:F926 ; Номер оператора Бейсик программы.
RAM:F926 ; Или &hFFFF в командном режиме
RAM:F928 CONTTMP: .dw 0A6Eh ; Временная переменная оператора CONT
RAM:F92A BRKCONT: .dw 0 ; Временная переменная процедур RESETSTACK, TESTBREAKKEY, CONT
RAM:F92C STKADDR: .dw 0F736h ; Адрес стека
RAM:F92E BGBASPRG: .dw 4001h ; DATA XREF: FINDPROGRAMLINEr
RAM:F92E ; NEW2r ...
RAM:F92E ; Адрес начала Бейсик программы
RAM:F930 ENBASPRG: .dw 4003h ; Адрес конца Бейсик программы.
RAM:F930 ; Указывает на первую ячейку участка памяти, доступного программам.
RAM:F930 ; Всегда следует за последним байтом программы.
RAM:F932 BGARRAY: .dw 4003h ; Адрес начала массивов.
RAM:F932 ; Указывает на начало участка памяти, хранящего массивы.
RAM:F932 ; Следует сразу за участком памяти, выделенным для обычных переменных.
RAM:F934 VAR_TOP: .dw 4003h ; Адрес начала свободной памяти.
RAM:F934 ; Указывает на верхушку области хранящей массивы и переменные.
RAM:F936 READPTR: .dw 4000h ; Указатель для READ
RAM:F938 FACCUM: .db 00011111b, 00000010b, 10000100b, 10000111b ; DATA XREF: LET+1Cr
RAM:F938 ; ROM:07BDr ...
RAM:F938 ; Аккумулятор для вычислений с плавающей точкой:
RAM:F938 ; 00000000 1 11111111111111111111111
RAM:F938 ; -------- - -----------------------
RAM:F938 ; 8 бит экспонента 1 бит знак 23 бита мантисс
RAM:F93C FTEMP: .db 0C2h ; T ; DATA XREF: FNEGATEINTo
RAM:F93C ; Временная переменная, используемая для хранения знака и экспоненты числа с плавающей точкой во время вычислений.
RAM:F93D FBUFFER: .text " 256" ; DATA XREF: PRINTINT2:FOUTo
RAM:F93D .db 0 ; Текстовый буфер для чисел с плавающей точкой.
RAM:F93D ; Также используется при печати номера строки в команде TRON/TROFF
RAM:F942 .db 30h ; 0
RAM:F943 .db 30h ; 0
RAM:F944 .db 30h ; 0
RAM:F945 .db 3Fh ; ?
RAM:F946 .db 20h
RAM:F947 .db 20h
RAM:F948 RESERVD: .db 20h
RAM:F949 .db 20h
RAM:F94A .db 20h
RAM:F94B .db 45h ; E
RAM:F94C .db 72h ; r
RAM:F94D .db 72h ; r
RAM:F94E .db 6Fh ; o
RAM:F94F .db 72h ; r
RAM:F950 .db 0
RAM:F951 .block 0AFh
RAM:FA00 DLSM: .block 1 ; DATA XREF: FNKEYTR+1Dr
RAM:FA00 ; SETMODE2+15o ...
RAM:FA00 ; Максимальная длина строк 32 или 64
RAM:FA01 SPN: .block 1 ; DATA XREF: FNKEYTR+28r
RAM:FA01 ; SCRLEN2+25w ...
RAM:FA01 ; Пропусков в начале строки
RAM:FA02 DLSF: .block 1 ; Длина строки экрана
RAM:FA03 MSK: .block 1 ; Количество строк экрана
RAM:FA04 SPK: .block 1 ; DATA XREF: SCRLEN2+4o
RAM:FA04 ; LINECHK+7r ...
RAM:FA04 ; Пропусков в конце строки
RAM:FA05 ABS1: .block 1 ; DATA XREF: ROM:1D14o
RAM:FA05 ; ROM:1D33o ...
RAM:FA05 ; Адрес буфера экрана режима 0 и 1
RAM:FA06 ABS2: .block 1 ; Старший байт адреса буфера экрана в режимах 0 и 1
RAM:FA07 CLRT: .block 2 ; Адрес таблицы цвета режима 1
RAM:FA09 AGS1: .block 1 ; Адрес знакогенератора режима 0 и 1
RAM:FA09 ; Адрес буфера экрана режима 2
RAM:FA0A AGS2: .block 1 ; Старший байт адреса знакогенератора в режимах 0 и 1
RAM:FA0A ; Старший байт адреса буфера экрана режима 2
RAM:FA0B RS1: .block 2 ; Резерв
RAM:FA0D RS2: .block 2 ; Резерв
RAM:FA0F GTBL1: .block 1 ; Адрес таблицы точек изображения в режиме 2
RAM:FA10 GTBL2: .block 1 ; Старший байт адреса таблицы точек изображения в режиме 2
RAM:FA11 CTBL1: .block 1 ; Адрес таблицы цвета в режиме 2
RAM:FA12 CTBL2: .block 1 ; Старший байт адреса таблицы цвета в режиме 2
RAM:FA13 CURISO: .block 9 ; DATA XREF: SYMSCR2:loc_2CCEo
RAM:FA13 ; CURSOR+8o ...
RAM:FA13 ; Изображение курсора
RAM:FA1C KSS: .block 1 ; DATA XREF: INPUTSTR-55r
RAM:FA1C ; KBD+49r ...
RAM:FA1C ; Код символа в позиции курсора
RAM:FA1D INSF: .block 1 ; Флаг вставки
RAM:FA1E SMK: .block 2 ; Адрес курсора
RAM:FA20 BEEPF: .block 1 ; DATA XREF: ROM:1D42w
RAM:FA20 ; ROM:1D48o ...
RAM:FA20 ; BEEP флаг
RAM:FA21 PK: .block 1 ; Позиция курсора
RAM:FA22 SK: .block 1 ; Строка курсора
RAM:FA23 SFK: .block 1 ; Флаг функциональных клавиш
RAM:FA24 CPP: .block 1 ; цвет изображения
RAM:FA25 CZP: .block 1 ; цвет фона
RAM:FA26 CRG: .block 1 ; цвет рамки
RAM:FA27 .block 1
RAM:FA28 TIMCT: .block 1 ; Таймер (+1 каждые 20ms)
RAM:FA29 INTTMP: .block 1 ; Переменная обработчика прерываний
RAM:FA2A OUTBUF: .block 2 ; Адрес записи в буфер клавиатуры
RAM:FA2C INBUF: .block 2 ; Адрес чтения из буфера клавиатуры
RAM:FA2E CASIO: .block 1 ; Рабочая область др-ра магнитофона
RAM:FA2F .block 1
RAM:FA30 FMA: .block 2 ; DATA XREF: SALOTR+4Bw
RAM:FA30 ; SALOTR+53o ...
RAM:FA30 ; Адрес, использующийся при заполнении памяти в подпрограмме FILLMEMA
RAM:FA32 SL1: .block 2 ; Переменная SALOTR
RAM:FA34 SL2: .block 2 ; Переменная SALOTR
RAM:FA36 .block 1
RAM:FA37 .block 1
RAM:FA38 .block 1
RAM:FA39 .block 1
RAM:FA3A STRNL: .block 2 ; DATA XREF: TAPE+Ew TAPE+1Fo ...
RAM:FA3A ; Адрес строки выводимой на печать подпрограммой STRPRN
RAM:FA3C TAPETMP: .block 2 ; Временная переменная процедуры TAPE
RAM:FA3E TAPETMP2: .block 2 ; Временная переменная процедуры TAPE
RAM:FA40 SALOTMP2: .block 1 ; Временная переменная SALOTR
RAM:FA41 CASCMP: .block 1 ; Флаг сравнения
RAM:FA42 ERRFL: .block 1 ; ERR флаг
RAM:FA43 TITL: .block 1 ; Переменная SYMPRN2
RAM:FA44 PRNFL: .block 1 ; Флаг печати (Для LLIST, LPRINT равен 1)
RAM:FA45 PRNOP: .block 1 ; DATA XREF: TOKENIZE:loc_46Do
RAM:FA45 ; INPUTLN+2FAo ...
RAM:FA45 ; Временная переменная. Используется TOKENIZE, INPUTLN, START.
RAM:FA46 IOBUF: .block 13Eh ; DATA XREF: CHECKENOUGHMEM+A2o
RAM:FA46 ; TOKENIZE-1A32o ...
RAM:FA46 ; Буфер ввода-вывода (диск, кассеты)
RAM:FB84 .block 1
RAM:FB85 KBDBUF: .block 102h ; DATA XREF: KBDBUFCL2+1o
RAM:FB85 ; BUFFERTOA2+1Fo ...
RAM:FB85 ; Буфер клавиатуры
RAM:FC87 KBDTMP: .block 1 ; DATA XREF: BUFFERTOA2+18o
RAM:FC87 ; KBD1+5o
RAM:FC87 ; Переменная процедуры ввода из буфера.
RAM:FC88 FNKTXT: .block 0A0h ; DATA XREF: ROM:1B13o
RAM:FC88 ; KBD+F7o ...
RAM:FC88 ; Текст функциональных клавиш
RAM:FD28 SCLNTAB: .block 18h ; DATA XREF: CLRSCR+21o
RAM:FD28 ; EDIT5+3o ...
RAM:FD28 ; Таблица состояния строк экранного редактора
RAM:FD40 .block 1
RAM:FD41 OLDKBDMT: .block 0Bh ; DATA XREF: INTRPT2+20o
RAM:FD41 ; INTRPT2+5Do ...
RAM:FD41 ; Старое состояние матрицы клавиатуры
RAM:FD4C NEWKBDMT: .block 0Bh ; DATA XREF: INTRPT2+60o
RAM:FD4C ; Новое состояние матрицы клавиатуры
RAM:FD57 INTAR: .block 28h ; DATA XREF: INTRPT2+1Do
RAM:FD57 ; INTRPT2+66o
RAM:FD57 ; Рабочая область обработки прерываний
RAM:FD7F RES3: .block 4 ; Зарезервировано
RAM:FD83 SGF: .block 1 ; DATA XREF: SYMSCR2+Eo
RAM:FD83 ; Флаг графического символа
RAM:FD84 STOPFLG: .block 1 ; STOP-флаг
RAM:FD85 INSF2: .block 1 ; DATA XREF: INTRPT2+ABo
RAM:FD85 ; KBD+1Ar ...
RAM:FD85 ; Флаги режимов клавиатуры
RAM:FD86 ONOFF: .block 1 ; Зарезервировано
RAM:FD87 SMB: .block 1 ; Зарезервировано
RAM:FD88 INTTMP2: .block 2 ; DATA XREF: INTRPT2+99o
RAM:FD88 ; Переменная обработчика прерываний
RAM:FD8A EDITTMP: .block 1 ; Временная переменная редактора
RAM:FD8B .block 1
RAM:FD8C MODE: .block 1 ; DATA XREF: EDIT1+31r
RAM:FD8C ; ROM:1EFAr ...
RAM:FD8C ; Режим экрана
RAM:FD8D OLDRES: .block 1 ; Старый режим
RAM:FD8E .block 1
RAM:FD8F PSETC: .block 1 ; Цвет точки у команды PSET
RAM:FD90 X1: .block 1 ; DATA XREF: PRESETWT2+6o
RAM:FD90 ; ROM:1823o ...
RAM:FD90 ; Первый графический курсор, координата X
RAM:FD91 Y1: .block 1 ; Первый графический курсор, координата Y
RAM:FD92 X2: .block 1 ; DATA XREF: LINETR+10o
RAM:FD92 ; LINEBTR+1w ...
RAM:FD92 ; Второй графический курсор, координата X
RAM:FD93 Y2: .block 1 ; Второй графический курсор, координата Y
RAM:FD94 LINE100: .block 1 ; Параметр команды LINE
RAM:FD95 LINE100_: .block 1 ; Параметр команды LINE
RAM:FD96 LINE1: .block 1 ; Параметр команды LINE
RAM:FD97 LINE1_: .block 1 ; Параметр команды LINE
RAM:FD98 .block 1
RAM:FD99 .block 1
RAM:FD9A .block 1
RAM:FD9B .block 1
RAM:FD9C .block 1
RAM:FD9D .block 1
RAM:FD9E .block 1
RAM:FD9F .block 1
RAM:FDA0 INMAGTMP3: .block 2 ; Временная переменна INMAG
RAM:FDA2 INMAGTMP2: .block 2 ; Временная переменна INMAG
RAM:FDA4 INMAGTMP: .block 2 ; DATA XREF: INMAG+18w
RAM:FDA4 ; INMAGTR+3Do
RAM:FDA4 ; Временная переменна INMAG
RAM:FDA6 .block 1
RAM:FDA7 .block 1
RAM:FDA8 .block 1
RAM:FDA9 .block 1
RAM:FDAA .block 1
RAM:FDAB .block 1
RAM:FDAC .block 1
RAM:FDAD .block 1
RAM:FDAE .block 1
RAM:FDAF .block 1
RAM:FDB0 .block 1
RAM:FDB1 .block 1
RAM:FDB2 .block 1
RAM:FDB3 PRESETC: .block 1 ; Временное значение цвета для команды PRESET
RAM:FDB4 TRFLAG: .block 1 ; Флаг трассировки
RAM:FDB5 ERRTMP: .block 1 ; Код ошибки функции ERR
RAM:FDB6 OUTTMP: .block 2 ; DATA XREF: ROM:189Cw
RAM:FDB6 ; OUTCHAR+1A9Cr ...
RAM:FDB6 ; Временная переменная редактора
RAM:FDB8 EITMP: .block 2 ; Временная переменная. Используется в INPUTLN, ERRTR2
RAM:FDBA .block 1
RAM:FDBB .block 1
RAM:FDBC .block 1
RAM:FDBD SCRTMP1: .block 1 ; Экранные временные переменные.
RAM:FDBE SCRTMP2: .block 1 ; Экранные временные переменные.
RAM:FDBF SCRTMP3: .block 1 ; Экранные временные переменные.
RAM:FDC0 EVNTTAB: .block 1 ; DATA XREF: KBD2r
RAM:FDC0 ; CHECKENOUGHMEM+1899w ...
RAM:FDC0 ; Таблица событий.
RAM:FDC0 ; (УПР/СТОП + 10 функциональных клавиш)
RAM:FDC0 ; Бит 0 - маска события
RAM:FDC0 ; Бит 2 - событие
RAM:FDC1 .block 1
RAM:FDC2 .block 1
RAM:FDC3 KBDTMPBUF: .block 21h ; DATA XREF: KBD+110o
RAM:FDC3 ; Временный буфер клавиатуры
RAM:FDE4 ERLTMP: .block 2 ; Временная переменная функции ERL
RAM:FDE6 ERRES: .block 2 ; Временная переменная обработчика ошибок.
RAM:FDE8 .block 1
RAM:FDE9 .block 1
RAM:FDEA SYMTMP: .block 1 ; Временная переменная. Используется SYMSCR.
RAM:FDEB MODE1FLG: .block 1 ; DATA XREF: SETMODE3+26r
RAM:FDEB ; SETMODE3+2Ew ...
RAM:FDEB ; Флаги режима 1
RAM:FDEC .block 1
RAM:FDED .block 1
RAM:FDEE .block 1
RAM:FDEF .block 1
RAM:FDF0 SALOTMP: .block 2 ; DATA XREF: SALOTR+11o
RAM:FDF0 ; SALOTR+1Fw ...
RAM:FDF0 ; Временная переменная подпрограммы работы с лентой SALOTR
RAM:FDF2 SALOTMP3: .block 2 ; Временная переменная подпрограммы работы с лентой SALOTR
RAM:FDF4 .block 1
RAM:FDF5 .block 1
RAM:FDF6 .block 1
RAM:FDF7 .block 1
RAM:FDF8 .block 1
RAM:FDF9 .block 1
RAM:FDFA .block 1
RAM:FDFB .block 1
RAM:FDFC .block 1
RAM:FDFD .block 1
RAM:FDFE .block 1
RAM:FDFF .block 1
RAM:FE00 .block 1
RAM:FE01 .block 1
RAM:FE02 INTTMP3: .block 1 ; Переменная обработчика прерываний
RAM:FE03 PSETX: .block 1 ; DATA XREF: PSETTR+15w
RAM:FE03 ; ROM:1EF3r ...
RAM:FE03 ; Координата X команды PSET в виде байта
RAM:FE04 PSETY: .block 1 ; DATA XREF: PSETTR+21w
RAM:FE04 ; PUTTR+27r ...
RAM:FE04 ; Координата Y команды PSET в виде байта
RAM:FE05 VIDEO3: .block 1 ; Видео-переменная. Используется в PUTTR и VIDEOTR
RAM:FE06 PUTTRTMP: .block 1 ; Временная переменная PUTTR
RAM:FE07 VIDEO1: .block 1 ; Видео-переменная. Используется в PUTTR и VIDEOTR
RAM:FE08 VIDEO2: .block 1 ; Видео-переменная. Используется в PUTTR и VIDEOTR
RAM:FE09 VIDEO4: .block 1 ; Видео-переменная. Используется в PUTTR и VIDEOTR
RAM:FE0A PUTTRTMP2: .block 1 ; Временная переменная PUTTR
RAM:FE0B VIDEOBUF: .block 0CAh ; DATA XREF: PUTTR+9Ao
RAM:FE0B ; VIDEOTR:loc_20CFo
RAM:FE0B ; Видеобуфер. Используется командами PUT и GET (PUTTR, VIDEOTR)
RAM:FED5 ERRTRTMP2: .block 2 ; Временная переменная обработчика ошибок ERRTR
RAM:FED7 ERRTRTMP: .block 2 ; Временная переменная обработчика ошибок ERRTR, ERRTR2 и RESUME.
RAM:FED9 ASITT: .block 1 ; Временная переменная. Используется в AUTO, STOP, INPUTLN, TOKENIZE, TRETLINE
RAM:FEDA AITMP: .block 2 ; Временная переменная. Используется в командах AUTO и INPUTLN
RAM:FEDC TMPBUF: .block 123h ; Временный буфер CLOAD
RAM:FEDC ; end of 'RAM'
RAM:FEDC
RAM:FEDC
RAM:FEDC .end