Crazy-Blaster/Crazy BIOS/rom/SETUP/MAIN.asm
2024-08-02 02:52:29 +10:00

1662 lines
34 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 'crazy 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/2023
;=======================================
;SETUP_MAIN:
MAIN_START:
POP HL
LD SP,STACK
PUSH HL
LD (RET_TO_EXP_ADDR),hl
JP START
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/2023
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/2023
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
; [x] 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,vROM.BIOS
OUT (CNF_PORT.vBIOS),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 > 0
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
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 ZXMODE_SETUP
CALL CLEARM
CALL RESCREEN
;R06
LD BC,CMOS_CELL.BootUpParams.Mask.QuickStartROM ;#010E
CALL G_VALUE
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 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:
; <CTRL> for recovery boot
; LD DE,#0428
; CALL LP_SET_PLACE
; LD A,msgStrings.forCtrlBootButton
; LD E,COLORS.CGA.INC.WHITE
; CALL POSTMSC
;
; <ALT> For alternative boot
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
; ; [x] 05/07/2024 <CTRL for Recovery>
; BIT X_CTRL,A
; LD BC,#FFFF ; ¬ àª¥à ¤«ï PrepareToBOOT, ç⮡ £à㧨« Recovery
; JR NZ,RECOVERY_BOOT
JR 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.INC.LRED
CALL C,POSTMSC
CALL ScreenPOS.CRLF
;
CALL INT_ON
ALT_BOOT:
; LD A,msgStrings.bootAltDrv
; LD E,COLORS.CGA.INC.LGREEN
; CALL POSTMSC
; LD BC,CMOS_CELL.BootDrives.Mask.AltSysDisk ;#7010
; CALL PrepareToBOOT
; LD A,msgStrings.bootFail
; LD E,COLORS.CGA.INC.LRED
; 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,ENTER_SETUP
;
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 ; 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:
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,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 ; !TODO ¬®¦­® ¯¥à¥¤¥« âì ­  ¢ë§®¢ ä㭪樨 ¡¨®á 
; 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
; ¯à¨¡¨¢ ¥¬ ¯®á«¥¤­¨© à ¬¤¨áª, ¥á«¨ § ­ïâ
.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: LD HL,TEMP
CALL EMM.GetMemBlkPages ; ª¨¤ ¥¬ ¢ ¡ãä¥à ­®¬¥à  áâà ­¨æ RAM disk
IN A,(SLOT3)
LD (.slot3save),A
;
LD HL,ROM_DISK.Pages.Number
LD B,0
LD C,(HL)
INC C
LD DE,TEMP+ROM_DISK.Pages.Size
LDIR ; ª¨¤ ¥¬ ¤ «ìè¥ ¢ ¡ãä¥à ­®¬¥à  áâà ­¨æ ROM disk
;
LD A,CNF_PORT.EXTENSION
OUT (CNF_PORT.vZX_ROM),A
LD BC,#1FFD
DEC A
OUT (C),A
;
LD IY,TEMP+ROM_DISK.Pages.Size ; ROM_DISK.Pages.Number
LD IX,TEMP
LD B,(IY+0)
LD A,R
PUSH AF
DI
;
.loopIMGtoRAM: PUSH BC
INC IY
LD A,(IY+0)
LD BC,#7FFD
OUT (C),A
LD A,(IX+0)
OUT (SLOT3),A
INC IX
LD HL,0
LD DE,#C000
LD BC,#4000
LDIR
POP BC
DJNZ .loopIMGtoRAM
;
XOR A
LD BC,#7FFD
OUT (C),A
OUT (CNF_PORT.vBIOS),A
LD B,#1F
LD A,2
OUT (C),A
.slot3save+*: LD A,0
OUT (SLOT3),A
POP AF
JP PO,.noInterrupts
EI
.noInterrupts: ;
;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 <CTRL for Recovery>
; INC BC
; LD A,B
; OR C
; JP Z,RECOVERYstart
; DEC BC
;
; CALL G_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
JP RECOVERYstart
; 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,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.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: CALL FN_CRIPT.board_id
;
PUSH AF
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
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
RET
;
.ver_DX: DZ "DX"
.ver_DP: DZ "DP"
.ver_Max: DZ "Max"
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
JP FN_VERSION
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
;---------------------------------------------------------------[]
;!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 "ڿ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
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
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 'IM2_INT.asm'
//////////////////////////////////////////////////////////////////////
POSTMSG:
CALL FindStringAddr
JP PRINTZ
POSTMSC:
CALL FindStringAddr
LD A,E
JP CPRINTZ
;
; 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
;
;----------------------------------------------------------------------[]
;!TODO ᤥ« âì ¢ë¡®à ¢ Setup, çâ® £à㧨âì ¢ v<>‡“ ¯à¨ áâ àâ¥. ‚ à¨ ­âë:
;[ ] 0 - <20>¥ £à㧨âì <20>‡“ ᯥªâà㬠, ¨­¨â¨âì áâà ­¨æã #41 ª ª ¢ 3.04
;[ ] 1 - ƒà㧨â <20>‡“ ᯥªâà㬠 ¨§ ROM ¯à¨ áâ à⥠¥á«¨ ­¥â ä« £  ZX
;[ ] 2 - ƒà㧨â <20>‡“ ᯥªâà㬠 ¨§ ROM ¯à¨ ª ¦¤®¬ ¯¥à¥§ ¯ã᪥
;[ ] 3 - <20>¥ £à㧨âì <20>‡“ ᯥªâà㬠, ¨­¨â¨âì áâà ­¨æã #41 â ª,
; ç⮡ ª®¤ ¢ ­¥© ¯®¤£à㦠« <20>‡“ ᯥªâà㬠 ¯à¨ ®¡à é¥­¨¨
ZXMODE_SETUP: IN A,(SLOT3)
PUSH AF
LD A,Spec_Page
OUT (SLOT3),A
; ‡ £«ã誠 ¤«ï áâà ­¨æë #41 ­  ¢á直© ¯®¦ à­ë©
.init_41h: 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
.No_Need_To_Load_ZXROMS:
POP AF
OUT (SLOT3),A
RET
;---------------------------------------
INCLUDE 'crazy 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 'crazy 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
;