Spectrum.EXE/spectrum.asm
Anatoliy Belyanskiy af64d9cff3 ...
2023-09-11 01:46:09 +10:00

1127 lines
24 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
[+] - § ¤ ¢ âì CONFIG_DE ¯¥à¥¤ § ¯ã᪮¬ ᯥªâà㬠 ¨ ¢ ¯¥à¥å¢ â稪¥ à¥á¥â 
[+] - ¯®¤¤¥à¦ª  ­®¢ëå ®¡à §®¢ vROM
[+] - ¤®¡ ¢«¥­  ᮢ¬¥á⨬®áâì á ¤¥¬® ATARIN, ãᯮ«ì§ãî饥 ­¥¯®«­ãî ¤¥è¨äà æ¨î ¯®àâ  AY
[ ] - ¯à®¢¥àïâì ¬¥âªã ZX,¥á«¨ ¬ë ­¥ £à㧨¬ 3 ®á­®¢­ëå vROM
[ ] - ¢ ª®­ä¨£¥ ¬®£ãâ ¡ëâì ¯à®¯ãé¥­ë ­¥ª®â®àë¥ vROM,®­¨ ­¥ § £à㦠îâáï
;
Images
[+] - Load SCL image
[ ] - Load TAP image
[ ] - Load SNA file
;
Features
[+] - ᫨ ¢ë¡à ­® ret-zx,â® ¯à¨ ­ ¦ â¨¨ ­  ¯à®¡¥« áà §ã ¯®á«¥ CAD ¢¥à­ñâ ¢ DSS
[ ] - When image filename exist,then instead of SPECTRUM.CFG loads image_filename.cfg if exist too
[ ] - 뤠¢ âì á®®¡é¥­¨ï ­  ï§ëª¥ ãáâ ­®¢«¥­­®¬ ¢ 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 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
;***************************************
;
;
; Program EQU section
;***************************************
FULL_FILE_NAME_LENGTH EQU 128 ; ¤«¨­  áâப¨ ¯ã⨠ª ä ©«ã
MAX_LINE_LENGTH EQU 120 ; ¤«¨­  áâப¨ CFG ä ©« 
CFG_FILE_LINES EQU 8
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 ??
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
;!TEST
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
;
ELSE
ENDIF
JP COMAND_LINE
Error_NoMemForSPpages:
LD HL,NO_MEM_MSG2
JR ERROR_FILE.prn_msg
ERROR_FILE:
LD HL,ERROR_FILE_MSG_X
LD C,Dss.PChars
RST ToDSS
LD HL,ONE_FILE
.prn_msg: LD C,Dss.PChars
RST ToDSS
LD HL,ERROR_FILE_MSG
JP EXIT_ALL
END_CNF_ERROR:
LD HL,ERROR_CNF
;JP EXIT_ALL
EXIT_ALL:
; PUSH HL
;---------------------[test!!!!!]-------
;LD A,0
;LD C,BIOS.EMM_FN3
;RST ToBIOS ; ®á¢®¡®¤¨âì e:
;LD A,(SAVE_SLOT3)
;OUT (SLOT3),A
;---------------------------------------
;POP HL
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
;---------------------------------------
1: LD BC,Dss.Exit
RST ToDSS
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
LD HL,(CNF_NAME)
LD A,Spec_Page
CALL READ_FILE_1
JP NC,CONTINUE
NO_FIL: LD HL,CNF_FILE
LD A,Spec_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 20h
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
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
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
JP .skip_load
.go_load:
LD A,(HL) ;BUFFER_RAM_PAGES.ROM
PUSH HL
EX DE,HL
CALL READ_FILE_1
POP DE
;
LD A,Spec_Page
OUT (SLOT3),A
JP C,ERROR_FILE
.skip_load:
INC DE
EX DE,HL
ENDM
;
;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-ï áâப  - ¨¬ï ä ©« 
; ä ©«ë áç¨â ­ë
;*************************************
LD HL,MSG_NORMAL
LD C,Dss.PChars
RST ToDSS
LD HL,(A_LINES+NAME_CFG_LINE)
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,Spec_Page
OUT (SLOT3),A
LD HL,(A_LINES+OPTIONS_LINE) ; áâப  ¯ à ¬¥â஢
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 Z,EXIT_ALL
JP SET_RELOAD_PROG
;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 B,Dss.Move_FP.FrEnd
LD HL,0
LD IX,0
LD C,Dss.Move_FP
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 3Fh
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
;***************************************
;!FIXIT ¡¥§®¯ á­® § ­¨¬ âì à ¬¤¨áª¨, ç⮡ ¯®«ì§®¢ â¥«ì ­¥ áâà ¤ «
; ®á¢®¡®¤¨âì ram-disk e:
.free_disk: DI
XOR A ; RAM-Drive E:
LD C,BIOS.FreeMemRMD
RST ToBIOS ; ®á¢®¡®¤¨âì e:
POP AF
LD B,A ; § ¯à®á¨âì ¯ ¬ïâì ã bios- 
XOR A ; RAM-Drive E:
LD C,BIOS.GetMemRMD ; ¨ ¯®¤á®¥¤¨­¨âì ª e:
RST ToBIOS
JR C,ERROR_NO_MEM
LD (MEM_BLK),A
RET
;---------------------------------------
Load_IMAGE_File:
LD A,(IMAGE_HANDLER)
LD HL,0
LD IX,0
LD BC,Dss.Move_FP.FrStart*256+Dss.Move_FP
RST ToDSS ; ãáâ ­®¢¨âì 㪠§ â¥«ì ­  0
RET C
LD HL,MSG_LOAD_IMAGE ; loading image
LD C,Dss.PChars
RST ToDSS
LD A,(MEM_BLK)
.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
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
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
JR Z,EXIT_TO_DSS
;LD A,CNF_PORT.CNF_3
;OUT (SYS_PORT.ON),A ; System-page on & CNF = 0
;-------------[TEST ATARIN]-------------
; #c0fd - +#05ED
; ä¨ªá ­¥¯®«­®© ¤¥è¨äà æ¨¨ ¯®àâ  #FFFD (¯¨èãâ ¢ #C0FD)
; ¤®¡ ¢«¥­ ¯®àâ #C0FD ¢® ¢á¥ ª àâë ¯®à⮢
LD BC,SLOT3
IN B,(C)
LD A,DCP_PAGE
OUT (C),A
; !HARDCODE ¤ «¥¥ ¢áñ ­ áª®àïª ¨ § å à¤ª®¦¥­®
; !TODO ¯¥à¥¤¥« âì ¯®¤ ­®¢ãî äã­ªæ¨î ¤¥è¨äà æ¨¨
LD A,#90 ; AY-8910-port (FFFD)
LD HL,#C000+#05ED ; CNF 0
LD (HL),A
LD H,#C0+#15 ; CNF 1
LD (HL),A
LD H,#C0+#25 ; CNF 2
LD (HL),A
LD H,#C0+#35 ; CNF 3
LD (HL),A
OUT (C),B
;---------------------------------------
LD A,(Ret_zx_+2)
LD B,A
LD A,(Ret_fn_+2)
XOR B
LD B,A
LD A,ACEX.RET_PORT
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
;---------------------------------------
;******************************
XOR A
LD BC,2*256+BIOS.SET_PAL_INIT ; Set ZX-Palette
RST ToBIOS_18
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
;!TEST
LD A,8
LOOP_P1: DEC A
OUT (C),A ; #7FFD
OUT (SLOT3),A
JR NZ,LOOP_P1
;OUT (C),A ; #7FFD
;OUT (SLOT3),A
;INC A
;CP 8
;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 BC,PROG_STARTS.Length
LD DE,#FF00 ;!HARDCODE
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 #FF00 ;!HARDCODE
;***************************************
PROG_STARTS: 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
.Length EQU $-PROG_STARTS
ASSERT PROG_STARTS.Length<#100,'PROG_STARTS too big!!!'
;
;
; …᫨ ¯ à ¬¥âà § ¤ ­, â® ¢ë¡¨à ¥âáï §­ ç¥­¨¥ 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_
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
;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
ONE_FILE: BLOCK FULL_FILE_NAME_LENGTH,0
;
;
;
;
IFDEF NEED_LOADER
Loader_length EQU $-BEGIN
ELSE
Loader_length EQU 0
ENDIF
;----------------------------------------------[End Loader section]
;
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
;