Sprinter-Core/src/bios/rom/SETUP/MAIN.asm
2024-04-29 10:25:38 +10:00

1588 lines
32 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;[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
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,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 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
; ????? ¯¥à¥­¥á⨠íâ® ¢ ä㭪樨 <20>ˆŽ?
; 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
CALL PORTS_INIT.clean_kbd_buf ;Clearing the keyboard buffer
CALL PORTS_INIT.clean_mouse_buf ;Clearing the mouse buffer
CALL INT_OFF
; âãâ ­¥ ¤®«¦­® ¡ëâì ¨á¯®à祭® §­ ç¥­¨¥ 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
//////////////////////////////////////////////////////////////////////
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
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 "ڿijÀÙ", "ôÂÁ" ; #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
;