; ; .----------------. .----------------. .----------------. .----------------. .----------------. .----------------. .----------------. .----------------. ; | .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. | ; | | _______ | || | ______ | || | _________ | || | ______ | || | _________ | || | _______ | || | _____ _____ | || | ____ ____ | | ; | | / ___ | | || | |_ __ \ | || | |_ ___ | | || | .' ___ | | || | | _ _ | | || | |_ __ \ | || ||_ _||_ _|| || ||_ \ / _|| | ; | | | (__ \_| | || | | |__) | | || | | |_ \_| | || | / .' \_| | || | |_/ | | \_| | || | | |__) | | || | | | | | | || | | \/ | | | ; | | '.___`-. | || | | ___/ | || | | _| _ | || | | | | || | | | | || | | __ / | || | | ' ' | | || | | |\ /| | | | ; | | |`\____) | | || | _| |_ | || | _| |___/ | | || | \ `.___.'\ | || | _| |_ | || | _| | \ \_ | || | \ `--' / | || | _| |_\/_| |_ | | ; | | |_______.' | || | |_____| | || | |_________| | || | `._____.' | || | |_____| | || | |____| |___| | || | `.__.' | || ||_____||_____|| | ; | | | || | | || | | || | | || | | || | | || | | || | | | ; | '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' | ; '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' ; /* SYS [x] - задавать CONFIG_DE перед запуском спектрума и в перехватчике ресета [x] - поддержка новых образов vROM [x] - в конфиге могут быть пропущены некоторые vROM,они не загружаются [x] - добавлена совместимость с демо ATARIN, успользующее неполную дешифрацию порта AY [x] - проверять метку ZX,если мы не грузим 3 основных vROM ; Images [+] - Load SCL image [ ] - Load SNA file [ ] - Load TAP image ; Features [+] - Если выбрано ret-zx,то при нажатии на пробел сразу после CAD вернёт в DSS [*] - Менять спектрумовскую палитру [ ] - Выдавать сообщения на языке установленном в CMOS [ ] - если указано только имя образа IMAGE.TRD при запуске искать в этой же папке IMAGE.ZX и только если его нет, то грузить дефолтный spectrum.cfg из папки с программой */ ; ; Compilation parameters ;*************************************** DEVICE SPRINTER ; MMU 2 e, 0 ; нулевая страница в банку 2 и проверка на границы ; OUTPUT './Build/new.bin' ;*************************************** ; ; Defines section ;*************************************** IFNDEF DEBUG : DEFINE DEBUG 0 : ENDIF IFNDEF EMULATOR 0 : DEFINE EMULATOR 0 : ENDIF DEFINE EXE_HEADER 1 DEFINE NEW_MEMORY_LOGIC 0 ; define NEED_LOADER 1 ; define NeedSafePort_Y 0 ;*************************************** ; ; ; Included constants section ;*************************************** INCLUDE 'Shared_Includes/constants/sp2000.inc' INCLUDE 'Shared_Includes/constants/dss_equ.inc' INCLUDE 'Shared_Includes/constants/BIOS_equ.inc' ;*************************************** ; ; ; Included macroses section ;*************************************** INCLUDE 'Shared_Includes/macroses/macros.z80' INCLUDE 'Shared_Includes/macroses/accelerator.z80' ;*************************************** ; ; Included LUA section ;*************************************** INCLUDELUA ;*************************************** ; ; ; Standart EQU section ;*************************************** org_addr EQU #8000+CLP_Buffer code_addr EQU BEGIN stack_point EQU #BFFE stack_buffer EQU 64 program_start EQU BEGIN Loader_length EQU 0 ;*************************************** ; ; ; Program EQU section ;*************************************** FULL_FILE_NAME_LENGTH EQU 128 ; длина строки пути к файлу MAX_LINE_LENGTH EQU 120 ; длина строки CFG файла ;!TEST ;CFG_FILE_LINES EQU 8 CFG_FILE_LINES EQU 9 ; ; NAME_CFG_LINE EQU 0 ; BASIC128_LINE EQU 2 ; BASIC_48_LINE EQU 4 ; TRDOS_LINE EQU 6 ; EXP_LINE EQU 8 ; BIOS_LINE EQU 10 ; BIOS2_LINE EQU 12 ;XXX_LINE EQU ?? NAME_CFG_LINE EQU 1 BASIC128_LINE EQU 2 BASIC_48_LINE EQU 3 TRDOS_LINE EQU 4 EXP_LINE EQU 5 BIOS_LINE EQU 6 BIOS2_LINE EQU 7 OPTIONS_LINE EQU 8 PALETTE_LINE EQU 9 ;OPTIONS_LINE EQU (CFG_FILE_LINES-1)*2 ;*************************************** ; ; ; Program EQU section ;*************************************** INCLUDE 'version.inc' ;*************************************** ; ; ; Code start section ;[]-------------------------------------------------------------------[] IF EXE_HEADER INCLUDE 'Shared_Includes/constants/EXE_Header.z80' ORG org_addr ELSE ORG org_addr-CLP_Buffer ENDIF BEGIN: LD (LINE_X),IX LD HL,START_MSG LD C,Dss.PChars RST ToDSS IN A,(SLOT3) LD (SAVE_SLOT3),A ; ; IF NEW_MEMORY_LOGIC LD BC,BUFFER_RAM_PAGES.Size * 256 + Dss.GetMem RST ToDSS JR C,Error_NoMemForSPpages LD HL,BUFFER_RAM_PAGES LD C,BIOS.GetMemBlkPages RST ToBIOS ENDIF ; ;!TODO ;LD HL,SPECTRUM_HOME_DIR ;LD BC,Dss.AppInfo.EXE_HomeDir ;RST ToDSS ;; ;LD C,Dss.CurDisk ;RST ToDSS ;ADD A,'A' ;LD (USER_CURRENT_DRV),A ;; ;LD HL,USER_CURRENT_DIR ;LD C,Dss.CurDir ;RST ToDSS ; JP COMAND_LINE Error_NoMemForSPpages: LD HL,NO_MEM_MSG JR ERROR_FILE.prn_msg ERROR_FILE: LD HL,ERROR_FILE_MSG_X LD C,Dss.PChars RST ToDSS ; LD A,(FILE_HANDLE) LD C,Dss.Close RST ToDSS ; LD HL,ONE_FILE .prn_msg: LD C,Dss.PChars RST ToDSS ; LD HL,ERROR_FILE_MSG JP EXIT_ALL ERROR_ZX_FLAG: LD HL,MSG_NO_ZX_FLAG JP EXIT_ALL END_CNF_ERROR: LD HL,ERROR_CNF ;JP EXIT_ALL EXIT_ALL: LD C,Dss.PChars RST ToDSS ;---------------------[test!!!!!]------- ;ld a,(CurDisk_Save) ;ld c,Dss.ChDisk ;RST ToDSS ;jr nc,1f ;ld hl,ERROR_FILE2_MSG ;LD C,Dss.PChars ;RST ToDSS ;--------------------------------------- ;!TODO ;LD HL,USER_CURRENT_DRV ;LD C,Dss.ChDir ;RST ToDSS ; .loop: LD BC,Dss.Exit RST ToDSS JR .loop ; COMAND_LINE: LD HL,(LINE_X) LD A,(HL) AND A JR Z,NO_FIL DEC A JR Z,NO_FIL INC HL INC HL CALL FIND_FILES CALL MAKE_FULL_NAME LD A,SHARED_PAGE CALL READ_FILE_1 JP NC,CONTINUE NO_FIL: CALL MAKE_FULL_NAME.def_cnf LD A,SHARED_PAGE CALL READ_FILE_1 JR C,ERROR_FILE JP CONTINUE FIND_FILES: PUSH HL LD (X_FILE),HL LD DE,0 LD (IMAGE_FLAG),DE LD (IMAGE_NAME),DE LD (CNF_NAME),DE LD B,A JR NO_NEXT FIND_T_LOOP: LD A,(HL) INC HL CP "." CALL Z,POINT_F CP ' ' CALL Z,BLANK_X CP 9 CALL Z,BLANK_X CP 10 CALL Z,BLANK_X1 CP 13 CALL Z,BLANK_X1 JR Z,END_NO_IMAGE NO_NEXT: DJNZ FIND_T_LOOP END_NO_IMAGE: POP HL LD A,(CNF_NAME+1) AND A RET NZ LD A,(IMAGE_NAME+1) AND A LD DE,(X_FILE) JR Z,CNF_ALL LD DE,CNF_FILE CNF_ALL: LD (CNF_NAME),DE RET BLANK_X: LD (X_FILE),HL ; найден пробел, имя файла - снова BLANK_X1: DEC HL LD (HL),0 INC HL RET ;------------------------------------[v] POINT_F: LD A,(HL) CP 't' JR Z,.TRD CP 'T' JR Z,.TRD CP 's' JR Z,.SCL CP 'S' JR Z,.SCL CP 'z' JR Z,.CNF CP 'Z' JR Z,.CNF .exit: DEC HL LD A,(HL) INC HL RET .SCL: LD DE,IMAGE_FLAG LD A,1 LD (DE),A .TRD: LD DE,(X_FILE) LD (IMAGE_NAME),DE JR .exit .CNF: LD DE,(X_FILE) LD (CNF_NAME),DE JR .exit ;------------------------------------[^] LINE_ZX: DZ 'ZX Spectrum PAGES' LEN_LINE_ZX EQU $-LINE_ZX ;********************************************* MSG_EXIT1: DB 13,10,"EXIT without run",13,10,0 ;MSG_EXIT2: DB 13,10,"Выход без запуска" CR_LINE: DB 13,10,0 START_MSG: DB 13,10,'SPECTRUM launcher v',SP_VERSION,'.' DB 13,10,'(c) Sprinter Team.' DB 13,10,'Written by Ivan Mak.' DB 13,10,'Modified by Anatoliy Belyanskiy.' DB 13,10,BUILD_DATE,' - ',__TIME__,13,10,0 ERROR_FILE_MSG_X: DB 13,10,"Error in file: ",0 ;ERROR_FILE2_MSG_X: ; DB 13,10,"Ошибка в файле: ",0 ERROR_FILE_MSG: DB 13,10,"Unable to work.",0 ;ERROR_FILE2_MSG: ; DB 13,10,"Работа невозможна.",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 configuration",0 MSG_ZX_EXIT2: DB 13,10,"EXIT from ZX mode",0 MSG_NO_ZX_FLAG: DB 13,10,'Error: Necessary ROM images are missing in the CNF file and in RAM!!!' DB 13,10,' Run "spectrum.exe norun.zx" with the required set of ZX ROMs.',13,10,0 PROGRES_IND: DB '░',0 ; 176 ;MEM_BLK: BYTE 0 LINE_X: WORD 0 X_FILE: WORD 0 CNF_NAME: WORD 0 IMAGE_FLAG: BYTE 0 ; 0 - trd, scl - 1, sna - 2, tap - 3 IMAGE_NAME: WORD 0 IMAGE_HANDLER: BYTE 0 SAVE_SLOT3: BYTE 0 LEN_CNF: WORD 0 A_LINES: BLOCK CFG_FILE_LINES*2,0 ;********************************************* CONTINUE: LD (LEN_CNF),DE ; CNF файл прочитан, DE - длина CNF LD HL,#C000 LD DE,A_LINES LD C,CFG_FILE_LINES LOOP_A: LD B,MAX_LINE_LENGTH ; длина строки EX DE,HL LD (HL),E INC HL LD (HL),D INC HL EX DE,HL LOOP_L: LD A,(HL) CP 13 JR Z,N_LINE CP 10 JR Z,N_LINE AND A JP Z,END_CNF_ERROR INC HL CP ';' JR Z,N_LINE DJNZ LOOP_L N_LINE: LD (HL),0 INC HL LD A,(HL) CP 13 JR Z,N_LINE CP 10 JR Z,N_LINE DEC C JR NZ,LOOP_A ; выделено 8 строк в CNF ;************************************* ;!TODO если пропускаем загрузку ROM для 48, 128 или trdos, то вставлять в порт vROM номер из стандартного первого блока ;!TEST MACRO vROM_LOAD romLine;,pageNumber .romLine = (romLine-1)*2 EX DE,HL LD HL,(A_LINES+.romLine) LD A,(HL) CP ';' EX DE,HL JR NZ,.go_load LD (HL),0 EX DE,HL LD A,(NO_ZX_FLAG) OR A JR Z,.skip_load JP ERROR_ZX_FLAG .go_load: LD A,(HL) ;BUFFER_RAM_PAGES.ROM PUSH HL EX DE,HL CALL READ_FILE_1 POP DE ; LD A,SHARED_PAGE OUT (SLOT3),A JP C,ERROR_FILE .skip_load: INC DE EX DE,HL ENDM ; ;!FIXIT временная заплатка CALL CHECK_ZX_FLAG ; ;LD BC,BUFFER_RAM_PAGES.ROM LD HL,BUFFER_RAM_PAGES.ROM vROM_LOAD BASIC128_LINE;, #42 ; 2-я строка - имя файла BASIC128 vROM_LOAD BASIC_48_LINE;, #43 ; 3-я строка - имя файла BASIC 48 vROM_LOAD TRDOS_LINE ;, #44 ; 4-я строка - имя файла TR-DOS vROM_LOAD EXP_LINE ;, #45 ; 5-я строка - имя файла EXPANSION vROM_LOAD BIOS_LINE ;, #46 ; 6-я строка - имя файла BIOS vROM_LOAD BIOS2_LINE ;, #47 ; 7-я строка - имя файла BIOS2 ;vROM_LOAD _LINE ;, #42 ; 8-я строка - имя файла ;vROM_LOAD _LINE ;, #42 ; 9-я строка - имя файла ;vROM_LOAD _LINE ;, #42 ; 10-я строка - имя файла ;vROM_LOAD _LINE ;, #42 ; 11-я строка - имя файла ;!TEST palette load LOADING_PALETTE: EX DE,HL LD HL,( A_LINES + ((PALETTE_LINE-1)*2) ) LD A,(HL) CP ';' JR Z,.skip LD DE,ONE_FILE LD BC,FULL_FILE_NAME_LENGTH LDIR LD HL,ONE_FILE LD A,Dss.Open.R LD C,Dss.Open RST ToDSS JP C,ERROR_FILE ; ошибка, если нет файла LD (FILE_HANDLE),A LD HL,PlaceForPalette LD DE,1024*4 LD C,Dss.Read RST ToDSS JP C,ERROR_FILE ; ошибка при чтении ;!TEST протестить DSS на этом. Если файл 4096 и читать 4096, то в A будет #FF ;OR A ;JP NZ,ERROR_FILE ; LD A,(FILE_HANDLE) LD C,Dss.Close RST ToDSS .skip: ; ;!TODO печатать имя файла палитры, если он загружен ; файлы считаны ;************************************* LD HL,MSG_NORMAL LD C,Dss.PChars RST ToDSS LD HL,(A_LINES + (NAME_CFG_LINE-1)*2 ) LD C,Dss.PChars RST ToDSS LD HL,CR_LINE LD C,Dss.PChars RST ToDSS ;LD A,(SAVE_SLOT3) ;OUT (SLOT3),A ;************************************* LD A,SHARED_PAGE OUT (SLOT3),A LD HL,(A_LINES + (OPTIONS_LINE-1)*2 ) ; строка параметров LOOP_PAR1: LD A,(HL) CP "/" JR Z,PARAM_TEST CP 0 JR Z,PARAM_END CP 13 JR Z,PARAM_END CP 10 JR Z,PARAM_END INC HL JR LOOP_PAR1 PARAM_TEST: INC HL PUSH HL LD IX,PARAMS NEXT_PAR: LD E,(IX) LD D,(IX+1) LOOP_PAR2: LD A,(DE) CP (HL) JR NZ,PARAM_E1 INC HL INC DE JR LOOP_PAR2 PARAM_E1: CP 255 JR NZ,NO_PAR LD A,(HL) CP 20h JR Z,PARAM_E2 CP 0 JR Z,PARAM_E2 CP 13 JR Z,PARAM_E2 NO_PAR: POP HL PUSH HL INC IX INC IX INC IX INC IX LD A,(IX+1) AND A JR NZ,NEXT_PAR POP HL JR LOOP_PAR1 PARAM_E2: EX (SP),HL ; новое HL - сохраняется! LD A,(IX+3) LD (IX+2),A ; parameter alternate! LD L,(IX) LD H,(IX+1) LD C,Dss.PChars RST ToDSS POP HL JR LOOP_PAR1 ;************************************ IF NEW_MEMORY_LOGIC BUFFER_RAM_PAGES: .ROM: BLOCK 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 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 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 LD HL,MSG_EXIT1 JP NZ,SETUP_RAM_DRIVES LD BC,SLOT3 IN B,(C) LD A,Spec_Page OUT (C),A ; LD A,"Z" LD (Spec_Page.flag_Z),A LD A,"X" LD (Spec_Page.flag_X),A ; OUT (C),B ; JP EXIT_ALL ;LD HL,MSG_NORMAL ;JP EXIT_ALL ;******************************************** ;JP 0 ;******************************************** ; out B - old ROM-page ;!FIXIT сделать через вызов функции БИОС SET_ROM: DI EX AF,AF' IN A,(SLOT3) PUSH AF LD A,DCP_PAGE ; установить новую OUT (SLOT3),A LD A,(#C400) ; сохранить то что было LD E,A LD A,(#C600) LD D,A EX AF,AF' ; страница LD (#C400),A ; установить порт ROM LD (#C600),A EX AF,AF' LD A,B LD BC,0 EX AF,AF' IN A,(C) EX AF,AF' OUT (C),A ; установить новый ROM EX AF,AF' LD B,A LD A,E LD (#C400),A ; вернуть порт LD A,D LD (#C600),A ; вернуть порт POP AF OUT (SLOT3),A RET ;******************************************** READ_IMAGE: LD DE,ONE_FILE LD BC,FULL_FILE_NAME_LENGTH LDIR LD HL,ONE_FILE LD A,Dss.Open.R LD C,Dss.Open RST ToDSS RET C LD (IMAGE_HANDLER),A LD A,(IMAGE_FLAG) AND A JR Z,.Load_TRD CP 1 ; check if SCL JP Z,Load_SCL ;jp Error_Flag ;!!!!!!!!!!!!!!!! .Load_TRD: LD A,(IMAGE_HANDLER) LD HL,0 LD IX,0 LD BC,Dss.Move_FP.FrEnd RST ToDSS ; найти длину файла RET C PUSH IX POP DE CALL Get_RAM_Disk_E RET C JP Load_IMAGE_File ; hl:de - размер файла в байтах Get_RAM_Disk_E: LD A,D ADD A,A ADC HL,HL ADD A,A ADC HL,HL LD A,D AND #3F OR E JR Z,.skip_inc INC HL ;HL - длина файла в страницах .skip_inc: LD A,H AND A JR NZ,ERROR_NO_MEM LD A,L AND A JR Z,ERROR_NO_MEM PUSH AF ;*************************************** ; [x] 04/11/2023 Отдельные рамдиски для режима спектрума и DSS .free_disk: DI ;!TEST ;XOR A ; RAM-Drive E: ;LD C,BIOS.FreeMemRMD ;RST ToBIOS ; освободить e: ; POP BC ;!TEST ;LD B,A ; запросить память у bios-а ;XOR A ; RAM-Drive E: ;LD C,BIOS.GetMemRMD ; и подсоединить к e: LD C,BIOS.GetMem ; RST ToBIOS JR C,ERROR_NO_MEM LD (Load_IMAGE_File.MEM_BLK),A RET ;--------------------------------------- Load_IMAGE_File: LD A,(IMAGE_HANDLER) LD HL,0 LD IX,0 LD BC,Dss.Move_FP.FrStart RST ToDSS ; установить указатель на 0 RET C LD HL,MSG_LOAD_IMAGE ; loading image LD C,Dss.PChars RST ToDSS .MEM_BLK+1: LD A,0 .load_loop: PUSH AF OUT (SLOT3),A LD A,(IMAGE_HANDLER) LD HL,#C000 ; грузить 16k LD DE,#4000 LD C,Dss.Read RST ToDSS JR C,ERROR_IN_READ LD HL,PROGRES_IND ; loading progress LD C,Dss.PChars RST ToDSS DI POP AF .scl_read_next: LD C,BIOS.GetMemPageNext RST ToBIOS CP #FF JR NZ,.load_loop LD HL,CR_LINE ; loading LD C,Dss.PChars RST ToDSS LD A,(IMAGE_HANDLER) LD C,Dss.Close ; закрыть файл RST ToDSS RET C ;RET Set_RAM_Dsk_EtoA: DI XOR A LD BC,0*256+BIOS.RAMD_TO_DRV ; назначить e: на a: RST ToBIOS AND A RET ERROR_IN_READ: POP AF JR ERROR_IMAGE_X ERROR_NO_MEM: LD HL,MSG_NO_MEM LD C,Dss.PChars RST ToDSS ERROR_IMAGE_X: LD A,(IMAGE_HANDLER) LD C,Dss.Close ; закрыть файл RST ToDSS SCF RET SAV_PG3X: DB 0 ;******************************************** READ_FILE_1: LD DE,ONE_FILE LD BC,FULL_FILE_NAME_LENGTH LDIR LD HL,ONE_FILE OUT (SLOT3),A READ_FILE: LD A,Dss.Open.R LD C,Dss.Open RST ToDSS RET C ; ошибка, если нет файла LD (FILE_HANDLE),A LD A,(FILE_HANDLE) LD HL,#C000 LD DE,#4000 LD C,Dss.Read RST ToDSS RET C ; ошибка при чтении PUSH DE LD A,(FILE_HANDLE) LD C,Dss.Close RST ToDSS POP DE ; длина считанных данных RET ; ошибка при закрытии или Ok FILE_HANDLE: DB 0 ;******************************************** ;******************************************** EXIT_TO_DSS: DI LD SP,#BFF0 LD A,CNF_PORT.CNF_0 OUT (SYS_PORT.OFF),A LD A,(#FFF0) ;!HARDCODE OUT (SLOT0),A XOR A LD BC,3*256+BIOS.SET_PAL_INIT ; SET IBM PAL RST ToBIOS LD A,Dss.SetVMod.txt80x32 ; OPEN_TXT LD BC,0*256+Dss.SetVMod RST ToDSS ;!TEST; [ ] 05/11/2023 очищать рамдиски при выходе LD A,(RMD_Keep_+2) AND A JR NZ,.next ; очистка рамдисков LD BC,SYS_PAGE.RAMD_KEYS.NUM*256 + BIOS.FreeMemRMD .loop: PUSH BC LD A,B DEC A RST ToBIOS POP BC DJNZ .loop ; .next: ;!TEST; [ ] 04/11/2023 Отдельные рамдиски для режима спектрума и DSS. BLK_TO_RAMD LD BC,BIOS.SWAP_RAM_DRIVES.Sp2000 RST ToBIOS ; LD A,#20 LD DE,0 LD HL,#2050 LD BC,7*256+Dss.Clear RST ToDSS LD HL,MSG_ZX_EXIT JP EXIT_ALL ;******************************************** ;!TEST; [ ] 04/11/2023 Отдельные рамдиски для режима спектрума и DSS. BLK_TO_RAMD SETUP_RAM_DRIVES: LD BC,BIOS.SWAP_RAM_DRIVES.ZX RST ToBIOS ; запуск с файлом для рамдиска? LD A,(Load_IMAGE_File.MEM_BLK) OR A JR Z,.skip ; проверяем драйв перед переназначением XOR A LD C,BIOS.GET_RAMD_ST RST ToBIOS JR C,.set_block ; освободить рамдиск XOR A LD C,BIOS.RAMD_CLEAR RST ToBIOS ; set disk e: .set_block: LD A,(Load_IMAGE_File.MEM_BLK) LD B,A XOR A LD C,BIOS.BLK_TO_RAMD RST ToBIOS .skip: ; ;******************************************** ;!FIXIT переделать на функцию биоса SET_RELOAD_PROG: DI LD A,Spec_Page OUT (SLOT3),A LD A,"Z" LD (#FFFE),A LD A,"X" LD (#FFFF),A LD A,(Ret_fn_+2) AND A LD DE,RESET_TO_ZX ; адрес программы перезапуска для ret-zx JR Z,NO_RET_FN LD DE,EXIT_TO_DSS ; адрес программы перезапуска для ret-fn ; NO_RET_FN: LD (#FFF4),DE ; адрес программы возврата IN A,(SLOT0) LD (#FFF0),A ; DOS-PAGE IN A,(SLOT1) LD (#FFF1),A IN A,(SLOT2) ; сохранить страницу LD (#FFF2),A ; программы для возврата IN A,(SLOT3) LD (#FFF3),A ; ;******************************************** RESET_TO_ZX: DI LD SP,#BFF0 LD A,high ZXKeys.Line_7 IN A,(ZXKeys) AND #1F CP #1E JP Z,EXIT_TO_DSS ; фикс неполной дешифрации порта #FFFD (пишут в #C0FD) LD A,#FF LD HL,%00'010'1'1110'1101 LD DE,%10'111'1'1111'1111 ; CNF_0, CNF_1 LD BC,ACEX.AY_FFFD_WRITE*256 + BIOS.DCP_CONFIG RST ToBIOS ; ;!TEST; [ ] 04/11/2023 Отдельные рамдиски для режима спектрума и DSS. BLK_TO_RAMD LD BC,BIOS.SWAP_RAM_DRIVES.ZX RST ToBIOS ; LD A,(Ret_zx_+2) LD B,A LD A,(Ret_fn_+2) XOR B LD B,A LD A,ACEX.RET_PORT ;!FIXIT переделать под функцию биоса CALL SET_ROM ; включить возврат LD A,CNF_PORT.CNF_3 OUT (SYS_PORT.ON),A ; System-page on & CNF = 3 XOR A OUT (BorderColor),A ; border-0 OUT (RGADR),A ; Screen-page = 0 OUT (RGMOD),A ; Screen-mode-page = 0 LD BC,#1FFD OUT (C),A ; Scorpion-port = 0 LD BC,#7FFD OUT (C),A ; pentagon-port = 0 LD A,(Int_or_+2) AND A LD A,#FA ; original waits on JR NZ,ORIG1 LD A,#FE ORIG1: LD BC,Port_All_Mode OUT (C),A ; ACC-Off LD BC,CBL.SYS_PORT XOR A OUT (C),A ; CBL-off LD A,BIOS.FN_TURBO.VG.OFF ; FDD-720 LD C,BIOS.FN_TURBO RST ToBIOS_18 ;---------------[test!!!!!]------------- ;!FIXIT разрулить режим спектрума на работу с любыми каналами XOR A ; --> IDE-1 LD C,BIOS.HDD_PART ; IDE-1/IDE-2 RST ToBIOS_18 ;--------------------------------------- ;****************************** LD A,(LD_Pal_+2) INC A JR NZ,SetDefaultPalette ; LD HL,PlaceForPalette + 0 LD A,4 CALL SET_PAL ; LD HL,PlaceForPalette + 1024 LD A,5 CALL SET_PAL ; LD HL,PlaceForPalette + 2048 LD A,6 CALL SET_PAL ; LD HL,PlaceForPalette + 3072 LD A,7 CALL SET_PAL JR SetDefaultPalette.skip SetDefaultPalette: XOR A LD BC,2*256+BIOS.SET_PAL_INIT ; Set ZX-Palette RST ToBIOS_18 .skip: LD A,(Int_or_+2) AND A ; 3 JR NZ,Original LD A,(Int_sc_+2) ; 1/2 Original: LD C,BIOS.FN_SYNC ; -> INT for Pentagon or Scorpion RST ToBIOS_18 LD HL,#4000 ; clear ZX-Spectrum screen LD DE,#4001 LD BC,#1AFF LD (HL),L LDIR LD HL,#4104 ; Screen-1 LD E,0 LD BC,4*256+BIOS.LP_OPEN_S RST ToBIOS_18 LD HL,#5104 ; Screen-2 LD E,0 LD BC,4*256+BIOS.LP_OPEN_S RST ToBIOS_18 XOR A OUT (RGADR),A OUT (RGMOD),A ;************************************************ ; Инициализация страниц ;!FIXIT через функцию биос попробовать DI LD A,5 OUT (SLOT1),A XOR A OUT (SLOT0),A LD BC,#1FFD OUT (C),A ; #1FFD LD B,#7F LD A,8 LOOP_P1: DEC A OUT (C),A ; #7FFD OUT (SLOT3),A JR NZ,LOOP_P1 LD B,#1F LD A,#10 OUT (C),A ; #1FFD LD B,#7F LD A,8 LOOP_P2: OUT (C),A ; #7FFD OUT (SLOT3),A INC A CP 16 JR NZ,LOOP_P2 XOR A OUT (C),A ; #7FFD LD B,#1F OUT (C),A ; #1FFD ; Все RAM, кроме BANK2 - в ней программа! ;*********************************************** LD HL,PROG_STARTS LD DE,PROG_STARTS.Launch ;!HARDCODE LD BC,0*256 + PROG_STARTS.Length LDIR LD A,(Line312_+2) OUT (Port_VSYNC),A LD A,(P_7FFD_+2) ; - Pentagon off LD BC,#7FFD OUT (C),A LD A,(Turbo__+2) ; 3 - turbo LD HL,(Sprint_+2) ; +04h - Sprinter-ZX ADD A,L ; +0Ch - Scorpion/Pentagon LD HL,(P_1FFD_+2) ; +40h - Scorpion port off ADD A,L LD HL,(Mem512_+2) ; +80h - Pentagon-512 on ADD A,L LD E,A LD A,(To_trd_+2) LD D,A ;!TEST IN A,(SLOT3) LD C,A LD A,SYS_PAGE OUT (SLOT3),A LD A,E LD (SYS_PAGE.CONFIG_DE),A XOR A LD (SYS_PAGE.CONFIG_DE+1),A LD A,C OUT (SLOT3),A ; JP PROG_STARTS.Launch ;*************************************** PROG_STARTS: .Launch: EQU #FF00 DISP .Launch LD A,2 OUT (SLOT2),A LD A,E OUT (SYS_PORT.OFF),A LD A,D AND A JP Z,0 LD A,#10 LD BC,#7FFD OUT (C),A LD HL,0 PUSH HL JP #3D29 ; RESET to TR-DOS ENT ; .Length EQU $-PROG_STARTS ASSERT PROG_STARTS.Length<#100,'PROG_STARTS too big!!!' ; SET_PAL: LD DE,0 LD BC,#FF*256 + BIOS.PIC_SET_PAL JP ToBIOS_18 ; ;----------------------------------------------------------------------; MAKE_FULL_NAME: LD HL,(CNF_NAME) LD (.mode),HL LD DE,ONE_FILE LD C,Dss.GSwitch RST ToDSS ; LD HL,ONE_FILE LD BC,Dss.EX_Path.GET_ALL RST ToDSS ; OR 2 CP 3 ; only "FileName.ext"? LD HL,(CNF_NAME) JR Z,.get_app_path RET ; .def_cnf: LD HL,CNF_FILE LD (.mode),HL ; .get_app_path: LD HL,ONE_FILE LD BC,Dss.AppInfo.EXE_HomeDir RST ToDSS ; LD HL,ONE_FILE LD BC,12 ;!HARDCODE filename length XOR A CPIR DEC HL EX DE,HL ; .mode+1: LD HL,0 LD BC,12 ;!HARDCODE filename length LDIR XOR A LD (DE),A LD HL,ONE_FILE RET ;----------------------------------------------------------------------; ; ; ;----------------------------------------------------------------------; ;!FIXIT временная заплатка CHECK_ZX_FLAG: LD BC,SLOT3 IN B,(C) LD A,Spec_Page OUT (C),A LD HL,(Spec_Page.flag_Z) LD DE,'Z'+'X'*256 AND A SBC HL,DE JR Z,.exit ; LD A,(Spec_Page.flag_Z) ; CP 'Z' ; JR NZ,.no_zx ; LD A,(Spec_Page.flag_X) ; CP 'X' ; JP Z,.exit ; .no_zx: LD A,1 LD (NO_ZX_FLAG),A .exit: OUT (C),B RET NO_ZX_FLAG DB 0 ;----------------------------------------------------------------------; ; ; Если параметр задан, то выбирается значение Y PARAMS:; Y / N ; тут значения для ключей записываются как 16 бит значение, значит обратный порядок байтов Turbo__: DW Turbo_, #0302 ; включить TURBO Line312_ DW Lines312, #6141 ; включить 312 строк Sprint_: DW Sprint, #040C ; включить Sprinter P_7FFD_: DW P_7FFD, #0030 ; включить 7FFD P_1FFD_: DW P_1FFD, #0040 ; включить 1FFD Mem512_: DW Mem512, #8000 ; включить 512k To_trd_: DW To_trd, #0100 ; вoйти в TR-DOS Int_sc_: DW Int_sc, #0102 ; включить INT "по-скорпионовски" No_run_: DW no_run, #00FF ; не запускать Int_or_: DW Int_or, #0300 ; включить INT "Original" Ret_zx_: DW Ret_zx, #4100 ; включить возврат в ZX страница (#41) должна совпадать с ret_fn_ Ret_fn_: DW Ret_fn, #4100 ; включить возврат в FN страница (#41) должна совпадать с ret_zx_ LD_Pal_: DW LD_Pal, #FF00 RMD_Keep_: DW RMD_Keep, #FF00 ;!TEST; [ ] 05/11/2023 очищать рамдиски при выходе DW 0,0 ; end marker Turbo_: DB "turbo", 255,0 Lines312: DB "lines312", 255,0 Sprint: DB "sprinter", 255,0 P_7FFD: DB "7FFD", 255,0 P_1FFD: DB "1FFD", 255,0 Mem512: DB "mem512", 255,0 Int_sc: DB "int-sc", 255,0 To_trd: DB "to-trdos", 255,0 no_run: DB "no-run", 255,0 Int_or: DB "origin", 255,0 Ret_zx: DB "ret-zx", 255,0 Ret_fn: DB "ret-fn", 255,0 LD_Pal: DB "load-pal", 255,0 RMD_Keep: DB "RMD-Keep", 255,0 ;!TEST; [ ] 05/11/2023 очищать рамдиски при выходе ;ZX_PROG_LEN EQU $-RELOAD_PROG ;/Turbo /Lines312 /Sprinter /7FFD /1FFD /Mem512 /Int-Sc /To-TRDOS /no-run /origin /ret-zx /ret-fn CNF_FILE: DB "SPECTRUM.CFG",0 .Size EQU $-CNF_FILE ONE_FILE: BLOCK FULL_FILE_NAME_LENGTH,0 ; ;!TODO ;USER_CURRENT_DRV DB 'Z:' ;USER_CURRENT_DIR EQU $ ;SPECTRUM_HOME_DIR EQU USER_CURRENT_DIR + 256 ; ; ; ; ;----------------------------------------------[End Loader section] ; PlaceForPalette EQU #A000 STACK_CHECK_MACRO stack_point,stack_buffer ; Code after Loader ;[]-----------------------------[PLUGINS]-----------------------------[] INCLUDE 'trdscl.a80' ;[]-------------------------------------------------------------------[] ; Code end section ; OUTEND ; SAVEBIN 'Build/test.bin', exe_header, $-exe_header ;