PDA

Просмотр полной версии : Рабочие ячейки Монитора 240.7



tnt23
08.01.2019, 21:12
Для лучшего понимания архитектуры "Океана-240" приходится медитировать и над схемой, и над дизассемблированным наследием. Наковырянное бессистемно складывается на странице http://sensi.org/~tnt23/ok240/index.html, а также будет дублироваться здесь для высокоученых дискуссий.


BFECh - видеорежим (0000vvvv). отображение курсора в монохромном режиме (00000C00), запрет прокрутки в цветном режиме (0000S000)
BFEDh - позиция курсора (строка BFEDh, столбец BFEEh) (2 байта)
BFEFh - инверсия цвета переднего плана
BFF0h - инверсия цвета фона
BFF1h - вертикальный сдвиг
BFF2h - кодовая страница (0 - LAT, 1 - RUS, 2 - заглавная латиница 40h..5fh, заглавная кириллица 60h..7fh)
BFF3h - цвет переднего плана и заднего фона
BFF4h - длительность звукового сигнала (2 байта)
BFF6h - частота звукового сигнала (2 байта)
BFF8h - горизонтальный сдвиг
BFF9h - ? участвует в процедуре вывода звука через порт E2h
BFFAh - ? some 16-bit counter

L Juriy
09.01.2019, 09:44
Мои заметки по этому поводу.

tnt23
09.01.2019, 09:45
Ячейка BFF9h.


Инициализируется при холодном старте значением 4, что соответствует младшему разряду трехбитного ЦАП магнитофонного выхода. Используется в единственном месте - в подпрограмме формирования звукового сигнала:



;-- Beeeeeep:
0x0000e877 2af6bf ld hl, [0xbff6] ; BeepDuration ; [0xbff6:2]=0xffff
0x0000e87a eb ex de, hl
0x0000e87b 2af4bf ld hl, [0xbff4] ; BeepFreq ; [0xbff4:2]=0xffff
0x0000e87e 3e36 ld a, 0x36
0x0000e880 d363 out [0x63], a
0x0000e882 7d ld a, l
0x0000e883 d360 out [0x60], a
0x0000e885 7c ld a, h
0x0000e886 d360 out [0x60], a
0x0000e888 3af9bf ld a, [0xbff9]
0x0000e88b 47 ld b, a
.-> 0x0000e88c 7a ld a, d
: 0x0000e88d b3 or e
: 0x0000e88e c8 ret z
: 0x0000e88f 1b dec de
: 0x0000e890 78 ld a, b
: 0x0000e891 ee08 xor 0x08
: 0x0000e893 47 ld b, a
: 0x0000e894 d3e2 out [0xe2], a
.--> 0x0000e896 db80 in a, [0x80]



Зачем это может быть нужно, я пока не пойму. Для вывода звука также и через магнитофонный выход?

Denn
19.03.2019, 17:52
Тоже пытаюсь понять инженерную мысль сего интересного и замечательного ПК с помощью дизассемблирования его Монитора.

Вот мои потуги "вскрытия шифра" на данный момент:




; Монитор ПК "ОКЕАН-240"
; Disassembler v2.1 (DSDOS)
; 11-19.03.2019 by Denn

mode 3
cpu 0
file MON_O240

STACK:EQU 0BFD0h ; вершина стека

B_BOOT:EQU 0D600h ; а/н загрузчика ОС


; *** ПОРТЫ ***

; Порт клавиатуры, магнитофона и внешнего ПЗУ
PT_KBRD_A:EQU 40h ; линия A:
; клавиатура и внешнее ПЗУ
PT_KBRD_B:EQU 41h ; линия B:
; B0,B1 - анализ ГО и ГК
; B2,B3 - вход МГ
; B4 - подтвержд-е принтера
PT_KBRD_C:EQU 42h ; линия C:
; клавиатура и внешнее ПЗУ
PT_KBRD_M:EQU 43h ; конфигурация порта


; Порт системного таймера (ВИ53)
PT_CLK_0:EQU 60h ; системный счетчик (RST 4)
PT_CLK_1:EQU 61h ; тактирование RS-232 (ВВ51)
; PT_CLK_2:EQU 62h ; пользовательский (в Мониторе не используется!)
PT_CLK_3:EQU 63h ; регистр задания режима


; Порт контроллера прерываний (ВН59)
PT_INT_0:EQU 80h ;
PT_INT_1:EQU 81h ;
; RST0 - системное прерывание
; RST1 - прерывание от клавиатуры
; RST2 - прерывание от RS-232
; RST3 - готовность принтера
; RST4 - прерывание системного таймера
; RST5 - прерывание по питанию
; RST6, RST7 - пользовательские


; Порт RS-232 (ВВ51)
PT_UART_DAT:EQU 0A0h ; данные
PT_UART_STT:EQU 0A1h ; команда/статус


; Порт конфигурации и выбора банков ЗУ
; (только запись)
PT_VSCRL:EQU 0C0h ; упр. верт. сдвигом изобр.
PT_BANKS:EQU 0C1h ; комм. банков ОЗУ и ПЗУ
PT_HSCRL:EQU 0C2h ; упр. гориз. сдвигом изоб.
PT_CFG_M:EQU 0C3h ; рег. задания режима (0)


; Порт осн/доп ОЗУ, принтер, цвет, упр. МГ
; (только запись)
PT_PRN_OUT:EQU 0E0h ; выдача инф. на принтер
PT_SCR_MODE:EQU 0E1h ; режим отображения:
; B0..B2 - комбин. цветов
; B3..B5 - задание фона
; B6 - монохром/цвет
; B7 - основной/доп. экран
PT_TAPE_SND:EQU 0E2h ; магнитофон, звук:
; C0..C2 - запись на МГ
; C3 - звук (beeper)
; C4 - строб принтера
; C5..C7 - дист. управл. МГ
PT_CFG2_M:EQU 0E3h ; рег-р задания режима (0)


; Порт USER1 (ВВ55)

; PT_USER1_A:EQU 00h ; линия A
; PT_USER1_B:EQU 01h ; линия B
; PT_USER1_C:EQU 02h ; линия C
; PT_USER1_M:EQU 03h ; задание режима порта


; Порт USER2 (ВВ55)

; PT_USER2_A:EQU 20h ; линия A
; PT_USER2_B:EQU 21h ; линия B
; PT_USER2_C:EQU 22h ; линия C
; PT_USER2_M:EQU 23h ; задание режима порта


; Системные переменные

MBF00:EQU 0BF00h; буфер (LdSvTAPE)

MBFD8:EQU 0BFD8h; сохр. указателя стека (RST1)
MBFDC:EQU 0BFDCh; адрес перехода CMD_GOTO
MBFDD:EQU 0BFDDh; только запись! RST1 и GOTO
MBFDA:EQU 0BFDAh; сохранение HL (RST1/GOTO)
MBFDF:EQU 0BFDFh; переменные п/п PRC

MBFE0:EQU 0BFE0h; переменные п/п PRC
MBFE2:EQU 0BFE2h; используется много где...
MBFE3:EQU 0BFE3h
MBFE4:EQU 0BFE4h; один раз на чтение ???
MBFE5:EQU 0BFE5h; --||--
MBFE6:EQU 0BFE6h; какая-то переменная ???
MBFEC:EQU 0BFECh; видеорежим (0000xxxx)
MBFED:EQU 0BFEDh; позиция курсора по Y
MBFEE:EQU 0BFEEh; позиция курсора по X
MBFEF:EQU 0BFEFh; инверсия цвета FG

MBFF0:EQU 0BFF0h; инверсия цвета BG
MBFF1:EQU 0BFF1h; вертикальный сдвиг
MBFF2:EQU 0BFF2h; 0-LAT, 1-РУС, 2-???
MBFF3:EQU 0BFF3h; цвет FG и BG
WBFF4:EQU 0BFF4h; длительность зв. сигнала
WBFF6:EQU 0BFF6h; частота зв. сигнала
MBFF8:EQU 0BFF8h; горизонтальный сдвиг
MBFF9:EQU 0BFF9h; бит.маска генер. зв. bell
WBFFA:EQU 0BFFAh; перем. обсл. принтера


ORG 0E000h

; керналь п/п Монитора
JMP RESET ; E000h - инициализация (сброс)
JMP HotSTART ; E003h - горячий старт
JMP KbdSTAT ; E006h - состояние клавиатуры
JMP INKEY ; E009h - ввод с консоли
JMP PRINT_C ; E00Ch - вывод на консоль
JMP LdUART ; E00Fh - ввод с УСАПП (ВВ51)
JMP SvUART ; E012h - вывод в УСАПП (ВВ51)
JMP PRN_C ; E015h - вывод на принтер
JMP LdDUMP ; E018h - чтение блока с диска
JMP SvDUMP ; E01Bh - запись блока на диск
JMP LdSECT ; E01Eh - чтение сектора с диска
JMP SvSECT ; E021h - запись сектора на диск
JMP LdTAPE ; E024h - чтение с магнитофона
JMP SvTAPE ; E027h - запись на магнитофон
JMP GetTAPE ; E02Ah - чтение данных с МЛ
JMP FndBLOK ; E02Dh - проверка наличия блока


RESET:
; "Холодный сброс"
DI

; инициализация портов
MVI A,80h
OUT PT_CFG_M ; C3h
OUT PT_CFG2_M ; E3h
; клавиатура
MVI A,93h
OUT PT_KBRD_M ; 43h
; принтер, режим цветов, осн/доп ОЗУ, упр. МГ
MVI A,7Fh ; 0111 1111
OUT PT_SCR_MODE ; E1h
; скролл, банк ЗУ
MVI A,01h ; 0000 0001
OUT PT_BANKS ; C1h

; обнуление области 3F00..40FFh
MVI B,0
LXI H,3F00h
MOV A,H
ADI 41h

;$-3
MOV M,B
INX H
CMP H
JNZ $-3

; инициализация номера банка и скролла
MVI A,00h ; 0000 0000
OUT PT_BANKS ; C1h
MVI A,07h ; 0000 0111
OUT PT_HSCRL ; C2h
STA MBFF8

; инициализация переменных
XRA A ; [A]=00h
STA MBFEC
STA MBFF1
STA MBFF0

CMA ; [A]=FFh
STA MBFEF

MVI A,03h
STA MBFF3
;
MVI A,43h ; 0100 0011
OUT PT_SCR_MODE ; E1h
MVI A,04h ; 0000 0100
OUT PT_TAPE_SND ; E2h
STA MBFF9
; инициализация частота/длит. bell
LXI H,0400h
SHLD WBFF4
LXI H,0140h
SHLD WBFF6

; инициализация УСАПП (ВВ51)
MVI A,0CEh ; 1100 1110
OUT PT_UART_STT ; A1h
MVI A,25h ; 0010 0101
OUT PT_UART_STT ; A1h

; инициализация таймера (ВИ53)
MVI A,76h ; 0111 0110
OUT PT_CLK_3 ; 63h
MVI A,14h ; 0001 0100
OUT PT_CLK_1 ; 61h
XRA A ; 0000 0000
OUT PT_CLK_1 ; 61h

; инициализация контроллера прерываний (ВН59)
MVI A,12h ; 0001 0010
OUT PT_INT_0 ; 80h
XRA A ; 0000 0000
OUT PT_INT_1 ; 81h
CMA ; 1111 1111
OUT PT_INT_1 ; 81h
MVI A,20h ; 0010 0000
OUT PT_INT_0 ; 80h
MVI A,0Ah ; 0000 1010
OUT PT_INT_0 ; 80h

; инициализация клавиатуры
MVI A,80h
OUT PT_KBRD_C ; 42h
NOP
NOP
XRA A
OUT PT_KBRD_C ; 42h

; настройка стека
LXI SP,STACK
CALL ME75B

; инициализация переменной стека ???
LXI H,0BFC0h
SHLD MBFD8

; инициализация RST1-перехода
MVI A,0C3h
STA 0008h
LXI H,CallRST1
SHLD 0009h

; подача звукового сигнала
MVI C,7
CALL PRINT_C

; ветвление по наличию загрузчика ОС (C3@D600h)
LDA B_BOOT ; 0D600h
CPI 0C3h ; код команды JMP addr
JZ B_BOOT

; вывод заставки Монитора
LXI H,T_HEADER

;$-10
MOV C,M
MOV A,C
ORA A
JZ HotSTART
CALL PRINT_C
INX H
JMP $-10

T_HEADER:DB 13,10,'240/7 MONITOR',13,10,0


START0:
LXI H,STACK
SPHL
CALL ME2D7
INX H

HotSTART:
; *** Горячий старт ***
LXI H,STACK
SPHL
DI
CALL ME2CE
CALL ME2D7
MVI L,0CDh
INX D
POP PSW
CPI 13
JZ HotSTART

; обработка команд Монитора
LXI H,CmdTABLE
MVI C,11

;$-8
CMP M
JZ _CMD_EXEC
INX H
INX H
INX H
DCR C
JNZ $-8
JMP START0

_CMD_EXEC:
; взятие адреса п/п из таблицы переходов
INX H
MOV A,M
INX H
MOV H,M
MOV L,A
LXI D,HotSTART
PUSH D
MVI C,2
PCHL


CmdTABLE:
; Таблица переходов команд Монитора
DB 'D'
DW CMD_DUMP

DB 'F'
DW CMD_FILL

DB 'G'
DW CMD_GOTO

DB 'L'
DW CMD_LOAD

DB 'M'
DW CMD_MOVE

DB 'R'
DW CMD_READ

DB 'S'
DW CMD_SRCH

DB 'W'
DW CMD_WRITE

DB 'X'
DW CMD_XREG

DB 'B'
DW CMD_BLOK

DB 'A'
DW CMD_ABLK


; *** Команды монитора ***

CMD_BLOK:
; Команда 'B'
DCR C
CALL InpADDR
POP D
LXI H,0100h
CALL LdSECT
RET


CMD_ABLK:
; Команда 'A'
DCR C
CALL InpADDR
POP D
LXI H,0100h
CALL SvSECT
RET


CMD_DUMP:
; Команда 'D' - вывод дампа ОЗУ
DCR C
CALL InpADDR
POP H
LXI D,007Fh
XCHG
DAD D
XCHG

CMD_DUMP1:
CALL ME2CE
CALL PrSPACE
CALL PRINT[HL]

CMD_DUMP2:
CALL PrSPACE
MOV A,M
CALL PRINT_BYTE
CALL DecHD0
RC
MOV A,L
ANI 07h
JNZ CMD_DUMP2
JMP CMD_DUMP1


CMD_FILL:
; Команда 'F'
INR C
CALL InpADDR
POP B
POP D
POP H

;$-4
MOV M,C
CALL DecHD0
JNC $-4
RET


CMD_MOVE:
; Команда 'M'
INR C
CALL InpADDR
POP B
POP D
POP H

;$-6
MOV A,M
STAX B
INX B
CALL DecHD0
JNC $-6
RET


CMD_LOAD:
; Команда 'L'
CALL TypeDIG
JNC START0
CALL ME2CE

CMD_LOAD1:
CALL LdUART
CPI 3Ah
JNZ CMD_LOAD1
XRA A
MOV D,A
CALL LwUART
JZ CMD_LOAD2
MOV E,A
CALL LwUART
MOV H,A
CALL LwUART
MOV L,A
CALL LwUART
MOV C,E

;$-6
CALL LwUART
MOV M,A
INX H
DCR E
JNZ $-6
CALL LwUART
JNZ START0
JMP CMD_LOAD1

CMD_LOAD2:
CALL LwUART
CALL LwUART
CALL LwUART
CALL LwUART
JNZ START0
RET


CMD_SRCH:
; Команда 'S'
CALL InpDIG
RC

CMD_SRCH1:
MOV A,M
CALL PRINT_BYTE
CALL ME2D7
DCR L
CALL TypeDIG
RC
JZ CMD_SRCH2
XCHG
CALL InpDIG1
XCHG
MOV M,E
RC

CMD_SRCH2:
INX H
JMP CMD_SRCH1


CMD_XREG:
; Команда 'X'
LXI H,TAB_REGS
CALL TypeDIG
JC CMD_XREG3
MVI C,9

;$-8
CMP M
JZ CMD_XREG1
INX H
INX H
INX H
DCR C
JNZ $-8
JMP START0

CMD_XREG1:
CALL PrSPACE
CALL CMD_XREG5
CALL ME2D7
DCR L
CALL TypeDIG
RC
JZ START0
PUSH B
CALL InpDIG1
MOV A,L
STAX D
POP PSW
ORA A
JM CMD_XREG2
INX D
MOV A,H
STAX D

CMD_XREG2:
CALL ME2CE
RET

CMD_XREG3:
CALL ME2CE

CMD_XREG4:
XRA A
ORA M
RM
CPI 4Dh
CZ ME2CE
CALL PrSPACE
MOV C,M
CALL ME2FA
CALL ME2D7
DCR A
CALL CMD_XREG5
JMP CMD_XREG4


; Таблица регистров для команды 'X'

TAB_REGS:
DB 'A',0D7h,00h,'B',0D3h,00h,'C',0D2h,00h
DB 'D',0D1h,00h,'E',0D0h,00h,'F',0D6h,00h
DB 'M',0DBh,01h,'P',0DEh,01h,'S',0D9h,01h
DB 0FFh


KbdSTAT:
; Проверка состояния клавиатуры [E006h]
; O: [A]=00h - не нажато, FFh - нажато
IN PT_INT_0 ; 80h
NOP
ANI 02h ; 0000 0010
MVI A,0
RZ
CMA
RET


LdUART:
; Ввод с УСАПП [E00Fh]
; O: [A]=считанный байт
IN PT_UART_STT ; A1h
ANI 02h ; 0000 0010
JZ LdUART
IN PT_UART_DAT ; A0h
ANI 7Fh
RET


INKEY:
; Ввод символа с клавиатуры [E009h]
CALL KbdSTAT
ORA A
JZ INKEY
IN PT_KBRD_A ; 40h
ANI 7Fh
PUSH PSW
MVI A,80h
OUT PT_KBRD_C ; 42h
XRA A
OUT PT_KBRD_C ; 42h
POP PSW
RET


SvUART:
; Вывод в УСАПП [E012h]
; O: [C]-записываемый байт
IN PT_UART_STT ; A1h
ANI 01h ; 0000 0001
JZ SvUART
MOV A,C
OUT PT_UART_DAT ; A0h
RET


IfTYPE:
CALL KbdSTAT
ORA A
RZ
JMP TYPE


ME2CE:
CALL ME2D7
DCR C
CALL ME2D7
LDAX B
RET


ME2D7:
XTHL
MOV C,M
INX H
XTHL
JMP ME2FA


PRN_C:
; Вывод символа на принтер [E015h]
; I: [C]=выводимый символ
;$-4
IN PT_INT_0 ; 80h
ANI 08h ; 0000 1000
JZ $-4
MOV A,C
OUT PT_PRN_OUT ; E0h
MVI A,14h
OUT PT_TAPE_SND ; E2h

;$-4
IN PT_INT_0 ; 80h
ANI 08h ; 0000 1000
JNZ $-4
MVI A,4
OUT PT_TAPE_SND ; E2h
RET


PrSPACE:
MVI C,' '

ME2FA:
CALL IfTYPE

PRINT_C:
; Вывод символа на экран [E00Ch]
; I: [C]=код символа
PUSH H
PUSH D
PUSH B
CALL PRC
POP B
POP D
POP H
RET

PRC:
LXI D,MBFDF
LDAX D
DCR A
ORA A
JM PRC_9
JNZ PRC_15
INX D
LDAX D
ORA A
JP PRC_1
MOV A,C
ANI 0Fh
STAX D
INX D
XRA A
STAX D
RET

PRC_1:
LXI H,MBFE0
MOV B,M
INX H
MOV A,M
INR A
MOV M,A
MOV E,A
MVI D,0
DAD D
MOV M,C
LXI H,ME39D
MOV E,B
DAD D
CMP M
RM
LDA MBFE0
ANI 0Fh
CPI 0Fh
JZ PRC_2
CPI 4
JP PRC_6

PRC_2:
LXI H,MBFE2
MOV D,H
MOV E,L
MVI C,4

PRC_3:
MOV A,M
CPI '9'+1
JM PRC_4
SUI 7

PRC_4:
ANI 0Fh
ADD A
ADD A
ADD A
ADD A
MOV B,A
INX H
MOV A,M
CPI '9'+1
JM PRC_5
SUI 7

PRC_5:
ANI 0Fh
ORA B
INX H
STAX D
INX D
DCR C
JNZ PRC_3

PRC_6:
LXI H,MBFE0
MOV A,M
ANI 0Fh
MOV E,A
DCX H
ORA A
MVI M,2
RZ
MVI D,0
MOV M,D
DCX D
LXI H,TAB_PRC
DAD D
DAD D
MOV E,M
INX H
MOV D,M
XCHG
CPI 4
JP PRC_7
LDA MBFEC
ANI 07h ; 0000 0111
JNZ PRC_8

PRC_7:
LXI D,PRC_8
PUSH D
PCHL

PRC_8:
XRA A
STA MBFDF
RET


ME39D:
; Константы п/п "PRC"
DB 4,8,8,4,1,2
DDB 1,9
DB 8


TAB_PRC:
; Таблица переходов, подпрограммы 1..15
DW PP_01
DW PP_02
DW PP_03
DW PP_04
DW PP_05
DW PP_06
DW PP_07
DW PP_08
DW PP_09
DW PP_10
DW PP_11
DW PP_12
DW PP_13
DW PP_14
DW PP_15

PP_11:
PP_12:
PP_13:
PP_14:
RET


PP_15:
LXI D,MBFE2
LDAX D
MOV H,A
INX D
LDAX D
MOV L,A
SHLD WBFF4
INX D
LDAX D
MOV H,A
INX D
LDAX D
MOV L,A
SHLD WBFF6
RET


PP_09:
POP D
XRA A
STA MBFDF
LDA MBFEC
RET


PP_10:
LDA MBFEC
ANI 07h ; 0000 0111
RNZ
LXI D,30FFh
CALL ME413
DCR E
MVI D,0F0h

PP_10_1:
CALL KbdSTAT
ORA A
JZ PP_10_2
CALL INKEY
CPI 1Bh ; [Esc]
RZ

PP_10_2:
CALL ME413
DCR E
JNZ PP_10_1
MVI D,0E0h
CALL ME413
RET


ME413:
; Подпрограмма
LXI H,ME482
CALL PRN_MSG
LXI H,4
SHLD WBFFA
MVI B,0

_ME421:
MVI C,0
CALL ME48D
ANA D
CNZ ME460
LHLD WBFFA
INX H
SHLD WBFFA
MVI C,1
CALL ME48D
ANA D
CNZ ME460
LHLD WBFFA
INX H
SHLD WBFFA
INR B
MOV A,B
CPI 0ECh
JC _ME421
LXI H,ME47E
CALL PRN_MSG
RET


PRN_MSG:
; Подпрограмма вывода данных на принтер
PUSH B

PRN_MSG1:
MOV A,M
CPI 1Ah ; признак конца данных
JZ PRN_MSG2
MOV C,A
CALL PRN_C
INX H
JMP PRN_MSG1

PRN_MSG2:
POP B
RET


ME460:
; Подпрограмма
PUSH PSW
LXI H,ME487
CALL PRN_MSG
LHLD WBFFA
MOV C,H
CALL PRN_C
MOV C,L
CALL PRN_C
LXI H,ME48A
CALL PRN_MSG
POP PSW
MOV C,A
CALL PRN_C
RET


; управляющие коды принтера

ME47E:DB 1Bh,5Ah,2,1Ah

ME482:DB 1Bh,58h,0,0,1Ah

ME487:DB 1Bh,58h,1Ah

ME48A:DB 1Bh,4Fh,1Ah


ME48D:
; Подпрограмма
LDA MBFF1
ADD B
ADI 13h
MOV L,A
PUSH D
PUSH B
MOV A,E
ANI 07h ; 0000 0111
MOV B,A
MOV A,E
RAR
RAR
RAR
ANI 1Fh ; 0001 1111
ADD A
ADI 40h
MOV H,A
MOV A,C
ANI 01h ; 0000 0001
ADD H
MOV H,A
MVI A,1
OUT PT_BANKS ; C1h
MOV E,M
INR H
INR H
MOV D,M
MVI A,0
OUT PT_BANKS ; C1h

;$-10
DCR B
JM _ME4C2
MOV A,D
RAR
MOV D,A
MOV A,E
RAR
MOV E,A
JMP $-10

_ME4C2:
MOV A,E
MVI D,0
RAR
JNC $+5
MVI D,30h
;$+5
RAR
JNC _ME4D3
MOV A,D
ORI 0C0h
MOV D,A

_ME4D3:
MOV A,D
POP B
POP D
RET


PP_08:
; Подпрограмма
LDA MBFE2
ANI 3Fh
STA MBFF3
MOV B,A
LDA MBFEC
ANI 07h ; 0000 0111
MVI A,0
JNZ $+5
MVI A,40h
;$+5
ORA B
OUT PT_SCR_MODE ; E1h
RET


PP_07:
LDA MBFE2
ANI 03h ; 0000 0011
STA MBFF2
RET


ME4F9:
; Подпрограмма
MOV L,A
MOV E,A
XRA A
MOV D,A
MOV H,A
DAD H
DAD D
DAD H
DAD D
MOV A,E
CPI '@' ; 40h
JM ME51D
LDA MBFF2
ORA A
JZ ME51D
DCR A
JZ _ME519
MOV A,E
CPI '`' ; 60h
JM ME51D

_ME519:
LXI D,01C0h
DAD D

ME51D:
LXI D,0EB28h
DAD D
RET

PRC_9:
MOV A,C
ANI 7Fh ; 0111 1111
CPI ' '
JM PRC_10
CALL ME4F9
XCHG
LHLD MBFED
LDA MBFF1
ADD L
MOV L,A
MOV A,H
ADI 40h
MOV H,A
MVI C,7
LDA MBFEC
ANI 07h ; 0000 0111
JNZ _ME63F
MVI A,1
OUT PT_BANKS ; C1h
XCHG
XRA A
STAX D
INR D
STAX D
DCR D
INR E

;$-17
LDA MBFEF
ANA M
ADD A
STAX D
INR D
LDA MBFF0
ANA M
ADD A
STAX D
DCR D
INX H
INR E
DCR C
JNZ $-17

MVI A,0
OUT PT_BANKS ; C1h
LXI H,ME75B
PUSH H
LXI H,MBFED
LDA MBFEC
ANI 08h ; 0000 1000
JNZ IF_RIGHT

PRC_RIGHT:
INX H
MOV A,M
ADI 2
ANI 3Fh ; 0011 1111
MOV M,A
DCX H
RNZ

PRC_DOWN:
MOV A,M
ADI 0Eh
CPI 0FAh
JNC _ME589
MOV M,A
RET

_ME589:
LDA MBFF1
ADI 0Eh
OUT PT_VSCRL ; C0h
STA MBFF1
LXI H,40F0h
ADD L
MOV L,A
DCR L
DCR L
MOV C,H
MVI A,1
OUT PT_BANKS ; C1h
XRA A
LXI D,1240h

_ME5A3:
MOV H,C
MOV B,E
;$-3
MOV M,A
INR H
DCR B
JNZ $-3
INR L
DCR D
JNZ _ME5A3
MVI A,0
OUT PT_BANKS ; C1h
RET


PRC_LEFT:
INX H
MOV A,M
SUI 2
ANI 3Fh ; 0011 1111
MOV M,A
CPI 3Eh
DCX H
RNZ

PRC_UP:
MOV A,M
SUI 0Eh
JNC $+5
MVI A,0EEh
;$+5
MOV M,A
RET


PRC_TAB:
INX H
MOV A,M
ADI 16
ANI 30h
MOV M,A
DCX H
RNZ
JMP PRC_DOWN


IF_TAB:
INX H
MOV A,M
ADI 16
ANI 30h
MOV M,A
DCX H
RNZ
JMP IF_PS


IF_RIGHT:
INX H
MOV A,M
ADI 2
ANI 3Fh
MOV M,A
DCX H
RNZ

IF_PS:
MOV A,M
ADI 0Ch
CPI 10h
JNC _ME5F5
MOV M,A
RET

_ME5F5:
LDA MBFF1
MOV L,A
ADI 0Ch
MOV E,A
MVI C,8
MVI A,1
OUT PT_BANKS ; C1h

_ME602:
MVI B,40h
MVI H,40h
MOV D,H

;$-5
LDAX D
MOV M,A
INR H
INR D
DCR B
JNZ $-5
INR L
INR E
DCR C
JNZ _ME602
MVI C,0Ch
LDA MBFF1
ADI 8
MOV E,A

_ME61D:
MVI B,40h
MVI D,40h
XRA A

;$-3
STAX D
INR D
DCR B
JNZ $-3
INR E
DCR C
JNZ _ME61D
MVI A,0
OUT PT_BANKS ; C1h
RET


IF_LEFT:
INX H
MOV A,M
ORA A
DCX H
RZ
INX H
SUI 2
ANI 3Fh ; 0011 1111
MOV M,A
DCX H
RET


_ME63F:
LDA MBFEC
ANI 2
JNZ _ME6C1
MVI A,1
OUT PT_BANKS ; C1h
XCHG
XRA A
STAX D
INR E

;$-6
MOV A,M
ADD A
STAX D
INX H
INR E
DCR C
JNZ $-6
MVI A,0
OUT PT_BANKS ; C1h
LXI H,ME75B
PUSH H
LXI H,MBFED

MK_RIGHT:
INX H
MOV A,M
ADI 1
ANI 3Fh
MOV M,A
DCX H
RNZ

MK_DOWN:
MOV A,M
ADI 0Bh
CPI 0FAh
JNC $+5
MOV M,A
RET

;$+5
LDA MBFF1
ADI 0Bh
OUT PT_VSCRL ; C0h
STA MBFF1
LXI H,40F0h
ADD L
MOV L,A
MOV C,H
MVI A,1
OUT PT_BANKS ; C1h
XRA A
LXI D,1040h

_ME68E:
MOV H,C
MOV B,E

;$-3
MOV M,A
INR H
DCR B
JNZ $-3
INR L
DCR D
JNZ _ME68E
MVI A,0
OUT PT_BANKS ; C1h
RET


MK_LEFT:
INX H
MOV A,M
SUI 1
ANI 3Fh
MOV M,A
CPI 3Fh
DCX H
RNZ

MK_UP:
MOV A,M
SUI 0Bh
JNC $+5
MVI A,0F2h

;$+5
MOV M,A
RET


MK_TAB:
INX H
MOV A,M
ADI 8
ANI 38h
MOV M,A
DCX H
RNZ
JMP MK_DOWN


_ME6C1:
LDA MBFEE
CPI 40h
JM _ME6D0
LXI H,MBFED
CALL ME75B
RET

_ME6D0:
MVI A,1
OUT PT_BANKS ; C1h
XCHG
XRA A
STAX D
INR E

;$-6
MOV A,M
ADD A
STAX D
INX H
INR E
DCR C
JNZ $-6

MVI A,0
OUT PT_BANKS ; C1h
LXI H,ME75B
PUSH H
LXI H,MBFED
INX H
MOV A,M
ADI 1
CPI 40h
JM $+5
MVI A,40h

;$+5
MOV M,A
DCX H
RET


PRC_STR:
LDA MBFEC
ANI 08h ; 0000 1000
JNZ IF_STR
MVI A,7Fh
OUT PT_SCR_MODE ; E1h
MVI A,1
OUT PT_BANKS ; C1h
LXI D,4000h
XCHG
MOV A,H
ADI 40h
MVI B,0
; обнуление ОЗУ 4000..7FFFh
;$-3
MOV M,B
INX H
CMP H
JNZ $-3
XCHG
LDA MBFF3
MOV B,A
LDA MBFEC
ANI 07h ; 0000 0111
MVI A,0
JNZ $+5
MVI A,40h
;$+5
ORA B
OUT PT_SCR_MODE ; E1h

PRC_HOME:
XRA A
NOP
NOP
MOV M,A
INX H
XRA A
MOV M,A
DCX H
MVI A,0
OUT PT_BANKS ; C1h
RET


IF_STR:
LDA MBFF1
MOV L,A
MVI C,14h
MVI A,1
OUT PT_BANKS ; C1h

IF_STR1:
MVI H,40h
MVI B,40h
XRA A

;$-3
MOV M,A
INR H
DCR B
JNZ $-3

INR L
DCR C
JNZ IF_STR1
MVI A,0
OUT PT_BANKS ; C1h
JMP PRC_HOME


ME75B:
; Подпрограмма
LDA MBFEC
ANI 04h ; 0000 0100
RNZ
LDA MBFEC
ANI 07h ; 0000 0111
JNZ _ME790
XCHG
LHLD MBFED
LDA MBFF1
ADD L
MOV L,A
MOV A,H
ADI 40h
MOV H,A
MVI A,1
OUT PT_BANKS ; C1h
LXI B,7F08h

;$-10
MOV A,M
XRA B
MOV M,A
INR H
MOV A,M
XRA B
MOV M,A
DCR H
INR L
DCR C
JNZ $-10
XCHG
MVI A,0
OUT PT_BANKS ; C1h
RET

_ME790:
XCHG
LHLD MBFED
LDA MBFF1
ADD L
MOV L,A
MOV A,H
CPI 40h
XCHG
RP
XCHG
ADI 40h
MOV H,A
MVI A,1
OUT PT_BANKS ; C1h
LXI B,7F08h

;$-5
MOV A,M
XRA B
MOV M,A
INR L
DCR C
JNZ $-5
XCHG
MVI A,0
OUT PT_BANKS ; C1h
RET


PRC_10:
CPI 1Bh ; [Esc]
JNZ PRC_11
LXI H,MBFDF
MVI M,01h
INX H
MVI M,0FFh
RET

PRC_11:
CPI 7 ; [BEEP]
JZ PRC_BEEP
LXI H,ME75B
PUSH H
LXI H,MBFED
PUSH PSW
CALL ME75B
LDA MBFEC
ANI 08h ; 0000 1000
JZ PRC_12
POP PSW
CPI 9 ; [Tab]
JZ IF_TAB
CPI 8 ; []
JZ IF_LEFT
CPI 18h ; []
JZ IF_RIGHT
CPI 1Fh ; [СТР]
JZ IF_STR
CPI 10 ; [ПС]
JZ IF_PS
CPI 13 ; [ВК]
RNZ
;IF_BK:
INX H
MVI M,0
DCX H
RET

PRC_12:
POP PSW
CPI 1Fh
JZ PRC_STR
CPI 12
JZ PRC_HOME
PUSH PSW
LDA MBFEC
ANI 07h ; 0000 0111
JNZ PRC_13
POP PSW
CPI 9 ; [Tab]
JZ PRC_TAB
CPI 8 ; []
JZ PRC_LEFT
CPI 18h ; []
JZ PRC_RIGHT
CPI 19h ; []
JZ PRC_UP
CPI 1Ah ; []
JZ PRC_DOWN
CPI 10 ; [│]
JZ PRC_DOWN
CPI 13 ; [
]
RNZ

;PRC_BK:
INX H
MVI M,0
DCX H
RET

PRC_13:
LDA MBFEC
ANI 2
JNZ PRC_14
POP PSW
CPI 9 ; [Tab]
JZ MK_TAB
CPI 8 ; []
JZ MK_LEFT
CPI 18h ; []
JZ MK_RIGHT
CPI 19h ; []
JZ MK_UP
CPI 1Ah ; []
JZ MK_DOWN
CPI 10 ; [│]
JZ MK_DOWN
CPI 13 ; [
]
RNZ

;MK_BK:
INX H
MVI M,0
DCX H
RET

PRC_14:
POP PSW
CPI 10 ; [│]
JZ MK_DOWN
CPI 13 ; [
]
RNZ

;MK_BK:
INX H
MVI M,0
DCX H
RET


PRC_BEEP:
; Выдача звуковогО сигнала клавиатуры
LHLD WBFF6
XCHG
LHLD WBFF4
MVI A,36h
OUT PT_CLK_3 ; 63h
MOV A,L
OUT PT_CLK_0 ; 60h
MOV A,H
OUT PT_CLK_0 ; 60h
LDA MBFF9
MOV B,A

PRC_BEEP1:
MOV A,D
ORA E
RZ
DCX D
MOV A,B
XRI 08h ; 0000 1000
MOV B,A
OUT PT_TAPE_SND ; E2h

;$-4
IN PT_INT_0 ; 80h
ANI 10h
JNZ $-4
MOV A,B
XRI 8
MOV B,A
OUT PT_TAPE_SND ; E2h

;$-4
IN PT_INT_0 ; 80h
ANI 10h
JZ $-4
JMP PRC_BEEP1


PP_05:
LDA MBFEC
ANI 08h ; 0000 1000
RNZ
CALL ME75B
LDA MBFEC
ANI 07h ; 0000 0111
JNZ PP_05_1
LXI D,MBFE2
LXI H,MBFEE
INX D
LDAX D
ANI 1Fh ; 0001 1111
ADD A
MOV M,A
DCX D
DCX H
LDAX D
ANI 1Fh ; 0001 1111
CPI 11h
JC $+5
MVI A,11h
;$+5
MOV B,A
ADD A
ADD B
ADD A
ADD B
ADD A
MOV M,A
CALL ME75B
RET

PP_05_1:
LDA MBFEC
ANI 02h ; 0000 0010
JNZ PP_05_2
LXI D,MBFE2
LXI H,MBFEE
INX D
LDAX D
SUI 20h
ANI 3Fh
MOV M,A
DCX D
DCX H
LDAX D
ANI 1Fh ; 0001 1111
CPI 16h
JC $+5
MVI A,16h
;$+5
MOV B,A
ADD A
ADD A
ADD B
ADD A
ADD B
MOV M,A
CALL ME75B
RET

PP_05_2:
LXI D,MBFE2
LXI H,MBFEE
INX D
LDAX D
SUI 20h
CPI 40h
JM $+5
MVI A,40h
;$+5
MOV M,A
DCX D
DCX H
LDAX D
ANI 1Fh ; 0001 1111
CPI 16h
JC $+5
MVI A,16h
;$+5
MOV B,A
ADD A
ADD A
ADD B
ADD A
ADD B
MOV M,A
CALL ME75B
RET


PP_06:
; Подпрограмма
LXI H,MBFEC
LDA MBFF3
MOV B,A
LDA MBFE2
MOV C,A
ANI 08h ; 0000 1000
MOV A,C
JZ $+5
MVI A,08h
;$+5
ANI 0Fh ; 0000 1111
MOV M,A
ANI 07h ; 0000 0111
MVI A,0
JNZ $+5
MVI A,40h
;$+5
ORA B
OUT PT_SCR_MODE ; E1h
LXI H,MBFED
CALL PRC_STR
CALL ME75B
RET


PP_04:
LDA MBFE2
ANI 03h ; 0000 0011
RAR
MOV B,A
MVI A,0
SBB A
STA MBFEF
MOV A,B
DCR A
CMA
STA MBFF0
RET

PRC_15:
LDA MBFEC
ANI 07h ; 0000 0111
JNZ PRC_8
MOV A,C
ANI 7Fh ; 0111 1111
MOV C,A
CPI ' '
JM PRC_8
LXI H,MBFE2
MOV A,M
MOV E,A
ADI 8
JC PRC_8
MOV M,A
INX H
MVI A,0F7h
CMP M
JC PRC_8
MOV D,M
CALL PRC_17
MOV A,L
SUI 7
MOV L,A
PUSH H
MOV A,C
CALL ME4F9
POP D
MVI C,7

PRC_16:
PUSH H
MVI A,1
OUT PT_BANKS ; C1h
MOV L,M
MVI H,0
MOV A,B
ORA A
JZ PRC_18

;$-2
DAD H
DCR A
JNZ $-2

PRC_18:
XCHG
PUSH B
LDA MBFEF
CMA
MOV B,A
MOV A,M
XRA B
ORA E
XRA B
MOV M,A
INR H
INR H
MOV A,M
XRA B
ORA D
XRA B
MOV M,A
DCR H
LDA MBFF0
CMA
MOV B,A
MOV A,M
XRA B
ORA E
XRA B
MOV M,A
INR H
INR H
MOV A,M
XRA B
ORA D
XRA B
MOV M,A
DCR H
DCR H
DCR H
INR L
XCHG
POP B
MVI A,0
OUT PT_BANKS ; C1h
POP H
INX H
DCR C
JNZ PRC_16
RET


PRC_17:
LDA MBFF1
SUB D
DCR A
MOV L,A
MOV A,E
ANI 07h ; 0000 0111
MOV B,A
MOV A,E
RAR
RAR
ANI 3Eh ; 0011 1110
ADI 40h
MOV H,A
RET


PP_01:
LXI H,MBFE5
LXI D,MBFE3
LDAX D
MOV B,M
CMP B
JNC PP_01_1
MOV M,A
MOV A,B
STAX D

PP_01_1:
DCX D
DCX H
LDAX D
MOV B,M
CMP B
JC PP_01_2
MOV M,A
MOV A,B
STAX D

PP_01_2:
XCHG
MOV E,M
INX H
MOV D,M
CALL PRC_17
PUSH H
XRA A

;$-3
STC
RAL
DCR B
JP $-3

RAR
MOV D,A
LXI H,MBFE4
MOV A,M
ANI 07h ; 0000 0111
MOV B,A
XRA A

;$-3
STC
RAL
DCR B
JP $-3

CMA
MOV E,A
MOV A,M
DCX H
DCX H
SUB M
RRC
RRC
RRC
ANI 1Fh ; 0001 1111
MOV C,A
INX H
MOV A,M
INX H
INX H
SUB M
JNZ $+4
INR A
;$+4
MOV B,A
POP H
MOV A,E
STA MBFE6

PP_01_3:
PUSH D
PUSH H
PUSH B
MVI A,1
OUT PT_BANKS ; C1h
MOV A,C
ORA A
JNZ PP_01_5
MOV A,D
ORA E

PP_01_4:
MOV D,A

PP_01_5:
MOV B,D
XCHG
LHLD MBFEF
XCHG
MOV A,M
XRA E
ANA B
XRA E
MOV M,A
INR H
MOV A,M
XRA D
ANA B
XRA D
MOV M,A
INR H
MOV A,C
ORA A
JZ PP_01_7
DCR C

PP_01_6:
LDA MBFE6
JZ PP_01_4

;$-5
MOV M,E
INR H
MOV M,D
INR H
DCR C
JNZ $-5
JMP PP_01_6

PP_01_7:
MVI A,0
OUT PT_BANKS ; C1h
POP B
POP H
POP D
INR L
DCR B
JNZ PP_01_3
RET


PP_02:
LXI H,MBFE2
MOV E,M
INX H
MOV D,M
INX H
MOV A,M
INX H
MOV H,M
MOV L,A
CMP E
JC $+4
XCHG
;$+4
SHLD MBFE2
MOV A,E
SUB L
MOV L,A
MOV A,D
SUB H
MOV H,A
PUSH PSW
JNC PP_02_1
CMA
INR A
MOV H,A

PP_02_1:
XCHG
LHLD MBFE2
XCHG
JZ PP_02_14
MOV A,L
ORA A
JZ PP_02_10
MOV B,A
POP PSW
MVI A,0
ADC A
STA MBFE6
MOV E,H
MVI C,10h
MVI D,0

PP_02_2:
DAD H
XCHG
DAD H
XCHG
MOV A,D
JC PP_02_3
CMP B
JC PP_02_4

PP_02_3:
SUB B
MOV D,A
INX H

PP_02_4:
DCR C
JNZ PP_02_2
LXI D,0
PUSH D
PUSH H
LHLD MBFE2
XCHG
MOV C,B
CALL PRC_17
MVI A,80h

;$-2
RLC
DCR B
JP $-2
CMA
MOV B,A

PP_02_5:
POP D
XTHL
MOV A,H
DAD D
SUB H
CMA
INR A
XTHL
PUSH D
PUSH B
MOV C,A
XCHG
LHLD MBFEF
XCHG
MVI A,1
OUT PT_BANKS ; C1h
LDA MBFE6
ORA A
JNZ PP_02_7

PP_02_6:
MOV A,M
XRA E
ANA B
XRA E
MOV M,A
INR H
MOV A,M
XRA D
ANA B
XRA D
MOV M,A
DCR H
MOV A,C
ORA A
JZ PP_02_8
DCR C
DCR L
JMP PP_02_6

PP_02_7:
MOV A,M
XRA E
ANA B
XRA E
MOV M,A
INR H
MOV A,M
XRA D
ANA B
XRA D
MOV M,A
DCR H
MOV A,C
ORA A
JZ PP_02_8
DCR C
INR L
JMP PP_02_7

PP_02_8:
MVI A,0
OUT PT_BANKS ; C1h
POP B
MOV A,B
STC
RAL
JC PP_02_9
RAL
INR H
INR H

PP_02_9:
MOV B,A
DCR C
JNZ PP_02_5
POP H
POP H
RET

PP_02_10:
MOV C,H
CALL PRC_17
MVI A,80h

;$-2
RLC
DCR B
JP $-2

CMA
MOV B,A
XCHG
LHLD MBFEF
XCHG
POP PSW
MVI A,1
OUT PT_BANKS ; C1h
JC PP_02_12

PP_02_11:
MOV A,M
XRA E
ANA B
XRA E
MOV M,A
INR H
MOV A,M
XRA D
ANA B
XRA D
MOV M,A
DCR H
MOV A,C
ORA A
JZ PP_02_13
DCR C
DCR L
JMP PP_02_11

PP_02_12:
MOV A,M
XRA E
ANA B
XRA E
MOV M,A
INR H
MOV A,M
XRA D
ANA B
XRA D
MOV M,A
DCR H
MOV A,C
ORA A
JZ PP_02_13
DCR C
INR L
JMP PP_02_12

PP_02_13:
MVI A,0
OUT PT_BANKS ; C1h
RET

PP_02_14:
POP PSW
MOV C,L
MOV A,L
ORA A
JNZ $+4
INR C

;$+4
CALL PRC_17
MVI A,80h

;$-2
RLC
DCR B
JP $-2

CMA
MOV B,A
XCHG
LHLD MBFEF
XCHG
MVI A,1
OUT PT_BANKS ; C1h

PP_02_15:
MOV A,M
XRA E
ANA B
XRA E
MOV M,A
INR H
MOV A,M
XRA D
ANA B
XRA D
MOV M,A
DCR H
MOV A,B
STC
RAL
JC $+6
RAL
INR H
INR H

;$+6
MOV B,A
DCR C
JNZ PP_02_15
MVI A,0
OUT PT_BANKS ; C1h
RET


PP_03:
; Подпрограмма
LHLD MBFE2
XCHG
CALL PRC_17
MVI A,80h

;$-2
RLC
DCR B
JP $-2

MOV B,A
XCHG
LHLD MBFEF
XCHG
MVI A,1
OUT PT_BANKS ; C1h
MOV A,M
XRA B
MOV M,A
INR H
MOV A,M
XRA B
MOV M,A
MVI A,0
OUT PT_BANKS ; C1h
RET


;MEC08:
; включение блока кодов знакогенератора
data FONTS.ZG


; *** Вторая часть (после знакогенератора) ***

LwUART:
PUSH B
CALL LdUART
CALL ChkNUM
RLC
RLC
RLC
RLC
MOV C,A
CALL LdUART
CALL ChkNUM
ORA C
MOV C,A
ADD D
MOV D,A
MOV A,C
POP B
RET


OctToSim:
ANI 0Fh
ADI 90h
DAA
ACI 40h
DAA
MOV C,A
RET


CMD_XREG5:
INX H
MOV E,M
MVI D,0BFh
INX H
MOV B,M
INX H
LDAX D
CALL PRINT_BYTE
DCR B
RM
DCX D
LDAX D
JMP PRINT_BYTE


InpADDR:
CALL InpDIG
XTHL
PUSH H
DCR C
JNC InpADDR1
JNZ START0
RET

InpADDR1:
JNZ InpADDR
JMP START0


DecHD0:
; Подпрограмма [HL]=[HL]-[DE]
; с проверкой [HL] на ноль
INX H
MOV A,H
ORA L
STC
RZ
MOV A,E
SUB L
MOV A,D
SBB H
RET


PRINT[HL]:
; Подпрограмма вывода [HL]
MOV A,H
CALL PRINT_BYTE
MOV A,L

PRINT_BYTE:
PUSH PSW
RRC
RRC
RRC
RRC
CALL PrDIG
POP PSW

PrDIG:
CALL OctToSim
JMP ME2FA


InpDIG:
CALL TypeDIG
JZ START0

InpDIG1:
LXI H,0

InpDIG2:
MOV B,A
CALL ChkNUM
JC InpDIG3
DAD H
DAD H
DAD H
DAD H
ORA L
MOV L,A
CALL TYPE
JMP InpDIG2

InpDIG3:
MOV A,B
CALL ChkSpcComBK
JNZ START0
RET


ChkNUM:
; Подпрограмма
SUI '0'
RC
ADI 0E9h
RC
ADI 6
JP $+6
ADI 7
RC

;$+6
ADI 10
ORA A
RET


TypeDIG:
; Подпрограмма
CALL TYPE

ChkSpcComBK:
CPI ' '
RZ
CPI ','
RZ
CPI 13
STC
RZ
CMC
RET


TYPE:
PUSH B
CALL INKEY
CALL ChkTYPE
CPI 1Bh ; [Esc]
JZ START0
MOV C,A
CALL PRINT_C
MOV A,C
POP B
RET

ChkTYPE:
CPI 61h
RM
CPI 9Bh
RP
ANI 0DFh
RET


CallRST1:
; Обработка прерывания RST 1
DI
SHLD MBFDA
LXI H,2
DAD SP
SHLD MBFD8
POP H
LXI SP,MBFD8
PUSH PSW
MVI A,0
PUSH PSW
MVI A,0
NOP
NOP
PUSH B
PUSH D
MVI A,0
NOP
NOP
SHLD MBFDD
CALL ME2D7
INX H
CALL PRINT[HL]
JMP HotSTART


CMD_GOTO:
CALL TypeDIG
JZ CMD_GOTO1
CALL InpDIG1
SHLD MBFDD

CMD_GOTO1:
JNC START0
CALL ME2CE
MVI A,0C3h
STA MBFDC
LXI SP,STACK
POP D
POP B
POP PSW
NOP
NOP
POP PSW
POP H
SPHL
LHLD MBFDA
JMP MBFDC


CMD_WRITE:
CALL TypeDIG
JNC START0
CALL ME2CE

SvTAPE:
LXI H,MBF00
MVI C,80h

;$-4
MVI M,0
INX H
DCR C
JNZ $-4

LXI H,MBF00
LXI D,0FFFFh
CALL SvDUMP
CALL SvTAPE2
LXI D,0
CALL SvDUMP
CALL SvTAPE2
LXI B,0200h
LXI D,0

SvTAPE1:
PUSH B
LXI H,MBF00
CALL LdSECT
INX D
CALL SvDUMP
CALL SvTAPE2
POP B
DCX B
MOV A,B
ORA C
JNZ SvTAPE1
RET

SvTAPE2:
LXI B,00FAh

SvTAPE3:
DCX B
MOV A,B
ORA C
JNZ SvTAPE3
RET


CMD_READ:
CALL TypeDIG
JNC START0
CALL ME2CE

LdTAPE:
MVI A,64h
CALL GetTAPE
ORA A
JNZ PrBREAK
MVI E,6

LdTAPE1:
DCR E
JZ PrNoStrtREC
LXI H,MBF00
CALL LdDUMP
CPI 4
JZ PrBREAK
ORA A
JNZ LdTAPE1
MOV A,B
ORA C
JNZ LdTAPE1
LXI B,0200h
LXI D,0

LdTAPE2:
PUSH B
CALL LdDUMP
ORA A
JNZ LdTAPE3
DCX B
MOV A,B
CMP D
JNZ PrSEQ
MOV A,C
CMP E
JNZ PrSEQ
CALL SvSECT
INX D
POP B
DCX B
MOV A,B
ORA C
JNZ LdTAPE2
RET

PrNoStrtREC:
LXI H,T_NoStartREC
CALL PRINT_MSG
RET

LdTAPE3:
CPI 2
JZ PrIBG
CPI 4
JZ LdTAPE4
LXI H,T_ChkSUM
CALL PRINT_MSG
CALL PRINT[BC]
POP B
RET

PrSEQ:
LXI H,T_SEQ
CALL PRINT_MSG
INX B
CALL PRINT[BC]
POP B
RET

PrIBG:
LXI H,T_IBG
CALL PRINT_MSG
POP B
RET

LdTAPE4:
POP B

PrBREAK:
LXI H,T_BREAK
CALL PRINT_MSG
RET


PRINT[BC]:
; Подпрограмма вывода [BC]
PUSH B
MOV A,B
CALL PRINT_BYTE
POP B
MOV A,C
CALL PRINT_BYTE
RET



; *** Текстовыйе сообщения ***

T_NoStartREC:DB 'NO START RECORD',0

T_ChkSUM:DB 'CHECKSUM ',0

T_SEQ:DB 'SEQUENCE ',0

T_IBG:DB 'IBG',0

T_BREAK:DB 'BREAK',0


PRINT_MSG:
; Подпрограмма вывода сообщения на экран
; I: [HL]-а/н (/0)
MOV A,M
ORA A
RZ
PUSH B
MOV C,A
CALL PRINT_C
INX H
POP B
JMP PRINT_MSG


LdSECT:
PUSH H
PUSH D
MOV A,D
ANI 01h ; 0000 0001
ORI 02h ; 0000 0010
ORI 00h ; 0000 0000
MOV B,A
XRA A
MOV A,E
RAR
MOV D,A
MVI A,0
RAR
MOV E,A

LdSECT1:
MOV A,B
OUT PT_BANKS ; C1h
LDAX D
MOV C,A
MVI A,0
OUT PT_BANKS ; C1h
MOV M,C
INX H
INX D
MOV A,E
ADD A
JNZ LdSECT1
MVI A,0
OUT PT_BANKS ; C1h
POP D
POP H
RET


SvSECT:
PUSH H
PUSH D
MOV A,D
ANI 01h ; 0000 0001
ORI 02h ; 0000 0010
ORI 00h ; 0000 0000
MOV B,A
XRA A
MOV A,E
RAR
MOV D,A
MVI A,0
RAR
MOV E,A

SvSECT1:
MVI A,0
OUT PT_BANKS ; C1h
MOV C,M
MOV A,B
OUT PT_BANKS ; C1h
MOV A,C
STAX D
INX H
INX D
MOV A,E
ADD A
JNZ SvSECT1
MVI A,0
OUT PT_BANKS ; C1h
POP D
POP H
RET


SvDUMP:
; Запись дампа на диск
PUSH H
PUSH D
PUSH D
LXI B,09F6h
MVI A,0Ah
OUT PT_INT_0 ; 80h
MVI A,36h
OUT PT_CLK_3 ; 63h
MOV A,C
OUT PT_CLK_0 ; 60h
MOV A,B
OUT PT_CLK_0 ; 60h
LXI D,4

SvDUMP1:
IN PT_INT_0 ; 80h
ANI 10h
JNZ SvDUMP1
MOV A,D
CMA
MOV D,A
ORA A
MVI A,5
JNZ $+5
MVI A,3
;$+5
OUT PT_TAPE_SND ; E2h
MVI A,36h
OUT PT_CLK_3 ; 63h
MOV A,C
OUT PT_CLK_0 ; 60h
MOV A,B
OUT PT_CLK_0 ; 60h
DCR E
JNZ SvDUMP1

;$-4
IN PT_INT_0 ; 80h
ANI 10h
JNZ $-4

MVI A,0
CALL MF36B
MVI A,0F5h
CALL MF36B
MVI E,0
POP B
MOV A,C
CALL MF36B
MOV A,B
CALL MF36B
MVI B,80h

;$-6
MOV A,M
CALL MF36B
INX H
DCR B
JNZ $-6

MOV A,E
CALL MF36B
MVI A,0
CALL MF36B

;$-4
IN PT_INT_0 ; 80h
ANI 10h
JNZ $-4

MVI A,4
OUT PT_TAPE_SND ; E2h
POP D
POP H
RET


MF36B:
; Подпрограмма
PUSH B
MOV B,A
MOV A,E
SUB B
MOV E,A
MVI C,8

MF372:
MOV A,B
RAR
MOV B,A
JC MF39E

;$-4
IN PT_INT_0 ; 80h
ANI 10h
JNZ $-4
MVI A,36h
OUT PT_CLK_3 ; 63h
MVI A,68h
OUT PT_CLK_0 ; 60h
MVI A,1
OUT PT_CLK_0 ; 60h
MOV A,D
CMA
MOV D,A
ORA A
MVI A,5
JNZ $+5
MVI A,3
;$+5
OUT PT_TAPE_SND ; E2h
DCR C
JNZ MF372
POP B
RET


MF39E:
IN PT_INT_0 ; 80h
ANI 10h
JNZ MF39E
MVI A,36h
OUT PT_CLK_3 ; 63h
MVI A,94h
OUT PT_CLK_0 ; 60h
MVI A,2
OUT PT_CLK_0 ; 60h
MOV A,D
CMA
MOV D,A
ORA A
MVI A,5
JNZ $+5
MVI A,3
;$+5
OUT PT_TAPE_SND ; E2h
DCR C
JNZ MF372
POP B
RET


LdDUMP:
PUSH H
PUSH D
MVI A,0Ah
OUT PT_INT_0 ; 80h
MVI A,36h
OUT PT_CLK_3 ; 63h
MVI A,0
OUT PT_CLK_0 ; 60h
OUT PT_CLK_0 ; 60h
MVI C,3

LdDUMP1:
CALL MF488
INR A
JZ MF440
MOV A,B
ADI 4
JP LdDUMP1
DCR C
JNZ LdDUMP1

LdDUMP2:
CALL MF488
INR A
JZ MF440
MOV A,B
ADI 4
JM LdDUMP2

MVI C,0

LdDUMP3:
CALL MF488
INR A
JZ MF440
DCR A
RAR
MOV A,C
RAR
MOV C,A
CPI 0F5h
JNZ LdDUMP3
MVI E,0
CALL MF44B
JNC LdDUMP6
MOV C,D
CALL MF44B
JNC LdDUMP6
MOV B,D
PUSH B
MVI C,80h

LdDUMP4:
CALL MF44B
JNC LdDUMP5
MOV M,D
INX H
DCR C
JNZ LdDUMP4

CALL MF44B
JNC LdDUMP5
MOV A,E
ORA A
JZ $+5
MVI A,1
;$+5
POP B

PopDH:
POP D
POP H
RET

LdDUMP5:
POP B
LXI B,0

LdDUMP6:
MVI A,2
JMP PopDH


MF440:
CALL INKEY
MOV C,A
MVI B,0
MVI A,4
JMP PopDH


MF44B:
; Подпрограмма
PUSH B
MVI C,8

;$-14
CALL MF465
RAR
MOV A,D
RAR
MOV D,A
MVI A,4
ADD B
JNC _MF463
DCR C
JNZ $-14
MOV A,D
ADD E
MOV E,A
STC

_MF463:
POP B
RET


MF465:
IN PT_KBRD_B ; 41h
ANI 04h ; 0000 0100
MOV B,A

;$-5
IN PT_KBRD_B ; 41h
ANI 4
CMP B
JZ $-5
MVI A,36h
OUT PT_CLK_3 ; 63h
IN PT_CLK_0 ; 60h
ADI 20h
IN PT_CLK_0 ; 60h
MOV B,A
ACI 2
MVI A,0
OUT PT_CLK_0 ; 60h
OUT PT_CLK_0 ; 60h
RP
INR A
RET


MF488:
IN PT_KBRD_B ; 41h
ANI 4
MOV B,A

;$-12
IN PT_INT_0 ; 80h
ANI 02h ; 0000 0010
JNZ _MF4B2
IN PT_KBRD_B ; 41h
ANI 04h ; 0000 0100
CMP B
JZ $-12
MVI A,36h
OUT PT_CLK_3 ; 63h
IN PT_CLK_0 ; 60h
ADI 20h
IN PT_CLK_0 ; 60h
MOV B,A
ACI 2
MVI A,0
OUT PT_CLK_0 ; 60h
OUT PT_CLK_0 ; 60h
RP
INR A
RET

_MF4B2:
MVI A,0FFh
RET


GetTAPE:
ORA A
RZ
PUSH D
MOV B,A

GetTAPE1:
MOV C,B
IN PT_KBRD_B ; 41h
ANI 4
MOV E,A

GetTAPE2:
MVI A,36h
OUT PT_CLK_3 ; 63h
XRA A
OUT PT_CLK_0 ; 60h
MVI A,0Ch
OUT PT_CLK_0 ; 60h

GetTAPE3:
IN PT_INT_0 ; 80h
ANI 02h ; 0000 0010
JNZ GetTAPE5
IN PT_INT_0 ; 80h
ANI 10h ; 0001 0000
JZ GetTAPE4
IN PT_KBRD_B ; 41h
ANI 04h ; 0000 0100
CMP E
JNZ GetTAPE1
JMP GetTAPE3

GetTAPE4:
DCR C
JNZ GetTAPE2
XRA A
POP D
RET

GetTAPE5:
CALL INKEY
MOV C,A
MVI A,4
POP D
RET


FndBLOK:
IN PT_KBRD_B ; 41h
ANI 08h ; 0000 1000
MVI A,0
RZ
CMA
RET


DDB 0,2
DDB 0FFh,3


; *** свободная область в конце ПЗУ ***

DDB 0FFh,11*256 ; 2816 байт (2,75 Кб)

END




Что-то не получается разгадать, каким образом работает находящийся в ПЗУ по адресам EC08..F067h знакогенератор. Анализ содержимого указывает на какую-то вялую компрессию... стало быть где-то должен быть алгоритм декомпрессии и выгрузки в ОЗУ. Ни с головы, ни с хвоста он не адресуется никаким кодом из ПЗУ. Даже если бы адрес складывался математически, то явно был бы перенос знакогенератора в начале (при отработке "холодного" сброса), однако там ничего на эту тему нет.
Пытался анализировать работу п/п вывода символа, но там какой-то "треш"... пока не удалось ничего понять /-)

Может кто-то из океанологов в курсе? ;)

ivagor
19.03.2019, 19:10
Хранятся 7 строк каждого символа, без компрессии, если не считать таковой добавление пустой строки при выводе.

- - - Добавлено - - -


Ни с головы, ни с хвоста он не адресуется никаким кодом из ПЗУ.
Адресуется командой
E51D lxi d,0EC08h-(32*7)

- - - Добавлено - - -


Пытался анализировать работу п/п вывода символа, но там какой-то "треш"... пока не удалось ничего понять
Можно конкретнее, в чем сомнения?

tnt23
19.03.2019, 21:00
Анализ содержимого указывает на какую-то вялую компрессию... стало быть где-то должен быть алгоритм декомпрессии и выгрузки в ОЗУ. Ни с головы, ни с хвоста он не адресуется никаким кодом из ПЗУ.

Нет там компрессии :) таблицу адресует код вывода символа. Вообще же есть дизассемблированный Юрием монитор 240.2 (пробегал тут): http://sensi.org/~tnt23/ok240/OK_Mon2.asm

Denn
19.03.2019, 22:36
Хранятся 7 строк каждого символа, без компрессии, если не считать таковой добавление пустой строки при выводе.

- - - Добавлено - - -


Адресуется командой
E51D lxi d,0EC08h-(32*7)

Спасибо!

- - - Добавлено - - -


Вообще же есть дизассемблированный Юрием монитор 240.2 (пробегал тут): http://sensi.org/~tnt23/ok240/OK_Mon2.asm

Видел. Не помог он мне ни разу, я в своём варианте больше расшифровал ;)

Denn
20.03.2019, 12:18
Нет там компрессии :)

8 байт "сжимаются" в 7 - это таки компрессия! :)

tnt23
20.03.2019, 15:38
8 байт "сжимаются" в 7 - это таки компрессия! :)

Ну может быть, я не стал вчитываться. Разобрался, откуда берется битмап для символа, и успокоился :)

ivagor
21.03.2019, 17:34
Почти оффтоп, но не совсем, все же сильная связь с темой есть. Подумал, что можно за пару минут переделать монитор для вывода 32 строк, почему бы и не сделать. Времени заняло несколько больше, но получилось. Сегодня смысла в такой штуке пожалуй нет, но программистам древности могло понравиться.

tnt23
21.03.2019, 17:40
Почти оффтоп, но не совсем, все же сильная связь с темой есть. Подумал, что можно за пару минут переделать монитор для вывода 32 строк, почему бы и не сделать. Времени заняло несколько больше, но получилось. Сегодня смысла в такой штуке пожалуй нет, но программистам древности могло понравиться.

А 80 символов в строке сделать? да в виде загружаемого драйвера?

Denn
21.03.2019, 17:42
А 80 символов в строке сделать? да в виде загружаемого драйвера?

256/80=3,2 пикселя на символ :)

ivagor
21.03.2019, 17:57
А 80 символов в строке сделать? да в виде загружаемого драйвера?
Это было бы намного полезнее, но и времени бы заняло заметно больше. Эта задача разбивается на две: очень простая и даже приятная мне для реализции - собственно процедура вывода 80 символов в строке, и муторная - увязка с существующим досом/биосом. Надеюсь со временем к этой задаче кто-нибудь подступится, может даже и я. И кто бы ей не занялся, ему будет полезно знать, каким CP/Mным программам сильно нужны 80 символов?

- - - Добавлено - - -


256/80=3,2 пикселя на символ
512/80>6 pixels/symbol - it's OK!

Denn
21.03.2019, 18:09
512/80>6 pixels/symbol - it's OK!

Монохром онли - it's bad (

tnt23
21.03.2019, 21:01
Это было бы намного полезнее, но и времени бы заняло заметно больше. Эта задача разбивается на две: очень простая и даже приятная мне для реализции - собственно процедура вывода 80 символов в строке, и муторная - увязка с существующим досом/биосом. Надеюсь со временем к этой задаче кто-нибудь подступится, может даже и я. И кто бы ей не занялся, ему будет полезно знать, каким CP/Mным программам сильно нужны 80 символов?


Вот я бы занялся подпиливанием существующего биоса (монитора) на дополнительный режим 80 символов. Место есть, более-менее понятно, куда пришпилить дополнительный код. В конце концов, это не должно быть сложнее вклеивания в штатный ROM PalmOS нештатных процедур работы с дополнительной памятью, а ведь и такое делал :)

И вот лично я ужасно страдаю от невозможности запустить LADDER.

ivagor
21.03.2019, 21:28
LADDER.
Небольшой каминг аут - я никогда не играл в CP/Mные игры (хотя вру, пробовал ROGUE svofski). Но читал, что CATCHUM (надеюсь не перепутал) тоже требует 80 символов.

- - - Добавлено - - -


процедур работы с дополнительной памятью
Забыл, можно было и процедуры обмена с рам-диском пропатчить для работы с 512 Кб.

tnt23
21.03.2019, 22:59
Небольшой каминг аут - я никогда не играл в CP/Mные игры (хотя вру, пробовал ROGUE svofski). Но читал, что CATCHUM (надеюсь не перепутал) тоже требует 80 символов.

- - - Добавлено - - -


Забыл, можно было и процедуры обмена с рам-диском пропатчить для работы с 512 Кб.

CATCHUM вроде есть патченный под 64 символа. А вот LADDER нету.

Если выпускать новый Монитор-2019 для Океана, то обязательно с радужным логотипчиком при сбросе :)

ivagor
22.03.2019, 05:57
новый Монитор-2019 для Океана
Надо бы посмотреть, может там размер рам-диска несложно пропатчить.


обязательно с радужным логотипчиком при сбросе
? У меня океан ассоциируется с волнами, ну может с Посейдоном/Нептуном (с трезубцем).

tnt23
22.03.2019, 08:00
Надо бы посмотреть, может там размер рам-диска несложно пропатчить.


? У меня океан ассоциируется с волнами, ну может с Посейдоном/Нептуном (с трезубцем).

Рам-диск в 400К+ я уже получал, просто поправив две процедуры работы с расширенной памятью в биосе, и таблицу параметров диска в CP/M.

Радужный в смысле показать многоцветность при старте.

ivagor
22.03.2019, 08:15
Рам-диск в 400К+ я уже получал, просто поправив две процедуры работы с расширенной памятью в биосе, и таблицу параметров диска в CP/M.
Понятно, оказывается это уже пройденный этап, до таблицы параметров диска я не добрался. Если взглянуть в будущее, ты планируешь использовать именно этот (безFDDшный) конфиг?


показать многоцветность при старте.
Вспомнил, что говорили про вывод многоцветных полос в разделе видеовыхода. Кстати, теперь я догадываюсь, зачем могли быть нужны палитры с ненулевым цветом - из-за другого оттенка. Но на мой взгляд это странный подход, могли бы сделать и получше, в идеале - нормальную палитру цвета на 64.

tnt23
22.03.2019, 09:25
Понятно, оказывается это уже пройденный этап, до таблицы параметров диска я не добрался. Если взглянуть в будущее, ты планируешь использовать именно этот (безFDDшный) конфиг?

Забыл еще добавить, пришлось исправить захардкоженное значение 64К во встроенной директиве DIR.

FDD я надеюсь добить тоже, просто чтобы закрыть гештальт с КНГМД. Так-то система позволяет работать с рамдиском A: и флоппиками B:, C: и так далее.

- - - Добавлено - - -


Кстати, теперь я догадываюсь, зачем могли быть нужны палитры с ненулевым цветом - из-за другого оттенка. Но на мой взгляд это странный подход, могли бы сделать и получше, в идеале - нормальную палитру цвета на 64.

Поясни?

ivagor
22.03.2019, 09:44
Так-то система позволяет работать с рамдиском A: и флоппиками B:, C: и так далее.
Система в безFDDшном конфиге emu?
Пробовал запускать в этом (безFDDшном) досе IBASIC и MB. IBASIC работает нормально, а вот MB например по оператору PRINT вылетает в DOS, причем буква диска какая-то далекая, J или что-то в этом духе. В FDDшном оба бейсика работают хорошо.


Поясни?
Сейчас немного лень искать, я там удивлялся, зачем нужны палитры, у которых вместо произвольного цвета фона какой-то фиксированный цвет. Тогда я не знал, что цвета фона более бледные.

tnt23
22.03.2019, 10:37
Система в безFDDшном конфиге emu?

По идее обе должны работать, и без FDD (монитор 240/2 + CP/M 240/5) и с FDD (монитор 240/7 + CP/M 240/7).

ivagor
22.03.2019, 10:43
Для краткости пусть это

монитор 240/2 + CP/M 240/5
будет "старый" конфиг,
а это

монитор 240/7 + CP/M 240/7
"новый".

Ты не пробовал в emu в "старый" конфиг добавлять порты fdd (например из нового) или в "новом" убирать порты fdd? Сохраняют ли работоспособности CP/Mы?

tnt23
22.03.2019, 12:57
Ты не пробовал в emu в "старый" конфиг добавлять порты fdd (например из нового) или в "новом" убирать порты fdd? Сохраняют ли работоспособности CP/Mы?

Не пробовал, по идее ничего рушиться не должно. Вроде CP/M не обнюхивает дисководы B:, C: и так далее при старте, ну а квазидиск A: всегда присутствует.

ivagor
22.03.2019, 14:21
Если так, то думаю лучше было сразу ориентироваться на комбинацию софта 7+7 вместо 2+5. Как я понимаю, там один недостаток - поддержка другой клавиатуры. Зато в 7+7 MB.COM правильно работает.
Ну и если подумать еще, то с большим рам-диском fdd и не нужен, нужна поддержка какого-нибудь интерфейса SD. Минималистичный вариант - что-то типа xsd b2ma, т.е. FAT16 на асме 8080. Или внешний микроконтроллер с поддержкой FAT32. В обоих случаях переписываешь нужные файлы c SD на рам-диск и вперед. А если нужно и обратно записывать, то можно посмотреть в строну SD DOS PVV, развившего базу FAT16 b2mа.
Океану до удовлетворительной-средней CP/M машинки не хватает разве что 80 символов.

tnt23
22.03.2019, 16:36
Если так, то думаю лучше было сразу ориентироваться на комбинацию софта 7+7 вместо 2+5. Как я понимаю, там один недостаток - поддержка другой клавиатуры. Зато в 7+7 MB.COM правильно работает.

У меня нет (пока) полного доверия к монитору 7 (который внутри MONITOR+), в смысле действительно ли он более поздний и более лучший. Хотя в него и вписаны процедуры для работы с КНГМД, он вполне может оказаться более старой по сравнению с 2 версией. С другой стороны, в версии 2 поддержана клавиатура терминального типа, а в 7 клавиатура посложнее... не знаю, куда бросаться.

Правильным, но интенсивным способом было бы полностью разобрать оба монитора на подпрограммы и сравнить. Когда-нибудь потом.

(Более ближней перспективой могут быть замена клавиатурного кода 7 на взятый из 2, а также - в связи с надвигающейся сборкой элегантной клавиатуры для РК86 на Cherry MX кнопках - проверка на реале 7).


Ну и если подумать еще, то с большим рам-диском fdd и не нужен, нужна поддержка какого-нибудь интерфейса SD. Минималистичный вариант - что-то типа xsd b2ma, т.е. FAT16 на асме 8080. Или внешний микроконтроллер с поддержкой FAT32. В обоих случаях переписываешь нужные файлы c SD на рам-диск и вперед. А если нужно и обратно записывать, то можно посмотреть в строну SD DOS PVV, развившего базу FAT16 b2mа.

Согласен, только хотелось бы минимума аппаратных переделок в Океане. Например, минималистичный контроллер флеша, садящийся вместо КНГМД на штатное место ППА DD80.


Океану до удовлетворительной-средней CP/M машинки не хватает разве что 80 символов.

Последовательный порт так вообще уже есть.

ivagor
22.03.2019, 17:14
Последовательный порт так вообще уже есть.
Да, это большое дело. Если его разогнать, то может даже и SD не надо.

tnt23
22.03.2019, 17:32
Да, это большое дело. Если его разогнать, то может даже и SD не надо.

19200 максимум пока (https://zx-pk.ru/threads/14176-kompyuter-quot-okean-240-quot.html?p=987081&viewfull=1#post987081).

Но SD все же кругом лучше: и к большому компьютеру цепляться не надо, и порт остается свободным для мыши или MIDI.

tnt23
07.12.2023, 20:56
Почти оффтоп, но не совсем, все же сильная связь с темой есть. Подумал, что можно за пару минут переделать монитор для вывода 32 строк, почему бы и не сделать. Времени заняло несколько больше, но получилось. Сегодня смысла в такой штуке пожалуй нет, но программистам древности могло понравиться.

ivagor, а исходника этой переделки (в смысле оригинального монитора 240/7) у тебя не сохранилось? Пытаюсь тут найти, что у меня в машине прошито, и из всех найденных пока мониторов с начальной сигнатурой C3 30 E0 только твой и бьется.

ivagor
07.12.2023, 21:03
В Emu в папке Okean240 файл MONITOR.BIN