        MAIN "*.*",134

;выбор логического банка из регистра A
ONPAGE  PUSH    BC
        PUSH    HL
        LD      C,A
        LD      B,0
        LD      HL,TABL_PG
        ADD     HL,BC
        LD      A,(HL)
        POP     HL
        POP     BC
;выбор физического банка из регистра A
EX_RAM  DI 
        PUSH    HL
        PUSH    AF
        PUSH    BC
        LD      HL,TYPEC
        BIT     1,(HL)
        JR      NZ,ZS256
        BIT     2,(HL)
        JR      NZ,PROFI
        BIT     3,(HL)
        JR      NZ,TURBO_2
        BIT     4,(HL)
        JR      NZ,ATM1
        BIT     0,(HL)
        JR      NZ,SPECCY
        BIT     7,(HL)
        JR      NZ,SPECCY
        JR      TDK

TURBO_2 PUSH    AF
        PUSH    IX
        AND     #38
        CPL 
        LD      BC,#FFF7
        CALL    OUTC_A
        POP     IX
        POP     AF
        JP      SPECCY

ATM1    LD      BC,#FDFD
        PUSH    AF
        RRCA 
        RRCA 
        RRCA 
        AND     7
        JR      HOME

PROFI   LD      BC,#DFFD
        PUSH    AF
        RRCA 
        RRCA 
        RRCA 
        AND     7
        JR      HOME

ZS256   PUSH    AF
        LD      B,A
        AND     %00001000
        RLCA 
        LD      C,A
        LD      A,B
        AND     %00110000
        RLCA 
        RLCA 
        ADD     A,C
        LD      BC,#1FFD
HOME    OUT     (C),A
        POP     AF

SPECCY  LD      B,A
        AND     24
        RLCA 
        RLCA 
        RLCA 
        LD      C,A
        LD      A,B
        AND     7
        ADD     A,C
        OR      16
        LD      BC,#7FFD
        OUT     (C),A
        NOP 
TDK     POP     BC
        POP     AF
        POP     HL
        RET 

OUTC_A  LD      IX,10835
        PUSH    IX
        JP      15663


;RSCT - временный 64 байтный буфер для
;таблицы банков, также используется
;драйвером RamDisk'а (256 байт).

RSCT    EQU     23296

LENTABL EQU     62 ;макс.колич.банков
        DB      0
TABL_PG DS      LENTABL+1

TYPEC   DB      0 ;тип компьютера
ExtPage DB      0 ;всего доступных банков

;переменные RPAGE и TKARD зарезервированы
;для Ram Disk'а
RPAGE   DB      0 ;всего доступных банков
                  ;в системе с Ram Disk'ом
TKARD   DB      0 ;Текущий банк

;тестирование конфигурации компьютера
TST     CALL    TABINIT
        DI 
        LD      A,(#08)
        CP      #C3
        JR      NZ,ITURBO
        LD      HL,TYPEC
        SET     7,(HL)
ITURBO  LD      HL,(1111)
        LD      BC,#FFF7
        LD      A,%00011111
        CALL    OUTC_A
        LD      DE,(#C000+1111)
        AND     A
        SBC     HL,DE
        LD      BC,#FFF7
        LD      A,255
        CALL    OUTC_A
        JR      NZ,IDFFD
        LD      HL,TYPEC
        SET     3,(HL)
        JR      I7FFD
MM_ATM  DB      #DB,#1F,#C9
IDFFD   LD      DE,#0007
        LD      BC,#DFFD
        CALL    TSTB
        JR      NZ,I1FFD
        LD      HL,TYPEC
        SET     2,(HL)
        JR      I7FFD
I1FFD   LD      DE,#0010
        LD      B,#1F
        CALL    TSTB
        JR      NZ,IFDFD
        LD      HL,TYPEC
        SET     1,(HL)
        JR      I7FFD
IFDFD   LD      B,C
        LD      D,#11
        CALL    TSTB
        JR      NZ,I7FFD
        LD      HL,TYPEC
        SET     4,(HL)
I7FFD   LD      B,#7F
        CALL    TSTB
        JR      NZ,SIZED
        LD      HL,TYPEC
        SET     0,(HL)
SIZED   CALL    VIRT
        LD      A,(ExtPage)
        CP      8
        JR      C,ENDING
        LD      HL,TYPEC
        LD      A,(HL)
        DEC     A
        JR      NZ,ENDING
        SET     5,(HL)
ENDING  XOR     A
        CALL    EX_RAM
        EI 
        RET 

TSTB    LD      IX,#FFFF
        OUT     (C),E
        CALL    TSTB1
        LD      L,(IX)
        LD      (IX),E
        OUT     (C),D
        CALL    TSTB1
        LD      H,(IX)
        LD      (IX),D
        OUT     (C),E
        CALL    TSTB1
        LD      A,(IX)
        CP      E
        LD      (IX),L
        OUT     (C),D
        PUSH    AF
        CALL    TSTB1
        POP     AF
        LD      (IX),H
        RET 

TSTB1   LD      A,B
        CP      #7F
        RET     Z
        PUSH    BC
        LD      B,#7F
        LD      A,#10
        OUT     (C),A
        POP     BC
        RET 

VIRT    LD      IX,#C000
        LD      HL,RSCT+63
        LD      B,64
V_R11   LD      A,B
        DEC     A
        CALL    EX_RAM
        LD      C,(IX+0)
        LD      (HL),C
        LD      (IX+0),A
        DEC     HL
        DJNZ    V_R11
        PUSH    AF
        LD      A,LENTABL
        LD      (ExtPage),A
        POP     AF
        LD      DE,TABL_PG
V_R20   LD      A,(DE)
        CP      #FF
        JR      Z,V_R30
        CALL    EX_RAM
        CP      (IX+0)
        JR      Z,V_R22
        PUSH    DE
        LD      HL,TABL_PG+LENTABL
        AND     A
        SBC     HL,DE
        PUSH    HL
        POP     BC
        PUSH    DE
        POP     HL
        INC     HL
        LDIR 
        PUSH    HL
        LD      HL,ExtPage
        DEC     (HL)
        POP     HL
        POP     DE
        DEC     DE
V_R22   INC     DE
        JR      V_R20
V_R30   LD      B,64
        LD      HL,RSCT
V_R31   LD      A,64
        SUB     B
        CALL    EX_RAM
        LD      A,(HL)
        LD      (IX+0),A
        INC     HL
        DJNZ    V_R31
        RET 

DEBUG   PUSH    DE
        POP     HL
NO_PG1  DEC     DE
        LD      A,(DE)
        CP      #FF
        JR      Z,NO_PG2
        CP      C
        JR      NZ,NO_PG1
        SBC     HL,DE
        PUSH    HL
        POP     BC
        PUSH    DE
        POP     HL
        INC     HL
        LDIR 
        PUSH    HL
        LD      HL,ExtPage
        DEC     (HL)
        POP     HL
        DEC     HL
        DEC     HL
NO_PG2  EX      DE,HL
        RET 

;инициализациа таблицы банков, исключаются
;банки 2,5.
TABINIT LD      HL,TABL_PG-1
        LD      (HL),255
        INC     HL
        XOR     A
TABI1   LD      (HL),A
TABI2   INC     A
        CP      2
        JR      Z,TABI2
        CP      5
        JR      Z,TABI2
        INC     HL
        CP      LENTABL+2
        JR      NZ,TABI1
        LD      (HL),255
        LD      HL,RSCT
        PUSH    HL
        POP     DE
        INC     DE
        LD      BC,63
        LD      (HL),B
        LDIR 
        INC     B
        LD      (TYPEC),BC
        RET 
;-----------------------------
AUTOCONF
        NOP 
        CALL TST
START1  LD A,(ExtPage)
        LD (RPAGE),A
        LD A,2
        CALL ONPAGE
        LD A,#C9
        LD (AUTOCONF),A
        RET 

;***************************************************************
TESTRD_ CALL TESTRD
        PUSH AF
        LD A,2
        CALL ONPAGE
        POP AF
exiRW   PUSH AF
        LD A,(GUI_PAGE)
        LD BC,#7FFD
        OUT (C),A
        POP AF
        RET 

RW_     PUSH AF
        LD A,2
        LD (TKARD),A
        POP AF
        CALL RW
        JP exiRW
;       LD A,2
 ;      CALL ONPAGE
  ;     RET

TESTRD  NOP 
        LD A,(ExtPage) ;всего банков
        CP 7
        JP C,R_ERR
        DEC A
        CALL ONPAGE ;выбор посл.банка
        LD A,(#C8E7)
        CP 16
        JP NZ,R_ERR
        LD HL,(#C8E1)
        LD DE,(#C8E5)
        LD A,H
        LD H,0
        ADD HL,DE
        EX DE,HL
        CALL RLENF9
        LD B,6
        XOR A
TESTRD2 RR H
        RR L
        RRA 
        DJNZ TESTRD2
        AND A
        RET NZ
        LD A,(ExtPage)
        SUB L
        LD (RPAGE),A
;в RPAGE записываем сколько доступно
;банков с открытым RamDisk'ом
        XOR A
        RET 

R_ERR   SCF 
        RET 

;Умнож на 16 и прибавл DE
RLENF9  DUP 4
        RLCA 
        EDUP 
        LD L,A
        AND #0F
        LD H,A
        LD A,L
        AND #F0;    %11110000
        LD L,A
        ADD HL,DE
        RET 

;RAM DISK: чтение/запись сектора
;HL-адрес, DE-дор/сек, C=5 чт,=6 зап.
RW      DEC     C
        JR      NZ,RW0A
;       LD      A,4
;       LD      (23798),A
        RET 
RW0A    INC     C
RW0     LD      (23796),DE
        LD      A,B
        AND     A
        JR      Z,RW0C
        PUSH    BC
        PUSH    HL
        CALL    RW0S
        EX      DE,HL
        POP     HL
        POP     BC
        AND     A
        JR      NZ,RW0B
        INC     H
        DEC     B
        JR      RW0
RW0C    EI 
        RET 
RW0B  ; LD      HL,TX40      !!!
;       CALL    CWR0         !!!
        POP     HL
;       LD      A,(TIM)      !!!
;       AND     A            !!!
;       CALL    NZ,IMON0     !!!
        LD      A,20
        RET 

RW0S    LD      A,C
        PUSH    AF
        LD      A,(ExtPage)
        DEC     A
        LD      C,A
        LD      A,D
RW1     SUB     4
        JR      C,RW2
        DEC     C
        LD      B,A
        LD      A,(RPAGE)
        DEC     A
        CP      C
        LD      A,B
        JR      NZ,RW1
        POP     AF
        LD      A,20
        RET 
RW2     ADD     A,4
        DUP 4
        RLCA 
        EDUP 
        ADD     A,E
        ADD     A,#C0
        LD      E,0
        LD      D,A
        POP     AF
        CP      5
        JP      Z,RDM
        JP      WRM

RW4     LD      HL,(23796)
        INC     L
        LD      A,L
        CP      16
        JR      NZ,RW5
        INC     H
        LD      L,0
RW5     LD      (23796),HL
        XOR     A
        RET 

;чтение из банка в C по адресу в DE, и
;запись в текущий банк по адресу в HL.
RDM     PUSH    HL
        PUSH    DE
        LD      A,C
        CALL    ONPAGE
        POP     HL
        LD      DE,RSCT
        LD      BC,256
        PUSH    DE
        PUSH    BC
        LDIR 
        LD      A,(TKARD)
        CALL    ONPAGE
        POP     BC
        POP     HL
        POP     DE
        LDIR 
        JP      RW4

;чтение из текущего банка по адресу в HL
;и запись в банк C по адресу в DE.
WRM     PUSH    DE
        LD      A,C
        LD      DE,RSCT
        LD      BC,256
        PUSH    DE
        PUSH    BC
        LDIR 
        CALL    ONPAGE
        POP     BC
        POP     HL
        POP     DE
        LDIR 
        LD      A,(TKARD)
        CALL    ONPAGE
        JP      RW4

; Открыть Рам-Диск

ROpen   LD A,(ExtPage)
        DEC A
        CALL ONPAGE
        LD HL,#C000
        LD DE,#C001
        LD BC,16383
        LD (HL),L
        LDIR 

        LD A,16
        LD (#C8E7),A
        LD HL,#0100
        LD (#C8E1),HL
        LD A,(RRAM)
        LD H,64
        LD L,0 ;HL = A*H
        LD D,L
        LD E,A
        DUP 8
        ADD HL,HL
        JR NC,$+3
        ADD HL,DE
        EDUP 
        LD BC,16
        SBC HL,BC
        LD (#C8E5),HL
        LD A,22
        LD (#C8E3),A
        LD HL,Nm
        LD DE,#C8F5
        LD BC,12
        LDIR 
        LD HL,#C8EA
        LD DE,#C8EB
        LD BC,7
        LD (HL)," "
        LDIR 
        LD A,2
        JP ONPAGE

Nm      DB "Bge-Disk   "
RRAM    DB 1

A_SWAP  EQU $

