Sprinter-Core/src/bios/exp/DCP.ASM

675 lines
14 KiB
NASM
Raw 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 DCP
; ¢¡¨¢ ¥¬ ¢ â ¡«¨æã 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
;DCP_DATA: 108
; ....0..11.1110
; WORD %00000001101110 ; -  ¤à¥á
; WORD %00001001101111 ; - ¬ áª  - 0 ¨§¬¥­ï¥¬ë¥ ¡¨âë, 1 ­¥¨§¬¥­ï¥¬ë¥
; BYTE ACEX.Border_FE ; - ¯®àâ
; DCP END MARKER
; DW 0,0,0
;-----------------------------------------------------------------------;
;
;
;-----------------------------------------------------------------------;
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--------------------------------------------------; 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 #20
DW %01'000'0'0100'0000
DW %11'010'0'0110'1111
DB #20
DW %10'000'0'0100'0000
DW %11'010'0'0110'1111
DB #20
DW %11'000'0'0100'0000
DW %11'000'0'0110'1111
DB #20
DW %00'000'0'0100'0001
DW %00'010'1'1110'1111
DB #21
DW %00'010'0'0100'0001
DW %11'010'1'1110'1111
DB #21
DW %11'010'0'0100'0001
DW %11'010'1'1110'1111
DB #21
DW %00'000'0'0100'0010
DW %00'010'1'1110'1111
DB #22
DW %00'010'0'0100'0010
DW %11'010'1'1110'1111
DB #22
DW %11'010'0'0100'0010
DW %11'010'1'1110'1111
DB #22
DW %00'000'0'0100'0011
DW %00'010'1'1110'1111
DB #23
DW %00'010'0'0100'0011
DW %11'010'1'1110'1111
DB #23
DW %11'010'0'0100'0011
DW %11'010'1'1110'1111
DB #23
DW %00'000'0'0100'0100
DW %00'010'1'1110'1111
DB #24
DW %00'010'0'0100'0100
DW %11'010'1'1110'1111
DB #24
DW %11'010'0'0100'0100
DW %11'010'1'1110'1111
DB #24
DW %00'000'0'0100'0101
DW %00'010'1'1110'1111
DB #25
DW %00'010'0'0100'0101
DW %11'010'1'1110'1111
DB #25
DW %11'010'0'0100'0101
DW %11'010'1'1110'1111
DB #25
DW %00'000'0'1100'0010
DW %00'010'1'1110'1111
DB #26
DW %00'010'0'1100'0010
DW %11'010'1'1110'1111
DB #26
DW %11'010'0'1100'0010
DW %11'010'1'1110'1111
DB #26
DW %00'000'0'1100'0011
DW %00'010'1'1110'1111
DB #27
DW %00'010'0'1100'0011
DW %11'010'1'1110'1111
DB #27
DW %11'010'0'1100'0011
DW %11'010'1'1110'1111
DB #27
;---------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 ;!FIXIT ¬®¦­® ¯®ª  ã¡à âì ???
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
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 %00'010'0'0000'0111
DW %11'011'0'0000'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 %10'010'0'0110'1011
DW %11'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
;!FIXIT ¬®¦­® ã¡à âì
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
;-----------------------------------------------------------------------;
;
;
;----------------------------------------------------------------------;
DCP_INIT:
LD C,XL
LD B,XH
LD E,YL
LD D,YH
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: LD BC,5
ADD IY,BC
LD A,(IY+2)
OR (IY+3)
JR NZ,.loop
EXX
LD XL,C
LD XH,B
LD YL,E
LD YH,D
; First IN command - OPEN DCP
IN A,(SLOT3)
JP (HL)
;-----------------------------------------------------------------------;
;
;
;-----------------------------------------------------------------------;
; ”ã­ªæ¨ï ¤¥è¨äà â®à  ¯®à⮢.
; 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
;-----------------------------------------------------------------------;
;