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

575 lines
13 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;----------------------------------------------------------------------;
; <20>®«ã祭¨¥  ¤à¥á®¢ ¯®à⮢ ¨ ¤ ­­ëå ¤«ï ¢®ááâ ­®¢«¥­¨ï
; ‚室: A - ­®¬¥à ®ª­  ¯à®¥æ¨à®¢ ­¨ï
; ‚ë室: B - ¤ ­­ë¥, C -  ¤à¥á ¯®àâ  ®ª­ 
EMM.GetBanksPorts:
INC A
LD B,A
DJNZ .slot1
LD C,SLOT0
IN B,(C)
RET ;45t
.slot1: DJNZ .slot2
LD C,SLOT1
IN B,(C)
RET ;58t
.slot2: DJNZ .slot3
LD C,SLOT2
IN B,(C)
RET ;71t
.slot3: DJNZ .error
LD C,SLOT3
IN B,(C)
RET ;84t
.error: SCF
RET ;74t
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
; HL - ¡ãä¥à
; !FIXIT SYS_PAGE.CONFIG_BYTE 㦥 ­¥ â® ¯®ª §ë¢ ¥â, ¨ ¢®®¡é¥ ¢áî ¡ë ¯¥à¥¤¥« âì, ¯®¯à ¢¨âì ¢ ¤®ª¥, ª ª ¬¨­¨¬ã¬
FN_VERSION:
PUSH HL
EX DE,HL
; LD HL,ID_SPRINTER_FullSize
; LD B,0
; LD C,(HL)
; INC HL
LD HL,ID_SPRINTER
LD BC,ID_SPRINTER.Size
LDIR
;
POP HL
LD DE,(ID_Version) ;rdlow-ok
;
IN A,(SLOT2)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT2),A
LD BC,(SYS_PAGE.CONFIG_BYTE - #4000) ; Version PLD ; !TODO ç¥à¥§ áâàãªâãàã ¤«ï ¯¥à¥¬¥­­ëå ¡¨®á 
EX AF,AF'
OUT (SLOT2),A
LD A,ID_SPRINTER.Records_Num ; —¨á«® ¯®«¥©
AND A
RET
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
; [x] 28/01/24 ¤®¡ ¢«¥­  ¯®¤äã­ªæ¨ï ¢ë¤ ç¨ ¨­äë ¯à® Acex
FN_CRIPT:
DJNZ .Acex_ver
;
; BoardID_start old address #312A
; BoardID_end old address #312D
.board_id:
LD HL,(BOARD_INFO.number) ;rdlow-ok
LD A,(BOARD_INFO.type) ;rdlow-ok
LD BC,(BoardID.start) ;rdlow-ok
LD DE,(BoardID.end) ;rdlow-ok
AND A
RET
;
.error: LD A,BIOS.Error.InvalidSubFunction
SCF
RET
;
.Acex_ver:
DJNZ .error
PUSH HL
LD A,R
DI
PUSH AF
;
LD HL,-.stackDepth - .readProcedure.size ; memory stack use!
ADD HL,SP
PUSH HL ;  ¤à¥á ¯à®£à ¬¬ë .readProcedure
LD DE,.readProcedure ; ¯¥à¥­¥á⨠¯à®£à ¬¬ã ­  á⥪
EX DE,HL
LD BC,.readProcedure.size
LDIR ; ¯à®£à ¬¬  ­  á⥪¥
LD A,+(12 xor %0000'1000) ; !HARDCODE bitstream page in rom
RET
.return:;
POP AF
JP PO,.no_EI
EI
.no_EI: CALL .choose_chip
POP DE
LD BC,.chip_ID_TXT.RecordSize
LDIR
.cnf+1: LD DE,bitstream_ver_hex
AND A
RET
;
.choose_chip:
XOR A
LD HL, - ACEX.Chip_ID.K30
ADC HL,DE
LD HL,.chip_ID_TXT.K30
RET Z
OR A ; á­ïâì CF
INC A
LD HL, - ACEX.Chip_ID.K50
ADC HL,DE
LD HL,.chip_ID_TXT.K50
RET Z
POP HL ; ¡ « ­á á⥪ 
.error_unknownChip:
SCF
POP HL
LD A,BIOS.Error.UnknownDevice
RET
;
; ¯à®æ¥¤ãà , ¯¥à¥­®á¨¬ ï ­  á⥪ ¤«ï ç⥭¨ï Acex ID
; ®áâ®à®¦­¥¥ á PUSH, ¥á«¨ ­ ¤® ¬­®£®, ⮠㢥«¨ç¨¢ © .stackDepth
.readProcedure:
OUT (ROM.SLOT0),A ; ROM_PAGE
LD DE,(#100 + 3) ; !HARDCODE §¤¥áì ç¨â ¥âáï Acex ID
XOR A
OUT (ROM.SLOT0),A
OUT (SYS_PORT.ROM),A
JP .return
.stackDepth EQU 2 ; à ááâ®ï­¨¥ ®â ª®­æ  ¯à®æ¥¤ãàë ¤® ¢¥à設ë á⥪ .
.readProcedure.size EQU $-.readProcedure
;
.chip_ID_TXT:
.chip_ID_TXT.K30: DZ "K30"
.chip_ID_TXT.RecordSize EQU $-.chip_ID_TXT
.chip_ID_TXT.K50 DZ "K50"
;.chip_ID_TXT.K100 DZ "K100"
.chip_ID_TXT.Size EQU $-.chip_ID_TXT
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
;EMM_FN7
EMM.CheckColdInit:
IN A,(SLOT2)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT2),A
LD HL,SYS_PAGE.ID_FLAG - #4000
; LD DE,ID_SPRINTER_FullSize
; LD A,(DE)
; DEC A
; INC DE
; LD B,A
LD B,ID_SPRINTER.Record1_Size
LD DE,ID_SPRINTER
.loop: LD A,(DE)
CP (HL)
JR NZ,INIT_SYS_ALL
INC HL
INC DE
DJNZ .loop
; Disable user IM address in SYS_PAGE
XOR A
LD (SYS_PAGE.INT_ID - #4000),A
;
EX AF,AF'
OUT (SLOT2),A
RET
;MSDOS_COLD_VARS:
EMM.FullInit:
DI
IN A,(SLOT2)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT2),A
INIT_SYS_ALL:
DI
; LD HL,#8000
; LD DE,#8001
; LD (HL),#FF
; LD BC,#3FFF
; LDIR
;
; LD HL,ID_SPRINTER_FullSize
; LD DE,SYS_PAGE.ID_FLAG - #4000
; LD C,(HL)
; LD B,0
; INC HL
LD HL,ID_SPRINTER
LD DE,SYS_PAGE.ID_FLAG - #4000
LD BC,ID_SPRINTER.Record1_Size
LDIR
; ç¨á⪠ ¯¥à¥¬¥­­ëå ZX HDD
XOR A
LD H,A
LD L,A
LD (SYS_PAGE.CURRENT_DIR_SEC_L - #4000),HL
LD (SYS_PAGE.CURRENT_DIR_SEC_H - #4000),HL
DEC A
LD (SYS_PAGE.CURRENT_HDD - #4000),A
LD (SYS_PAGE.CURRENT_DIR_DRIVE - #4000),A
LD (SYS_PAGE.CURRENT_DIR_DRIVE_COPY - #4000),A
; Disable user IM address in SYS_PAGE
XOR A
LD (SYS_PAGE.INT_ID - #4000),A
;
LD HL,SYS_PAGE.DISK_TYPE - #4000
LD (HL),DRIVE_CODES.TRDOS.FDD ; FDD A
INC HL
LD (HL),DRIVE_CODES.TRDOS.FDD + 1 ; FDD B
INC HL
LD (HL),DRIVE_CODES.TRDOS.HDD
INC HL
LD (HL),DRIVE_CODES.TRDOS.HDD
INC HL
LD (HL),ZERO_PAGE ; [x] free zx pages! ; SYS_PAGE.COPY_SLOT0, ¡ë«® 0
INC HL
LD (HL),SHARED_PAGE; [x] free zx pages! ; SYS_PAGE.COPY_SLOT1, ¡ë«® 5
INC HL
LD (HL),ZERO_PAGE ; [x] free zx pages! ; SYS_PAGE.COPY_SLOT2, ¡ë«® 2
INC HL
LD (HL),ZERO_PAGE ; [x] free zx pages! ; SYS_PAGE.COPY_SLOT3, ¡ë«® 0
LD A,9
LD (SYS_PAGE.MSD_SECS - #4000),A
XOR A
LD (SYS_PAGE.DS_1440 - #4000),A
LD HL,SYS_PAGE.RAMD_KEYS - #4000
LD DE,SYS_PAGE.RAMD_KEYS+1 - #4000
LD BC,SYS_PAGE.RAMD_KEYS.NUM-1
LD (HL),0
LDIR
; [x] 04/11/2023
LD HL,SYS_PAGE.Sp_RAMD_KEYS - #4000
LD DE,SYS_PAGE.Sp_RAMD_KEYS+1 - #4000
LD BC,SYS_PAGE.Sp_RAMD_KEYS.NUM-1
LD (HL),0
LDIR
;
; [x] 17/08/2024 fixed bug with change current RAM drives type
XOR A
LD (SYS_PAGE.CURRENT_RAM_DRV - #4000),A
;
; [ ] free zx pages!
;;; init task's
;
LD DE,ZG_ADDRESS ;  ¤à¥á §­ ª®£¥­¥à â®à 
LD (SYS_PAGE.WIN_ZG - #4000),DE
;
;-----------[new code start]------------; !!!!! ¯®á¬®âà¥âì-¯à¨ç¥á âì
INIT_VSyncAndWaits:
LD D,CMOS_CELL.ScreenSET
CALL CMOS_RD
ld d,a
jr nc,.cmos_OK
; ¥á«¨ ­¥â CMOS, â® áâ ­¤ àâ­ë¥ ­ áâனª¨
ld a,3
ld (SYS_PAGE.VSyncAndWaits - #4000),A
jr z,INIT_CONFIG_ALL.setDefaultINT
.cmos_OK:
and high CMOS_CELL.ScreenSET.Mask.Sinc
and #40
ld a,3 ; 320 lines & no waits
jr z,.setVSyncAndWaits
dec a ; 312 lines & no waits
.setVSyncAndWaits:
ld (SYS_PAGE.VSyncAndWaits - #4000),A
INIT_CONFIG_ALL:
ld a,d
and high CMOS_CELL.ScreenSET.Mask.Int
jr z,.setDefaultINT ; set default int
xor high CMOS_CELL.ScreenSET.Mask.Int
LD HL,SCREEN_TABLES.ORIGINAL ; set original int
jr z,.setINT
and #10
LD HL,SCREEN_TABLES.SCORPION ; set scorpion int
jr z,.setINT
.setDefaultINT:
LD HL,SCREEN_TABLES.PENTAGON ; set pentagon int
.setINT:
LD (SYS_PAGE.SCREEN_TABLE - #4000),HL
;------------[new code end]-------------
;
LD DE,CNF_PORT.CNF_0 + ROM.BIOS
LD (SYS_PAGE.CONFIG_DE - #4000),DE
LD HL,SYS_PAGE.ZX_TASK.CURRENT - #4000 ; 㡨âì ¢á¥ § ¤ ç¨
LD DE,SYS_PAGE.ZX_TASK.CURRENT+1 - #4000
LD BC,_ZX_TASK - 1
LD (HL),0
LDIR
EX AF,AF'
OUT (SLOT2),A
CALL EMM.InitMem
;**************************************************************
; —⥭¨¥ ¯®á«¥¤­¨å 256 ¡ ©â®¢ <20>‡“ ¢ á«ã¦¥¡­ãî áâà ­¨æã
; § ç¥¬-â®, ⨯ , ä«¥è¥à ¬®£ â ¬ á®åà ­¨âì ¤ ­­ë¥ CMOS.
;READ_ROM_PAGE_X:
; IN A,(SLOT3)
; PUSH AF
; LD A,SYS_PAGE
; OUT (SLOT3),A
; CALL READ_ROM_PAGE_X ; READ CMOS-DATA
; POP AF
; OUT (SLOT3),A
;**************************************************************
RET
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
FN_TURBO:
CP 2
JR Z,.TURBO_SWITCH
CP 3
JR Z,.TURBO_SWITCH
CP #12
JR Z,.SET_FDD_720
CP #13
JR Z,.SET_FDD_1440
SCF
RET
;!FIXIT ¬¥­ï¥¬ ¯«®â­®áâì - ¬¥­ï¥¬ ¢ á¨á⥬­®© áâà ­¨æ¥ ¨­äã ®¡ í⮬
.SET_FDD_720:
LD A,FDD_Density.SET_720
OUT (FDD_Density),A
AND A
RET
;!FIXIT ¬¥­ï¥¬ ¯«®â­®áâì - ¬¥­ï¥¬ ¢ á¨á⥬­®© áâà ­¨æ¥ ¨­äã ®¡ í⮬
.SET_FDD_1440:
LD A,FDD_Density.SET_1440
OUT (FDD_Density),A
AND A
RET
.TURBO_SWITCH:
LD C,A
IN A,(SLOT3)
LD B,A
LD A,SYS_PAGE
OUT (SLOT3),A
;
;LD DE,(SYS_PAGE.CONFIG_DE)
;LD A,E
LD A,(SYS_PAGE.CONFIG_DE)
;
AND #FC ; !HARDCODE
OR C
;
;LD E,A
;LD (SYS_PAGE.CONFIG_DE),DE
LD (SYS_PAGE.CONFIG_DE),A
AND 3
;
OUT (SYS_PORT.ROM),A
LD A,B
OUT (SLOT3),A
AND A
RET
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
;!TODO
;FN_GET_SYS_VAR:
; ‚室: HL - ­®¬¥à á¨á⥬­®© ¯¥à¥¬¥­­®©
; ‚ë室: HL - §­ ç¥­¨¥ á¨á⥬­®© ¯¥à¥¬¥­­®©
; RET
;----------------------------------------------------------------------;
;!TODO ᪮¬¯®­®¢ âì
;----------------------------------------------------------------------;
FN_SEND_BYTE:
LD E,A ; á®åà ­¨âì ¡ ©â
CALL SEND_HALF_BYTE ; ¯¥à¥¤ âì ¯®«ã¡ ©â ¨§ …
RET C ; ¢®§¢à â ¯® ®è¨¡ª¥
LD A,E ; ᤢ¨­ãâì ¡ ©â ­  4 ¡¨â 
RRCA
RRCA
RRCA
RRCA
LD E,A
SEND_HALF_BYTE: ; ¯¥à¥¤ âì ¯®«®¢¨­ã ¡ ©â  _E_!!
LD A,E
OR #F0 ; ãáâ ­®¢¨âì áâ à訥 ¡¨âë LPT ¤ â 
OUT (Z84.PIO.Port_A.Data),A
LD BC,0 ; áç¥â稪 â ©¬- ãâ 
WAIT_SENT_1:
IN A,(KEMPSTON.PC_Link) ; ¯à®¢¥à¨âì ¡¨â 4 ­  1 ¯à¨ £®â®¢­®á⨠PC
BIT 4,A
JR NZ,CONTINUE_SENT
DEC BC
LD A,B
OR C
JR NZ,WAIT_SENT_1
XOR A
SCF ; â ©¬- ãâ
RET
CONTINUE_SENT: ; PC - £®â®¢
LD A,E
AND #0F ; á¡à®á¨âì áâ à訥 ¡¨âë LPT -
OUT (Z84.PIO.Port_A.Data),A
; áç¥â稪 â ©¬- ãâ 
LD BC,0
;
WAIT_SENT_2:
IN A,(KEMPSTON.PC_Link) ; ¯à®¢¥à¨âì ¡¨â 4 ­  0 - á®®¡é¥­¨¥ ®â PC
BIT 4,A
JR Z,CONTINUE_SENT2
DEC BC
LD A,B
OR C
JR NZ,WAIT_SENT_2
LD A,E
OR #F0 ; ãáâ ­®¢¨âì áâ à訥 ¡¨âë LPT ¤ â 
OUT (Z84.PIO.Port_A.Data),A
XOR A
SCF ; â ©¬- ãâ
RET
CONTINUE_SENT2: ; ¯®«ã¡ ©â ¯¥à¥¤ ­
LD A,E
OR #F0 ; ãáâ ­®¢¨âì áâ à訥 ¡¨âë LPT ¤ â 
OUT (Z84.PIO.Port_A.Data),A
XOR A
RET
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
FN_RESEIVE_B: ; ¯à¨­ïâì ¡ ©â ¢ A
CALL RESEIVE_POLU_BYTE ; ¯à¨­ïâì ¯®«ã¡ ©â
RET C ; ¢®§¢à â ¯® ®è¨¡ª¥
RLCA
RLCA
RLCA
RLCA
AND #F0
LD E,A
CALL RESEIVE_POLU_BYTE ; ¢â®à®©
RET C
AND 0Fh
OR E
RET ; ¡ ©â ¯à¨­ïâ
RESEIVE_POLU_BYTE: ; ¯à¨­ïâì ¯®«®¢¨­ã ¡ ©â  ¢ …
LD A,#F0 ; ãáâ ­®¢¨âì áâ à訥 ¡¨âë LPT ¤ â 
OUT (Z84.PIO.Port_A.Data),A
LD BC,0 ; áç¥â稪 â ©¬- ãâ 
WAIT_RES_1:
IN A,(KEMPSTON.PC_Link) ; ¯à®¢¥à¨âì ¡¨â 4 ­  1 ¯à¨ £®â®¢­®á⨠PC
BIT 4,A
JR NZ,CONTINUE_RES
DEC BC
LD A,B
OR C
JR NZ,WAIT_RES_1
XOR A
SCF ; â ©¬- ãâ
RET
CONTINUE_RES: ; PC - £®â®¢, ¦¤ âì 0
XOR A ; á¡à®á¨âì áâ à訥 ¡¨âë LPT - ¦¤¥¬ ¯®«ã¡ ©â
OUT (Z84.PIO.Port_A.Data),A
LD BC,0 ; áç¥â稪 â ©¬- ãâ 
WAIT_RES_2:
IN A,(KEMPSTON.PC_Link) ; ¯à®¢¥à¨âì ¡¨â 4 ­  0 - á®®¡é¥­¨¥ ®â PC
BIT 4,A
JR Z,CONTINUE_RES2
DEC BC
LD A,B
OR C
JR NZ,WAIT_RES_2
LD A,#F0 ; ãáâ ­®¢¨âì áâ à訥 ¡¨âë LPT ¤ â 
OUT (Z84.PIO.Port_A.Data),A
SCF
RET ; ®è¨¡ª 
CONTINUE_RES2: ; ¯®«ã¡ ©â ¢ëáâ ¢«¥­
LOOP_EQ: ; ¯à®ç¨â âì ¥é¥ à §, çâ® ¡ë ᮢ¯ «®
AND #0F
LD B,A
IN A,(KEMPSTON.PC_Link)
AND #0F
CP B
JR NZ,LOOP_EQ
OR #F0 ; ãáâ ­®¢¨âì áâ à訥 ¡¨âë LPT ¤ â  ¢ 1 - ¯à¨­ïâ®
OUT (Z84.PIO.Port_A.Data),A
RET
;----------------------------------------------------------------------;
;
;----------------------------------------------------------------------;
;**********************************
; START_DI:
; PUSH AF
; LD A,R
; LD A,#80
; JP PE,XX_DI2
; XOR A
; XX_DI2: LD R,A
; DI
; POP AF
; RET
;
; END_DI: PUSH AF
; LD A,R
; AND #80
; JR Z,XX_DI3
; EI
; POP AF ; PE
; RET
; XX_DI3: DI
; POP AF ; PO
; RET
;**********************************
;----------------------------------------------------------------------;?????
;DE - ªã¤  - áâà ­¨æ  ®âªàëâ !
;BC - ᪮«ìª®
;HL - ¡ãä¥à
;
; PUSH BC
; LD H,D
; LD L,E
; ADD HL,BC
; JR C,CUT
; LD HL,BUFER
; LDIR
; POP BC
; RET
;CUT:
; PUSH HL
; LD A,L
; LD L,C
; LD C,A
; LD A,H
; LD H,B
; LD B,A
;
; AND A
; SBC HL,BC
; LD B,H
; LD C,L
; LD HL,BUFER
; LDIR
; CALL NEXT_BANK
; POP BC
; LD A,B
; OR C
; JR Z,LAB
; LDIR
;LAB: POP BC
; RET
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;