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