;------------[Begin of ROM]------------- ROM_START: DI HALT ;--------------------------------------- ;--------------[checksum]--------------- BLOCK 4-$,#FF Check_Sum: DB #FF,#FF,#FF,#FF ; место для контрольной суммы ;--------------------------------------- BLOCK #10-$,#FF RET ;--------------------------------------- ;!TODO прикрутить к ROM.BIOS ;----------------[int]------------------ BLOCK #38-$,#FF ; INT: PUSH BC ; PUSH AF ; LD C,SLOT3 ; IN B,(C) ; LD A,SYS_PAGE ; OUT (C),A ; LD A,(SYS_PAGE.INT_ID) ; CP #AA ; JR Z,YESINT ; OUT (C),B ; JR NOINT ; YESINT: PUSH HL ; LD HL,(SYS_PAGE.INT_ADRESS) ; LD A,H ; OR L ; LD A,(SYS_PAGE.INT_PAGE) ; OUT (C),B ; CALL NZ,EXTINT ; POP HL ; NOINT: POP AF ; POP BC EI RETI ;--------------------------------------- ;----------------[NMI]------------------ _mInfoBLOCK #66-$,#FF NMI: RETN ;--------------------------------------- ; ;!FIXIT перенести в ROM.BIOS и сделать ; ; так, чтоб могла правильно прыгать в ; ; любые слоты и работать с DSS ; ;----------------[int]------------------ ; EXTINT: OR A ; RET Z ; ;LD C,SLOT1 ; BIT 7,H ; JR Z,.L2 ; LD C,SLOT2 ; BIT 6,H ; JR Z,.L1 ; LD C,SLOT3 ; .L1: IN B,(C) ; PUSH BC ; OUT (C),A ; CALL .JPHL ; POP BC ; OUT (C),B ; RET ; ; проверка на нулевой слот ; .L2: BIT 6,H ; LD C,SLOT1 ; JR NZ,.L1 ; продолжаем если ненулевой слот ; ; ВОТ ТУТ МОЖНО ВЛУПИТЬ ПРОЦЕДУРУ ДЛЯ ПОДСТАНОВКИ СТРАНИЦЫ В SLOT0 И ; ; ПЕРЕХОД ПО ПРЕРЫВАНИЮ В ОБРАБОТЧИК ПОЛЬЗОВАТЕЛЯ ЧЕРЕЗ процедуру на стэк, например ; IF TEST_INT ; LD HL,-.stackDepth - .switchProcedure.size + .patch+2 ; ADD HL,SP ; PUSH HL ; LD HL,-.stackDepth - .switchProcedure.size ; memory stack use! ; ADD HL,SP ; stack ; PUSH HL ; адрес программы .readProcedure ; LD DE,.switchProcedure ; перенести программу на стек ; EX DE,HL ; LD BC,.switchProcedure.size ; LDIR ; RET ; ; процедура, переносимая на стек для вызова прерывания пользователя из SLOT0 ; ; осторожнее с PUSH, если надо много, то увеличивай .stackDepth ; .switchProcedure: ; DEC DE ; POP HL ; LD (HL),E ; INC HL ; LD (HL),D ; LD C,SLOT0 ; IN B,(C) ; PUSH BC ; OUT (C),A ; XOR A ; OUT (SYS_PORT.RAM),A ; .patch EQU $+1-.switchProcedure ; CALL .JPHL ; DI ; XOR A ; OUT (SYS_PORT.ROM),A ; POP BC ; OUT (C),B ; RET ; .JPHL: JP (HL) ; .stackDepth EQU 32 ; расстояние от конца процедуры до вершины стека. ; .switchProcedure.size EQU $-.switchProcedure ; ELSE ; SCF ; RET ; .JPHL: JP (HL) ; ENDIF ;--------------------------------------- /* */ ; ; _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ [___FOR ZX-MODE___] _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ ; ; ;----------------------------[ FOR ZX-MODE ]----------------------------; ;!HARDCODE на этот адрес #С0 прыгает в vROM Basic-48 по адресу #3CF0 ; можно попробовать переделать этот адрес там _mInfoBLOCK #C0-$,#FF ;!TEST 0 INCLUDE 'ZX/ZX_FUNC.ASM' INCLUDE 'ZX/ZX_MENU.ASM' ;-----------------------------------------------------------------------; ; _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ ; ; ;-------------[#1000 SETUP]------------- ShowInfo 'Setup block of ROM start', 0 ; !!!!! test BLOCK_Setup EQU $ ; IF PACKED_MAIN BLOCK ROM_MAP.SETUP-$,#FF DISP COMPILE_ADDR.SETUP ; Depacker version SETUP_MAIN: LD HL,DEPACKER.UnpackedEXECaddr; точка входа в распакованном коде PUSH HL LD DE,DEPACKER.WorkAddr ; адрес процедуры депакера PUSH DE LD HL,DEPACKER.Addr LD BC,DEPACKER.Length LDIR LD HL,DEPACKER.PackedMAIN ; где архив LD DE,DEPACKER.UnpackAddr ; куда распаковывать RET .Depacker EQU $ ENT ;-----------------[v] DEPACK_DATA: DISP DEPACKER.WorkAddr MODULE UnPacker INCLUDE 'src/bios/ROM/SETUP/DEHRUST.asm' ; !TODO сделать на LUA автовыбор декомпрессора и компрессора PackedMAIN: INCBIN 'Build/Bin/temp/MAIN.PAK' ENDMODULE ENT DEPACK_DATA.length EQU $-DEPACK_DATA ;-----------------[^] ELSE DISP COMPILE_ADDR.SETUP ShowInfo 'Setup block DISP start', 1 ; !!!!! test SETUP_MAIN: INCLUDE 'src/bios/ROM/SETUP/Main.asm' ShowInfo 'Setup block DISP end', 1 ; !!!!! test ENT ENDIF ShowInfo 'Setup block of ROM end', 0 ; !!!!! test BLOCK_Setup.Length EQU $-BLOCK_Setup ;--------------------------------------- ; ; ; !FIXIT сделать эти фиксированные адреса отдельным файлом и с IF/ELSE и подключать их потом куда надо. ; ;????? посмотреть ;----------------------------------------------------------------------; ; BLOCK #3CC0-$,255 ; no-magics! ;MAGIC_1: ; ЗАГЛУШКА ДЛЯ MAGIC ; PUSH AF ; LD A,ROM.EXT ; OUT (SYS_PORT.OFF),A ; POP AF ; JP MAGIC_1 ;MAGIC_3: ; PUSH AF ; LD A,ROM.EXT ; OUT (SYS_PORT.OFF),A ; POP AF ; RETN ;MAGIC_2: ;; CALL MG_BEGIN ; JR MAGIC_3 ;************************* _mInfoBLOCK #3CE0-$,#FF ;!TEST 0 ;SW_ROM_1: LD HL,#259F ;!HARDCODE Show Main Menu in BASIC-128 PUSH HL LD HL,#5B00 ;!HARDCODE LD A,(HL) CP #F5 ; #F5 - опкод 'PUSH AF'. Проверяется то ли в #5B00 JR Z,JP_HL_48 ; ВОЗВРАТ К МЕНЮ BASIC128 POP HL JR SW_ROM ; ПРОСТОЙ ВОЗВРАТ ;************************* _mInfoBLOCK #3CF0-$,#FF ;!TEST 0 ;JMP_48: ; LD HL,00h ; JR JP_HL_48 ; ; NOP ; NOP ; NOP ;*************************************** _mInfoBLOCK #3CF8-$,#FF ;!TEST 0 ; no basic-48! JP_HL_48: PUSH HL SW_ROM: PUSH AF LD A,ROM.BIOS OUT (SYS_PORT.RAM),A POP AF RET ;*************************************** ;----------------------------------------------------------------------; ; ;!TODO спектрумовские утилиты ;----------------------------------------------------------------------; ; _mInfoBLOCK #3CFA-$,#FF ; LD A,0 ;!HARDCODE ; OUT (SYS_PORT.OFF),A ; POP AF ;----------------------------------------------------------------------; ; ; ;----------------------------------------------------------------------; _mInfoBLOCK #3D00-$,#FF ;DOS_ON: NOP RET ;*************************************** ;*************************************** ; BLOCK #3D02-$,FF ; !TODO можно оприходовать тут 17 байтов ; ;*************************************** ;*************************************** _mInfoBLOCK #3D13-$,#FF NOP ;JP ToBIOS_18 CALL ToBIOS_FromEXT JP DOS_OFF ;*************************************** ;*************************************** ; BLOCK #3D17-$,FF ; !TODO можно оприходовать тут 233 байта ; ;*************************************** ;*************************************** _mInfoBLOCK #3E00-$,#FF ;DOS_OFF: PUSH AF LD A,R DI PUSH AF PUSH BC ; LD BC,(#5BFF) ; !HARDCODE LD A,#C9 ; Opcode RET LD (#5BFF),A ; !HARDCODE CALL #5BFF ; !HARDCODE LD (#5BFF),BC ; !HARDCODE ; POP BC POP AF JP PO,.no_EI EI .no_EI: POP AF RET ;*************************************** ;*************************************** ; BLOCK #3E16-$,FF ; !TODO можно оприходовать тут 10 байтов ; ;*************************************** ; ; ;--------------------------------------- ; _mInfoBLOCK #3FC6-$,#FF ;!FIXIT переделать ПЗУ трдоса и спектрумов под правильный вызов функций биоса (а не вместо функций 4x функции 0x) ; или можно добавить функции ; TRDOS_HD_CMD: ; ; LD A,C ; ; OR #40 ; ; LD C,A ; POP AF ; SET 6,C ; RST_to_BIOS ; JR RET_TO_TRDOS ;--------------------------------------- ; ;--------------[GOTO BIOS]-------------- ; call BIOS from EXTENSION _mInfoBLOCK #3FD0-$,#FF ; ToBIOS_FromEXT PUSH AF LD A,ROM.BIOS ; set BIOS to slot0 OUT (SYS_PORT.ROM),A POP AF RET ;--------------------------------------- ;!FIXIT переделать ПЗУ трдоса и спектрумов под правильный вызов функций биоса (а не вместо функций 4x функции 0x) ;--------[ From TR-DOS to HDD part2]-------- _mInfoBLOCK #3FD8-$,#FF TRDOS_HD_CMD: POP AF SET 6,C RST_to_BIOS JR RET_TO_TRDOS ;--------------------------------------- ;!FIXIT остатки от тестов Ивана со звуковой картой ;-------------[SND_TEST_RET]------------- _mInfoBLOCK #3FE0-$,#FF ; SND_TEST_RET: ; LD A,ROM.BIOS ; OUT (SYS_PORT.RAM),A ; ;JP SOUND_TEST ; JP #0000 ;--------------------------------------- ;------------[HDD_5x portal]------------ ; точка входа/выхода для функций 5х из BIOS _mInfoBLOCK #3FE8-$,#FF ;RET_TO_EXP: ; PUSH AF ; LD A,ROM.BIOS ; OUT (SYS_PORT.ROM),A ; JP HDD_FN_5x ;--------------------------------------- ;!FIXIT Можно поправить номера функций при вызовах из TR-DOS и прыгать сразу в BIOS ;-------[ From TR-DOS to API 4x ]------- _mInfoBLOCK #3FF0-$,#FF RET_TO_TRDOS: PUSH AF DI LD A,ROM.BIOS OUT (SYS_PORT.RAM),A JR TRDOS_HD_CMD ; тут не хватило места в 1 байт, чтоб сразу сделать JP ;--------------------------------------- ;-----[???????????????????????????]----- _mInfoBLOCK #3FF8-$,#FF ; PUSH AF ; LD A,ROM.BIOS ; OUT (SYS_PORT.RAM),A ; JP #0000 ;--------------------------------------- _mInfoBLOCK #4000-$,#FF ;=======================================