Sprinter-Core/src/bios/rom/ZX/ZX_MENU.ASM
Anatoliy Belyanskiy dc8f5f37ac some tests with 5x
2023-06-25 04:55:29 +10:00

752 lines
17 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.

; "MENU PROGRAMS."
;*********************************
; FOR INCLUDE !!!
;*********************************
; Ž¡á«ã¦¨¢ ­¨¥ Œ…<C592>ž
; HL -  ¤à¥á â ¡«¨æë ¯à®£à ¬¬
; A - ­®¬¥à ¢ â ¡«¨æ¥
; ¥á«¨ A=-1, â® ¢®§¢à â,
; ¨­ ç¥ ¢ë¯®«­¥­¨¥
;*****************************
EXEC_PNT:
INC A
RET Z
;!FIXIT ¯®ç¥¬ã ­¥ â ª?
; DEC A
; JR Z,EXEC_HL
; LD D,0
; LD E,A
; XOR A
; ADC HL,DE
; ADC HL,DE
;
EXEC_PNT_LOOP:
DEC A
JR Z,EXEC_HL
INC HL
INC HL
JR EXEC_PNT_LOOP
EXEC_HL:
LD E,(HL)
INC HL
LD D,(HL)
INC HL
EX DE,HL
JP (HL)
RET_FROM_M:
POP HL
RET
;****************************************
; <20><EFBFBD>Ž MENU_128
;****************************************
; ‚•Ž„: DE -  ¤à¥á ¬¥­î
; BC - ¤«¨­  ¬¥­î
; ‚›•Ž„: A - ¢ë¡à ­­ë© ¯ã­ªâ
;****************************************
RUN_MENU:
PUSH IX
PUSH DE ; DE - MENU
PUSH BC ; BC - len_menu
LD A,(DE)
DEC A ; ç¨á«® CMD
CP 9 ; !HARDCODE ¬ ª¨á¬ «ì­®¥ ç¨á«® ¯ã­ªâ®¢ ¬¥­î
JR C,RUN_M_1
RUN_MN_ERR:
POP BC
POP DE
LD A,#FF ; ¢¥à­ãâìáï á ­®¬¥à®¬ 255 - ®è¨¡ª 
POP IX
RET
RUN_M_1:
LD A,(ZX_VARS.SWAP_ROM)
CP #F5 ; áà ¢­¨âì € á ®¯ª®¤®¬ PUSH AF
JR NZ,RUN_MN_ERR
LD HL,LEN_P_M
ADD HL,BC ; HL - ­ã¦­ ï ¤«¨­  ¯ ¬ïâ¨
LD B,H ; HL -> BC
LD C,L
LD HL,(ZX_VARS.WORK_SPACE) ; HL - ­ ç «® à ¡ ®¡«
PUSH BC
PUSH HL
CALL C_1655 ; ¯®«ãç¨âì à ¡®çãî ¯ ¬ïâì
POP DE
PUSH DE ; ­ ç «® à ¡ ®¡«
LD BC,LEN_P_M ; ¤«¨­  ¯à®£à ¬¬ë ¬¥­î
LD HL,MENU_128 ; á ¬  ¯à®£à ¬¬ 
LDIR ; ¯à®£à ¬¬  ¯¥à¥¬¥é¥­ . DE - ¬¥áâ® ¤«ï MENU
POP BC
PUSH BC ; ­ ç «® ¯à®£à ¬¬ë
PUSH DE ; á®åà ­¨âì ¬¥áâ® ¤«ï MENU
LD DE,MN_128_S ; ¤ ­­ë¥ ¤«ï shifter
CALL SHIFTER ; ¨§¬¥­¨âì ¤ ­­ë¥ ¢ ᮮ⢥âá⢨¨ á ¯®«®¦¥­¨¥¬ ¢ MEM
POP DE ; ¢¥à­ãâì ¬¥áâ® ¤«ï MENU
POP HL ; ­ ç «® ¯à®£à ¬¬ë
POP IX ; ¤«¨­  ¤ ­­ëå
POP BC ; ¤«¨­  ¬¥­î
EX (SP),HL ; HL - ¬¥­î
LDIR ; ¯¥à¥¬¥áâ¨âì ¤ ­­ë¥ MENU
POP HL ;  ¤à¥á ¯à®£à ¬¬ë MENU
PUSH HL
PUSH IX ; ¤«¨­  à ¡. ®¡«
CALL JP_HL ; ¢ë§®¢ ¯à®£à ¬¬ë MENU
POP BC ; ¢¥à­ãâì ¤«¨­ã à ¡ ®¡«
POP HL ; ¨ ­ ç «  ¯à®£à ¬¬ë
PUSH AF ; á®åà ­¨âì ­®¬¥à ¢ë¡®à 
CALL C_19E8 ; ®á¢®¡®¤¨âì ¯ ¬ïâì !!
POP AF ; ¢¥à­ãâì ­®¬¥à ¢ë¡®à 
POP IX
RET ; ¢®§¢à â ¨§ ¯à®£à ¬¬ë RUN_MENU
JP_HL: JP (HL)
;**************************************
; 128k MENU
;**************************************
;!HARDCODE
MENU_PROG EQU #25B9 ; #25B9 in sp_128.asm
;SWAP_ROM EQU #5B00
NEW_SP EQU #1F45 ; L1F45: in sp_128.asm
RET_SP EQU #1F20 ; L1F20: in sp_128.asm
;**************************************
; <20>ணࠬ¬  ¢ë§®¢  MENU_128 ¨§ އ“.
;**************************************
MN_128_S:
DB SH_1 - MENU_128+1
DB SH_2 - MENU_128+1
DB SH_3 - MENU_128+1
DB SH_4 - MENU_128+1
DB SH_5 - MENU_128
DB SH_6 - MENU_128
DB SH_7 - MENU_128
DB SH_8 - MENU_128
DB SH_9 - MENU_128
DB SH_A - MENU_128
DB SH_B - MENU_128
DB SH_C - MENU_128
DB 0
;**************************************
; <20>â  ¯à®£à ¬¬  ¯¥à¥¬¥é ¥âáï ¢ ®§ã
;**************************************
MENU_128:
XOR A
OUT (SYS_PORT.RAM),A
CALL ZX_VARS.SWAP_ROM
CALL NEW_SP
SH_1: LD DE,MENU_DAT - MENU_128
LD HL,ZX_VARS.MENU_TBL.JUMP
LD BC,4
LDIR
SH_2: LD HL,MENU_128_E - MENU_128
LD (ZX_VARS.MENU_TBL.JUMP),HL
SH_3: LD HL,MENU_128_E2 - MENU_128
LD (ZX_VARS.MENU_TBL.TEXT),HL
JP MENU_PROG
RET_M EQU $-MENU_128
SH_4: LD HL,MENU_DAT - MENU_128
LD DE,ZX_VARS.MENU_TBL.JUMP
LD BC,4
LDIR
CALL RET_SP
CALL ZX_VARS.SWAP_ROM
EX AF,AF'
;LD A,0
;OUT (CNF_PORT),A
LD A,SYS_PORT.EXTENSION
OUT (SYS_PORT.ROM),A ;!!!!! ¢¥àá¨ï ¤«ï <20>‡“
EX AF,AF'
RET
MENU_DAT:
DW 0,0
MENU_128_E:
DB 8
DB 0
SH_5: DW RET_M
DB 1
SH_6: DW RET_M
DB 2
SH_7: DW RET_M
DB 3
SH_8: DW RET_M
DB 4
SH_9: DW RET_M
DB 5
SH_A: DW RET_M
DB 6
SH_B: DW RET_M
DB 7
SH_C: DW RET_M
MENU_128_E2:
LEN_P_M EQU $-MENU_128
;**************************************
; RST 30 - ¯®«ã祭¨¥ BC SPACES á  ¤à¥á  HL
; #19E8 - ®á¢®¡®¦¤¥­¨¥ BC spaces á  ¤à¥á  HL
; HL - à ¡. ï祩ª 
; BC -  ¤à¥á ¯à®£à ¬¬ë
; DE -  ¤à¥á ¤ ­­ëå ¤«ï ¯¥à¥¬¥é¥­¨ï
SHIFTER:
LD A,(DE) ; (DE) - SHIFT IN PROG
AND A
RET Z
INC DE
LD L,A
LD H,0
ADD HL,BC ; HL - ADRESS FOR SHIFT
LD A,(HL) ; (HL)=(HL)+BC
ADD A,C
LD (HL),A
INC HL
LD A,(HL)
ADC A,B
LD (HL),A
JR SHIFTER
;*******************************************
; Œ…<C592>ž : ¡ ©â 1 - ¤«ï १ã«ìâ â 
; ¡ ©â 2 - ç¨á«® ¯ã­ªâ®¢ +1
; ­ §¢ ­¨¥ ¬¥­î, ª®¤ 0FFh ( COPY )
; ¯ã­ªâë ¬¥­î ®ª®­ç ­¨¥ ¡ ©â®¬ á
; ãáâ, 7-¬ ¡¨â®¬ + ¯ãáâ ï áâப  !!
;*******************************************
BASIC_MENU:
; LD A,(HL)
; CP 'S'
; JP Z,SET_SYSTEM
LD DE,(ZX_VARS.CH_ADR)
PUSH DE
LD (ZX_VARS.CH_ADR),HL
CALL_48X 1C8Ch ; SYMBOL VAR
CALL_48X 2BF1h ; input txt !!!
; DE - adr
; BC - len
PUSH DE
PUSH BC
INC DE
CALL TST_M
JR C,NO_EXE_M
CALL RUN_MENU
LD (IY+0),255
NO_EXE_M:
POP BC
POP DE
LD (DE),A
POP HL
LD (ZX_VARS.CH_ADR),HL
JP SW_ROM
TST_M:
PUSH DE
PUSH BC
EX DE,HL
LD D,(HL)
INC D
LD A,255
CPIR
JR NZ,ERR_TST_M
LOOP_TST_M:
LD A,B
OR C
JR Z,ERR_TST_M
BIT 7,(HL)
INC HL
DEC BC
JR Z,LOOP_TST_M
DEC D
JR NZ,LOOP_TST_M
POP BC
POP DE
AND A
RET
ERR_TST_M:
POP BC
POP DE
LD A,255
SCF
RET
;**************************************
CALL_DOS_MOVE:
LD HL,DOS_PROG
LD DE,DOS_PROG.Exec
LD BC,DOS_PROG.Size
LDIR
RET
;
; HL -  ¤à¥á ª®¬ ­¤ë, BC - ¤«¨­  ª®¬ ­¤ë
CALL_DOS1:
LD C,(HL)
INC HL
LD B,0
LD DE,(ZX_VARS.E_LINE)
LD (ZX_VARS.CH_ADR),DE
LDIR
LD (ZX_VARS.WORK_SPACE),DE
LD (ZX_VARS.STK_BOT),DE
LD (ZX_VARS.STK_END),DE
CALL CALL_DOS_MOVE
JP DOS_PROG.Exec
DOS_PROG:
DISP #5C00 - DOS_PROG.Size ;!HARDCODE
//DOS_PROG:
.Exec: PUSH AF
XOR A
OUT (SYS_PORT.RAM),A
POP AF
//DOS_PROG_A+1:
.Patch+2: CALL #3D03 ;!HARDCODE
PUSH AF
;!FIXIT ᤥ« âì ç¥à¥§ ãá«®¢¨¥ ª®¬¯¨«ï樨 ZX_ROM_BIOS
//LD A,0
//OUT (CNF_PORT),A
LD A,SYS_PORT.EXTENSION
OUT (SYS_PORT.ROM),A ;!!!!! ¢¥àá¨ï ¤«ï <20>‡“
POP AF
RET
//DOS_PROG_LEN
.Size EQU $ - .Exec
ENT
;????? ¢à®¤¥, ­¥ ¨á¯®«ì§ãîâáï
CONT_PROG:
LD HL,#1AFD ;!HARDCODE COM_LN:
PUSH HL
LD HL,#5B00 ;!HARDCODE
PUSH HL
LD DE,ZX_VARS.FLG_INPUT
LD BC,1
LD A,#E8 ;!HARDCODE
LD (DE),A
JP SW_ROM
CALL_DOS:
PUSH HL
PUSH DE
PUSH BC
PUSH AF
CALL CALL_DOS_MOVE
LD A,#13 ;!HARDCODE #13 ¨§ AUTO_1303
LD (DOS_PROG.Patch),A
POP AF
POP BC
POP DE
POP HL
JP DOS_PROG.Exec
;
;
;=======================================================================;
;=======================================================================;
;=======================================================================;
SERVICE:
//LD HL,SR_TAB
LD DE,SR_MENU
LD BC,SR_MENU.Size
//PUSH HL
CALL RUN_MENU ;09f3
LD HL,SR_TAB
//POP HL
CALL EXEC_PNT
JR SERVICE
SR_TAB: DW UTILIT
DW GOTO_TRDOS.m128
DW GOTO_TRDOS.m48
DW TURBO_OFF
DW TURBO_ON
DW CLEAR_RAM
DW RET_FROM_M
; DC - every last character of a string will have bit 7 set
SR_MENU:
BYTE 8 ; ª®«¨ç¥á⢮ ¯ã­ªâ®¢
BYTE 'Options ',#FF ; § £®«®¢®ª ¬¥­î
DC 'RUN disk.trd'
DC '128 TR-DOS'
DC '48 TR-DOS'
DC 'TURBO OFF '
DC 'TURBO ON '
DC 'Clear RAM'
DC 'RETURN'
DC " " ; ¬ àª¥à ª®­æ 
.Size EQU $-SR_MENU
;*****************************
;SR_48R:
GOTO_TRDOS:
.m128: LD A,#10
JR .RUN
;SR_48:
.m48: LD A,#30 ; ‘⮯®à ­  PORT_128 !!!
;SR_48A:
.RUN: LD BC,#7FFD
OUT (C),A
LD BC,0 ; <20>€ 0 !!
PUSH BC
LD BC,#3D2F ; DOS !
PUSH BC
JP SW_ROM
;*******************************
TURBO_OFF:
LD A,BIOS.FN_TURBO.OFF
LD C,BIOS.FN_TURBO
JP_to_BIOS
TURBO_ON:
LD A,BIOS.FN_TURBO.ON
LD C,BIOS.FN_TURBO
JP_to_BIOS
;*******************************
CLEAR_RAM:
DI
LD C,BIOS.FullInit
RST_to_BIOS
; ¯à¨ ®ç¨á⪥ ¯ ¬ï⨠¨§ ¬¥­î ᯥªâà㬠 ¢®§¢à â ¢ DSS ¯® CAD
; ¡ã¤¥â ®¯ á­ë¬ (RAM Blocks ®á¢®¡®¤¨«¨áì),
; ¯®í⮬㠮⪫îç ¥¬ ¯¥à¥å¢ â à¥á¥â .
;!TODO ¯à¨¤ã¬ âì ª ª ®âª«îç âì ¯¥à¥å¢ â ⮫쪮 ­  ¢®§¢à â ¢ DSS
LD A,ACEX.RET_PORT
LD BC,BIOS.SET_PORTS
CALL ToBIOS_3D13
EI
RET
;SR_CL_MEM:
; DI
; LD A,10H
;SR_CL_R2:
; LD BC,1FFDH
; OUT (C),A
; EX AF,AF'
; XOR A
;SR_CL_R1:
; LD BC,7FFDH
; OUT (C),A
; LD HL,0C000H
; LD DE,0C001H
; LD BC,03FFFH
; LD (HL),L
; LDIR
; INC A
; CP 48H
; JR NZ,SR_CL_R1
; EX AF,AF'
; CP 0
; JP Z,BASIC_128 ; ¢ë室 ­  á¡à®á BASIC 128
; LD A,0
; JR SR_CL_R2
;*****************************
; *** MENU IS-DOS ***
;*****************************
ISDOS:
LD HL,IS_TAB
LD DE,IS_MENU
LD BC,IS_MENU.Size
PUSH HL
CALL RUN_MENU
POP HL
CALL EXEC_PNT
JR ISDOS
IS_TAB:
; DW TR_DOS
; DW SP_DOS
DW SPRINTER_1X
DW AY8910_X
DW PENTAGON
DW SCORPION
DW PENTAGON512
DW SPRINTER_reset ;SPRINTER_2X
DW RET_FROM_M
; DC - every last character of a string will have bit 7 set
IS_MENU:
BYTE 8 ; ª®«¨ç¥á⢮ ¯ã­ªâ®¢
BYTE 'Hardware',#FF ; § £®«®¢®ª ¬¥­î
DC 'Sprinter ZX '
DC 'ZX Spectrum'
DC 'Pentagon 128'
DC 'Scorpion 256'
DC 'Pentagon 512'
DC 'Restart '
DC 'RETURN'
DC " " ; ¬ àª¥à ª®­æ 
.Size EQU $-IS_MENU
;******************************
;SP_DOS:
; LD B,0E2H
; LD A,0E1H
; JR TR_DOS1
;TR_DOS:
; LD B,0EAH
; LD A,0E1H
;TR_DOS1:
; CALL DOS_ON
; CALL SET_ROM_PAGES
; CALL DOS_OFF
; RET
;******************************
;**************************************************
;Sprinter ZX
SPRINTER_1X:
CALL _SET_CNF
LD C,BIOS.RST_CONF.SP97_1
RST_to_BIOS
CALL CNF_PN_320
LD L,2 ;FN_SYNC.INT_PENT
JR 1F ;!FIXIT ¬¥âªã ¯à¨¤ã¬ âì
;
;ZX Spectrum
AY8910_X:
CALL _SET_CNF
LD C,BIOS.RST_CONF.AY8910
RST_to_BIOS
LD A,#FA ; no ACC, Original waits
LD (Port_All_Mode),A
CALL CNF_SC_312
LD L,3 ;FN_SYNC.INT_ORIG
1: LD DE,CNF_PORT.CNF_0 + CNF_PORT.TURBO.ON
CALL CONFIG_SET
CALL CLS ;!FIXIT ­ã¦­® «¨?
RET
;
SCORPION:
CALL _SET_CNF
CALL CNF_SC_312
LD L,1 ;FN_SYNC.INT_SCORP
LD DE,CNF_PORT.CNF_1 + CNF_PORT.TURBO.ON
JR CONFIG_SET
PENTAGON:
CALL _SET_CNF
CALL CNF_PN_320
LD L,2 ;FN_SYNC.INT_PENT
LD DE,CNF_PORT.CNF_2 + CNF_PORT.TURBO.ON
JR CONFIG_SET
PENTAGON512:
CALL _SET_CNF
CALL CNF_PN_320
LD L,2 ;FN_SYNC.INT_PENT
LD DE,CNF_PORT.CNF_2 + CNF_PORT.TURBO.ON + CNF_PORT.CNF_512
; JR CONFIG_SET
CONFIG_SET:
PUSH DE
EI
HALT
DI
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD (SYS_PAGE.CONFIG_DE),DE
;!FIXIT ¥áâì «¨ á¬ëá« ¤¥« âì ¤® FN_SYNC?
LD A,(ZX_VARS.BORDER)
RRCA
RRCA
RRCA
AND 7
OUT (BorderColor),A
;
EX AF,AF'
OUT (SLOT3),A
LD A,L
LD C,BIOS.FN_SYNC
RST_to_BIOS
LD HL,#4104 ;!HARDCODE
LD E,0
LD BC,256*4 + BIOS.LP_OPEN_S ;!HARDCODE
RST_to_BIOS
LD HL,#5104 ;!HARDCODE
LD E,0
LD BC,256*4 + BIOS.LP_OPEN_S
RST_to_BIOS
POP DE
LD A,E
OUT (SYS_PORT.ROM),A
IM 1
EI
RET
SPRINTER_reset:
CALL _SET_CNF
LD BC,256*BIOS.REINIT.SOFT_RESET + BIOS.REINIT
JP_to_BIOS
_SET_CNF:
DI
LD A,CNF_PORT.CNF_0 + CNF_PORT.TURBO.ON
OUT (SYS_PORT.ROM),A
RET
CNF_SC_312:
LD A,Port_VSYNC.SET_312L
OUT (Port_VSYNC),A
RET
CNF_PN_320:
LD A,Port_VSYNC.SET_320L
OUT (Port_VSYNC),A
RET
; LD A,CNF_0
; OUT (SYS_PORT.ROM),A
; CALL DOS_OFF
; JP 0
;*****************************
; *** MENU UTILITES ***
;*****************************
;!FIXIT íâ® § ¯ã᪠c:\disk.trd - ­¥ ¤ã¬ î, çâ® íâ® ­ã¦­®, ¬®¦­® § ¬¥­¨âì
UTILIT:
LD HL,C_DISK_C
CALL CALL_DOS1
;!TEST
;CALL DOS_ON
;LD A,0 ; DETECT_HDD
;CALL EXP_HDD
LD C,BIOS.HDD_INIT
RST_to_BIOS
;CALL DOS_OFF
;
JR C,DISK_UTILIT
LD HL,C_DISK_C3
CALL CALL_DOS1
UTIL_DISK:
XOR A
;!TEST
LD C,BIOS.FreeMemRMD
RST_to_BIOS
;CALL EMM_FN3 ;!!!!! ç¥à¥§ RST_to_BIOS EMM.FreeMemRMD
;
LD HL,C_DEMO6
CALL CALL_DOS1
XOR A
;!TEST
LD C,BIOS.GET_RAMD_ST
RST_to_BIOS
;CALL GET_RAMD_ST
;
JR C,UTIL_DISK_L1
JR Z,UTIL_DISK_L1
LD HL,C_DISK_C1
CALL CALL_DOS1
LD HL,C_DISK_C2
CALL CALL_DOS1
RET
UTIL_DISK_L1:
LD A,(ZX_VARS.OPER_DISK)
INC A
CP 2
JR Z,DISK_UTIL_RET
LD HL,C_DISK_C5
CALL CALL_DOS1
JR UTIL_DISK
DISK_UTIL_RET:
LD HL,C_DISK_C6
CALL CALL_DOS1
RET
DISK_UTILIT:
LD HL,C_DISK_C4
CALL CALL_DOS1
JR UTIL_DISK
C_DEMO6: DB .Size, ZX_Token.rem, ':/disk.trd', 13,80
.Size EQU $-C_DEMO6-1
;***************************************
;VERSION: DEFB 22,21,0
; DEFB 16,2,"Expansion 3.02  1997 ELSY Co.",16,1,0FFh
;**********************************************
DOS_RUN:
LD HL,C_DISK_C1
CALL CALL_DOS1
LD HL,C_DISK_C2
CALL CALL_DOS1
RET
START_TRD:
LD HL,C_DISK_C
CALL CALL_DOS1
LD HL,C_DISK_C0
CALL CALL_DOS1
LD HL,C_DISK_C3
CALL CALL_DOS1
RET
C_DISK_C: DB .Size, ZX_Token.rem, ':', 13,80
.Size EQU $-C_DISK_C-1
C_DISK_C0: DB .Size, ZX_Token.rem, ':/CLEAR E', 13,80
.Size EQU $-C_DISK_C0-1
C_DISK_C1: DB .Size, ZX_Token.rem, ':/RMD E', 13,80
.Size EQU $-C_DISK_C1-1
C_DISK_C2: DB .Size, ZX_Token.rem, ':RUN', 13,80
.Size EQU $-C_DISK_C2-1
C_DISK_C3: DB .Size, ZX_Token.rem, ':/HDD', 13,80
.Size EQU $-C_DISK_C3-1
C_DISK_C4: DB .Size, ZX_Token.rem, ':/FDD', 13,80
.Size EQU $-C_DISK_C4-1
C_DISK_C5: DB .Size, ZX_Token.rem, ':/B:', 13,80
.Size EQU $-C_DISK_C5-1
C_DISK_C6: DB .Size, ZX_Token.rem, ':/A:', 13,80
.Size EQU $-C_DISK_C6-1
;