; ; .----------------. .----------------. .----------------. .----------------. .----------------. .----------------. .----------------. .----------------. ; | .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. | ; | | _______ | || | ______ | || | _________ | || | ______ | || | _________ | || | _______ | || | _____ _____ | || | ____ ____ | | ; | | / ___ | | || | |_ __ \ | || | |_ ___ | | || | .' ___ | | || | | _ _ | | || | |_ __ \ | || ||_ _||_ _|| || ||_ \ / _|| | ; | | | (__ \_| | || | | |__) | | || | | |_ \_| | || | / .' \_| | || | |_/ | | \_| | || | | |__) | | || | | | | | | || | | \/ | | | ; | | '.___`-. | || | | ___/ | || | | _| _ | || | | | | || | | | | || | | __ / | || | | ' ' | | || | | |\ /| | | | ; | | |`\____) | | || | _| |_ | || | _| |___/ | | || | \ `.___.'\ | || | _| |_ | || | _| | \ \_ | || | \ `--' / | || | _| |_\/_| |_ | | ; | | |_______.' | || | |_____| | || | |_________| | || | `._____.' | || | |_____| | || | |____| |___| | || | `.__.' | || ||_____||_____|| | ; | | | || | | || | | || | | || | | || | | || | | || | | | ; | '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' | ; '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' ; /* 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 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 ;*************************************** ; ; ; 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 䠩 ;!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 ; ; JR PARSE_CMD_LINE CALL PARSE_CMD_LINE CALL READ_CNF_FILE CALL SETUP_ZX ; JP NC,PREPARE_TO_ZXMODE JP EXIT_ALL ;; ;; 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 EXIT_ALL: LD C,Dss.PChars RST ToDSS ; .loop: LD BC,Dss.Exit RST ToDSS JR .loop ; ;; ;; ; out B - old ROM-page SET_ROM: DI LD C,BIOS.SET_PORTS JP ToBIOS ; 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 ;; ;; ; ⥭ ࠧ TRD/SCL ࠬࠩ READ_IMAGE: LD DE,ONE_FILE LD BC,FULL_FILE_NAME_LENGTH LDIR LD HL,ONE_FILE LD A,Dss.Open.R LD C,Dss.Open RST ToDSS RET C LD (IMAGE_HANDLER),A ; [x] 31/01/2024 প ४祭 ᪠/ࠧ TR-DOS LD HL,ONE_FILE LD BC,Dss.EX_Path.GET_ALL RST ToDSS JR C,.no_change_Disk AND 8 JR Z,.currentDisk ; LD C,Dss.CurDisk RST ToDSS JR C,.no_change_Disk JR .getInfoDRV ; .currentDisk: LD A,(ONE_FILE) SUB "A" ; .getInfoDRV: ; ࠨ 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 ७ ;; ;; RESTORE_PORT_HOLD: ;!FIXIT ᤥ १ API BIOS LD D,CMOS_CELL.ScreenPosition LD C,BIOS.CMOS_RD RST ToBIOS RET C LD B,A LD A,ACEX.HOLD LD C,BIOS.SET_PORTS JP ToBIOS ; ; ; FIRST_PREPARE: LD A,CNF_PORT.CNF_0 OUT (SYS_PORT.RAM),A CALL RESTORE_PORT_HOLD 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,(#FFF0) ;!HARDCODE OUT (SLOT0),A LD A,(#FFF3) ;!HARDCODE OUT (SLOT3),A XOR A LD BC,3*256+BIOS.SET_PAL_INIT ; SET IBM PAL RST ToBIOS ;!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,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,(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 ; ; 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,(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,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 A,CNF_PORT.CNF_3 OUT (SYS_PORT.ROM),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 ;[ ] 1/02/2024 ० ᯥ㬠 ࠡ⠥ 묨 ᭮묨 ࠧ CALL SET_CURRENT_HDD ; ; 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 ; #1FFD LD BC,#1FFD XOR A OUT (SLOT0),A OUT (C),A ; #7FFD LD B,#7F LD A,8 LOOP_P1: DEC A OUT (C),A OUT (SLOT3),A JR NZ,LOOP_P1 ; #1FFD LD B,#1F LD A,#10 OUT (C),A ; #7FFD LD B,#7F LD A,8 LOOP_P2: OUT (C),A OUT (SLOT3),A INC A CP 16 JR NZ,LOOP_P2 ; XOR A OUT (C),A ; #1FFD LD B,#1F OUT (C),A ; ; 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.RAM),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 ;; ;; 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 C,.NO_FILE ; .exit: LD (LEN_CNF),DE ; CNF 䠩 ⠭, DE - CNF RET ; .NO_FILE: CALL MAKE_FULL_NAME.def_cnf LD A,SHARED_PAGE CALL READ_FILE_1 JP C,ERROR_FILE JR .exit ;; ;; 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,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 "\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 ;; ;; ;!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 ; ; SETUP_ZX: ;LOAD_ZXROMS: ;!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- ப - 䠩 LOADING_PALETTE:;!TEST palette load 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 ;!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 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 ; PARSE_PARAMETERS:; parameters parsing LD A,SHARED_PAGE OUT (SLOT3),A LD HL,(A_LINES + (OPTIONS_LINE-1)*2 ) ; ப ࠬ஢ .LOOP_1: LD A,(HL) CP '/' JR Z,.PARAM_TEST CP 0 JR Z,.PARAM_END ;RET Z CP "\r" JR Z,.PARAM_END ;RET Z CP "\n" JR Z,.PARAM_END ;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 ; MACRO vROM_set dcp_port LD A,dcp_port CALL SET_DCP_PORT ENDM .PARAM_END: LD HL,BUFFER_RAM_PAGES.ROM vROM_set ACEX.vROM.BASIC_128 ; ROM-ID - BASIC 128 vROM_set ACEX.vROM.BASIC_48 ; ROM-ID - BASIC 48 vROM_set ACEX.vROM.TR_DOS ; ROM-ID - TR-DOS vROM_set ACEX.vROM.BIOS ; ROM-ID - EXPANSION vROM_set ACEX.vROM.BIOS_3 ; ROM-ID - BIOS-1 vROM_set ACEX.vROM.BIOS_4 ; ROM-ID - BIOS-2 ;vROM_set ACEX.vROM.BASIC_128_2 ; BASIC 128 - 2 ;vROM_set ACEX.vROM.BASIC_48_2 ; BASIC 48 - 2 ;vROM_set ACEX.vROM.TR_DOS_2 ; TR-DOS - 2 ;vROM_set ACEX.vROM.BIOS_2 ; 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 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 ;; ;; ;!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 ;; ; ;----------------------------------------------------------------------; INCLUDE 'For_4X.asm' ;----------------------------------------------------------------------; ; ; ;----------------------------------------------------------------------; IF NEW_MEMORY_LOGIC BUFFER_RAM_PAGES: .ROM: BLOCK 6 ; ⢮ ⮢ .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 ;----------------------------------------------------------------------; ; ;----------------------------------------------------------------------; 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, " .",0 ERROR_CNF: DB 13,10, "Unexpected CNF file end.",0 ;ERROR_CNF2: DB 13,10, " 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, " 墠⠥ ࠧ ",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 PROGRES_IND: DB '',0 ; 176 PROGRES_100: DB ' 100%',13,10,0 ;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 ;********************************************* ;----------------------------------------------------------------------; ; ; ᫨ ࠬ , 롨ࠥ 祭 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 ; [x] 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 ; ; ;[]-----------------------------[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 ;