Code: Select all
; МОНИТОР МИКРОШИ СОВМЕСТИМЫЙ С РК86 (РАДИО 12.89)
; ---------------------------------------------------
; Last modify: 19.06.18 — 19:30
; Удалена лишняя команда в подпрограмме WRBYTE (ищи %%)
.Z80
0000' aseg
ORG 100H
0000 ORIG EQU 0 ; если не 0, то оригинальный курсор
C800 DOPPPA EQU 0C800H ; адрес дополнительного ППА
F800 RABADR EQU 0F800H
7600 BASE EQU 7600H ; \/"выше" служебные ячейки
7600 EK_ADR EQU BASE ; текущий адрес на экране
7602 POSX EQU BASE+02H
7603 POSY EQU BASE+03H
7604 ESC_F EQU BASE+04H ; Признак обработки ESC/Y последовательности
7605 KBDFLG EQU BASE+05H ; если =0, то есть символ в SYMBUF
7606 RUSLAT EQU BASE+06H ; SYMBUF в данном случае односимвольный, это LAST_K
; +7 , +8 -пусто-??
7609 LAST_K EQU BASE+09H ; эти 2 байта должны следовать подряд
760A COUNT EQU BASE+0AH ; счетчик опросов (вначале 15)
760B APVFLG EQU BASE+0BH
760C FRELOC EQU BASE+0CH ; эта ячейка не используется
760D TMPSTK EQU BASE+0DH ; временно храним ук.стека при мг п/п-ммах
7614 POINT EQU BASE+14H ; адрес откуда произошел RST_30H ,т.е. PC для X и G
7616 R_HL EQU BASE+16H ; Хранение содержимого HL при работе директив X и G
7618 R_BC EQU BASE+18H ; Хранение содержимого BC при работе директив X и G
761A R_DE EQU BASE+1AH ; Хранение содержимого DE при работе директив X и G
761C R_SP EQU BASE+1CH ; Хранение содержимого SP при работе директив X и G
761E R_AF EQU BASE+1EH ; Хранение содержимого AF при работе директив X и G
7623 STOP_A EQU BASE+23H ; адрес останова для директивы G
7625 TMP_COD EQU BASE+25H ; здесь храним байт из стоп-точки
7626 P_JMP EQU BASE+26H ; байт C3H (JMP) используется в DIR_G
7627 PAR_HL EQU BASE+27H ; I параметр директив
7629 PAR_DE EQU BASE+29H ; II параметр директив
762B PAR_BC EQU BASE+2BH ; III параметр директив
762D FLG_P2 EQU BASE+2DH ; флаг, что есть параметры 2 или 2,3
762E INV_MG EQU BASE+2EH ; признак прямого/инверс. чтения с мг
762F KNS_RD EQU BASE+2FH ; константа для чтения мг
7630 KNS_WR EQU BASE+30H ; константа для записи мг
7631 RAMTOP EQU BASE+31H ;
7633 COMBUF EQU BASE+33H ; буфер ввода директивы
7652 BUFEND EQU COMBUF+1FH ; ввод ПО GETLIN только 32 символа
7653 IF_PRN EQU BASE+53H ; заглушка эхо-печати
7654 PRINT EQU BASE+54H ; драйвер принтера (или JMP на него)
76D0 STACK EQU BASE+0D0H ; стек монитора
76D0 SA EQU 076D0H ; начало экранной области (размер 30*78)
77C2 SCBASE EQU 077C2H ; левый верхний угол экрана
F800 VT_57 EQU 0F800H
D000 VG_75 EQU 0D000H
C000 PKA EQU 0C000H
C001 PKB EQU PKA+1
C002 PKC EQU PKA+2
C003 PKU EQU PKA+3
C800 PDA EQU DOPPPA
C801 PDB EQU PDA+1
C802 PDC EQU PDA+2
C803 PDU EQU PDA+3
; ---------------------------------------------------
.msg MACRO ADDR
LD HL,ADDR
CALL MSSG
ENDM
; ---------------------------------------------------
jmp_eq MACRO BYTE,ADDR
CP BYTE
JP Z,ADDR
ENDM
; ---------------------------------------------------
loop MACRO ADDR
DEC BC
LD A,B
OR C
JP NZ,ADDR
ENDM
; ---------------------------------------------------
.phase RABADR
F800 C3 F836 JP VHOD ; + 00
F803 C3 FE63 JP CONIN ; + 03
F806 C3 FB8C JP LDBYTE ; + 06
F809 C3 FCB1 JP COUT_C ; + 09
F80C C3 FC3C JP WRBYTE ; + 0C
F80F C3 7654 JP PRINT ; + 0F
F812 C3 FE01 JP STATUS ; + 12
F815 C3 FC9F JP HEX_A ; + 15
F818 C3 F920 JP MSSG ; + 18
F81B C3 FE72 JP XF81B ; + 1B опрос kbd без ожидания
F81E C3 FA6F JP ASKCUR ; + 1E
F821 C3 FA73 JP RD_SCR ; + 21
F824 C3 FAAA JP RD_BLK ; + 24
F827 C3 FB3D JP WR_BLK ; + 27
F82A C3 FB0A JP CHSUMM ; + 2A
F82D C3 FAC2 JP PUSK_VG ; + 2D
F830 C3 FF49 JP ASKTOP ; + 30
F833 C3 FF4D JP SETTOP ; + 33
; ---------------------------------------------------
F836 3E 98 VHOD: LD A,98H
F838 32 C003 LD (PKU),A ; PKA,PKCH - ввод, PKB,PKCL - вывод
F83B 21 7600 LD HL,BASE
F83E F9 LD SP,HL ; STACK
F83F 4D LD C,L ; LD C,0
F840 11 765F LD DE,COMBUF+2CH
F843 CD F8D3 CALL DIR_F ; очистка всех служ.ячеек
F846 CD FAC2 CALL PUSK_VG
F849 3E C9 LD A,0C9H
F84B 32 7653 LD (IF_PRN),A ; заглушка эхо-печати
F84E 21 76D0 LD HL,STACK
F851 22 761C LD (R_SP),HL
.msg TITR
F854 21 FF51 + LD HL,TITR
F857 CD F920 + CALL MSSG
F85A 21 75FF LD HL,BASE-1
F85D 22 7631 LD (RAMTOP),HL
F860 21 1D21 LD HL,1D21H
F863 22 762F LD (KNS_RD),HL
F866 3E C3 LD A,0C3H
F868 32 7626 LD (P_JMP),A
F86B 00 NOP
if $ ne RABADR + 6CH
if1
.printx * standard subroutine WARMST shifted ! *
endif
endif
F86C 31 76D0 WARMST: LD SP,STACK
.msg PROMPT
F86F 21 FF5F + LD HL,PROMPT
F872 CD F920 + CALL MSSG
F875 32 C002 LD (PKC),A
F878 32 7606 LD (RUSLAT),A
F87B CD F8EC CALL GETLIN
F87E 21 F86C LD HL,WARMST
F881 E5 PUSH HL
F882 21 7633 LD HL,COMBUF
F885 7E LD A,(HL)
F886 FE 58 CP 'X'
F888 CA FFCC JP Z,DIR_X
F88B F5 PUSH AF
F88C CD F92A CALL GETPRM
F88F 2A 762B LD HL,(PAR_BC)
F892 4D LD C,L
F893 44 LD B,H
F894 2A 7629 LD HL,(PAR_DE)
F897 EB EX DE,HL
F898 2A 7627 LD HL,(PAR_HL)
F89B F1 POP AF
jmp_eq 'D',DIR_D
F89C FE 44 + CP 'D'
F89E CA F9C6 + JP Z,DIR_D
jmp_eq 'C',DIR_C
F8A1 FE 43 + CP 'C'
F8A3 CA F9D8 + JP Z,DIR_C
jmp_eq 'S',DIR_S
F8A6 FE 53 + CP 'S'
F8A8 CA F9EB + JP Z,DIR_S
jmp_eq 'T',DIR_T
F8AB FE 54 + CP 'T'
F8AD CA F9F6 + JP Z,DIR_T
jmp_eq 'M',DIR_M
F8B0 FE 4D + CP 'M'
F8B2 CA FA1D + JP Z,DIR_M
jmp_eq 'G',DIR_G
F8B5 FE 47 + CP 'G'
F8B7 CA FA33 + JP Z,DIR_G
jmp_eq 'I',DIR_I
F8BA FE 49 + CP 'I'
F8BC CA FA7A + JP Z,DIR_I
jmp_eq 'O',DIR_O
F8BF FE 4F + CP 'O'
F8C1 CA FB21 + JP Z,DIR_O
jmp_eq 'L',DIR_L
F8C4 FE 4C + CP 'L'
F8C6 CA F9FF + JP Z,DIR_L
jmp_eq 'R',DIR_R
F8C9 FE 52 + CP 'R'
F8CB CA FA5C + JP Z,DIR_R
F8CE FE 46 CP 'F'
F8D0 C2 FAA2 JP NZ,ERROR
F8D3 71 DIR_F: LD (HL),C
F8D4 CD F997 CALL AF999
F8D7 C3 F8D3 JP DIR_F
; ---------------------------------------------------
F8DA 3E 33 BAKSTP: LD A,low COMBUF
F8DC BD CP L ; достигнуто начало буфера ввода ?
F8DD CA F8EF JP Z,AF8F1
F8E0 E5 PUSH HL
.msg TZABOJ
F8E1 21 FF97 + LD HL,TZABOJ
F8E4 CD F920 + CALL MSSG
F8E7 E1 POP HL
F8E8 2B DEC HL
F8E9 C3 F8F1 JP AF8F3
; ---------------------------------------------------
F8EC 21 7633 GETLIN: LD HL,COMBUF
F8EF 06 00 AF8F1: LD B,0
F8F1 CD FE63 AF8F3: CALL CONIN
jmp_eq 8,BAKSTP
F8F4 FE 08 + CP 8
F8F6 CA F8DA + JP Z,BAKSTP
jmp_eq 7FH,BAKSTP
F8F9 FE 7F + CP 7FH
F8FB CA F8DA + JP Z,BAKSTP
F8FE CD FCB0 CALL COUT_A
F901 77 LD (HL),A
jmp_eq 13,AF91A
F902 FE 0D + CP 13
F904 CA F918 + JP Z,AF91A
jmp_eq '.',WARMST
F907 FE 2E + CP '.'
F909 CA F86C + JP Z,WARMST
F90C 06 FF LD B,255
F90E 3E 52 LD A,low BUFEND
F910 BD CP L
F911 CA FAA2 JP Z,ERROR
F914 23 INC HL
F915 C3 F8F1 JP AF8F3
; ---------------------------------------------------
F918 78 AF91A: LD A,B
F919 17 RLA
F91A 11 7633 LD DE,COMBUF
F91D 06 00 LD B,0
F91F C9 RET
; ---------------------------------------------------
F920 7E MSSG: LD A,(HL)
F921 A7 AND A
F922 C8 RET Z
F923 CD FCB0 CALL COUT_A
F926 23 INC HL
F927 C3 F920 JP MSSG
; ---------------------------------------------------
F92A 21 7627 GETPRM: LD HL,PAR_HL
F92D 11 762D LD DE,FLG_P2
F930 0E 00 LD C,0
F932 CD F8D3 CALL DIR_F
F935 11 7634 LD DE,COMBUF+1
F938 CD F958 CALL GET_HL
F93B 22 7627 LD (PAR_HL),HL
F93E 22 7629 LD (PAR_DE),HL
F941 D8 RET C
F942 3E FF LD A,255
F944 32 762D LD (FLG_P2),A
F947 CD F958 CALL GET_HL
F94A 22 7629 LD (PAR_DE),HL
F94D D8 RET C
F94E CD F958 CALL GET_HL
F951 22 762B LD (PAR_BC),HL
F954 D8 RET C
F955 C3 FAA2 JP ERROR
; ---------------------------------------------------
F958 21 0000 GET_HL: LD HL,0
F95B 1A AF95D: LD A,(DE)
F95C 13 INC DE
jmp_eq 13,RETCY1
F95D FE 0D + CP 13
F95F CA F98C + JP Z,RETCY1
F962 FE 2C CP ','
F964 C8 RET Z
jmp_eq 20H,AF95D
F965 FE 20 + CP 20H
F967 CA F95B + JP Z,AF95D
F96A D6 30 SUB 30H
F96C FA FAA2 JP M,ERROR
F96F FE 0A CP 10
F971 FA F980 JP M,AF982
F974 FE 11 CP 11H
F976 FA FAA2 JP M,ERROR
F979 FE 17 CP 17H
F97B F2 FAA2 JP P,ERROR
F97E D6 07 SUB 7
F980 4F AF982: LD C,A
F981 29 ADD HL,HL
F982 29 ADD HL,HL
F983 29 ADD HL,HL
F984 29 ADD HL,HL
F985 DA FAA2 JP C,ERROR
F988 09 ADD HL,BC
F989 C3 F95B JP AF95D
; ---------------------------------------------------
F98C 37 RETCY1: SCF
F98D C9 RET
; ---------------------------------------------------
F98E 7C CMPDH: LD A,H
F98F BA CP D
F990 C0 RET NZ
F991 7D LD A,L
F992 BB CP E
F993 C9 RET
; ---------------------------------------------------
F994 CD F9A2 AF996: CALL CHK_F4
F997 CD F98E AF999: CALL CMPDH
F99A C2 F9A0 JP NZ,INC_HL
F99D 33 POPAF: INC SP ; лучше POP AF
F99E 33 INC SP
F99F C9 RET
; ---------------------------------------------------
F9A0 23 INC_HL: INC HL
F9A1 C9 RET
; ---------------------------------------------------
F9A2 CD FE72 CHK_F4: CALL XF81B
F9A5 FE 03 CP 3
F9A7 C0 RET NZ
F9A8 CD FAC2 CALL PUSK_VG
F9AB C3 FAA2 JP ERROR
; ---------------------------------------------------
F9AE E5 RIGHT4: PUSH HL ; выводит ВК и вправо на 4 позиции
.msg TRIGH4
F9AF 21 FF65 + LD HL,TRIGH4
F9B2 CD F920 + CALL MSSG
F9B5 E1 POP HL
F9B6 C9 RET
; ---------------------------------------------------
F9B7 CD FB6C JJJ_02: CALL HXHLBL
F9BA 7E LDXHX@: LD A,(HL)
F9BB C5 HXA_BL: PUSH BC
F9BC CD FC9F CALL HEX_A
F9BF 3E 20 LD A,20H
F9C1 CD FCB0 CALL COUT_A
F9C4 C1 POP BC
F9C5 C9 RET
; ---------------------------------------------------
F9C6 CD FB6C DIR_D: CALL HXHLBL
F9C9 CD F9BA AF9C8: CALL LDXHX@
F9CC CD F994 CALL AF996
F9CF 7D LD A,L
F9D0 E6 0F AND 00001111B
F9D2 CA F9C6 JP Z,DIR_D
F9D5 C3 F9C9 JP AF9C8
; ---------------------------------------------------
F9D8 0A DIR_C: LD A,(BC)
F9D9 BE CP (HL)
F9DA CA F9E4 JP Z,AF9E6
; CALL HXHLBL
; CALL LDXHX@
F9DD CD F9B7 CALL JJJ_02
F9E0 0A LD A,(BC)
F9E1 CD F9BB CALL HXA_BL
F9E4 03 AF9E6: INC BC
F9E5 CD F994 CALL AF996
F9E8 C3 F9D8 JP DIR_C
; ---------------------------------------------------
F9EB 79 DIR_S: LD A,C
F9EC BE CP (HL)
F9ED CC FB6C CALL Z,HXHLBL
F9F0 CD F994 CALL AF996
F9F3 C3 F9EB JP DIR_S
; ---------------------------------------------------
F9F6 7E DIR_T: LD A,(HL)
F9F7 02 LD (BC),A
F9F8 03 INC BC
F9F9 CD F997 CALL AF999
F9FC C3 F9F6 JP DIR_T
; ---------------------------------------------------
F9FF CD FB6C DIR_L: CALL HXHLBL
FA02 7E AFA0B: LD A,(HL)
FA03 B7 OR A
FA04 FA FA0C JP M,AFA15
FA07 FE 20 CP 20H
FA09 D2 FA0E JP NC,AFA17
FA0C 3E 2E AFA15: LD A,'.'
FA0E CD FCB0 AFA17: CALL COUT_A
FA11 CD F994 CALL AF996
FA14 7D LD A,L
FA15 E6 0F AND 00001111B
FA17 CA F9FF JP Z,DIR_L
FA1A C3 FA02 JP AFA0B
; ---------------------------------------------------
FA1D DIR_M:
; CALL HXHLBL
; CALL LDXHX@
FA1D CD F9B7 CALL JJJ_02
FA20 E5 PUSH HL
FA21 CD F8EC CALL GETLIN
FA24 E1 POP HL
FA25 D2 FA2F JP NC,AFA3B
FA28 E5 PUSH HL
FA29 CD F958 CALL GET_HL
FA2C 7D LD A,L
FA2D E1 POP HL
FA2E 77 LD (HL),A
FA2F 23 AFA3B: INC HL
FA30 C3 FA1D JP DIR_M
; ---------------------------------------------------
FA33 CD F98E DIR_G: CALL CMPDH
FA36 CA FA4E JP Z,AFA5A
FA39 EB EX DE,HL
FA3A 22 7623 LD (STOP_A),HL
FA3D 7E LD A,(HL)
FA3E 32 7625 LD (TMP_COD),A ; храним байт из точки останова
FA41 36 F7 LD (HL),0F7H ; код команды RST30
FA43 3E C3 LD A,0C3H
FA45 32 0030 LD (0030H),A ; подготовка RST30
FA48 21 FF9B LD HL,BREAK
FA4B 22 0031 LD (0031H),HL
FA4E 31 7618 AFA5A: LD SP,R_BC ; BASE+18H
FA51 C1 POP BC ; BC <-- (BASE+18H)
FA52 D1 POP DE ; DE <-- (BASE+1AH)
FA53 E1 POP HL ; HL <-- (BASE+1CH) это стек
FA54 F1 POP AF ; AF <-- (BASE+1DH)
FA55 F9 LD SP,HL
FA56 2A 7616 LD HL,(R_HL)
FA59 C3 7626 JP P_JMP
; ---------------------------------------------------
FA5C 3E 90 DIR_R: LD A,90H ; MVI A,90h=10010000b
FA5E 32 C803 LD (PDU),A ; STA PDU (PDB,PDC-вывод, PDA-ввод)
FA61 22 C801 AFA6D: LD (PDB),HL ; команда с кодом 22(SHLD) должна грузить H в PDC и L в PDB
FA64 3A C800 LD A,(PDA) ; 3A(LDA) читает из PDA в акк.(A)
FA67 02 LD (BC),A ; пишет в память по адресу из BC
FA68 03 INC BC ;
FA69 CD F997 CALL AF999 ; вызов сравнения HL?DE и INX HL
FA6C C3 FA61 JP AFA6D
; ---------------------------------------------------
FA6F 2A 7602 ASKCUR: LD HL,(POSX)
FA72 C9 RET
; ---------------------------------------------------
FA73 E5 RD_SCR: PUSH HL
FA74 2A 7600 LD HL,(EK_ADR)
FA77 7E LD A,(HL)
FA78 E1 POP HL
FA79 C9 RET
; ---------------------------------------------------
FA7A 3A 762D DIR_I: LD A,(FLG_P2)
FA7D B7 OR A
FA7E CA FA85 JP Z,AFA91
FA81 7B LD A,E
FA82 32 762F LD (KNS_RD),A
FA85 CD FAAA AFA91: CALL RD_BLK
FA88 CD FB6C CALL HXHLBL
FA8B EB EX DE,HL
FA8C CD FB6C CALL HXHLBL
FA8F EB EX DE,HL
FA90 C5 PUSH BC
FA91 CD FB0A CALL CHSUMM
FA94 60 LD H,B
FA95 69 LD L,C
FA96 CD FB6C CALL HXHLBL
FA99 D1 POP DE
FA9A CD F98E CALL CMPDH
FA9D C8 RET Z
FA9E EB EX DE,HL
FA9F CD FB6C CALL HXHLBL
FAA2 ERROR:
FAA2 3E 3F LD A,'?'
FAA4 CD FCB0 CALL COUT_A
FAA7 C3 F86C JP WARMST
; ---------------------------------------------------
FAAA 3E FF RD_BLK: LD A,255
FAAC CD FAF3 CALL LD_BC
FAAF E5 PUSH HL
FAB0 09 ADD HL,BC
FAB1 EB EX DE,HL
FAB2 CD FAF1 CALL LDBCBS
FAB5 E1 POP HL
FAB6 09 ADD HL,BC
FAB7 EB EX DE,HL
FAB8 E5 PUSH HL
FAB9 CD FAFE CALL LD_BLK
FABC 3E FF LD A,255
FABE CD FAF3 CALL LD_BC
FAC1 E1 POP HL
FAC2 PUSK_VG:
FAC2 E5 PUSH HL
FAC3 21 D001 LD HL,VG_75+1
FAC6 36 00 LD (HL),0 ; RESET COMMANDO
FAC8 2B DEC HL ; адрес VG_75
FAC9 36 4D LD (HL),4DH ; 0.1001101 77 (77+1 знакомест)
FACB 36 1D LD (HL),1DH ; 00.011101 29 (29+1 строк)
if ORIG
LD (HL),99H ; 1001.1001 9 9 (9+1 линия подчёрк-ия)
; (9+1 линий в знакоместе)
LD (HL),93H ; 1.0.01.0011 без смещ.
; курсор - мигающая линия подчеркивания
; атрибуты отображать пробелом
; 3 такта сдвига - длина обр хода в стр.
else
FACD 36 59 LD (HL),59H ; **** лучше 58H: линия подч-я - выше
FACF 36 C3 LD (HL),0C3H ; 1.1.00.0011 - это мое изменение
; курсор - мигающее знакоместо
; атрибуты не отображать
endif ; теперь большой курсор
FAD1 23 INC HL ; адрес VG_75+1
FAD2 36 27 LD (HL),27H ; VHOD DISPLAY COMMANDO
FAD4 7E LD A,(HL) ; read STATUS (зачем-то это надо)
FAD5 7E AFAE1: LD A,(HL) ; read STATUS
FAD6 E6 20 AND 20H ; mask 'interrupt request flag'
FAD8 CA FAD5 JP Z,AFAE1 ; ждем конца строки
FADB 21 F808 LD HL,VT_57+8
FADE 36 80 LD (HL),80H
FAE0 2E 04 LD L,4 ; VT_57+04
FAE2 36 D0 LD (HL),low SA ; 0D0H
FAE4 36 76 LD (HL),HIGH SA ; 076H
FAE6 2C INC L ; адрес VT_57+5
FAE7 36 23 LD (HL),23H ; число байтов
FAE9 36 49 LD (HL),49H ; режим
FAEB 2E 08 LD L,8 ; VT_57+8
FAED 36 A4 LD (HL),0A4H
FAEF E1 POP HL
FAF0 C9 RET
; ---------------------------------------------------
FAF1 3E 08 LDBCBS: LD A,8
FAF3 CD FB8C LD_BC: CALL LDBYTE
FAF6 47 LD B,A
FAF7 3E 08 LD A,8
FAF9 CD FB8C CALL LDBYTE
FAFC 4F LD C,A
FAFD C9 RET
; ---------------------------------------------------
FAFE 3E 08 LD_BLK: LD A,8
FB00 CD FB8C CALL LDBYTE
FB03 77 LD (HL),A
FB04 CD F997 CALL AF999
FB07 C3 FAFE JP LD_BLK
; ---------------------------------------------------
FB0A 01 0000 CHSUMM: LD BC,0
FB0D 7E AFB19: LD A,(HL)
FB0E 81 ADD A,C
FB0F 4F LD C,A
FB10 F5 PUSH AF
FB11 CD F98E CALL CMPDH
FB14 CA F99D JP Z,POPAF
FB17 F1 POP AF
FB18 78 LD A,B
FB19 8E ADC A,(HL)
FB1A 47 LD B,A
FB1B CD F997 CALL AF999
FB1E C3 FB0D JP AFB19
; ---------------------------------------------------
FB21 79 DIR_O: LD A,C
FB22 B7 OR A
FB23 CA FB29 JP Z,AFB35
FB26 32 7630 LD (KNS_WR),A
FB29 E5 AFB35: PUSH HL
FB2A CD FB0A CALL CHSUMM
FB2D E1 POP HL
FB2E CD FB6C CALL HXHLBL
FB31 EB EX DE,HL
FB32 CD FB6C CALL HXHLBL
FB35 EB EX DE,HL
FB36 E5 PUSH HL
FB37 60 LD H,B
FB38 69 LD L,C
FB39 CD FB6C CALL HXHLBL
FB3C E1 POP HL ; КС
FB3D WR_BLK:
FB3D C5 PUSH BC
; КС
FB3E 01 0000 LD BC,0
FB41 CD FC3C AFB4D: CALL WRBYTE ; выводим 256 байтов 00 (пилотон)
FB44 05 DEC B
FB45 E3 EX (SP),HL ; это задержка 38 тактов
FB46 E3 EX (SP),HL
FB47 C2 FB41 JP NZ,AFB4D
FB4A 0E E6 LD C,0E6H ; выводим синхробайт E6
FB4C CD FC3C CALL WRBYTE
FB4F CD FB84 CALL WR_HL ; выводим Н.А.
FB52 EB EX DE,HL
FB53 CD FB84 CALL WR_HL ; выводим К.А.
FB56 EB EX DE,HL
FB57 CD FB7A CALL AFB86 ; выводим блок
FB5A 21 0000 LD HL,0
FB5D CD FB84 CALL WR_HL ; выводим 2 байта 00
FB60 0E E6 LD C,0E6H ; снова выводим с/байт E6
FB62 CD FC3C CALL WRBYTE
FB65 E1 POP HL
FB66 CD FB84 CALL WR_HL ; выводим КС
FB69 C3 FAC2 JP PUSK_VG
; ---------------------------------------------------
FB6C C5 HXHLBL: PUSH BC ; right 4 pos, HEX_HL & blank
FB6D CD F9AE CALL RIGHT4
FB70 7C LD A,H
FB71 CD FC9F CALL HEX_A
FB74 7D LD A,L
FB75 CD F9BB CALL HXA_BL
FB78 C1 POP BC
FB79 C9 RET
; ---------------------------------------------------
FB7A 4E AFB86: LD C,(HL)
FB7B CD FC3C CALL WRBYTE
FB7E CD F997 CALL AF999
FB81 C3 FB7A JP AFB86
; ---------------------------------------------------
FB84 4C WR_HL: LD C,H
FB85 CD FC3C CALL WRBYTE
FB88 4D LD C,L
FB89 C3 FC3C JP WRBYTE
; ---------------------------------------------------
FB8C @LDBYT EQU $
FB8C E5 LDBYTE: PUSH HL
FB8D C5 PUSH BC
FB8E D5 PUSH DE
FB8F 57 LD D,A
FB90 3E 80 AFB9C: LD A,80H
FB92 32 F808 LD (VT_57+8),A
FB95 21 0000 LD HL,0
FB98 4D LD C,L ; LD C,0
FB99 39 ADD HL,SP
FB9A 22 760D LD (TMPSTK),HL
FB9D 31 0000 LD SP,0
FBA0 3A C002 LD A,(PKC)
FBA3 0F RRCA
FBA4 0F RRCA
FBA5 0F RRCA
FBA6 0F RRCA
FBA7 E6 01 AND 00000001B
FBA9 5F LD E,A
FBAA F1 AFBB7: POP AF
FBAB 79 LD A,C
FBAC E6 7F AND 7FH
FBAE 07 RLCA
FBAF 4F LD C,A
FBB0 26 00 LD H,0
FBB2 25 AFBBF: DEC H
FBB3 CA FC2A JP Z,AFC34
FBB6 F1 POP AF ; регенерация ОЗУ
FBB7 3A C002 LD A,(PKC)
FBBA 0F RRCA
FBBB 0F RRCA
FBBC 0F RRCA
FBBD 0F RRCA
FBBE E6 01 AND 00000001B
FBC0 BB CP E
FBC1 CA FBB2 JP Z,AFBBF
FBC4 B1 OR C
FBC5 4F LD C,A
FBC6 15 DEC D
FBC7 3A 762F LD A,(KNS_RD)
FBCA C2 FBCF JP NZ,AFBDC
FBCD D6 12 SUB 12H
FBCF 47 AFBDC: LD B,A
FBD0 F1 AFBDD: POP AF ; регенерация ОЗУ
FBD1 05 DEC B
FBD2 C2 FBD0 JP NZ,AFBDD
FBD5 14 INC D
FBD6 3A C002 LD A,(PKC)
FBD9 0F RRCA
FBDA 0F RRCA
FBDB 0F RRCA
FBDC 0F RRCA
FBDD E6 01 AND 00000001B
FBDF 5F LD E,A
FBE0 7A LD A,D
FBE1 B7 OR A
FBE2 F2 FBFE JP P,AFC0B
FBE5 79 LD A,C
FBE6 FE E6 CP 0E6H ; прямой синхро-байт ?
FBE8 C2 FBF2 JP NZ,AFBFF
FBEB AF XOR A
FBEC 32 762E LD (INV_MG),A ; признак инверсии магнитофона
FBEF C3 FBFC JP AFC09
; ---------------------------------------------------
FBF2 FE 19 AFBFF: CP 19H ; инверсный синхро-байт ?
FBF4 C2 FBAA JP NZ,AFBB7
FBF7 3E FF LD A,255
FBF9 32 762E LD (INV_MG),A
FBFC 16 09 AFC09: LD D,9
FBFE 15 AFC0B: DEC D
FBFF C2 FBAA JP NZ,AFBB7
FC02 21 F804 LD HL,VT_57+4
FC05 36 D0 LD (HL),low SA ; 0D0H
FC07 36 76 LD (HL),HIGH SA ; 076H
FC09 23 INC HL
FC0A 36 23 LD (HL),23H
FC0C 36 49 LD (HL),49H
FC0E 3E 27 LD A,27H ; VHOD DISPLAY COMMANDO
FC10 32 D001 LD (VG_75+1),A
FC13 3E E0 LD A,0E0H ; RESET COUNT
FC15 32 D001 LD (VG_75+1),A
FC18 3A D001 LD A,(VG_75+1)
FC1B 2E 08 LD L,8
FC1D 36 A4 LD (HL),0A4H
FC1F 2A 760D LD HL,(TMPSTK)
FC22 F9 LD SP,HL
FC23 3A 762E LD A,(INV_MG) ; with Tape inverse flag
FC26 A9 XOR C
FC27 C3 FC9B JP POPREG
; ---------------------------------------------------
FC2A 2A 760D AFC34: LD HL,(TMPSTK)
FC2D F9 LD SP,HL
FC2E CD FAC2 CALL PUSK_VG
FC31 7A LD A,D
FC32 B7 OR A
FC33 F2 FAA2 JP P,ERROR
FC36 CD F9A2 CALL CHK_F4
FC39 C3 FB90 JP AFB9C
; ---------------------------------------------------
FC3C @WRBYT EQU $
FC3C E5 WRBYTE: PUSH HL
FC3D C5 PUSH BC
FC3E D5 PUSH DE
FC3F F5 PUSH AF
FC40 3E 80 LD A,80H
FC42 32 F808 LD (VT_57+8),A
FC45 21 0000 LD HL,0
FC48 39 ADD HL,SP
FC49 31 0000 LD SP,0
FC4C 16 08 LD D,8
FC4E F1 AFC58: POP AF
FC4F 79 LD A,C
FC50 07 RLCA
FC51 4F LD C,A
FC52 3E 01 LD A,1
FC54 A9 XOR C
FC55 E6 01 AND 1
FC57 32 C002 LD (PKC),A
FC5A 3A 7630 LD A,(KNS_WR)
FC5D 47 LD B,A
FC5E F1 AFC66: POP AF
FC5F 05 DEC B
FC60 C2 FC5E JP NZ,AFC66
FC63 3E 00 LD A,0
FC65 A9 XOR C
FC66 E6 01 AND 1
FC68 32 C002 LD (PKC),A
FC6B 15 DEC D
FC6C 3A 7630 LD A,(KNS_WR)
FC6F C2 FC74 JP NZ,AFC7A
FC72 D6 0E SUB 14
FC74 47 AFC7A: LD B,A
FC75 F1 AFC7B: POP AF ; подьём стека на [рег.B] ячеек
FC76 05 DEC B
FC77 C2 FC75 JP NZ,AFC7B
FC7A 14 INC D
FC7B 15 DEC D
FC7C C2 FC4E JP NZ,AFC58
FC7F F9 LD SP,HL
FC80 21 F804 LD HL,VT_57+4
FC83 36 D0 LD (HL),low SA
FC85 36 76 LD (HL),HIGH SA
FC87 23 INC HL ; VT_57+5
FC88 36 23 LD (HL),23H
FC8A 36 49 LD (HL),49H
FC8C 3E 27 LD A,27H ; VHOD DISPLAY COMMANDO
FC8E 32 D001 LD (VG_75+1),A ; 001.SSS.BB 001.001.11
FC91 3E E0 LD A,0E0H ; сброс счетчиков строк и знакомест ???
FC93 32 D001 LD (VG_75+1),A
; LD A,(VG_75+1) ; это лишнее !!! %%
FC96 2E 08 LD L,8 ; VT_57+8
FC98 36 A4 LD (HL),0A4H
FC9A F1 POP AF
FC9B D1 POPREG: POP DE
FC9C C1 POP BC
FC9D E1 POP HL
FC9E @BAK EQU $
FC9E C9 RET
; ---------------------------------------------------
FC9F F5 HEX_A: PUSH AF
FCA0 0F RRCA
FCA1 0F RRCA
FCA2 0F RRCA
FCA3 0F RRCA
FCA4 CD FCA8 CALL NIBBLE
FCA7 F1 POP AF
FCA8 E6 0F NIBBLE: AND 0FH
FCAA FE 0A CP 10
FCAC 3F CCF
FCAD CE 30 ADC A,30H
FCAF 27 DAA
FCB0 4F COUT_A: LD C,A
FCB1 F5 COUT_C: PUSH AF
FCB2 C5 PUSH BC
FCB3 D5 PUSH DE
FCB4 E5 PUSH HL
FCB5 CD 7653 CALL IF_PRN
FCB8 21 FD85 LD HL,TOBACK
FCBB E5 PUSH HL
FCBC 2A 7602 LD HL,(POSX)
FCBF EB EX DE,HL
FCC0 2A 7600 LD HL,(EK_ADR)
FCC3 3A 7604 LD A,(ESC_F)
FCC6 3D DEC A
FCC7 FA FCE5 JP M,NO_ESC
FCCA CA FD65 JP Z,AFD65
FCCD E2 FD73 JP PO,AFD73
FCD0 79 LD A,C
FCD1 D6 20 SUB 20H
FCD3 4F LD C,A
FCD4 0D AFCDD: DEC C
FCD5 FA FCE0 JP M,ESCRES
FCD8 C5 PUSH BC
FCD9 CD FDB9 CALL COD_18
FCDC C1 POP BC
FCDD C3 FCD4 JP AFCDD
; ---------------------------------------------------
FCE0 AF ESCRES: XOR A
FCE1 32 7604 SETESC: LD (ESC_F),A
FCE4 C9 RET
; ---------------------------------------------------
FCE5 79 NO_ESC: LD A,C
FCE6 E6 7F AND 7FH
FCE8 4F LD C,A
jmp_eq 1FH,CLS
FCE9 FE 1F + CP 1FH
FCEB CA FDA3 + JP Z,CLS
jmp_eq 0CH,HOME
FCEE FE 0C + CP 0CH
FCF0 CA FDB2 + JP Z,HOME
jmp_eq 0DH,COD_0D
FCF3 FE 0D + CP 0DH
FCF5 CA FDF3 + JP Z,COD_0D
jmp_eq 0AH,COD_0A
FCF8 FE 0A + CP 0AH
FCFA CA FD47 + JP Z,COD_0A
jmp_eq 8,COD_08
FCFD FE 08 + CP 8
FCFF CA FDD6 + JP Z,COD_08
jmp_eq 18H,COD_18
FD02 FE 18 + CP 18H
FD04 CA FDB9 + JP Z,COD_18
jmp_eq 19H,COD_19
FD07 FE 19 + CP 19H
FD09 CA FDE2 + JP Z,COD_19
jmp_eq 1AH,COD_1A
FD0C FE 1A + CP 1AH
FD0E CA FDC5 + JP Z,COD_1A
jmp_eq 1BH,COD_1B
FD11 FE 1B + CP 1BH
FD13 CA FD9E + JP Z,COD_1B
FD16 FE 07 CP 7
FD18 C2 FD38 JP NZ,PR_SYM
FD1B BEEP:
FD1B 01 05F0 LD BC,5F0H
FD1E 3E FF BP1: LD A,255
FD20 32 C002 LD (PKC),A ; это отключает ВИ53 (GATE канала 2)
FD23 78 LD A,B
FD24 FB BP2: EI
FD25 3D DEC A
FD26 C2 FD24 JP NZ,BP2
FD29 AF XOR A
FD2A 32 C002 LD (PKC),A
FD2D 78 LD A,B
FD2E F3 BP3: DI
FD2F 3D DEC A
FD30 C2 FD2E JP NZ,BP3
FD33 0D DEC C
FD34 C2 FD1E JP NZ,BP1
FD37 C9 RET
; ---------------------------------------------------
FD38 71 PR_SYM: LD (HL),C ; видимый на экране символ
FD39 CD FDB9 CALL COD_18 ; сместить на следующее знакоместо
FD3C 7A LD A,D
FD3D FE 03 CP 3 ; мы на первой строке ?
FD3F C0 RET NZ ; если не на первой строке
FD40 7B LD A,E
FD41 FE 08 CP 8 ; мы в первой колонке ?
FD43 C0 RET NZ ; если не на первой колонке
FD44 CD FDE2 CALL COD_19
FD47 7A COD_0A: LD A,D
FD48 FE 1B CP 3+24 ; мы на последней строке ?
FD4A C2 FDC5 JP NZ,COD_1A ; если не на последней строке
; ДАЛЕЕ РОЛИК ЭКРАНА
FD4D E5 ROLL: PUSH HL
FD4E D5 PUSH DE
FD4F 21 7810 LD HL,SCBASE+78
FD52 11 77C2 LD DE,SCBASE
FD55 01 079E LD BC,25*78
FD58 ROLLOO:
FD58 7E LD A,(HL) ; пересылка блока размером [BC]
FD59 12 LD (DE),A ; (HL) --> (DE)
FD5A 23 INC HL
FD5B 13 INC DE
loop ROLLOO
FD5C 0B + DEC BC
FD5D 78 + LD A,B
FD5E B1 + OR C
FD5F C2 FD58 + JP NZ,ROLLOO
FD62 D1 POP DE
FD63 E1 POP HL
FD64 C9 RET
; ---------------------------------------------------
FD65 79 AFD65: LD A,C
FD66 FE 59 CP 'Y'
FD68 C2 FCE0 JP NZ,ESCRES
FD6B CD FDB2 CALL HOME
FD6E 3E 02 LD A,2 ; принято 2 байта: ESC и 'Y'
FD70 C3 FCE1 JP SETESC
; ---------------------------------------------------
FD73 79 AFD73: LD A,C
FD74 D6 20 SUB 20H
FD76 4F LD C,A
FD77 0D AFD77: DEC C
FD78 3E 04 LD A,4
FD7A FA FCE1 JP M,SETESC
FD7D C5 PUSH BC
FD7E CD FDC5 CALL COD_1A
FD81 C1 POP BC
FD82 C3 FD77 JP AFD77
; ---------------------------------------------------
; >> NO EXECUTION PATH TO HERE <<
FD85 22 7600 TOBACK: LD (EK_ADR),HL ; это выход из CONOUT
FD88 EB EX DE,HL
FD89 22 7602 LD (POSX),HL
FD8C 3E 80 LD A,80H
FD8E 32 D001 LD (VG_75+1),A
FD91 7D LD A,L
FD92 32 D000 LD (VG_75),A ; запись координат курсора в ВГ75
FD95 7C LD A,H
FD96 32 D000 LD (VG_75),A
FD99 E1 POP HL
FD9A D1 POP DE
FD9B C1 POP BC
FD9C F1 POP AF
FD9D C9 RET
; ---------------------------------------------------
FD9E 3E 01 COD_1B: LD A,1 ; началась ESC-последовательность
FDA0 C3 FCE1 JP SETESC
; ---------------------------------------------------
FDA3 21 7FF4 CLS: LD HL,SA+30*78 ; байт за концом экрана
FDA6 11 0925 LD DE,30*78 +1 ; длина экрана +1
FDA9 AF CLSLOO: XOR A
FDAA 77 LD (HL),A
FDAB 2B DEC HL
FDAC 1B DEC DE
FDAD 7B LD A,E
FDAE B2 OR D
FDAF C2 FDA9 JP NZ,CLSLOO
FDB2 11 0308 HOME: LD DE,308H ; коорд. лев.верхн. угол
FDB5 21 77C2 LD HL,SCBASE
FDB8 C9 RET
; ---------------------------------------------------
FDB9 COD_18: ; ВХОД: E=POSX, D=POSY
; HL= экранный адрес
FDB9 7B LD A,E ; POSX
FDBA 23 INC HL ; следующий экранный адрес
FDBB 1C INC E ; POSX++
FDBC FE 47 CP 8+63 ; последняя колонка ?
FDBE C0 RET NZ ; если была не последняя колонка
FDBF 1E 08 LD E,8 ; нач.позиция по X на новой строке
FDC1 01 FFC0 LD BC,-64
FDC4 09 ADD HL,BC ; вычесть 64 = экр.поз в начало строки
FDC5 7A COD_1A: LD A,D
FDC6 FE 1B CP 1BH ; последняя строка ?
FDC8 01 004E LD BC,78
FDCB C2 FDD3 JP NZ,AFDD3 ; если не последняя строка
FDCE 16 02 LD D,2 ; если последняя строка, то на первую строку
FDD0 01 F8B0 LD BC,-24*78
FDD3 14 AFDD3: INC D
FDD4 09 ADD HL,BC ; вычесть 24*78
FDD5 C9 RET
; ---------------------------------------------------
FDD6 COD_08: ; ВХОД: E=POSX, D=POSY
; HL= экранный адрес
FDD6 7B LD A,E
FDD7 2B DEC HL
FDD8 1D DEC E
FDD9 FE 08 CP 8 ; Были в первой колонке ?
FDDB C0 RET NZ ; Если были не в первой колонке
FDDC 1E 47 LD E,8+63 ; X коорд-та последней колонки
FDDE 01 0040 LD BC,64
FDE1 09 ADD HL,BC ; Экр.адрес в последнюю колонку
FDE2 7A COD_19: LD A,D
FDE3 FE 03 CP 3 ; Это первая строка ?
FDE5 01 FFB2 LD BC,-78
FDE8 C2 FDF0 JP NZ,AFDF0
FDEB 16 1C LD D,3+25
FDED 01 0750 LD BC,24*78
FDF0 15 AFDF0: DEC D
FDF1 09 ADD HL,BC ; вычесть 78 или прибавить 24*28
FDF2 C9 RET
; ---------------------------------------------------
FDF3 7D COD_0D: LD A,L
FDF4 93 SUB E
FDF5 D2 FDF9 JP NC,AFDF9
FDF8 25 DEC H
FDF9 6F AFDF9: LD L,A
FDFA 1E 08 LD E,8 ; лучше LD E,C после загрузки BC
FDFC 01 0008 LD BC,8
FDFF 09 ADD HL,BC
FE00 C9 RET