Sprinter-Core/src/bios/rom/SETUP/MAIN.asm
2024-09-28 02:06:04 +10:00

1928 lines
40 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/2023
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ;
;SETUP_MAIN:
MAIN_START:
; POP AF
; POP HL
LD SP,STACK
PUSH HL
LD (RET_TO_EXP_ADDR),HL
JP START
; DB "(C) 2002 PETERS PLUS LTD "
RET_TO_EXP_ADDR: WORD 0000 ; place for save ret address to exp
;
;------------------- ;!!!!! ¯®á¬®âà¥âì
; ‡­ ç¥­¨ï ¢à¥¬¥­¨ ¨ ¤ âë ¢ ª¬®á § ¯¨á ­ë ¤¥áïâ¨ç­ë¬¨ §­ ç¥­¨ï¬¨
; ¨ ¢ ॣ¨áâॠA ­  ¢ë室¥ ¨§ ä㭪樨 #F6 (CMOS_RD) BIOS §­ ç¥­¨ï ¤¥áïâ¨ç­ë¥.
GETTIME:
PUSH HL
LD D,CMOS.Register.hours
CALL CMOS_RD
CP #24 ;24
jp nc,.error
LD (HL),A
INC HL
LD D,CMOS.Register.minutes
CALL CMOS_RD
CP #5A ; 60
jp nc,.error
LD (HL),A
INC HL
LD D,CMOS.Register.seconds
CALL CMOS_RD
CP #5A ; 60
jp nc,.error
LD (HL),A
INC HL
LD D,CMOS.Register.date ; ç¨á«®
CALL CMOS_RD
CP #32
jp nc,.error
LD (HL),A
INC HL
LD D,CMOS.Register.month
CALL CMOS_RD
CP #13 ;13
jp nc,.error
LD (HL),A
INC HL
LD D,CMOS.Register.century
CALL CMOS_RD
CP #1A ;20
jp c,.error
CP #9A ;100
jp nc,.error
LD (HL),A
INC HL
LD D,CMOS.Register.year
CALL CMOS_RD
CP #9A ;100
jp nc,.error
LD (HL),A
; DEC HL
; LD C,A
; LD A,19
; CP (HL)
; RET Z
; LD A,20
; CP (HL)
; RET Z
; LD A,80
; CP C
; LD A,20
; JR NC,.correct_century
; LD A,19
; .correct_century:
; LD (HL),A
; LD D,#32 ;CENTURY
; LD C,#F7 ; !HARDCODE
; RST_to_BIOS_18
POP HL
RET
.error:
LD HL,.default_date
POP DE
LD BC,7
LDIR
;---[]
;!FIXIT
CALL CMSERR
; LD HL,.default_date
; call writeDateTimeToCmos
;---[]
ld a,#FF
ld (ERRSUM.ErrDateTime),a
RET
LUA ALLPASS
sj.insert_define("Current_CENTURY", math.modf(tonumber(os.date("%Y"))/100))
sj.insert_define("Current_YEAR", tonumber(os.date("%y")))
sj.insert_define("Current_MONTH", tonumber(os.date("%m")))
sj.insert_define("Current_DATE", tonumber(os.date("%d")))
ENDLUA
.default_date:
BYTE 0,0,0 ; Hours, minutes, seconds
BYTE #Current_DATE
BYTE #Current_MONTH
BYTE #Current_CENTURY
BYTE #Current_YEAR
UNDEFINE Current_DATE
UNDEFINE Current_MONTH
UNDEFINE Current_CENTURY
UNDEFINE Current_YEAR
;--------------------------------
;
;R07 ; !FIXIT CMOS ᤥ« âì ᮣ« á­® ¤®ª¥ ­  ª¬®á
; ¥á«¨ ¡ â à¥©ª  ᥫ , â® ¯à¨ 祪¥ ª¬®á  ¢ë¤ ¢ âì ᮮ⢥âáâ¢ãîéãî ®è¨¡ªã ¨, ¢®§¬®¦­®, à ¡®â âì ª ª ¡¥§ ª¬®á .
CMOSINIT:
LD D,CMOS.Register.CTRLregA ; !FIXIT FREQ
CALL CMOS_RD
CP #26 ; !FIXIT
JR NZ,CMSERR
LD D,CMOS.Register.CTRLregC
CALL CMOS_RD
CP #50
RET Z
CMSERR:
LD D,CMOS.Register.CTRLregB
LD A,#82 ;TIME FORMAT ; !FIXIT CMOS
CALL CMOS_WR
LD D,CMOS.Register.CTRLregA
LD A,#26 ; !FIXIT CMOS FREQ
CALL CMOS_WR
LD D,CMOS.Register.CTRLregC
LD A,#0 ; !FIXIT CMOS
CALL CMOS_WR
LD HL,GETTIME.default_date
call writeDateTimeToCmos
LD D,CMOS.Register.CTRLregB
LD A,#02 ;TIME FORMAT ; !FIXIT CMOS
CALL CMOS_WR
; LD D,13
; LD A,#80 ; !FIXIT CMOS
; LD C,#F7 ; !HARDCODE
; RST_to_BIOS
RET
CLEAR_MEM: IN A,(SLOT3)
PUSH AF
LD A,SYS_PAGE
OUT (SLOT3),A
; save RAM disks on reboot when memory is cleared
LD HL,SYS_PAGE.RAMD_KEYS
LD DE,TPOINTD
LD BC,SYS_PAGE.RAMD_KEYS.NUM
LDIR
; [x] 4/11/2023
LD HL,SYS_PAGE.Sp_RAMD_KEYS
LD BC,SYS_PAGE.Sp_RAMD_KEYS.NUM
LDIR
;
; ®ç¨é ¥¬ RAM 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.RAM_TABLE
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 GET_CMOS_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
CALL TRD_MOUNT ; !TEST 24/09/2024 ¯¥à¥­®á ¢ EXIT_SETUP (¯¥à¥¤ § ¯ã᪮¬ ZX)
CALL SetUp_ZX_HDD
IF FREE_ZX_PAGES
LD A,Spec_Page
OUT (SLOT3),A
;
LD A,(Spec_Page.flag_Z)
CP 'Z'
LD A,(Spec_Page.flag_X)
LD B,A
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,B
JR NZ,.Set_Page41
CP 'X'
JR Z,.vROMs_Installed
;
.Set_Page41: CALL ZXMODE_SETUP.Set_Page41
.vROMs_Installed:
CALL MANAGE_ZX_PAGES.GET_SCORP_RAM ;!TODO ­ áâà ¨¢ âì ¢ BIOS zx mode
JR NC,.set_ZX_params
;
CALL ScreenPOS.CRLF
LD A,msgStrings.noMemZX
LD E,COLORS.CGA.INK.RED
CALL POSTMSC
.loop_di: DI
HALT
JR .loop_di
;
.set_ZX_params: LD H,A ; Block_ID.vRAM
;!TODO ­ áâà ¨¢ âì ¢ BIOS zx mode
LD DE,256*0 + CNF_PORT.TURBO.ON + CNF_PORT.CNF_0
LD A,(SYS_PAGE.Block_ID.vROM)
LD L,A
LD B,#FE ; !HARDCODE Port All Mode data
LD A,%0000'0010
EX AF,AF'
XOR A
;
;POP HL ; <20>… ­ã¦¥­.  ¤à¥á ¢®§¢à â  ¢ EXP ¨§ SETUP
LD A,ROM.EXTENSION
OUT (SYS_PORT.ROM),A
XOR A
JP GOTO_SPECTRUM.FN
ELSE
;LD BC,#020E
;CALL GET_CMOS_VALUE
;OR A
;LD A,#EC ;SPRINTER
;JR Z,XFLEX
;LD A,#EA ;SPECTRUM
;XFLEX:
XOR A ;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
ENDIF
SetUp_ZX_HDD: LD D,CMOS_CELL.TRDOSmount
CALL CMOS_RD
AND %1010'1010 ; ¬ áª  ¤«ï 4-å HDD
RET Z
; find first good partition
;
; ç¨á⪠ ¯¥à¥¬¥­­ëå ZX HDD
IN A,(SLOT3)
EX AF,AF
LD A,SYS_PAGE
OUT (SLOT3),A
;
XOR A
LD H,A
LD L,A
LD (SYS_PAGE.CURRENT_DIR_SEC_L),HL
LD (SYS_PAGE.CURRENT_DIR_SEC_H),HL
DEC A
LD (SYS_PAGE.CURRENT_HDD),A
LD (SYS_PAGE.CURRENT_DIR_DRIVE),A
LD (SYS_PAGE.CURRENT_DIR_DRIVE_COPY),A
;
EX AF,AF
OUT (SLOT3),A
EX AF,AF
;
XOR A
.loop: PUSH AF
CALL FN_HDD_PART
POP BC
RET NC
LD A,B
INC A
CP #10
JR C,.loop
RET
;-----------------------------------------------------------------------;
INSTALL:
CALL INT_ON
CALL SET_CGA
XOR A
OUT (#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.INK.LCYAN
CALL CPRINTZ
; LD HL,BUILD
; LD A,COLORS.CGA.INK.LCYAN
; CALL CPRINTZ
LD DE,#0128 ; !HARDCODE
CALL LP_SET_PLACE
LD A,msgStrings.copyRightPeters
LD E,COLORS.CGA.INK.LGREEN
CALL POSTMSC
LD DE,#0228 ; !HARDCODE
CALL LP_SET_PLACE
LD A,msgStrings.copyRightSPTeam
LD E,COLORS.CGA.INK.GREEN
CALL POSTMSC
IF BETA_BUILD > 0
LD DE,#0328
CALL LP_SET_PLACE
LD A,msgStrings.testBIOSmsg
LD E,COLORS.CGA.FLASH + COLORS.CGA.INK.RED
CALL POSTMSC
ENDIF
IN A,(SLOT3)
PUSH AF
LD A,SYS_PAGE
OUT (SLOT3),A
LD HL,RebootDate
CALL GETTIME
POP AF
OUT (SLOT3),A
RET
;BUILD:
; db ', BIOS v', Disk_subsystem_ver_txt,0 ; !FIXIT ¬®¦¥â ¢®âª­ãâì ¢¬¥á⥠á msgStrings ?
RESTART_ID:
.str: DZ "RESTART"
.size EQU $ - RESTART_ID.str
Start_again:
ld sp,STACK-2
START:
DI
PUSH AF
XOR A
LD (ERRSUM),A
LD (ERRSUM.ErrDateTime),A
; LD C,#97
; RST_to_BIOS_18
; XOR A
; LD C,#F2
; RST_to_BIOS_18
;------------------------------ ;!!!!! ¯®á¬®âà¥âì
; CALL KINIT
;------------------------------ ;!!!!! ¯®á¬®âà¥âì
;--------[Clean keyboard buffer]--------
; clean_kbd_buf:
; IN A,(Z84.SIO.Ch_A.Ctrl)
; BIT 0,A
; jr z,.exit
; IN A,(Z84.SIO.Ch_A.Data)
; jr clean_kbd_buf
; .exit:
;---------------------------------------
;R08 CALL OPENDOS
;!TEST 20/08/2024
;CALL ZXCLS
;
CALL READING
CALL TEST_CHECKSUM
CALL NZ,SETDEFX
;!TODO CMOS Disabled use of CONFIG_DE (#C13A) word
;LD A,#1C
;CALL READCMS
;PUSH AF
;LD A,CMOS_CELL.HardwareConfiguration
;CALL READCMS
;POP DE
;LD E,A
;
LD C,SLOT3
IN B,(C)
PUSH BC
LD A,SYS_PAGE
OUT (C),A
; LD (SYS_PAGE.CONFIG_DE),DE
LD HL,SYS_PAGE.INT_ADRESS ;EXTENDED INTERRUPT
XOR A
LD (HL),A
INC L
LD (HL),A
INC L
LD (HL),A
INC L
LD (HL),A
POP BC
OUT (C),B
;CALL TRD_MOUNT ; !TEST 24/09/2024 ¯¥à¥­®á ¢ EXIT_SETUP (¯¥à¥¤ § ¯ã᪮¬ ZX)
CALL FDD_INSTAL
CALL ZXMODE_SETUP
CALL CLEAR_MEM
CALL XY_SCREEN
;R06
LD BC,CMOS_CELL.BootUpParams.Mask.QuickStartROM ;#010E
CALL GET_CMOS_VALUE
POP BC
INC B
DEC B
JR NZ,IGNORE_QuickStartROM ; १ã«ìâ â ¯à®¢¥àª¨ 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,RESTART_ID.str
LD B,RESTART_ID.size
CALL COMPARE_RESTART_ID
CALL NZ,SET_RESTART_ID
POP BC
OUT (C),B
JR Z,YES_QuickStartROM
POP AF
JR IGNORE_QuickStartROM
SET_RESTART_ID:
PUSH AF
LD HL,RESTART_ID.str
LD DE,SYS_PAGE.RESTART_ID
LD BC,RESTART_ID.size
LDIR
LD HL,PowerOnDate ; !TODO ¨§¬¥­¨âì ¯®¤ áâàãªâãàã, ª®£¤  áâàãªâãà  ¯¥à¥¬¥­­ëå ¡ã¤¥â £®â®¢ 
CALL GETTIME
POP AF
RET
YES_QuickStartROM:
POP AF
OR A
JP NZ,EXIT_SETUP
IGNORE_QuickStartROM:
CALL INSTALL
LD DE,#0528
;CALL ScreenPOS.LOCAT
CALL LP_SET_PLACE
LD A,msgStrings.toSetupButton
LD E,COLORS.CGA.FLASH + COLORS.CGA.INK.WHITE
CALL POSTMSC
LD DE,#0900
;CALL ScreenPOS.LOCAT
CALL LP_SET_PLACE
ERRSUM+1:
LD A,#00
OR A
JR Z,.ErrDateTime
XOR A
LD (.ErrDateTime+1),A ; ¥á«¨ ª®­â஫쭠ï á㬬  ᫥⥫ , â® á®®¡é¥­¨¥ ® ªà¨¢ëå ¤ â¥/¢à¥¬¥­¨ ¢ ª¬®á ­¥ ¢ë¢®¤¨¬
LD A,msgStrings.cmosChecksumErr
LD E,COLORS.CGA.INK.RED
CALL POSTMSC
CALL ScreenPOS.CRLF
CALL ScreenPOS.CRLF
JR CHEKOK
.ErrDateTime+1:
LD A,0
OR A
JR Z,CHEKOK
LD A,msgStrings.cmosDateTimeErr
LD E,COLORS.CGA.INK.RED
CALL POSTMSC
CALL ScreenPOS.CRLF
CALL ScreenPOS.CRLF
CHEKOK: ;CALL ScreenPOS.GET_CUR
CALL LP_GET_PLACE
PUSH DE
CALL LOGOTYPE
LD DE,#0000
;CALL ScreenPOS.LOCAT
CALL LP_SET_PLACE
LD A,msgStrings.spModel
CALL POSTMSG
CALL PIDNUM
CALL ScreenPOS.CRLF
LD A,msgStrings.boardID
CALL POSTMSG
CALL PIDBOARD
CALL ScreenPOS.CRLF
LD A,msgStrings.spCNFver
CALL POSTMSG
CALL CNF_VER_PRINT
CALL ScreenPOS.CRLF
LD A,msgStrings.spMemory
CALL POSTMSG
CALL EMM.GetMemSize
PUSH BC
CALL PMEMORY
CALL ScreenPOS.CRLF
LD A,msgStrings.memoryAvailable
CALL POSTMSG
POP HL
CALL PMEMORY
CALL ScreenPOS.CRLF
;CALL TSTCMOS
CALL CMOS_TEST
LD A,msgStrings.cmosNone
JR C,CMOS_ABSENT
; CMOS OK
CALL CMOSINIT
LD A,msgStrings.cmosFound
CALL POSTMSG
LD A,','
CALL PRINT_CHAR
LD A," "
CALL PRINT_CHAR
LD HL,RebootDate
CALL PRNTIME
CALL ScreenPOS.CRLF
JR INFO_MESSAGE
CMOS_ABSENT:
CALL POSTMSG
INFO_MESSAGE:
; <CTRL> for recovery boot
; LD DE,#0428
; CALL LP_SET_PLACE
; LD A,msgStrings.forCtrlBootButton
; LD E,COLORS.CGA.INK.WHITE
; CALL POSTMSC
;
; <ALT> For alternative boot
LD DE,#0528
CALL LP_SET_PLACE
LD A,msgStrings.forAltBootButton
LD E,COLORS.CGA.INK.WHITE
CALL POSTMSC
POP DE
CALL LP_SET_PLACE
CALL TSETUP ;!TODO ¬®¦¥â ¯¨å­ãâì ¥ñ ­  ¯à¥à뢠­¨ï?
CALL CONFIGURE_IDE_DRIVES.START
CALL CTRLKEY
LD A,B
; [x] 05/07/2024 <CTRL for Recovery>
BIT X_CTRL,A
LD BC,#FFFF ; ¬ àª¥à ¤«ï PrepareToBOOT, ç⮡ £à㧨« Recovery
JR NZ,RECOVERY_BOOT
;
BIT X_ALT,A
JR NZ,ALT_BOOT
;
CALL TSETUP
;
LD BC,CMOS_CELL.BootDrives.Mask.SysDisk ;#0710
RECOVERY_BOOT:
CALL PrepareToBOOT
LD A,msgStrings.bootFail
LD E,COLORS.CGA.INK.LRED
CALL C,POSTMSC
CALL ScreenPOS.CRLF
;
CALL INT_ON
ALT_BOOT:
LD A,msgStrings.bootAltDrv
LD E,COLORS.CGA.INK.LGREEN
CALL POSTMSC
LD BC,CMOS_CELL.BootDrives.Mask.AltSysDisk ;#7010
CALL PrepareToBOOT
LD A,msgStrings.bootFail
LD E,COLORS.CGA.INK.LRED
CALL C,POSTMSC
CALL ScreenPOS.CRLF
;NO START DISK - RESTART / SETUP / ZX SPECTRUM mode
LD BC,CMOS_CELL.Options.Mask.RebootMSG ;#021D
CALL GET_CMOS_VALUE
OR A
JP Z,EXIT_SETUP
CALL ScreenPOS.CRLF
LD A,msgStrings.afterBootFail
LD E,COLORS.CGA.INK.RED
CALL POSTMSC
;EI
CALL INT_ON
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_RESTART_ID:
LD A,(DE)
CP (HL)
RET NZ
INC HL
INC DE
DJNZ COMPARE_RESTART_ID
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
XY_SCREEN: ;R06
LD A,CMOS_CELL.ScreenPosition
CALL READCMS
LD B,A
LD A,ACEX.HOLD
JP SET_PORTS
; PUSH AF
; IN A,(SLOT3)
; LD E,A
; LD A,DCP_PAGE
; OUT (SLOT3),A
; LD A,(#C400) ;c400 for first cfg 50176
; LD D,A
; LD A,ACEX.HOLD
; LD (#C400),A
; POP AF
; LD BC,0
; OUT (C),A
; LD A,D
; LD (#C400),A
; LD A,E
; OUT (SLOT3),a
; RET
;
;R07
; CMOSINIT:
; LD D,10 ;FREQ
; LD C,#F6 ;READ CMOS
; RST_to_BIOS
; CP #26
; JR NZ,CMSERR
; LD D,12
; LD C,#F6
; RST_to_BIOS
; CP #50
; RET Z
; CMSERR:
; LD D,10
; LD A,#26 ;FREQ
; LD C,#F7
; RST_to_BIOS
; LD D,11
; LD A,#02 ;TIME FORMAT
; LD C,#F7
; RST_to_BIOS
; LD D,12
; LD A,#50
; LD C,#F7
; RST_to_BIOS
; LD D,13
; LD A,#80
; LD C,#F7
; RST_to_BIOS
; RET
;------------------- ;!!!!! ¯®á¬®âà¥âì
; 0 - 1-st FDD
; 1 - 2-nd FDD
; 2 - 1-st IDE
; 3 - 2-nd IDE
; 4 - 3-rd IDE
; 5 - 4-th IDE
; 6 - RAM-DISK
;
; -> BC - ï祩ª  ¨ ¬ áª  ¤«ï ç⥭¨ï §­ ç¥­¨ï ª¬®á ¤«ï § £à㧮筮£® ¤à ©¢ 
;
;[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
RECOVERYstart:
LD A,msgStrings.bootRecovery
CALL POSTMSG
;
; ‚ë¡®à à ¬¤¨áª  ¤«ï ४ ¢¥à¨
_mRECOVERYrdChooseTYPE RECOVERYrdChooseTYPE
; ¯à¨¡¨¢ ¥¬ ¯®á«¥¤­¨© à ¬¤¨áª, ¥á«¨ § ­ïâ
.killRAMdisk: LD A,SYS_PAGE.RAMD_KEYS.NUM-1
LD (.RDkey),A
CALL EMM.FreeMemRMD
JR NC,.setRAMdisk
JR Z,.setRAMdisk
RET ; ­¥¯®­ïâ­ ï ®è¨¡ª  - ¢ë室¨¬
.setRAMdisk: LD A,(.RDkey)
LD B,ROM_DISK.Pages.Size
CALL EMM.GetMemRMD
JR NC,.IMGread ; ᢮¡®¤­ë© à ¬¤¨áª ­ ©¤¥­
DEC A
JR Z,.FreeMem ; ®è¨¡ª  - ­¥¤®áâ â®ç­® ¯ ¬ïâ¨, ¢ë§ë¢ ¥¬ ®ç¨áâªã ¯ ¬ïâ¨
RET ; ­¥¯®­ïâ­ ï ®è¨¡ª  - ¢ë室¨¬
.FreeMem: CALL EMM.FullInit
JR .killRAMdisk
;
; ‚室: A - RAM block ID
.IMGread:
; ‚ à¨ ­â ª®¯¨à®¢ ­¨ï ROM -> RAM disk
_mRECOVERYmountTYPE RECOVERYmountTYPE
;
;Exit from "ROM Disk to RAM disk" procedure
.RDkey+*: LD A,0
OR DRIVE_CODES.SPRINTER.RAM
LD B,A ; ¯¥à¥¤ ñ¬ § £à㧮筮¥ ãáâனá⢮ ¢ OS_LOAD
JP OS_LOAD
;
;[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
;
PrepareToBOOT: ;CALL INT_ON
HALT
CALL PORTS_INIT.clean_kbd_buf ;Clearing the keyboard buffer
CALL PORTS_INIT.clean_mouse_buf ;Clearing the mouse buffer
CALL INT_OFF
; âãâ ­¥ ¤®«¦­® ¡ëâì ¨á¯®à祭® §­ ç¥­¨¥ BC
; [x] 05/07/2024 <CTRL for Recovery>
INC BC
LD A,B
OR C
JP Z,RECOVERYstart
DEC BC
;
CALL GET_CMOS_VALUE
LD B,DRIVE_CODES.SPRINTER.FDD
; FDD
OR A
JR Z,FDSTART ; FDD A:
INC B
DEC A
JR Z,FDSTART ; FDD B:
; IDE
LD B,DRIVE_CODES.SPRINTER.HDD
DEC A
JR Z,HDSTART
INC B ;LD B,#81
DEC A
JR Z,HDSTART
INC B ;LD B,#82
DEC A
JR Z,HDSTART
INC B ;LD B,#83
DEC A
JR Z,HDSTART
; RAM
DEC A
JR Z,RDSTART
; ROM
DEC A
JP Z,RECOVERYstart
; Error
SCF
RET
FDSTART:
PUSH BC
PUSH BC
LD A,msgStrings.bootFdd
CALL POSTMSG
POP AF
CALL FDD_5x_RESET
POP BC
RET C
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.INK.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
FDD_INSTAL: 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 GET_CMOS_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 GET_CMOS_VALUE
LD HL,FD720A
OR A
JR Z,.SETFD1
LD HL,FD144A
DEC A
JR NZ,.NOFDD1
.SETFD1: IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD DE,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
;
IF MotherBoardType > 0
PUSH AF
ENDIF
PUSH DE
PUSH HL
PUSH BC
LD A,B
CALL PRNHEX
LD A,'-'
CALL PRINT_CHAR
POP BC
LD A,C
CALL PRNHEX
LD A,'-'
CALL PRINT_CHAR
POP HL
CALL IZPRINT
POP DE
PUSH DE
LD A,D
CALL PRNHEX
POP DE
LD A,E
IF MotherBoardType == 0
JP PRNHEX
ELSE
CALL PRNHEX
LD A,' '
CALL PRINT_CHAR
POP AF
; type 0 - Classic
RET Z
; type 1 - DX
LD HL,.ver_DX
DEC A
JP Z,PRINTZ
; type 2 - DP
LD HL,.ver_DP
DEC A
JP Z,PRINTZ
; type 3 - Max
LD HL,.ver_Max
DEC A
JP Z,PRINTZ
; type 4 - test
LD HL,.Test
DEC A
JP Z,PRINTZ
RET
;
.ver_DX: DZ "DX"
.ver_DP: DZ "DP"
.ver_Max: DZ "Max"
.Test DZ "0123456789A"
ENDIF
CNF_VER_PRINT:
LD HL,memBUFFER.ID
IFN BIOS.FN_VERSION.STR.BitstreamVer = 0
LD BC,BIOS.FN_VERSION.STR.BitstreamVer*256
XOR A
.loop: CPIR
DJNZ .loop
ENDIF
JP PRINTZ
;PIDNUM LD A,#0D
; LD HL,ID_BUFFER
; LD BC,#0030
; CPIR
; RET NZ
; INC HL
; LD BC,#0286
; RST_to_BIOS_18
; INC HL
; LD BC,#0586
; RST_to_BIOS_18
; INC HL
; LD BC,#0286
; RST_to_BIOS_18
; XOR A
; RET
;PIDDATE
; LD A,#0D
; LD HL,ID_BUFFER
; LD BC,#0030
; CPIR
; RET NZ
; INC HL
; CPIR
; RET NZ
; INC HL
; LD BC,#0A86
; JP_to_BIOS
//////////////////////////////////////////////////////////////////////
; INCLUDE 'IM2_INT.asm'
//////////////////////////////////////////////////////////////////////
PRNHEX: LD D,A
RRCA
RRCA
RRCA
RRCA
AND #0F
ADD A,#30
CP #3A
JR C,PRNH1
ADD A,7
PRNH1: CALL PRINT_CHAR
LD A,D
AND #0F
ADD A,#30
CP #3A
JP C,PRINT_CHAR
ADD A,7
JP PRINT_CHAR
PHEX: LD D,A
RRCA
RRCA
RRCA
RRCA
AND #0F
ADD A,#30
CALL PRINT_CHAR
LD A,D
AND #0F
ADD A,#30
JP PRINT_CHAR
PRNTIME:
IN A,(SLOT3)
PUSH AF
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(HL)
CALL PHEX
LD A,":"
CALL PRINT_CHAR
INC L
LD A,(HL)
CALL PHEX
LD A,":"
CALL PRINT_CHAR
INC L
LD A,(HL)
CALL PHEX
POP AF
OUT (SLOT3),A
RET
PMEMORY:
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL ; * 16
CALL IPRINT
LD A,"K"
JP PRINT_CHAR
IFUSED ZXCLS
ZXCLS: LD HL,#4000
LD DE,#4001
LD BC,#1AFF
LD (HL),L
LDIR
RET
ENDIF
GET_ID: LD HL,memBUFFER.ID
;LD C,BIOS.FN_VERSION
;JP_to_BIOS
JP FN_VERSION
;R01GET_ID
;R01 LD A,#10
;R01 LD BC,#1FFD
;R01 OUT (C),A
;R01 LD C,SLOT3
;R01 IN B,(C)
;R01 PUSH BC
;R01 LD A,#EE
;R01 OUT (C),A
;R01 LD HL,#FFD0
;R01 LD DE,ID_BUFFER
;R01 LD BC,#30
;R01 LDIR
;R01 POP BC
;R01 OUT (C),B
;R01 XOR A
;R01 LD BC,#1FFD
;R01 OUT (C),A
;R01 RET
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.RAM_TABLE
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
;---------------------------------------------------------------[]
;REGISTER #1E
; %0000'0011 - TR DOS A: Default / FDD / HDD / RMD
; %0000'1100 - TR DOS B: Default / FDD / HDD / RMD
; %0011'0000 - TR DOS C: Default / FDD / HDD / RMD
; %1100'0000 - TR DOS D: Default / FDD / HDD / RMD
TRD_MOUNT: LD BC,CMOS_CELL.TRDOSmount.Mask.A ;#031E
LD A,0
CALL .TRDOSX
LD BC,CMOS_CELL.TRDOSmount.Mask.B ;#0C1E
LD A,1
CALL .TRDOSX
LD BC,CMOS_CELL.TRDOSmount.Mask.C ;#301E
LD A,2
CALL .TRDOSX
LD BC,CMOS_CELL.TRDOSmount.Mask.D ;#C01E
LD A,3
.TRDOSX: ; PUSH AF
; CALL GET_CMOS_VALUE
; POP BC
; OR A
; RET Z
; LD C,BIOS.FDD_TO_DRV
; DEC A
; JP Z,ToBIOS_18
; LD C,BIOS.HDD_TO_DRV
; DEC A
; JP Z,ToBIOS_18
; SCF
; RET
PUSH AF
CALL GET_CMOS_VALUE
POP BC
OR A
RET Z
DEC A
JP Z,FDD_TO_DRV
DEC A
JP Z,HDD_TO_DRV
SCF
RET
;---------------------------------------------------------------[]
;!TODO ¯®á¬®âà¥âì
;®âªà뢠¥â ¯®àâ #FE ­  ç⥭¨¥ ¢ 3-© ª à⥠¯®à⮢
;OPENDOS:
; DI
; IN A,(SLOT3)
; EX AF,AF'
; LD A,#40
; OUT (SLOT3),A
; LD HL,#C000
; LD DE,#F000
; LD BC,#0400
; LDIR
; LD A,#40
; LD (#F26E),A
; LD (#F27E),A
; LD (#F2EE),A
; LD (#F2FE),A
; LD (#F36E),A
; LD (#F37E),A
; LD (#F3EE),A
; LD (#F3FE),A
; LD HL,#F000
; LD DE,#F400
; LD BC,#0C00
; LDIR
; EX AF,AF'
; OUT (SLOT3),A
; RET
;
setFRAME:
.double:
LD HL,.dataDoubleAll
JR .setElements
.single:
LD HL,.dataSingleAll
JR .setElements
.high: LD HL,.dataSingleDown
JR .setElements
.low: LD HL,.dataSingleUp
JR .setElements
.medium:
LD HL,.dataSingleMedium
; JR .setElements
.setElements:
LD DE,ElementsBuffer
LD BC,ElementsBuffer.Size
LDIR
RET
.dataDoubleAll: BYTE "ɻͺȼ", "̹ËÊ" ; #C9,#BB,#CD,#BA,#C8,#BC, #CC,#B9,#CB,#CA
.dataSingleAll: BYTE "ڿ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 ;!TODO ¯¥à¥¤¥« âì ­  GET_CMOS_VALUE
AND #04 ; !HARDCODE CMOS §­ ç¥­¨¥ ï§ëª 
LD HL,MSG_RUS
JR NZ,.set
LD HL,MSG_ENG
;
.set: LD DE,memBUFFER.Messages
LD BC,MSG_TABLE.Size
LDIR
RET
//////////////////////////////////////////////////////////////////////
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<>‡“ ¯à¨ áâ àâ¥. ‚ à¨ ­âë:
;[x] 0 - <20>¥ £à㧨âì <20>‡“ ᯥªâà㬠, ¨­¨â¨âì áâà ­¨æã #41 ª ª ¢ 3.04
;[x] 1 - ƒà㧨â <20>‡“ ᯥªâà㬠 ¨§ ROM ¯à¨ áâ à⥠¥á«¨ ­¥â ä« £  ZX
;[x] 2 - ƒà㧨â <20>‡“ ᯥªâà㬠 ¨§ ROM ¯à¨ ª ¦¤®¬ ¯¥à¥§ ¯ã᪥
;[ ] 3 - <20>¥ £à㧨âì <20>‡“ ᯥªâà㬠, ¨­¨â¨âì áâà ­¨æã #41 â ª,
; ç⮡ ª®¤ ¢ ­¥© ¯®¤£à㦠« <20>‡“ ᯥªâà㬠 ¯à¨ ®¡à é¥­¨¨
ZXMODE_SETUP: IN A,(SLOT3)
PUSH AF
LD A,Spec_Page
OUT (SLOT3),A
;
LD BC,CMOS_CELL.Options.Mask.LoadZXroms
CALL GET_CMOS_VALUE
;
OR A
JR Z,.init_41h
DEC A
JR Z,.CheckAndLoad
DEC A
JR Z,.Load_ZXROMS
;!TODO
;DEC A
;JR Z,.New_init_41h
;
; Check ZX ROMS Loaded
.CheckAndLoad: LD A,(Spec_Page.flag_Z)
CP 'Z'
JR NZ,.Load_ZXROMS
LD A,(Spec_Page.flag_X)
CP 'X'
JR NZ,.Load_ZXROMS
; [x] 31/12/23 ¯®¤áâà å®¢ª  ®â ­¥¤®ãâ¥çª¨ ¯ ¬ïâ¨
LD A,R
AND #80
JR Z,.No_Need_To_Load_ZXROMS
.Load_ZXROMS: XOR A
LD R,A
;
; Load ZX ROM's
LD A,ROM.EXTENSION
OUT (SYS_PORT.ROM),A
CALL MANAGE_ZX_PAGES.FREE_vMEMORY ;!FIXIT ­¥ â  áâà ­¨æ  ¢ SLOT3 ; [ ] free zx pages!
XOR A ;LD A,ROM.BIOS
OUT (SYS_PORT.ROM),A
;
LD B,3 ; !HARDCODE zx-rom number of pages
CALL EMM.GetMem
JR C,.init_41h ;!FIXIT ¯¥ç â âì ®è¨¡ªã ; [ ] free zx pages!
CALL init_zx_roms
IFN FREE_ZX_PAGES
; áâ ¢¨¬ ¬¥âªã ¥á«¨ ¯à®£à㧨«¨ <20>‡“ ᯥªâà㬠
LD HL,'XZ'
LD (Spec_Page.flag_Z),HL
ENDIF ;
.No_Need_To_Load_ZXROMS:
POP AF
OUT (SLOT3),A
RET
;
.init_41h: CALL init_zx_roms.init_41h
LD A,SYS_PAGE
OUT (SLOT3),A
CALL .Set_Page41
;!FIXIT ãáâ ­®¢¨âì ¢® ¢á¥ vROM áâà ­¨æã #41 ; [ ] free zx pages!
JR .No_Need_To_Load_ZXROMS
;
.Set_Page41: LD HL,SYS_PAGE.SHARED_BUFFER_256b + 11
LD DE,SYS_PAGE.SHARED_BUFFER_256b + 11-1
LD BC,11-1 ; !HARDCODE ª®«-¢® áâà ­¨æ vROM + RAM BLOCK ID
LD (HL),#FF
LDDR ; § ç¨é ¥¬
EX DE,HL
;
LD A,SYS_PORT.EXTENSION
OUT (SYS_PORT.ROM),A
JP MANAGE_ZX_PAGES.INIT_vROM
XOR A ;LD A,SYS_PORT.BIOS
OUT (SYS_PORT.ROM),A
RET
;
;--------------------[copy zx-roms to zx-pages]-----------------;
; SLOT0 - ROM 8, sys_port - on.
; RAM SLOT0 - page 0
; RAM SLOT3 - Spec_Page
; ¤«ï ०¨¬  zx spectrum
; !HARDCODE ­®¬¥à  áâà ­¨æ ¤«ï í¬ã«ïâ®à  <20>‡“
init_zx_roms: DI
;;;;;;;;
IF FREE_ZX_PAGES
;;;;;;;;
; <20>€ ‚•ŽŽ„… A = SYS_PAGE.Block_ID.vROM
; ¤®¡¨¢ ¥¬ ¡ãä¥à ¤® 11 ¡ ©â®¢ ¯ãáâ묨 áâà ­¨æ ¬¨
; ¢ ¡ãä¥à 㯠¤ãâ 1 RAM BLOCK ID, 3 áâà ­¨æë ¤«ï vROM ¨ #FF
LD HL,#FFFF
LD (memBUFFER.Shared + 5),HL ; !HARDCODE zx-rom number of pages
LD (memBUFFER.Shared + 7),HL ; !HARDCODE zx-rom number of pages
LD (memBUFFER.Shared + 9),HL ; !HARDCODE zx-rom number of pages
; ¯®«ãç ¥¬ ᯨ᮪ áâà ­¨æ ¤«ï vROM
LD HL,memBUFFER.Shared
LD (HL),A
INC HL
LD B,A
CALL EMM.GetMemBlkPages
;
LD A,SYS_PAGE
OUT (SLOT3),A
; ãáâ ­ ¢«¨¢ ¥¬ ­®¬¥à  áâà ­¨æ vROM ¢ ¯®àâë ALTERA
DEC HL
LD A,ROM.EXTENSION
OUT (SYS_PORT.ROM),A
CALL MANAGE_ZX_PAGES.INIT_vROM
; Š®¯¨à㥬 ®¡à §ë ZX-ROM ¨§ <20>‡“ ¢ áâà ­¨æë vROM
INC A ; !HARDCODE LD A,2
LD BC,+(3*2)*256 + SLOT3 ; !HARDCODE B = (zx-rom number of pages)*2
LD HL,memBUFFER.Shared + 1
.loop: OUTI
OUT (ROM.SLOT0),A
EXX
LD HL,0
LD DE,#C000
LD BC,#4000
LDIR
EXX
INC A
DJNZ .loop
; ¢®§¢à é ¥¬ áâà ­¨æë ­  ¬¥áâ®
XOR A
OUT (ROM.SLOT0),A
OUT (SYS_PORT.ROM),A
LD A,Spec_Page
OUT (SLOT3),A
;;;;;;;;
ELSE
;;;;;;;;
IN A,(SLOT3)
EX AF,AF'
;
LD A,SYS_PORT.EXTENSION
OUT (SYS_PORT.ROM),A
INC A ; !HARDCODE LD A,2
LD B,3 ; !HARDCODE zx-rom number of pages
;
.loop: EXX
;
OUT (ROM.SLOT0),A
OR %0100'0000 ; !HARDCODE ­®¬¥à  áâà ­¨æ ¤«ï í¬ã«ïâ®à  <20>‡“
OUT (SLOT3),A
AND %1011'1111 ; !HARDCODE ­®¬¥à  áâà ­¨æ ¤«ï í¬ã«ïâ®à  <20>‡“
;
LD HL,0
LD DE,#C000
LD BC,#4000
LDIR
;
INC A
EXX
DJNZ .loop
;
XOR A
OUT (ROM.SLOT0),A
OUT (SYS_PORT.ROM),A
EX AF,AF'
OUT (SLOT3),A
;
;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23
;!FIXIT ; [ ] free zx pages! ¯¥à¥¤¥« âì ­  ¢ë§®¢ FREE_ZX_PAGES.INIT_vROM
LD A,ACEX.vROM.BASIC_128 ; ROM-ID - BASIC 128
LD B,#42 ;!HARDCODE page
CALL SET_PORTS
;
LD A,ACEX.vROM.BASIC_48 ; ROM-ID - BASIC 48
LD B,#43 ;!HARDCODE page
CALL SET_PORTS
;
LD A,ACEX.vROM.TR_DOS ; ROM-ID - TR-DOS
LD B,#44 ;!HARDCODE page
CALL SET_PORTS
;
; í⨠áâà ­¨æë ¯®ª  ­¥ ¨á¯®«ì§ãîâáï
LD A,ACEX.vROM.EXPANSION ; ROM-ID - BIOS
;LD B,#45 ;!HARDCODE page
LD B,#41
CALL SET_PORTS
;
LD A,ACEX.vROM.BIOS_1 ; ROM-ID - BIOS-1
;LD B,#46 ;!HARDCODE page
LD B,#41
CALL SET_PORTS
;
LD A,ACEX.vROM.BIOS_2 ; ROM-ID - BIOS-2
;LD B,#47 ;!HARDCODE page
LD B,#41
CALL SET_PORTS
; ¬®¦­® § ¤¥©á⢮¢ âì ¥éñ 4 áâà ­¨æë ­  ¯®àâë #E4..#E7
;;;;;;;;
ENDIF
;;;;;;;;
.init_41h: ; § ¡¨âì FF- ¬¨
LD HL,#C000
LD DE,#C001
LD BC,#3FFF
LD (HL),C
LDIR
; ‡ £«ã誠 ¤«ï áâà ­¨æë #41
LD HL,PROG_NO_ROM
LD DE,#C000 + Spec_Page.no_zx_rom
LD BC,PROG_NO_ROM.size
LDIR
;
LD HL,RAM_BIOS_PROG
LD DE,#C000 + Spec_Page.to_bios
LD BC,RAM_BIOS_PROG.Length
LDIR
RET
;---------------------------------------------------------------------[]
;---------------------------------------
INCLUDE 'src/bios/ROM/SETUP/messages.z80'
;---------------------------------------
;
STRUCT MAIN_BUFFERS
ID BLOCK #100
Messages BLOCK MSG_ENG.size
Shared BLOCK 1024
End BYTE
ENDS
memBUFFER MAIN_BUFFERS = $
STACK EQU #C000
.Size EQU 128
IF memBUFFER.End-1 > #C000-STACK.Size
DISPLAY 'memBUFFER.Shared overlaps STACK by: ',/A,(memBUFFER.End-1)-(#C000-STACK.size)
ASSERT memBUFFER.End-1 < #C000-STACK.size
ENDIF
IFDEF PREBUILD
OUTEND
DISPLAY '-----[Set_Pictures Prebuild start]-----'
MMU 1 e, 0 ; áâà ­¨æ  0 ¢ ¡ ­ªã 0 ¨ ¯à®¢¥àª  ­  £à ­¨æë.
ORG ROM_MAP.LOGO
INCLUDE 'src/bios/logo/Set_Pictures.asm'
DISPLAY '-----[Set_Pictures Prebuild done ]-----'
ELSE
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
;