From 29b442dbe665296fc4a709c2c3a5b3b03f018a27 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 24 Jun 2023 23:35:41 +1000 Subject: [PATCH] New vROM support, added set CONFIG_DE, refactoring --- spectrum.asm | 1660 ++++++++++++++++++++++++-------------------------- trdscl.a80 | 466 +++++++------- 2 files changed, 1032 insertions(+), 1094 deletions(-) diff --git a/spectrum.asm b/spectrum.asm index 1f279ec..39a7e3d 100644 --- a/spectrum.asm +++ b/spectrum.asm @@ -1,37 +1,42 @@ -/* - - .----------------. .----------------. .----------------. .----------------. .----------------. .----------------. .----------------. .----------------. - | .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. | - | | _______ | || | ______ | || | _________ | || | ______ | || | _________ | || | _______ | || | _____ _____ | || | ____ ____ | | - | | / ___ | | || | |_ __ \ | || | |_ ___ | | || | .' ___ | | || | | _ _ | | || | |_ __ \ | || ||_ _||_ _|| || ||_ \ / _|| | - | | | (__ \_| | || | | |__) | | || | | |_ \_| | || | / .' \_| | || | |_/ | | \_| | || | | |__) | | || | | | | | | || | | \/ | | | - | | '.___`-. | || | | ___/ | || | | _| _ | || | | | | || | | | | || | | __ / | || | | ' ' | | || | | |\ /| | | | - | | |`\____) | | || | _| |_ | || | _| |___/ | | || | \ `.___.'\ | || | _| |_ | || | _| | \ \_ | || | \ `--' / | || | _| |_\/_| |_ | | - | | |_______.' | || | |_____| | || | |_________| | || | `._____.' | || | |_____| | || | |____| |___| | || | `.__.' | || ||_____||_____|| | - | | | || | | || | | || | | || | | || | | || | | || | | | - | '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' | - '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' - - */ -/* -To do: - SYS: - [ ] - задавать CONFIG_DE перед запуском спектрума и в перехватчике ресета - images: - [+] - Load SCL image - [ ] - Load TAP image - [ ] - Load SNA file + ; - features: - [ ] - When image filename exist, then instead of SPECTRUM.CFG loads image_filename.cfg if exist too - [ ] - Выдавать сообщения на языке установленном в CMOS - [ ] - Менять спектрумовскую палитру +; .----------------. .----------------. .----------------. .----------------. .----------------. .----------------. .----------------. .----------------. +; | .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. | +; | | _______ | || | ______ | || | _________ | || | ______ | || | _________ | || | _______ | || | _____ _____ | || | ____ ____ | | +; | | / ___ | | || | |_ __ \ | || | |_ ___ | | || | .' ___ | | || | | _ _ | | || | |_ __ \ | || ||_ _||_ _|| || ||_ \ / _|| | +; | | | (__ \_| | || | | |__) | | || | | |_ \_| | || | / .' \_| | || | |_/ | | \_| | || | | |__) | | || | | | | | | || | | \/ | | | +; | | '.___`-. | || | | ___/ | || | | _| _ | || | | | | || | | | | || | | __ / | || | | ' ' | | || | | |\ /| | | | +; | | |`\____) | | || | _| |_ | || | _| |___/ | | || | \ `.___.'\ | || | _| |_ | || | _| | \ \_ | || | \ `--' / | || | _| |_\/_| |_ | | +; | | |_______.' | || | |_____| | || | |_________| | || | `._____.' | || | |_____| | || | |____| |___| | || | `.__.' | || ||_____||_____|| | +; | | | || | | || | | || | | || | | || | | || | | || | | | +; | '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' | +; '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' +; + +/* + SYS + [+] - задавать CONFIG_DE перед запуском спектрума и в перехватчике ресета + [+] - поддержка новых образов vROM + [+] - добавлена совместимость с демо ATARIN, успользующее неполную дешифрацию порта AY + [ ] - проверять метку ZX,если мы не грузим 3 основных vROM + [ ] - в конфиге могут быть пропущены некоторые vROM,они не загружаются +; + Images + [+] - Load SCL image + [ ] - Load TAP image + [ ] - Load SNA file +; + Features + [+] - Если выбрано ret-zx,то при нажатии на пробел сразу после CAD вернёт в DSS + [ ] - When image filename exist,then instead of SPECTRUM.CFG loads image_filename.cfg if exist too + [ ] - Выдавать сообщения на языке установленном в CMOS + [ ] - Менять спектрумовскую палитру */ ; ; Compilation parameters ;*************************************** - DEVICE SPRINTER + DEVICE SPRINTER ; MMU 2 e, 0 ; нулевая страница в банку 2 и проверка на границы ; OUTPUT './Build/new.bin' ;*************************************** @@ -39,9 +44,9 @@ To do: ; ; Defines section ;*************************************** - ifndef DEBUG : define DEBUG 0 : endif - ifndef EMULATOR 0 : define EMULATOR 0 : endif - define EXE_HEADER 1 + IFNDEF DEBUG : DEFINE DEBUG 0 : ENDIF + IFNDEF EMULATOR 0 : DEFINE EMULATOR 0 : ENDIF + DEFINE EXE_HEADER 1 ; define NEED_LOADER 1 ; define NeedSafePort_Y 0 ;*************************************** @@ -50,52 +55,52 @@ To do: ; ; Included constants section ;*************************************** - include 'Shared_Includes/constants/sp2000.inc' - include 'Shared_Includes/constants/dss_equ.inc' - include 'Shared_Includes/constants/BIOS_equ.inc' + 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' + INCLUDE 'Shared_Includes/macroses/macros.z80' + INCLUDE 'Shared_Includes/macroses/accelerator.z80' ;*************************************** ; ; Included LUA section ;*************************************** - includelua + 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 +org_addr EQU #8000+CLP_Buffer +code_addr EQU BEGIN +stack_point EQU #BFFE +stack_buffer EQU 64 +program_start EQU BEGIN ;*************************************** ; ; ; Program EQU section ;*************************************** -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 +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 ;*************************************** ; @@ -103,1051 +108,992 @@ OPTIONS_LINE EQU (CFG_FILE_LINES-1)*2 ; ; Program EQU section ;*************************************** - INCLUDE 'version.inc' + 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 + 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 (LINE_X),IX - LD HL,START_MSG - LD C,Dss.PChars - RST ToDSS + LD HL,START_MSG + LD C,Dss.PChars + RST ToDSS - IN A,(SLOT3) - LD (SAVE_SLOT3),A + IN A,(SLOT3) + LD (SAVE_SLOT3),A - JP COMAND_LINE + JP COMAND_LINE ERROR_FILE: - LD HL,ERROR_FILE_MSG_X - LD C,Dss.PChars - RST ToDSS - LD HL,ONE_FILE - LD C,Dss.PChars - RST ToDSS + LD HL,ERROR_FILE_MSG_X + LD C,Dss.PChars + RST ToDSS + LD HL,ONE_FILE + LD C,Dss.PChars + RST ToDSS - LD HL,ERROR_FILE_MSG - JP EXIT_ALL + LD HL,ERROR_FILE_MSG + JP EXIT_ALL END_CNF_ERROR: - LD HL,ERROR_CNF -; JP EXIT_ALL + LD HL,ERROR_CNF + ;JP EXIT_ALL EXIT_ALL: ; PUSH HL ;---------------------[test!!!!!]------- - ; LD A,0 - ; LD C,BIOS.EMM_FN3 - ; RST ToBIOS ; освободить e: - ; LD A,(SAVE_SLOT3) - ; OUT (SLOT3),A + ;LD A,0 + ;LD C,BIOS.EMM_FN3 + ;RST ToBIOS ; освободить e: + ;LD A,(SAVE_SLOT3) + ;OUT (SLOT3),A ;--------------------------------------- -; POP HL - LD C,Dss.PChars - RST ToDSS + ;POP HL + LD C,Dss.PChars + RST ToDSS ;---------------------[test!!!!!]------- - ; ld a,(CurDisk_Save) - ; ld c,Dss.ChDisk - ; RST ToDSS - ; jr nc,1f + ;ld a,(CurDisk_Save) + ;ld c,Dss.ChDisk + ;RST ToDSS + ;jr nc,1f - ; ld hl,ERROR_FILE2_MSG - ; LD C,Dss.PChars - ; RST ToDSS + ;ld hl,ERROR_FILE2_MSG + ;LD C,Dss.PChars + ;RST ToDSS ;--------------------------------------- -1: LD BC,Dss.Exit - RST ToDSS +1: LD BC,Dss.Exit + RST ToDSS +COMAND_LINE: LD HL,(LINE_X) + LD A,(HL) + AND A + JR Z,NO_FIL + DEC A + JR Z,NO_FIL -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 - INC HL - INC HL + CALL FIND_FILES - CALL FIND_FILES + LD HL,(CNF_NAME) + LD A,Spec_Page + CALL READ_FILE_1 + JP NC,CONTINUE - LD HL,(CNF_NAME) - LD A,Spec_Page - CALL READ_FILE_1 - JP NC,CONTINUE +NO_FIL: LD HL,CNF_FILE + LD A,Spec_Page + CALL READ_FILE_1 + JR C,ERROR_FILE + JP CONTINUE -NO_FIL: LD HL,CNF_FILE - LD A,Spec_Page - CALL READ_FILE_1 - JR C,ERROR_FILE - JP CONTINUE +FIND_FILES: PUSH HL -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 - 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 20h + 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 -FIND_T_LOOP: - LD A,(HL) - INC HL - CP "." - CALL Z,POINT_F - CP 20h - 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 +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 -NO_NEXT: - DJNZ FIND_T_LOOP +BLANK_X: LD (X_FILE),HL ; найден пробел, имя файла - снова +BLANK_X1: DEC HL + LD (HL),0 + INC HL + RET -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) +POINT_F: LD A,(HL) + CP 't' + JR Z,.TRD + CP 'T' + JR Z,.TRD - CP 't' - JR Z,.TRD - CP 'T' - JR Z,.TRD + CP 's' + JR Z,.SCL + CP 'S' + JR Z,.SCL - 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 - 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 -.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 +.CNF: LD DE,(X_FILE) + LD (CNF_NAME),DE + JR .exit ;------------------------------------[^] -LINE_ZX: DB "ZX Spectrum PAGES",0 -LEN_LINE_ZX EQU $-LINE_ZX +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 - +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 + 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 + 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 + 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 + 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 +PROGRES_IND: DB '░',0 ; 176 -MSG_ZX_EXIT: - db 13,10,"EXIT from Spectrum configuration",0 -MSG_ZX_EXIT2: - db 13,10,"EXIT from ZX mode",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 +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 +SAVE_SLOT3: BYTE 0 +LEN_CNF: WORD 0 +A_LINES: BLOCK CFG_FILE_LINES*2,0 ;********************************************* -CONTINUE: ; CNF файл прочитан, DE - длина CNF - LD (LEN_CNF),DE +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 + 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 ;************************************* - 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 + 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 + ENDM - 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-я строка - имя файла + 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-я строка - имя файла ; файлы считаны ;************************************* - LD HL,MSG_NORMAL - LD C,Dss.PChars - RST ToDSS + LD HL,MSG_NORMAL + LD C,Dss.PChars + RST ToDSS - LD HL,(A_LINES+NAME_CFG_LINE) - LD C,Dss.PChars - RST ToDSS + LD HL,(A_LINES+NAME_CFG_LINE) + LD C,Dss.PChars + RST ToDSS - LD HL,CR_LINE - 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,(SAVE_SLOT3) + ;OUT (SLOT3),A ;************************************* - LD A,Spec_Page - OUT (SLOT3),A - LD HL,(A_LINES+OPTIONS_LINE) ; строка параметров + LD A,Spec_Page + OUT (SLOT3),A + LD HL,(A_LINES+OPTIONS_LINE) ; строка параметров +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 -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 -PARAM_TEST: - INC HL - PUSH HL + LD IX,PARAMS +NEXT_PAR: LD E,(IX) + LD D,(IX+1) - 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 -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_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 - сохраняется! -PARAM_E2: - EX (SP),HL ; новое HL - сохраняется! + LD A,(IX+3) + LD (IX+2),A ; parameter alternate! - LD A,(IX+3) - LD (IX+2),A ; parameter alternate! + LD L,(IX) + LD H,(IX+1) - LD L,(IX) - LD H,(IX+1) + LD C,Dss.PChars + RST ToDSS - LD C,Dss.PChars - RST ToDSS - - POP HL - JR LOOP_PAR1 + POP HL + JR LOOP_PAR1 ;************************************ -PARAM_END: - LD A,#E2 ; ROM-ID - BASIC 128 - LD B,#42 ; page - CALL SET_ROM +PARAM_END: LD A,#E2 ; ROM-ID - BASIC 128 + LD B,#42 ; page + CALL SET_ROM - LD A,#E3 ; ROM-ID - BASIC 48 - LD B,#43 ; page - CALL SET_ROM + LD A,#E3 ; ROM-ID - BASIC 48 + LD B,#43 ; page + CALL SET_ROM - LD A,#E1 ; ROM-ID - TR-DOS - LD B,#44 ; page - CALL SET_ROM + LD A,#E1 ; ROM-ID - TR-DOS + LD B,#44 ; page + CALL SET_ROM - LD A,#E0 ; ROM-ID - EXPANSION - LD B,#45 ; page - CALL SET_ROM + LD A,#E0 ; ROM-ID - EXPANSION + LD B,#45 ; page + CALL SET_ROM - LD A,#EB ; ROM-ID - BIOS-1 - LD B,#46 ; page - CALL SET_ROM + LD A,#EB ; ROM-ID - BIOS-1 + LD B,#46 ; page + CALL SET_ROM - LD A,#EF ; ROM-ID - BIOS-2 - LD B,#47 ; page - CALL SET_ROM + LD A,#EF ; ROM-ID - BIOS-2 + LD B,#47 ; page + CALL SET_ROM - LD HL,(IMAGE_NAME) - LD A,H - OR L - JP Z,SKIP_IMAGE + LD HL,(IMAGE_NAME) + LD A,H + OR L + JP Z,SKIP_IMAGE - LD C,SLOT3 - IN B,(C) - PUSH BC + LD C,SLOT3 + IN B,(C) + PUSH BC - CALL READ_IMAGE - POP BC - OUT (C),B - JP C,ERROR_FILE + 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 Z,EXIT_ALL +SKIP_IMAGE: LD A,(No_run_+2) + AND A + LD HL,MSG_EXIT1 + JP Z,EXIT_ALL - JP SET_RELOAD_PROG + JP SET_RELOAD_PROG -; LD HL,MSG_NORMAL -; JP EXIT_ALL - -;*************************************************** - -; JP 0 + ;LD HL,MSG_NORMAL + ;JP EXIT_ALL +;******************************************** + ;JP 0 ;******************************************** ; out B - old ROM-page -SET_ROM: - DI -; PUSH BC -; PUSH AF +SET_ROM: DI + ;PUSH BC + ;PUSH AF -; LD A,CNF_0 -; OUT (SYS_PORT.ON),A -; LD A,10h -; LD BC,7FFDh -; OUT (C),A + ;LD A,CNF_0 + ;OUT (SYS_PORT.ON),A + ;LD A,10h + ;LD BC,7FFDh + ;OUT (C),A -; POP AF -; POP BC + ;POP AF + ;POP BC -; LD C,0F8h -; CALL 3D13h + ;LD C,0F8h + ;CALL 3D13h -; PUSH BC -; PUSH AF + ;PUSH BC + ;PUSH AF -; LD A,0 -; LD BC,7FFDh -; OUT (C),A -; LD A,CNF_0 -; OUT (SYS_PORT.OFF),A -; -; POP AF -; POP BC -; RET + ;LD A,0 + ;LD BC,7FFDh + ;OUT (C),A + ;LD A,CNF_0 + ;OUT (SYS_PORT.OFF),A - EX AF,AF' + ;POP AF + ;POP BC + ;RET - IN A,(SLOT3) - PUSH AF + EX AF,AF' - LD A,DCP_PAGE ; установить новую - OUT (SLOT3),A + IN A,(SLOT3) + PUSH AF - LD A,(#C400) ; сохранить то что было - LD L,A - LD A,(#C600) - LD H,A + LD A,DCP_PAGE ; установить новую + OUT (SLOT3),A - EX AF,AF' ; страница + LD A,(#C400) ; сохранить то что было + LD L,A + LD A,(#C600) + LD H,A - LD (#C400),A ; установить порт ROM - LD (#C600),A - EX AF,AF' + 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 (#C400),A ; установить порт ROM + LD (#C600),A + EX AF,AF' - LD A,L - LD (#C400),A ; вернуть порт - LD A,H - LD (#C600),A ; вернуть порт + 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 - POP AF - OUT (SLOT3),A + LD A,L + LD (#C400),A ; вернуть порт + LD A,H + LD (#C600),A ; вернуть порт - RET + 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 +READ_IMAGE: LD DE,ONE_FILE + LD BC,FULL_FILE_NAME_LENGTH + LDIR + LD HL,ONE_FILE - LD (IMAGE_HANDLER),A + LD A,Dss.Open.R + LD C,Dss.Open + RST ToDSS + RET C - ld a,(IMAGE_FLAG) - and a - jr z,.Load_TRD + LD (IMAGE_HANDLER),A - CP 1 ; check if SCL - jp z,Load_SCL -; jp Error_Flag ;!!!!!!!!!!!!!!!! + LD A,(IMAGE_FLAG) + AND A + JR Z,.Load_TRD -.Load_TRD: - LD A,(IMAGE_HANDLER) - LD B,Dss.Move_FP.FrEnd - LD HL,0 - LD IX,0 - LD C,Dss.Move_FP - RST ToDSS ; найти длину файла - RET C + CP 1 ; check if SCL + JP Z,Load_SCL + ;jp Error_Flag ;!!!!!!!!!!!!!!!! - PUSH IX - POP DE +.Load_TRD: LD A,(IMAGE_HANDLER) + LD B,Dss.Move_FP.FrEnd + LD HL,0 + LD IX,0 + LD C,Dss.Move_FP + RST ToDSS ; найти длину файла + RET C - call Get_RAM_Disk_E - ret c - jp Load_IMAGE_File + PUSH IX + POP DE + + CALL Get_RAM_Disk_E + RET C + JP Load_IMAGE_File -Get_RAM_Disk_E: ; hl:de - размер файла в байтах - LD A,D - ADD A,A - ADC HL,HL - ADD A,A - ADC HL,HL +Get_RAM_Disk_E: LD A,D + ADD A,A + ADC HL,HL + ADD A,A + ADC HL,HL - LD A,D - AND 3Fh - OR E - JR Z,.skip_inc - INC HL -.skip_inc: ; HL - длина файла в страницах - LD A,H - AND A - JR NZ,ERROR_NO_MEM - LD A,L - AND A - JR Z,ERROR_NO_MEM - PUSH AF + LD A,D + AND 3Fh + 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 ;*************************************** ;!FIXIT безопасно занимать рамдиски, чтоб пользователь не страдал ; освободить ram-disk e: -.free_disk: - DI - XOR A ; RAM-Drive E: - LD C,BIOS.FreeMemRMD - RST ToBIOS ; освободить e: +.free_disk: DI + XOR A ; RAM-Drive E: + LD C,BIOS.FreeMemRMD + RST ToBIOS ; освободить e: - POP AF - LD B,A ; запросить память у bios-а - XOR A ; RAM-Drive E: - LD C,BIOS.GetMemRMD ; и подсоединить к e: - RST ToBIOS - JR C,ERROR_NO_MEM - LD (MEM_BLK),A - RET + POP AF + LD B,A ; запросить память у bios-а + XOR A ; RAM-Drive E: + LD C,BIOS.GetMemRMD ; и подсоединить к e: + RST ToBIOS + JR C,ERROR_NO_MEM + LD (MEM_BLK),A + RET ;--------------------------------------- Load_IMAGE_File: - LD A,(IMAGE_HANDLER) - LD HL,0 - LD IX,0 - LD BC,Dss.Move_FP.FrStart * 256 + Dss.Move_FP - RST ToDSS ; установить указатель на 0 - RET C + LD A,(IMAGE_HANDLER) + LD HL,0 + LD IX,0 + LD BC,Dss.Move_FP.FrStart*256+Dss.Move_FP + RST ToDSS ; установить указатель на 0 + RET C - LD HL,MSG_LOAD_IMAGE ; loading image - LD C,Dss.PChars - RST ToDSS + LD HL,MSG_LOAD_IMAGE ; loading image + LD C,Dss.PChars + RST ToDSS - LD A,(MEM_BLK) + LD A,(MEM_BLK) -.load_loop: - PUSH AF - OUT (SLOT3),A +.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 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 + LD HL,PROGRES_IND ; loading progress + LD C,Dss.PChars + RST ToDSS - DI - POP AF -.scl_read_next: - LD C,BIOS.GetMemPageNext - RST ToBIOS + DI + POP AF +.scl_read_next: LD C,BIOS.GetMemPageNext + RST ToBIOS - CP #FF - JR NZ,.load_loop + CP #FF + JR NZ,.load_loop - LD HL,CR_LINE ; loading - LD C,Dss.PChars - RST ToDSS + LD HL,CR_LINE ; loading + LD C,Dss.PChars + RST ToDSS - LD A,(IMAGE_HANDLER) - LD C,Dss.Close ; закрыть файл - RST ToDSS + LD A,(IMAGE_HANDLER) + LD C,Dss.Close ; закрыть файл + RST ToDSS - RET C -; ret + 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 + 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_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 +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 +SAV_PG3X: DB 0 ;******************************************** -READ_FILE_1: - LD DE,ONE_FILE - LD BC,FULL_FILE_NAME_LENGTH - LD HL,ONE_FILE - OUT (SLOT3),A +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 ; ошибка, если нет файла +READ_FILE: LD A,Dss.Open.R + LD C,Dss.Open + RST ToDSS + RET C ; ошибка, если нет файла - LD (FILE_HANDLE),A - LD A,(FILE_HANDLE) + LD (FILE_HANDLE),A + LD A,(FILE_HANDLE) - LD HL,#C000 - LD DE,#4000 - LD C,Dss.Read - RST ToDSS - RET C ; ошибка при чтении + LD HL,#C000 + LD DE,#4000 + LD C,Dss.Read + RST ToDSS + RET C ; ошибка при чтении - PUSH DE + PUSH DE - LD A,(FILE_HANDLE) - LD C,Dss.Close - RST ToDSS + LD A,(FILE_HANDLE) + LD C,Dss.Close + RST ToDSS - POP DE ; длина считанных данных - RET ; ошибка при закрытии или Ok + POP DE ; длина считанных данных + RET ; ошибка при закрытии или Ok -FILE_HANDLE: db 0 +FILE_HANDLE: DB 0 ;******************************************** + ;******************************************** +EXIT_TO_DSS: DI + LD SP,#BFF0 + LD A,CNF_PORT.CNF_0 + OUT (SYS_PORT.OFF),A -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 - LD A,(#FFF0) ;!HARDCODE - OUT (SLOT0),A + XOR A + LD BC,3*256+BIOS.SET_PAL_INIT ; SET IBM PAL + RST ToBIOS - 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 - 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 - 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 + LD HL,MSG_ZX_EXIT + JP EXIT_ALL SET_RELOAD_PROG: - DI + DI - LD A,Spec_Page - OUT (SLOT3),A + LD A,Spec_Page + OUT (SLOT3),A - LD A,"Z" - LD (#FFFE),A - LD A,"X" - LD (#FFFF),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 + 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 ; + 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 +RESET_TO_ZX: DI + LD SP,#BFF0 - ld a,high ZXKeys.Line_7 - in a,(ZXKeys) - and #1F - cp #1E - jr z,EXIT_TO_DSS + LD A,high ZXKeys.Line_7 + IN A,(ZXKeys) + AND #1F + CP #1E + JR Z,EXIT_TO_DSS - LD A,CNF_PORT.CNF_0 - OUT (SYS_PORT.ON),A ; System-page on & CNF = 0 + ;LD A,CNF_PORT.CNF_3 + ;OUT (SYS_PORT.ON),A ; System-page on & CNF = 0 ;-------------[TEST ATARIN]------------- ; #c0fd - +#05ED ; фикс неполной дешифрации порта #FFFD (пишут в #C0FD) -; [x] добавлен порт #C0FD во все карты портов - - ld bc,SLOT3 - in b,(c) - - ld a,DCP_PAGE - out (c),a +; добавлен порт #C0FD во все карты портов + LD BC,SLOT3 + IN B,(C) + LD A,DCP_PAGE + OUT (C),A ; !HARDCODE далее всё наскоряк и захардкожено ; !TODO переделать под новую функцию дешифрации - ld a,#90 ; AY-8910-port (FFFD) - ld hl,#C000 + #05ED ; CNF 0 - ld (hl),a + LD A,#90 ; AY-8910-port (FFFD) + LD HL,#C000+#05ED ; CNF 0 + LD (HL),A - ld h,#c0 + #15 ; CNF 1 - ld (hl),a + LD H,#C0+#15 ; CNF 1 + LD (HL),A - ld h,#c0 + #25 ; CNF 2 - ld (hl),a + LD H,#C0+#25 ; CNF 2 + LD (HL),A - ld h,#c0 + #35 ; CNF 3 - ld (hl),a + LD H,#C0+#35 ; CNF 3 + LD (HL),A - out (c),b + OUT (C),B ;--------------------------------------- + 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,(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,CNF_PORT.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,#1FFD + OUT (C),A ; Scorpion-port = 0 + LD BC,#7FFD + OUT (C),A ; pentagon-port = 0 - 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 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 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 + 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 + XOR A ; --> IDE-1 + LD C,BIOS.HDD_PART ; IDE-1/IDE-2 + RST ToBIOS_18 ;--------------------------------------- ;****************************** - XOR A - LD BC,2*256 + BIOS.SET_PAL_INIT ; Set ZX-Palette - RST ToBIOS_18 + 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 -Original: - LD C,BIOS.FN_SYNC ; -> INT for Pentagon or Scorpion - RST ToBIOS_18 + 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,#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,#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 + 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 + XOR A + OUT (RGADR),A + OUT (RGMOD),A ;************************************************ ; Инициализация страниц ;!FIXIT через функцию биос попробовать - DI - LD A,5 - OUT (SLOT1),A - XOR A - OUT (SLOT0),A + DI + LD A,5 + OUT (SLOT1),A + XOR A + OUT (SLOT0),A - LD BC,#1FFD - OUT (C),A ; #1FFD - LD B,#7F + LD BC,#1FFD + 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 - ; + ;!TEST + 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 + ;OUT (C),A ; #7FFD + ;OUT (SLOT3),A + ;INC A + ;CP 8 + ;JR NZ,LOOP_P1 + ; - XOR A - OUT (C),A ; #7FFD - LD B,#1F - OUT (C),A ; #1FFD + 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 BC,PROG_STARTS.Length - LD DE,#FF00 ;!!!!!!!!!! - LDIR + LD HL,PROG_STARTS + LD BC,PROG_STARTS.Length + LD DE,#FF00 ;!HARDCODE + LDIR - LD A,(Line312_+2) - OUT (Port_VSYNC),A + LD A,(Line312_+2) + OUT (Port_VSYNC),A - LD A,(P_7FFD_+2) ; - Pentagon off - LD BC,#7FFD - OUT (C),A + 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 - ADD A,L ; +0Ch - Scorpion/Pentagon + 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,(P_1FFD_+2) ; +40h - Scorpion port off + ADD A,L - LD HL,(Mem512_+2) ; +80h - Pentagon-512 on - 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 + 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 #FF00 ;!!!!!!!!!! + JP #FF00 ;!HARDCODE ;*************************************** -PROG_STARTS: - 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 +PROG_STARTS: 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 -.Length EQU $-PROG_STARTS - ASSERT PROG_STARTS.Length < #100, 'PROG_STARTS too big!!!' +.Length EQU $-PROG_STARTS + ASSERT PROG_STARTS.Length<#100,'PROG_STARTS too big!!!' ; ; ; Если параметр задан, то выбирается значение 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_ - dw 0,0 ; end marker +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_ + 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 +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 ;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 -ONE_FILE: BLOCK FULL_FILE_NAME_LENGTH, 0 +CNF_FILE: DB "SPECTRUM.CFG",0 +ONE_FILE: BLOCK FULL_FILE_NAME_LENGTH,0 ; ; ; ; - IFDEF NEED_LOADER -Loader_length EQU $-BEGIN - ELSE -Loader_length EQU 0 - ENDIF + IFDEF NEED_LOADER +Loader_length EQU $-BEGIN + ELSE +Loader_length EQU 0 + ENDIF ;----------------------------------------------[End Loader section] ; - STACK_CHECK_MACRO stack_point, stack_buffer + STACK_CHECK_MACRO stack_point,stack_buffer ; Code after Loader ;[]-----------------------------[PLUGINS]-----------------------------[] - INCLUDE 'trdscl.a80' + INCLUDE 'trdscl.a80' ;[]-------------------------------------------------------------------[] ; Code end section diff --git a/trdscl.a80 b/trdscl.a80 index 3556fc7..069a712 100644 --- a/trdscl.a80 +++ b/trdscl.a80 @@ -19,38 +19,36 @@ ; ║ #F5 │ 8 │ Hазвание диcкеты ║ ; ║ #FD │ 3 │ Hе иcпользуетcя (заполнено байтом 0) ║ ; ╚═══════════════╧═══════╧═══════════════════════════════════════════╝ - STRUCT SEEK + STRUCT SEEK FirstFreeSec BYTE 0 FirstFreeTrk BYTE 1 -DiskType BYTE #16 -AllFilesNum BYTE 0 -FreeSectors WORD 0 ; beta version -TRDOS_ID BYTE #10 -notuse1 WORD 0 -notuse2 BLOCK 9,32 -notuse3 BYTE 0 -DelFilesNum BYTE 0 -DiskName TEXT 8, {" "} ; beta version - ENDS +DiskType BYTE #16 +AllFilesNum BYTE 0 +FreeSectors WORD 0 ; beta version +TRDOS_ID BYTE #10 +notuse1 WORD 0 +notuse2 BLOCK 9,32 +notuse3 BYTE 0 +DelFilesNum BYTE 0 +DiskName TEXT 8,{" "} ; beta version + ENDS -/* -SYS_SECTOR: - DB 0 - BLOCK 224,0 -.FirstFreeSec: DB 0 -.FirstFreeTrk: DB 1 -.DiskType DB #16 ; #16 = 80-2, #17 = 40-2, #18 = 80-1, #19 = 40-1 -.AllFilesNum: DB 0 -.FreeSectors: DW 2544 - DB #10 - DW 0000 - BLOCK 9,32 - DB 0 -.DelFilesNum: DB 0 -.DiskName: BLOCK 8,32 - BLOCK 3,0 +; SYS_SECTOR: +; DB 0 +; BLOCK 224,0 +; .FirstFreeSec: DB 0 +; .FirstFreeTrk: DB 1 +; .DiskType DB #16 ; #16 = 80-2, #17 = 40-2, #18 = 80-1, #19 = 40-1 +; .AllFilesNum: DB 0 +; .FreeSectors: DW 2544 +; DB #10 +; DW 0000 +; BLOCK 9,32 +; DB 0 +; .DelFilesNum: DB 0 +; .DiskName: BLOCK 8,32 +; BLOCK 3,0 ; -*/ ; ╔═════════╤═════╤═════════════════════╗ ; ║Cмещение │Длина│ Hазначение ║ @@ -64,273 +62,267 @@ SYS_SECTOR: ; ║ #0E │ 1 │ Hомеp 1го cектоpа ║ ; ║ #0F │ 1 │ Hомеp доpожки ║ ; ╚═════════╧═════╧═════════════════════╝ -/* -CAT_ELEMENT: -.Name BLOCK 8,32 -.Type DB 0 -.Start DW 0000 -.Length DW 0000 -.Sectors DB 0 -.FirstSector DB 0 -.FirstTrack DB 0 -*/ - STRUCT CAT_Elements -Name block 8 -Type BYTE -Start WORD -Length WORD -Sectors BYTE -FirstSector BYTE -FirstTrack BYTE - ENDS +; CAT_ELEMENT: +; .Name BLOCK 8,32 +; .Type DB 0 +; .Start DW 0000 +; .Length DW 0000 +; .Sectors DB 0 +; .FirstSector DB 0 +; .FirstTrack DB 0 - STRUCT SclOffsets -ID BLOCK 8 -Files BYTE -FileBlock CAT_Elements - ENDS + STRUCT CAT_Elements +Name BLOCK 8 +Type BYTE +Start WORD +Length WORD +Sectors BYTE +FirstSector BYTE +FirstTrack BYTE + ENDS + + STRUCT SclOffsets +ID BLOCK 8 +Files BYTE +FileBlock CAT_Elements + ENDS ; 655360 kb = 160 tracks * 16 sectors * 256 bites ; 80 tracks * 2 heads * 16 sectors * 256 bites = 655360 kb ; Page = 64 sectors = 4 tracks ;-----------[] -Load_SCL: -;-------[Метка диска - имя файла]------- - ld hl,ONE_FILE - ld de,SCL_Buffer - ld bc,#0300+Dss.EX_Path - rst ToDSS - jr c,.skip - ld hl,SCL_Buffer - ld a,'.' - ld bc,0008 - ld de,SYS_SECTOR.DiskName +;-------[Метка диска - имя файла]------- +Load_SCL: LD HL,ONE_FILE + LD DE,SCL_Buffer + LD BC,#0300+Dss.EX_Path + RST ToDSS + JR C,.skip + + LD HL,SCL_Buffer + LD A,'.' + LD BC,0008 + LD DE,SYS_SECTOR.DiskName .loop: - cp (hl) - jr z,.skip - ldi - jp pe,.loop + CP (HL) + JR Z,.skip + LDI + JP PE,.loop .skip: ;-------[проверка хедэра SINCLAIR]------ - ld a,(IMAGE_HANDLER) - ld hl,SCL_Buffer - ld de,8 - ld c,Dss.Read - rst ToDSS - ret c ; обработчик ошибки + LD A,(IMAGE_HANDLER) + LD HL,SCL_Buffer + LD DE,8 ; байтов + LD C,Dss.Read + RST ToDSS + RET C ; обработчик ошибки - ld hl,SCL_Buffer - ld de,SCL_HEADER - ld b,8 -.check_header: - ld a,(de) - cp (hl) - jr nz,.error_header - inc hl - inc de - djnz .check_header - jr .get_size -.error_header: - scf - ret + LD HL,SCL_Buffer + LD DE,SCL_HEADER + LD B,8 +.check_header: LD A,(DE) + CP (HL) + JR NZ,.error_header + INC HL + INC DE + DJNZ .check_header + JR .get_size +.error_header: SCF + RET ;------[вычисление размера для TRD]----- .get_size: -/* ld a,(IMAGE_HANDLER) - ld hl,0 - ld ix,SclOffsets.Files - ld b,l - ld c,Dss.Move_FP - rst ToDSS ; указатель на байт количества блоков (файлов) - ret c ; обработчик ошибки!!!!! -;*/ - ld a,(IMAGE_HANDLER) - ld hl,SCL_Buffer - ld de,#701 - ld c,Dss.Read - rst ToDSS ; !FIXIT сделать контроль ошибки? ; читаем байт количества блоков (файлов) + ; LD A,(IMAGE_HANDLER) + ; LD HL,0 + ; LD IX,SclOffsets.Files + ; LD B,L + ; LD C,Dss.Move_FP + ; RST ToDSS ; указатель на байт количества блоков (файлов) + ; RET C ; обработчик ошибки!!!!! + + LD A,(IMAGE_HANDLER) + LD HL,SCL_Buffer + LD DE,#701 + LD C,Dss.Read + RST ToDSS ; !FIXIT сделать контроль ошибки? ; читаем байт количества блоков (файлов) ; - ld a,(SCL_Buffer) - ld l,a - xor a - ld h,a + LD A,(SCL_Buffer) + LD L,A + XOR A + LD H,A ; - add hl,hl ;*2 - push hl - add hl,hl ;*4 - ld d,h - ld e,l - add hl,hl ;*8 - add hl,de ;*12 - pop de - add hl,de ; в HL значение A*14 + ADD HL,HL ;*2 + PUSH HL + ADD HL,HL ;*4 + LD D,H + LD E,L + ADD HL,HL ;*8 + ADD HL,DE ;*12 + POP DE + ADD HL,DE ; в HL значение A*14 - add hl,bc + ADD HL,BC - ld de,SclOffsets.FileBlock - add hl,de ; в HL размер от начала SCL до начала блока данных (header_length) - push hl + LD DE,SclOffsets.FileBlock + ADD HL,DE ; в HL размер от начала SCL до начала блока данных (header_length) + PUSH HL ; - ld a,(IMAGE_HANDLER) - ld hl,0 - ld ix,4 ; игнорим контрольную сумму scl файла - ld b,2 - ld c,Dss.Move_FP - rst ToDSS ; указатель на конец файла - jr nc,1F ; обработчик ошибки!!!!! + LD A,(IMAGE_HANDLER) + LD HL,0 + LD IX,4 ; игнорим контрольную сумму scl файла + LD B,2 + LD C,Dss.Move_FP + RST ToDSS ; указатель на конец файла + JR NC,1F ;!FIXIT обработчик ошибки!!!!! - pop hl - ret + POP HL + RET -1: push ix - pop de ; значение младших 16 бит размера файла - ex (sp),hl ; значение header_length в HL, старшая часть размера файла на стеке - ex de,hl ; в HL значение младших 16 бит размера файла, в DE - header_length +1: PUSH IX + POP DE ; значение младших 16 бит размера файла + EX (SP),HL ; значение header_length в HL, старшая часть размера файла на стеке + EX DE,HL ; в HL значение младших 16 бит размера файла, в DE - header_length - sbc hl,de - ld de,0 - ex (sp),hl ; младшая часть размера файла на стеке - sbc hl,de ; в HL старшая часть размера файла + SBC HL,DE + LD DE,0 + EX (SP),HL ; младшая часть размера файла на стеке + SBC HL,DE ; в HL старшая часть размера файла - ex (sp),hl ; старшая часть размера файла на стеке - ld de,#1000 - add hl,de + EX (SP),HL ; старшая часть размера файла на стеке + LD DE,#1000 + ADD HL,DE - ex (sp),hl ; младшая часть размера файла на стеке - ld de,0 - adc hl,de - pop de ; тут в hl:de размер для trd + EX (SP),HL ; младшая часть размера файла на стеке + LD DE,0 + ADC HL,DE + POP DE ; тут в hl:de размер для trd ;--------------------------------------- - - call Get_RAM_Disk_E - ret c ; обработчик ошибки!!!!! + CALL Get_RAM_Disk_E + RET C ;!FIXIT обработчик ошибки!!!!! Convert_SCLtoTRD: + LD A,(MEM_BLK) + OUT (SLOT3),A ; вставляем первую страницу RAM-диска - LD A,(MEM_BLK) - out (SLOT3),a ; вставляем первую страницу RAM-диска + LD HL,SCL_Buffer + LD B,(HL) ; CAT_Elements + INC HL + LD DE,#C000 ; RAM-drive's track 0 + LD IX,SYS_SECTOR + LD (ix+SEEK.AllFilesNum),B +.cat_loop: PUSH BC + LD A,(HL) + CP 1 + JR NZ,1F ; this file is not deleted + INC (ix+SEEK.DelFilesNum) +1: LD BC,CAT_Elements-2 ; ld bc,#0D + LDIR ; copy 14 bites of scl files table to trd image catalog - ld hl,SCL_Buffer - ld b,(hl) ; CAT_Elements - inc hl - ld de,#C000 ; RAM-drive's track 0 - ld ix,SYS_SECTOR - ld (ix+SEEK.AllFilesNum),b -.cat_loop: - push bc - ld a,(hl) - CP 1 - jr nz,1F ; this file is not deleted - inc (ix+SEEK.DelFilesNum) -1: ld bc,CAT_Elements-2 ; ld bc,#0D - ldir ; copy 14 bites of scl files table to trd image catalog + LD A,(SYS_SECTOR.FirstFreeSec) + LD (DE),A + LD C,A ;!---[v 1] + INC DE + LD A,(SYS_SECTOR.FirstFreeTrk) + LD (DE),A + INC DE ; Pointer on next filename in RAM drive - ld a,(SYS_SECTOR.FirstFreeSec) - ld (de),a - ld c,a ;!---[v 1] - inc de - ld a,(SYS_SECTOR.FirstFreeTrk) - ld (de),a - inc de ; Pointer on next filename in RAM drive + DEC HL ; set to number of sectors + LD A,(HL) ; get file length in sectors from scl-table + AND #0F + ADD A,C ;!---[^ 1] + LD C,A ;!---[v 2] + AND #0F + LD (SYS_SECTOR.FirstFreeSec),A + LD A,#F0 + AND C ;!---[^ 2] + JR Z,1F + INC (ix+SEEK.FirstFreeTrk) +1: LD A,(HL) + SRL A + SRL A + SRL A + SRL A + ADD A,(ix+SEEK.FirstFreeTrk) + LD (SYS_SECTOR.FirstFreeTrk),A - dec hl ; set to number of sectors - ld a,(hl) ; get file length in sectors from scl-table - and #0F - add a,c ;!---[^ 1] - ld c,a ;!---[v 2] - and #0F - ld (SYS_SECTOR.FirstFreeSec),a - ld a,#F0 - and c ;!---[^ 2] - jr z,1F - inc (ix+SEEK.FirstFreeTrk) -1: ld a,(hl) - srl a - srl a - srl a - srl a - add a,(ix+SEEK.FirstFreeTrk) - ld (SYS_SECTOR.FirstFreeTrk),a - - inc hl ; Pointer on next filename in SCL_Buffer - pop bc - djnz .cat_loop + INC HL ; Pointer on next filename in SCL_Buffer + POP BC + DJNZ .cat_loop - xor a - ld (de),a ; file table end marker + XOR A + LD (DE),A ; file table end marker ;--------------------------------------- -; Доделать!!!!! +;!TODO Доделать!!!!! ; SYS_SECTOR.FreeSectors ; push hl ; байт в буфере откуда в SCL начинаются данные (HL-SCL_Buffer) ; push de ; байт в ram диске trd где заканчивается таблица последнего файла - xor a - ld de,SCL_Buffer-8 ; вычисляем значение смещения в файле из значения смещения в буфере - sbc hl,de - push hl - pop ix + XOR A + LD DE,SCL_Buffer-8 ; вычисляем значение смещения в файле из значения смещения в буфере + SBC HL,DE + PUSH HL + POP IX - ld a,(IMAGE_HANDLER) - ld hl,0 - ld B,L ; b=0 - от начала файла - ld c,Dss.Move_FP - rst ToDSS ; указатель на первый байт данных - jr nc,1F ; обработчик ошибки!!!!! - - pop de - ret + LD A,(IMAGE_HANDLER) + LD HL,0 + LD B,L ; b=0 - от начала файла + LD C,Dss.Move_FP + RST ToDSS ; указатель на первый байт данных + JR NC,1F ; обработчик ошибки!!!!! -1: di - ld hl,SYS_SECTOR_START - ld de,#C800 ; sys sector of tr-dos disk in bank3 of ram-disk - ACC_SetBlockSize - ld a,0 - ACC_CopyBlock - ld a,(HL) - ld (DE),a - ACC_Off -; ei + POP DE + RET - LD A,(IMAGE_HANDLER) - LD HL,#D000 ; догрузить до конца страницы - LD DE,#3000 - LD C,Dss.Read - RST ToDSS - JP C,ERROR_IN_READ ; обработчик ошибки!!!!! +1: DI + LD HL,SYS_SECTOR_START + LD DE,#C800 ; sys sector of tr-dos disk in bank3 of ram-disk + ACC_SetBlockSize + LD A,0 + ACC_CopyBlock + LD A,(HL) + LD (DE),A + ACC_Off + ;EI - LD HL,MSG_LOAD_IMAGE ; loading image - LD C,Dss.PChars - RST ToDSS + LD A,(IMAGE_HANDLER) + LD HL,#D000 ; догрузить до конца страницы + LD DE,#3000 + LD C,Dss.Read + RST ToDSS + JP C,ERROR_IN_READ ;!FIXIT обработчик ошибки!!!!! - LD HL,PROGRES_IND ; loading TRD - LD C,Dss.PChars - RST ToDSS + LD HL,MSG_LOAD_IMAGE ; loading image + LD C,Dss.PChars + RST ToDSS - DI - LD A,(MEM_BLK) - jp Load_IMAGE_File.scl_read_next + LD HL,PROGRES_IND ; loading TRD + LD C,Dss.PChars + RST ToDSS + + DI + LD A,(MEM_BLK) + JP Load_IMAGE_File.scl_read_next ;-----------[] -SCL_HEADER: DB 'SINCLAIR' +SCL_HEADER: DB 'SINCLAIR' ;------------[переменные]--------------- SYS_SECTOR_START: - DB 0 - BLOCK 224,0 -SYS_SECTOR SEEK + DB 0 + BLOCK 224,0 +SYS_SECTOR SEEK SYS_SECTOR_END: BLOCK 3,0 SCL_FILE_ID: DB 0 ;-----------[в самый конец]------------- -SCL_Buffer EQU $ - assert SCL_Buffer+#701 < #C000, "Buffer out of mem bank 2" +SCL_Buffer EQU $ + ASSERT SCL_Buffer+#701<#C000,"Buffer out of mem bank 2"