;[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'; Includes 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 TEMP EQU #7E00 ; !HARDCODE MEMMAP2 EQU TEMP ; должно быть выровнено по ALIGN 256 TPOINTD EQU TEMP - SYS_PAGE.RAMD_KEYS.NUM - SYS_PAGE.Sp_RAMD_KEYS.NUM ; [x] 4/11/23 ;======================================= ;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 CLEARM: IN A,(SLOT3) PUSH AF LD A,SYS_PAGE OUT (SLOT3),A ; 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/23 LD HL,SYS_PAGE.Sp_RAMD_KEYS LD DE,TPOINTD + SYS_PAGE.RAMD_KEYS.NUM LD BC,SYS_PAGE.Sp_RAMD_KEYS.NUM LDIR ; ; очищаем RAM Table LD HL,MEMMAP2 LD DE,MEMMAP2+1 LD BC,255 LD (HL),0 LDIR ; восстанавливаем RAM диски LD IX,SYS_PAGE.RAMD_KEYS ;RAM DISKS LD H,high SYS_PAGE.RAMD_FAT LD D,high MEMMAP2 LD BC,SYS_PAGE.RAMD_KEYS.NUM*256 + #FF CALL .MEMLOOP ; [x] 4/11/23 LD IX,SYS_PAGE.Sp_RAMD_KEYS LD B,SYS_PAGE.Sp_RAMD_KEYS.NUM CALL .MEMLOOP ; CALL EMM.InitMem LD BC,CMOS_CELL.BootUpParams.Mask.SaveRAMdisks ;#400E CALL G_VALUE OR A CALL NZ,CCHAIN POP AF OUT (SLOT3),A ;!TEST; [ ] 04/11/2023 Отдельные рамдиски для режима спектрума и DSS. LD B,high BIOS.SWAP_RAM_DRIVES.Sp2000 JP SWAP_RAM_DRIVES ; ; .MEMLOOP: LD A,(IX) INC IX OR A LD L,A CALL NZ,RCHAIN DJNZ .MEMLOOP 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 ; ; LD BC,#020E ; CALL G_VALUE ; OR A ; LD A,#EC ;SPRINTER ; JR Z,XFLEX ; LD A,#EA ;SPECTRUM ;XFLEX: LD A,ROM.BIOS OUT (SYS_PORT.ROM),A POP HL ; пихается в EXP.ASM в процедуре JP (HL) ; LD (JMPHL),HL ; LD C,#F3 ; RST_to_BIOS ; JMPHL EQU $+1 ; JP #0000 ;-----------------------------------------------------------------------; INSTALL: CALL INT_ON CALL SET_CGA XOR A OUT (#FE),A LD IX,win_descriptor.tab80x32 LD HL,#0000 LD E,1 CALL WIN_OPEN 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.INC.LCYAN CALL CPRINTZ ; LD HL,BUILD ; LD A,COLORS.CGA.INC.LCYAN ; CALL CPRINTZ LD DE,#0128 ; !HARDCODE CALL LP_SET_PLACE LD A,msgStrings.copyRightPeters LD E,COLORS.CGA.INC.LGREEN CALL POSTMSC LD DE,#0228 ; !HARDCODE CALL LP_SET_PLACE LD A,msgStrings.copyRightSPTeam LD E,COLORS.CGA.INC.GREEN CALL POSTMSC IF BETA_BUILD LD DE,#0328 CALL LP_SET_PLACE LD A,msgStrings.testBIOSmsg LD E,COLORS.CGA.FLASH + COLORS.CGA.INC.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 ;BUILD: ; db ', BIOS v', Disk_subsystem_ver_txt,0 ; !FIXIT может воткнуть вместе с msgStrings ? RSTID: DB "RESTART",0 .size EQU $-RSTID Start_again: ld sp,STACK-2 START: DI PUSH AF XOR A LD (ERRSUM),A LD (ERRSUM.ErrDateTime),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 CALL ZXCLS CALL READING CALL TCHEKSM CALL NZ,SETDEFX ;!TODO CMOS Disabled use of CONFIG_DE (#C13A) word ;LD A,#1C ;CALL READCMS ;PUSH AF ;LD A,#1B ;!TODO CMOS ;CALL READCMS ;POP DE ;LD E,A ; LD C,SLOT3 IN B,(C) PUSH BC LD A,SYS_PAGE OUT (C),A ; LD (#C13A),DE CONFIG_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 TRQUICK CALL FINSTAL CALL CLEARM CALL RESCREEN ;R06 LD BC,CMOS_CELL.BootUpParams.Mask.QuickStart ;#010E CALL G_VALUE POP BC INC B DEC B JR NZ,QIGNORE ; результат проверки Space из exp.asm [space_check] 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,RSTID LD B,RSTID.size CALL COMPARE CALL NZ,SETRSTS POP BC OUT (C),B JR Z,HOTST POP AF JR QIGNORE SETRSTS: PUSH AF LD HL,RSTID LD DE,SYS_PAGE.RESTART_ID LD BC,RSTID.size LDIR LD HL,PowerOnDate ; !TODO изменить под структуру, когда структура переменных будет готова CALL GETTIME POP AF RET HOTST: POP AF OR A JP NZ,EXIT_SETUP QIGNORE: CALL INSTALL LD DE,#0528 ;CALL ScreenPOS.LOCAT CALL LP_SET_PLACE LD A,msgStrings.toSetupButton LD E,COLORS.CGA.FLASH + COLORS.CGA.INC.WHITE CALL POSTMSC LD DE,#0900 ;CALL ScreenPOS.LOCAT CALL LP_SET_PLACE ERRSUM+1: LD A,#00 ;MEM Patch! OR A JR Z,.ErrDateTime XOR A ld (.ErrDateTime+1),a ; если контрольная сумма слетела, то сообщение о кривых дате/времени в кмос не выводим LD A,msgStrings.cmosChecksumErr LD E,COLORS.CGA.INC.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.INC.RED CALL POSTMSC CALL ScreenPOS.CRLF CALL ScreenPOS.CRLF CHEKOK: ;CALL ScreenPOS.GET_CUR CALL LP_GET_PLACE PUSH DE CALL LOGOTYP 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: ;!FIXIT название неправильное LD DE,#0528 CALL LP_SET_PLACE LD A,msgStrings.forAltBootButton LD E,COLORS.CGA.INC.WHITE CALL POSTMSC POP DE CALL LP_SET_PLACE CALL TSETUP ;!TODO может пихнуть её на прерывания? CALL CONFIGURE_IDE_DRIVES.START CALL CTRLKEY LD A,B AND #10 JR NZ,ABOOT CALL TSETUP LD BC,CMOS_CELL.BootDrives.Mask.SysDisk ;#0710 CALL PrepareToBOOT LD A,msgStrings.bootFail LD E,COLORS.CGA.INC.LRED ;CALL C,POSTMSG CALL C,POSTMSC CALL ScreenPOS.CRLF ABOOT: LD A,msgStrings.bootAltDrv LD E,COLORS.CGA.INC.LGREEN ;CALL C,POSTMSG CALL C,POSTMSC LD BC,CMOS_CELL.BootDrives.Mask.AltSysDisk ;#7010 CALL PrepareToBOOT LD A,msgStrings.bootFail LD E,COLORS.CGA.INC.LRED ;CALL C,POSTMSG CALL C,POSTMSC CALL ScreenPOS.CRLF ;NO START DISK - RESTART / SETUP / ZX SPECTRUM mode LD BC,CMOS_CELL.Options.Mask.RebootMSG ;#021D CALL G_VALUE OR A JP Z,EXIT_SETUP CALL ScreenPOS.CRLF LD A,msgStrings.afterBootFail LD E,COLORS.CGA.INC.RED CALL POSTMSC ;EI CALL INT_ON AGAKEY: CALL WAITKEY LD HL,#4F00 ; DEL - go to settings ;AND A SBC HL,DE JR Z,CSETUP CP #1B ; ESC - go to zx spectrum mode JP Z,EXIT_SETUP CP #0D ; ENTER - restart JP NZ,AGAKEY XOR A JP Start_again TSETUP: CALL SCANKEY RET Z LD HL,#4F00 AND A SBC HL,DE JR Z,CSETUP LD HL,#011B AND A SBC HL,DE JR NZ,TSETUP POP HL ; убираем лишнее JP EXIT_SETUP CSETUP: XOR A LD (ITEM_Restore),A CALL SETTINGS XOR A JP Start_again COMPARE: LD A,(DE) CP (HL) RET NZ INC HL INC DE DJNZ COMPARE 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 RESCREEN: ;R06 LD A,#1F ;!HARDCODE READ SCREEN POSITION CALL READCMS PUSH AF IN A,(SLOT3) LD E,A LD A,DCP_PAGE OUT (SLOT3),A LD A,(#C400) ;c400 for first cfg 50176 ; !TODO можно переделать на вызов функции биоса LD D,A LD A,#CB LD (#C400),A POP AF LD BC,0 OUT (C),A LD A,D LD (#C400),A LD A,E OUT (SLOT3),a ;R06 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 #60 ; !HARDCODE сделать им всем названия LD B,A ; передаём загрузочное устройство в OS_LOAD JP OS_LOAD ; ;[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ] ; PrepareToBOOT: CALL INT_ON HALT ; без него не срабатывает зажимание шифта при старте доса для отмены старта system.exe CALL INT_OFF CALL PORTS_INIT.clean_kbd_buf ;Clearing the keyboard buffer ; тут не должно быть испорчено значение BC CALL G_VALUE LD B,0 ; FDD OR A JR Z,FDSTART ; FDD A: INC B DEC A JR Z,FDSTART ; FDD B: ; IDE LD B,#80 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 JP OS_LOAD ;!TODO CDSTART: PUSH BC LD A,msgStrings.bootCd CALL POSTMSG POP AF PUSH AF CALL PRINT_CHANEL ; POP BC SET 6,B SCF RET RDSTART: LD A,msgStrings.bootRamDrv CALL POSTMSG LD B,#60 ; !HARDCODE: 6 - тип драйва RAM-DRV, 0 - номер драйва .loop: PUSH BC CALL OS_LOAD POP BC INC B LD A,#6F ; !HARDCODE - максимальное число рамдисков 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.CDROM 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,#0000 LD IX,#0001 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.INC.LGREEN ;CALL POSTMSG CALL POSTMSC CALL ScreenPOS.CRLF POP AF POP HL ; JP MOVE0 MOVE0: DI IM 1 LD HL,MOVE1 LD DE,#7C00 ; !HARDCODE LD BC,MOVE1.length LDIR JP #7C00 MOVE1: LD SP,#7FFF ; !HARDCODE LD HL,TEMP LD DE,#8000 ; !HARDCODE LD BC,#0200 ; !HARDCODE 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_INI_TABLE.FDD FD720A: DB #00,#09,#02,#50,#00,#00,#02,FDD_INI_TABLE.FDD FINSTAL: IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A LD HL,FDD_INI_TABLE.FDD_0 LD BC,SYS_PAGE.FDD_TBL.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 G_VALUE LD HL,FD720A OR A JR Z,SETFD0 LD HL,FD144A DEC A JR NZ,NOFDD0 SETFD0: IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A LD DE,FDD_INI_TABLE.FDD_0 LD BC,#0008 ; !HARDCODE LDIR EX AF,AF' OUT (SLOT3),A NOFDD0: LD BC,CMOS_CELL.DrivesSetup_1.Mask.SecondFDD ;#0C11 CALL G_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,FDD_INI_TABLE.FDD_1 LD BC,#0008 ; !HARDCODE 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: LD B,1 CALL FN_CRIPT 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 IZPRINT POP DE PUSH DE LD A,D CALL PRNHEX POP DE LD A,E JP PRNHEX 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 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 ZXCLS: LD HL,#4000 LD DE,#4001 LD BC,#1AFF LD (HL),L LDIR RET 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 RCHAIN: LD E,L LDI DEC L LD L,(HL) INC L RET Z DEC L JR RCHAIN CCHAIN: LD HL,MEMMAP2 LD DE,SYS_PAGE.RAMD_FAT XOR A CCHAINC: CP (HL) JR Z,NOCOPYC LD E,L LDI DEC L NOCOPYC: INC L JR NZ,CCHAINC LD HL,TPOINTD LD DE,SYS_PAGE.RAMD_KEYS LD BC,SYS_PAGE.RAMD_KEYS.NUM LDIR RET TRQUICK: ;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 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 G_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 G_VALUE POP BC OR A RET Z DEC A JP Z,FDD_TO_DRV DEC A JP Z,HDD_TO_DRV SCF RET ; открывает порт #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 ; 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 ; Get_Item_Address: ; LD L,A ; LD H,0 ; LD BC,MSG_Buffer ; ADD HL,HL ; ADD HL,BC ; LD A,(HL) ; INC HL ; LD H,(HL) ; LD L,A ; INC HL ; INC HL ; 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 POSTMSG: CALL FindStringAddr JP PRINTZ POSTMSC: CALL FindStringAddr LD A,E JP CPRINTZ SETLAND: LD A,#0E ; !HARDCODE CMOS ячейка options CALL READCMS AND #04 ; !HARDCODE CMOS значение языка JR NZ,.RUS ; LD HL,MSG_ENG LD DE,memBUFFER.Messages LD BC,MSG_ENG.size LDIR RET ; .RUS: LD HL,MSG_RUS LD DE,memBUFFER.Messages LD BC,MSG_RUS.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 ; ;--------------------------------------- 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 ; ID_BUFFER EQU $ ; MSG_Buffer EQU ID_BUFFER+#100 ; TMP_BUFFER EQU MSG_Buffer + MSG_ENG.size 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 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 ;