Sprinter-BIOS/bios/exp/DCP.ASM
2026-05-19 19:48:28 +10:00

688 lines
15 KiB
NASM
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;-----------------------------------------------------------------------;
; 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'001'1'1111'1111
DB ACEX.ALL_MODE
DW %11'000'0'0101'0110
DW %11'001'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 - áâ à®¥ §­ ç¥­¨¥ ¢­ãâ७­¥£® ¯®àâ ; <20>¥à¥¤ ¢ë室®¬ ¢®ááâ ­ ¢«¨¢ ¥âáï ª®­ä  ¯à®¯¨á ­­ ï ¢ 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
;-----------------------------------------------------------------------;
;