Sprinter-Core/src/bios/rom/SETUP/MAIN.asm
Tolik fdad365528 FN_HDD_RECAL: работа со всеми каналами IDE
ATAPI_5x_RESET: переделана пауза, чтоб убрать EI
Обновлён recovery.img
2025-04-23 03:00:59 +10:00

1949 lines
42 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
;!FIXIT ­®à¬ «ì­® ¯à®¯¨á âì
TEMP EQU #7800 ; !HARDCODE
OS_LOAD.SectorSizeAddr EQU TEMP-2
IDENTIFY_DEVICE_BUFFER _ATA_IDENTIFY_DEVICE_DATA = TEMP
MEMMAP2 EQU TEMP ; ¤®«¦­® ¡ëâì ¢ë஢­¥­® ¯® ALIGN 256
TPOINTD EQU TEMP - SYS_PAGE.RAMD_KEYS.NUM; - SYS_PAGE.Sp_RAMD_KEYS.NUM ; [x] 4/11/2023
ASSERT (low TEMP = 0) or (low MEMMAP2 = 0), "ERROR Align 256!!!"
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ;
;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
; ®ç¨é ¥¬ ¡ãä¥à RAM Table
LD HL,MEMMAP2
LD DE,MEMMAP2+1
LD BC,255
LD (HL),0
LDIR
; ª®¯¨à㥬 ZX vROM
LD HL,(SYS_PAGE.Block_ID.vROM) ; ­ã¦­® §­ ç¥­¨¥ ¢ L
LD H,high SYS_PAGE.RAM_TABLE
LD D,high MEMMAP2
;LD BC,#01FF ;!HARDCODE 1 vROM RAM BLOCK ID
CALL COPY_CHAIN
; LD IX,SYS_PAGE.Block_ID.vROM
; LD H,high SYS_PAGE.RAM_TABLE
; LD D,high MEMMAP2
; LD BC,#01FF ;!HARDCODE 1 vROM RAM BLOCK ID
; CALL .SAVE_RMD
; [x] 28/09/2024 Žâ¤¥«ì­ë¥ à ¬¤¨áª¨ ¤«ï ०¨¬  ᯥªâà㬠 ¨ DSS.
LD B,high BIOS.SWAP_RAM_DRIVES.Sp2000
CALL SWAP_RAM_DRIVES
; ­ã¦­® «¨ á®åà ­ïâì à ¬¤¨áª¨ ¯à¨ ¯¥à¥§ ¯ã᪥?
LD BC,CMOS_CELL.BootUpParams.Mask.SaveRAMdisks ;#400E
CALL GET_CMOS_VALUE
OR A
PUSH AF
JR Z,.skip_save_rmd
;
; 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 ¤¨áª¨ Sprinter mode
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 SAVE_CHAINS
; [x] 4/11/2023
; LD IX,SYS_PAGE.Sp_RAMD_KEYS
; LD B,SYS_PAGE.Sp_RAMD_KEYS.NUM
; CALL .SAVE_RMD
;
.skip_save_rmd: CALL EMM.InitMem
LD HL,MEMMAP2
LD DE,SYS_PAGE.RAM_TABLE
CALL RESTORE_CHAINS
POP AF
JR Z,.skip_restore_rmd
; LD BC,CMOS_CELL.BootUpParams.Mask.SaveRAMdisks ;#400E
; CALL GET_CMOS_VALUE
; OR A
; JR Z,.skip_restore
;
LD HL,TPOINTD
LD DE,SYS_PAGE.RAMD_KEYS
LD BC,SYS_PAGE.RAMD_KEYS.NUM
LDIR
;
.skip_restore_rmd:
POP AF
OUT (SLOT3),A
; [x] 04/11/2023 Žâ¤¥«ì­ë¥ à ¬¤¨áª¨ ¤«ï ०¨¬  ᯥªâà㬠 ¨ DSS.
; LD B,high BIOS.SWAP_RAM_DRIVES.Sp2000
; JP SWAP_RAM_DRIVES
RET
;
; SAVE_CHAINS: LD A,(IX)
; INC IX
; OR A
; LD L,A
; CALL NZ,COPY_CHAIN
; DJNZ SAVE_CHAINS
; 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'
.Set_Page41: CALL NZ,ZXMODE_SETUP.Set_Page41
.set_ZX_params: LD BC,CMOS_CELL.QuickStartSetUp.Mask.ZxRom
CALL GET_CMOS_VALUE
LD L,A
LD BC,CMOS_CELL.QuickStartSetUp.Mask.Hardware
CALL GET_CMOS_VALUE
;
EX AF,AF
LD A,ROM.EXTENSION
OUT (SYS_PORT.ROM),A
EX AF,AF
OR A
JP Z,SPRINTER_ZX.custom_ROM
DEC A
JP Z,Pentagon_48.custom_ROM
DEC A
JP Z,PENTAGON_128.custom_ROM
DEC A
JP Z,PENTAGON_512.custom_ROM
DEC A
JP Z,SCORPION_256.custom_ROM
DEC A
JP Z,ZX_Spectrum_48.custom_ROM
DEC A
JP Z,ZX_SPECTRUM_128.custom_ROM
; error
XOR A
OUT (SYS_PORT.ROM),A
LD D,CMOS_CELL.QuickStartSetUp ; ®¡­ã«ï¥¬ ¯ à ¬¥âà ­  ¢á直© á«ãç ©
CALL CMOS_WR
;
CALL ScreenPOS.CRLF
LD A,msgStrings.errorZXmode
LD E,COLORS.CGA.INK.RED
CALL POSTMSC
.loop_di: DI
HALT
JR .loop_di
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 (BorderColor),A
LD IX,win_descriptor.tab80x32
CALL WIN_OPEN.SCR1
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
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 CLEAR_MEM
CALL ZXMODE_SETUP
CALL XY_SCREEN
;R06 ;[Check Quick Start ROM]
LD BC,CMOS_CELL.BootUpParams.Mask.QuickStartROM ;#010E
CALL GET_CMOS_VALUE
POP BC
RR C
JR NC,IGNORE_QuickStartROM ; १ã«ìâ â ¯à®¢¥àª¨ Space ¨§ exp.asm [Check SPACE]
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
StartUpKey: 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,StartUpKey
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
JR OS_LOAD
;
CDSTART: LD A,B ; [ ] 15/02/2025 boot from ATAPI
OR DRIVE_CODES.SPRINTER.ATAPI
LD B,A
PUSH BC
LD A,msgStrings.bootCd
CALL POSTMSG
POP AF
PUSH AF
CALL PRINT_CHANEL
;
POP BC
PUSH BC
CALL OS_LOAD
POP BC
RET NC
LD HL,2048 ;!HARDCODE sector size
LD IX,#0011
JR OS_LOAD.CD
;
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.ATAPI
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,512 ;!HARDCODE
LD IX,#0001
.CD: LD (.SectorSizeAddr),HL
LD HL,#0000
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 POSTMSC
CALL ScreenPOS.CRLF
POP AF ; 䨧¨ç¥áª¨© ­®¬¥à ¤¨áª 
POP HL
.MOVE0: DI
IM 1
LD HL,MOVE1
LD DE,OS_LOAD.SectorSizeAddr - MOVE1.length ; !HARDCODE
LD BC,MOVE1.length
LDIR
JP OS_LOAD.SectorSizeAddr - MOVE1.length
;
MOVE1: LD HL,#8000 ; !HARDCODE
LD SP,HL
EX DE,HL
LD HL,TEMP
LD BC,(OS_LOAD.SectorSizeAddr)
LDIR
JP #8000+SYSID.length ;#800C ; !HARDCODE
;
.length EQU $-MOVE1
SYSID: DZ "Starting..."
.length EQU $-SYSID
;!FIXIT ¯¥à¥¤¥« âì ¯®¤ áâàãªâãàã ¤«ï ¯¥à¥¬¥­­ëå FDD, ®â¤¥«ì­ë¥ ¯¥à¥¬¥­­ë¥ ¯®¤ A ¨ B
FD144A: DB #80,#12,#02,#50,#00,#00,#02,FDD_INIT_TABLE.FDD
.Size EQU $ - FD144A
FD720A: DB #00,#09,#02,#50,#00,#00,#02,FDD_INIT_TABLE.FDD
.Size EQU $ - FD720A
FDD_INSTAL: IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD HL,FDD_INIT_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_INIT_TABLE.FDD_0
LD BC,FD144A.Size ; !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_INIT_TABLE.FDD_1
LD BC,FD144A.Size ; !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 IPRINT.Z
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
; COPY_CHAIN: LD E,L
; LDI
; DEC L
; LD L,(HL)
; INC L
; RET Z
; DEC L
; JR COPY_CHAIN
; ; ‚室: HL - ª®¯¨ï RAM_TABLE ®âªã¤  ª®¯¨à®¢ âì
; RESTORE_CHAINS: LD DE,SYS_PAGE.RAM_TABLE
; XOR A
; .loop: CP (HL)
; JR Z,.NoCopy
; LD E,L
; LDI
; DEC L
; .NoCopy: INC L
; JR NZ,.loop
; 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
;
; 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
;
POSTMSC: CALL FindStringAddr
LD A,E
JP CPRINTZ
;
//////////////////////////////////////////////////////////////////////
INCLUDE 'IM2_INT.asm'
//////////////////////////////////////////////////////////////////////
POSTMSG: CALL FindStringAddr
JP PRINTZ
;----------------------------------------------------------------------[]
;!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 BC,64*256 + BIOS.ZX_MEMORY_MANAGER ; [ ] free zx pages! MANAGE_ZX_PAGES.FREE_vMEMORY
RST ToBIOS_18
;
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
LD BC,128*256 + BIOS.ZX_MEMORY_MANAGER ; [ ] free zx pages! HARDCODE
JP ToBIOS_18
;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
LD A,2 ; !HARDCODE
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
.init_41h: ; § ¡¨âì FF- ¬¨
LD HL,#C000
LD DE,#C001
LD BC,#3FFF - 2
LD (HL),#FF
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
MAIN_END_CODE_ADDRESS EQU $-1
; 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
;
;=======================================================================================================================
; ;;;;;;;;
; 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
; [ ] 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
; ;;;;;;;;