;------------[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 И ; ПЕРЕХОД ПО ПРЕРЫВАНИЮ В ОБРАБОТЧИК ПОЛЬЗОВАТЕЛЯ ЧЕРЕЗ процедуру на стэк, например SCF RET JPHL: JP (HL) ;--------------------------------------- ; ; _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ [___FOR ZX-MODE___] _ZX_ _ZX_ _ZX_ _ZX_ _ZX_ ; ; ;----------------------------[ FOR ZX-MODE ]----------------------------; IF BIOS_ZXMODE ;!HARDCODE на этот адрес #С0 прыгает в vROM Basic-48 по адресу #3CF0 ; можно попробовать переделать этот адрес там _mInfoBLOCK #C0-$,0 ;BEGIN: ; Вход через USR 15600 RET_FROM_BIOS_TO_BASIC48: CALL CH_2 CALL COMAND_LINE ; ВЫПОЛНЕНИЕ КОМАНДЫ, ЕСЛИ ЕСТЬ ; Вход без команды JP SW_ROM_1 ; ВОЗВРАТ В << MAIN MENU >> ;-----------------------------------------------------------------------; ; ; ;----------------------------[ ??????????? ]----------------------------; ; TURBO_OFF: ; LD A,D_TBOFF ; OUT (SYS_PORT.ON),A ; RET ; ; TURBO_ON: ; LD A,D_TBON ; OUT (SYS_PORT.ON),A ; RET ; ; JP_HL: JP (HL) ; ;PRINT_LINE: ; LD A,(HL) ; INC HL ; CP 0FFh ; RET Z ; RST 10H ; JR PRINT_LINE ; ; JP RESET_128 ;-----------------------------------------------------------------------; ; ;-----------------------------------------------------------------------; ; ******* SERVICE ******* ;-----------------------------------------------------------------------; ;------[ ДЕШИФРАЦИЯ КОМАНДНОЙ СТРОКИ,ПЕРЕДАННОЙ ДЛЯ "EXPANSION" ]-------; COMAND_LINE: LD HL,(#5C5D) ;!HARDCODE CH_ADR COMAND_LOOP: LD A,(HL) INC HL CP ":" JR Z,COMAND_L1 CP #0D JR NZ,COMAND_LOOP RET COMAND_L1: LD A,(HL) CP #EA ;!HARDCODE RET NZ INC HL COMAND_OK: ; ОБНАРУЖЕНА КОМАНДА ДЛЯ 'expansion' LD A,(HL) INC HL CP ':' JP Z,MENU_S1 CP #0D JP Z,MENU_S1 CP 'I' JR Z,COMAND_ISD CP 'i' JR Z,COMAND_ISD CP 'T' JR Z,TASK_SWITCH CP 't' JR Z,TASK_SWITCH DEC HL POP BC JP BASIC_MENU MENU_S1: POP BC CALL SERVICE JP SW_ROM_1 COMAND_ISD: LD A,(HL) INC HL CP 'S' JP Z,COMAND_ISD2 CP 's' JP Z,COMAND_ISD2 RET COMAND_ISD2: POP BC CALL ISDOS JP SW_ROM_1 TASK_SWITCH: ; *** Сохранить задачу *** PUSH IY PUSH IX PUSH AF PUSH BC PUSH DE PUSH HL EXX EX AF,AF' PUSH AF PUSH BC PUSH DE PUSH HL LD A,R PUSH AF LD A,I PUSH AF LD A,(HL) RLCA RLCA RLCA RLCA AND 30H ; новая задача 0..3 LD C,A IN A,(SLOT3) LD B,A ; 3-я страница текущей задачи LD A,SYS_PAGE OUT (SLOT3),A LD IX,SYS_PAGE.TASK_DATA ; данные задач LD E,(IX) ; старая задача LD D,0 ADD IX,DE ; данные текущей задачи LD E,16 ADD IX,DE ; смещение данных в таблице задач LD (IX+1),B ; сохранить страницу 3 LD HL,0 ADD HL,SP LD (IX+2),L ; сохранить стек задачи LD (IX+3),H SET 0,(IX) ; установить флаг сохраненности текущей задачи RES 1,(IX) ; установить флаг, что задача покинута LD IX,SYS_PAGE.TASK_DATA LD E,C LD D,0 ADD IX,DE ; новая задача LD E,16 ADD IX,DE ; смещение данных в таблице задач BIT 1,(IX) ; JR NZ,TASK_IN_WORK ; задача в работе ??? неверное завершение ; сбрасывать или просто возвращаться BIT 0,(IX) ; была сохранена/нет JR NZ,TASK_SET ; задача существует ; задачи не было! LD IX,SYS_PAGE.TASK_DATA LD A,C ; задача LD (IX),A ; установить новую задачу текущей JP SPECTRUM_TASK ; запустить новую задачу! ; и пока пофиг распределение памяти! TASK_SET: LD IX,TASK_RESTORE LD A,C EXX JP INIT_PAGES ; переключить все страницы! TASK_RESTORE: EXX LD A,SYS_PAGE OUT (SLOT3),A LD A,C LD IX,SYS_PAGE.TASK_DATA LD (IX),A ; установить новую задачу текущей LD E,A LD D,0 ADD IX,DE ; новая задача LD E,16 ADD IX,DE LD L,(IX+2) ; вспомнить стек LD H,(IX+3) LD SP,HL LD A,(IX+1) ; вспомнить третью страницу OUT (SLOT3),A POP AF ; восстановить LD I,A POP AF LD R,A POP HL POP DE POP BC POP AF EX AF,AF' EXX POP HL POP DE POP BC POP AF POP IX POP IY ; вернуться в задачу NO_TASK: POP BC JP SW_ROM_1 ; 259F - ADRESS BASIC128 - MAIN_MENU ;-----------------------------------------------------------------------; ;-----------------------------------------------------------------------; ; *** UTILITES *** ;-----------------------------------------------------------------------; ; C_0030: ; получить раб обл ; CALL_48X 0030h ; RET C_19E8: ; очистить раб обл CALL_48X #19E8 ;!HARDCODE RET C_1655: ; получить пространство CALL_48X #1655 ;!HARDCODE RET CLS: C_0D6B: CALL_48 #0D6B ;!HARDCODE RET CH_2: LD A,2 C_1601: ; OPEN CHANEL CALL_48 #1601 ;!HARDCODE RET INCLUDE '../exp/ZX_MENU.ASM' INCLUDE '../exp/ZX_MODE.ASM' ENDIF ;-----------------------------------------------------------------------; ; _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-$,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-$,0 IF BIOS_ZXMODE /* ;BEGIN: ; Вход через USR 15600 RET_FROM_BIOS_TO_BASIC48: CALL CH_2 CALL COMAND_LINE ; ВЫПОЛНЕНИЕ КОМАНДЫ, ЕСЛИ ЕСТЬ ; Вход без команды JR SW_ROM_1 ; ВОЗВРАТ В << MAIN MENU >> */ ENDIF ;JMP_48: ; LD HL,00h ; JR JP_HL_48 ; ; NOP ; NOP ; NOP ;*************************************** _mInfoBLOCK #3CF8-$,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 ;*************************************** ;*************************************** ; BLOCK #3D17-$,FF ; !TODO можно оприходовать тут 233 байта ; ;*************************************** ;*************************************** _mInfoBLOCK #3E00-$,#FF ;DOS_OFF: DI PUSH AF PUSH BC LD BC,(#5BFF) ; !HARDCODE LD A,#C9 LD (#5BFF),A ; !HARDCODE CALL #5BFF ; !HARDCODE LD (#5BFF),BC ; !HARDCODE POP BC 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 ;*************************************** ; ;---------------[SET BIOS]--------------- _mInfoBLOCK ToBIOS_FromEXT-$,#FF ; #3FD0 ; call BIOS from EXTENSION ;RST18h: PUSH AF LD A,ROM.BIOS ; set exp-rom to slot0 OUT (SYS_PORT.ROM),A POP AF RET ;--------------------------------------- ;--------[ From TR-DOS to HDD part2]-------- _mInfoBLOCK #3FD8-$,#FF TRDOS_HD_CMD: POP AF SET 6,C ;!FIXIT переделать ПЗУ трдоса и спектрумов под правильный вызов функций биоса (а не вместо функций 4x функции 0x) 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 эта точка входа очень странная из страницы в страницу прыгает ;---------[ From TR-DOS to HDD ]-------- _mInfoBLOCK #3FF0-$,255 RET_TO_TRDOS: PUSH AF DI LD A,ROM.BIOS OUT (SYS_PORT.RAM),A JR TRDOS_HD_CMD ; тут не хватило места в 1 байт, чтоб сразу сделать JP ;--------------------------------------- ;-----[???????????????????????????]----- _mInfoBLOCK #3FF8-$,255 A3FF8: PUSH AF LD A,ROM.BIOS OUT (SYS_PORT.RAM),A ; !FIXIT может убрать заглушку и сделать, чтоб переключалось на BIOS и дальше как в EXP_FNS_RET ? ; или своего чего-нибудь добавить. JP #0000 ;--------------------------------------- _mInfoBLOCK #4000-$,255 ;=======================================