;LAST UPDATE: 11.12.2013 savelij
 
 
 
                include ../../macros.a80
 
                include ../../global_vars.a80
 
 
 
                include all_vars.a80
 
 
 
VERSBIOS        EQU "1.07.15pe"
 
 
 
                ORG 0
 
                DI
 
                JP $;H_INIT
 
 
 
PM_RUN_4000     OUT (C),E
 
 
 
                DUPL 8-$,0
 
                JP RST8
 
 
 
                DUPL 0X0C-$,0
 
                JP PENTEVO_START
 
 
 
                DUPL 0X14-$,0
 
                OUT (C),A
 
                NOP
 
                RET
 
 
 
                DUPL 0X18-$,0
 
                DI
 
                PUSH BC
 
                LD B,(IX-_MEMDSP)
 
                JP SET_PG
 
 
 
                DUPL 0X20-$,0
 
                JP CONOUT
 
 
 
                DUPL 0X38-$,0
 
                JP DO_INT
 
 
 
PAL_MN          DB 0XFF,0XEC,0XBD,0X8D,0X0C,0XFF,0XEC,0XCF,0X4C,0XCC,0X6F,0X4E,0XBD,0X9C,0X2D,0X0C
 
 
 
; CONVERT PAGE NUMBER
 
ED_PG           ADD A,6
 
                RET
 
 
 
; SET PAGE NUMBER
 
SET_PG  LD (MEMDSP),A
 
                PUSH BC
 
                CPL
 
                LD BC,WIN_P3
 
                OUT (C),A
 
                POP AF
 
                POP BC
 
                RET
 
 
 
ENTRY:  LD      SP,SYS_SP       ; MUST BE CPSYS
 
        IM      1
 
        LD      HL,(TST_1RUN)
 
        LD      DE,55AAH
 
        XOR A
 
        SBC     HL,DE
 
        LD (TST_1RUN),DE
 
        JR Z,ALL_INIT
 
        LD (IX-_TST_IS1),-1
 
ALL_INIT        LD A,0X11
 
        CALL    C_INIT
 
        CALL    M_INIT
 
                LD A,0X11
 
        CALL    C_INIT
 
        CALL    M_INIT
 
                LD A,0X55
 
                IN A,(0XFE)
 
                LD A,1
 
                IN A,(0XFE)
 
                LD A,0X55
 
                IN A,(0XFE)
 
                LD A,8
 
                IN A,(0XFE)
 
                XOR A
 
                IN A,(0XFE)
 
                EI
 
                LD HL,PAL_MN
 
                CALL SP_DIR
 
                LD    SP,0B000H
 
                LD A,3
 
                RST 0X18
 
;---------------------------------
 
; MAIN MENU MANAGER.
 
;
 
; IN:  A - 1 FOR RU7, 0 FOR RU5
 
;      E - IBMPC KEYBOARD LOCKS STATUS
 
; OUT: A - SELECTION (0-CP/M,1-TR-DOS,2-S128,3-S48)
 
;      D - 1 FOR 'TURBO' MODE, 0 IN OTHER CASE
 
;      E - IBMPC KEYBOARD LOCKS STATUS
 
;      L - 1 FOR IMBPC KEYBOARD, 0 FOR SPECTRUM KEYBOARD
 
                LD E,(IX-_KS_SHIFTS)
 
                DI
 
                XOR A
 
                LD DE,0X100
 
                PUSH AF
 
                LD IX,IX_BASE
 
                LD (IX-_KS_SHIFTS),E
 
                DEC D
 
                JR NZ,_NO_TUR
 
                SET 3,(IX-_SYS_P)
 
_NO_TUR         LD A,0X55
 
                IN A,(0XFE)
 
                LD A,8
 
                IN A,(0XFE)
 
                LD A,0X8A
 
                IN A,(0XFE)
 
                LD A,0X55
 
                IN A,(0XFE)
 
                LD A,1
 
                IN A,(0XFE)
 
                EX AF,AF'
 
                LD A,0X55
 
                IN A,(0XFE)
 
                LD A,8
 
                IN A,(0XFE)
 
                XOR A
 
                IN A,(0XFE)
 
                EX AF,AF'
 
                CP 0X0A
 
                JR NC,ALLINIT2
 
                LD A,0X55
 
                IN A,(0XFE)
 
                LD A,7
 
                IN A,(0XFE)
 
                LD HL,IBMKEYB_T
 
                JR ALLINIT3
 
 
 
ALLINIT2        LD HL,SPKEYB_T
 
ALLINIT3        LD DE,KEYBOARD
 
                LD BC,6*3
 
                DI
 
                LDIR
 
                EI
 
                LD A,3
 
                RST 0X18
 
                CALL SP_DEF
 
                POP AF
 
                CALL CI_INIT
 
                LD SP,SYS_SP
 
                CALL PRN
 
                DB 0X1B,0X5F,0
 
                CALL MEM_SIZE
 
                CALL CPM_LOAD
 
                CALL CFG_LOAD
 
                JP ENTR1
 
 
 
DO_INT          PUSH AF                 ; TEST TRDOS ACTIVITY
 
       PUSH BC
 
       PUSH DE
 
       PUSH HL
 
       EX   AF,AF'
 
       EXX
 
       PUSH AF
 
       PUSH BC
 
       PUSH DE
 
       PUSH HL
 
       PUSH IX
 
       LD   IX,IX_BASE
 
       LD   A,1
 
       RST  18H
 
       PUSH AF
 
       LD   HL,TIME_C
 
       LD   B,4
 
TM_L:  INC  (HL)
 
       INC  HL
 
       JR   NZ,TM_DN
 
       DJNZ TM_L
 
TM_DN: CALL CUR_IN
 
                CALL KEYBOARD
 
       POP  AF
 
       RST  18H
 
       POP  IX
 
       POP  HL
 
       POP  DE
 
       POP  BC
 
       POP  AF
 
       EXX
 
       EX   AF,AF'
 
       POP  HL
 
       POP  DE
 
       POP  BC
 
       POP  AF
 
       EI
 
       RET
 
 
 
;---------------------------
 
; MULTYPLEXOR CALL
 
;
 
DO_MUX: EI
 
        PUSH HL
 
        PUSH DE
 
        PUSH AF
 
        LD   A,MUX_LNG-1
 
        CP   C
 
        JR   NC,MUX_OK
 
        POP  AF
 
        LD   A,0FFH
 
        POP  DE
 
        POP  HL
 
        RET
 
 
 
MUX_OK: LD   A,C
 
        LD   HL,MUX_TBL
 
        CALL _IND
 
        POP  AF
 
        POP  DE
 
        EX   (SP),HL
 
        RET
 
 
 
MUX_TBL         DW R_VER
 
                DW CPM_L
 
                DW SET_RST              ; FUNC 0,1,2
 
                DW READA_KNW            ; (3) READ KEY (NO WAIT) (SEE SCANKEY)
 
                DW KB_TYP               ; (4) READ KEYB TYPE (L) & FLAGS (D)
 
                DW G_TIME               ; (5) GET CURRENT TIME
 
                DW WR_FE                ; (6) WRITE TO 'FE' PORT
 
                DW ADR_FE
 
                DW WR_SYS
 
                DW ADR_SYS
 
                DW PAGE_MAN
 
;         DW ADR_FE             ; (7) GET ADDRESS & DEFAULT OF 'FE' PORT
 
;         DW WR_SYS             ; (8) WRITE TO SYS PORT ('TON' & 'TNAB' BITS)
 
;         DW ADR_SYS            ; (9) GET ADDRESS & DEFAULT OF SYS PORT
 
         ;!!!!!!!!!!!!!!!!!!!!!!!
 
;         DW TST_RT     ; RET HL & RTIME
 
;         DW SIGN       ; D - CONST
 
                        ; RET - HL
 
         ;!!!!!!!!!!!!!!!!!!!!!!!
 
MUX_LNG  EQU ($-MUX_TBL)/2
 
 
 
 
 
R_VER:  LD      HL,107H ; MUX FUNC 0 - GET VERSION (HL-VERSION)
 
                LD DE,-1
 
        XOR     A
 
        RET
 
 
 
CPM_L:  LD      BC,1600H; MUX FUNC 1 - LOAD CPM IMAGE
 
        CALL    CPM_L1
 
        XOR     A
 
        RET
 
 
 
SET_RST:LD      DE,(ENT_ADR)    ; MUX FUNC 2 - SET RESTART ADRESS
 
        LD      (ENT_ADR),HL    ; HL - ADRESS FOR RESTART (RET IN HL OLD)
 
        EX      DE,HL
 
        XOR     A
 
        RET
 
 
 
G_TIME: LD      DE,(TIME_C)     ; MUX FUNC 5 - GET TIME INTO HL:DE
 
        LD      HL,(TIME_C+2)
 
        XOR     A
 
        RET
 
 
 
ADR_SYS
 
WR_SYS
 
ADR_FE
 
WR_FE
 
ERR_FF  LD A,0XFF
 
        RET
 
 
 
CHK_SUM 
 
;               IF HACK_RBIOS=0
 
;               LD HL,0XC000
 
;               ELSE
 
                RET
 
                DW 0XC000
 
;               ENDIF
 
                XOR A
 
CS_LP           ADD A,(HL)
 
                ADC A,0
 
                INC HL
 
                BIT 7,H
 
                JR NZ,CS_LP
 
                DEC A
 
                RET Z
 
                JP PROT
 
 
 
;---------------------------------------
 
; PAGE MANIPULATION
 
PAGE_MAN        LD A,E
 
                CP 7
 
                JR Z,PM_TST_RU5
 
                JR NC,PM_ERR_1
 
PM_2            LD (TMP_W),HL
 
                LD HL,PM_ROM_TAB
 
                CP 4
 
                JR NC,PM_1
 
                LD HL,PM_RAM_RU5
 
                BIT 0,(IX-_FLAG)
 
                JR NZ,PM_1
 
                LD HL,PM_RAM_RU7
 
PM_1            BIT 0,A
 
                JR Z,PM_3
 
                LD A,6
 
                CALL ADD_HL_A
 
PM_3            LD A,B
 
                CALL _VJMP
 
                DB 4
 
                DW ERR_FF
 
                DW PM_GET_INF
 
                DW PM_SET_PG
 
                DW PM_GO
 
PM_TST_RU5      BIT 0,(IX-_FLAG)
 
                JR Z,PM_2
 
PM_ERR_1        LD A,1
 
                RET
 
 
 
PM_ERR_2        LD A,2
 
                RET
 
 
 
PM_ERR_3        LD A,3
 
                RET
 
 
 
PM_GET_INF      LD A,D
 
                CP 6
 
                JR NC,PM_ERR_2
 
                CALL ADD_HL_A
 
                LD D,(HL)
 
                XOR A
 
                RET
 
 
 
PM_GO           LD A,D
 
                PUSH HL
 
                POP IY
 
                INC HL
 
                EXX
 
                LD HL,PM_GO_TAB
 
                CP 3
 
                JR NC,PM_ERR_3
 
                CALL _IND
 
                LD DE,4004H
 
                LD BC,32-4
 
                LDIR
 
                LD E,(IX-_SYS_P)
 
                DI
 
                IM 0
 
                LD BC,0C077H
 
                XOR A
 
                OUT (C),A
 
                LD BC,CONF_128
 
                OUT (C),A
 
                LD A,(IY+4)
 
                RCALL PM_SET
 
                LD A,10H
 
                LD BC,CONF_128
 
                OUT (C),A
 
                LD A,(IY+0)
 
                RCALL PM_SET
 
                LD BC,0C077H
 
                LD A,6
 
                OUT (C),A
 
                LD A,(IY+5)
 
                RCALL PM_SET
 
                XOR A
 
                LD BC,CONF_128
 
                OUT (C),A
 
                LD A,(IY+5)
 
                RCALL PM_SET
 
                LD BC,0FF77H
 
                LD A,E
 
                AND 0F8H
 
                OR 3
 
                LD E,A
 
                JP PM_RUN_4000
 
 
 
PM_SET          EXX
 
                LD E,L
 
                LD D,H
 
                LD BC,0F7H
 
                JR PM_S_1
 
 
 
PAGE_L1         LD A,(DE)
 
                INC DE
 
PM_S_1          XOR 80H
 
                CPL
 
                OUT (C),A
 
                LD A,B
 
                ADD A,40H
 
                LD B, A
 
                JR NC,PAGE_L1
 
                EXX
 
                RET
 
 
 
MON_IMG         include mon.a80
 
 
 
CH1:            ; EDISK  RU7
 
                DB 0XFF         ;0FFH    ;+ ПРИЗНАК ДЕЙСТВИТЕЛЬНОСТИ
 
                DB 4            ;2       ;+ КОД УСТРОЙСТВА
 
                DB 0            ;0       ;+ НОМЕР ПРИВОДА
 
                DB 0            ;1       ;- КОД ПРИВОДА
 
                DB 5            ;1       ;+ ЧИСЛО ФИКСИРОВАННЫХ ГОЛОВОК
 
                DB 0            ;0       ;+ ЧИСЛО СМЕННЫХ ГОЛОВОК
 
                DW 0X96         ;1AH     ;+ ЧИСЛО ЦИЛИНДРОВ НА ДИСКЕ
 
                DB 0X11         ;128     ;+ ЧИСЛО СЕКТОРОВ НА ДОРОЖКЕ
 
                DW 0X200        ;128     ;+ ЧИСЛО БАЙТОВ В СЕКТОРЕ
 
                DB 1            ;1       ;+ ЧИСЛО СИСТЕМНЫХ ДОРОЖЕК
 
                DW 0            ;0       ;+ НОМЕР НАЧАЛЬНОГО ЦИЛИНДРА
 
                DW 0XC5E4       ;3328    ;+ ЧИСЛО БЛОКОВ НА ДИСКЕ
 
                DW 0X44         ;128     ;+ ЧИСЛО БЛОКОВ НА ДОРОЖКЕ
 
                DW 0X2EE        ;1AH     ;+ ЧИСЛО ДОРОЖЕК НА ДИСКЕ
 
                DB 8            ;8       ;+ ДЛИНА НОМЕРА БЛОКА В СЕКТОРЕ
 
                DW 0X80         ;128     ;+ ЧИСЛО ЗАПИСЕЙ В ДИРЕКТОРИИ
 
                DB 2
 
                DB 2
 
                DB 2
 
                DW 0
 
                DB 0XFF
 
                DB 2
 
                DB 0X50
 
                DW 0X50
 
                DW 0
 
 
 
CH1_5:          ; EDISK RU5 (ROM)
 
        DB      0FFH    ;+ ПРИЗНАК ДЕЙСТВИТЕЛЬНОСТИ
 
        DB      2       ;+ КОД УСТРОЙСТВА
 
        DB      0       ;+ НОМЕР ПРИВОДА
 
        DB      1       ;- КОД ПРИВОДА
 
        DB      1       ;+ ЧИСЛО ФИКСИРОВАННЫХ ГОЛОВОК
 
        DB      0       ;+ ЧИСЛО СМЕННЫХ ГОЛОВОК
 
                DW              160             ;3H      ;+ ЧИСЛО ЦИЛИНДРОВ НА ДИСКЕ
 
        DB      16      ;+ ЧИСЛО СЕКТОРОВ НА ДОРОЖКЕ
 
        DW      256     ;+ ЧИСЛО БАЙТОВ В СЕКТОРЕ
 
        DB      2       ;+ ЧИСЛО СИСТЕМНЫХ ДОРОЖЕК
 
        DW      0       ;+ НОМЕР НАЧАЛЬНОГО ЦИЛИНДРА
 
                DW              5120    ;     384     ;+ ЧИСЛО БЛОКОВ НА ДИСКЕ
 
        DW      32     ;+ ЧИСЛО БЛОКОВ НА ДОРОЖКЕ
 
                DW              160             ;3H      ;+ ЧИСЛО ДОРОЖЕК НА ДИСКЕ
 
        DB      8       ;+ ДЛИНА НОМЕРА БЛОКА В СЕКТОРЕ
 
        DW      128     ;+ ЧИСЛО ЗАПИСЕЙ В ДИРЕКТОРИИ
 
 
 
                include conio.a80
 
                include scankey.a80
 
                include textio.a80
 
                include hex.a80
 
                include disk.a80
 
                include fdc_wd.a80
 
                include ed_drv.a80
 
                include hddrv.a80
 
                include config.a80
 
 
 
CPM_IMG         binclude cpm.img
 
                include bios.a80
 
CPM_SIZE        EQU $-CPM_IMG
 
 
 
VAR1_I
 
;          IN VALUE
 
RQCHAN_         DB 0            ;       DM      RQCHAN   1       ;НОМЕР КАНАЛА
 
RQCOM_          DB 0            ;       DM      RQCOM    1       ;КОМАНДА
 
RQBLN_          DB 0            ;       DM      RQBLN    1       ;ЧИСЛО БЛОКОВ
 
RQTRACK_        DW 0            ;       DM      RQTRACK  2       ;НОМЕР ДОРОЖКИ
 
RQBLOCK_        DW 0X4F00       ;       DM      RQBLOCK  2       ;НОМЕР БЛОКА
 
RQBADR_         DW 0X18         ;       DM      RQBADR   2       ;БУФЕР ПОЛЬЗОВАТЕЛЯ
 
 
 
;          WORK VALUE
 
RQHEAD_         DB 7            ;       DM      RQHEAD   1       ;НОМЕР ГОЛОВКИ
 
RQCYL_          DW 0            ;       DM      RQCYL    2       ;НОМЕР ЦИЛИНДРА
 
RQDEV_          DB 0            ;       DM      RQDEV    1       ;КОД УСТРОЙСТВА
 
LOCBUF_         DW 0            ;       DM      LOCBUF   2       ;АДРЕС БЛОКА В БУФЕРЕ
 
RQSECT_         DB 7            ;       DM      RQSECT   1       ;НОМЕР СЕКТОРА
 
;DM      DCSEGM  2       ;СЕЛЕКТОР СЕГМЕНТА
 
DCBUF_          DW 0X300        ;       DM      DCBUF    2       ;АДРЕС БУФЕРА
 
REP_            DB 1            ;       DM      REP      1       ;СЧЕТЧИК ЧИСЛА ПОВТОРОВ
 
 
 
;ПЕРЕМЕННЫЕ КОНТРОЛЕРА ФЛОПОВ
 
FD_TRKS_        DB 0X0A,7,8,0   ;       DM      FD_TRKS  4       ;НОМЕРА ТЕКУЩИХ ДОРОЖЕК
 
 
 
;БЛОК СОСТОЯНИЯ БУФЕРА
 
BUFT_           DB 0            ;       DM      BUFT     1               ;НОМЕР КАНАЛА
 
BUFTRK_         DW 0X1001       ;       DM      BUFTRK   2               ;НОМЕР ДОРОЖКИ
 
BUFSEC_         DB 0X3F         ;       DM      BUFSEC   1               ;НОМЕР СЕКТОРА
 
 
 
                DB 0XFE,0,0XA6
 
                DUPL 0X0C,0
 
                DB 0XFF,0X0F,5,0,8,0X60,4,0X3F,0XC9,0,0
 
 
 
VAR1_S          EQU $-VAR1_I
 
 
 
PALN            DB 0FFH,0FEH,0FDH,0FCH,0EFH,0EEH,0EDH,0ECH,0FFH,0DEH,0BDH,09CH,06FH,04EH,02DH,00CH
 
 
 
                include init.a80
 
                include ve31.a80
 
                include ci.a80
 
 
 
;               IF HACK_RBIOS=0
 
;               ELSE
 
                DUPL 0X3E20-$,0
 
WR_MAS_SLA      LD BC,HD_HEAD;0XCF
 
                LD A,(IY+2)
 
                AND 1
 
                RRCA
 
                RRCA
 
                RRCA
 
                RRCA
 
                OR 0XA0
 
                OUT (C),A
 
                LD BC,HD_CYLHI;0XAF
 
                RET
 
 
 
GET_MAS_SLA     LD C,A
 
                LD A,(IY+2)
 
                AND 1
 
                RRCA
 
                RRCA
 
                RRCA
 
                RRCA
 
                OR C
 
                LD BC,HD_HEAD;0XCF
 
                RET
 
;               ENDIF
 
 
 
                DUPL 0X3EFF-$,0
 
MY_R_ADR:       DEFW  PTST_1
 
 
 
PM_ROM_TAB:
 
        DB      64H,5,2,0,  66H,65H
 
        DB      64H,5,2,80H,66H,65H
 
PM_RAM_RU5:
 
        DB      6,  5,2,0,  6,7
 
        DB      6,  5,2,80H,6,7
 
PM_RAM_RU7:
 
        DB      1CH,5,2,0,  1DH,1EH
 
        DB      1CH,5,2,80H,1DH,1EH
 
 
 
PM_GO_TAB:
 
        DW      PM_GO_S48
 
        DW      PM_GO_S128
 
        DW      PM_GO_TRDOS
 
 
 
PM_GO_S48:
 
        OUT     (C),E
 
        NOP
 
        LD      A,30H
 
        LD      BC,CONF_128
 
        OUT     (C),A
 
        RST     0
 
 
 
PM_GO_S128:
 
        OUT     (C),E
 
        NOP
 
        XOR     A
 
        LD      BC,CONF_128
 
        OUT     (C),A
 
        RST     0
 
 
 
PM_GO_TRDOS:
 
        OUT     (C),E
 
        NOP
 
        LD      BC,CONF_128
 
        LD      A,30H
 
        OUT     (C),A
 
        LD      BC,0
 
        PUSH    BC
 
        JP      3D2FH
 
 
 
;               DUPL 0X3FFE-$,0
 
;               DB 0XB2
 
 
 
                DUPL 0X3FF8-$,0
 
                DB "ATMCPM"
 
                DW DATA_VERS