;[BEGIN] ;//MODULE: DSETUP, Main module of BIOS SETUP & BOOTSTRAP ;//CREATE: ??-??-???? AUTHOR: Denis Parinov ;//UPDATE: 23-04-2001 DNS Remake for Sp2000 mainboard ;--------------------------------------------------------------- ;Rev Date Name Description ;--------------------------------------------------------------- ;R08 04-03-2002 DNS Disabled Open TRDOS ;R07 16-02-2002 DNS Add routine for check CMOS clock registers. ;R06 28-01-2002 DNS Add new items to SETUP Utility for screen position. ;R05 01-10-2001 DNS Found BUG with size of boot messages, messages for secondary ; IDE were removed. (BUG NOT FIXED!) --- ты ошибаешься, друг мой))) ;R04 14-09-2001 DNS Added procedure GET_BOARD_NUMBER ;R03 30-07-2001 DNS Developed a new IDE DETECT routine and fixied any bugs ;R02 25-07-2001 DNS Add Secondary IDE ;R01 23-04-2001 DNS Removed procedure GET_ID and make new which ; will be take Model Name. ;--------------------------------------------------------------- ;Memory dump ; !TODO переделать ;#0000-#3FFF : STANDART ROM BIOS ;#4000-#7BFF : NOT USED MEMORY ;#7C00-#7C7F : SYSTEM JUMP RESIDENT ;#7C80-#7DFF : NOT USED MEMORY ;#7E00-#7FFF : SECTOR BUFFER AND TEMPORY AREA ;#8000-#8002 : SETUP ENTRY POINT ;#8003-#80F0 : STACK FRAME ;!!!!! посмотреть ;#80F1-#80FD : NOT USED MEMORY ;#80FE-#80FF : INTERRUPT ADDRESS ;#8000-#B3FF : SETUP AND BOOT PROGRAM ;#B400-#BAFF : BOOT MESSAGES ;!!!!! посмотреть ;#B900-#BEFF : SETUP MESSAGES AND ITEMS ;!!!!! посмотреть ;#BF00-#BFFF : STACK FRAME ;!!!!! посмотреть! ;#C000-#D8FF : NOT USED MEMORY ;---DELETED--- #D900-#FFFF : UNPACKED LOGOTYPE ;System page(#FE) dump ;#F000-#F007 : db "RESTART",0 ;First start identificator ;#F008-#F00F : db hour,min,sec,day,month,century,year,reserved ; PowerOn date ;#F010-#F017 : db hour,min,sec,day,mouth,century,year,reserved ; Reboot date ; ;#FEE0-#FEEF : Any buffer (Video mode set?!) Used in Sprinter DOS and CD driver ;#FF00 ; ; для варианта с запаковкой части бинарника (может не сработать без напильника за давностью лет) IFDEF PREBUILD ; ENCODING "DOS" DEVICE ZXSPECTRUM4096 ; модель с 4 метрами памяти MMU 2 e, 0 ; страница 0 в банку 2 и проверка на границы. INCLUDE 'src/bios/shared/includes.inc' ORG COMPILE_ADDR.MAIN OUTPUT 'Build/Bin/temp/MAIN.BIN' ENDIF ;SYS_PAGE.RAMD_KEYS EQU #C180 ; ключи RAM-Disks ;RAMD_KEY_NUM EQU 16 ;SYS_PAGE EQU #FE ; страница с системными переменными BIOS ;SYS_PORT_ON EQU #7C ;SYS_PORT_OFF EQU #3C ;STACK EQU #80F0 ;PAGE0 EQU #82 ;PAGE1 EQU #A2 ;PAGE2 EQU #C2 ;SLOT3 EQU #E2 ;Y_PORT EQU #89 ;SYSPAGE EQU #FE ;INT EQU #80 ;ITMADDR EQU MSG_Items_Buffer ;ITMTABS EQU #BA00 ;!!!!! b900 ;ITMTABS EQU ITMADDR ;FDD EQU #03 ;!FIXIT нормально прописать TEMP EQU #7800 ; !HARDCODE OS_LOAD.SectorSizeAddr EQU TEMP-2 IDENTIFY_DEVICE_BUFFER _ATA_IDENTIFY_DEVICE_DATA = TEMP MEMMAP2 EQU TEMP ; должно быть выровнено по ALIGN 256 TPOINTD EQU TEMP - SYS_PAGE.RAMD_KEYS.NUM; - SYS_PAGE.Sp_RAMD_KEYS.NUM ; [x] 4/11/2023 ASSERT (low TEMP = 0) or (low MEMMAP2 = 0), "ERROR Align 256!!!" ;██████████████████████████████████████████████████████████████████████████████████████████████████████████████; ;SETUP_MAIN: MAIN_START: ; POP AF ; POP HL LD SP,STACK PUSH HL LD (RET_TO_EXP_ADDR),HL JP START ; DB "(C) 2002 PETERS PLUS LTD " RET_TO_EXP_ADDR: WORD 0000 ; place for save ret address to exp ; ;------------------- ;!!!!! посмотреть ; Значения времени и даты в кмос записаны десятичными значениями ; и в регистре A на выходе из функции #F6 (CMOS_RD) BIOS значения десятичные. GETTIME: PUSH HL LD D,CMOS.Register.hours CALL CMOS_RD CP #24 ;24 jp nc,.error LD (HL),A INC HL LD D,CMOS.Register.minutes CALL CMOS_RD CP #5A ; 60 jp nc,.error LD (HL),A INC HL LD D,CMOS.Register.seconds CALL CMOS_RD CP #5A ; 60 jp nc,.error LD (HL),A INC HL LD D,CMOS.Register.date ; число CALL CMOS_RD CP #32 jp nc,.error LD (HL),A INC HL LD D,CMOS.Register.month CALL CMOS_RD CP #13 ;13 jp nc,.error LD (HL),A INC HL LD D,CMOS.Register.century CALL CMOS_RD CP #1A ;20 jp c,.error CP #9A ;100 jp nc,.error LD (HL),A INC HL LD D,CMOS.Register.year CALL CMOS_RD CP #9A ;100 jp nc,.error LD (HL),A ; DEC HL ; LD C,A ; LD A,19 ; CP (HL) ; RET Z ; LD A,20 ; CP (HL) ; RET Z ; LD A,80 ; CP C ; LD A,20 ; JR NC,.correct_century ; LD A,19 ; .correct_century: ; LD (HL),A ; LD D,#32 ;CENTURY ; LD C,#F7 ; !HARDCODE ; RST_to_BIOS_18 POP HL RET .error: LD HL,.default_date POP DE LD BC,7 LDIR ;---[] ;!FIXIT CALL CMSERR ; LD HL,.default_date ; call writeDateTimeToCmos ;---[] ld a,#FF ld (ERRSUM.ErrDateTime),a RET LUA ALLPASS sj.insert_define("Current_CENTURY", math.modf(tonumber(os.date("%Y"))/100)) sj.insert_define("Current_YEAR", tonumber(os.date("%y"))) sj.insert_define("Current_MONTH", tonumber(os.date("%m"))) sj.insert_define("Current_DATE", tonumber(os.date("%d"))) ENDLUA .default_date: BYTE 0,0,0 ; Hours, minutes, seconds BYTE #Current_DATE BYTE #Current_MONTH BYTE #Current_CENTURY BYTE #Current_YEAR UNDEFINE Current_DATE UNDEFINE Current_MONTH UNDEFINE Current_CENTURY UNDEFINE Current_YEAR ;-------------------------------- ; ;R07 ; !FIXIT CMOS сделать согласно доке на кмос ; если батарейка села, то при чеке кмоса выдавать соответствующую ошибку и, возможно, работать как без кмоса. CMOSINIT: LD D,CMOS.Register.CTRLregA ; !FIXIT FREQ CALL CMOS_RD CP #26 ; !FIXIT JR NZ,CMSERR LD D,CMOS.Register.CTRLregC CALL CMOS_RD CP #50 RET Z CMSERR: LD D,CMOS.Register.CTRLregB LD A,#82 ;TIME FORMAT ; !FIXIT CMOS CALL CMOS_WR LD D,CMOS.Register.CTRLregA LD A,#26 ; !FIXIT CMOS FREQ CALL CMOS_WR LD D,CMOS.Register.CTRLregC LD A,#0 ; !FIXIT CMOS CALL CMOS_WR LD HL,GETTIME.default_date call writeDateTimeToCmos LD D,CMOS.Register.CTRLregB LD A,#02 ;TIME FORMAT ; !FIXIT CMOS CALL CMOS_WR ; LD D,13 ; LD A,#80 ; !FIXIT CMOS ; LD C,#F7 ; !HARDCODE ; RST_to_BIOS RET CLEAR_MEM: IN A,(SLOT3) PUSH AF LD A,SYS_PAGE OUT (SLOT3),A ; очищаем буфер RAM Table LD HL,MEMMAP2 LD DE,MEMMAP2+1 LD BC,255 LD (HL),0 LDIR ; копируем ZX vROM LD HL,(SYS_PAGE.Block_ID.vROM) ; нужно значение в L LD H,high SYS_PAGE.RAM_TABLE LD D,high MEMMAP2 ;LD BC,#01FF ;!HARDCODE 1 vROM RAM BLOCK ID CALL COPY_CHAIN ; LD IX,SYS_PAGE.Block_ID.vROM ; LD H,high SYS_PAGE.RAM_TABLE ; LD D,high MEMMAP2 ; LD BC,#01FF ;!HARDCODE 1 vROM RAM BLOCK ID ; CALL .SAVE_RMD ; [x] 28/09/2024 Отдельные рамдиски для режима спектрума и DSS. LD B,high BIOS.SWAP_RAM_DRIVES.Sp2000 CALL SWAP_RAM_DRIVES ; нужно ли сохранять рамдиски при перезапуске? LD BC,CMOS_CELL.BootUpParams.Mask.SaveRAMdisks ;#400E CALL GET_CMOS_VALUE OR A PUSH AF JR Z,.skip_save_rmd ; ; save RAM disks on reboot when memory is cleared LD HL,SYS_PAGE.RAMD_KEYS LD DE,TPOINTD LD BC,SYS_PAGE.RAMD_KEYS.NUM LDIR ; [x] 4/11/2023 ; LD HL,SYS_PAGE.Sp_RAMD_KEYS ; LD BC,SYS_PAGE.Sp_RAMD_KEYS.NUM ; LDIR ; ; копируем RAM диски Sprinter mode LD IX,SYS_PAGE.RAMD_KEYS ;RAM DISKS LD H,high SYS_PAGE.RAM_TABLE LD D,high MEMMAP2 LD BC,SYS_PAGE.RAMD_KEYS.NUM*256+#FF CALL SAVE_CHAINS ; [x] 4/11/2023 ; LD IX,SYS_PAGE.Sp_RAMD_KEYS ; LD B,SYS_PAGE.Sp_RAMD_KEYS.NUM ; CALL .SAVE_RMD ; .skip_save_rmd: CALL EMM.InitMem LD HL,MEMMAP2 LD DE,SYS_PAGE.RAM_TABLE CALL RESTORE_CHAINS POP AF JR Z,.skip_restore_rmd ; LD BC,CMOS_CELL.BootUpParams.Mask.SaveRAMdisks ;#400E ; CALL GET_CMOS_VALUE ; OR A ; JR Z,.skip_restore ; LD HL,TPOINTD LD DE,SYS_PAGE.RAMD_KEYS LD BC,SYS_PAGE.RAMD_KEYS.NUM LDIR ; .skip_restore_rmd: POP AF OUT (SLOT3),A ; [x] 04/11/2023 Отдельные рамдиски для режима спектрума и DSS. ; LD B,high BIOS.SWAP_RAM_DRIVES.Sp2000 ; JP SWAP_RAM_DRIVES RET ; ; SAVE_CHAINS: LD A,(IX) ; INC IX ; OR A ; LD L,A ; CALL NZ,COPY_CHAIN ; DJNZ SAVE_CHAINS ; RET ; ; ; ; before_intPointer EQU $ ; BLOCK #FF - low $,0 ; выравнивание на #xxFF ; INT_POINTER: WORD 0 ; ASSERT +low INT_POINTER = #FF, 'ERROR! Not valid interrupt pointer!' ; IFDEF PREBUILD ; ASSERT INT_POINTER-before_intPointer < 16, 'Warning! To much space before INT_POINTER.' ; ELSE ; IF INT_POINTER-before_intPointer > 16 ; DISPLAY 'Warning! To much space before INT_POINTER: ',/D,INT_POINTER-before_intPointer ; ENDIF ; ENDIF ; INT_HANDLER: ; PUSH AF ; EX AF,AF' ; PUSH AF ; PUSH BC ; PUSH DE ; PUSH HL ; EXX ; PUSH BC ; PUSH DE ; PUSH HL ; PUSH IX ; PUSH IY ; CALL KEYSCAN ; POP IY ; POP IX ; POP HL ; POP DE ; POP BC ; EXX ; POP HL ; POP DE ; POP BC ; POP AF ; EX AF,AF' ; POP AF ; EI ; RETI ; ; INT_OFF: DI LD A,#3F LD I,A IM 1 RET ; INT_ON: DI LD A,+high INT_POINTER LD I,A LD HL,INT_HANDLER LD (INT_POINTER),HL IM 2 EI RET ; ; ;------------------------[go to spectrum from bios]---------------------; EXIT_SETUP: CALL INT_OFF CALL TRD_MOUNT ; !TEST 24/09/2024 перенос в EXIT_SETUP (перед запуском ZX) CALL SetUp_ZX_HDD ; IF FREE_ZX_PAGES LD A,Spec_Page OUT (SLOT3),A ; LD A,(Spec_Page.flag_Z) CP 'Z' LD A,(Spec_Page.flag_X) LD B,A LD A,SYS_PAGE OUT (SLOT3),A LD A,B JR NZ,.Set_Page41 CP 'X' .Set_Page41: CALL NZ,ZXMODE_SETUP.Set_Page41 .set_ZX_params: LD BC,CMOS_CELL.QuickStartSetUp.Mask.ZxRom CALL GET_CMOS_VALUE LD L,A LD BC,CMOS_CELL.QuickStartSetUp.Mask.Hardware CALL GET_CMOS_VALUE ; EX AF,AF LD A,ROM.EXTENSION OUT (SYS_PORT.ROM),A EX AF,AF OR A JP Z,SPRINTER_ZX.custom_ROM DEC A JP Z,Pentagon_48.custom_ROM DEC A JP Z,PENTAGON_128.custom_ROM DEC A JP Z,PENTAGON_512.custom_ROM DEC A JP Z,SCORPION_256.custom_ROM DEC A JP Z,ZX_Spectrum_48.custom_ROM DEC A JP Z,ZX_SPECTRUM_128.custom_ROM ; error XOR A OUT (SYS_PORT.ROM),A LD D,CMOS_CELL.QuickStartSetUp ; обнуляем параметр на всякий случай CALL CMOS_WR ; CALL ScreenPOS.CRLF LD A,msgStrings.errorZXmode LD E,COLORS.CGA.INK.RED CALL POSTMSC .loop_di: DI HALT JR .loop_di SetUp_ZX_HDD: LD D,CMOS_CELL.TRDOSmount CALL CMOS_RD AND %1010'1010 ; маска для 4-х HDD RET Z ; find first good partition ; ; чистка переменных ZX HDD IN A,(SLOT3) EX AF,AF LD A,SYS_PAGE OUT (SLOT3),A ; XOR A LD H,A LD L,A LD (SYS_PAGE.CURRENT_DIR_SEC_L),HL LD (SYS_PAGE.CURRENT_DIR_SEC_H),HL DEC A LD (SYS_PAGE.CURRENT_HDD),A LD (SYS_PAGE.CURRENT_DIR_DRIVE),A LD (SYS_PAGE.CURRENT_DIR_DRIVE_COPY),A ; EX AF,AF OUT (SLOT3),A EX AF,AF ; XOR A .loop: PUSH AF CALL FN_HDD_PART POP BC RET NC LD A,B INC A CP #10 JR C,.loop RET ;-----------------------------------------------------------------------; INSTALL: CALL INT_ON CALL SET_CGA XOR A OUT (BorderColor),A LD IX,win_descriptor.tab80x32 CALL WIN_OPEN.SCR1 LD DE,0 LD HL,#2050 LD B,7 CALL LP_CLS_WIN LD DE,0 LD HL,#0820 LD B,0 CALL LP_CLS_WIN CALL SETLAND CALL GET_ID LD DE,#0028 ; !HARDCODE CALL LP_SET_PLACE LD HL,memBUFFER.ID LD A,COLORS.CGA.INK.LCYAN CALL CPRINTZ ; LD HL,BUILD ; LD A,COLORS.CGA.INK.LCYAN ; CALL CPRINTZ LD DE,#0128 ; !HARDCODE CALL LP_SET_PLACE LD A,msgStrings.copyRightPeters LD E,COLORS.CGA.INK.LGREEN CALL POSTMSC LD DE,#0228 ; !HARDCODE CALL LP_SET_PLACE LD A,msgStrings.copyRightSPTeam LD E,COLORS.CGA.INK.GREEN CALL POSTMSC IF BETA_BUILD > 0 LD DE,#0328 CALL LP_SET_PLACE LD A,msgStrings.testBIOSmsg LD E,COLORS.CGA.FLASH + COLORS.CGA.INK.RED CALL POSTMSC ENDIF IN A,(SLOT3) PUSH AF LD A,SYS_PAGE OUT (SLOT3),A LD HL,RebootDate CALL GETTIME POP AF OUT (SLOT3),A RET RESTART_ID: .str: DZ "RESTART" .size EQU $ - RESTART_ID.str Start_again: LD SP,STACK-2 START: DI PUSH AF XOR A LD (ERRSUM),A LD (ERRSUM.ErrDateTime),A ; LD A,R ; reg R bit7 - признак запуска с отработкой лоадера конфы (из SET_CONFIG_ID) LD (LOGOTYPE.playSnd),A ; ; LD C,#97 ; RST_to_BIOS_18 ; XOR A ; LD C,#F2 ; RST_to_BIOS_18 ;------------------------------ ;!!!!! посмотреть ; CALL KINIT ;------------------------------ ;!!!!! посмотреть ;--------[Clean keyboard buffer]-------- ; clean_kbd_buf: ; IN A,(Z84.SIO.Ch_A.Ctrl) ; BIT 0,A ; jr z,.exit ; IN A,(Z84.SIO.Ch_A.Data) ; jr clean_kbd_buf ; .exit: ;--------------------------------------- ;R08 CALL OPENDOS ;!TEST 20/08/2024 ;CALL ZXCLS ; CALL READING CALL TEST_CHECKSUM CALL NZ,SETDEFX ;!TODO CMOS Disabled use of CONFIG_DE (#C13A) word ;LD A,#1C ;CALL READCMS ;PUSH AF ;LD A,CMOS_CELL.HardwareConfiguration ;CALL READCMS ;POP DE ;LD E,A ; LD C,SLOT3 IN B,(C) PUSH BC LD A,SYS_PAGE OUT (C),A ; LD (SYS_PAGE.CONFIG_DE),DE LD HL,SYS_PAGE.INT_ADRESS ;EXTENDED INTERRUPT XOR A LD (HL),A INC L LD (HL),A INC L LD (HL),A INC L LD (HL),A POP BC OUT (C),B ;CALL TRD_MOUNT ; !TEST 24/09/2024 перенос в EXIT_SETUP (перед запуском ZX) CALL FDD_INSTAL CALL CLEAR_MEM CALL ZXMODE_SETUP CALL XY_SCREEN ;R06 ;[Check Quick Start ROM] LD BC,CMOS_CELL.BootUpParams.Mask.QuickStartROM ;#010E CALL GET_CMOS_VALUE POP BC RR C JR NC,IGNORE_QuickStartROM ; результат проверки Space из exp.asm [Check SPACE] PUSH AF LD C,SLOT3 IN B,(C) PUSH BC LD A,SYS_PAGE OUT (C),A LD HL,SYS_PAGE.RESTART_ID LD DE,RESTART_ID.str LD B,RESTART_ID.size CALL COMPARE_RESTART_ID CALL NZ,SET_RESTART_ID POP BC OUT (C),B JR Z,YES_QuickStartROM POP AF JR IGNORE_QuickStartROM SET_RESTART_ID: PUSH AF LD HL,RESTART_ID.str LD DE,SYS_PAGE.RESTART_ID LD BC,RESTART_ID.size LDIR LD HL,PowerOnDate ; !TODO изменить под структуру, когда структура переменных будет готова CALL GETTIME POP AF RET YES_QuickStartROM: POP AF OR A JP NZ,EXIT_SETUP IGNORE_QuickStartROM: CALL INSTALL LD DE,#0528 ;CALL ScreenPOS.LOCAT CALL LP_SET_PLACE LD A,msgStrings.toSetupButton LD E,COLORS.CGA.FLASH + COLORS.CGA.INK.WHITE CALL POSTMSC LD DE,#0900 ;CALL ScreenPOS.LOCAT CALL LP_SET_PLACE ERRSUM+1: LD A,#00 OR A JR Z,.ErrDateTime XOR A LD (.ErrDateTime+1),A ; если контрольная сумма слетела, то сообщение о кривых дате/времени в кмос не выводим LD A,msgStrings.cmosChecksumErr LD E,COLORS.CGA.INK.RED CALL POSTMSC CALL ScreenPOS.CRLF CALL ScreenPOS.CRLF JR CHEKOK .ErrDateTime+1: LD A,0 OR A JR Z,CHEKOK LD A,msgStrings.cmosDateTimeErr LD E,COLORS.CGA.INK.RED CALL POSTMSC CALL ScreenPOS.CRLF CALL ScreenPOS.CRLF CHEKOK: ;CALL ScreenPOS.GET_CUR CALL LP_GET_PLACE PUSH DE CALL LOGOTYPE LD DE,#0000 ;CALL ScreenPOS.LOCAT CALL LP_SET_PLACE LD A,msgStrings.spModel CALL POSTMSG CALL PIDNUM CALL ScreenPOS.CRLF LD A,msgStrings.boardID CALL POSTMSG CALL PIDBOARD CALL ScreenPOS.CRLF LD A,msgStrings.spCNFver CALL POSTMSG CALL CNF_VER_PRINT CALL ScreenPOS.CRLF LD A,msgStrings.spMemory CALL POSTMSG CALL EMM.GetMemSize PUSH BC CALL PMEMORY CALL ScreenPOS.CRLF LD A,msgStrings.memoryAvailable CALL POSTMSG POP HL CALL PMEMORY CALL ScreenPOS.CRLF ;CALL TSTCMOS CALL CMOS_TEST LD A,msgStrings.cmosNone JR C,CMOS_ABSENT ; CMOS OK CALL CMOSINIT LD A,msgStrings.cmosFound CALL POSTMSG LD A,',' CALL PRINT_CHAR LD A," " CALL PRINT_CHAR LD HL,RebootDate CALL PRNTIME CALL ScreenPOS.CRLF JR INFO_MESSAGE CMOS_ABSENT: CALL POSTMSG INFO_MESSAGE: ; for recovery boot ; LD DE,#0428 ; CALL LP_SET_PLACE ; LD A,msgStrings.forCtrlBootButton ; LD E,COLORS.CGA.INK.WHITE ; CALL POSTMSC ; ; For alternative boot LD DE,#0528 CALL LP_SET_PLACE LD A,msgStrings.forAltBootButton LD E,COLORS.CGA.INK.WHITE CALL POSTMSC POP DE CALL LP_SET_PLACE CALL TSETUP ;!TODO может пихнуть её на прерывания? CALL CONFIGURE_IDE_DRIVES.START ;CALL CONFIGURE_IDE_DRIVES.Nop_CHANELS CALL CTRLKEY LD A,B ; [x] 05/07/2024 BIT X_CTRL,A LD BC,#FFFF ; маркер для PrepareToBOOT, чтоб грузил Recovery JR NZ,RECOVERY_BOOT ; BIT X_ALT,A JR NZ,ALT_BOOT ; CALL TSETUP ; LD BC,CMOS_CELL.BootDrives.Mask.SysDisk ;#0710 RECOVERY_BOOT: CALL PrepareToBOOT LD A,msgStrings.bootFail LD E,COLORS.CGA.INK.LRED CALL C,POSTMSC CALL ScreenPOS.CRLF ; CALL INT_ON ALT_BOOT: LD A,msgStrings.bootAltDrv LD E,COLORS.CGA.INK.LGREEN CALL POSTMSC LD BC,CMOS_CELL.BootDrives.Mask.AltSysDisk ;#7010 CALL PrepareToBOOT LD A,msgStrings.bootFail LD E,COLORS.CGA.INK.LRED CALL C,POSTMSC CALL ScreenPOS.CRLF ;NO START DISK - RESTART / SETUP / ZX SPECTRUM mode LD BC,CMOS_CELL.Options.Mask.RebootMSG ;#021D CALL GET_CMOS_VALUE OR A JP Z,EXIT_SETUP CALL ScreenPOS.CRLF LD A,msgStrings.afterBootFail LD E,COLORS.CGA.INK.RED CALL POSTMSC ;EI CALL INT_ON StartUpKey: CALL WAITKEY LD HL,#4F00 ; DEL - go to settings ;AND A SBC HL,DE JR Z,ENTER_SETUP ; CP #1B ; ESC - go to zx spectrum mode JP Z,EXIT_SETUP CP #0D ; ENTER - restart JP NZ,StartUpKey XOR A JP Start_again TSETUP: CALL SCANKEY RET Z LD HL,#4F00 ; DEL - go to settings AND A SBC HL,DE JR Z,ENTER_SETUP ; LD HL,#011B ; ESC AND A SBC HL,DE JR NZ,TSETUP POP HL ; убираем лишнее JP EXIT_SETUP ENTER_SETUP: XOR A LD (ITEM_Restore),A CALL SETTINGS XOR A JP Start_again COMPARE_RESTART_ID: LD A,(DE) CP (HL) RET NZ INC HL INC DE DJNZ COMPARE_RESTART_ID RET ; ????? перенести это в функции БИОС? ; HL - data to write: BYTE Hours, minutes, seconds, day, month, century, year. (2022: 20 - century, 22 - year) writeDateTimeToCmos: ;!FIXIT LD A,(HL) LD D,CMOS.Register.hours CALL CMOS_WR INC HL LD A,(HL) LD D,CMOS.Register.minutes CALL CMOS_WR INC HL LD A,(HL) LD D,CMOS.Register.seconds CALL CMOS_WR INC HL LD A,(HL) LD D,CMOS.Register.date CALL CMOS_WR INC HL LD A,(HL) LD D,CMOS.Register.month CALL CMOS_WR INC HL LD A,(HL) LD D,CMOS.Register.century CALL CMOS_WR INC HL LD A,(HL) LD D,CMOS.Register.year CALL CMOS_WR RET XY_SCREEN: ;R06 LD A,CMOS_CELL.ScreenPosition CALL READCMS LD B,A LD A,ACEX.HOLD JP SET_PORTS ; PUSH AF ; IN A,(SLOT3) ; LD E,A ; LD A,DCP_PAGE ; OUT (SLOT3),A ; LD A,(#C400) ;c400 for first cfg 50176 ; LD D,A ; LD A,ACEX.HOLD ; LD (#C400),A ; POP AF ; LD BC,0 ; OUT (C),A ; LD A,D ; LD (#C400),A ; LD A,E ; OUT (SLOT3),a ; RET ; ;R07 ; CMOSINIT: ; LD D,10 ;FREQ ; LD C,#F6 ;READ CMOS ; RST_to_BIOS ; CP #26 ; JR NZ,CMSERR ; LD D,12 ; LD C,#F6 ; RST_to_BIOS ; CP #50 ; RET Z ; CMSERR: ; LD D,10 ; LD A,#26 ;FREQ ; LD C,#F7 ; RST_to_BIOS ; LD D,11 ; LD A,#02 ;TIME FORMAT ; LD C,#F7 ; RST_to_BIOS ; LD D,12 ; LD A,#50 ; LD C,#F7 ; RST_to_BIOS ; LD D,13 ; LD A,#80 ; LD C,#F7 ; RST_to_BIOS ; RET ;------------------- ;!!!!! посмотреть ; 0 - 1-st FDD ; 1 - 2-nd FDD ; 2 - 1-st IDE ; 3 - 2-nd IDE ; 4 - 3-rd IDE ; 5 - 4-th IDE ; 6 - RAM-DISK ; ; -> BC - ячейка и маска для чтения значения кмос для загрузочного драйва ; ;[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ] RECOVERYstart: LD A,msgStrings.bootRecovery CALL POSTMSG ; ; Выбор рамдиска для рекавери _mRECOVERYrdChooseTYPE RECOVERYrdChooseTYPE ; прибиваем последний рамдиск, если занят .killRAMdisk: LD A,SYS_PAGE.RAMD_KEYS.NUM-1 LD (.RDkey),A CALL EMM.FreeMemRMD JR NC,.setRAMdisk JR Z,.setRAMdisk RET ; непонятная ошибка - выходим .setRAMdisk: LD A,(.RDkey) LD B,ROM_DISK.Pages.Size CALL EMM.GetMemRMD JR NC,.IMGread ; свободный рамдиск найден DEC A JR Z,.FreeMem ; ошибка - недостаточно памяти, вызываем очистку памяти RET ; непонятная ошибка - выходим .FreeMem: CALL EMM.FullInit JR .killRAMdisk ; ; Вход: A - RAM block ID .IMGread: ; Вариант копирования ROM -> RAM disk _mRECOVERYmountTYPE RECOVERYmountTYPE ; ;Exit from "ROM Disk to RAM disk" procedure .RDkey+*: LD A,0 OR DRIVE_CODES.SPRINTER.RAM LD B,A ; передаём загрузочное устройство в OS_LOAD JP OS_LOAD ; ;[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ] ; PrepareToBOOT: ;CALL INT_ON HALT CALL PORTS_INIT.clean_kbd_buf ;Clearing the keyboard buffer CALL PORTS_INIT.clean_mouse_buf ;Clearing the mouse buffer CALL INT_OFF ; тут не должно быть испорчено значение BC ; [x] 05/07/2024 INC BC LD A,B OR C JP Z,RECOVERYstart DEC BC ; CALL GET_CMOS_VALUE LD B,DRIVE_CODES.SPRINTER.FDD ; FDD OR A JR Z,FDSTART ; FDD A: INC B DEC A JR Z,FDSTART ; FDD B: ; IDE LD B,DRIVE_CODES.SPRINTER.HDD DEC A JR Z,HDSTART INC B ;LD B,#81 DEC A JR Z,HDSTART INC B ;LD B,#82 DEC A JR Z,HDSTART INC B ;LD B,#83 DEC A JR Z,HDSTART ; RAM DEC A JR Z,RDSTART ; ROM DEC A JP Z,RECOVERYstart ; Error SCF RET ; FDSTART: PUSH BC PUSH BC LD A,msgStrings.bootFdd CALL POSTMSG POP AF CALL FDD_5x_RESET POP BC RET C JR OS_LOAD ; CDSTART: LD A,B ; [ ] 15/02/2025 boot from ATAPI OR DRIVE_CODES.SPRINTER.ATAPI LD B,A PUSH BC LD A,msgStrings.bootCd CALL POSTMSG POP AF PUSH AF CALL PRINT_CHANEL ; POP BC PUSH BC CALL OS_LOAD POP BC RET NC LD HL,2048 ;!HARDCODE sector size LD IX,#0011 JR OS_LOAD.CD ; RDSTART: LD A,msgStrings.bootRamDrv CALL POSTMSG LD B,DRIVE_CODES.SPRINTER.RAM ; 6 - тип драйва RAM-DRV, 0 - номер драйва .loop: PUSH BC CALL OS_LOAD POP BC INC B LD A,DRIVE_CODES.SPRINTER.RAM + SYS_PAGE.RAMD_KEYS.NUM-1 ; максимальный номер рамдиска SUB B JR NC,.loop RET HDSTART: IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A LD A,B ; AND #03 ;R02 %00000011 LD IY,IDE.INIT_TBL_IDE0 JR Z,.next ; LD IY,IDE.INIT_TBL_IDE1 CP 1 ;R02 JR Z,.next ; LD IY,IDE.INIT_TBL_IDE2 ;R02 CP 2 ;R02 JR Z,.next ; LD IY,IDE.INIT_TBL_IDE3 ;R02 ; .next: LD A,(IY+IDE.HDD_INIT_TABLE.DriveType) EX AF,AF' OUT (SLOT3),A EX AF,AF' CP IDE.Device.ATAPI JP Z,CDSTART PUSH AF PUSH BC LD A,msgStrings.bootHdd CALL POSTMSG POP AF PUSH AF CALL PRINT_CHANEL ; POP BC POP AF CP #FF SCF RET Z ; OS_LOAD: LD HL,512 ;!HARDCODE LD IX,#0001 .CD: LD (.SectorSizeAddr),HL LD HL,#0000 LD DE,TEMP LD A,B LD BC,1*256 + BIOS.DRV_READ PUSH AF RST ToBIOS_18 ; POP BC RET C LD A,B EX AF,AF' LD HL,TEMP LD DE,SYSID LD B,SYSID.length .loop: LD A,(DE) CP (HL) SCF RET NZ INC HL INC DE DJNZ .loop EX AF,AF' PUSH AF LD A,msgStrings.bootOk LD E,COLORS.CGA.INK.LGREEN CALL POSTMSC CALL ScreenPOS.CRLF POP AF ; физический номер диска POP HL .MOVE0: DI IM 1 LD HL,MOVE1 LD DE,OS_LOAD.SectorSizeAddr - MOVE1.length ; !HARDCODE LD BC,MOVE1.length LDIR JP OS_LOAD.SectorSizeAddr - MOVE1.length ; MOVE1: LD HL,#8000 ; !HARDCODE LD SP,HL EX DE,HL LD HL,TEMP LD BC,(OS_LOAD.SectorSizeAddr) LDIR JP #8000+SYSID.length ;#800C ; !HARDCODE ; .length EQU $-MOVE1 SYSID: DZ "Starting..." .length EQU $-SYSID ;FD144A: DB #80,#12,#02,#50,#00,#00,#02,FDD_INIT_TABLE.FDD ; .Size EQU $ - FD144A ; FD720A: DB #00,#09,#02,#50,#00,#00,#02,FDD_INIT_TABLE.FDD ; .Size EQU $ - FD720A FDD_INIT_TABLE: FDD_1440_TABLE FDD_INSTAL: IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A LD HL,SYS_PAGE.FDD_TABLE LD BC,SYS_PAGE.FDD_TABLE.Size*256 + #FF ; table_size*256 + fill_byte .FILLFDD: LD (HL),C INC HL DJNZ .FILLFDD ; ;EX AF,AF' ;OUT (SLOT3),A ;LD BC,CMOS_CELL.DrivesSetup_1.Mask.FirstFDD ;#0311 ;CALL GET_CMOS_VALUE ;LD HL,FD720A ;OR A ;JR Z,.SETFD0 LD HL,FDD_INIT_TABLE ;DEC A ;JR NZ,.NOFDD0 ;.SETFD0: ;IN A,(SLOT3) ;EX AF,AF' ;LD A,SYS_PAGE ;OUT (SLOT3),A LD DE,SYS_PAGE.FDD_TABLE ; B=0 LD C,SYS_PAGE.FDD_TABLE.Size LDIR ;EX AF,AF' ;OUT (SLOT3),A ;.NOFDD0: LD BC,CMOS_CELL.DrivesSetup_1.Mask.SecondFDD ;#0C11 ;CALL GET_CMOS_VALUE ;LD HL,FD720A ;OR A ;JR Z,.SETFD1 ;LD HL,FD144A ;DEC A ;JR NZ,.NOFDD1 ;.SETFD1: IN A,(SLOT3) ;EX AF,AF' ;LD A,SYS_PAGE ;OUT (SLOT3),A ;LD DE,SYS_PAGE.FDD_1_TABLE ;LD BC,FD144A.Size ;LDIR EX AF,AF' OUT (SLOT3),A .NOFDD1: RET PIDNUM: LD HL,memBUFFER.ID LD BC,#00FF XOR A CPIR LD A,(HL) OR A RET Z CALL PRINTZ RET PIDBOARD: CALL FN_CRIPT.board_id ; IF MotherBoardType > 0 PUSH AF ENDIF PUSH DE PUSH HL PUSH BC LD A,B CALL PRNHEX LD A,'-' CALL PRINT_CHAR POP BC LD A,C CALL PRNHEX LD A,'-' CALL PRINT_CHAR POP HL CALL IPRINT.Z POP DE PUSH DE LD A,D CALL PRNHEX POP DE LD A,E IF MotherBoardType == 0 JP PRNHEX ELSE CALL PRNHEX LD A,' ' CALL PRINT_CHAR POP AF ; type 0 - Classic RET Z ; type 1 - DX LD HL,.ver_DX DEC A JP Z,PRINTZ ; type 2 - DP LD HL,.ver_DP DEC A JP Z,PRINTZ ; type 3 - Max LD HL,.ver_Max DEC A JP Z,PRINTZ ; type 4 - test LD HL,.Test DEC A JP Z,PRINTZ RET ; .ver_DX: DZ "DX" .ver_DP: DZ "DP" .ver_Max: DZ "Max" .Test DZ "0123456789A" ENDIF CNF_VER_PRINT: LD HL,memBUFFER.ID IFN BIOS.FN_VERSION.STR.BitstreamVer = 0 LD BC,BIOS.FN_VERSION.STR.BitstreamVer*256 XOR A .loop: CPIR DJNZ .loop ENDIF JP PRINTZ ;PIDNUM LD A,#0D ; LD HL,ID_BUFFER ; LD BC,#0030 ; CPIR ; RET NZ ; INC HL ; LD BC,#0286 ; RST_to_BIOS_18 ; INC HL ; LD BC,#0586 ; RST_to_BIOS_18 ; INC HL ; LD BC,#0286 ; RST_to_BIOS_18 ; XOR A ; RET ;PIDDATE ; LD A,#0D ; LD HL,ID_BUFFER ; LD BC,#0030 ; CPIR ; RET NZ ; INC HL ; CPIR ; RET NZ ; INC HL ; LD BC,#0A86 ; JP_to_BIOS ////////////////////////////////////////////////////////////////////// ; INCLUDE 'IM2_INT.asm' ////////////////////////////////////////////////////////////////////// PRNHEX: LD D,A RRCA RRCA RRCA RRCA AND #0F ADD A,#30 CP #3A JR C,PRNH1 ADD A,7 PRNH1: CALL PRINT_CHAR LD A,D AND #0F ADD A,#30 CP #3A JP C,PRINT_CHAR ADD A,7 JP PRINT_CHAR PHEX: LD D,A RRCA RRCA RRCA RRCA AND #0F ADD A,#30 CALL PRINT_CHAR LD A,D AND #0F ADD A,#30 JP PRINT_CHAR PRNTIME: IN A,(SLOT3) PUSH AF LD A,SYS_PAGE OUT (SLOT3),A LD A,(HL) CALL PHEX LD A,":" CALL PRINT_CHAR INC L LD A,(HL) CALL PHEX LD A,":" CALL PRINT_CHAR INC L LD A,(HL) CALL PHEX POP AF OUT (SLOT3),A RET PMEMORY: ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ; * 16 CALL IPRINT LD A,"K" JP PRINT_CHAR IFUSED ZXCLS ZXCLS: LD HL,#4000 LD DE,#4001 LD BC,#1AFF LD (HL),L LDIR RET ENDIF GET_ID: LD HL,memBUFFER.ID ;LD C,BIOS.FN_VERSION ;JP_to_BIOS JP FN_VERSION ;R01GET_ID ;R01 LD A,#10 ;R01 LD BC,#1FFD ;R01 OUT (C),A ;R01 LD C,SLOT3 ;R01 IN B,(C) ;R01 PUSH BC ;R01 LD A,#EE ;R01 OUT (C),A ;R01 LD HL,#FFD0 ;R01 LD DE,ID_BUFFER ;R01 LD BC,#30 ;R01 LDIR ;R01 POP BC ;R01 OUT (C),B ;R01 XOR A ;R01 LD BC,#1FFD ;R01 OUT (C),A ;R01 RET ; COPY_CHAIN: LD E,L ; LDI ; DEC L ; LD L,(HL) ; INC L ; RET Z ; DEC L ; JR COPY_CHAIN ; ; Вход: HL - копия RAM_TABLE откуда копировать ; RESTORE_CHAINS: LD DE,SYS_PAGE.RAM_TABLE ; XOR A ; .loop: CP (HL) ; JR Z,.NoCopy ; LD E,L ; LDI ; DEC L ; .NoCopy: INC L ; JR NZ,.loop ; RET ;---------------------------------------------------------------[] ;REGISTER #1E ; %0000'0011 - TR DOS A: Default / FDD / HDD / RMD ; %0000'1100 - TR DOS B: Default / FDD / HDD / RMD ; %0011'0000 - TR DOS C: Default / FDD / HDD / RMD ; %1100'0000 - TR DOS D: Default / FDD / HDD / RMD TRD_MOUNT: LD BC,CMOS_CELL.TRDOSmount.Mask.A ;#031E LD A,0 CALL .TRDOSX LD BC,CMOS_CELL.TRDOSmount.Mask.B ;#0C1E LD A,1 CALL .TRDOSX LD BC,CMOS_CELL.TRDOSmount.Mask.C ;#301E LD A,2 CALL .TRDOSX LD BC,CMOS_CELL.TRDOSmount.Mask.D ;#C01E LD A,3 .TRDOSX: ; PUSH AF ; CALL GET_CMOS_VALUE ; POP BC ; OR A ; RET Z ; LD C,BIOS.FDD_TO_DRV ; DEC A ; JP Z,ToBIOS_18 ; LD C,BIOS.HDD_TO_DRV ; DEC A ; JP Z,ToBIOS_18 ; SCF ; RET PUSH AF CALL GET_CMOS_VALUE POP BC OR A RET Z DEC A JP Z,FDD_TO_DRV DEC A JP Z,HDD_TO_DRV SCF RET ;---------------------------------------------------------------[] ;!TODO посмотреть ;открывает порт #FE на чтение в 3-й карте портов ;OPENDOS: ; DI ; IN A,(SLOT3) ; EX AF,AF' ; LD A,#40 ; OUT (SLOT3),A ; LD HL,#C000 ; LD DE,#F000 ; LD BC,#0400 ; LDIR ; LD A,#40 ; LD (#F26E),A ; LD (#F27E),A ; LD (#F2EE),A ; LD (#F2FE),A ; LD (#F36E),A ; LD (#F37E),A ; LD (#F3EE),A ; LD (#F3FE),A ; LD HL,#F000 ; LD DE,#F400 ; LD BC,#0C00 ; LDIR ; EX AF,AF' ; OUT (SLOT3),A ; RET ; setFRAME: .double: LD HL,.dataDoubleAll JR .setElements .single: LD HL,.dataSingleAll JR .setElements .high: LD HL,.dataSingleDown JR .setElements .low: LD HL,.dataSingleUp JR .setElements .medium: LD HL,.dataSingleMedium ; JR .setElements .setElements: LD DE,ElementsBuffer LD BC,ElementsBuffer.Size LDIR RET .dataDoubleAll: BYTE "╔╗═║╚╝", "╠╣╦╩" ; #C9,#BB,#CD,#BA,#C8,#BC, #CC,#B9,#CB,#CA .dataSingleAll: BYTE "┌┐─│└┘", "├┤┬┴" ; #DA,#BF,#C4,#B3,#C0,#D9, #C3,#B4,#C2,#C1 .dataSingleDown: BYTE "╔╗─║╟╢", "╟╢╤┴" ; #C9,#BB,#C4,#BA,#C7,#B6, #C7,#B6,#D1,#C1 .dataSingleUp: BYTE "╟╢─║╚╝", "╟╢┬╧" ; #C7,#B6,#C4,#BA,#C8,#BC, #C7,#B6,#C2,#CF .dataSingleMedium: BYTE "╟╢─║╟╢", "╟╢┬┴" ; #C7,#B6,#C4,#BA,#C7,#B6, #C7,#B6,#C2,#C1 ; ElementsBuffer: .UpLeft: BYTE "┌" ; UL - UpLeft .UpRight: BYTE "┐" ; UR - UpRight .HorizontalLine: BYTE "─" ; ZL - HorizontalLine .VerticalLine: BYTE "│" ; VL - VerticalLine .DownLeft: BYTE "└" ; LL - DownLeft .DownRight: BYTE "┘" ; LR - DownRight .LeftCenter: BYTE "├" ; LC - LeftCenter .RightCenter: BYTE "┤" ; RC - RightCenter .UpCenter: BYTE "┬" ; UC - UpCenter .DownCenter: BYTE "┴" ; DC - DownCenter .Size EQU $-ElementsBuffer ; IF STARTUP_SND INCLUDE 'startup_sound.asm' ENDIF INCLUDE 'VIDEO_IO.asm' INCLUDE 'AUTOIDE.asm' INCLUDE 'SETTINGS.asm' INCLUDE 'KEY.asm' ;....................................... KEY: EI JP WAITKEY FindStringAddr: LD L,A LD H,0 LD BC,memBUFFER.Messages ADD HL,HL ADD HL,BC LD A,(HL) INC HL LD H,(HL) LD L,A RET POSTLEN: CALL FindStringAddr LD BC,#0100 XOR A CPIR LD A,#FF SUB C SRL A LD C,A LD A,40 SUB C LD E,A ;JP ScreenPOS.LOCAT JP LP_SET_PLACE SETLAND: LD A,#0E ; !HARDCODE CMOS ячейка options CALL READCMS ;!TODO переделать на GET_CMOS_VALUE AND #04 ; !HARDCODE CMOS значение языка LD HL,MSG_RUS JR NZ,.set LD HL,MSG_ENG ; .set: LD DE,memBUFFER.Messages LD BC,MSG_TABLE.Size LDIR RET ; ; print boot drive number PRINT_CHANEL: AND #0F LD C,A ; LD A,msgStrings.parPriIdeMA JR Z,.print_chanel ; LD A,msgStrings.parPriIdeSl DEC C JR Z,.print_chanel ; LD A,msgStrings.parSecIdeMA DEC C JR Z,.print_chanel ; LD A,msgStrings.parSecIdeSl .print_chanel: CALL FindStringAddr ;CALL LP_GET_PLACE ;LD A,ScreenPOS.SUBNAME.POS ;SUB E ;LD B,A LD B,0 LD D,#FF JP LP_PRINT_LINE6 ; POSTMSC: CALL FindStringAddr LD A,E JP CPRINTZ ; ////////////////////////////////////////////////////////////////////// INCLUDE 'IM2_INT.asm' ////////////////////////////////////////////////////////////////////// POSTMSG: CALL FindStringAddr JP PRINTZ ;----------------------------------------------------------------------[] ;!TODO сделать выбор в Setup, что грузить в vПЗУ при старте. Варианты: ;[x] 0 - Не грузить ПЗУ спектрума, инитить страницу #41 как в 3.04 ;[x] 1 - Грузит ПЗУ спектрума из ROM при старте если нет флага ZX ;[x] 2 - Грузит ПЗУ спектрума из ROM при каждом перезапуске ;[ ] 3 - Не грузить ПЗУ спектрума, инитить страницу #41 так, ; чтоб код в ней подгружал ПЗУ спектрума при обращении ZXMODE_SETUP: IN A,(SLOT3) PUSH AF LD A,Spec_Page OUT (SLOT3),A ; LD BC,CMOS_CELL.Options.Mask.LoadZXroms CALL GET_CMOS_VALUE ; OR A JR Z,.init_41h DEC A JR Z,.CheckAndLoad DEC A JR Z,.Load_ZXROMS ;!TODO ;DEC A ;JR Z,.New_init_41h ; ; Check ZX ROMS Loaded .CheckAndLoad: LD A,(Spec_Page.flag_Z) CP 'Z' JR NZ,.Load_ZXROMS LD A,(Spec_Page.flag_X) CP 'X' JR NZ,.Load_ZXROMS ; [x] 31/12/23 подстраховка от недоутечки памяти LD A,R AND #80 JR Z,.No_Need_To_Load_ZXROMS .Load_ZXROMS: XOR A LD R,A ; Load ZX ROM's LD BC,64*256 + BIOS.ZX_MEMORY_MANAGER ; [ ] free zx pages! MANAGE_ZX_PAGES.FREE_vMEMORY RST ToBIOS_18 ; LD B,3 ; !HARDCODE zx-rom number of pages CALL EMM.GetMem JR C,.init_41h ;!FIXIT печатать ошибку ; [ ] free zx pages! CALL init_zx_roms ; IFN FREE_ZX_PAGES ; ; ставим метку если прогрузили ПЗУ спектрума ; LD HL,'XZ' ; LD (Spec_Page.flag_Z),HL ; ENDIF ; .No_Need_To_Load_ZXROMS: POP AF OUT (SLOT3),A RET ; .init_41h: CALL init_zx_roms.init_41h LD A,SYS_PAGE OUT (SLOT3),A CALL .Set_Page41 ;!FIXIT установить во все vROM страницу #41 ; [ ] free zx pages! JR .No_Need_To_Load_ZXROMS ; .Set_Page41: LD HL,SYS_PAGE.SHARED_BUFFER_256b + 11 LD DE,SYS_PAGE.SHARED_BUFFER_256b + 11-1 LD BC,11-1 ; !HARDCODE кол-во страниц vROM + RAM BLOCK ID LD (HL),#FF LDDR ; зачищаем EX DE,HL ; ; LD A,SYS_PORT.EXTENSION ; OUT (SYS_PORT.ROM),A ; JP MANAGE_ZX_PAGES.INIT_vROM ; XOR A ;LD A,SYS_PORT.BIOS ; OUT (SYS_PORT.ROM),A LD BC,128*256 + BIOS.ZX_MEMORY_MANAGER ; [ ] free zx pages! HARDCODE JP ToBIOS_18 ;RET ; ;--------------------[copy zx-roms to zx-pages]-----------------; ; SLOT0 - ROM 8, sys_port - on. ; RAM SLOT0 - page 0 ; RAM SLOT3 - Spec_Page ; для режима zx spectrum ; !HARDCODE номера страниц для эмулятора ПЗУ init_zx_roms: DI ; ;;;;;;;; ; IF FREE_ZX_PAGES ; ;;;;;;;; ; НА ВХООДЕ A = SYS_PAGE.Block_ID.vROM ; добиваем буфер до 11 байтов пустыми страницами ; в буфер упадут 1 RAM BLOCK ID, 3 страницы для vROM и #FF LD HL,#FFFF LD (memBUFFER.Shared + 5),HL ; !HARDCODE zx-rom number of pages LD (memBUFFER.Shared + 7),HL ; !HARDCODE zx-rom number of pages LD (memBUFFER.Shared + 9),HL ; !HARDCODE zx-rom number of pages ; получаем список страниц для vROM LD HL,memBUFFER.Shared LD (HL),A INC HL LD B,A CALL EMM.GetMemBlkPages ; LD A,SYS_PAGE OUT (SLOT3),A ; устанавливаем номера страниц vROM в порты ALTERA DEC HL LD A,ROM.EXTENSION OUT (SYS_PORT.ROM),A CALL MANAGE_ZX_PAGES.INIT_vROM ; Копируем образы ZX-ROM из ПЗУ в страницы vROM LD A,2 ; !HARDCODE LD BC,+(3*2)*256 + SLOT3 ; !HARDCODE B = (zx-rom number of pages)*2 LD HL,memBUFFER.Shared + 1 .loop: OUTI OUT (ROM.SLOT0),A EXX LD HL,0 LD DE,#C000 LD BC,#4000 LDIR EXX INC A DJNZ .loop ; возвращаем страницы на место XOR A OUT (ROM.SLOT0),A OUT (SYS_PORT.ROM),A LD A,Spec_Page OUT (SLOT3),A .init_41h: ; забить FF-ами LD HL,#C000 LD DE,#C001 LD BC,#3FFF - 2 LD (HL),#FF LDIR ; Заглушка для страницы #41 LD HL,PROG_NO_ROM LD DE,#C000 + Spec_Page.no_zx_rom LD BC,PROG_NO_ROM.size LDIR ; LD HL,RAM_BIOS_PROG LD DE,#C000 + Spec_Page.to_bios LD BC,RAM_BIOS_PROG.Length LDIR RET ;---------------------------------------------------------------------[] ;--------------------------------------- INCLUDE 'src/bios/ROM/SETUP/messages.z80' ;--------------------------------------- ; STRUCT MAIN_BUFFERS ID BLOCK #100 Messages BLOCK MSG_ENG.size Shared BLOCK 1024 End BYTE ENDS memBUFFER MAIN_BUFFERS = $ STACK EQU #C000 .Size EQU 128 IF memBUFFER.End-1 > #C000-STACK.Size DISPLAY 'memBUFFER.Shared overlaps STACK by: ',/A,(memBUFFER.End-1)-(#C000-STACK.size) ASSERT memBUFFER.End-1 < #C000-STACK.size ENDIF IFDEF PREBUILD OUTEND DISPLAY '-----[Set_Pictures Prebuild start]-----' MMU 1 e, 0 ; страница 0 в банку 0 и проверка на границы. ORG ROM_MAP.LOGO INCLUDE 'src/bios/logo/Set_Pictures.asm' DISPLAY '-----[Set_Pictures Prebuild done ]-----' ELSE MAIN_END_CODE_ADDRESS EQU $-1 ; DISPLAY ' -------------------[Main.asm]-------------------' ; DISPLAY 'End code address: ',/A,$-1 ; DISPLAY 'Code size: ',/A,$-COMPILE_ADDR.MAIN ; DISPLAY 'End buffers address: ',/A,memBUFFER.End-1 ; DISPLAY 'Free memory: ',/A,#C000-(memBUFFER.End-1)-STACK.Size ; DISPLAY 'Unused bytes before INT_POINTER: ',/A,INT_POINTER-before_intPointer ENDIF ; ;======================================================================================================================= ; ;;;;;;;; ; ELSE ; ;;;;;;;; ; IN A,(SLOT3) ; EX AF,AF' ; ; ; LD A,SYS_PORT.EXTENSION ; OUT (SYS_PORT.ROM),A ; INC A ; !HARDCODE LD A,2 ; LD B,3 ; !HARDCODE zx-rom number of pages ; ; ; .loop: EXX ; ; ; OUT (ROM.SLOT0),A ; OR %0100'0000 ; !HARDCODE номера страниц для эмулятора ПЗУ ; OUT (SLOT3),A ; AND %1011'1111 ; !HARDCODE номера страниц для эмулятора ПЗУ ; ; ; LD HL,0 ; LD DE,#C000 ; LD BC,#4000 ; LDIR ; ; ; INC A ; EXX ; DJNZ .loop ; ; ; XOR A ; OUT (ROM.SLOT0),A ; OUT (SYS_PORT.ROM),A ; EX AF,AF' ; OUT (SLOT3),A ; ; ; ;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23 ; [ ] free zx pages! переделать на вызов FREE_ZX_PAGES.INIT_vROM ; LD A,ACEX.vROM.BASIC_128 ; ROM-ID - BASIC 128 ; LD B,#42 ;!HARDCODE page ; CALL SET_PORTS ; ; ; LD A,ACEX.vROM.BASIC_48 ; ROM-ID - BASIC 48 ; LD B,#43 ;!HARDCODE page ; CALL SET_PORTS ; ; ; LD A,ACEX.vROM.TR_DOS ; ROM-ID - TR-DOS ; LD B,#44 ;!HARDCODE page ; CALL SET_PORTS ; ; ; ; эти страницы пока не используются ; LD A,ACEX.vROM.EXPANSION ; ROM-ID - BIOS ; ;LD B,#45 ;!HARDCODE page ; LD B,#41 ; CALL SET_PORTS ; ; ; LD A,ACEX.vROM.BIOS_1 ; ROM-ID - BIOS-1 ; ;LD B,#46 ;!HARDCODE page ; LD B,#41 ; CALL SET_PORTS ; ; ; LD A,ACEX.vROM.BIOS_2 ; ROM-ID - BIOS-2 ; ;LD B,#47 ;!HARDCODE page ; LD B,#41 ; CALL SET_PORTS ; ; можно задействовать ещё 4 страницы на порты #E4..#E7 ; ;;;;;;;; ; ENDIF ; ;;;;;;;;