;[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 ;!!!!!!!!!!!!!!!!!!!!!! ; !FIXIT проверить такие же ли адреса CMOS в Settings используются SM_CYLL EQU #2F SM_CYLH EQU #30 SM_HEAD EQU #31 SM_SECT EQU #32 SS_CYLL EQU #33 SS_CYLH EQU #34 SS_HEAD EQU #35 SS_SECT EQU #36 M_CYLL EQU #37 M_CYLH EQU #38 M_HEAD EQU #39 M_SECT EQU #3A S_CYLL EQU #3B S_CYLH EQU #3C S_HEAD EQU #3D S_SECT EQU #3E ;!!!!!!!!!!!!!!!!!!!!!! TEMP EQU #7E00 ; !HARDCODE MEMMAP2 EQU TEMP ; должно быть выровнено по ALIGN 256 TPOINTD EQU TEMP-32 ;======================================= ;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,4 ;HOURS CALL CMOS_RD CP #24 ;24 jp nc,.error LD (HL),A INC HL LD D,2 ;MINUTES CALL CMOS_RD CP #5A ; 60 jp nc,.error LD (HL),A INC HL LD D,0 ;SECONDS CALL CMOS_RD CP #5A ; 60 jp nc,.error LD (HL),A INC HL LD D,7 ;DAY CALL CMOS_RD CP #32 ;32 jp nc,.error LD (HL),A INC HL LD D,8 ;MONTH CALL CMOS_RD CP #13 ;13 jp nc,.error LD (HL),A INC HL LD D,#32 ;CENTURY CALL CMOS_RD CP #1A ;20 jp c,.error CP #9A ;100 jp nc,.error LD (HL),A INC HL LD D,9 ;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 LD HL,SYS_PAGE.RAMD_KEYS LD DE,TPOINTD LD BC,SYS_PAGE.RAMD_KEYS.NUM LDIR LD HL,MEMMAP2 LD DE,MEMMAP2+1 LD BC,255 LD (HL),0 LDIR LD IX,SYS_PAGE.RAMD_KEYS ;RAM DISKS LD H,#C2 LD D,high MEMMAP2 LD BC,#10FF MEMLOOP: LD A,(IX) INC IX OR A LD L,A CALL NZ,RCHAIN DJNZ MEMLOOP CALL EMM.InitMem LD BC,#400E ;!HARDCODE CALL G_VALUE OR A CALL NZ,CCHAIN POP AF OUT (SLOT3),A 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.INC.LCYAN CALL CPRINTZ LD HL,BUILD LD A,COLORS.INC.LCYAN CALL CPRINTZ LD DE,#0128 ; !HARDCODE CALL LP_SET_PLACE LD A,msgStrings.copyRightPeters LD E,COLORS.INC.LGREEN CALL POSTMSC LD DE,#0228 ; !HARDCODE CALL LP_SET_PLACE LD A,msgStrings.copyRightSPTeam LD E,COLORS.INC.GREEN CALL POSTMSC IF DEBUG LD DE,#0328 CALL LP_SET_PLACE LD A,msgStrings.testBIOSmsg LD E,COLORS.FLASH + COLORS.INC.RED ; !HARDCODE 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,#010E ; QUICK START 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.FLASH + COLORS.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.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.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.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 ScreenPOS.LOCAT CALL LP_SET_PLACE LD A,msgStrings.forAltBootButton LD E,COLORS.INC.WHITE CALL POSTMSC POP DE ;CALL ScreenPOS.LOCAT CALL LP_SET_PLACE CALL TSETUP CALL AUTODET CALL CTRLKEY LD A,B AND #10 JR NZ,ABOOT CALL TSETUP LD BC,#0710 ; !HARDCODE маска и ячейка для чтения значения кмос для основного загрузочного драйва CALL PrepareToBOOT LD A,msgStrings.bootFail CALL C,POSTMSG CALL ScreenPOS.CRLF ABOOT: LD A,msgStrings.bootAltDrv CALL POSTMSG LD BC,#7010 ; !HARDCODE маска и ячейка для чтения значения кмос для альтернативного загрузочного драйва CALL PrepareToBOOT LD A,msgStrings.bootFail CALL C,POSTMSG CALL ScreenPOS.CRLF ;NO START DISK - RESTART / SETUP / ZX SPECTRUM mode LD BC,#021D CALL G_VALUE OR A JP Z,EXIT_SETUP CALL ScreenPOS.CRLF LD A,msgStrings.afterBootFail LD E,COLORS.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_OFF CALL G_VALUE ;LD B,A 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 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 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 CALL POSTMSG 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,#20FF ;!HARDCODE table FILLFDD: LD (HL),C INC HL DJNZ FILLFDD EX AF,AF' OUT (SLOT3),A LD BC,#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,#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 AUTODET: IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A LD HL,IDE.INIT_TBL_IDE0 LD BC,256*(IDE.HDD_INIT_TABLE * 4) + #FF ;R02 FILLIDE: LD (HL),C ;CLEAR HDD VARIABLE INC HL DJNZ FILLIDE EX AF,AF' OUT (SLOT3),A ;======== старая нумерация дисков! ======== ; CALL GET_AVAILABLE_STRUCT ; LD A,#00 ; CALL COMMONIDE ; CALL GET_AVAILABLE_STRUCT ; LD A,#01 ; CALL COMMONIDE ; CALL GET_AVAILABLE_STRUCT ; LD A,#02 ; CALL COMMONIDE ; CALL GET_AVAILABLE_STRUCT ; LD A,#03 ; CALL COMMONIDE ;========================================== LD IY,IDE.INIT_TBL_IDE0 LD A,#00 CALL COMMONIDE LD IY,IDE.INIT_TBL_IDE1 LD A,#01 CALL COMMONIDE LD IY,IDE.INIT_TBL_IDE2 LD A,#02 CALL COMMONIDE LD IY,IDE.INIT_TBL_IDE3 LD A,#03 CALL COMMONIDE CALL ScreenPOS.CRLF RET ; ;======== старая нумерация дисков! ======== ;GET_AVAILABLE_STRUCT ;LD C,SLOT3 ;IN B,(C) ;LD A,SYS_PAGE ;OUT (C),A ;CALL FIND_AVAILABLE_STRUCT ;OUT (C),B ;RET ;FIND_AVAILABLE_STRUCT ;LD IY,IDE0 ;LD A,(IY+DTYPE_H) ;INC A ;RET Z ;LD IY,IDE1 ;LD A,(IY+DTYPE_H) ;INC A ;RET Z ;LD IY,IDE2 ;LD A,(IY+DTYPE_H) ;INC A ;RET Z ;LD IY,IDE3 ;LD A,(IY+DTYPE_H) ;INC A ;RET ;========================================== ; !HARDCODE заменить числа на метки в этой процедуре COMMONIDE: AND A LD H,A ;SAVE DRIVE NUMBER LD BC,#3011 ;CMOS VALUE LD L,msgStrings.detectIdePrMA JR Z,COMMON2 DEC A LD BC,#C011 ;CMOS VALUE LD L,msgStrings.detectIdePrSL JR Z,COMMON2 DEC A ; !HARDCODE заменить числа на метки в этой процедуре LD BC,#3020 LD L,msgStrings.detectIdeSecMA JR Z,COMMON2 DEC A LD BC,#C020 LD L,msgStrings.detectIdeSecSL JR Z,COMMON2 SCF RET ;0 - AUTODETECT ;1 - GETTING FROM SETUP ;2 - CD-ROM (ATAPI device) ;3 - DISABLED COMMON2: CALL G_VALUE OR A JP Z,AUTODETECT ;AUTODECECT DEC A JP Z,SETUPDETECT ;SETUP DEC A JP Z,IT_IS_CDROM ;CDROM RET ;DON'T CHECK THIS DEVICE AUTODETECT: PUSH HL LD A,L ;DETECT MESSAGE CALL POSTMSG CALL ScreenPOS.SUBNAME ; EI ; POP HL LD A,H ;RESTORE DRIVE NUMBER CALL IDEAUTO IDEJUMPBACK: CALL NC,MODEL LD A,(SKIP) INC A LD A,msgStrings.ideNone JR Z,NOSKIPKEY LD A,msgStrings.ideSkiped NOSKIPKEY: CALL C,POSTMSG CALL ScreenPOS.CRLF RET IT_IS_CDROM: PUSH HL LD A,L ;DETECT MESSAGE CALL POSTMSG CALL ScreenPOS.SUBNAME ; EI ; POP HL LD A,H ;RESTORE DRIVE NUMBER CALL IDE__CD JP IDEJUMPBACK ; ????? посмотреть PRIM_MASTER_CMOS_T: DB M_CYLL,M_CYLH,M_HEAD,M_SECT PRIM_SLAVE_CMOS_T: DB S_CYLL,S_CYLH,S_HEAD,S_SECT SEC_MASTER_CMOS_T: DB SM_CYLL,SM_CYLH,SM_HEAD,SM_SECT SEC_SLAVE_CMOS_T: DB SS_CYLL,SS_CYLH,SS_HEAD,SS_SECT SETUPDETECT: LD A,H LD IX,PRIM_MASTER_CMOS_T CP 0 JR Z,SETUPD2 LD IX,PRIM_SLAVE_CMOS_T CP 1 JR Z,SETUPD2 LD IX,SEC_MASTER_CMOS_T CP 2 JR Z,SETUPD2 LD IX,SEC_SLAVE_CMOS_T SETUPD2: CALL SELECT_IDE LD HL,TEMP LD DE,TEMP+1 LD BC,511 LD (HL),0 LDIR CALL WAITHDD RET C LD A,(IX+2) ;M_HEAD CALL READCMS LD (TEMP+#06),A ; !TODO сделать через структуру. HEADS PER TRACK LD A,(IX+1) ;M_CYLH CALL READCMS PUSH AF LD A,(IX+0) ;M_CYLL CALL READCMS POP HL LD L,A LD (TEMP+#02),HL ; !TODO сделать через структуру. CYLINDERS LD A,(IX+3) ;M_SECT CALL READCMS LD (TEMP+#0C),A ; !TODO сделать через структуру. SECTOR PER TRACK LD A,#A0 LD BC,IDE.Write.DriveCtrl OUT (C),A LD A,IDE.Device.HDD LD (IDEDEV),A CALL IDESPEC RET ;ID_BUFFER: BLOCK #100,0 ;!HARDCODE ; !FIXIT уменьшить буфер или перенести? 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 ;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 MODEL: LD HL,TEMP+27*2 ; !TODO сделать через структуру. LD A,(HL) OR A JR Z,.unknown LD B,20 CALL DWPRINT AND A RET .unknown: LD A,msgStrings.ideUnknown CALL POSTMSG AND 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,#C200 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,#031E LD A,0 CALL TRDOSX LD BC,#0C1E LD A,1 CALL TRDOSX LD BC,#301E LD A,2 CALL TRDOSX LD BC,#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 ; /* SDOUBLE: DB #C9 DB #BB DB #CD DB #BA DB #C8 DB #BC DB #CC DB #B9 DB #CB DB #CA SSINGLE: DB #DA DB #BF DB #C4 DB #B3 DB #C0 DB #D9 DB #C3 DB #B4 DB #C2 DB #C1 SSIN_DW: DB #C9 DB #BB DB #C4 DB #BA DB #C7 DB #B6 DB #C7 DB #B6 DB #D1 DB #C1 SSIN_UP: DB #C7 DB #B6 DB #C4 DB #BA DB #C8 DB #BC DB #C7 DB #B6 DB #C2 DB #CF SSIN_AL: DB #C7 DB #B6 DB #C4 DB #BA DB #C7 DB #B6 DB #C7 DB #B6 DB #C2 DB #C1 ; SELEM: UL: DB #DA UR: DB #BF ZL: DB #C4 VL: DB #B3 LL: DB #C0 LR: DB #D9 LC: DB #C3 RC: DB #B4 UC: DB #C2 DC: DB #C1 ; */ 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 ; ; ;--------------------------------------- INCLUDE 'src/bios/ROM/SETUP/messages.z80' ;--------------------------------------- ; /* MSG_Buffer_Length EQU MSG_ENG_END-MSG_ENG STACK EQU $+128 MSG_Buffer EQU STACK+2 TMP_BUFFER EQU MSG_Buffer+MSG_Buffer_Length IF TMP_BUFFER+1024 > #C000 DISPLAY 'Page limit exceeded by: ',/A,$-#C000 ASSERT TMP_BUFFER+1024 > #C000 ENDIF */ 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 ;