From cff96ddd41aa6cc5fb64b48953e00d4c68ba3ba6 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 24 Jun 2023 06:10:24 +1000 Subject: [PATCH] custom number of ROMs loading --- Shared_Includes | 2 +- spectrum.asm | 371 +++++++++++++++++++++++------------------------- 2 files changed, 176 insertions(+), 197 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index 80b60f7..81f727c 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 80b60f7294ce3eee958a0c4e9a6f29577cee496f +Subproject commit 81f727ca6ecd8fcaaac4f4e573fe1fd6578c1efa diff --git a/spectrum.asm b/spectrum.asm index 241c290..8b0ddb8 100644 --- a/spectrum.asm +++ b/spectrum.asm @@ -84,14 +84,19 @@ 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 +FULL_FILE_NAME_LENGTH EQU 128 ; длина строки пути к файлу +MAX_LINE_LENGTH EQU 120 ; длина строки CFG файла +CFG_FILE_LINES EQU 8 +NAME_CFG_LINE EQU 0 +BASIC128_LINE EQU 2 +BASIC_48_LINE EQU 4 +TRDOS_LINE EQU 6 +EXP_LINE EQU 8 +BIOS_LINE EQU 10 +BIOS2_LINE EQU 12 +;XXX_LINE EQU ?? +OPTIONS_LINE EQU (CFG_FILE_LINES-1)*2 + ;*************************************** ; @@ -106,17 +111,17 @@ OPTIONS_LINE EQU 14 ; Code start section ;[]-------------------------------------------------------------------[] IF EXE_HEADER - include 'Shared_Includes/constants/EXE_Header.z80' - ORG org_addr + include 'Shared_Includes/constants/EXE_Header.z80' + ORG org_addr ELSE - ORG org_addr - CLP_Buffer + ORG org_addr - CLP_Buffer ENDIF BEGIN: LD (LINE_X),IX LD HL,START_MSG - LD C,5Ch + LD C,Dss.PChars RST ToDSS IN A,(SLOT3) @@ -125,10 +130,10 @@ BEGIN: JP COMAND_LINE ERROR_FILE: LD HL,ERROR_FILE_MSG_X - LD C,5Ch + LD C,Dss.PChars RST ToDSS LD HL,ONE_FILE - LD C,5Ch + LD C,Dss.PChars RST ToDSS LD HL,ERROR_FILE_MSG @@ -184,8 +189,7 @@ COMAND_LINE: CALL READ_FILE_1 JP NC,CONTINUE -NO_FIL: - LD HL,CNF_FILE +NO_FIL: LD HL,CNF_FILE LD A,Spec_Page CALL READ_FILE_1 JR C,ERROR_FILE @@ -352,89 +356,69 @@ 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 +A_LINES: BLOCK CFG_FILE_LINES*2, 0 ;********************************************* CONTINUE: ; CNF файл прочитан, DE - длина CNF - LD (LEN_CNF),DE + 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 + 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 +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 ;************************************* + MACRO vROM_LOAD romLine, pageNumber + LD HL,(A_LINES + romLine) + LD A,(HL) + CP ';' + JR Z,.skip_load + LD A,pageNumber + CALL READ_FILE_1 + LD A,Spec_Page + OUT (SLOT3),A + JP C,ERROR_FILE +.skip_load: + ENDM - 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 + 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-я строка - имя файла ; файлы считаны ;************************************* @@ -531,7 +515,6 @@ PARAM_E2: ;************************************ PARAM_END: - LD A,#E2 ; ROM-ID - BASIC 128 LD B,#42 ; page CALL SET_ROM @@ -587,10 +570,9 @@ SKIP_IMAGE: ;******************************************** +; out B - old ROM-page SET_ROM: - ; out B - old ROM-page DI - ; PUSH BC ; PUSH AF @@ -660,11 +642,11 @@ SET_ROM: ;******************************************** READ_IMAGE: LD DE,ONE_FILE - LD BC,128 + LD BC,FULL_FILE_NAME_LENGTH LDIR LD HL,ONE_FILE - LD A,1 + LD A,Dss.Open.R LD C,Dss.Open RST ToDSS RET C @@ -681,22 +663,20 @@ READ_IMAGE: .Load_TRD: LD A,(IMAGE_HANDLER) - LD C,Dss.Move_FP - LD B,2 + LD B,Dss.Move_FP.FrEnd LD HL,0 LD IX,0 + LD C,Dss.Move_FP RST ToDSS ; найти длину файла RET C PUSH IX POP DE -;--------------[new_code]--------------- call Get_RAM_Disk_E ret c - jp Load_IMAGE_File -;--------------------------------------- + Get_RAM_Disk_E: ; hl:de - размер файла в байтах LD A,D @@ -719,32 +699,29 @@ Get_RAM_Disk_E: JR Z,ERROR_NO_MEM PUSH AF ;*************************************** +;!FIXIT безопасно занимать рамдиски, чтоб пользователь не страдал ; освободить ram-disk e: .free_disk: DI - LD A,0 - LD C,BIOS.EMM_FN3 + XOR A ; RAM-Drive E: + LD C,BIOS.FreeMemRMD RST ToBIOS ; освободить e: -;!!!!!!!!!!!!!!!!!!!!!! ; назначать другой рамдрайв, свободный? -;*************************************** + POP AF LD B,A ; запросить память у bios-а - LD A,0 - LD C,BIOS.EMM_FN2 ; и подсоединить к e: + XOR A ; RAM-Drive E: + LD C,BIOS.GetMemRMD ; и подсоединить к e: RST ToBIOS JR C,ERROR_NO_MEM LD (MEM_BLK),A - -;--------------[new_code]--------------- - ret + RET ;--------------------------------------- Load_IMAGE_File: LD A,(IMAGE_HANDLER) - LD C,Dss.Move_FP - LD B,0 LD HL,0 LD IX,0 + LD BC,Dss.Move_FP.FrStart * 256 + Dss.Move_FP RST ToDSS ; установить указатель на 0 RET C @@ -765,7 +742,7 @@ Load_IMAGE_File: RST ToDSS JR C,ERROR_IN_READ - LD HL,PROGRES_IND ; loading progress + LD HL,PROGRES_IND ; loading progress LD C,Dss.PChars RST ToDSS @@ -778,12 +755,12 @@ Load_IMAGE_File: CP #FF JR NZ,.load_loop - LD HL,CR_LINE ; loading + LD HL,CR_LINE ; loading LD C,Dss.PChars RST ToDSS LD A,(IMAGE_HANDLER) - LD C,Dss.Close ; закрыть файл + LD C,Dss.Close ; закрыть файл RST ToDSS RET C @@ -791,9 +768,8 @@ Load_IMAGE_File: Set_RAM_Dsk_EtoA: DI - LD A,0 - LD B,0 - LD C,BIOS.RAMD_TO_DRV ; назначить e: на a: + XOR A + LD BC,0*256 + BIOS.RAMD_TO_DRV ; назначить e: на a: RST ToBIOS AND A RET @@ -808,7 +784,7 @@ ERROR_NO_MEM: RST ToDSS ERROR_IMAGE_X: LD A,(IMAGE_HANDLER) - LD C,Dss.Close ; закрыть файл + LD C,Dss.Close ; закрыть файл RST ToDSS SCF RET @@ -817,14 +793,12 @@ SAV_PG3X: db 0 ;******************************************** READ_FILE_1: LD DE,ONE_FILE - LD BC,128 - LDIR + LD BC,FULL_FILE_NAME_LENGTH LD HL,ONE_FILE OUT (SLOT3),A READ_FILE: - - LD A,1 + LD A,Dss.Open.R LD C,Dss.Open RST ToDSS RET C ; ошибка, если нет файла @@ -832,8 +806,8 @@ READ_FILE: LD (FILE_HANDLE),A LD A,(FILE_HANDLE) - LD HL,0C000h - LD DE,4000h + LD HL,#C000 + LD DE,#4000 LD C,Dss.Read RST ToDSS RET C ; ошибка при чтении @@ -845,7 +819,7 @@ READ_FILE: RST ToDSS POP DE ; длина считанных данных - RET ; ошибка при закрытии или Ok + RET ; ошибка при закрытии или Ok FILE_HANDLE: db 0 @@ -855,27 +829,24 @@ FILE_HANDLE: db 0 EXIT_TO_DSS: DI LD SP,#BFF0 - LD A,CNF_0 + LD A,CNF_PORT.CNF_0 OUT (SYS_PORT.OFF),A - ld a,(#FFF0) - out (SLOT0),a + LD A,(#FFF0) ;!HARDCODE + OUT (SLOT0),A - LD B,3 ; IBM_PAL - LD A,0 - LD C,#A6 ; SET_standard_PAL + XOR A + LD BC,3*256 + BIOS.SET_PAL_INIT ; SET IBM PAL RST ToBIOS - LD A,3 ; OPEN_TXT - LD B,0 - LD C,#50 + LD A,Dss.SetVMod.txt80x32 ; OPEN_TXT + LD BC,0*256 + Dss.SetVMod RST ToDSS - LD C,#56 ; CLS + LD A,#20 LD DE,0 LD HL,#2050 - LD B,7 - LD A,#20 + LD BC,7*256 + Dss.Clear RST ToDSS LD HL,MSG_ZX_EXIT @@ -921,7 +892,7 @@ RESET_TO_ZX: cp #1E jr z,EXIT_TO_DSS - LD A,CNF_0 + LD A,CNF_PORT.CNF_0 OUT (SYS_PORT.ON),A ; System-page on & CNF = 0 ;-------------[TEST ATARIN]------------- @@ -958,19 +929,19 @@ RESET_TO_ZX: LD A,(Ret_fn_+2) XOR B LD B,A - LD A,Conf_port.RET_PORT - CALL SET_ROM ; включить возврат + LD A,ACEX.RET_PORT + CALL SET_ROM ; включить возврат - LD A,CNF_3 - OUT (SYS_PORT.ON),A ; System-page on & CNF = 3 + 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,1FFDh + 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,7FFDh + LD BC,#7FFD OUT (C),A ; pentagon-port = 0 LD A,(Int_or_+2) @@ -978,88 +949,96 @@ RESET_TO_ZX: LD A,#FA ; original waits on JR NZ,ORIG1 LD A,#FE -ORIG1: - LD BC,Port_All_Mode +ORIG1: LD BC,Port_All_Mode OUT (C),A ; ACC-Off LD BC,CBL.SYS_PORT - LD A,0 + XOR A OUT (C),A ; CBL-off - LD A,#12 ; FDD-720 + LD A,BIOS.FN_TURBO.VG.OFF ; FDD-720 LD C,BIOS.FN_TURBO - RST #18 + RST ToBIOS_18 ;---------------[test!!!!!]------------- - LD C,BIOS.HDD_PART ; IDE-1/IDE-2 - LD A,0 ; --> IDE-1 - RST #18 +;!FIXIT разрулить режим спектрума на работу с любыми каналами и разделами + XOR A ; --> IDE-1 + LD C,BIOS.HDD_PART ; IDE-1/IDE-2 + RST ToBIOS_18 ;--------------------------------------- ;****************************** - XOR A ; Set ZX-Palette - LD B,2 - LD C,#A6 - RST 18h + XOR A + LD BC,2*256 + BIOS.SET_PAL_INIT ; Set ZX-Palette + RST ToBIOS_18 LD A,(Int_or_+2) - AND A ; 3 - JR NZ,Original - LD A,(Int_sc_+2) ; 1/2 + 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 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 + LD (HL),L LDIR LD HL,#4104 ; Screen-1 - LD BC,#0480 LD E,0 - RST #18 + LD BC,4*256 + BIOS.LP_OPEN_S + RST ToBIOS_18 LD HL,#5104 ; Screen-2 - LD BC,#0480 LD E,0 - RST #18 + LD BC,4*256 + BIOS.LP_OPEN_S + RST ToBIOS_18 XOR A OUT (RGADR),A OUT (RGMOD),A ;************************************************ ; Инициализация страниц - +;!FIXIT через функцию биос попробовать DI - LD A,0 - OUT (SLOT0),A LD A,5 OUT (SLOT1),A - XOR A + OUT (SLOT0),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 + ;!TEST + LD A,8 +LOOP_P1: + DEC A + OUT (C),A ; #7FFD + OUT (SLOT3),A + JR NZ,LOOP_P1 + + ;OUT (C),A ; #7FFD + ;OUT (SLOT3),A + ;INC A + ;CP 8 + ;JR NZ,LOOP_P1 + ; + + LD B,#1F + LD A,#10 + OUT (C),A ; #1FFD + LD B,#7F + LD A,8 LOOP_P2: - OUT (C),A ; #7FFD - OUT (SLOT3),A - INC A - CP 16 - JR NZ,LOOP_P2 + OUT (C),A ; #7FFD + OUT (SLOT3),A + INC A + CP 16 + JR NZ,LOOP_P2 + XOR A OUT (C),A ; #7FFD LD B,#1F @@ -1076,19 +1055,19 @@ LOOP_P2: LD A,(Line312_+2) OUT (Port_VSYNC),A - LD A,(P_7FFD_+2) ; - Pentagon off + LD A,(P_7FFD_+2) ; - Pentagon off LD BC,#7FFD OUT (C),A - LD A,(Turbo__+2) ; 3 - turbo + LD A,(Turbo__+2) ; 3 - turbo - LD HL,(Sprint_+2) ; +04h - Sprinter-ZX + LD HL,(Sprint_+2) ; +04h - Sprinter-ZX ADD A,L ; +0Ch - Scorpion/Pentagon - LD HL,(P_1FFD_+2) ; +40h - Scorpion port off + LD HL,(P_1FFD_+2) ; +40h - Scorpion port off ADD A,L - LD HL,(Mem512_+2) ; +80h - Pentagon-512 on + LD HL,(Mem512_+2) ; +80h - Pentagon-512 on ADD A,L LD E,A @@ -1102,7 +1081,7 @@ PROG_STARTS: LD A,2 OUT (SLOT2),A LD A,E - OUT (SYS_PORT.OFF),A ; System-port + OUT (SYS_PORT.OFF),A LD A,D AND A JP Z,0 @@ -1151,7 +1130,7 @@ Ret_fn: db "ret-fn", 255,0 ;/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 +ONE_FILE: BLOCK FULL_FILE_NAME_LENGTH, 0 ; ; ;