Spectrum.EXE/spectrum.asm
2024-10-30 00:55:31 +10:00

1588 lines
37 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.

;
; .----------------. .----------------. .----------------. .----------------. .----------------. .----------------. .----------------. .----------------.
; | .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. |
; | | _______ | || | ______ | || | _________ | || | ______ | || | _________ | || | _______ | || | _____ _____ | || | ____ ____ | |
; | | / ___ | | || | |_ __ \ | || | |_ ___ | | || | .' ___ | | || | | _ _ | | || | |_ __ \ | || ||_ _||_ _|| || ||_ \ / _|| |
; | | | (__ \_| | || | | |__) | | || | | |_ \_| | || | / .' \_| | || | |_/ | | \_| | || | | |__) | | || | | | | | | || | | \/ | | |
; | | '.___`-. | || | | ___/ | || | | _| _ | || | | | | || | | | | || | | __ / | || | | ' ' | | || | | |\ /| | | |
; | | |`\____) | | || | _| |_ | || | _| |___/ | | || | \ `.___.'\ | || | _| |_ | || | _| | \ \_ | || | \ `--' / | || | _| |_\/_| |_ | |
; | | |_______.' | || | |_____| | || | |_________| | || | `._____.' | || | |_____| | || | |____| |___| | || | `.__.' | || ||_____||_____|| |
; | | | || | | || | | || | | || | | || | | || | | || | | |
; | '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' |
; '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' '----------------'
;
/*
SYS
[x] - § ¤ ñâáï CONFIG_DE ¯¥à¥¤ § ¯ã᪮¬ ᯥªâà㬠 ¨ ¢ ¯¥à¥å¢ â稪¥ à¥á¥â  (¤«ï ¡®«¥¥ £« ¤ª®© ᮢ¬¥á⨬®á⨠ᮠáâ àë¬ á®ä⮬ Sp97)
[x] - ¯®¤¤¥à¦ª  ­®¢ëå ®¡à §®¢ vROM
[x] - ¢ ª®­ä¨£¥ ¬®¦­® ¯à®¯ãáâ¨âì § £à㧪ã á HDD ¢ë¡à ­­ëå vROM, ®­¨ ¯à®¯ã᪠îâáï ¥á«¨ ¯¥à¥¤ ¯ãâñ¬ á⮨â ";"
[x] - ¯à®¢¥àïâì ¬¥âªã ZX, ¥á«¨ ¬ë ­¥ £à㧨¬ 3 ®á­®¢­ëå vROM
[x] - ¤®¡ ¢«¥­  ᮢ¬¥á⨬®áâì á ¤¥¬® ATARIN, ãᯮ«ì§ãî饩 ­¥¯®«­ãî ¤¥è¨äà æ¨î ¯®àâ  AY
[x] - ¯¥à¥¤ ¢å®¤®¬ ¢ ०¨¬ ᯥªâà㬠 ⥪ã騬 ãáâ ­ ¢«¨¢ ¥âáï ¯®«­ë© ¯ãâì ª ¯ ¯ª¥ á ª®â®à®£© § £à㦠«áï ®¡à § TRD
;
Images
[+] - Load SCL image
[ ] - Load TAP image
[ ] - Load SNA file
;
Features
[+] - ᫨ ¢ë¡à ­® ret-zx,â® ¯à¨ ­ ¦ â¨¨ ­  ¯à®¡¥« áà §ã ¯®á«¥ CAD ¢¥à­ñâ ¢ DSS
[*] - Œ¥­ïâì ᯥªâà㬮¢áªãî ¯ «¨âàã
[ ] - 뤠¢ âì á®®¡é¥­¨ï ­  ï§ëª¥ ãáâ ­®¢«¥­­®¬ ¢ CMOS
*/
;
; Compilation parameters
;***************************************
DEVICE SPRINTER
; MMU 2 e, 0 ; ­ã«¥¢ ï áâà ­¨æ  ¢ ¡ ­ªã 2 ¨ ¯à®¢¥àª  ­  £à ­¨æë
; OUTPUT './Build/new.bin'
;***************************************
;
; Defines section
;***************************************
IFNDEF DEBUG : DEFINE DEBUG 0 : ENDIF
IFNDEF EMULATOR 0 : DEFINE EMULATOR 0 : ENDIF
DEFINE EXE_HEADER 1
DEFINE App_EXE_Version 1
DEFINE NEW_MEMORY_LOGIC 1
; define NEED_LOADER 1
; define NeedSafePort_Y 0
;***************************************
;
;
; Included constants section
;***************************************
INCLUDE 'Shared_Includes/constants/sp2000.inc'
INCLUDE 'Shared_Includes/constants/dss_equ.inc'
INCLUDE 'Shared_Includes/constants/BIOS_equ.inc'
;***************************************
;
;
; Included macroses section
;***************************************
INCLUDE 'Shared_Includes/macroses/macros.z80'
INCLUDE 'Shared_Includes/macroses/accelerator.z80'
;***************************************
;
; Included LUA section
;***************************************
INCLUDELUA <Shared_Includes/LUA/Functions.LUA>
;***************************************
;
;
; Standart EQU section
;***************************************
org_addr EQU #8000+CLP_Buffer
code_addr EQU BEGIN
stack_point EQU #C000
stack_buffer EQU 64
program_start EQU BEGIN
Loader_length EQU 0
;***************************************
;
;
; Program EQU section
;***************************************
FULL_FILE_NAME_LENGTH EQU 256 ; ¤«¨­  áâப¨ ¯ã⨠ª ä ©«ã
MAX_LINE_LENGTH EQU 120 ; ¤«¨­  áâப¨ CFG ä ©« 
CFG_FILE_LINES EQU 13
.NAME EQU 1
.BASIC128 EQU 2
.BASIC_48 EQU 3
.TRDOS EQU 4
.ZXEXP EQU 5
.ZXBIOS1 EQU 6
.ZXBIOS2 EQU 7
.BASIC128_2 EQU 8
.BASIC_48_2 EQU 9
.TRDOS_2 EQU 10
.ZXEXP_2 EQU 11
.OPTIONS EQU 12
.PALETTE EQU 13
;OPTIONS_LINE EQU (CFG_FILE_LINES-1)*2
;***************************************
;
;
; Program EQU section
;***************************************
INCLUDE 'version.inc'
;***************************************
;
;
; Code start section
;[]-------------------------------------------------------------------[]
IF EXE_HEADER
INCLUDE 'Shared_Includes/constants/EXE_Header.z80'
ORG org_addr
ELSE
ORG org_addr-CLP_Buffer
ENDIF
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ;
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ;
BEGIN: LD (LINE_X),IX
LD HL,START_MSG
LD C,Dss.PChars
RST ToDSS
;
;
LD C,Dss.Version
RST ToDSS
SCF
LD HL,256*DSS_MIN_VERS.vers + DSS_MIN_VERS.modf
SBC HL,DE
JP NC,ERROR_OLD_DSS
LD HL,DSS_MIN_VERS.build
SBC HL,BC
JR NC,ERROR_OLD_DSS
;
;
IN A,(SLOT3)
LD (SAVE_SLOT3),A
;
;
;!TODO
;LD HL,SPECTRUM_HOME_DIR
;LD BC,Dss.AppInfo.EXE_HomeDir
;RST ToDSS
;;
;LD C,Dss.CurDisk
;RST ToDSS
;ADD A,'A'
;LD (USER_CURRENT_DRV),A
;;
;LD HL,USER_CURRENT_DIR
;LD C,Dss.CurDir
;RST ToDSS
;
; JR PARSE_CMD_LINE
CALL PARSE_CMD_LINE
CALL READ_CNF_FILE
; SetUp ZX
CALL PARSE_PARAMETERS
CALL COUNT_vROM_PAGES
PUSH AF
; Žç¨é ¥¬ ¯ ¬ïâì, ¥á«¨ ROM_BIN > 0
LD BC,BIOS.ZX_MEMORY_MANAGER.FreeZXvPages.vROM
CALL NC,ToBIOS
; ‚뤥«ï¥¬ áâà ­¨æë ¯®¤ vRAM
LD A,(PARAMS.No_run + 2)
AND A
CALL NZ,GET_vRAM_PAGES
JR C,Error_NoMemForSPpages
POP AF
; ‚뤥«ï¥¬ áâà ­¨æë ¯®¤ vROM, ¥á«¨ ROM_BIN > 0
JR C,.skip_vROM
LD A,(ZX_vROM_COUNT)
LD B,A
LD C,BIOS.GetMem
RST ToBIOS
JR C,Error_NoMemForSPpages
LD (ZX_vROM_BLK),A
; Œ ¯¯¨¬ áâà ­¨æë vROM, ¥á«¨ ROM_BIN > 0
LD HL,BUFFER_RAM_PAGES
LD C,BIOS.GetMemBlkPages
RST ToBIOS
CALL LOAD_vROM_BIN
.skip_vROM: ; ¥á«¨ norun, â® ¤ «ìè¥ ­¥ ­ ¤®
LD A,(PARAMS.No_run + 2)
AND A
LD HL,MSG_EXIT1
JP Z,EXIT_ALL
; £à㧨¬ ¯ «¨âàã ¨ ®¡à § ¤¨áª , ¥á«¨ ­ ¤®
CALL LOAD_IMAGE_FILE
CALL LOADING_PALETTE
CALL SHOW_MESSAGE_OK_CFG_NAME
JP PREPARE_TO_ZXMODE
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
Error_NoMemForSPpages:
LD HL,NO_MEM_MSG
LD B,DSS_Error.sys.NOT_ENOUGH_MEMORY
JR ERROR_FILE.prn_msg
; ;
ERROR_FILE: LD HL,ERROR_FILE_MSG_X
LD C,Dss.PChars
RST ToDSS
;
; LD A,(FILE_HANDLE)
; LD C,Dss.Close
; RST ToDSS
;
LD HL,ONE_FILE
LD B,DSS_Error.sys.FILE_NOT_FOUND
.prn_msg: PUSH BC
LD C,Dss.PChars
RST ToDSS
;
LD A,(vROM_LOAD_BIN.need_free)
OR A
JR Z,.skip_free
;
LD A,(ZX_vROM_BLK)
LD C,BIOS.FreeMem
RST ToBIOS
;
.skip_free: LD HL,ERROR_FILE_MSG
POP BC
JR EXIT_NOW
; ;
ERROR_ZX_FLAG: LD HL,MSG_NO_ZX_FLAG
JR EXIT_NOW
; ;
ERROR_OLD_DSS: LD HL,MSG_OLD_DSS
JR EXIT_NOW
; ;
EXIT_ALL: LD B,DSS_Error.sys.NO_ERROR
JR EXIT_NOW
; ;
END_CNF_ERROR: LD HL,ERROR_CNF
LD B,DSS_Error.sys.UNKNOWN_FORMAT
EXIT_NOW: PUSH BC
LD C,Dss.PChars
RST ToDSS
;
LD BC,BIOS.ZX_MEMORY_MANAGER.FreeZXvPages.vRAM
RST ToBIOS
POP BC
.loop: LD C,Dss.Exit
RST ToDSS
JR .loop
; ;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
; out B - old ROM-page
SET_ROM: DI ;!FIXIT ®áâ ¢¨âì ®¤­® DI ¢ ­ ç «¥
LD C,BIOS.SET_PORTS
JP ToBIOS
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
; —⥭¨¥ ®¡à §  TRD/SCL ¢ à ¬¤à ©¢
READ_IMAGE: LD DE,ONE_FILE
LD BC,FULL_FILE_NAME_LENGTH
LDIR
LD HL,ONE_FILE
LD A,Dss.Open.R
LD C,Dss.Open
RST ToDSS
RET C
LD (IMAGE_HANDLER),A
; [x] 31/01/2024 ¯®¤¤¥à¦ª  ¯¥à¥ª«î祭¨ï ¤¨áª /à §¤¥«  ¢ TR-DOS
LD HL,ONE_FILE
LD BC,Dss.EX_Path.GET_ALL
RST ToDSS
JR C,.no_change_Disk
AND 8
JR Z,.currentDisk
;
LD C,Dss.CurDisk
RST ToDSS
JR C,.no_change_Disk
JR .getInfoDRV
;
.currentDisk: LD A,(ONE_FILE)
SUB "A"
;
.getInfoDRV: ; <20> áâà ¨¢ ¥¬ HDD
OR #80
LD HL,TMP_BUFF
LD BC,Dss.DskInfo
RST ToDSS
;
LD B,4 ;!HARDCODE ­®¬¥à ­ã¦­®£® ¯ à ¬¥âà 
LD DE,0
LD HL,TMP_BUFF
.loop_param: ADD HL,DE
LD E,(HL)
INC HL
DJNZ .loop_param
; check HDD
LD A,(HL)
CP DRIVE_CODES.SPRINTER.HDD
JR C,.no_change_Disk
CP DRIVE_CODES.SPRINTER.HDD + 4 + 1
JR NC,.no_change_Disk
;
LD A,%0000'0011
AND (HL)
LD D,A
INC HL
LD A,(HL)
RLCA
RLCA
;
OR D
AND #0F
;
LD (SET_CURRENT_HDD.NUMBER),A
OR DRIVE_CODES.TRDOS.HDD
LD (RESET_TO_ZX.CURRENT_DIR_DRIVE),A
;
; [x] ¯®¤¤¥à¦ª  ¯¥à¥ª«î祭¨ï ¯ ¯ª¨ ®¡à §  ¤«ï ०¨¬  ZX
; ‚뤥«ï¥¬ ¯ãâì ¤® ¯ ¯ª¨ á ®¡à §®¬
LD HL,ONE_FILE
LD BC,ONE_FILE.Size
XOR A
CPIR
DEC HL
DEC HL
PUSH HL
LD HL,ONE_FILE.Size - 2
SBC HL,BC
LD B,H
LD C,L
POP HL
LD A,'\' ;
CPDR
INC HL
LD (HL),0
; ãáâ ­ ¢«¨¢ ¥¬ ¨ ¨­¨â¨¬ ¢¨­â
; LD A,SYS_PORT.BIOS
; OUT (SYS_PORT.ROM),A
CALL SET_CURRENT_HDD
; LD A,SYS_PORT.BIOS
; OUT (SYS_PORT.RAM),A
; ¯ àᨬ ¤«ï à áçñ⮢ BPB
CALL BPB_SetUp
; § ¯®¬¨­ ¥¬ ᥪâ®à ¤¨à¥ªâ®à¨¨
CALL SET_IMAGE_DIR_SECTOR
;;;;;;;;;
;
.no_change_Disk:;
LD A,(IMAGE_FLAG)
AND A
JR Z,.Load_TRD
DEC A ; check if SCL
JP Z,Load_SCL
;jp Error_Flag ;!!!!!!!!!!!!!!!!
.Load_TRD: LD A,(IMAGE_HANDLER)
LD HL,0
LD IX,0
LD BC,Dss.Move_FP.FrEnd
RST ToDSS ; ­ ©â¨ ¤«¨­ã ä ©« 
RET C
PUSH IX
POP DE
CALL Get_RAM_Disk_E
RET C
JP Load_IMAGE_File
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
; hl:de - à §¬¥à ä ©«  ¢ ¡ ©â å
Get_RAM_Disk_E: LD A,D
ADD A,A
ADC HL,HL
ADD A,A
ADC HL,HL
LD A,D
AND #3F
OR E
JR Z,.skip_inc
INC HL
;HL - ¤«¨­  ä ©«  ¢ áâà ­¨æ å
.skip_inc: LD A,H
AND A
JR NZ,ERROR_NO_MEM
LD A,L
AND A
JR Z,ERROR_NO_MEM
PUSH AF
; [x] 04/11/2023 Žâ¤¥«ì­ë¥ à ¬¤¨áª¨ ¤«ï ०¨¬  ᯥªâà㬠 ¨ DSS
.free_disk: DI
;!TEST
;XOR A ; RAM-Drive E:
;LD C,BIOS.FreeMemRMD
;RST ToBIOS ; ®á¢®¡®¤¨âì e:
;
POP BC
;!TEST
;LD B,A ; § ¯à®á¨âì ¯ ¬ïâì ã bios- 
;XOR A ; RAM-Drive E:
;LD C,BIOS.GetMemRMD ; ¨ ¯®¤á®¥¤¨­¨âì ª e:
LD C,BIOS.GetMem
;
RST ToBIOS
JR C,ERROR_NO_MEM
LD (Load_IMAGE_File.MEM_BLK),A
RET
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
Load_IMAGE_File:
LD A,(IMAGE_HANDLER)
LD HL,0
LD IX,0
LD BC,Dss.Move_FP.FrStart
RST ToDSS ; ãáâ ­®¢¨âì 㪠§ â¥«ì ­  0
RET C
LD HL,MSG_LOAD_IMAGE ; loading image
LD C,Dss.PChars
RST ToDSS
.MEM_BLK+1: LD A,0
.load_loop: PUSH AF
OUT (SLOT3),A
LD A,(IMAGE_HANDLER)
LD HL,#C000 ; £à㧨âì 16k
LD DE,#4000
LD C,Dss.Read
RST ToDSS
JR C,ERROR_IN_READ
LD HL,PROGRES_IND ; loading progress
LD C,Dss.PChars
RST ToDSS
DI
POP AF
.scl_read_next: LD C,BIOS.GetMemPageNext
RST ToBIOS
CP #FF
JR NZ,.load_loop
LD HL,PROGRES_100 ; loading 100%
LD C,Dss.PChars
RST ToDSS
LD A,(IMAGE_HANDLER)
LD C,Dss.Close ; § ªàëâì ä ©«
RST ToDSS
RET C
.Set_RAM_Dsk_EtoA:
DI
XOR A
LD BC,0*256+BIOS.RAMD_TO_DRV ; ­ §­ ç¨âì e: ­  a:
RST ToBIOS
AND A
RET
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
ERROR_IN_READ: POP AF
JR ERROR_IMAGE_X
ERROR_NO_MEM: LD HL,MSG_NO_MEM
LD C,Dss.PChars
RST ToDSS
ERROR_IMAGE_X: LD A,(IMAGE_HANDLER)
LD C,Dss.Close ; § ªàëâì ä ©«
RST ToDSS
SCF
RET
SAV_PG3X: DB 0 ; !FIXIT ¯¥à¥­¥áâ¨
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
READ_FILE_1: LD DE,ONE_FILE
LD BC,FULL_FILE_NAME_LENGTH
LDIR
LD HL,ONE_FILE
OUT (SLOT3),A
; READ_FILE:
LD A,Dss.Open.R
LD C,Dss.Open
RST ToDSS
RET C ; ®è¨¡ª , ¥á«¨ ­¥â ä ©« 
;
LD (FILE_HANDLE),A
LD A,(FILE_HANDLE)
;
LD HL,#C000
LD DE,#4000
LD C,Dss.Read
RST ToDSS
RET C ; ®è¨¡ª  ¯à¨ ç⥭¨¨
;
PUSH DE
LD A,(FILE_HANDLE)
LD C,Dss.Close
RST ToDSS
POP DE ; ¤«¨­  áç¨â ­­ëå ¤ ­­ëå
RET ; ®è¨¡ª  ¯à¨ § ªàë⨨ ¨«¨ Ok
FILE_HANDLE: DB 0 ; !FIXIT ¯¥à¥­¥áâ¨
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
FIRST_PREPARE: LD A,CNF_PORT.CNF_0
OUT (SYS_PORT.RAM),A
; restore HOLD port
LD D,CMOS_CELL.ScreenPosition
LD C,BIOS.CMOS_RD
RST ToBIOS
JR C,.next
LD B,A
LD A,ACEX.HOLD
LD C,BIOS.SET_PORTS
RST ToBIOS
;
.next: LD A,high ZXKeys.Line_7
IN A,(ZXKeys)
AND #1F
CP #1E
RET
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
EXIT_TO_DSS: DI
LD SP,stack_point
CALL FIRST_PREPARE
JP Z,RESET_TO_ZX.cont
.cont: ;LD A,(Spec_Page.page_0)
;OUT (SLOT0),A
LD A,(Spec_Page.page_3)
OUT (SLOT3),A
XOR A
LD BC,3*256+BIOS.SET_PAL_INIT ; SET IBM PAL
RST ToBIOS
;!TEST; [ ] 05/11/2023 ®ç¨é âì à ¬¤¨áª¨ ¯à¨ ¢ë室¥
LD A,(PARAMS.RMD_Keep+2)
AND A
JR NZ,.next
; ®ç¨á⪠ à ¬¤¨áª®¢
LD BC,256*SYS_PAGE.RAMD_KEYS.NUM + BIOS.FreeMemRMD
.loop: PUSH BC
LD A,B
DEC A
RST ToBIOS
POP BC
DJNZ .loop
;
.next: ;!TEST; [ ] 04/11/2023 Žâ¤¥«ì­ë¥ à ¬¤¨áª¨ ¤«ï ०¨¬  ᯥªâà㬠 ¨ DSS. BLK_TO_RAMD
LD BC,BIOS.SWAP_RAM_DRIVES.Sp2000
RST ToBIOS
;
; LD A,Dss.SetVMod.txt80x32 ; OPEN_TXT
; LD BC,0*256+Dss.SetVMod
; RST ToDSS
;
; LD A,#20
; LD DE,0
; LD HL,#2050
; LD BC,7*256+Dss.Clear
; RST ToDSS
BACKTXT: ;
.VMODE+1: LD A,#00
.mode+2: LD BC,0*256+Dss.SetVMod
RST ToDSS
;
LD A,(.VMODE)
CP %1000'0000
JR NC,.EXIT
;
LD IX,PlaceForTXTscreen
.WinMax+1: LD HL,#2050
LD DE,#0000
IN A,(SLOT2)
LD B,A
LD C,BIOS.WIN_RESTORE
XOR A
DI
RST ToBIOS
;
.CURS+1: LD DE,#0000
LD C,Dss.Locate
RST ToDSS
.EXIT: ;
; LD BC,Dss.K_SETUP.ClearSIObuff
; RST ToDSS
LD HL,MSG_ZX_EXIT
JP EXIT_ALL
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
PREPARE_TO_ZXMODE:
LD C,Dss.GetVMod
RST ToDSS
; A - VMODE, B - SCREEN PAGE
SAVETXT: LD (BACKTXT.VMODE),A
EX AF,AF'
LD A,B
LD (BACKTXT.mode),A
EX AF,AF'
CP %1000'0000
JR NC,.EXIT
SUB #02
JR C,.EXIT
;
PUSH AF
LD C,BIOS.LP_GET_PLACE
RST ToBIOS
LD (BACKTXT.CURS),DE
POP AF
LD IX,PlaceForTXTscreen
LD HL,#2050
OR A
JR NZ,.next
LD L,#28
.next: LD (BACKTXT.WinMax),HL
LD DE,#0000
IN A,(SLOT2)
LD B,A
LD C,BIOS.WIN_COPY
XOR A
DI
RST ToBIOS
.EXIT: ;
;!TEST; [ ] 04/11/2023 Žâ¤¥«ì­ë¥ à ¬¤¨áª¨ ¤«ï ०¨¬  ᯥªâà㬠 ¨ DSS. BLK_TO_RAMD
SETUP_RAM_DRIVES:
LD BC,BIOS.SWAP_RAM_DRIVES.ZX
RST ToBIOS
; § ¯ã᪠á ä ©«®¬ ¤«ï à ¬¤¨áª ?
LD A,(Load_IMAGE_File.MEM_BLK)
OR A
JR Z,.skip
; ¯à®¢¥à塞 ¤à ©¢ ¯¥à¥¤ ¯¥à¥­ §­ ç¥­¨¥¬
XOR A
LD C,BIOS.GET_RAMD_ST
RST ToBIOS
OR A
JR Z,.set_block
; ®á¢®¡®¤¨âì à ¬¤¨áª
XOR A
LD C,BIOS.FreeMemRMD
RST ToBIOS
; set disk e:
.set_block: LD A,(Load_IMAGE_File.MEM_BLK)
LD B,A
XOR A
LD C,BIOS.BLK_TO_RAMD
RST ToBIOS
.skip: ;
; ;
;!FIXIT ¯¥à¥¤¥« âì ­  äã­ªæ¨î ¡¨®á 
SET_RELOAD_PROG:
; DI
; LD A,Spec_Page
; OUT (SLOT3),A
; LD A,"Z"
; LD (#FFFE),A
; LD A,"X"
; LD (#FFFF),A
; LD A,(PARAMS.Ret_fn+2)
; AND A
; LD DE,RESET_TO_ZX ;  ¤à¥á ¯à®£à ¬¬ë ¯¥à¥§ ¯ã᪠ ¤«ï ret-zx
; JR Z,.NO_RET_FN
; LD DE,EXIT_TO_DSS ;  ¤à¥á ¯à®£à ¬¬ë ¯¥à¥§ ¯ã᪠ ¤«ï ret-fn
;
.NO_RET_FN: ;LD (#FFF4),DE ;  ¤à¥á ¯à®£à ¬¬ë ¢®§¢à â 
;IN A,(SLOT0)
;LD (#FFF0),A ; DOS-PAGE
;IN A,(SLOT1)
;LD (#FFF1),A
;IN A,(SLOT2) ; á®åà ­¨âì áâà ­¨æã
;LD (#FFF2),A ; ¯à®£à ¬¬ë ¤«ï ¢®§¢à â 
;LD A,(SAVE_SLOT3)
;LD (#FFF3),A
; LD B,A
; LD A,(PARAMS.Ret_zx+2)
; XOR B
; JR Z,RESET_TO_ZX
; ;
; LD A,ACEX.Config_PG.Sp2000_SoftRestartSet
; LD BC,BIOS.RST_CONF.CUSTOM
; RST ToBIOS
;° ° ° ° ° ° ° ° ° ° ° ° ° ° ° ° ° ° ° ° ° ° ° ° ° ° ° ° ° ° ° ° ° ° ° °;
RESET_TO_ZX: DI
LD SP,stack_point ; #BFF0
CALL FIRST_PREPARE
JP Z,EXIT_TO_DSS.cont
; [x] ä¨ªá ­¥¯®«­®© ¤¥è¨äà æ¨¨ ¯®àâ  #FFFD (¯¨èãâ ¢ #C0FD)
.cont: ; LD A,#FF
; LD HL,%00'010'1'1110'1101
; LD DE,%10'111'1'1111'1111 ; CNF_0, CNF_1
; LD BC,ACEX.AY_FFFD_WRITE*256 + BIOS.DCP_CONFIG
; RST ToBIOS
;
; [x] 04/11/2023 Žâ¤¥«ì­ë¥ à ¬¤¨áª¨ ¤«ï ०¨¬  ᯥªâà㬠 ¨ DSS. BLK_TO_RAMD
; LD BC,BIOS.SWAP_RAM_DRIVES.ZX
; RST ToBIOS
;
; LD A,(PARAMS.Ret_zx+2)
; LD B,A
; LD A,(PARAMS.Ret_fn+2)
; XOR B
; LD B,A
; LD A,ACEX.RET_PORT
; CALL SET_ROM ; ¢ª«îç¨âì ¢®§¢à â
LD A,(PARAMS.Ret_fn+2)
AND A
LD DE,RESET_TO_ZX ;  ¤à¥á ¯à®£à ¬¬ë ¯¥à¥§ ¯ã᪠ ¤«ï ret-zx
JR Z,.NO_RET_FN
LD DE,EXIT_TO_DSS ;  ¤à¥á ¯à®£à ¬¬ë ¯¥à¥§ ¯ã᪠ ¤«ï ret-fn
.NO_RET_FN: LD B,A
LD A,(PARAMS.Ret_zx+2)
XOR B
JR Z,.NO_RST_HDL
;
LD A,ACEX.Config_PG.Sp2000_SoftRestartSet
LD BC,BIOS.RST_CONF.CUSTOM
RST ToBIOS
.NO_RST_HDL:
; [ ]
LD A,SYS_PAGE
OUT (SLOT3),A
.DIR_SEC_L+1: LD HL,0
LD (SYS_PAGE.CURRENT_DIR_SEC_L),HL
.DIR_SEC_H+1: LD HL,0
LD (SYS_PAGE.CURRENT_DIR_SEC_H),HL
.CURRENT_DIR_DRIVE+1:
LD A,#FF
LD (SYS_PAGE.CURRENT_DIR_DRIVE),A
LD (SYS_PAGE.CURRENT_DIR_DRIVE_COPY),A
;!TODO ¢ BIOS?
LD BC,CBL.SYS_PORT
XOR A
OUT (C),A ; CBL-off
;
;[ ] 1/02/2024 ०¨¬ ᯥªâà㬠 à ¡®â ¥â á «î¡ë¬¨ ª ­ « ¬¨ ¨ ®á­®¢­ë¬¨ à §¤¥« ¬¨
CALL SET_CURRENT_HDD
;
XOR A ; reg A' for GOTO_SPECTRUM
EX AF,AF'
;
LD A,(PARAMS.LD_Pal+2)
INC A
JR NZ,Skip_Load_Palette
;
LD HL,PlaceForPalette + 0
LD A,4
CALL SET_PAL
;
LD HL,PlaceForPalette + 1024
LD A,5
CALL SET_PAL
;
LD HL,PlaceForPalette + 2048
LD A,6
CALL SET_PAL
;
LD HL,PlaceForPalette + 3072
LD A,7
CALL SET_PAL
;
LD A,%0000'0100 ; set custom palette
EX AF,AF'
Skip_Load_Palette:
EX AF,AF'
LD HL,(PARAMS.Int_sc+2)
ADD A,L
LD HL,(PARAMS.Int_or+2)
OR L
LD HL,(PARAMS.Lines312+2)
ADD A,L
EX AF,AF'
; port all mode
LD A,(PARAMS.Int_or+2)
AND A
LD B,#FA ; original waits on
JR NZ,Set_Next_Par
LD B,#FE
Set_Next_Par: ; SYS_PORT/CNF_PORT
XOR A
LD HL,(PARAMS.Turbo+2)
ADD A,L
LD HL,(PARAMS.Sprinter+2)
ADD A,L
LD HL,(PARAMS.P_7FFD+2)
ADD A,L
LD HL,(PARAMS.P_1FFD+2)
ADD A,L
LD HL,(PARAMS.Mem512+2)
ADD A,L
LD E,A
; Start ROM
LD HL,(PARAMS.To_trd+2)
LD D,L
; vROM & vRAM
LD HL,(ZX_vROM_BLK)
; RESERVED
EX AF,AF'
;
LD C,BIOS.GOTO_SPECTRUM
RST ToBIOS
;!FIXIT ᤥ« âì ®¡à ¡®â稪
.di_halt: DI
HALT
JR .di_halt
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
SET_PAL: LD DE,0
LD BC,#FF*256 + BIOS.PIC_SET_PAL
JP ToBIOS
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
MAKE_FULL_NAME: LD HL,(CNF_NAME)
LD (.mode),HL
LD DE,ONE_FILE
LD C,Dss.GSwitch
RST ToDSS
;
LD HL,ONE_FILE
LD BC,Dss.EX_Path.GET_ALL
RST ToDSS
;
OR 2
CP 3 ; only "FileName.ext"?
LD HL,(CNF_NAME)
JR Z,.get_app_path
RET
;
.def_cnf: LD HL,CNF_FILE
LD (.mode),HL
;
.get_app_path: LD HL,ONE_FILE
LD BC,Dss.AppInfo.EXE_HomeDir
RST ToDSS
;
LD HL,ONE_FILE
LD BC,12 ;!HARDCODE filename length
XOR A
CPIR
DEC HL
EX DE,HL
;
.mode+1: LD HL,0
LD BC,12 ;!HARDCODE filename length
LDIR
XOR A
LD (DE),A
LD HL,ONE_FILE
RET
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
PARSE_CMD_LINE: LD HL,(LINE_X)
LD A,(HL)
AND A
JR Z,.NO_FILE
DEC A
JR Z,.NO_FILE
;
INC HL
INC HL
CALL FIND_FILES
CALL MAKE_FULL_NAME
LD A,SHARED_PAGE
CALL READ_FILE_1
JR NC,.exit
;
.NO_FILE: CALL MAKE_FULL_NAME.def_cnf
LD A,SHARED_PAGE
CALL READ_FILE_1
JP C,ERROR_FILE
;
.exit: LD (LEN_CNF),DE ; CNF ä ©« ¯à®ç¨â ­, DE - ¤«¨­  CNF
RET
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
FIND_FILES: PUSH HL
LD (X_FILE),HL
LD DE,0
LD (IMAGE_FLAG),DE
LD (IMAGE_NAME),DE
LD (CNF_NAME),DE
LD B,A
JR .NO_NEXT
;
.PARSING_LOOP: LD A,(HL)
INC HL
CP "."
CALL Z,.CHOOSE_FILE
CP " "
CALL Z,.BLANK_X
CP "\t"
CALL Z,.BLANK_X
CP "\n"
CALL Z,.BLANK_X1
CP "\r"
CALL Z,.BLANK_X1
JR Z,.END_NO_IMAGE
.NO_NEXT: DJNZ .PARSING_LOOP
;
.END_NO_IMAGE: POP HL
LD A,(CNF_NAME+1)
AND A
RET NZ
LD A,(IMAGE_NAME+1)
AND A
LD DE,(X_FILE)
JR Z,.CNF_ALL
LD DE,CNF_FILE
.CNF_ALL: LD (CNF_NAME),DE
RET
;
.BLANK_X: LD (X_FILE),HL ; ­ ©¤¥­ ¯à®¡¥«, ¨¬ï ä ©«  - á­®¢ 
.BLANK_X1: DEC HL
LD (HL),0
INC HL
RET
; ;
.CHOOSE_FILE: LD A,(HL)
AND %1101'1111
; TRD file
CP 'T'
JR Z,.TRD
; SCL file
CP 'S'
JR Z,.SCL
; ZX file
CP 'Z'
JR NZ,.unknown
;
.CNF: LD DE,(X_FILE)
LD (CNF_NAME),DE
.unknown: DEC HL
LD A,(HL)
INC HL
RET
;
.SCL: LD DE,IMAGE_FLAG
LD A,1
LD (DE),A
.TRD: LD DE,(X_FILE)
LD (IMAGE_NAME),DE
JR .unknown
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
READ_CNF_FILE: LD HL,#C000
LD DE,ADDRESS_LINES
LD C,CFG_FILE_LINES
;
.LOOP_A: LD B,MAX_LINE_LENGTH ; ¤«¨­  áâப¨
EX DE,HL
LD (HL),E
INC HL
LD (HL),D
INC HL
EX DE,HL
;
.LOOP_L: LD A,(HL)
CP "\r"
JR Z,.N_LINE
CP "\n"
JR Z,.N_LINE
AND A
JP Z,END_CNF_ERROR
INC HL
DJNZ .LOOP_L
;
.N_LINE: LD (HL),0
.N_LINE2: INC HL
LD A,(HL)
CP "\r"
JR Z,.N_LINE2
CP "\n"
JR Z,.N_LINE2
DEC C
JR NZ,.LOOP_A
RET
; ¢ë¤¥«¥­® 8 áâப ¢ CNF
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
MACRO vROM_LOAD romLine;,pageNumber
.RomLine = (romLine-1)*2
LD DE,(ADDRESS_LINES+.RomLine)
CALL vROM_LOAD_BIN
ENDM
;
LOAD_vROM_BIN: LD A,#FF
LD (vROM_LOAD_BIN.need_free),A
;
EXX
LD HL,BUFFER_vROM_PAGES.Pages
EXX
LD HL,BUFFER_RAM_PAGES
vROM_LOAD CFG_FILE_LINES.BASIC128 ;, #42 2-ï áâப  - ¨¬ï ä ©«  BASIC128
vROM_LOAD CFG_FILE_LINES.BASIC_48 ;, #43 3-ï áâப  - ¨¬ï ä ©«  BASIC 48
vROM_LOAD CFG_FILE_LINES.TRDOS ;, #44 4-ï áâப  - ¨¬ï ä ©«  TR-DOS
vROM_LOAD CFG_FILE_LINES.ZXEXP ;, #45 5-ï áâப  - ¨¬ï ä ©«  EXPANSION
vROM_LOAD CFG_FILE_LINES.ZXBIOS1 ;, #46 6-ï áâப  - ¨¬ï ä ©«  BIOS
vROM_LOAD CFG_FILE_LINES.ZXBIOS2 ;, #47 7-ï áâப  - ¨¬ï ä ©«  BIOS2
vROM_LOAD CFG_FILE_LINES.BASIC128_2 ;, ??? 8-ï áâப  - ¨¬ï ä ©« 
vROM_LOAD CFG_FILE_LINES.BASIC_48_2 ;, ??? 9-ï áâப  - ¨¬ï ä ©« 
vROM_LOAD CFG_FILE_LINES.TRDOS_2 ;, ??? 10-ï áâப  - ¨¬ï ä ©« 
vROM_LOAD CFG_FILE_LINES.ZXEXP_2 ;, ??? 11-ï áâப  - ¨¬ï ä ©« 
LD HL,BUFFER_vROM_PAGES
LD A,(ZX_vROM_BLK)
LD (HL),A
LD BC,BIOS.ZX_MEMORY_MANAGER.SetCustomVroms
RST ToBIOS
;!TODO check error
XOR A
LD (vROM_LOAD_BIN.need_free),A
RET
;
vROM_LOAD_BIN: EX DE,HL
LD A,(HL)
CP ';'
EX DE,HL
JR Z,.skip_load
;
.go_load: LD A,(HL) ;BUFFER_RAM_PAGES.ROM
EXX
LD (HL),A
;INC HL
PUSH HL
EXX
PUSH HL
EX DE,HL
CALL READ_FILE_1 ; A - RAM page
POP HL
; LD A,(HL)
INC HL
;
EXX
POP HL
; LD (HL),A
EXX
;
LD A,SHARED_PAGE
OUT (SLOT3),A
JP C,ERROR_FILE
;
.skip_load: EXX
INC HL
EXX
RET
;
.need_free: DB 0
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
LOAD_IMAGE_FILE:
LD HL,(IMAGE_NAME)
LD A,H
OR L
RET Z
;
LD C,SLOT3
IN B,(C)
PUSH BC
;
CALL READ_IMAGE
;
POP BC
OUT (C),B
RET NC
JP ERROR_FILE
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;!TEST palette load
LOADING_PALETTE:
LD A,(PARAMS.LD_Pal+2)
INC A
RET NZ
;
LD HL,( ADDRESS_LINES + ((CFG_FILE_LINES.PALETTE-1)*2) )
LD A,(HL)
CP ';'
RET Z
;
LD DE,ONE_FILE
LD BC,FULL_FILE_NAME_LENGTH
LDIR
LD HL,ONE_FILE
;
LD A,Dss.Open.R
LD C,Dss.Open
RST ToDSS
JP C,ERROR_FILE ; ®è¨¡ª , ¥á«¨ ­¥â ä ©« 
LD (FILE_HANDLE),A
;
LD HL,PlaceForPalette
LD DE,1024*4 ;!HARDCODE
LD C,Dss.Read
RST ToDSS
JP C,ERROR_FILE ; ®è¨¡ª  ¯à¨ ç⥭¨¨
;!TEST ¯à®â¥áâ¨âì DSS ­  í⮬. …᫨ ä ©« 4096 ¨ ç¨â âì 4096, â® ¢ A ¡ã¤¥â #FF
;OR A
;JP NZ,ERROR_FILE
;
LD A,(FILE_HANDLE)
LD C,Dss.Close
JP ToDSS
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
SHOW_MESSAGE_OK_CFG_NAME:
; ä ©«ë áç¨â ­ë
LD HL,MSG_NORMAL
LD C,Dss.PChars
RST ToDSS
;
LD HL,(ADDRESS_LINES + (CFG_FILE_LINES.NAME-1)*2)
LD C,Dss.PChars
RST ToDSS
;
LD HL,CR_LINE
LD C,Dss.PChars
RST ToDSS
LD A,(SAVE_SLOT3)
OUT (SLOT3),A
RET
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
PARSE_PARAMETERS:; parameters parsing
LD A,SHARED_PAGE
OUT (SLOT3),A
LD HL,(ADDRESS_LINES + (CFG_FILE_LINES.OPTIONS-1)*2 ) ; áâப  ¯ à ¬¥â஢
.LOOP_1: LD A,(HL)
CP '/'
JR Z,.PARAM_TEST
OR A ; CP 0
;JR Z,INIT_vROM_PAGES
RET Z
CP "\r"
;JR Z,INIT_vROM_PAGES
RET Z
CP "\n"
;JR Z,INIT_vROM_PAGES
RET Z
INC HL
JR .LOOP_1
;
.PARAM_TEST: INC HL
PUSH HL
LD IX,PARAMS
.NEXT_PAR: LD E,(IX)
LD D,(IX+1)
.LOOP_2: LD A,(DE)
CP (HL)
JR NZ,.PARAM_E1
INC HL
INC DE
JR .LOOP_2
.PARAM_E1: CP #FF
JR NZ,.NO_PAR
LD A,(HL)
CP " "
JR Z,.PARAM_E2
CP 0
JR Z,.PARAM_E2
CP "\r"
JR Z,.PARAM_E2
.NO_PAR: POP HL
PUSH HL
INC IX
INC IX
INC IX
INC IX
LD A,(IX+1)
AND A
JR NZ,.NEXT_PAR
POP HL
JR .LOOP_1
;
.PARAM_E2: EX (SP),HL ; ­®¢®¥ HL - á®åà ­ï¥âáï!
LD A,(IX+3)
LD (IX+2),A ; parameter alternate!
LD L,(IX)
LD H,(IX+1)
LD C,Dss.PChars
RST ToDSS
;
POP HL
JR .LOOP_1
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;----------------[‚뤥«¥­¨¥/®á¢®¡®¦¤¥­¨¥ áâà ­¨æ ᯥªâà㬠]-------------;
;¢å®¤: ॣ B:
; FN 0x
; 0 - § à¥§¥à¢¨à®¢ ­®
; 1 - ¢ë¤¥«¥­¨¥ ¯ ¬ï⨠Pentagon 48k. 3 áâà ­¨æë
; 2 - ¢ë¤¥«¥­¨¥ ¯ ¬ï⨠Pentagon 128k. 2+6 áâà ­¨æë
; 3 - ¢ë¤¥«¥­¨¥ ¯ ¬ï⨠Pentagon 512k. 2+30 áâà ­¨æë
; 4 - ¢ë¤¥«¥­¨¥ ¯ ¬ï⨠Scorpion 256k. 2+6+8 áâà ­¨æë
; 5..15 - § à¥§¥à¢¨à®¢ ­ë
; FN 1x
; 16 - ¯®«ãç¨âì à ¬¡«®ª¨ ¨­¨æ¨ «¨§¨à®¢ ­­ëå vROM ¨ VRAM
; 17..31 - § à¥§¥à¢¨à®¢ ­ë
; FN 2x ;!TODO
; 32 - § à¥§¥à¢¨à®¢ ­®
; 33 - ¢ë¤¥«¥­¨¥ ¯ ¬ï⨠Spectrum 48k ¨ ¨­¨â 1-© áâà ­¨æ vROM
; 34 - ¢ë¤¥«¥­¨¥ ¯ ¬ï⨠Pentagon 128k ¨ ¨­¨â 3-å áâà ­¨æ vROM
; 35 - ¢ë¤¥«¥­¨¥ ¯ ¬ï⨠Pentagon 512k ¨ ¨­¨â 3-å áâà ­¨æ vROM
; 36 - ¢ë¤¥«¥­¨¥ ¯ ¬ï⨠Scorpion 256k ¨ ¨­¨â 3-å áâà ­¨æ vROM
; 33..63 - § à¥§¥à¢¨à®¢ ­ë
; FN 4x
; 64 - ®á¢®¡®¤¨âì à ¬¡«®ª¨ vROM ¨ vRAM
; 65..127 - § à¥§¥à¢¨à®¢ ­ë
; FN 8x
; 128 - ¨­¨æ¨ «¨§¨à®¢ âì ᢮© ­ ¡®à áâà ­¨æ vROM
;
; ॣ HL: ¯à¨ ॣ B[7]=1  ¤à¥á áâà ­¨æ (11 èâ):
; byte1 - RAM block ID, byte2..11 - áâà ­¨æë ¤«ï vROM - ZXSlot: 1,2,3(=0),à áè¨à¥­­ ï
; ॣ A: ­®¬¥à ZX TASK ¯®ª  çâ® ¢á¥£¤  ­®«ì!!!
;¢ë室: CF = 0: HL - ­®¬¥à  à ¬¡«®ª®¢ ¤«ï ०¨¬®¢ 0..16. H=vRAM, L=vROM
; CF = 1: A - ­®¬¥à ®è¨¡ª¨
;
;¥á«¨ áâíª ­ å®¤¨âáï ¢ âà¥â쥬 á«®â¥, â® ¢ë§®¢ á ¢ëª«î祭­ë¬¨ ¯à¥à뢠­¨ï¬¨
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
GET_vRAM_PAGES: CALL .check_params
LD C,BIOS.ZX_MEMORY_MANAGER
RST ToBIOS
RET C
LD (ZX_vRAM_BLK),A
RET
.check_params: XOR A
LD HL,PARAMS.P_7FFD + 2
LD DE,4
LD B,3
.loop: ADD A,(HL)
ADD HL,DE
DJNZ .loop
;
LD B,high BIOS.ZX_MEMORY_MANAGER.GetMem.Pent512
CP #80
RET NC
;
LD B,high BIOS.ZX_MEMORY_MANAGER.GetMem.Pent48
CP #70
RET NC
;
LD B,high BIOS.ZX_MEMORY_MANAGER.GetMem.Pent128
CP #40
RET NC
;
LD B,high BIOS.ZX_MEMORY_MANAGER.GetMem.Scorp
RET
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
COUNT_vROM_PAGES:
LD BC,10*256 + 0 ;!HARDCODE ¢á¥£® áâà ­¨æ vROM 10, áçñâ稪 - 0
LD HL,ADDRESS_LINES + CFG_FILE_LINES.BASIC128 - 1
LD A,';'
.loop: INC HL
LD E,(HL)
INC HL
LD D,(HL)
;
EX DE,HL
CP (HL)
EX DE,HL
JR Z,.next
INC C
.next: DJNZ .loop
LD A,C
LD (ZX_vROM_COUNT),A
SUB 1 ; ¥á«¨ 0 - â® ­¥ ¬¥­ï¥¬ ­ ¡®à
RET NC
; CHECK_ZX_FLAG
LD BC,SLOT3
IN B,(C)
LD A,Spec_Page
OUT (C),A
LD HL,(Spec_Page.flag_Z)
LD DE,'Z'+'X'*256
;
XOR A
SBC HL,DE
OUT (C),B
SCF ; ROM ä ©«®¢ 0, ¬¥âª  ZX ¥áâì
RET Z
JP ERROR_ZX_FLAG
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
; MACRO vROM_set dcp_port
; LD A,dcp_port
; CALL SET_DCP_PORT
; ENDM
; ;
; INIT_vROM_PAGES:
; LD HL,BUFFER_RAM_PAGES.ROM
; vROM_set ACEX.vROM.BASIC_128
; vROM_set ACEX.vROM.BASIC_48
; vROM_set ACEX.vROM.TR_DOS
; vROM_set ACEX.vROM.ZX_EXPANSION
; vROM_set ACEX.vROM.ZX_BIOS_1
; vROM_set ACEX.vROM.ZX_BIOS_2
; vROM_set ACEX.vROM.BASIC_128_2
; vROM_set ACEX.vROM.BASIC_48_2
; vROM_set ACEX.vROM.TR_DOS_2
; vROM_set ACEX.vROM.ZX_EXPANSION_2
; LD HL,(IMAGE_NAME)
; LD A,H
; OR L
; JP Z,.SKIP_IMAGE
; LD C,SLOT3
; IN B,(C)
; PUSH BC
; CALL READ_IMAGE
; POP BC
; OUT (C),B
; JP C,ERROR_FILE
; ;
; .SKIP_IMAGE: LD A,(PARAMS.No_run+2)
; AND A
; RET NZ
; ;
; LD HL,MSG_EXIT1
; LD BC,SLOT3
; IN B,(C)
; LD A,Spec_Page
; OUT (C),A
; ; !FIXIT ª®£¤  ¡ã¤¥â ¯à®æ¥¤ãà  ¢ ¡¨®á¥ ¯¥à¥¤¥« âì ¯®¤ ­¥ñ
; LD A,"Z"
; LD (Spec_Page.flag_Z),A
; LD A,"X"
; LD (Spec_Page.flag_X),A
; ;
; OUT (C),B
; ;
; SCF
; RET
; ;
; SET_DCP_PORT: LD B,(HL) ; page
; INC HL
; INC B
; DEC B
; RET Z
; ;
; PUSH HL
; CALL SET_ROM
; POP HL
; RET
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;
;----------------------------------------------------------------------;
INCLUDE 'For_4X.asm'
;----------------------------------------------------------------------;
;
;
;----------------------------------------------------------------------;
IF NEW_MEMORY_LOGIC
BUFFER_RAM_PAGES:
BLOCK 10,#FF ; !HARDCODE ª®«¨ç¥á⢮ ¯®à⮢ í¬ã«ïâ®à  <20>‡“
.Size EQU $-BUFFER_RAM_PAGES
BUFFER_vROM_PAGES:
.BlockID: BYTE 0
.Pages: BLOCK 10,#FF ; !HARDCODE ª®«¨ç¥á⢮ ¯®à⮢ í¬ã«ïâ®à  <20>‡“
.Size EQU $-BUFFER_RAM_PAGES
ELSE
BUFFER_RAM_PAGES:
.ROM: DB #42, #43, #44, #45, #46, #47
;.RAM: BLOCK 16 ; 256 ª¡
.Size EQU $-BUFFER_RAM_PAGES
.end_marker: BYTE #FF
ENDIF
;----------------------------------------------------------------------;
;
;----------------------------------------------------------------------;
LINE_ZX: DZ 'ZX Spectrum PAGES'
LEN_LINE_ZX EQU $-LINE_ZX
;*********************************************
MSG_EXIT1: DB 13,10, "EXIT without run",13,10,0
;MSG_EXIT2: DB 13,10, "‚ë室 ¡¥§ § ¯ã᪠"
CR_LINE: DB 13,10,0
START_MSG: DB 13,10, 'SPECTRUM launcher v',SP_VERSION,'.'
DB 13,10, '(c) Sprinter Team.'
DB 13,10, 'Written by Ivan Mak.'
DB 13,10, 'Modified by Anatoliy Belyanskiy.'
DB 13,10,BUILD_DATE,' - ',__TIME__,13,10,0
ERROR_FILE_MSG_X: DB 13,10, "Error in file: ",0
;ERROR_FILE2_MSG_X: DB 13,10, "Žè¨¡ª  ¢ ä ©«¥: ",0
ERROR_FILE_MSG: DB 13,10, "Unable to work.",0
;ERROR_FILE2_MSG: DB 13,10, "<22> ¡®â  ­¥¢®§¬®¦­ .",0
ERROR_CNF: DB 13,10, "Unexpected CNF file end.",0
;ERROR_CNF2: DB 13,10, "<22>¥®¦¨¤ ­­ë© ª®­¥æ CNF ä ©« .",0
NO_MEM_MSG: DB 13,10, "Not enough free memory pages for ZX mode."
DB 13,10, "Clear the memory and restart spectrum.exe again.",0
;NO_MEM_MSG2: DB 13,10, "‘¯¥æ¨ «ì­ë¥ áâà ­¨æë 㦥 § ­ïâë."
; DB 13,10, "Žç¨áâ¨â¥ ¯ ¬ïâì ¨ ¯¥à¥§ ¯ãáâ¨â¥ spectrum.exe á­®¢ .",0
MSG_NORMAL: DB 13,10, "All files has been read successfully.",13,10
DB "MODE: ",0
;MSG_NORMAL2: DB 13,10, "‚ᥠ䠩«ë áç¨â ­ë ­®à¬ «ì­®.",13,10
; DB "Š®­ä¨£ãà æ¨ï: ",0
MSG_NO_MEM: DB 13,10, "No memory space for image or",0
;MSG_NO_MEM2: DB 13,10, "<22>¥ 墠⠥⠯ ¬ï⨠¤«ï ®¡à §  ¨«¨",0
MSG_LOAD_IMAGE: DB 13,10, "Image loading: ",0
;MSG_LOAD_IMAGE2:
; DB 13,10, "‡ £à㧪  ®¡à § : ",0
MSG_ZX_EXIT: DB 13,10, "EXIT from Spectrum mode",13,10,0
;MSG_ZX_EXIT2: DB 13,10, "EXIT from ZX mode",0
MSG_NO_ZX_FLAG: DB 13,10, 'Error: Necessary ROM images are missing in the CNF file and in RAM!!!'
DB 13,10, ' Run "spectrum.exe norun.zx" with the required set of ZX ROMs.',13,10,0
MSG_OLD_DSS: DB 13,10, 'To run this version of SPECTRUM launcher you need DSS v1.70.998 or higher.',13,10,0
PROGRES_IND: DB '°',0 ; 176
PROGRES_100: DB ' 100%',13,10,0
ZX_vROM_COUNT: BYTE 0
ZX_vROM_BLK: BYTE 0
ZX_vRAM_BLK: BYTE 0
;
LINE_X: WORD 0
X_FILE: WORD 0
CNF_NAME: WORD 0
IMAGE_FLAG: BYTE 0 ; 0 - trd, scl - 1, sna - 2, tap - 3
IMAGE_NAME: WORD 0
IMAGE_HANDLER: BYTE 0
SAVE_SLOT3: BYTE 0
LEN_CNF: WORD 0
ADDRESS_LINES: BLOCK CFG_FILE_LINES*2,0
;*********************************************
;----------------------------------------------------------------------;
;
; …᫨ ¯ à ¬¥âà § ¤ ­, â® ¢ë¡¨à ¥âáï §­ ç¥­¨¥ Y
PARAMS:; Y / N ; âãâ §­ ç¥­¨ï ¤«ï ª«î祩 § ¯¨á뢠îâáï ª ª 16 ¡¨â §­ ç¥­¨¥, §­ ç¨â ®¡à â­ë© ¯®à冷ª ¡ ©â®¢
.Turbo: DW ._Turbo, #0302 ; ¢ª«îç¨âì TURBO
.Lines312 DW ._Lines312, #8000 ; ¢ª«îç¨âì 312 áâப
.Sprinter: DW ._Sprinter, #040C ; ¢ª«îç¨âì Sprinter
.P_7FFD: DW ._P_7FFD, #0030 ; ¢ª«îç¨âì 7FFD °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
.P_1FFD: DW ._P_1FFD, #0040 ; ¢ª«îç¨âì 1FFD °°­¥ ¬¥­ïâì ¯®à冷ª, ¨á¯®«ì§ã¥âáï ¢ GET_vRAM_PAGES°°
.Mem512: DW ._Mem512, #8000 ; ¢ª«îç¨âì 512k °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
.To_trd: DW ._To_trd, #0200 ; ¢o©â¨ ¢ TR-DOS
.Int_sc: DW ._Int_sc, #0102 ; ¢ª«îç¨âì INT "¯®-᪮௨®­®¢áª¨"
.Int_or: DW ._Int_or, #0300 ; ¢ª«îç¨âì INT "Original"
.No_run: DW ._no_run, #00FF ; ­¥ § ¯ã᪠âì
.Ret_zx: DW ._Ret_zx, #4100 ; ¢ª«îç¨âì ¢®§¢à â ¢ ZX áâà ­¨æ  (#41) ¤®«¦­  ᮢ¯ ¤ âì á ret_fn_
.Ret_fn: DW ._Ret_fn, #4100 ; ¢ª«îç¨âì ¢®§¢à â ¢ FN áâà ­¨æ  (#41) ¤®«¦­  ᮢ¯ ¤ âì á ret_zx_
.LD_Pal: DW ._LD_Pal, #FF00
.RMD_Keep: DW ._RMD_Keep, #FF00 ; [x] 05/11/2023 ®ç¨é âì à ¬¤¨áª¨ ¯à¨ ¢ë室¥
DW 0,0 ; end marker
;
._Turbo: DB "turbo", 255,0
._Lines312: DB "lines312", 255,0
._Sprinter: DB "sprinter", 255,0
._P_7FFD: DB "7FFD", 255,0
._P_1FFD: DB "1FFD", 255,0
._Mem512: DB "mem512", 255,0
._Int_sc: DB "int-sc", 255,0
._To_trd: DB "to-trdos", 255,0
._no_run: DB "no-run", 255,0
._Int_or: DB "origin", 255,0
._Ret_zx: DB "ret-zx", 255,0
._Ret_fn: DB "ret-fn", 255,0
._LD_Pal: DB "load-pal", 255,0
._RMD_Keep: DB "RMD-Keep", 255,0 ;!TEST; [ ] 05/11/2023 ®ç¨é âì à ¬¤¨áª¨ ¯à¨ ¢ë室¥
;ZX_PROG_LEN EQU $-RELOAD_PROG
;/Turbo /Lines312 /Sprinter /7FFD /1FFD /Mem512 /Int-Sc /To-TRDOS /no-run /origin /ret-zx /ret-fn
CNF_FILE: DB "SPECTRUM.CFG",0
.Size EQU $-CNF_FILE
;
;
;[]-----------------------------[PLUGINS]-----------------------------[]
INCLUDE 'trdscl.a80'
;
;----------------------------------------------[End Loader section]
;
;!TODO
;USER_CURRENT_DRV DB 'Z:'
;USER_CURRENT_DIR EQU $
;SPECTRUM_HOME_DIR EQU USER_CURRENT_DIR + 256
;
ONE_FILE: WORD 0
.Size EQU 256
TMP_BUFF EQU ONE_FILE + ONE_FILE.Size
.Size EQU 256
;
PlaceForPalette EQU TMP_BUFF + TMP_BUFF.Size ;#A000
PlaceForTXTscreen EQU PlaceForPalette + 1024*4 ;!HARDCODE
STACK_CHECK_MACRO stack_point,stack_buffer
; Code after Loader
;[]-------------------------------------------------------------------[]
; Code end section
;