Code: Select all
; Код ПЗУ КНГМД расположенный с адреса 0022,
; который грузится на D000 программой с B000
.Z80
aseg
ORG 100H
.phase 0D000H
PPA EQU 58H
VG93 EQU 50H
CONIN EQU 0F803H
COUT_C EQU 0F809H
HEX_A EQU 0F815H
MSSG EQU 0F818H
; ----------------------------------------------
MSG MACRO ADDR
LD HL,ADDR
CALL MSSG
ENDM
; ----------------------------------------------
AD000: IN A,(VG93+3) ; чтение байта и запись на (DE++)
LD (DE),A
INC DE
JP AD008
; ----------------------------------------------
N_POVT: defb 0
; ----------------------------------------------
AD008: IN A,(PPA) ; ожидание готовности по биту D3
LD L,A
JP (HL)
; ----------------------------------------------
RET ; возврат из загрузки сектора
; ----------------------------------------------
defb 0,0,0
; ----------------------------------------------
AD010: LD SP,0E400H
LD A,00100001B ; 0010 0001 сегменты 0 и 4000
OUT (0),A
LD A,00110101B ; 0011 0101 сегменты 8000 и С000
OUT (1),A
MSG TITR
CALL AD1A6
LD HL,100H
LD (CURADR),HL
XOR A
LD (TRACK),A
INC A
LD (SECTOR),A
AD032: CALL AD113
AND A
JP NZ,GETKEY
AD039: LD A,(AD1F1)
ADD A,4
LD (AD1F1),A ; это лишнее
LD A,(SECTOR)
INC A
LD (SECTOR),A
CP 6
JP C,AD032
LD A,1
LD (SECTOR),A
LD A,(TRACK)
INC A
LD (TRACK),A
CP 2
JP C,AD032
MSG T_WK
LD HL,(100H)
LD DE,7ECFH ; на 100H д.быть байты 31,81
ADD HL,DE
LD A,H
OR L
JP Z,100H ; если считаны байты 31 81 стартуем
MSG TNOBOO
AD076: CALL CONIN
AND 5FH
CP 'A'
JP Z,0F836H
CP 'R'
JP Z,AD010 ; повторить загрузку
LD C,7
CALL COUT_C ; гудок
JP AD076
; ----------------------------------------------
GETKEY: CALL CONIN
AND 5FH
CP 'A'
JP Z,0F836H ; Abort
CP 'R'
JP Z,AD032 ; Repeat
CP 'I'
JP Z,AD039 ; Ignore
CP 'B'
JP Z,AD010 ; Restart
LD C,7
CALL COUT_C ; гудок
JP GETKEY
; ----------------------------------------------
AD0AE: LD A,(SPEED)
AND A
LD B,18H
LD HL,AD1EA
JP Z,AD0BD
INC HL
LD B,28H
AD0BD: LD (AD1EC),HL
LD A,(TRACK)
RRA
LD (AD1F2),A
RRA
RRA
AND 01000000B
OR B
LD B,A
OUT (PPA+2),A
LD A,92H
OUT (PPA+3),A ; режим ППА
LD A,B
OUT (PPA+2),A
IN A,(PPA+1)
LD C,A
LD A,90H
OUT (PPA+3),A ; режим ППА
LD A,B
OR 10000000B
OUT (PPA+2),A
LD A,C
RRCA
RET NC
LD H,4DH
CALL PAUSHL
RET
; ----------------------------------------------
AD0EB: EX DE,HL
LD HL,(CURADR)
EX DE,HL
LD A,(SECTOR)
OUT (VG93+2),A
LD A,(TRACK)
AND 1
RLCA
RLCA
RLCA
RET
; ----------------------------------------------
AD0FE: CALL READY
LD A,0
OUT (VG93),A
CALL READY
LD H,4DH
CALL PAUSHL
XOR A
LD HL,(AD1EC)
LD (HL),A
RET
; ---------------------------------------------------------------------------
AD113: LD A,9
LD (N_POVT),A
CALL AD0AE
AD11B: CALL AD188
LD HL,AD000
LD A,L ; A=0
OUT (PPA+1),A
CALL AD0EB
OR 10000110B
CALL READY
OUT (VG93),A
CALL AD008
PUSH HL ; задержка
POP HL
IN A,(VG93)
AND A
JP Z,@RET
LD (KORR_1),A ; здесь корректируется код программы
CALL AD0FE
LD A,(N_POVT)
DEC A
LD (N_POVT),A
JP NZ,AD11B
LD A,1
PUSH AF
MSG T_ERR
KORR_1 EQU $+1
LD A,0 ; не 'XOR A' т.к здесь корректируется код
CALL HEX_A
MSG T_TRK
LD A,(TRACK)
CALL HEX_A
MSG T_SEC
LD A,(SECTOR)
CALL HEX_A
MSG T_ARIB
POP AF
@RET: RET
; ----------------------------------------------
PAUSHL: LD L,0
CALL PAUS_L
DEC H
RET Z
JP PAUSHL
; ----------------------------------------------
PAUS_L: DEC L
PUSH HL
POP HL
RET Z
JP PAUS_L
; ----------------------------------------------
AD188: LD HL,(AD1EC)
LD A,(HL)
OUT (VG93+1),A
LD HL,AD1F2
CP (HL)
RET Z
LD A,(HL)
LD HL,(AD1EC)
LD (HL),A
OUT (VG93+3),A
CALL READY
LD A,10H
OUT (VG93),A
CALL READY
RET
; ----------------------------------------------
RET
; ----------------------------------------------
AD1A6: DI
LD A,90H
OUT (PPA+3),A ; режим ППА
LD A,0D0H
OUT (VG93),A
LD A,10011000B
OUT (PPA+2),A
LD H,4DH
CALL PAUSHL
XOR A
OUT (VG93),A
CALL READY
LD A,14H
OUT (VG93+3),A
LD A,0AH
OUT (VG93),A
CALL READY
LD A,40H
OUT (VG93),A
CALL READY
XOR A
OUT (VG93),A
LD (AD1EA),A
CALL READY
LD A,5
CALL PAUS_L
RET
; ----------------------------------------------
READY: PUSH AF ; ждём готовность ВГ93
AD1E0: IN A,(VG93)
AND 1
JP NZ,AD1E0
POP AF
RET
; ----------------------------------------------
SPEED: defb 0
AD1EA: defb 0
defb 0
AD1EC: DW 0000
TRACK: defb 0
SECTOR: defb 1
CURADR: defb 0
AD1F1: defb 1
AD1F2: defb 0
TITR: defb 1BH,39H,9,9,1BH,33H,'Disk loader 0.2',1BH,32H
T_WK: defb 13,10,0
T_ERR: defb 13,10,'BOOT I/O Err.-',0
T_TRK: defb ' T-',0
T_SEC: defb ',S-',0
T_ARIB: defb '; (A,R,I,B): ',0
TNOBOO: defb 13,10,'NON-BOOTABLE DISK, (A,R): ',0
; ----------------------------------------------
rept 0D800H - $
defb 255
ENDM
.dephase
END