/* .----------------. .----------------. .----------------. .----------------. .----------------. .----------------. .----------------. .----------------. | .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. | | | _______ | || | ______ | || | _________ | || | ______ | || | _________ | || | _______ | || | _____ _____ | || | ____ ____ | | | | / ___ | | || | |_ __ \ | || | |_ ___ | | || | .' ___ | | || | | _ _ | | || | |_ __ \ | || ||_ _||_ _|| || ||_ \ / _|| | | | | (__ \_| | || | | |__) | | || | | |_ \_| | || | / .' \_| | || | |_/ | | \_| | || | | |__) | | || | | | | | | || | | \/ | | | | | '.___`-. | || | | ___/ | || | | _| _ | || | | | | || | | | | || | | __ / | || | | ' ' | | || | | |\ /| | | | | | |`\____) | | || | _| |_ | || | _| |___/ | | || | \ `.___.'\ | || | _| |_ | || | _| | \ \_ | || | \ `--' / | || | _| |_\/_| |_ | | | | |_______.' | || | |_____| | || | |_________| | || | `._____.' | || | |_____| | || | |____| |___| | || | `.__.' | || ||_____||_____|| | | | | || | | || | | || | | || | | || | | || | | || | | | | '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' | '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' */ /* 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 [ ] - Менять спектрумовскую палитру */ ; ; 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 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 ;*************************************** ; ; ; 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 ;*************************************** ; ; ; 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,5Ch RST ToDSS IN A,(SLOT3) LD (SAVE_SLOT3),A JP COMAND_LINE ERROR_FILE: LD HL,ERROR_FILE_MSG_X LD C,5Ch RST ToDSS LD HL,ONE_FILE LD C,5Ch RST ToDSS LD HL,ERROR_FILE_MSG JP EXIT_ALL END_CNF_ERROR: 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 ;--------------------------------------- ; POP HL 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 ;--------------------------------------- 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 INC HL INC HL CALL FIND_FILES 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 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 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 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: DB "ZX Spectrum PAGES",0 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 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: WORD 0,0,0,0,0,0,0,0 ;********************************************* CONTINUE: ; CNF файл прочитан, DE - длина CNF 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 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 ;************************************* 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 ; файлы считаны ;************************************* 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,CR_LINE LD C,Dss.PChars RST ToDSS ; LD A,(SAVE_SLOT3) ; OUT (SLOT3),A ;************************************* 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 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 ;************************************ 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,#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,#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 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 Z,EXIT_ALL JP SET_RELOAD_PROG ; LD HL,MSG_NORMAL ; JP EXIT_ALL ;*************************************************** ; JP 0 ;******************************************** SET_ROM: ; out B - old ROM-page DI ; PUSH BC ; PUSH AF ; LD A,CNF_0 ; OUT (SYS_PORT.ON),A ; LD A,10h ; LD BC,7FFDh ; OUT (C),A ; POP AF ; POP BC ; LD C,0F8h ; CALL 3D13h ; 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 EX AF,AF' IN A,(SLOT3) PUSH AF LD A,DCP_PAGE ; установить новую OUT (SLOT3),A LD A,(#C400) ; сохранить то что было LD L,A LD A,(#C600) LD H,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,L LD (#C400),A ; вернуть порт LD A,H LD (#C600),A ; вернуть порт POP AF OUT (SLOT3),A RET ;******************************************** READ_IMAGE: LD DE,ONE_FILE LD BC,128 LDIR LD HL,ONE_FILE LD A,1 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 C,Dss.Move_FP LD B,2 LD HL,0 LD IX,0 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 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 ;*************************************** ; освободить ram-disk e: .free_disk: DI LD A,0 LD C,BIOS.EMM_FN3 RST ToBIOS ; освободить e: ;!!!!!!!!!!!!!!!!!!!!!! ; назначать другой рамдрайв, свободный? ;*************************************** POP AF LD B,A ; запросить память у bios-а LD A,0 LD C,BIOS.EMM_FN2 ; и подсоединить к e: RST ToBIOS JR C,ERROR_NO_MEM LD (MEM_BLK),A ;--------------[new_code]--------------- ret ;--------------------------------------- Load_IMAGE_File: LD A,(IMAGE_HANDLER) LD C,Dss.Move_FP LD B,0 LD HL,0 LD IX,0 RST ToDSS ; установить указатель на 0 RET C LD HL,MSG_LOAD_IMAGE ; loading image LD C,Dss.PChars RST ToDSS LD A,(MEM_BLK) .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 LD A,0 LD B,0 LD C,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,128 LDIR LD HL,ONE_FILE OUT (SLOT3),A READ_FILE: LD A,1 LD C,Dss.Open RST ToDSS RET C ; ошибка, если нет файла LD (FILE_HANDLE),A LD A,(FILE_HANDLE) LD HL,0C000h LD DE,4000h 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_0 OUT (SYS_PORT.OFF),A ld a,(#FFF0) out (SLOT0),a LD B,3 ; IBM_PAL LD A,0 LD C,#A6 ; SET_standard_PAL RST ToBIOS LD A,3 ; OPEN_TXT LD B,0 LD C,#50 RST ToDSS LD C,#56 ; CLS LD DE,0 LD HL,#2050 LD B,7 LD A,#20 RST ToDSS LD HL,MSG_ZX_EXIT JP EXIT_ALL 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 jr z,EXIT_TO_DSS LD A,CNF_0 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 ; !HARDCODE далее всё наскоряк и захардкожено ; !TODO переделать под новую функцию дешифрации 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 + #25 ; CNF 2 ld (hl),a ld h,#c0 + #35 ; CNF 3 ld (hl),a out (c),b ;--------------------------------------- LD A,(Ret_zx_+2) LD B,A LD A,(Ret_fn_+2) XOR B LD B,A LD A,Conf_port.RET_PORT CALL SET_ROM ; включить возврат LD A,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 (C),A ; Scorpion-port = 0 LD BC,7FFDh 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 LD A,0 OUT (C),A ; CBL-off LD A,#12 ; FDD-720 LD C,BIOS.FN_TURBO RST #18 ;---------------[test!!!!!]------------- LD C,BIOS.HDD_PART ; IDE-1/IDE-2 LD A,0 ; --> IDE-1 RST #18 ;--------------------------------------- ;****************************** XOR A ; Set ZX-Palette LD B,2 LD C,#A6 RST 18h LD A,(Int_or_+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 HL,#4000 ; clear ZX-Spectrum screen LD DE,#4001 LD BC,#1AFF LD (HL),L LDIR LD HL,#4104 ; Screen-1 LD BC,#0480 LD E,0 RST #18 LD HL,#5104 ; Screen-2 LD BC,#0480 LD E,0 RST #18 XOR A OUT (RGADR),A OUT (RGMOD),A ;************************************************ ; Инициализация страниц DI LD A,0 OUT (SLOT0),A LD A,5 OUT (SLOT1),A XOR 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 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 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 ; JP #FF00 ;!!!!!!!!!! ;*************************************** PROG_STARTS: LD A,2 OUT (SLOT2),A LD A,E OUT (SYS_PORT.OFF),A ; System-port 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!!!' ; ; ; Если параметр задан, то выбирается значение 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 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: ds 128 ; ; ; ; IFDEF NEED_LOADER Loader_length EQU $-BEGIN ELSE Loader_length EQU 0 ENDIF ;----------------------------------------------[End Loader section] ; 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 ;