; LAST UPDATE: 18.10.2023 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 MOMPASS = 1
HZ EQU $
ENDIF
; IF HACK_RBIOS=0
; ELSE
DUPL 0x3E20 - $
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
IF MOMPASS = 1
; ssss
ENDIF
DUPL 0X3FF8-$,0
DB "ATMCPM"
DW DATA_VERS