Sprinter-Core/src/bios/exp/FUNC_SERVICE.asm
2024-08-24 00:33:34 +10:00

444 lines
9.5 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.

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.

; DISPLAY "Service"
; !FIXIT âãâ ¬®¦­®, ¯®å®¤ã, ¤®å७  ã¡à âì
; ; áâà ­¨æë á ª®­ä®© ¤«ï Sp97, ¤«ï ᮢ¬¥á⨬®áâ¨ á ¤à¥¢­¨¬¨ ¯à®£ ¬¨
; PG_SP1 equ #EC
; PG_SP2 equ #EE
; PG_AY equ #EA
; ;
; ;!TODO § ¬ãâ¨âì § «¨¢ªã ª®­äë, à¥áâ àâ, ¯¥à¥å¢ â à¥á¥â  ᨫ ¬¨ BIOS
; PG_Sp2000 EQU #FE
; PG_Sp2000_REINIT EQU #FD
;
RST_CONF:
;--[] ZX Spectrum
.AY8910:
LD D,#35 ;!HARDCODE REG #35 - BASIC SETTING 1 (SYS_PAGE.CONFIG_DE+1 = #C13B on PAGE #FE)
CALL CMOS_RD
OR 1
CALL CMOS_WR
LD BC,Port_All_Mode
IN A,(C)
AND #FE ;!HARDCODE
OUT (C),A ; ACC_OFF
;LD A,PG_AY
LD DE,ACEX.Config_ID.Sp97_AY
JR .INT_PLD
;--[]
;--[] Sprinter ZX
.SP97_1:
LD D,#35 ;!HARDCODE REG #35 - BASIC SETTING 1 (SYS_PAGE.CONFIG_DE+1 = #C13B on PAGE #FE)
CALL CMOS_RD
AND #FE
CALL CMOS_WR
LD BC,Port_All_Mode
IN A,(C)
AND #FE ;!HARDCODE
OUT (C),A ; ACC_OFF
;LD A,PG_SP1
LD DE,ACEX.Config_ID.Sp97_1
JR .INT_PLD
;--[]
;--[]
.SP97_2:
LD BC,Port_All_Mode
IN A,(C)
OR 1 ; ACC_ON
OUT (C),A
;LD A,PG_SP2
LD DE,ACEX.Config_ID.Sp97_2
JR .INT_PLD
;--[]
;--[]
;[x]
.SP2000:
LD BC,Port_All_Mode
IN A,(C)
OR 1 ; ACC_ON
OUT (C),A
LD DE,ACEX.Config_ID.Sp2000
JR .INT_PLD
;--[]
;--[]
.CUSTOM:
CP #80
JR NC,.CHOOSE_CNF
; only for old FLEX10K soft compatible
LD C,SLOT3
IN B,(C)
OUT (C),A ; PAGE á ¯à®è¨¢ª®©
LD DE,(#C090) ; PLD-ID
OUT (C),B ; RET page
;--[] ;JR INT_PLD
.INT_PLD: ; only for old FLEX10K soft compatible
LD C,SLOT3
IN B,(C)
LD A,SYS_PAGE
OUT (C),A
LD (SYS_PAGE.CONFIG_BYTE),DE
OUT (C),B
LD A,E ; config-byte
CP #FF
LD A,#80
JR Z,.YES_CBL
XOR A
.YES_CBL:
LD BC,CBL.SYS_PORT
OUT (C),A
LD A,E ; config-byte
OR #FE ;!HARDCODE
LD BC,Port_All_Mode ; SYSTEM Spectrum/Sprinter
OUT (C),A
LD A,#3C
OUT (FDC_93.DrvCTRL),A
XOR A
RET
;
;[x]
.CHOOSE_CNF:
; [x]
CP ACEX.Config_PG.Sp2000_SoftSetUp
JP Z,.ReturnSoftReset
;
CP ACEX.Config_PG.Sp2000
JR Z,.INIT_ACEX
;
CP ACEX.Config_PG.Sp2000_SetUp
JR Z,.SP2000
;
; only for old FLEX10K soft compatible
CP ACEX.Config_PG.Sp97_1
LD DE,ACEX.Config_ID.Sp97_1
JR Z,.INT_PLD
CP ACEX.Config_PG.Sp97_2
LD DE,ACEX.Config_ID.Sp97_2
JR Z,.INT_PLD
CP ACEX.Config_PG.Sp97_AY
LD DE,ACEX.Config_ID.Sp97_AY
JR Z,.INT_PLD
SCF
RET
;
;[x]
.INIT_ACEX:
DI
; ãáâ ­ ¢«¨¢ ¥¬ ­ã«¥¢ãî ª àâã ¯®à⮢
LD A,CNF_PORT.CNF_0
OUT (SYS_PORT.ON),A
; ¨ â ª ¯®­ïâ­® çâ® ¤¥« ¥â
IN A,(SLOT3) ; á®å࠭塞 ­®¬¥à ¢®âª­ã⮩ áâà ­¨æë
PUSH AF
LD A,Spec_Page
OUT (SLOT3),A
; ¯à®¢¥à塞 à §¬¥à ¡«®ª  á ª®­ä®© ¨ ¯®«ãç ¥¬ áâà ­¨æë ª®­äë
LD HL,Spec_Page.bitstream_pages
LD A,B
AND A
JR Z,.INIT_ACEX.ReloadConfFromROM
;
CALL EMM.GetMemBlkPages
LD A,B
JR C,.INIT_ACEX.ERROR
CP BitStream_SizeInPages+1 ; ª®«¨ç¥á⢮ áâà ­¨æ ¢ ªíè ¤«ï ¡¨áâਬ  ¯«îá ®¤­ 
JR NC,.INIT_ACEX.ERROR
LD A,(Spec_Page.bitstream_pages)
INC A
JR Z,.INIT_ACEX.ERROR
;
.INIT_ACEX.ReloadConfFromROM:
; § ª¨¤ë¢ ¥¬ ¢ Spec_Page ¯à®£ã ¤«ï § «¨¢ª¨ ª®­äë
LD HL,.INIT_ACEX.PROGRAM
LD DE,Spec_Page.init_acex
LD BC,.INIT_ACEX.PROGRAM.Size
LDIR
; ¥á«¨ ZF=0, â® ¯à®æ¥¤ãà  á¤¥« ¥â à¥á¥â á ¯¥à¥§ «¨¢ª®© ¨§ BIOS, ¨­ ç¥ ¨§ Š<>˜
CALL Spec_Page.init_acex
LD BC,256*BIOS.REINIT.HARD_RESET + BIOS.REINIT
;
; ­  ¢å®¤¥ ¢ BC ¯ à ¬¥âàë ä㭪樨 BIOS
.INIT_ACEX.ifSoftreset:
; á®å࠭塞 ¢®âª­ãâë¥ áâà ­¨æë ¢ Spec_Page
IN A,(SLOT0)
LD E,A
IN A,(SLOT1)
LD D,A
IN A,(SLOT2)
POP HL ; ¢®ááâ ­ ¢«¨¢ ¥¬ ­®¬¥à ¢®âª­ã⮩ áâà ­¨æë
LD L,A
LD (Spec_Page.page_0),DE
LD (Spec_Page.page_2),HL
; ¤®áâ ñ¬  ¤à¥á ¢®§¢à â  ¢ ¢ë§ë¢ îéãî äã­ªæ¨î ¨ á®å࠭塞 ¢ Spec_Page
POP DE
LD HL,RST_18_1.exit
XOR A
SBC HL,DE
JR NZ,.set_ret ; NZ - ¥á«¨ ¢ë§®¢ ¡ë« ¯® RST #18
POP DE ; ¥á«¨ ¢ë§®¢ ¡ë« ¢ އ“ ¯® RST 8
INC A
.set_ret:
LD (Spec_Page.RET_addr),DE
; A=0 - SYS_PORT.ON
; A=1 - SYS_PORT.OFF
LD (Spec_Page.Reload_Version),A
LD HL,0
ADD HL,SP
LD (Spec_Page.Stack_Point),HL
; “áâ ­ ¢«¨¢ ¥¬ ª«îç¨
LD HL,Spec_Page.flag_R
LD (HL),"R"
INC HL
LD (HL),"S"
INC HL
LD (HL),"T"
;
; .. ... ... ..
;!TODO ᤥ« âì äã­ªæ¨î ¯® § «¨¢ª¥ ᢮¥© ª®­äë, ¯¥à¥å¢ âã à¥á¥â .
; *. ‚室 ¢ ¯®¤äã­ªæ¨î ⮫쪮 ç¥à¥§ RST 08 ¨«¨ #18
; *. ‘®åà ­¨âì ¢á¥ áâà ­¨æë ¯®«ì§®¢ â¥«ï ¢ SYS_PAGE ¤«ï ¯¥à¥å¢ â  à¥á¥â 
; *. „®áâ âì á® á⥪   ¤à¥á ¢®§¢à â  ¨ á®åà ­¨âì ¢ SYS_PAGE ¤«ï ¯¥à¥å¢ â  à¥á¥â 
; *. ‘®åà ­¨âì ªã¤ -­¨¡ã¤ì §­ ç¥­¨¥ á⥪ 
; *
; .. ... ... ..
;LD BC,256*BIOS.REINIT.HARD_RESET + BIOS.REINIT
JP_to_BIOS
;
.ReturnSoftReset:
DI
; ãáâ ­ ¢«¨¢ ¥¬ ­ã«¥¢ãî ª àâã ¯®à⮢
LD A,CNF_PORT.CNF_0
OUT (SYS_PORT.ON),A
; ¨ â ª ¯®­ïâ­® çâ® ¤¥« ¥â
IN A,(SLOT3) ; á®å࠭塞 ­®¬¥à ¢®âª­ã⮩ áâà ­¨æë
PUSH AF
LD A,Spec_Page
OUT (SLOT3),A
;
LD BC,256*BIOS.REINIT.SOFT_RESET + BIOS.REINIT
JR .INIT_ACEX.ifSoftreset
;
;;;
.INIT_ACEX.ERROR:
POP AF
OUT (SLOT3),A
SCF
RET
;
.INIT_ACEX.PROGRAM:
DISP Spec_Page.init_acex
;
SAFE_PORTY
IN A,(FastRAM.ON)
IN A,(SLOT1)
LD (.slot1_page),A
;
LD A,#FE ; ç⮡ ¯à®¢¥à¨âì, çâ® ¢ë§ë¢ âì ¯®á«¥ CALL NZ,.INIT_ACEX.PROGRAM.LOAD
; âãâ ZF ¤®«¦¥­ ¡ëâì ¨§ ¢ë§ë¢ î饩 ¯à®æ¥¤ãàë
CALL NZ,.INIT_ACEX.PROGRAM.LOAD ; ¥á«¨ RAM_BLOCK ID ­¥ à ¢¥­ 0, â® ¢ë¯®«­ï¥âáï
INC A ; ä« £ ZF=0 £à㧨¬ ¨§ ROM
;
.INIT_ACEX.PROGRAM.SET_KEYS:
LD A,3
OUT (FastRAM.SLOT0),A ; ‘âà ­¨æ  Š<>˜ = 3
;
LD HL,.INIT_ACEX.Reload_String ; ä« £ ¯¥à¥§ £à㧪¨ ¨§ Š<>˜- 
JR Z,.skip ; ãáâ ­ ¢«¨¢ ¥¬ ä« £ ¯¥à¥§ £à㧪¨ ¨§ Š<>˜- 
INC L ; § â¨à ¥¬ ä« £ ¯¥à¥§ £à㧪¨ ¨§ Š<>˜- 
.skip: LD DE,ACEX.LOADER.String_Address-#C000
LD BC,#10
LDIR
LD HL,#FFFF ; § «¨âì ª®­äã ⮫쪮 ¯à¨ ¯¥à¢®© ¯¥à¥§ £à㧪¥
;LD HL,ACEX.LOADER.Reload_Flag ; § «¨¢ âì ª®­ä㠯ਠª ¦¤®© ¯¥à¥§ £à㧪¥
LD (ACEX.LOADER.Reload_Flag_Address-#C000),HL
;
.INIT_ACEX.PROGRAM.END:
XOR A
OUT (FastRAM.SLOT0),A
IN A,(FastRAM.OFF)
.slot1_page+1: LD A,0
OUT (SLOT1),A
RET
;
;
.INIT_ACEX.PROGRAM.LOAD:
XOR A ; áâà ­¨æ  Š<>˜
LD HL,Spec_Page.bitstream_pages
OUT (FastRAM.SLOT0),A ; ‘âà ­¨æ  Š<>˜ = 0
INC A
.INIT_ACEX.PROGRAM.load_loop:
EX AF,AF'
LD A,(HL)
INC HL
CP #FF
RET Z
OUT (SLOT1),A ; áâà ­¨æ  á ¤ ­­ë¬¨ ä ©« 
EX AF,AF'
;
; ¯¥à¥ª¨¤ë¢ ­¨¥ #3000 ¡ ©â®¢ ¢ Š<>˜(0) = #1000
EXX
LD HL,#4000
LD DE,#1000
LD BC,#3000
LDIR
; ¤®ª¨¤ë¢ ­¨¥ #1000 ¡ ©â®¢ ¢ Š<>˜(1) = #0000
; HL = #7000
OUT (FastRAM.SLOT0),A ; ‘âà ­¨æ  Š<>˜ = 1
INC A
;
LD D,C ; LD DE,0
LD B,#10 ; LD BC,#1000
LDIR
EXX
JR .INIT_ACEX.PROGRAM.load_loop
.INIT_ACEX.Reload_String:
DB ACEX.RELOAD_STRING
;
ENT
.INIT_ACEX.PROGRAM.Size EQU $-.INIT_ACEX.PROGRAM
;
;***************************************
;[x]
;--------------------------[;!TODO ¯®â¥áâ¨âì]--------------------------;
; B - ¯ à ¬¥âà á¡à®á 
; B = 1 - RESTART.
; B = 2 - Soft reset
; B = 3 - Hard reset
; B = 4 - Reinit spectrum pages
REINIT: DEC B
JR Z,.Restart ;1
DEC B
JR Z,.SoftReset ;2
DEC B
JR Z,.HardReset ;3
DEC B
SCF
RET NZ
.ReinitZXpages: ;4
LD DE,RESERVED_PAGES ; â ¡«¨æ  § ­ïâëå á¨á⥬­ëå áâà ­¨æ
LD HL,SYS_PAGE.RAM_TABLE ; €¤à¥á FAT އ“.
LD C,SLOT3
IN B,(C)
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(DE)
.zxloop:
CP #FF
JR Z,.endzxloop
INC DE
LD L,A
LD A,(HL)
AND A
JR NZ,.errorzxloop
LD A,(DE)
LD (HL),A
JR .zxloop
.errorzxloop:
DEC DE
LD HL,-RESERVED_PAGES-1
ADD HL,DE
JR NC,.errorzxloop_noChanges
DEC DE
LD H,high SYS_PAGE.RAM_TABLE
LD A,(DE)
LD L,A
LD A,#FF
LD (HL),A
.errorzxloop_noChanges:
SCF
.endzxloop:
OUT (C),B
RET
;
;[x]
.HardReset:
DI
LD A,DCP_PAGE
OUT (SLOT1),A ; set DCP page
LD A,ACEX.RESET
LD (#4400),A ; open for WR
.loop: LD BC,#0100 ; 横« á¡à®á 
OUT (C),C
LD B,0
OUT (C),C
JR .loop ; ¯®«­®áâìî § æ¨ª«¨âì!
;
;[x]
.Restart: DI
XOR A
LD BC,#1FFD
OUT (C),A
LD B,#7F
OUT (C),A
OUT (RGADR),A
OUT (RGMOD),A
OUT (SLOT0),A ;!HARDCODE zx page number
LD A,5 ;!HARDCODE zx page number
OUT (SLOT1),A
LD A,2 ;!HARDCODE zx page number
OUT (SLOT2),A
LD A,DCP_PAGE
OUT (SLOT3),A
JP 0 ;Restart
;
;
.SoftReset: DI
LD A,#10
LD BC,#1FFD
OUT (C),A ; 8-ï áâà ­¨æ  !!
;
LD A,RESET_PAGE
OUT (SLOT3),A
LD A,CNF_PORT.TURBO.OFF
OUT (SYS_PORT.ROM),A
.loop2: LD (#C000),A ; Soft RESET !!!
JR .loop2
;
;----------------------------------------------------------------------;
;
;
;----------------------------------------------------------------------;
; ­¥ ¤®«¦­® ¯®àâ¨âì DE
RES_FLAG_ZXvROM:
EX AF,AF'
IN A,(SLOT3)
EX AF,AF'
LD A,Spec_Page
OUT (SLOT3),A
XOR A
LD (Spec_Page.flag_Z),A
LD (Spec_Page.flag_X),A
EX AF,AF'
OUT (SLOT3),A
RET
;----------------------------------------------------------------------;
;