Spectrum.EXE/spectrum.asm
Anatoliy Belyanskiy 5fed4f166d ...
2023-12-10 08:27:00 +10:00

1350 lines
29 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 ¯¥à¥¤ § ¯ã᪮¬ ᯥªâà㬠 ¨ ¢ ¯¥à¥å¢ â稪¥ à¥á¥â 
[x] - ¯®¤¤¥à¦ª  ­®¢ëå ®¡à §®¢ vROM
[x] - ¢ ª®­ä¨£¥ ¬®£ãâ ¡ëâì ¯à®¯ãé¥­ë ­¥ª®â®àë¥ vROM,®­¨ ­¥ § £à㦠îâáï
[x] - ¤®¡ ¢«¥­  ᮢ¬¥á⨬®áâì á ¤¥¬® ATARIN, ãᯮ«ì§ãî饥 ­¥¯®«­ãî ¤¥è¨äà æ¨î ¯®àâ  AY
[x] - ¯à®¢¥àïâì ¬¥âªã ZX,¥á«¨ ¬ë ­¥ £à㧨¬ 3 ®á­®¢­ëå vROM
;
Images
[+] - Load SCL image
[ ] - Load SNA file
[ ] - Load TAP image
;
Features
[+] - ᫨ ¢ë¡à ­® ret-zx,â® ¯à¨ ­ ¦ â¨¨ ­  ¯à®¡¥« áà §ã ¯®á«¥ CAD ¢¥à­ñâ ¢ DSS
[*] - Œ¥­ïâì ᯥªâà㬮¢áªãî ¯ «¨âàã
[ ] - 뤠¢ âì á®®¡é¥­¨ï ­  ï§ëª¥ ãáâ ­®¢«¥­­®¬ ¢ CMOS
[ ] - ¥á«¨ 㪠§ ­® ⮫쪮 ¨¬ï ®¡à §  IMAGE.TRD ¯à¨ § ¯ã᪥ ¨áª âì ¢ í⮩ ¦¥ ¯ ¯ª¥ IMAGE.ZX
¨ ⮫쪮 ¥á«¨ ¥£® ­¥â, â® £à㧨âì ¤¥ä®«â­ë© spectrum.cfg ¨§ ¯ ¯ª¨ á ¯à®£à ¬¬®©
*/
;
; 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 NEW_MEMORY_LOGIC 0
; 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 #BFFE
stack_buffer EQU 64
program_start EQU BEGIN
Loader_length EQU 0
;***************************************
;
;
; Program EQU section
;***************************************
FULL_FILE_NAME_LENGTH EQU 128 ; ¤«¨­  áâப¨ ¯ã⨠ª ä ©«ã
MAX_LINE_LENGTH EQU 120 ; ¤«¨­  áâப¨ CFG ä ©« 
;!TEST
;CFG_FILE_LINES EQU 8
CFG_FILE_LINES EQU 9
;
; NAME_CFG_LINE EQU 0
; BASIC128_LINE EQU 2
; BASIC_48_LINE EQU 4
; TRDOS_LINE EQU 6
; EXP_LINE EQU 8
; BIOS_LINE EQU 10
; BIOS2_LINE EQU 12
;XXX_LINE EQU ??
NAME_CFG_LINE EQU 1
BASIC128_LINE EQU 2
BASIC_48_LINE EQU 3
TRDOS_LINE EQU 4
EXP_LINE EQU 5
BIOS_LINE EQU 6
BIOS2_LINE EQU 7
OPTIONS_LINE EQU 8
PALETTE_LINE EQU 9
;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
IN A,(SLOT3)
LD (SAVE_SLOT3),A
;
;
IF NEW_MEMORY_LOGIC
LD BC,BUFFER_RAM_PAGES.Size * 256 + Dss.GetMem
RST ToDSS
JR C,Error_NoMemForSPpages
LD HL,BUFFER_RAM_PAGES
LD C,BIOS.GetMemBlkPages
RST ToBIOS
ENDIF
;
;!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
;
JP COMAND_LINE
Error_NoMemForSPpages:
LD HL,NO_MEM_MSG
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
.prn_msg: LD C,Dss.PChars
RST ToDSS
;
LD HL,ERROR_FILE_MSG
JP EXIT_ALL
ERROR_ZX_FLAG: LD HL,MSG_NO_ZX_FLAG
JP EXIT_ALL
END_CNF_ERROR:
LD HL,ERROR_CNF
;JP EXIT_ALL
EXIT_ALL: LD C,Dss.PChars
RST ToDSS
;---------------------[test!!!!!]-------
;ld a,(CurDisk_Save)
;ld c,Dss.ChDisk
;RST ToDSS
;jr nc,1f
;ld hl,ERROR_FILE2_MSG
;LD C,Dss.PChars
;RST ToDSS
;---------------------------------------
;!TODO
;LD HL,USER_CURRENT_DRV
;LD C,Dss.ChDir
;RST ToDSS
;
.loop: LD BC,Dss.Exit
RST ToDSS
JR .loop
;
COMAND_LINE: LD HL,(LINE_X)
LD A,(HL)
AND A
JR Z,NO_FIL
DEC A
JR Z,NO_FIL
INC HL
INC HL
CALL FIND_FILES
CALL MAKE_FULL_NAME
LD A,SHARED_PAGE
CALL READ_FILE_1
JP NC,CONTINUE
NO_FIL: CALL MAKE_FULL_NAME.def_cnf
LD A,SHARED_PAGE
CALL READ_FILE_1
JR C,ERROR_FILE
JP CONTINUE
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
FIND_T_LOOP: LD A,(HL)
INC HL
CP "."
CALL Z,POINT_F
CP ' '
CALL Z,BLANK_X
CP 9
CALL Z,BLANK_X
CP 10
CALL Z,BLANK_X1
CP 13
CALL Z,BLANK_X1
JR Z,END_NO_IMAGE
NO_NEXT: DJNZ FIND_T_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
;------------------------------------[v]
POINT_F: LD A,(HL)
CP 't'
JR Z,.TRD
CP 'T'
JR Z,.TRD
CP 's'
JR Z,.SCL
CP 'S'
JR Z,.SCL
CP 'z'
JR Z,.CNF
CP 'Z'
JR Z,.CNF
.exit: 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 .exit
.CNF: LD DE,(X_FILE)
LD (CNF_NAME),DE
JR .exit
;------------------------------------[^]
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,"The spesial pages are already used."
DB 13,10,"Clear 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 configuration",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
PROGRES_IND: DB '°',0 ; 176
;MEM_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
A_LINES: BLOCK CFG_FILE_LINES*2,0
;*********************************************
CONTINUE: LD (LEN_CNF),DE ; CNF ä ©« ¯à®ç¨â ­, DE - ¤«¨­  CNF
LD HL,#C000
LD DE,A_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 13
JR Z,N_LINE
CP 10
JR Z,N_LINE
AND A
JP Z,END_CNF_ERROR
INC HL
CP ';'
JR Z,N_LINE
DJNZ LOOP_L
N_LINE: LD (HL),0
INC HL
LD A,(HL)
CP 13
JR Z,N_LINE
CP 10
JR Z,N_LINE
DEC C
JR NZ,LOOP_A
; ¢ë¤¥«¥­® 8 áâப ¢ CNF
;*************************************
;!TODO ¥á«¨ ¯à®¯ã᪠¥¬ § £à㧪ã ROM ¤«ï 48, 128 ¨«¨ trdos, â® ¢áâ ¢«ïâì ¢ ¯®àâ vROM ­®¬¥à ¨§ áâ ­¤ àâ­®£® ¯¥à¢®£® ¡«®ª 
;!TEST
MACRO vROM_LOAD romLine;,pageNumber
.romLine = (romLine-1)*2
EX DE,HL
LD HL,(A_LINES+.romLine)
LD A,(HL)
CP ';'
EX DE,HL
JR NZ,.go_load
LD (HL),0
EX DE,HL
LD A,(NO_ZX_FLAG)
OR A
JR Z,.skip_load
JP ERROR_ZX_FLAG
.go_load:
LD A,(HL) ;BUFFER_RAM_PAGES.ROM
PUSH HL
EX DE,HL
CALL READ_FILE_1
POP DE
;
LD A,SHARED_PAGE
OUT (SLOT3),A
JP C,ERROR_FILE
.skip_load:
INC DE
EX DE,HL
ENDM
;
;!FIXIT ¢à¥¬¥­­ ï § ¯« âª 
CALL CHECK_ZX_FLAG
;
;LD BC,BUFFER_RAM_PAGES.ROM
LD HL,BUFFER_RAM_PAGES.ROM
vROM_LOAD BASIC128_LINE;, #42 ; 2-ï áâப  - ¨¬ï ä ©«  BASIC128
vROM_LOAD BASIC_48_LINE;, #43 ; 3-ï áâப  - ¨¬ï ä ©«  BASIC 48
vROM_LOAD TRDOS_LINE ;, #44 ; 4-ï áâப  - ¨¬ï ä ©«  TR-DOS
vROM_LOAD EXP_LINE ;, #45 ; 5-ï áâப  - ¨¬ï ä ©«  EXPANSION
vROM_LOAD BIOS_LINE ;, #46 ; 6-ï áâப  - ¨¬ï ä ©«  BIOS
vROM_LOAD BIOS2_LINE ;, #47 ; 7-ï áâப  - ¨¬ï ä ©«  BIOS2
;vROM_LOAD _LINE ;, #42 ; 8-ï áâப  - ¨¬ï ä ©« 
;vROM_LOAD _LINE ;, #42 ; 9-ï áâப  - ¨¬ï ä ©« 
;vROM_LOAD _LINE ;, #42 ; 10-ï áâப  - ¨¬ï ä ©« 
;vROM_LOAD _LINE ;, #42 ; 11-ï áâப  - ¨¬ï ä ©« 
;!TEST palette load
LOADING_PALETTE:
EX DE,HL
LD HL,( A_LINES + ((PALETTE_LINE-1)*2) )
LD A,(HL)
CP ';'
JR Z,.skip
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
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
RST ToDSS
.skip:
;
;!TODO ¯¥ç â âì ¨¬ï ä ©«  ¯ «¨âàë, ¥á«¨ ®­ § £à㦥­
; ä ©«ë áç¨â ­ë
;*************************************
LD HL,MSG_NORMAL
LD C,Dss.PChars
RST ToDSS
LD HL,(A_LINES + (NAME_CFG_LINE-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
;*************************************
LD A,SHARED_PAGE
OUT (SLOT3),A
LD HL,(A_LINES + (OPTIONS_LINE-1)*2 ) ; áâப  ¯ à ¬¥â஢
LOOP_PAR1: LD A,(HL)
CP "/"
JR Z,PARAM_TEST
CP 0
JR Z,PARAM_END
CP 13
JR Z,PARAM_END
CP 10
JR Z,PARAM_END
INC HL
JR LOOP_PAR1
PARAM_TEST: INC HL
PUSH HL
LD IX,PARAMS
NEXT_PAR: LD E,(IX)
LD D,(IX+1)
LOOP_PAR2: LD A,(DE)
CP (HL)
JR NZ,PARAM_E1
INC HL
INC DE
JR LOOP_PAR2
PARAM_E1: CP 255
JR NZ,NO_PAR
LD A,(HL)
CP 20h
JR Z,PARAM_E2
CP 0
JR Z,PARAM_E2
CP 13
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_PAR1
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_PAR1
;************************************
IF NEW_MEMORY_LOGIC
BUFFER_RAM_PAGES:
.ROM: BLOCK 10 ; ª®«¨ç¥á⢮ ¯®à⮢ í¬ã«ïâ®à  <20>‡“
.RAM: BLOCK 16 ; 256 ª¡
.Size EQU $-BUFFER_RAM_PAGES
.end_marker: BYTE #FF
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
MACRO vROM_set dcp_port
LD B,(HL) ; page
INC HL
XOR A
OR B
JR Z,.next
LD A,dcp_port ; ROM-ID
CALL SET_ROM
.next:
ENDM
PARAM_END: LD HL,BUFFER_RAM_PAGES.ROM
vROM_set #E2 ; ROM-ID - BASIC 128
vROM_set #E3 ; ROM-ID - BASIC 48
vROM_set #E1 ; ROM-ID - TR-DOS
vROM_set #E0 ; ROM-ID - EXPANSION
vROM_set #EB ; ROM-ID - BIOS-1
vROM_set #EF ; ROM-ID - BIOS-2
;vROM_set #E6 ; BASIC 128 - 2
;vROM_set #E7 ; BASIC 48 - 2
;vROM_set #E5 ; TR-DOS - 2
;vROM_set #E4 ; BIOS (ZX_EXP) - 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,(No_run_+2)
AND A
LD HL,MSG_EXIT1
JP NZ,SETUP_RAM_DRIVES
LD BC,SLOT3
IN B,(C)
LD A,Spec_Page
OUT (C),A
;
LD A,"Z"
LD (Spec_Page.flag_Z),A
LD A,"X"
LD (Spec_Page.flag_X),A
;
OUT (C),B
;
JP EXIT_ALL
;LD HL,MSG_NORMAL
;JP EXIT_ALL
;********************************************
;JP 0
;********************************************
; out B - old ROM-page
;!FIXIT ᤥ« âì ç¥à¥§ ¢ë§®¢ ä㭪樨 <20>ˆŽ
SET_ROM: DI
EX AF,AF'
IN A,(SLOT3)
PUSH AF
LD A,DCP_PAGE ; ãáâ ­®¢¨âì ­®¢ãî
OUT (SLOT3),A
LD A,(#C400) ; á®åà ­¨âì â® çâ® ¡ë«®
LD E,A
LD A,(#C600)
LD D,A
EX AF,AF' ; áâà ­¨æ 
LD (#C400),A ; ãáâ ­®¢¨âì ¯®àâ ROM
LD (#C600),A
EX AF,AF'
LD A,B
LD BC,0
EX AF,AF'
IN A,(C)
EX AF,AF'
OUT (C),A ; ãáâ ­®¢¨âì ­®¢ë© ROM
EX AF,AF'
LD B,A
LD A,E
LD (#C400),A ; ¢¥à­ãâì ¯®àâ
LD A,D
LD (#C600),A ; ¢¥à­ãâì ¯®àâ
POP AF
OUT (SLOT3),A
RET
;********************************************
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
LD A,(IMAGE_FLAG)
AND A
JR Z,.Load_TRD
CP 1 ; 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,CR_LINE ; loading
LD C,Dss.PChars
RST ToDSS
LD A,(IMAGE_HANDLER)
LD C,Dss.Close ; § ªàëâì ä ©«
RST ToDSS
RET C
;RET
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
;********************************************
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
;********************************************
;********************************************
EXIT_TO_DSS: DI
LD SP,#BFF0
LD A,CNF_PORT.CNF_0
OUT (SYS_PORT.OFF),A
LD A,(#FFF0) ;!HARDCODE
OUT (SLOT0),A
XOR A
LD BC,3*256+BIOS.SET_PAL_INIT ; SET IBM PAL
RST ToBIOS
LD A,Dss.SetVMod.txt80x32 ; OPEN_TXT
LD BC,0*256+Dss.SetVMod
RST ToDSS
;!TEST; [ ] 05/11/2023 ®ç¨é âì à ¬¤¨áª¨ ¯à¨ ¢ë室¥
LD A,(RMD_Keep_+2)
AND A
JR NZ,.next
; ®ç¨á⪠ à ¬¤¨áª®¢
LD BC,SYS_PAGE.RAMD_KEYS.NUM*256 + 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,#20
LD DE,0
LD HL,#2050
LD BC,7*256+Dss.Clear
RST ToDSS
LD HL,MSG_ZX_EXIT
JP EXIT_ALL
;********************************************
;!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
JR C,.set_block
; ®á¢®¡®¤¨âì à ¬¤¨áª
XOR A
LD C,BIOS.RAMD_CLEAR
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,(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 ; ¯à®£à ¬¬ë ¤«ï ¢®§¢à â 
IN A,(SLOT3)
LD (#FFF3),A ;
;********************************************
RESET_TO_ZX: DI
LD SP,#BFF0
LD A,high ZXKeys.Line_7
IN A,(ZXKeys)
AND #1F
CP #1E
JP Z,EXIT_TO_DSS
; ä¨ªá ­¥¯®«­®© ¤¥è¨äà æ¨¨ ¯®àâ  #FFFD (¯¨èãâ ¢ #C0FD)
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
;
;!TEST; [ ] 04/11/2023 Žâ¤¥«ì­ë¥ à ¬¤¨áª¨ ¤«ï ०¨¬  ᯥªâà㬠 ¨ DSS. BLK_TO_RAMD
LD BC,BIOS.SWAP_RAM_DRIVES.ZX
RST ToBIOS
;
LD A,(Ret_zx_+2)
LD B,A
LD A,(Ret_fn_+2)
XOR B
LD B,A
LD A,ACEX.RET_PORT
;!FIXIT ¯¥à¥¤¥« âì ¯®¤ äã­ªæ¨î ¡¨®á 
CALL SET_ROM ; ¢ª«îç¨âì ¢®§¢à â
LD A,CNF_PORT.CNF_3
OUT (SYS_PORT.ON),A ; System-page on & CNF = 3
XOR A
OUT (BorderColor),A ; border-0
OUT (RGADR),A ; Screen-page = 0
OUT (RGMOD),A ; Screen-mode-page = 0
LD BC,#1FFD
OUT (C),A ; Scorpion-port = 0
LD BC,#7FFD
OUT (C),A ; pentagon-port = 0
LD A,(Int_or_+2)
AND A
LD A,#FA ; original waits on
JR NZ,ORIG1
LD A,#FE
ORIG1: LD BC,Port_All_Mode
OUT (C),A ; ACC-Off
LD BC,CBL.SYS_PORT
XOR A
OUT (C),A ; CBL-off
LD A,BIOS.FN_TURBO.VG.OFF ; FDD-720
LD C,BIOS.FN_TURBO
RST ToBIOS_18
;---------------[test!!!!!]-------------
;!FIXIT à §à㫨âì ०¨¬ ᯥªâà㬠 ­  à ¡®âã á «î¡ë¬¨ ª ­ « ¬¨
XOR A ; --> IDE-1
LD C,BIOS.HDD_PART ; IDE-1/IDE-2
RST ToBIOS_18
;---------------------------------------
;******************************
LD A,(LD_Pal_+2)
INC A
JR NZ,SetDefaultPalette
;
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
JR SetDefaultPalette.skip
SetDefaultPalette:
XOR A
LD BC,2*256+BIOS.SET_PAL_INIT ; Set ZX-Palette
RST ToBIOS_18
.skip:
LD A,(Int_or_+2)
AND A ; 3
JR NZ,Original
LD A,(Int_sc_+2) ; 1/2
Original: LD C,BIOS.FN_SYNC ; -> INT for Pentagon or Scorpion
RST ToBIOS_18
LD HL,#4000 ; clear ZX-Spectrum screen
LD DE,#4001
LD BC,#1AFF
LD (HL),L
LDIR
LD HL,#4104 ; Screen-1
LD E,0
LD BC,4*256+BIOS.LP_OPEN_S
RST ToBIOS_18
LD HL,#5104 ; Screen-2
LD E,0
LD BC,4*256+BIOS.LP_OPEN_S
RST ToBIOS_18
XOR A
OUT (RGADR),A
OUT (RGMOD),A
;************************************************
; ˆ­¨æ¨ «¨§ æ¨ï áâà ­¨æ
;!FIXIT ç¥à¥§ äã­ªæ¨î ¡¨®á ¯®¯à®¡®¢ âì
DI
LD A,5
OUT (SLOT1),A
XOR A
OUT (SLOT0),A
LD BC,#1FFD
OUT (C),A ; #1FFD
LD B,#7F
LD A,8
LOOP_P1: DEC A
OUT (C),A ; #7FFD
OUT (SLOT3),A
JR NZ,LOOP_P1
LD B,#1F
LD A,#10
OUT (C),A ; #1FFD
LD B,#7F
LD A,8
LOOP_P2: OUT (C),A ; #7FFD
OUT (SLOT3),A
INC A
CP 16
JR NZ,LOOP_P2
XOR A
OUT (C),A ; #7FFD
LD B,#1F
OUT (C),A ; #1FFD
; ‚ᥠRAM, ªà®¬¥ BANK2 - ¢ ­¥© ¯à®£à ¬¬ !
;***********************************************
LD HL,PROG_STARTS
LD DE,PROG_STARTS.Launch ;!HARDCODE
LD BC,0*256 + PROG_STARTS.Length
LDIR
LD A,(Line312_+2)
OUT (Port_VSYNC),A
LD A,(P_7FFD_+2) ; - Pentagon off
LD BC,#7FFD
OUT (C),A
LD A,(Turbo__+2) ; 3 - turbo
LD HL,(Sprint_+2) ; +04h - Sprinter-ZX
ADD A,L ; +0Ch - Scorpion/Pentagon
LD HL,(P_1FFD_+2) ; +40h - Scorpion port off
ADD A,L
LD HL,(Mem512_+2) ; +80h - Pentagon-512 on
ADD A,L
LD E,A
LD A,(To_trd_+2)
LD D,A
;!TEST
IN A,(SLOT3)
LD C,A
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,E
LD (SYS_PAGE.CONFIG_DE),A
XOR A
LD (SYS_PAGE.CONFIG_DE+1),A
LD A,C
OUT (SLOT3),A
;
JP PROG_STARTS.Launch
;***************************************
PROG_STARTS:
.Launch: EQU #FF00
DISP .Launch
LD A,2
OUT (SLOT2),A
LD A,E
OUT (SYS_PORT.OFF),A
LD A,D
AND A
JP Z,0
LD A,#10
LD BC,#7FFD
OUT (C),A
LD HL,0
PUSH HL
JP #3D29 ; RESET to TR-DOS
ENT
;
.Length EQU $-PROG_STARTS
ASSERT PROG_STARTS.Length<#100,'PROG_STARTS too big!!!'
;
SET_PAL: LD DE,0
LD BC,#FF*256 + BIOS.PIC_SET_PAL
JP ToBIOS_18
;
;----------------------------------------------------------------------;
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
;----------------------------------------------------------------------;
;
;
;----------------------------------------------------------------------;
;!FIXIT ¢à¥¬¥­­ ï § ¯« âª 
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
AND A
SBC HL,DE
JR Z,.exit
; LD A,(Spec_Page.flag_Z)
; CP 'Z'
; JR NZ,.no_zx
; LD A,(Spec_Page.flag_X)
; CP 'X'
; JP Z,.exit
;
.no_zx: LD A,1
LD (NO_ZX_FLAG),A
.exit: OUT (C),B
RET
NO_ZX_FLAG DB 0
;----------------------------------------------------------------------;
;
; …᫨ ¯ à ¬¥âà § ¤ ­, â® ¢ë¡¨à ¥âáï §­ ç¥­¨¥ Y
PARAMS:; Y / N ; âãâ §­ ç¥­¨ï ¤«ï ª«î祩 § ¯¨á뢠îâáï ª ª 16 ¡¨â §­ ç¥­¨¥, §­ ç¨â ®¡à â­ë© ¯®à冷ª ¡ ©â®¢
Turbo__: DW Turbo_, #0302 ; ¢ª«îç¨âì TURBO
Line312_ DW Lines312, #6141 ; ¢ª«îç¨âì 312 áâப
Sprint_: DW Sprint, #040C ; ¢ª«îç¨âì Sprinter
P_7FFD_: DW P_7FFD, #0030 ; ¢ª«îç¨âì 7FFD
P_1FFD_: DW P_1FFD, #0040 ; ¢ª«îç¨âì 1FFD
Mem512_: DW Mem512, #8000 ; ¢ª«îç¨âì 512k
To_trd_: DW To_trd, #0100 ; ¢o©â¨ ¢ TR-DOS
Int_sc_: DW Int_sc, #0102 ; ¢ª«îç¨âì INT "¯®-᪮௨®­®¢áª¨"
No_run_: DW no_run, #00FF ; ­¥ § ¯ã᪠âì
Int_or_: DW Int_or, #0300 ; ¢ª«îç¨âì INT "Original"
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 ;!TEST; [ ] 05/11/2023 ®ç¨é âì à ¬¤¨áª¨ ¯à¨ ¢ë室¥
DW 0,0 ; end marker
Turbo_: DB "turbo", 255,0
Lines312: DB "lines312", 255,0
Sprint: 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
ONE_FILE: BLOCK FULL_FILE_NAME_LENGTH,0
;
;!TODO
;USER_CURRENT_DRV DB 'Z:'
;USER_CURRENT_DIR EQU $
;SPECTRUM_HOME_DIR EQU USER_CURRENT_DIR + 256
;
;
;
;
;----------------------------------------------[End Loader section]
;
PlaceForPalette EQU #A000
STACK_CHECK_MACRO stack_point,stack_buffer
; Code after Loader
;[]-----------------------------[PLUGINS]-----------------------------[]
INCLUDE 'trdscl.a80'
;[]-------------------------------------------------------------------[]
; Code end section
; OUTEND
; SAVEBIN 'Build/test.bin', exe_header, $-exe_header
;