; ; .----------------. .----------------. .----------------. .----------------. .----------------. .----------------. .----------------. .----------------. ; | .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. | ; | | _______ | || | ______ | || | _________ | || | ______ | || | _________ | || | _______ | || | _____ _____ | || | ____ ____ | | ; | | / ___ | | || | |_ __ \ | || | |_ ___ | | || | .' ___ | | || | | _ _ | | || | |_ __ \ | || ||_ _||_ _|| || ||_ \ / _|| | ; | | | (__ \_| | || | | |__) | | || | | |_ \_| | || | / .' \_| | || | |_/ | | \_| | || | | |__) | | || | | | | | | || | | \/ | | | ; | | '.___`-. | || | | ___/ | || | | _| _ | || | | | | || | | | | || | | __ / | || | | ' ' | | || | | |\ /| | | | ; | | |`\____) | | || | _| |_ | || | _| |___/ | | || | \ `.___.'\ | || | _| |_ | || | _| | \ \_ | || | \ `--' / | || | _| |_\/_| |_ | | ; | | |_______.' | || | |_____| | || | |_________| | || | `._____.' | || | |_____| | || | |____| |___| | || | `.__.' | || ||_____||_____|| | ; | | | || | | || | | || | | || | | || | | || | | || | | | ; | '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' | ; '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' ; /* 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 ;*************************************** ; DEFINE EXEinfoMACRO MACRO _mEXEinfo BLOCK 10,' ' ; ࠢ ᨢ ⮡ࠦ HEX BYTE 'Spectrum launcher' BYTE ' by Ivan Mak and ' BYTE ' Anatoliy ' BYTE ' Belyanskiy, ' BYTE ' Sprinter Team ' ENDM ; ; 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 JR C,.goodVers LD HL,DSS_MIN_VERS.build - 1 SBC HL,BC JR NC,ERROR_OLD_DSS ; ; .goodVers: 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 SHOW_MESSAGE_ZXMODE 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 ;!HARDCODE ப 㪠 ᪠ JR Z,.currentDisk ; LD C,Dss.CurDisk RST ToDSS JR C,.no_change_Disk JR .getInfoDRV ; .currentDisk: LD A,(ONE_FILE) SUB "A" ; .getInfoDRV: ; ࠨ 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_ZXMODE: LD HL,MSG_MODE 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 RET 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 ⢮ ⮢ .Size EQU $-BUFFER_RAM_PAGES BUFFER_vROM_PAGES: .BlockID: BYTE 0 .Pages: BLOCK 10,#FF ; !HARDCODE ⢮ ⮢ .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,'. (c) Sprinter Team.' DB 13,10,BUILD_DATE,' - ',__TIME__ DB 13,10, 'Keys: ',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, " .",0 ERROR_CNF: DB 13,10, "Unexpected CNF file end.",0 ;ERROR_CNF2: DB 13,10, " 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.\r\n",0 ;MSG_NORMAL2: DB 13,10, " 䠩 ⠭ ଠ쭮.\r\n\r\n",0 MSG_MODE: DB "\r\nMODE: ",0 ; DB "䨣: ",0 MSG_NO_MEM: DB 13,10, "No memory space for image or",0 ;MSG_NO_MEM2: DB 13,10, " 墠⠥ ࠧ ",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 v',NEED_MIN_DSS_VERSION,' 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 ;