Ниже исходник ПЗУ для РК86. Рекомендую всем владельцам РК. В нём курсор большой, что гораздо приятнее, чем мизерная чёрточка.
Код:
; БАЗОВЫЙ МОНИТОР РК86 (РАДИО 8.86)
; =================================
; Modify: для использования LA0,LA1 (полный оригинал при ORIG=1)
; Также исправлена ошибка ухода на XT_ROM.
; В строке T_REGS '-' заменены на '='.
.Z80
aseg
ORG 100H
ORIG EQU 0 ; если не 0, то оригинальный курсор
BASE EQU 7600H ; ниже D0H байтов - служебные ячейки
EK_ADR EQU BASE ; текущий адрес на экране
POSX EQU BASE+02H
POSY EQU BASE+03H
ESC_F EQU BASE+04H
KBDFLG EQU BASE+05H ; если =0, то есть символ в SYMBUF
RUSLAT EQU BASE+06H
LAST_K EQU BASE+09H ; эти 2 байта должны следовать подряд
COUNT EQU BASE+0AH ; счётчик опросов (вначале 15)
APVFLG EQU BASE+0BH
FRELOC EQU BASE+0CH ; эта ячейка не используется
TMPSTK EQU BASE+0DH ; временно храним стек при МГ п/п-ммах
POINT EQU BASE+14H ; адрес откуда произошёл RST_30H
R_HL EQU BASE+16H
R_SP EQU BASE+1CH
R_AF EQU BASE+1EH ; НИЖЕ ОТКЛАДЫВАЮТСЯ AF,HL,DE,BC
STOP_A EQU BASE+23H
TMP_COD EQU BASE+25H
GOTO_HL EQU BASE+26H ; ДЛЯ БАЙТА C3H (JMP)
PAR_HL EQU BASE+27H
PAR_DE EQU BASE+29H
PAR_BC EQU BASE+2BH
FLG_P2 EQU BASE+2DH ; флаг, что есть параметры 2 или 2,3
INV_MG EQU BASE+2EH
KNS_RD EQU BASE+2FH
KNS_WR EQU BASE+30H
EK_ADR EQU BASE+31H
COMBUF EQU BASE+33H ; буфер ввода директивы
STACK EQU BASE+0CFH ; стек монитора
SA EQU 076D0H ; 76D0 начало экранной области
SCBASE EQU 077C2H ; 77C2 ЛЕВ.ВЕРХН.УГОЛ ЭКР.
VG_75 EQU 0C000H
VT_57 EQU 0E000H
PA EQU 8000H
PB EQU PA+1
PC EQU PA+2
PU EQU PA+3
PDA EQU 0A000H
PDB EQU PDA+1
PDU EQU PDA+3
XT_ROM EQU 0F000H ; второе ПЗУ РК-86
.comment \ ; Внутренние нестандартные точки ПЗУ РК
GETLIN EQU 0F8EEH
YF81B EQU 0FEEAH
YCMPDH EQU 0F990H
ADR_BL EQU 0FB78H ; Выводит ВК, вправо на 4 позиции и ADR_BL
RIGHT4 EQU 0F9B0H ; Выводит ВК и вправо на 4 позиции
GETPRM EQU 0F92CH
VIDEO EQU 0FACEH
MIKROSH EQU 0F89DH ; старт "МИКРОШИ"
\
; ----------------------------------------------
.msg MACRO ADDR
LD HL,ADDR
CALL MSSG
ENDM
; ----------------------------------------------
defb 'MON_RK86'
DW 800H,800H,000,000
.phase 0F800H
JP VHOD_0 ; +0
JP CONIN ; +3
JP LDBYTE ; +6
JP COUT_C ; +9
JP WRBYTE ; +C
JP COUT_C ; +F это д.быть PRINT
JP STATUS ; +12
JP HEX_A ; +15
JP MSSG ; +18
JP XF81B ; +1B
JP ASKCUR ; +1E
JP RD_SCR ; +21
JP RD_BLK ; +24
JP WR_BLK ; +27
JP CHSUMM ; +2A
JP PUSK_VG ; +2D
JP ASKTOP ; +30
JP SETTOP ; +33
; ----------------------------------------------
VHOD_0: LD A,8AH
LD (PU),A
LD SP,STACK
CALL PUSK_VG
LD HL,BASE
LD DE,COMBUF+2CH
LD C,0
CALL DIR_F
LD HL,STACK
LD (R_SP),HL
LD HL,TITR
CALL MSSG
CALL PUSK_VG ; это лишнее
LD HL,BASE-1
LD (EK_ADR),HL
LD HL,1D2AH
LD (KNS_RD),HL
LD A,0C3H
LD (GOTO_HL),A
if $ ne RABADR + 06CH
if1
.printx * Standard subroutine WBOOT shifted ! *
endif
endif
WBOOT: ; Warm_BOOT
LD SP,STACK
LD HL,PROMPT
CALL MSSG
; следующие 3 команды лишние
LD (PC),A
DEC A
LD (PDA+2),A
CALL GETLIN
LD HL,WBOOT
PUSH HL
LD HL,COMBUF
LD A,(HL)
CP 'X'
JP Z,DIR_X
CP 'U'
JP Z,XT_ROM
PUSH AF
CALL GETPRM
LD HL,(PAR_BC)
LD C,L
LD B,H
LD HL,(PAR_DE)
EX DE,HL
LD HL,(PAR_HL)
POP AF
CP 'D'
JP Z,DIR_D
CP 'C'
JP Z,DIR_C
CP 'F'
JP Z,DIR_F
CP 'S'
JP Z,DIR_S
CP 'T'
JP Z,DIR_T
CP 'M'
JP Z,DIR_M
CP 'G'
JP Z,DIR_G
CP 'I'
JP Z,DIR_I
CP 'O'
JP Z,DIR_O
CP 'L'
JP Z,DIR_L
CP 'R'
JP Z,DIR_R
if ORIG
JP XT_ROM ; без доп.ИД7 и ПЗУ на F000 это д.быть JMP ERROR
else
JP ERROR
endif
; ----------------------------------------------
BAKSTP: LD A,low COMBUF ; 33H
CP L ; достигнут конец буфера ввода ?
JP Z,AF8F1
PUSH HL
LD HL,TZABOJ
CALL MSSG
POP HL
DEC HL
JP AF8F3
; ----------------------------------------------
if $ ne RABADR + 0EEH ;F8EC
if1
.printx * Internal subroutine GETLIN shifted ! *
endif
endif
GETLIN: LD HL,COMBUF
AF8F1: LD B,0
AF8F3: CALL CONIN
CP 8
JP Z,BAKSTP
CP 7FH
JP Z,BAKSTP
if ORIG
CALL NZ,COUT_A ; NZ ???
else
CALL COUT_A
endif
LD (HL),A
CP 13
JP Z,AF91A
CP '.'
JP Z,WBOOT
LD B,0FFH
LD A,low COMBUF+1FH
CP L
JP Z,ERROR
INC HL
JP AF8F3
; ----------------------------------------------
AF91A: LD A,B
RLA
LD DE,COMBUF
LD B,0
RET
; ----------------------------------------------
MSSG: LD A,(HL) ; F922
AND A
RET Z
CALL COUT_A
INC HL
JP MSSG
; ----------------------------------------------
if $ ne RABADR + 012CH
if1
.printx * Internal subroutine GETPRM shifted ! *
endif
endif
GETPRM: LD HL,BASE+27H ; 7627H
LD DE,BASE+2DH ; 762DH
LD C,0
CALL DIR_F
LD DE,BASE+34H ; 7634H
CALL GET_HL
LD (PAR_HL),HL
LD (PAR_DE),HL
RET C
LD A,0FFH
LD (FLG_P2),A
CALL GET_HL
LD (PAR_DE),HL
RET C
CALL GET_HL
LD (PAR_BC),HL
RET C
JP ERROR
; ----------------------------------------------
GET_HL: LD HL,0
AF95D: LD A,(DE)
INC DE
CP 13
JP Z,RETCY1
CP ','
RET Z
CP 20H
JP Z,AF95D
SUB 30H
JP M,ERROR
CP 10
JP M,AF982
CP 011H ; 17
JP M,ERROR
CP 17H
JP P,ERROR
SUB 7
AF982: LD C,A
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
JP C,ERROR
ADD HL,BC
JP AF95D
; ----------------------------------------------
RETCY1: SCF
RET
; ----------------------------------------------
if $ ne RABADR + 0190H
if1
.printx * Internal subroutine CMPDH shifted ! *
endif
endif
CMPDH: LD A,H
CP D
RET NZ
LD A,L
CP E
RET
if CMPDH ne 0F990H
if1
.printx * Internal subroutine F990 (CMPDH) shifted ! *
endif
endif
; ----------------------------------------------
AF996: CALL CHK_F4
AF999: CALL CMPDH
JP NZ,AF9A2
AF99F: INC SP
INC SP
RET
; ----------------------------------------------
AF9A2: INC HL
RET
; ----------------------------------------------
CHK_F4: CALL XF81B
CP 3
RET NZ
CALL PUSK_VG
JP ERROR
; ----------------------------------------------
if $ ne RABADR + 01B0H
if1
.printx * Internal subroutine RIGHT4 shifted ! *
endif
endif
RIGHT4: PUSH HL ; Выводит ВК и вправо на 4 позиции
LD HL,TRIGH4
CALL MSSG
POP HL
RET
; ----------------------------------------------
AF9B9: LD A,(HL)
HXA_BL: PUSH BC ; F9BA
CALL HEX_A
LD A,20H
CALL COUT_A
POP BC
RET
; ----------------------------------------------
DIR_D: CALL ADR_BL
AF9C8: CALL AF9B9
CALL AF996
LD A,L
AND 0FH
JP Z,DIR_D
JP AF9C8
; ----------------------------------------------
DIR_C: LD A,(BC)
CP (HL)
JP Z,AF9E6
CALL ADR_BL
CALL AF9B9
LD A,(BC)
CALL HXA_BL
AF9E6: INC BC
CALL AF996
JP DIR_C
; ----------------------------------------------
DIR_F: LD (HL),C
CALL AF999
JP DIR_F
; ----------------------------------------------
DIR_S: LD A,C
CP (HL)
CALL Z,ADR_BL
CALL AF996
JP DIR_S
; ----------------------------------------------
DIR_T: LD A,(HL)
LD (BC),A
INC BC
CALL AF999
JP DIR_T
; ----------------------------------------------
DIR_L: CALL ADR_BL
AFA0B: LD A,(HL)
OR A
JP M,AFA15
CP 20H
JP NC,AFA17
AFA15: LD A,02EH
AFA17: CALL COUT_A
CALL AF996
LD A,L
AND 0FH
JP Z,DIR_L
JP AFA0B
; ----------------------------------------------
DIR_M: CALL ADR_BL
CALL AF9B9
PUSH HL
CALL GETLIN
POP HL
JP NC,AFA3B
PUSH HL
CALL GET_HL
LD A,L
POP HL
LD (HL),A
AFA3B: INC HL
JP DIR_M
; ----------------------------------------------
DIR_G: CALL CMPDH
JP Z,AFA5A
EX DE,HL
LD (STOP_A),HL
LD A,(HL)
LD (TMP_COD),A ; храним байт точки останова
LD (HL),0F7H ; код команды RST_30H
LD A,0C3H
LD (030H),A ; ПОДГОТОВКА RST_30H
LD HL,BREAK
LD (031H),HL
AFA5A: LD SP,BASE+18H
POP BC
POP DE
POP HL
POP AF
LD SP,HL
LD HL,(R_HL)
JP GOTO_HL
; ----------------------------------------------
DIR_R: LD A,090H
LD (PDU),A
AFA6D: LD (PDB),HL
LD A,(PDA)
LD (BC),A
INC BC
CALL AF999
JP AFA6D
; ----------------------------------------------
ASKCUR: LD HL,(POSX)
RET
; ----------------------------------------------
RD_SCR: PUSH HL
LD HL,(EK_ADR)
LD A,(HL)
POP HL
RET
; ----------------------------------------------
DIR_I: LD A,(FLG_P2)
OR A
JP Z,AFA91
LD A,E
LD (KNS_RD),A
AFA91: CALL RD_BLK
CALL ADR_BL
EX DE,HL
CALL ADR_BL
EX DE,HL
PUSH BC
CALL CHSUMM
LD H,B
LD L,C
CALL ADR_BL
POP DE
CALL CMPDH
RET Z
EX DE,HL
CALL ADR_BL
ERROR: LD A,'?'
CALL COUT_A
JP WBOOT
; ----------------------------------------------
RD_BLK: LD A,0FFH
CALL @LD_BC
PUSH HL
ADD HL,BC
EX DE,HL
CALL LDBCBS
POP HL
ADD HL,BC
EX DE,HL
PUSH HL
CALL AFB0A
LD A,0FFH
CALL @LD_BC
POP HL ; БЫСТРЕЕ DB 06 -> LD B,NN
if $ ne RABADR + 02CEH
if1
.printx * Internal subroutine PUSK_VG shifted ! *
endif
endif
PUSK_VG:
PUSH HL
LD HL,VG_75+1
LD (HL),0 ; reset commando
DEC HL ; адрес VG_75
LD (HL),04DH ; 0.1001101 77+1 знакомест
LD (HL),01DH ; 00.011101 29+1 строк
if ORIG
LD (HL),99H ; 1001.1001 9 +1 линия подчерк.
; 9+1 линий в знакоместе
LD (HL),93H ; 1.0.01.0011 без смещ.
; курсор - мигающая линия подчеркивания
; атрибуты отображать пробелом
; 3 такта сдвига - длина обр хода стр.р.
else
LD (HL),59H ; **** лучше 58H: линия подч-я - выше
LD (HL),0C3H ; 1.1.00.0011 - ЭТО МОЕ ИЗМЕНЕНИЕ
; курсор - мигающее знакоместо
; атрибуты не отображать
endif ; ТЕПЕРЬ БОЛЬШОЙ КУРСОР
INC HL ; адрес VG_75+1
LD (HL),27H ; start display commando
LD A,(HL) ; read status
AFAE1: LD A,(HL) ; read status
AND 20H ; mask 'Interrupt request flag'
JP Z,AFAE1 ; ждем конца строки
LD HL,VT_57+8
LD (HL),80H
LD L,4 ; VT_57+04 !! НЕ_КОРРЕКТНО
LD (HL),low SA ; 0D0H
LD (HL),high SA ; 076H
INC L ; адрес VT_57+5
LD (HL),23H
LD (HL),49H
LD L,8 ; VT_57+8 !! НЕ_КОРРЕКТНО
LD (HL),0A4H
POP HL
RET
; ----------------------------------------------
LDBCBS: LD A,8
@LD_BC: CALL LDBYTE
LD B,A
LD A,8
CALL LDBYTE
LD C,A
RET
; ----------------------------------------------
AFB0A: LD A,8
CALL LDBYTE
LD (HL),A
CALL AF999
JP AFB0A
; ----------------------------------------------
CHSUMM: LD BC,0
AFB19: LD A,(HL)
ADD A,C
LD C,A
PUSH AF
CALL CMPDH
JP Z,AF99F
POP AF
LD A,B
ADC A,(HL)
LD B,A
CALL AF999
JP AFB19
; ----------------------------------------------
DIR_O: LD A,C
OR A
JP Z,AFB35
LD (KNS_WR),A
AFB35: PUSH HL
CALL CHSUMM
POP HL
CALL ADR_BL
EX DE,HL
CALL ADR_BL
EX DE,HL
PUSH HL
LD H,B
LD L,C
CALL ADR_BL ; КС
POP HL
WR_BLK:
PUSH BC ; КС
LD BC,0 ; выводим 256 байтов 00 (пилотон)
AFB4D: CALL WRBYTE
DEC B
EX (SP),HL ; это задержка 38 тактов
EX (SP),HL
JP NZ,AFB4D
LD C,0E6H ; выводим синхробайт E6
CALL WRBYTE
CALL WR_HL ; выводим НА
EX DE,HL
CALL WR_HL ; выводим КА
EX DE,HL
CALL AFB86 ; выводим блок
LD HL,0
CALL WR_HL ; выводим 2 байта 00
LD C,0E6H ; снова выводим с/байт E6
CALL WRBYTE
POP HL
CALL WR_HL ; выводим КС
JP PUSK_VG
; ----------------------------------------------
if $ ne RABADR + 0378H
if1
.printx * Internal subroutine ADR_BL shifted ! *
endif
endif
ADR_BL: PUSH BC ; Выводит ВК, вправо на 4 позиции и ADR_BL
CALL RIGHT4
LD A,H
CALL HEX_A
LD A,L
CALL HXA_BL
POP BC
RET
; ----------------------------------------------
AFB86: LD C,(HL)
CALL WRBYTE
CALL AF999
JP AFB86
; ----------------------------------------------
WR_HL: LD C,H
CALL WRBYTE
LD C,L
JP WRBYTE
; ----------------------------------------------
@LDBYTE EQU LDBYTE
if $ ne RABADR + 0398H
if1
.printx * LDBYTE for emulator B2M need be at FB98 ! *
endif
endif
LDBYTE: PUSH HL
PUSH BC
PUSH DE
LD D,A
AFB9C: LD A,80H
LD (VT_57+8),A
LD HL,0
ADD HL,SP
LD SP,0
LD (TMPSTK),HL
LD C,0
LD A,(PC)
RRCA
RRCA
RRCA
RRCA
AND 1
LD E,A
AFBB7: POP AF
LD A,C
AND 07FH
RLCA
LD C,A
LD H,0
AFBBF: DEC H
JP Z,AFC34
POP AF ; РЕГЕНЕРАЦИЯ ОЗУ
LD A,(PC)
RRCA
RRCA
RRCA
RRCA
AND 1
CP E
JP Z,AFBBF
OR C
LD C,A
DEC D
LD A,(KNS_RD)
JP NZ,AFBDC
SUB 012H
AFBDC: LD B,A
AFBDD: POP AF ; РЕГЕНЕРАЦИЯ ОЗУ
DEC B
JP NZ,AFBDD
INC D
LD A,(PC)
RRCA
RRCA
RRCA
RRCA
AND 001H
LD E,A
LD A,D
OR A
JP P,AFC0B
LD A,C
CP 0E6H ; ПРЯМОЙ СИНХРО-БАЙТ ?
JP NZ,AFBFF
XOR A
LD (INV_MG),A ; ПРИЗНАК ИНВЕРСИИ МАГНИТОФОНА
JP AFC09
; ----------------------------------------------
AFBFF: CP 19H ; ОБРАТНЫЙ С/БАЙТ
JP NZ,AFBB7
LD A,0FFH
LD (INV_MG),A ; Tape inverse flag
AFC09: LD D,9
AFC0B: DEC D
JP NZ,0FBB7H
LD HL,VT_57+4
LD (HL),low SA ; 0D0H
LD (HL),high SA ; 076H
INC HL
LD (HL),023H
LD (HL),049H
LD A,27H ; start display commando
LD (VG_75+1),A
LD A,0E0H ; reset count
LD (VG_75+1),A
LD L,8
LD (HL),0A4H
LD HL,(TMPSTK)
LD SP,HL
LD A,(INV_MG)
XOR C ; with Tape Inverse flag
JP POPREG
AFC34: LD HL,(TMPSTK)
LD SP,HL
CALL PUSK_VG
LD A,D
OR A
JP P,ERROR
CALL CHK_F4
JP AFB9C
; ----------------------------------------------
if $ ne RABADR + 0446H
if1
.printx * WRBYTE for emulator B2M need be at FC46 ! *
endif
endif
@WRBYTE:
WRBYTE: PUSH HL
PUSH BC
PUSH DE
PUSH AF
LD A,80H
LD (VT_57+8),A
LD HL,0
ADD HL,SP
LD SP,0
LD D,8
AFC58: POP AF
LD A,C
RLCA
LD C,A
LD A,1
XOR C
LD (PC),A
LD A,(KNS_WR)
LD B,A
AFC66: POP AF
DEC B
JP NZ,AFC66
LD A,0 ; хо-хо
XOR C
LD (PC),A
DEC D
LD A,(KNS_WR)
JP NZ,AFC7A
SUB 0EH
AFC7A: LD B,A
AFC7B: POP AF ; подъем стека на [рег.B] ячеек
DEC B
JP NZ,AFC7B
INC D
DEC D
JP NZ,AFC58
LD SP,HL
LD HL,VT_57+4
LD (HL),low SA ; 0D0H
LD (HL),high SA ; 076H
INC HL ; VT_57+5
LD (HL),23H
LD (HL),49H
LD A,27H ; start display commando
LD (VG_75+1),A ; 001.sss.bb 001.001.11
LD A,0E0H ; сброс счетчиков строк и знакомест ???
LD (VG_75+1),A
LD L,8
LD (HL),0A4H ; VT_57+8
POP AF
POPREG: POP DE
POP BC
POP HL
@BAK EQU $
RET
if @BAK ne 0FCA4H
if1
.printx * Internal point 0FCA4H (need for emulator B2M) shifted ! *
endif
endif
; ----------------------------------------------
HEX_A: PUSH AF
RRCA
RRCA
RRCA
RRCA
CALL AFCAE
POP AF
AFCAE: AND 00FH
CP 00AH
JP M,AFCB7
ADD A,7
AFCB7: ADD A,30H
COUT_A: LD C,A
COUT_C: PUSH AF
PUSH BC
PUSH DE
PUSH HL
CALL STATUS
LD HL,TOBACK
PUSH HL
LD HL,(POSX)
EX DE,HL
LD HL,(EK_ADR)
LD A,(ESC_F)
DEC A
JP M,NO_ESC ; если ещё не в ESC-последовательности
JP Z,AFD65 ; если второй байт ('Y')
JP PO,AFD73 ; если третий байт
LD A,C ; четвёртый байт
SUB 20H
LD C,A
AFCDD: DEC C
JP M,ESCRES ; СБРОС ESC_F И ВЫХОД
PUSH BC
CALL COD_18 ; ВПРАВО
POP BC
JP AFCDD
ESCRES: XOR A
SETESC: LD (ESC_F),A
RET
NO_ESC: LD A,C
if ORIG
AND 07FH
else
AND 0FFH
endif
LD C,A
CP 1FH
JP Z,CLS
CP 0CH
JP Z,HOME
CP 13
JP Z,COD_0D
CP 10
JP Z,COD0A
CP 8
JP Z,COD_08
CP 18H
JP Z,COD_18
CP 19H
JP Z,COD19
CP 1AH
JP Z,COD1A
CP 27
JP Z,COD1B
CP 7
JP NZ,PR_SYM
BEEP:
LD BC,05F0H
BP1: LD A,B
BP2: EI
DEC A
JP NZ,BP2
LD A,B
BP3: DI
DEC A
JP NZ,BP3
DEC C
JP NZ,BP1
RET
; ----------------------------------------------
PR_SYM: LD (HL),C ; Видимый на экране символ
CALL COD_18 ; сместить на следующее знакоместо
LD A,D
CP 3 ; мы на первой строке ?
RET NZ ; если не на первой строке
LD A,E
CP 8 ; мы в первой колонке ?
RET NZ ; если не на первой колонке
CALL COD19
COD0A: LD A,D
CP 3+24 ; мы на последней строке ?
JP NZ,COD1A ; если не на последней строке
; ДАЛЕЕ РОЛИК ЭКРАНА
PUSH HL
PUSH DE
LD HL,SCBASE ; 077C2H
LD DE,SCBASE+78 ; 07810H
LD BC,25*78 ; 79EH
AFD58:
LD A,(DE) ; ПЕРЕСЫЛКА БЛОКА РАЗМЕРОМ [BC]
LD (HL),A ; (DE) --> (HL)
INC HL
INC DE
DEC BC
LD A,C
OR B
JP NZ,AFD58
POP DE
POP HL
RET
; ----------------------------------------------
AFD65: LD A,C
CP 'Y'
JP NZ,ESCRES
CALL HOME
LD A,2 ; ПРИНЯТО 2 БАЙТА ESC,'Y'
JP SETESC
; ----------------------------------------------
AFD73: LD A,C
SUB 20H
LD C,A
AFD77: DEC C
LD A,4
JP M,SETESC
PUSH BC
CALL COD1A
POP BC
JP AFD77
; ----------------------------------------------
; >> NO EXECUTION PATH TO HERE <<
TOBACK: LD (EK_ADR),HL ; FD85
EX DE,HL
LD (POSX),HL
LD A,80H
LD (VG_75+1),A
LD A,L
LD (VG_75),A
LD A,H
LD (VG_75),A
POP HL
POP DE
POP BC
POP AF
RET
; ----------------------------------------------
COD1B: LD A,1 ; НАЧАЛАСЬ ESC-ПОСЛЕД-СТЬ
JP SETESC
; ----------------------------------------------
CLS: LD HL,SCBASE+832H ; 07FF4H
LD DE,30*78 +1 ; 925H
CLSLOO: XOR A
LD (HL),A
DEC HL
DEC DE
LD A,E
OR D
JP NZ,CLSLOO
HOME: LD DE,308H
LD HL,SCBASE ; 077C2H
RET
; ----------------------------------------------
COD_18: LD A,E ; ВЫЧИСЛИТЬ КООРД.НА ЭКР.
INC HL
INC E
CP 047H ; 71 ?
RET NZ
LD E,8
LD BC,0-40H ; FFC0
ADD HL,BC ; ВЫЧЕСТЬ 64
COD1A: LD A,D
CP 27 ; СТРОКА ?
LD BC,0004EH ; 78
JP NZ,AFDD3
LD D,2
LD BC,0F8B0H ; ?
AFDD3: INC D
ADD HL,BC ; ВЫЧЕСТЬ 750H
RET
; ----------------------------------------------
COD_08: ; ВХОД: E=POSX, D=POSY
; HL= экранный адрес
LD A,E
DEC HL
DEC E
CP 8 ; были в первой колонке ?
RET NZ ; если были не в первой колонке
LD E,7+64 ; это последняя колонка ?
LD BC,64
ADD HL,BC ; экр.адрес в последнюю колонку
COD19: LD A,D
CP 3 ; это первая строка ?
LD BC,0-78
JP NZ,AFDF0
LD D,3+25
LD BC,24*78 ; 750H
AFDF0: DEC D
ADD HL,BC ; Вычесть 78 или прибавить 24*28
RET
; ----------------------------------------------
COD_0D: LD A,L
SUB E
JP NC,AFDF9
DEC H
AFDF9: LD L,A
LD E,8 ;хо-хо
LD BC,8
ADD HL,BC
RET
; ----------------------------------------------
; После 15 вызовов STATUS при нажатой клавише выставляется флаг KBDFLG
STATUS: LD A,(PC)
AND 80H ; RUS/LAT нажат ?
JP Z,AFE0E
LD A,(KBDFLG)
OR A
RET NZ ; если в SYMBUF уже есть символ
AFE0E: PUSH HL
LD HL,(LAST_K)
CALL XF81B
CP L
LD L,A
JP Z,AFE2A
AFE1A: LD A,1
LD (APVFLG),A
LD H,15H ; число опросов, чтобы зафиксировать код
AFE21: XOR A
AFE22: LD (LAST_K),HL
POP HL
LD (KBDFLG),A
RET
; ----------------------------------------------
AFE2A: DEC H ; в рег.A=код клав, в рег.H- COUNT
JP NZ,AFE21
INC A
JP Z,AFE22 ; если код FF, то сброс флагов
INC A
JP Z,KEY_FE ; если код FE (RUSLAT)
PUSH BC ; КЛИК
LD BC,5003H
CALL BP1
POP BC
LD A,(APVFLG)
LD H,0E0H
DEC A
LD (APVFLG),A
JP Z,AFE4C
LD H,40H
AFE4C: LD A,0FFH
JP AFE22
; ----------------------------------------------
KEY_FE: LD A,(PC)
AND 80H
JP Z,KEY_FE ; ждём отпускания РУС/ЛАТ
LD A,(RUSLAT)
CPL
LD (RUSLAT),A
JP AFE1A
; ----------------------------------------------
CONIN: CALL STATUS
OR A
JP Z,CONIN
XOR A
LD (KBDFLG),A
LD A,(LAST_K)
RET
; ----------------------------------------------
XF81B: LD A,(PC)
AND 80H ; RUS/LAT нажат ?
JP NZ,AFE7D
LD A,0FEH
RET
; ----------------------------------------------
AFE7D: XOR A
LD (PA),A
LD (PC),A
LD A,(RUSLAT)
AND 1
OR 6
LD (PU),A
LD A,(PA+1)
INC A
JP NZ,AFE97
DEC A
RET
; ----------------------------------------------
AFE97: PUSH HL
LD L,1 ; хо-хо
LD H,7
AFE9C: LD A,L
RRCA
LD L,A
CPL
LD (PA),A
LD A,(PA+1)
CPL
OR A
JP NZ,AFEB3
DEC H
JP P,AFE9C
AFEAF: LD A,0FFH
POP HL
RET
; ----------------------------------------------
AFEB3: LD L,20H
AFEB5: LD A,(PA+1)
CPL
OR A
JP Z,AFEAF
DEC L
JP NZ,AFEB5
LD L,8
AFEC3: DEC L
RLCA
JP NC,AFEC3
LD A,H
LD H,L
LD L,A
CP 1
JP Z,AFEFA
JP C,AFEF3
RLCA
RLCA
RLCA
ADD A,20H
OR H
CP 5FH ; '_'
JP NZ,AFF06
LD A,20H
POP HL
RET
; ----------------------------------------------
TABK2: defb 09,0AH,0DH,7FH,08H,19H,18H,1AH
TABK1: defb 0CH,1FH,1BH,00H,01H,02H,03H,04H,05H
; ----------------------------------------------
AFEF3: LD A,H
LD HL,TABK1
JP AFEFE
; ----------------------------------------------
AFEFA: LD A,H
LD HL,TABK2
AFEFE: ADD A,L
LD L,A
LD A,(HL)
CP 40H
POP HL
AFF04: RET C ; НЕ ДВИГАТЬ FF04 (СМ.ВЫШЕ)
PUSH HL
AFF06: LD L,A
LD A,(PC)
LD H,A
AND 40H
JP NZ,AFF1A
LD A,L
CP 40H
JP M,AFF3F
AND 1FH
POP HL
RET
; ----------------------------------------------
AFF1A: LD A,(RUSLAT)
OR A
JP Z,AFF2A
LD A,L
CP 40H
JP M,AFF2A
OR 20H
LD L,A
AFF2A: LD A,H
AND 20H
JP NZ,AFF3F
LD A,L
CP 40H
JP M,AFF3B
LD A,L
XOR 20H
POP HL
RET
; ----------------------------------------------
AFF3B: LD A,L
AND 2FH
LD L,A
AFF3F: LD A,L
CP 40H
POP HL
RET P
PUSH HL
LD L,A
AND 00FH
CP 00CH
LD A,L
JP M,AFF50
XOR 010H
AFF50: POP HL
RET
; ----------------------------------------------
ASKTOP: LD HL,(EK_ADR)
RET
; ----------------------------------------------
SETTOP: LD (EK_ADR),HL
RET
; ----------------------------------------------
TITR: defb 1FH,'radio-86rk',0
PROMPT: defb 13,10,'-->',0
TRIGH4: defb 13,10,18H,18H,18H,18H,0
; ----------------------------------------------
if ORIG
T_REGS: defb 13,10
defb ' PC-',13,10
defb ' HL-',13,10
defb ' BC-',13,10
defb ' DE-',13,10
defb ' SP-',13,10
defb ' AF-'
defb 19H,19H,19H,19H,19H,19H,0 ; вверх на 6 строк
else
T_REGS: defb 13,10,' PC='
defb 13,10,' HL='
defb 13,10,' BC='
defb 13,10,' DE='
defb 13,10,' SP='
defb 13,10,' AF='
defb 19H,19H,19H,19H,19H,19H,0 ; вверх на 6 строк
endif
; ----------------------------------------------
TZABOJ: defb 8,32,8,0
; ----------------------------------------------
BREAK: LD (R_HL),HL
PUSH AF
POP HL
LD (R_AF),HL ; REG_AF
POP HL
DEC HL
LD (POINT),HL ; адрес останова RST_30H
LD HL,0
ADD HL,SP
LD SP,R_AF
PUSH HL ; REG_SP
PUSH DE ; REG_DE
PUSH BC ; REG_BC
LD HL,(POINT)
LD SP,STACK
CALL ADR_BL ; ВЫВОД ТОЧКИ С RST_30H
EX DE,HL
LD HL,(STOP_A)
CALL CMPDH ; СЛУЧАЙНЫЙ ИЛИ СТОП ЮЗЕРА ?
JP NZ,WBOOT ; ЕСЛИ ЭТО USER_BREAK, ТО
LD A,(TMP_COD) ; ВОССТАНАВЛИВАЕМ СТОП-ТОЧКУ
LD (HL),A
JP WBOOT
; ----------------------------------------------
DIR_X: LD HL,T_REGS
CALL MSSG
LD HL,POINT
LD B,6
AFFDE: LD E,(HL)
INC HL
LD D,(HL)
PUSH BC
PUSH HL
EX DE,HL
CALL ADR_BL
CALL GETLIN
JP NC,AFFF6
CALL GET_HL
POP DE
PUSH DE
EX DE,HL
LD (HL),D
DEC HL
LD (HL),E
AFFF6: POP HL
POP BC
DEC B
INC HL
JP NZ,AFFDE
RET
; defb 255,255
if $ ne 0
if high $ gt 0F8H
rept 256
if $ ne 0
defb 255
endif
ENDM
endif
else
if1
.printx * Code length over 2048 bytes ! *
endif
endif
.dephase
END