Spectrum.EXE/spectrum.asm
Anatoliy Belyanskiy bd2abb6229 Initial commit
2023-06-15 02:20:40 +10:00

1177 lines
22 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.

/*
.----------------. .----------------. .----------------. .----------------. .----------------. .----------------. .----------------. .----------------.
| .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. |
| | _______ | || | ______ | || | _________ | || | ______ | || | _________ | || | _______ | || | _____ _____ | || | ____ ____ | |
| | / ___ | | || | |_ __ \ | || | |_ ___ | | || | .' ___ | | || | | _ _ | | || | |_ __ \ | || ||_ _||_ _|| || ||_ \ / _|| |
| | | (__ \_| | || | | |__) | | || | | |_ \_| | || | / .' \_| | || | |_/ | | \_| | || | | |__) | | || | | | | | | || | | \/ | | |
| | '.___`-. | || | | ___/ | || | | _| _ | || | | | | || | | | | || | | __ / | || | | ' ' | | || | | |\ /| | | |
| | |`\____) | | || | _| |_ | || | _| |___/ | | || | \ `.___.'\ | || | _| |_ | || | _| | \ \_ | || | \ `--' / | || | _| |_\/_| |_ | |
| | |_______.' | || | |_____| | || | |_________| | || | `._____.' | || | |_____| | || | |____| |___| | || | `.__.' | || ||_____||_____|| |
| | | || | | || | | || | | || | | || | | || | | || | | |
| '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' |
'----------------' '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' '----------------'
*/
/*
To do:
SYS:
[ ] - § ¤ ¢ âì CONFIG_DE ¯¥à¥¤ § ¯ã᪮¬ ᯥªâà㬠 ¨ ¢ ¯¥à¥å¢ â稪¥ à¥á¥â 
images:
[+] - Load SCL image
[ ] - Load TAP image
[ ] - Load SNA file
;
features:
[ ] - 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
;***************************************
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
OPTIONS_LINE EQU 14
;***************************************
;
;
; 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,5Ch
RST ToDSS
IN A,(SLOT3)
LD (SAVE_SLOT3),A
JP COMAND_LINE
ERROR_FILE:
LD HL,ERROR_FILE_MSG_X
LD C,5Ch
RST ToDSS
LD HL,ONE_FILE
LD C,5Ch
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: DB "ZX Spectrum PAGES",0
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: WORD 0,0,0,0,0,0,0,0
;*********************************************
CONTINUE: ; CNF ä ©« ¯à®ç¨â ­, DE - ¤«¨­  CNF
LD (LEN_CNF),DE
LD HL,#C000
LD DE,A_LINES
LD C,8
LOOP_A:
LD B,120 ; áâப¨ ­¥ ¡®«¥¥ 120 ᨬ¢®«®¢
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
CP 0
JP Z,END_CNF_ERROR
INC HL
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
;*************************************
LD HL,(A_LINES+BASIC128_LINE) ; 2-ï áâப  - ¨¬ï ä ©«  BASIC128
LD A,#42
CALL READ_FILE_1
LD A,Spec_Page
OUT (SLOT3),A
JP C,ERROR_FILE
LD HL,(A_LINES+BASIC_48_LINE) ; 3-ï áâப  - ¨¬ï ä ©«  BASIC 48
LD A,#43
CALL READ_FILE_1
LD A,Spec_Page
OUT (SLOT3),A
JP C,ERROR_FILE
LD HL,(A_LINES+TRDOS_LINE) ; 4-ï áâப  - ¨¬ï ä ©«  TR-DOS
LD A,#44
CALL READ_FILE_1
LD A,Spec_Page
OUT (SLOT3),A
JP C,ERROR_FILE
LD HL,(A_LINES+EXP_LINE) ; 5-ï áâப  - ¨¬ï ä ©«  EXPANSION
LD A,#45
CALL READ_FILE_1
LD A,Spec_Page
OUT (SLOT3),A
JP C,ERROR_FILE
LD HL,(A_LINES+BIOS_LINE) ; 6-ï áâப  - ¨¬ï ä ©«  BIOS
LD A,#46
CALL READ_FILE_1
LD A,Spec_Page
OUT (SLOT3),A
JP C,ERROR_FILE
LD HL,(A_LINES+BIOS2_LINE) ; 7-ï áâப  - ¨¬ï ä ©«  BIOS2
LD A,#47
CALL READ_FILE_1
LD A,Spec_Page
OUT (SLOT3),A
JP C,ERROR_FILE
; ä ©«ë áç¨â ­ë
;*************************************
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
;************************************
PARAM_END:
LD A,#E2 ; ROM-ID - BASIC 128
LD B,#42 ; page
CALL SET_ROM
LD A,#E3 ; ROM-ID - BASIC 48
LD B,#43 ; page
CALL SET_ROM
LD A,#E1 ; ROM-ID - TR-DOS
LD B,#44 ; page
CALL SET_ROM
LD A,#E0 ; ROM-ID - EXPANSION
LD B,#45 ; page
CALL SET_ROM
LD A,#EB ; ROM-ID - BIOS-1
LD B,#46 ; page
CALL SET_ROM
LD A,#EF ; ROM-ID - BIOS-2
LD B,#47 ; page
CALL SET_ROM
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
;********************************************
SET_ROM:
; out B - old ROM-page
DI
; PUSH BC
; PUSH AF
; LD A,CNF_0
; OUT (SYS_PORT.ON),A
; LD A,10h
; LD BC,7FFDh
; OUT (C),A
; POP AF
; POP BC
; LD C,0F8h
; CALL 3D13h
; PUSH BC
; PUSH AF
; LD A,0
; LD BC,7FFDh
; OUT (C),A
; LD A,CNF_0
; OUT (SYS_PORT.OFF),A
;
; POP AF
; POP BC
; RET
EX AF,AF'
IN A,(SLOT3)
PUSH AF
LD A,DCP_PAGE ; ãáâ ­®¢¨âì ­®¢ãî
OUT (SLOT3),A
LD A,(#C400) ; á®åà ­¨âì â® çâ® ¡ë«®
LD L,A
LD A,(#C600)
LD H,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,L
LD (#C400),A ; ¢¥à­ãâì ¯®àâ
LD A,H
LD (#C600),A ; ¢¥à­ãâì ¯®àâ
POP AF
OUT (SLOT3),A
RET
;********************************************
READ_IMAGE:
LD DE,ONE_FILE
LD BC,128
LDIR
LD HL,ONE_FILE
LD A,1
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 C,Dss.Move_FP
LD B,2
LD HL,0
LD IX,0
RST ToDSS ; ­ ©â¨ ¤«¨­ã ä ©« 
RET C
PUSH IX
POP DE
;--------------[new_code]---------------
call Get_RAM_Disk_E
ret c
jp Load_IMAGE_File
;---------------------------------------
Get_RAM_Disk_E:
; hl:de - à §¬¥à ä ©«  ¢ ¡ ©â å
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
.skip_inc: ; HL - ¤«¨­  ä ©«  ¢ áâà ­¨æ å
LD A,H
AND A
JR NZ,ERROR_NO_MEM
LD A,L
AND A
JR Z,ERROR_NO_MEM
PUSH AF
;***************************************
; ®á¢®¡®¤¨âì ram-disk e:
.free_disk:
DI
LD A,0
LD C,BIOS.EMM_FN3
RST ToBIOS ; ®á¢®¡®¤¨âì e:
;!!!!!!!!!!!!!!!!!!!!!! ; ­ §­ ç âì ¤à㣮© à ¬¤à ©¢, ᢮¡®¤­ë©?
;***************************************
POP AF
LD B,A ; § ¯à®á¨âì ¯ ¬ïâì ã bios- 
LD A,0
LD C,BIOS.EMM_FN2 ; ¨ ¯®¤á®¥¤¨­¨âì ª e:
RST ToBIOS
JR C,ERROR_NO_MEM
LD (MEM_BLK),A
;--------------[new_code]---------------
ret
;---------------------------------------
Load_IMAGE_File:
LD A,(IMAGE_HANDLER)
LD C,Dss.Move_FP
LD B,0
LD HL,0
LD IX,0
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
LD A,0
LD B,0
LD C,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,128
LDIR
LD HL,ONE_FILE
OUT (SLOT3),A
READ_FILE:
LD A,1
LD C,Dss.Open
RST ToDSS
RET C ; ®è¨¡ª , ¥á«¨ ­¥â ä ©« 
LD (FILE_HANDLE),A
LD A,(FILE_HANDLE)
LD HL,0C000h
LD DE,4000h
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_0
OUT (SYS_PORT.OFF),A
ld a,(#FFF0)
out (SLOT0),a
LD B,3 ; IBM_PAL
LD A,0
LD C,#A6 ; SET_standard_PAL
RST ToBIOS
LD A,3 ; OPEN_TXT
LD B,0
LD C,#50
RST ToDSS
LD C,#56 ; CLS
LD DE,0
LD HL,#2050
LD B,7
LD A,#20
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_0
OUT (SYS_PORT.ON),A ; System-page on & CNF = 0
;-------------[TEST ATARIN]-------------
; #c0fd - +#05ED
; ä¨ªá ­¥¯®«­®© ¤¥è¨äà æ¨¨ ¯®àâ  #FFFD (¯¨èãâ ¢ #C0FD)
; [x] ¤®¡ ¢«¥­ ¯®àâ #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,Conf_port.RET_PORT
CALL SET_ROM ; ¢ª«îç¨âì ¢®§¢à â
LD A,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,1FFDh
OUT (C),A ; Scorpion-port = 0
LD BC,7FFDh
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
LD A,0
OUT (C),A ; CBL-off
LD A,#12 ; FDD-720
LD C,BIOS.FN_TURBO
RST #18
;---------------[test!!!!!]-------------
LD C,BIOS.HDD_PART ; IDE-1/IDE-2
LD A,0 ; --> IDE-1
RST #18
;---------------------------------------
;******************************
XOR A ; Set ZX-Palette
LD B,2
LD C,#A6
RST 18h
LD A,(Int_or_+2)
AND A ; 3
JR NZ,Original
LD A,(Int_sc_+2) ; 1/2
Original:
LD C,#F2 ; -> INT for Pentagon or Scorpion
RST #18
LD HL,#4000 ; clear ZX-Spectrum screen
LD DE,#4001
LD BC,#1AFF
LD (HL),L
LDIR
LD HL,#4104 ; Screen-1
LD BC,#0480
LD E,0
RST #18
LD HL,#5104 ; Screen-2
LD BC,#0480
LD E,0
RST #18
XOR A
OUT (RGADR),A
OUT (RGMOD),A
;************************************************
; ˆ­¨æ¨ «¨§ æ¨ï áâà ­¨æ
DI
LD A,0
OUT (SLOT0),A
LD A,5
OUT (SLOT1),A
XOR A
LD BC,#1FFD
OUT (C),A ; #1FFD
LD B,#7F
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 A,8
LD B,#7F
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 ;!!!!!!!!!!
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
;
JP #FF00 ;!!!!!!!!!!
;***************************************
PROG_STARTS:
LD A,2
OUT (SLOT2),A
LD A,E
OUT (SYS_PORT.OFF),A ; System-port
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: ds 128
;
;
;
;
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
;