diff --git a/Shared_Includes b/Shared_Includes index 6c92964..947627f 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 6c92964be4fbbbec546d52ad6e2b51fd596d8a02 +Subproject commit 947627f58f37509150f653c81c82d742a4123cb6 diff --git a/spectrum.asm b/spectrum.asm index db5e167..7983b9e 100644 --- a/spectrum.asm +++ b/spectrum.asm @@ -47,6 +47,8 @@ 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 ;*************************************** @@ -91,17 +93,32 @@ program_start EQU BEGIN ;*************************************** 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 +;!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 ;*************************************** ; @@ -141,23 +158,28 @@ BEGIN: LD (LINE_X),IX RST ToBIOS ; ELSE - + ; ENDIF - JP COMAND_LINE + + Error_NoMemForSPpages: LD HL,NO_MEM_MSG2 JR ERROR_FILE.prn_msg -ERROR_FILE: - LD HL,ERROR_FILE_MSG_X +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 @@ -379,8 +401,9 @@ N_LINE: LD (HL),0 ;!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 HL,(A_LINES+.romLine) LD A,(HL) CP ';' EX DE,HL @@ -420,6 +443,44 @@ N_LINE: LD (HL),0 ;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 + ; + ;PUSH DE + + LD A,(FILE_HANDLE) + LD C,Dss.Close + RST ToDSS + + ;POP DE +.skip: + ; ; файлы считаны ;************************************* @@ -427,7 +488,7 @@ N_LINE: LD (HL),0 LD C,Dss.PChars RST ToDSS - LD HL,(A_LINES+NAME_CFG_LINE) + LD HL,(A_LINES + (NAME_CFG_LINE-1)*2 ) LD C,Dss.PChars RST ToDSS @@ -442,7 +503,7 @@ N_LINE: LD (HL),0 LD A,Spec_Page OUT (SLOT3),A - LD HL,(A_LINES+OPTIONS_LINE) ; строка параметров + LD HL,(A_LINES + (OPTIONS_LINE-1)*2 ) ; строка параметров LOOP_PAR1: LD A,(HL) CP "/" JR Z,PARAM_TEST @@ -514,7 +575,7 @@ BUFFER_RAM_PAGES: ELSE BUFFER_RAM_PAGES: .ROM: DB #42, #43, #44, #45, #46, #47 -.RAM: BLOCK 16 ; 256 кб +;.RAM: BLOCK 16 ; 256 кб .Size EQU $-BUFFER_RAM_PAGES .end_marker: BYTE #FF ENDIF @@ -928,10 +989,32 @@ ORIG1: LD BC,Port_All_Mode ;--------------------------------------- ;****************************** + 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 @@ -971,19 +1054,12 @@ Original: LD C,BIOS.FN_SYNC ; -> INT for Pentagon or Scorpion OUT (C),A ; #1FFD 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 A,8 +LOOP_P1: DEC A + OUT (C),A ; #7FFD + OUT (SLOT3),A + JR NZ,LOOP_P1 LD B,#1F LD A,#10 @@ -1065,7 +1141,13 @@ PROG_STARTS: LD A,2 .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 +; + ; ; Если параметр задан, то выбирается значение Y PARAMS:; Y / N ; тут значения для ключей записываются как 16 бит значение, значит обратный порядок байтов @@ -1081,6 +1163,7 @@ 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 DW 0,0 ; end marker Turbo_: DB "turbo", 255,0 @@ -1095,6 +1178,7 @@ 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 ;ZX_PROG_LEN EQU $-RELOAD_PROG @@ -1114,6 +1198,9 @@ Loader_length EQU 0 ENDIF ;----------------------------------------------[End Loader section] ; + +PlaceForPalette EQU #9000 + STACK_CHECK_MACRO stack_point,stack_buffer ; Code after Loader ;[]-----------------------------[PLUGINS]-----------------------------[]