Files
Sprinter-BIOS/bios/exp/DCP.ASM
T

688 lines
15 KiB
NASM

;-----------------------------------------------------------------------;
; DATA FOR DCPCollision between port #1F and CBL port fix
; ˘ˇ¨˘ Ą¬ ˘ â ˇ«¨ćă DCP.XLSX ­ă¦­ë© ˘­Ąč­¨© Ż®ŕâ,
; ᬮâਬ ᬥ饭¨Ą ¤«ď OUT (‘),x - íâ®  ¤ŕĄá
;
;
; C C E D / A A A A A A A A A
; N N 1 O W 1 1 6 5 1 7 2 1 0
; F F 2 S R 5 4 3
; 1 0 8
;
; CCED/AAAAAAAAA
; NN1OW116517210
; FF2SR54 3
; 108
;DCP_DATA: ....0..11.1110
; WORD %00000001101110 ; - b13..12 cnf, b11 Lock48, b10 dos, b9 r/w, b8..0  ¤ŕĄá
; WORD %00001001101111 ; - ¬ áŞ  - 0 ¨§¬Ą­ďĄ¬ëĄ ˇ¨âë, 1 ­Ą¨§¬Ą­ďĄ¬ëĄ
; BYTE ACEX.Border_FE ; - Ż®ŕâ
;-----------------------------------------------------------------------;
;
.RECORD.Size EQU 5
;-----------------------------------------------------------------------;
DW %00'000'0'0000'0111
DW %00'010'0'0110'1111
DB ACEX.VG93_1F
DW %11'010'0'0000'0111
DW %11'010'0'0110'1111
DB ACEX.VG93_1F
DW %00'000'0'0010'0111
DW %00'010'0'0110'1111
DB ACEX.VG93_3F
DW %11'010'0'0010'0111
DW %11'010'0'0110'1111
DB ACEX.VG93_3F
DW %00'000'0'0100'0111
DW %00'010'0'0110'1111
DB ACEX.VG93_5F
DW %11'010'0'0100'0111
DW %11'010'0'0110'1111
DB ACEX.VG93_5F
DW %00'000'0'0110'0111
DW %00'010'0'0110'1111
DB ACEX.VG93_7F
DW %11'010'0'0110'0111
DW %11'010'0'0110'1111
DB ACEX.VG93_7F
DW %00'000'0'0110'1111
DW %00'011'0'0110'1111
DB ACEX.VG93_State
DW %11'010'0'0110'1111
DW %11'011'0'0110'1111
DB ACEX.VG93_State
; For joystick
DW %00'011'0'0000'0111
DW %10'011'0'0110'1111
DB ACEX.JOY_VG93
DW %10'011'0'0000'0111
DW %11'011'0'0110'1111
DB ACEX.JOY_VG93
; For VG93 with dos on
DW %00'001'0'0110'1111
DW %00'011'0'0110'1111
DB ACEX.JOY_VG93
; For VG93 with dos off
DW %11'011'0'0110'1111
DW %11'011'0'0110'1111
DB ACEX.JOY_VG93
DW %00'000'0'0010'1101
DW %11'011'1'1111'1111
DB ACEX.FDD720
DW %11'000'0'0010'1101
DW %11'001'1'1111'1111
DB ACEX.FDD720
DW %00'000'0'0011'1101
DW %11'011'1'1111'1111
DB ACEX.FDD144
DW %11'000'0'0011'1101
DW %11'001'1'1111'1111
DB ACEX.FDD144
;!FIXIT UNKNOWN PORTS ( Z84? ) ----------------------------------------; dos on, ⮫쪮 çĄŕĄ§ BC, ç⥭¨Ą/§ Ż¨áě
DW %10'000'1'0010'1101
DW %11'010'1'1111'1111
DB #18
DW %10'000'1'0011'1101
DW %11'010'1'1111'1111
DB #19
DW %10'000'1'1010'1101
DW %11'010'1'1111'1111
DB #1A
;----------------------------------------------------------------------;
DW %00'000'1'0010'1101
DW %11'001'1'1111'1111
DB ACEX.ISA_CTRL
DW %10'000'1'1011'1101
DW %11'010'1'1111'1111
DB ACEX.ISA_CTRL
DW %11'000'1'0010'1101
DW %11'001'1'1111'1111
DB ACEX.ISA_CTRL
DW %00'001'1'0011'1101
DW %11'001'1'0111'1111
DB ACEX.CMOS_DATA.READ
DW %11'001'1'0011'1101
DW %11'001'1'0111'1111
DB ACEX.CMOS_DATA.READ
DW %00'000'1'1010'1101
DW %11'001'1'1111'1111
DB ACEX.CMOS_ADDR.WRITE
DW %11'000'1'1010'1101
DW %11'001'1'1111'1111
DB ACEX.CMOS_ADDR.WRITE
DW %00'000'1'0011'1101
DW %11'001'1'0111'1111
DB ACEX.CMOS_DATA.WRITE
DW %11'000'1'0011'1101
DW %11'001'1'0111'1111
DB ACEX.CMOS_DATA.WRITE
;
;---------HDD[v]
DW %00'000'0'0100'0000
DW %11'000'0'0110'1111
DB ACEX.IDE_DATA_1F0
DW %01'000'0'0100'0000
DW %11'010'0'0110'1111
DB ACEX.IDE_DATA_1F0
DW %10'000'0'0100'0000
DW %11'010'0'0110'1111
DB ACEX.IDE_DATA_1F0
DW %11'000'0'0100'0000
DW %11'000'0'0110'1111
DB ACEX.IDE_DATA_1F0
DW %00'000'0'0100'0001
DW %00'010'1'1110'1111
DB ACEX.IDE_ERROR_1F1
DW %00'010'0'0100'0001
DW %11'010'1'1110'1111
DB ACEX.IDE_ERROR_1F1
DW %11'010'0'0100'0001
DW %11'010'1'1110'1111
DB ACEX.IDE_ERROR_1F1
DW %00'000'0'0100'0010
DW %00'010'1'1110'1111
DB ACEX.IDE_COUNTER_1F2
DW %00'010'0'0100'0010
DW %11'010'1'1110'1111
DB ACEX.IDE_COUNTER_1F2
DW %11'010'0'0100'0010
DW %11'010'1'1110'1111
DB ACEX.IDE_COUNTER_1F2
DW %00'000'0'0100'0011
DW %00'010'1'1110'1111
DB ACEX.IDE_SECTOR_1F3
DW %00'010'0'0100'0011
DW %11'010'1'1110'1111
DB ACEX.IDE_SECTOR_1F3
DW %11'010'0'0100'0011
DW %11'010'1'1110'1111
DB ACEX.IDE_SECTOR_1F3
DW %00'000'0'0100'0100
DW %00'010'1'1110'1111
DB ACEX.IDE_CYLINDER_L_1F4
DW %00'010'0'0100'0100
DW %11'010'1'1110'1111
DB ACEX.IDE_CYLINDER_L_1F4
DW %11'010'0'0100'0100
DW %11'010'1'1110'1111
DB ACEX.IDE_CYLINDER_L_1F4
DW %00'000'0'0100'0101
DW %00'010'1'1110'1111
DB ACEX.IDE_CYLINDER_H_1F5
DW %00'010'0'0100'0101
DW %11'010'1'1110'1111
DB ACEX.IDE_CYLINDER_H_1F5
DW %11'010'0'0100'0101
DW %11'010'1'1110'1111
DB ACEX.IDE_CYLINDER_H_1F5
DW %00'000'0'1100'0010
DW %00'010'1'1110'1111
DB ACEX.IDE_DEVICE_HEAD_1F6
DW %00'010'0'1100'0010
DW %11'010'1'1110'1111
DB ACEX.IDE_DEVICE_HEAD_1F6
DW %11'010'0'1100'0010
DW %11'010'1'1110'1111
DB ACEX.IDE_DEVICE_HEAD_1F6
DW %00'000'0'1100'0011
DW %00'010'1'1110'1111
DB ACEX.IDE_STATUS_CMD_1F7
DW %00'010'0'1100'0011
DW %11'010'1'1110'1111
DB ACEX.IDE_STATUS_CMD_1F7
DW %11'010'0'1100'0011
DW %11'010'1'1110'1111
DB ACEX.IDE_STATUS_CMD_1F7
;---------HDD[^]
;
DW %00'000'0'1100'0100
DW %00'010'1'1110'1111
DB ACEX.IDE_CONTROL_3F6
DW %00'010'0'1100'0100
DW %11'010'1'1110'1111
DB ACEX.IDE_CONTROL_3F6
DW %11'010'0'1100'0100
DW %11'010'1'1110'1111
DB ACEX.IDE_CONTROL_3F6
DW %00'000'0'1100'0101
DW %00'010'1'1110'1111
DB ACEX.IDE_STATUS_3F7
DW %00'010'0'1100'0101
DW %11'010'1'1110'1111
DB ACEX.IDE_STATUS_3F7
DW %11'010'0'1100'0101
DW %11'010'1'1110'1111
DB ACEX.IDE_STATUS_3F7
DW %00'000'0'0010'1100
DW %11'001'1'1111'1111
DB ACEX.IDE_CHANEL_1
DW %11'000'0'0010'1100
DW %11'001'1'1111'1111
DB ACEX.IDE_CHANEL_1
DW %00'000'0'0011'1100
DW %11'001'1'1111'1111
DB ACEX.IDE_CHANEL_2
DW %11'000'0'0011'1100
DW %11'001'1'1111'1111
DB ACEX.IDE_CHANEL_2
DW %00'000'0'1010'1101
DW %11'001'1'1111'1111
DB ACEX.VSYNC320
DW %11'000'0'1010'1101
DW %11'001'1'1111'1111
DB ACEX.VSYNC320
DW %00'000'0'1011'1101
DW %11'001'1'1111'1111
DB ACEX.VSYNC312
DW %11'000'0'1011'1101
DW %11'001'1'1111'1111
DB ACEX.VSYNC312
DW %00'000'0'1010'1100
DW %11'001'1'1111'1111
DB ACEX.RESET
DW %11'000'0'1010'1100
DW %11'001'1'1111'1111
DB ACEX.RESET
DW %00'000'0'1011'1100
DW %11'001'1'1111'1111
DB ACEX.UNKNOWN ;!FIXIT ¬®¦­® Ż®Ş  ăˇŕ âě
DW %11'000'0'1011'1100
DW %11'001'1'1111'1111
DB ACEX.UNKNOWN ;!FIXIT ¬®¦­® Ż®Ş  ăˇŕ âě
DW %00'010'0'0010'1011
DW %11'010'0'0110'1011
DB ACEX.ISA_Control
DW %00'011'0'0110'1110
DW %10'011'0'0110'1111
DB ACEX.ZX_Keyboard
DW %10'011'0'0110'1110
DW %11'011'0'0110'1111
DB ACEX.ZX_Keyboard
DW %00'001'1'1111'1101
DW %00'001'1'1111'1111
DB ACEX.AY_FFFD_READ
DW %00'001'1'1101'1111
DW %11'001'1'1111'1111
DB ACEX.Kempston_Mouse
DW %11'001'1'1101'1111
DW %11'001'1'1111'1111
DB ACEX.Kempston_Mouse
;-1F 0001 1111 x00x 0111
; 3F 0011 1111 x01x 0111
; 4F 0100 1111 x10x 0111
; 5F 0101 1111 x10x 0111
;+DF 1101 1111 x10x 1111 drum
; DD 1101 1101 x10x 1101 scorp
; FB 1111 1011 x11x 1011
DW %00'011'0'0110'0011
DW %11'011'0'0110'1111
DB ACEX.CBL_OUT
DW %01'010'0'0110'0011
DW %11'010'0'0110'1111
DB ACEX.CBL_OUT
DW %10'010'0'0110'0011
DW %11'010'0'0110'1111
DB ACEX.CBL_OUT
DW %10'010'0'0110'1011
DW %11'010'0'0110'1111
DB ACEX.CBL_OUT
; [x] Collision between ports #1F and CBL fix
; DW %00'010'0'0000'0111
; DW %11'011'0'0000'1111
; DB ACEX.CBL_OUT
DW %00'010'0'0010'0111
DW %11'011'0'0010'1111
DB ACEX.CBL_OUT
DW %00'010'0'0100'0111
DW %11'011'0'0100'1111
DB ACEX.CBL_OUT
;
DW %00'011'0'0000'1000
DW %11'011'0'0110'1111
DB ACEX.CBL_OUT
DW %00'010'0'0110'1011
DW %10'010'0'0110'1111
DB ACEX.CBL_OUT
DW %00'000'0'0100'0110
DW %11'001'1'1111'1111
DB ACEX.CBL_SYS_PORT
DW %11'000'0'0100'0110
DW %11'001'1'1111'1111
DB ACEX.CBL_SYS_PORT
DW %00'000'1'1111'1101
DW %00'001'1'1111'1111
DB ACEX.AY_FFFD_WRITE
DW %00'000'1'0111'1101
DW %00'001'1'1111'1111
DB ACEX.AY_BFFD
DW %00'000'0'0110'1101
DW %10'000'1'1111'1111
DB ACEX.Scorp_1FFD
DW %11'000'0'0110'1101
DW %11'000'1'1111'1111
DB ACEX.Scorp_1FFD
DW %00'000'0'1110'1101
DW %00'100'1'1110'1111
DB ACEX.Pent_7FFD
DW %00'100'0'1110'1101
DW %11'110'1'1110'1111
DB ACEX.Pent_7FFD
DW %11'100'0'1110'1101
DW %11'100'1'1110'1111
DB ACEX.Pent_7FFD
DW %10'000'0'0110'1101
DW %11'100'1'1110'1111
DB ACEX.Pent_7FFD
DW %00'000'0'0110'1110
DW %00'001'0'0110'1111
DB ACEX.Border_FE
DW %00'000'0'0101'0110
DW %11'000'1'1111'1111
DB ACEX.ALL_MODE
DW %11'000'0'0101'0110
DW %11'000'1'1111'1111
DB ACEX.ALL_MODE
DW %00'000'0'0000'1001
DW %00'010'0'0110'1111
DB ACEX.PORT_Y
DW %00'010'0'0000'1001
DW %11'010'0'0110'1111
DB ACEX.PORT_Y
DW %11'010'0'0000'1001
DW %11'010'0'0110'1111
DB ACEX.PORT_Y
DW %00'000'0'0100'1001
DW %00'010'0'0110'1111
DB ACEX.RGMOD
DW %00'010'0'0100'1001
DW %11'010'0'0110'1111
DB ACEX.RGMOD
DW %11'010'0'0100'1001
DW %11'010'0'0110'1111
DB ACEX.RGMOD
DW %00'000'0'0010'0100
DW %00'000'0'0010'1111
DB ACEX.CNF_PORT
;DW %00'000'0'0110'1100
;DW %11'001'0'0110'1111
;DB ACEX.SCALE
;DW %11'000'0'0110'1100
;DW %11'001'0'0110'1111
;DB ACEX.SCALE
DW %00'000'0'0000'1010
DW %00'010'0'0110'1111
DB ACEX.SLOT0
DW %00'010'0'0000'1010
DW %11'010'0'0110'1111
DB ACEX.SLOT0
DW %11'010'0'0000'1010
DW %11'010'0'0110'1111
DB ACEX.SLOT0
DW %00'000'0'0010'1010
DW %00'010'0'0110'1111
DB ACEX.SLOT1
DW %00'010'0'0010'1010
DW %11'010'0'0110'1111
DB ACEX.SLOT1
DW %11'010'0'0010'1010
DW %11'010'0'0110'1111
DB ACEX.SLOT1
DW %00'000'0'0100'1010
DW %00'010'0'0110'1111
DB ACEX.SLOT2
DW %00'010'0'0100'1010
DW %11'010'0'0110'1111
DB ACEX.SLOT2
DW %11'010'0'0100'1010
DW %11'010'0'0110'1111
DB ACEX.SLOT2
DW %00'000'0'0110'1010
DW %00'010'0'0110'1111
DB ACEX.SLOT3
DW %00'010'0'0110'1010
DW %11'010'0'0110'1111
DB ACEX.SLOT3
DW %11'010'0'0110'1010
DW %11'010'0'0110'1111
DB ACEX.SLOT3
; DCP END MARKER
DW 0,0,0
;-----------------------------------------------------------------------;
;
;
;----------------------------------------------------------------------;
; ˘ë§ë˘ Ąâáď ¨§ POST_TEST.POST_3_INIT_DCP
DCP_INIT: LD E,YL
LD D,YH
EX DE,HL
LD E,XL
LD D,XH
;
LD BC,DCP_DATA.RECORD.Size
EXX
LD HL,#C000
LD DE,#C001
LD BC,#3FFF
LD (HL),L
LDIR
;
LD IY,DCP_DATA
LD IX,.ret
;
.loop: LD L,(IY)
LD H,(IY+1)
LD E,(IY+2)
LD D,(IY+3)
LD B,(IY+4)
JP DCP_CONFIG.PARSE_TABLE
;
.ret: EXX
ADD IY,BC
EXX
LD A,(IY+2)
OR (IY+3)
JR NZ,.loop
EXX
LD XL,E
LD XH,D
EX DE,HL
LD YL,E
LD YH,D
; First IN command - OPEN DCP
IN A,(SLOT3)
JP POST_TEST.POST_3_OK
;-----------------------------------------------------------------------;
;
;
;-----------------------------------------------------------------------;
; ”ă­Şć¨ď ¤Ąč¨äŕ â®ŕ  Ż®ŕ⮢.
; HL -  ¤ŕĄá
; DE - ¬ áŞ  - 0 ¨§¬Ą­ďĄ¬ëĄ ˇ¨âë, 1 ­Ą¨§¬Ą­ďĄ¬ëĄ
; B - Ż®ŕâ
;
DCP_CONFIG:
AND A
JP Z,PORTS_INIT
LD A,R
DI
PUSH AF
PUSH IX
LD IX,.exit
IN A,(SLOT3)
EX AF,AF'
LD A,DCP_PAGE
OUT (SLOT3),A
JR .PARSE_TABLE
.exit: EX AF,AF'
OUT (SLOT3),A
AND A
POP IX
POP AF
RET PO
EI
RET
.PARSE_TABLE:
LD A,L
AND E
LD L,A
LD A,H
AND D
OR #C0
LD H,A
LD A,D
OR #C0
LD D,A
.loop: LD (HL),B
LD A,L ; § ¬ áŞ¨ŕ®˘ âě ­Ą¨§¬Ą­ďĄ¬ëĄ ˇ¨âë 1-¬¨
OR E ; ¤«ď Żŕ®ĺ®¦¤Ą­¨ď ŻĄŕĄ­®á 
INC A ; 㢥«¨ç¨âě  ¤ŕĄá
JR Z,.carry ; ˘®§­¨Ş ŻĄŕĄ­®á
OR E
XOR E ; ®ˇ­ă«¨âě ­Ą¨§¬Ą­ďĄ¬ëĄ ˇ¨âë
LD C,A ; ¨§¬Ą­ďĄ¬ ď ç áâě
LD A,L
AND E ; ˘ë¤Ą«¨âě ­Ą¨§¬Ą­ďĄ¬ăî
OR C
LD L,A ; ¤®ˇ ˘¨âě ¨§¬Ą­ďĄ¬ăî ç áâě
JR .loop ; 横«
; A = 0
.carry: LD A,L ; § ˇ¨âě ¨§¬Ą­ďĄ¬ëĄ ˇ¨âë ­ă«ď¬¨
AND E
LD L,A
LD A,H ; § ¬ áŞ¨ŕ®˘ âě ­Ą¨§¬Ą­ďĄ¬ëĄ ˇ¨âë 1-¬¨
OR D ; ¤«ď Żŕ®ĺ®¦¤Ą­¨ď ŻĄŕĄ­®á 
INC A ; 㢥«¨ç¨âě  ¤ŕĄá
JR Z,.return
OR D
XOR D
LD C,A ; ¨§¬Ą­ďĄ¬ ď ç áâě
LD A,H
AND D ; ˘ë¤Ą«¨âě ­Ą¨§¬Ą­ďĄ¬ăî
OR C
LD H,A ; ¤®ˇ ˘¨âě ¨§¬Ą­ďĄ¬ăî ç áâě
JR .loop
.return: JP (IX)
;-----------------------------------------------------------------------;
;
;----------------------------------------------------------------------;
;[x] 26/01/2024
READ_PORTS:
CALL SET_PORTS.Prepare
LD BC,0
IN B,(C)
JR SET_PORTS.End
;[x] 26/01/2024
; WRITE_PORTS:
; SCF
; RET
;----------------------------------------------------------------------;
;
;-----------------------------------------------------------------------;
;[x] ’ĄŻĄŕě íâ® ­Ą ­ă¦­®: CALL from 3D13h! Žáâ®ŕ®¦­ĄĄ á ŻŕĄŕ뢠­¨ď¬¨, «ăçčĄ Ł á¨âě, ç⮡ ­Ą ᡨâě ᨣ­ « DOS_ON
; in: A - ˘­ăâ७­¨© Ż®ŕâ, B - §­ çĄ­¨Ą ¤«ď § Ż¨á¨ ˘® ˘­ăâ७­¨© Ż®ŕâ
; out: B - áâ ŕ®Ą §­ çĄ­¨Ą ˘­ăâ७­ĄŁ® Ż®ŕâ ; ŹĄŕĄ¤ ˘ë室®¬ ˘®ááâ ­ ˘«¨˘ Ąâáď Ş®­ä  Żŕ®Ż¨á ­­ ď ˘ CONFIG_DE.
SET_PORTS:
CALL .Prepare
;
EX AF,AF'
LD A,B
LD BC,0
EX AF,AF'
;
; —⥭¨Ą Ż®ŕâ 
IN A,(C)
; ‡ Ż¨áě Ż®ŕâ 
EX AF,AF'
OUT (C),A ; ăáâ ­®˘¨âě ­®˘®Ą §­ çĄ­¨Ą Ż®ŕâ 
EX AF,AF'
;
LD B,A ; Żŕ®č«®Ą á®áâ®ď­¨Ą Ż®ŕâ 
;
.End: LD A,DCP_PAGE ; ăáâ ­®˘¨âě DCP
LD C,SLOT2
OUT (C),A
LD A,L
LD (#8000),A ; ˘Ąŕ­ăâě Ż®ŕâ
LD A,H
LD (#8200),A ; ˘Ąŕ­ăâě Ż®ŕâ
;
LD A,SYS_PAGE
OUT (C),A
LD A,(SYS_PAGE.CONFIG_DE-#4000)
OUT (C),D ; ˘Ąŕ­ăâě áâŕ ­¨ćă
OUT (SYS_PORT.ROM),A
;
CALL DOS_OFF
;
;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23
BIT 2,E
RET Z
EI
RET
;AND A
;RET
;
.Prepare:
EX AF,AF'
;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23
AND A
LD A,R
PUSH AF
POP DE
DI
CALL DOS_ON
;
LD A,CNF_PORT.CNF_0 + ROM.BIOS
OUT (SYS_PORT.ROM),A
;
LD C,SLOT2 ; Ż®«ăç¨âě áâŕ ­¨ćă
IN D,(C)
;
LD A,DCP_PAGE ; ăáâ ­®˘¨âě ­®˘ăî
OUT (C),A
;
LD A,(#8000) ; á®ĺŕ ­¨âě â® çâ® ˇë«®
LD L,A
LD A,(#8200)
LD H,A
EX AF,AF' ; áâŕ ­¨ć 
;
LD (#8000),A ; ăáâ ­®˘¨âě ˘­ăâ७­¨© Ż®ŕâ
LD (#8200),A
OUT (C),D ; ˘Ąŕ­ăâě áâŕ ­¨ćă
RET
;-----------------------------------------------------------------------;
;