Sprinter-Core/src/bios/rom/SETUP/MAIN.asm
Anatoliy Belyanskiy 31e8ae3947 refactoring
2023-07-19 01:20:14 +10:00

1844 lines
36 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'; Includes
ORG COMPILE_ADDR.MAIN
OUTPUT 'Build/Bin/temp/MAIN.BIN'
ENDIF
;SYS_PAGE.RAMD_KEYS EQU #C180 ; ª«îç¨ RAM-Disks
;RAMD_KEY_NUM EQU 16
;SYS_PAGE EQU #FE ; áâà ­¨æ  á á¨á⥬­ë¬¨ ¯¥à¥¬¥­­ë¬¨ BIOS
;SYS_PORT_ON EQU #7C
;SYS_PORT_OFF EQU #3C
;STACK EQU #80F0
;PAGE0 EQU #82
;PAGE1 EQU #A2
;PAGE2 EQU #C2
;SLOT3 EQU #E2
;Y_PORT EQU #89
;SYSPAGE EQU #FE
;INT EQU #80
;ITMADDR EQU MSG_Items_Buffer
;ITMTABS EQU #BA00 ;!!!!! b900
;ITMTABS EQU ITMADDR
;FDD EQU #03
;!!!!!!!!!!!!!!!!!!!!!!
; !FIXIT ¯à®¢¥à¨âì â ª¨¥ ¦¥ «¨  ¤à¥á  CMOS ¢ Settings ¨á¯®«ì§ãîâáï
SM_CYLL EQU #2F
SM_CYLH EQU #30
SM_HEAD EQU #31
SM_SECT EQU #32
SS_CYLL EQU #33
SS_CYLH EQU #34
SS_HEAD EQU #35
SS_SECT EQU #36
M_CYLL EQU #37
M_CYLH EQU #38
M_HEAD EQU #39
M_SECT EQU #3A
S_CYLL EQU #3B
S_CYLH EQU #3C
S_HEAD EQU #3D
S_SECT EQU #3E
;!!!!!!!!!!!!!!!!!!!!!!
TEMP EQU #7E00 ; !HARDCODE
MEMMAP2 EQU TEMP ; ¤®«¦­® ¡ëâì ¢ë஢­¥­® ¯® ALIGN 256
TPOINTD EQU TEMP-32
;=======================================
;SETUP_MAIN:
MAIN_START:
POP AF
POP HL
LD SP,STACK
PUSH HL
LD (RET_TO_EXP_ADDR),hl
JP START
; DB "(C) 2002 PETERS PLUS LTD "
RET_TO_EXP_ADDR: WORD 0000 ; place for save ret address to exp
;
;------------------- ;!!!!! ¯®á¬®âà¥âì
; ‡­ ç¥­¨ï ¢à¥¬¥­¨ ¨ ¤ âë ¢ ª¬®á § ¯¨á ­ë ¤¥áïâ¨ç­ë¬¨ §­ ç¥­¨ï¬¨
; ¨ ¢ ॣ¨áâॠA ­  ¢ë室¥ ¨§ ä㭪樨 #F6 (CMOS_RD) BIOS §­ ç¥­¨ï ¤¥áïâ¨ç­ë¥.
GETTIME:
PUSH HL
LD D,4 ;HOURS
CALL CMOS_RD
CP #24 ;24
jp nc,.error
LD (HL),A
INC HL
LD D,2 ;MINUTES
CALL CMOS_RD
CP #5A ; 60
jp nc,.error
LD (HL),A
INC HL
LD D,0 ;SECONDS
CALL CMOS_RD
CP #5A ; 60
jp nc,.error
LD (HL),A
INC HL
LD D,7 ;DAY
CALL CMOS_RD
CP #32 ;32
jp nc,.error
LD (HL),A
INC HL
LD D,8 ;MONTH
CALL CMOS_RD
CP #13 ;13
jp nc,.error
LD (HL),A
INC HL
LD D,#32 ;CENTURY
CALL CMOS_RD
CP #1A ;20
jp c,.error
CP #9A ;100
jp nc,.error
LD (HL),A
INC HL
LD D,9 ;YEAR
CALL CMOS_RD
CP #9A ;100
jp nc,.error
LD (HL),A
; DEC HL
; LD C,A
; LD A,19
; CP (HL)
; RET Z
; LD A,20
; CP (HL)
; RET Z
; LD A,80
; CP C
; LD A,20
; JR NC,.correct_century
; LD A,19
; .correct_century:
; LD (HL),A
; LD D,#32 ;CENTURY
; LD C,#F7 ; !HARDCODE
; RST_to_BIOS_18
POP HL
RET
.error:
LD HL,.default_date
POP DE
LD BC,7
LDIR
;---[]
;!FIXIT
CALL CMSERR
; LD HL,.default_date
; call writeDateTimeToCmos
;---[]
ld a,#FF
ld (ERRSUM.ErrDateTime),a
RET
LUA ALLPASS
sj.insert_define("Current_CENTURY", math.modf(tonumber(os.date("%Y"))/100))
sj.insert_define("Current_YEAR", tonumber(os.date("%y")))
sj.insert_define("Current_MONTH", tonumber(os.date("%m")))
sj.insert_define("Current_DATE", tonumber(os.date("%d")))
ENDLUA
.default_date:
BYTE 0,0,0 ; Hours, minutes, seconds
BYTE #Current_DATE
BYTE #Current_MONTH
BYTE #Current_CENTURY
BYTE #Current_YEAR
UNDEFINE Current_DATE
UNDEFINE Current_MONTH
UNDEFINE Current_CENTURY
UNDEFINE Current_YEAR
;--------------------------------
;
;R07 ; !FIXIT CMOS ᤥ« âì ᮣ« á­® ¤®ª¥ ­  ª¬®á
; ¥á«¨ ¡ â à¥©ª  ᥫ , â® ¯à¨ 祪¥ ª¬®á  ¢ë¤ ¢ âì ᮮ⢥âáâ¢ãîéãî ®è¨¡ªã ¨, ¢®§¬®¦­®, à ¡®â âì ª ª ¡¥§ ª¬®á .
CMOSINIT:
LD D,CMOS.Register.CTRLregA ; !FIXIT FREQ
CALL CMOS_RD
CP #26 ; !FIXIT
JR NZ,CMSERR
LD D,CMOS.Register.CTRLregC
CALL CMOS_RD
CP #50
RET Z
CMSERR:
LD D,CMOS.Register.CTRLregB
LD A,#82 ;TIME FORMAT ; !FIXIT CMOS
CALL CMOS_WR
LD D,CMOS.Register.CTRLregA
LD A,#26 ; !FIXIT CMOS FREQ
CALL CMOS_WR
LD D,CMOS.Register.CTRLregC
LD A,#0 ; !FIXIT CMOS
CALL CMOS_WR
LD HL,GETTIME.default_date
call writeDateTimeToCmos
LD D,CMOS.Register.CTRLregB
LD A,#02 ;TIME FORMAT ; !FIXIT CMOS
CALL CMOS_WR
; LD D,13
; LD A,#80 ; !FIXIT CMOS
; LD C,#F7 ; !HARDCODE
; RST_to_BIOS
RET
CLEARM:
IN A,(SLOT3)
PUSH AF
LD A,SYS_PAGE
OUT (SLOT3),A
LD HL,SYS_PAGE.RAMD_KEYS
LD DE,TPOINTD
LD BC,SYS_PAGE.RAMD_KEYS.NUM
LDIR
LD HL,MEMMAP2
LD DE,MEMMAP2+1
LD BC,255
LD (HL),0
LDIR
LD IX,SYS_PAGE.RAMD_KEYS ;RAM DISKS
LD H,#C2
LD D,high MEMMAP2
LD BC,#10FF
MEMLOOP:
LD A,(IX)
INC IX
OR A
LD L,A
CALL NZ,RCHAIN
DJNZ MEMLOOP
CALL EMM.InitMem
LD BC,#400E ;!HARDCODE
CALL G_VALUE
OR A
CALL NZ,CCHAIN
POP AF
OUT (SLOT3),A
RET
;
;
;
before_intPointer EQU $
BLOCK #FF - low $,0 ; ¢ëà ¢­¨¢ ­¨¥ ­  #xxFF
INT_POINTER: WORD 0
ASSERT +low INT_POINTER = #FF, 'ERROR! Not valid interrupt pointer!'
IFDEF PREBUILD
ASSERT INT_POINTER-before_intPointer < 16, 'Warning! To much space before INT_POINTER.'
ELSE
IF INT_POINTER-before_intPointer > 16
DISPLAY 'Warning! To much space before INT_POINTER: ',/D,INT_POINTER-before_intPointer
ENDIF
ENDIF
INT_HANDLER:
PUSH AF
EX AF,AF'
PUSH AF
PUSH BC
PUSH DE
PUSH HL
EXX
PUSH BC
PUSH DE
PUSH HL
PUSH IX
PUSH IY
CALL KEYSCAN
POP IY
POP IX
POP HL
POP DE
POP BC
EXX
POP HL
POP DE
POP BC
POP AF
EX AF,AF'
POP AF
EI
RETI
;
INT_OFF:
DI
LD A,#3F
LD I,A
IM 1
RET
INT_ON:
DI
LD A,+high INT_POINTER
LD I,A
LD HL,INT_HANDLER
LD (INT_POINTER),HL
IM 2
EI
RET
;
;
;------------------------[go to spectrum from bios]---------------------;
EXIT_SETUP:
CALL INT_OFF
;
; LD BC,#020E
; CALL G_VALUE
; OR A
; LD A,#EC ;SPRINTER
; JR Z,XFLEX
; LD A,#EA ;SPECTRUM
;XFLEX:
LD A,ROM.BIOS
OUT (SYS_PORT.ROM),A
POP HL ; ¯¨å ¥âáï ¢ EXP.ASM ¢ ¯à®æ¥¤ãà¥
JP (HL)
; LD (JMPHL),HL
; LD C,#F3
; RST_to_BIOS
; JMPHL EQU $+1
; JP #0000
;-----------------------------------------------------------------------;
INSTALL:
CALL INT_ON
CALL SET_CGA
XOR A
OUT (#FE),A
LD IX,win_descriptor.tab80x32
LD HL,#0000
LD E,1
CALL WIN_OPEN
LD DE,0
LD HL,#2050
LD B,7
CALL LP_CLS_WIN
LD DE,0
LD HL,#0820
LD B,0
CALL LP_CLS_WIN
CALL SETLAND
CALL GET_ID
LD DE,#0028 ; !HARDCODE
CALL LP_SET_PLACE
LD HL,memBUFFER.ID
LD A,COLORS.INC.LCYAN
CALL CPRINTZ
LD HL,BUILD
LD A,COLORS.INC.LCYAN
CALL CPRINTZ
LD DE,#0128 ; !HARDCODE
CALL LP_SET_PLACE
LD A,msgStrings.copyRightPeters
LD E,COLORS.INC.LGREEN
CALL POSTMSC
LD DE,#0228 ; !HARDCODE
CALL LP_SET_PLACE
LD A,msgStrings.copyRightSPTeam
LD E,COLORS.INC.GREEN
CALL POSTMSC
IF DEBUG
LD DE,#0328
CALL LP_SET_PLACE
LD A,msgStrings.testBIOSmsg
LD E,COLORS.FLASH + COLORS.INC.RED ; !HARDCODE
CALL POSTMSC
ENDIF
IN A,(SLOT3)
PUSH AF
LD A,SYS_PAGE
OUT (SLOT3),A
LD HL,RebootDate
CALL GETTIME
POP AF
OUT (SLOT3),A
RET
BUILD:
db ', BIOS v', Disk_subsystem_ver_txt,0 ; !FIXIT ¬®¦¥â ¢®âª­ãâì ¢¬¥á⥠á msgStrings ?
RSTID: DB "RESTART",0
.size EQU $-RSTID
Start_again:
ld sp,STACK-2
START:
DI
PUSH AF
XOR A
LD (ERRSUM),A
LD (ERRSUM.ErrDateTime),A
; LD C,#97
; RST_to_BIOS_18
; XOR A
; LD C,#F2
; RST_to_BIOS_18
;------------------------------ ;!!!!! ¯®á¬®âà¥âì
; CALL KINIT
;------------------------------ ;!!!!! ¯®á¬®âà¥âì
;--------[Clean keyboard buffer]--------
; clean_kbd_buf:
; IN A,(Z84.SIO.Ch_A.Ctrl)
; BIT 0,A
; jr z,.exit
; IN A,(Z84.SIO.Ch_A.Data)
; jr clean_kbd_buf
; .exit:
;---------------------------------------
;R08 CALL OPENDOS
CALL ZXCLS
CALL READING
CALL TCHEKSM
CALL NZ,SETDEFX
;!TODO CMOS Disabled use of CONFIG_DE (#C13A) word
;LD A,#1C
;CALL READCMS
;PUSH AF
;LD A,#1B ;!TODO CMOS
;CALL READCMS
;POP DE
;LD E,A
;
LD C,SLOT3
IN B,(C)
PUSH BC
LD A,SYS_PAGE
OUT (C),A
; LD (#C13A),DE CONFIG_DE
LD HL,SYS_PAGE.INT_ADRESS ;EXTENDED INTERRUPT
XOR A
LD (HL),A
INC L
LD (HL),A
INC L
LD (HL),A
INC L
LD (HL),A
POP BC
OUT (C),B
CALL TRQUICK
CALL FINSTAL
CALL CLEARM
CALL RESCREEN
;R06
LD BC,#010E ; QUICK START
CALL G_VALUE
POP BC
INC B
DEC B
JR NZ,QIGNORE ; १ã«ìâ â ¯à®¢¥àª¨ Space ¨§ exp.asm [space_check]
PUSH AF
LD C,SLOT3
IN B,(C)
PUSH BC
LD A,SYS_PAGE
OUT (C),A
LD HL,SYS_PAGE.RESTART_ID
LD DE,RSTID
LD B,RSTID.size
CALL COMPARE
CALL NZ,SETRSTS
POP BC
OUT (C),B
JR Z,HOTST
POP AF
JR QIGNORE
SETRSTS:
PUSH AF
LD HL,RSTID
LD DE,SYS_PAGE.RESTART_ID
LD BC,RSTID.size
LDIR
LD HL,PowerOnDate ; !TODO ¨§¬¥­¨âì ¯®¤ áâàãªâãàã, ª®£¤  áâàãªâãà  ¯¥à¥¬¥­­ëå ¡ã¤¥â £®â®¢ 
CALL GETTIME
POP AF
RET
HOTST:
POP AF
OR A
JP NZ,EXIT_SETUP
QIGNORE:
CALL INSTALL
LD DE,#0528
;CALL ScreenPOS.LOCAT
CALL LP_SET_PLACE
LD A,msgStrings.toSetupButton
LD E,COLORS.FLASH + COLORS.INC.WHITE
CALL POSTMSC
LD DE,#0900
;CALL ScreenPOS.LOCAT
CALL LP_SET_PLACE
ERRSUM+1:
LD A,#00 ;MEM Patch!
OR A
JR Z,.ErrDateTime
XOR A
ld (.ErrDateTime+1),a ; ¥á«¨ ª®­â஫쭠ï á㬬  ᫥⥫ , â® á®®¡é¥­¨¥ ® ªà¨¢ëå ¤ â¥/¢à¥¬¥­¨ ¢ ª¬®á ­¥ ¢ë¢®¤¨¬
LD A,msgStrings.cmosChecksumErr
LD E,COLORS.INC.RED
CALL POSTMSC
CALL ScreenPOS.CRLF
CALL ScreenPOS.CRLF
JR CHEKOK
.ErrDateTime+1:
LD A,0
OR A
JR Z,CHEKOK
LD A,msgStrings.cmosDateTimeErr
LD E,COLORS.INC.RED
CALL POSTMSC
CALL ScreenPOS.CRLF
CALL ScreenPOS.CRLF
CHEKOK: ;CALL ScreenPOS.GET_CUR
CALL LP_GET_PLACE
PUSH DE
CALL LOGOTYP
LD DE,#0000
;CALL ScreenPOS.LOCAT
CALL LP_SET_PLACE
LD A,msgStrings.spModel
CALL POSTMSG
CALL PIDNUM
CALL ScreenPOS.CRLF
LD A,msgStrings.boardID
CALL POSTMSG
CALL PIDBOARD
CALL ScreenPOS.CRLF
LD A,msgStrings.spMemory
CALL POSTMSG
CALL EMM.GetMemSize
PUSH BC
CALL PMEMORY
CALL ScreenPOS.CRLF
LD A,msgStrings.memoryAvailable
CALL POSTMSG
POP HL
CALL PMEMORY
CALL ScreenPOS.CRLF
;CALL TSTCMOS
CALL CMOS_TEST
LD A,msgStrings.cmosNone
JR C,NOCMOS
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 NOCMOS2
NOCMOS:
CALL POSTMSG
NOCMOS2: ;!FIXIT ­ §¢ ­¨¥ ­¥¯à ¢¨«ì­®¥
LD DE,#0528
;CALL ScreenPOS.LOCAT
CALL LP_SET_PLACE
LD A,msgStrings.forAltBootButton
LD E,COLORS.INC.WHITE
CALL POSTMSC
POP DE
;CALL ScreenPOS.LOCAT
CALL LP_SET_PLACE
CALL TSETUP
CALL AUTODET
CALL CTRLKEY
LD A,B
AND #10
JR NZ,ABOOT
CALL TSETUP
LD BC,#0710 ; !HARDCODE ¬ áª  ¨ ï祩ª  ¤«ï ç⥭¨ï §­ ç¥­¨ï ª¬®á ¤«ï ®á­®¢­®£® § £à㧮筮£® ¤à ©¢ 
CALL PrepareToBOOT
LD A,msgStrings.bootFail
CALL C,POSTMSG
CALL ScreenPOS.CRLF
ABOOT: LD A,msgStrings.bootAltDrv
CALL POSTMSG
LD BC,#7010 ; !HARDCODE ¬ áª  ¨ ï祩ª  ¤«ï ç⥭¨ï §­ ç¥­¨ï ª¬®á ¤«ï  «ìâ¥à­ â¨¢­®£® § £à㧮筮£® ¤à ©¢ 
CALL PrepareToBOOT
LD A,msgStrings.bootFail
CALL C,POSTMSG
CALL ScreenPOS.CRLF
;NO START DISK - RESTART / SETUP / ZX SPECTRUM mode
LD BC,#021D
CALL G_VALUE
OR A
JP Z,EXIT_SETUP
CALL ScreenPOS.CRLF
LD A,msgStrings.afterBootFail
LD E,COLORS.INC.RED
CALL POSTMSC
;EI
CALL INT_ON
AGAKEY: CALL WAITKEY
LD HL,#4F00 ; DEL - go to settings
AND A
SBC HL,DE
JR Z,CSETUP
CP #1B ; ESC - go to zx spectrum mode
JP Z,EXIT_SETUP
CP #0D ; ENTER - restart
JP NZ,AGAKEY
XOR A
JP Start_again
TSETUP:
CALL SCANKEY
RET Z
LD HL,#4F00
AND A
SBC HL,DE
JR Z,CSETUP
LD HL,#011B
AND A
SBC HL,DE
JR NZ,TSETUP
POP HL
JP EXIT_SETUP
CSETUP:
; POP HL
;------------test ; !!!!! ¯®á¬®âà¥âì
XOR A
LD (ITEM_Restore),A
CALL SETTINGS
XOR A
JP Start_again
COMPARE:
LD A,(DE)
CP (HL)
RET NZ
INC HL
INC DE
DJNZ COMPARE
RET
; ????? ¯¥à¥­¥á⨠íâ® ¢ ä㭪樨 <20>ˆŽ?
; HL - data to write: BYTE Hours, minutes, seconds, day, month, century, year. (2022: 20 - century, 22 - year)
writeDateTimeToCmos: ;!FIXIT
LD A,(HL)
LD D,CMOS.Register.hours
CALL CMOS_WR
INC HL
LD A,(HL)
LD D,CMOS.Register.minutes
CALL CMOS_WR
INC HL
LD A,(HL)
LD D,CMOS.Register.seconds
CALL CMOS_WR
INC HL
LD A,(HL)
LD D,CMOS.Register.date
CALL CMOS_WR
INC HL
LD A,(HL)
LD D,CMOS.Register.month
CALL CMOS_WR
INC HL
LD A,(HL)
LD D,CMOS.Register.century
CALL CMOS_WR
INC HL
LD A,(HL)
LD D,CMOS.Register.year
CALL CMOS_WR
RET
RESCREEN:
;R06
LD A,#1F ;!HARDCODE READ SCREEN POSITION
CALL READCMS
PUSH AF
IN A,(SLOT3)
LD E,A
LD A,DCP_PAGE
OUT (SLOT3),A
LD A,(#C400) ;c400 for first cfg 50176 ; !TODO ¬®¦­® ¯¥à¥¤¥« âì ­  ¢ë§®¢ ä㭪樨 ¡¨®á 
LD D,A
LD A,#CB
LD (#C400),A
POP AF
LD BC,0
OUT (C),A
LD A,D
LD (#C400),A
LD A,E
OUT (SLOT3),a
;R06
RET
;
;R07
; CMOSINIT:
; LD D,10 ;FREQ
; LD C,#F6 ;READ CMOS
; RST_to_BIOS
; CP #26
; JR NZ,CMSERR
; LD D,12
; LD C,#F6
; RST_to_BIOS
; CP #50
; RET Z
; CMSERR:
; LD D,10
; LD A,#26 ;FREQ
; LD C,#F7
; RST_to_BIOS
; LD D,11
; LD A,#02 ;TIME FORMAT
; LD C,#F7
; RST_to_BIOS
; LD D,12
; LD A,#50
; LD C,#F7
; RST_to_BIOS
; LD D,13
; LD A,#80
; LD C,#F7
; RST_to_BIOS
; RET
;------------------- ;!!!!! ¯®á¬®âà¥âì
; 0 - 1-st FDD
; 1 - 2-nd FDD
; 2 - 1-st IDE
; 3 - 2-nd IDE
; 4 - 3-rd IDE
; 5 - 4-th IDE
; 6 - RAM-DISK
;
; -> BC - ï祩ª  ¨ ¬ áª  ¤«ï ç⥭¨ï §­ ç¥­¨ï ª¬®á ¤«ï § £à㧮筮£® ¤à ©¢ 
;
;[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
RECOVERYstart:
LD A,msgStrings.bootRecovery
CALL POSTMSG
;
; ‚ë¡®à à ¬¤¨áª  ¤«ï ४ ¢¥à¨
_mRECOVERYrdChooseTYPE RECOVERYrdChooseTYPE
; ¯à¨¡¨¢ ¥¬ ¯®á«¥¤­¨© à ¬¤¨áª, ¥á«¨ § ­ïâ
.killRAMdisk: LD A,SYS_PAGE.RAMD_KEYS.NUM-1
LD (.RDkey),A
CALL EMM.FreeMemRMD
JR NC,.setRAMdisk
JR Z,.setRAMdisk
RET ; ­¥¯®­ïâ­ ï ®è¨¡ª  - ¢ë室¨¬
.setRAMdisk: LD A,(.RDkey)
LD B,ROM_DISK.Pages.Size
CALL EMM.GetMemRMD
JR NC,.IMGread ; ᢮¡®¤­ë© à ¬¤¨áª ­ ©¤¥­
DEC A
JR Z,.FreeMem ; ®è¨¡ª  - ­¥¤®áâ â®ç­® ¯ ¬ïâ¨, ¢ë§ë¢ ¥¬ ®ç¨áâªã ¯ ¬ïâ¨
RET ; ­¥¯®­ïâ­ ï ®è¨¡ª  - ¢ë室¨¬
.FreeMem: CALL EMM.FullInit
JR .killRAMdisk
;
; ‚室: A - RAM block ID
.IMGread:
; ‚ à¨ ­â ª®¯¨à®¢ ­¨ï ROM -> RAM disk
_mRECOVERYmountTYPE RECOVERYmountTYPE
;
;Exit from "ROM Disk to RAM disk" procedure
.RDkey+*: LD A,0
OR #60 ; !HARDCODE ᤥ« âì ¨¬ ¢á¥¬ ­ §¢ ­¨ï
LD B,A ; ¯¥à¥¤ ñ¬ § £à㧮筮¥ ãáâனá⢮ ¢ OS_LOAD
JP OS_LOAD
;
;[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
;
PrepareToBOOT:
CALL INT_OFF
CALL G_VALUE
LD B,A
; FDD
OR A
JR Z,FDSTART ; FDD A:
INC B
DEC A
JR Z,FDSTART ; FDD B:
; IDE
LD B,#80
DEC A
JR Z,HDSTART
INC B ;LD B,#81
DEC A
JR Z,HDSTART
INC B ;LD B,#82
DEC A
JR Z,HDSTART
INC B ;LD B,#83
DEC A
JR Z,HDSTART
; RAM
DEC A
JR Z,RDSTART
; ROM
DEC A
JP Z,RECOVERYstart
; Error
SCF
RET
FDSTART:
PUSH BC
PUSH BC
LD A,msgStrings.bootFdd
CALL POSTMSG
POP AF
CALL FDD_5x.RESET
POP BC
RET C
JP OS_LOAD
;!TODO
CDSTART:
PUSH BC
LD A,msgStrings.bootCd
CALL POSTMSG
POP BC
SET 6,B
SCF
RET
RDSTART:
LD A,msgStrings.bootRamDrv
CALL POSTMSG
ld b,#60 ; !HARDCODE: 6 - ⨯ ¤à ©¢  RAM-DRV, 0 - ­®¬¥à ¤à ©¢ 
.loop: push bc
CALL OS_LOAD
pop bc
inc b
ld a,#6F ; !HARDCODE - ¬ ªá¨¬ «ì­®¥ ç¨á«® à ¬¤¨áª®¢
sub b
jr nc,.loop
RET
HDSTART:
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,B
AND #03 ;R02 %00000011
LD IY,IDE.INIT_TBL_IDE0
JR Z,.next
LD IY,IDE.INIT_TBL_IDE1
CP 1 ;R02
JR Z,.next
LD IY,IDE.INIT_TBL_IDE2 ;R02
CP 2 ;R02
JR Z,.next
LD IY,IDE.INIT_TBL_IDE3 ;R02
.next: LD A,(IY+IDE.HDD_INIT_TABLE.DriveType)
EX AF,AF'
OUT (SLOT3),A
EX AF,AF'
CP IDE.Device.CDROM
JP Z,CDSTART
PUSH AF
PUSH BC
LD A,msgStrings.bootHdd
CALL POSTMSG
POP BC
POP AF
CP #FF
SCF
RET Z
OS_LOAD:
LD HL,#0000
LD IX,#0001
LD DE,TEMP
LD A,B
LD BC,1*256 + BIOS.DRV_READ
PUSH AF
RST ToBIOS_18
POP BC
RET C
LD A,B
EX AF,AF'
LD HL,TEMP
LD DE,SYSID
LD B,SYSID.length
.loop: LD A,(DE)
CP (HL)
SCF
RET NZ
INC HL
INC DE
DJNZ .loop
EX AF,AF'
PUSH AF
LD A,msgStrings.bootOk
CALL POSTMSG
CALL ScreenPOS.CRLF
POP AF
POP HL
; JP MOVE0
MOVE0:
DI
IM 1
LD HL,MOVE1
LD DE,#7C00 ; !HARDCODE
LD BC,MOVE1.length
LDIR
JP #7C00
MOVE1:
LD SP,#7FFF ; !HARDCODE
LD HL,TEMP
LD DE,#8000 ; !HARDCODE
LD BC,#0200 ; !HARDCODE
LDIR
JP #8000+SYSID.length ;#800C ; !HARDCODE
.length EQU $-MOVE1
SYSID: DZ "Starting..."
.length EQU $-SYSID
FD144A: DB #80,#12,#02,#50,#00,#00,#02,FDD_INI_TABLE.FDD
FD720A: DB #00,#09,#02,#50,#00,#00,#02,FDD_INI_TABLE.FDD
FINSTAL:
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD HL,FDD_INI_TABLE.FDD_0
LD BC,#20FF ;!HARDCODE table
FILLFDD:
LD (HL),C
INC HL
DJNZ FILLFDD
EX AF,AF'
OUT (SLOT3),A
LD BC,#0311
CALL G_VALUE
LD HL,FD720A
OR A
JR Z,SETFD0
LD HL,FD144A
DEC A
JR NZ,NOFDD0
SETFD0:
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD DE,FDD_INI_TABLE.FDD_0
LD BC,#0008 ; !HARDCODE
LDIR
EX AF,AF'
OUT (SLOT3),A
NOFDD0:
LD BC,#0C11
CALL G_VALUE
LD HL,FD720A
OR A
JR Z,SETFD1
LD HL,FD144A
DEC A
JR NZ,NOFDD1
SETFD1:
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD DE,FDD_INI_TABLE.FDD_1
LD BC,#0008 ; !HARDCODE
LDIR
EX AF,AF'
OUT (SLOT3),A
NOFDD1:
RET
AUTODET:
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD HL,IDE.INIT_TBL_IDE0
LD BC,#20FF ;R02 ;!HARDCODE table
FILLIDE:
LD (HL),C ;CLEAR HDD VARIABLE
INC HL
DJNZ FILLIDE
EX AF,AF'
OUT (SLOT3),A
;==== ;!!!!! áâ à ï ­ã¬¥à æ¨ï ¤¨áª®¢ !!!!!====
; CALL GET_AVAILABLE_STRUCT
; LD A,#00
; CALL COMMONIDE
; CALL GET_AVAILABLE_STRUCT
; LD A,#01
; CALL COMMONIDE
; CALL GET_AVAILABLE_STRUCT
; LD A,#02
; CALL COMMONIDE
; CALL GET_AVAILABLE_STRUCT
; LD A,#03
; CALL COMMONIDE
;==========================================
LD IY,IDE.INIT_TBL_IDE0
LD A,#00
CALL COMMONIDE
LD IY,IDE.INIT_TBL_IDE1
LD A,#01
CALL COMMONIDE
LD IY,IDE.INIT_TBL_IDE2
LD A,#02
CALL COMMONIDE
LD IY,IDE.INIT_TBL_IDE3
LD A,#03
CALL COMMONIDE
CALL ScreenPOS.CRLF
RET
;
;==== ;!!!!! áâ à ï ­ã¬¥à æ¨ï ¤¨áª®¢ !!!!!====
; GET_AVAILABLE_STRUCT
; LD C,SLOT3
; IN B,(C)
; LD A,SYS_PAGE
; OUT (C),A
; CALL FIND_AVAILABLE_STRUCT
; OUT (C),B
; RET
; FIND_AVAILABLE_STRUCT
; LD IY,IDE0
; LD A,(IY+DTYPE_H)
; INC A
; RET Z
; LD IY,IDE1
; LD A,(IY+DTYPE_H)
; INC A
; RET Z
; LD IY,IDE2
; LD A,(IY+DTYPE_H)
; INC A
; RET Z
; LD IY,IDE3
; LD A,(IY+DTYPE_H)
; INC A
; RET
;==========================================
;
; !HARDCODE § ¬¥­¨âì ç¨á«  ­  ¬¥âª¨ ¢ í⮩ ¯à®æ¥¤ãà¥
COMMONIDE:
AND A
LD H,A ;SAVE DRIVE NUMBER
LD BC,#3011 ;CMOS VALUE
LD L,msgStrings.detectIdePrMA
JR Z,COMMON2
DEC A
LD BC,#C011 ;CMOS VALUE
LD L,msgStrings.detectIdePrSL
JR Z,COMMON2
DEC A
; !HARDCODE § ¬¥­¨âì ç¨á«  ­  ¬¥âª¨ ¢ í⮩ ¯à®æ¥¤ãà¥
LD BC,#3020
LD L,msgStrings.detectIdeSecMA
JR Z,COMMON2
DEC A
LD BC,#C020
LD L,msgStrings.detectIdeSecSL
JR Z,COMMON2
SCF
RET
;0 - AUTODETECT
;1 - GETTING FROM SETUP
;2 - CD-ROM
;3 - DISABLED
COMMON2:
CALL G_VALUE
OR A
JP Z,AUTODETECT ;AUTODECECT
DEC A
JP Z,SETUPDETECT ;SETUP
DEC A
JP Z,IT_IS_CDROM ;CDROM
RET ;DON'T CHECK THIS DEVICE
AUTODETECT:
PUSH HL
LD A,L ;DETECT MESSAGE
CALL POSTMSG
CALL ScreenPOS.SUBNAME
;
EI
;
POP HL
LD A,H ;RESTORE DRIVE NUMBER
CALL IDEAUTO
IDEJUMPBACK:
CALL NC,MODEL
LD A,(SKIP)
INC A
LD A,msgStrings.ideNone
JR Z,NOSKIPKEY
LD A,msgStrings.ideSkiped
NOSKIPKEY:
CALL C,POSTMSG
CALL ScreenPOS.CRLF
RET
IT_IS_CDROM:
PUSH HL
LD A,L ;DETECT MESSAGE
CALL POSTMSG
CALL ScreenPOS.SUBNAME
;
EI
;
POP HL
LD A,H ;RESTORE DRIVE NUMBER
CALL IDE__CD
JP IDEJUMPBACK
; ????? ¯®á¬®âà¥âì
PRIM_MASTER_CMOS_T:
DB M_CYLL,M_CYLH,M_HEAD,M_SECT
PRIM_SLAVE_CMOS_T:
DB S_CYLL,S_CYLH,S_HEAD,S_SECT
SEC_MASTER_CMOS_T:
DB SM_CYLL,SM_CYLH,SM_HEAD,SM_SECT
SEC_SLAVE_CMOS_T:
DB SS_CYLL,SS_CYLH,SS_HEAD,SS_SECT
SETUPDETECT:
LD A,H
LD IX,PRIM_MASTER_CMOS_T
CP 0
JR Z,SETUPD2
LD IX,PRIM_SLAVE_CMOS_T
CP 1
JR Z,SETUPD2
LD IX,SEC_MASTER_CMOS_T
CP 2
JR Z,SETUPD2
LD IX,SEC_SLAVE_CMOS_T
SETUPD2:
CALL SELECT_IDE
LD HL,TEMP
LD DE,TEMP+1
LD BC,511
LD (HL),0
LDIR
CALL WAITHDD
RET C
LD A,(IX+2) ;M_HEAD
CALL READCMS
LD (TEMP+#06),A ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã. HEADS PER TRACK
LD A,(IX+1) ;M_CYLH
CALL READCMS
PUSH AF
LD A,(IX+0) ;M_CYLL
CALL READCMS
POP HL
LD L,A
LD (TEMP+#02),HL ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã. CYLINDERS
LD A,(IX+3) ;M_SECT
CALL READCMS
LD (TEMP+#0C),A ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã. SECTOR PER TRACK
LD A,#A0
LD BC,IDE.Write.DriveCtrl
OUT (C),A
LD A,IDE.Device.HDD
LD (IDEDEV),A
CALL IDESPEC
RET
;ID_BUFFER: BLOCK #100,0 ;!HARDCODE ; !FIXIT 㬥­ìè¨âì ¡ãä¥à ¨«¨ ¯¥à¥­¥áâ¨?
PIDNUM: LD HL,memBUFFER.ID
LD BC,#00FF
XOR A
CPIR
LD A,(HL)
OR A
RET Z
CALL PRINTZ
RET
PIDBOARD:
LD B,1
CALL FN_CRIPT
PUSH DE
PUSH HL
PUSH BC
LD A,B
CALL PRNHEX
LD A,'-'
CALL PRINT_CHAR
POP BC
LD A,C
CALL PRNHEX
LD A,'-'
CALL PRINT_CHAR
POP HL
CALL IZPRINT
POP DE
PUSH DE
LD A,D
CALL PRNHEX
POP DE
LD A,E
JP PRNHEX
;PIDNUM LD A,#0D
; LD HL,ID_BUFFER
; LD BC,#0030
; CPIR
; RET NZ
; INC HL
; LD BC,#0286
; RST_to_BIOS_18
; INC HL
; LD BC,#0586
; RST_to_BIOS_18
; INC HL
; LD BC,#0286
; RST_to_BIOS_18
; XOR A
; RET
;PIDDATE
; LD A,#0D
; LD HL,ID_BUFFER
; LD BC,#0030
; CPIR
; RET NZ
; INC HL
; CPIR
; RET NZ
; INC HL
; LD BC,#0A86
; JP_to_BIOS
PRNHEX: LD D,A
RRCA
RRCA
RRCA
RRCA
AND #0F
ADD A,#30
CP #3A
JR C,PRNH1
ADD A,7
PRNH1: CALL PRINT_CHAR
LD A,D
AND #0F
ADD A,#30
CP #3A
JP C,PRINT_CHAR
ADD A,7
JP PRINT_CHAR
PHEX: LD D,A
RRCA
RRCA
RRCA
RRCA
AND #0F
ADD A,#30
CALL PRINT_CHAR
LD A,D
AND #0F
ADD A,#30
JP PRINT_CHAR
PRNTIME:
IN A,(SLOT3)
PUSH AF
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(HL)
CALL PHEX
LD A,":"
CALL PRINT_CHAR
INC L
LD A,(HL)
CALL PHEX
LD A,":"
CALL PRINT_CHAR
INC L
LD A,(HL)
CALL PHEX
POP AF
OUT (SLOT3),A
RET
MODEL: LD HL,TEMP+27*2 ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã.
LD A,(HL)
OR A
JR Z,.unknown
LD B,20
CALL DWPRINT
AND A
RET
.unknown:
LD A,msgStrings.ideUnknown
CALL POSTMSG
AND A
RET
PMEMORY:
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL ; * 16
CALL IPRINT
LD A,"K"
JP PRINT_CHAR
ZXCLS: LD HL,#4000
LD DE,#4001
LD BC,#1AFF
LD (HL),L
LDIR
RET
GET_ID: LD HL,memBUFFER.ID
;LD C,BIOS.FN_VERSION
;JP_to_BIOS
JP FN_VERSION
;R01GET_ID
;R01 LD A,#10
;R01 LD BC,#1FFD
;R01 OUT (C),A
;R01 LD C,SLOT3
;R01 IN B,(C)
;R01 PUSH BC
;R01 LD A,#EE
;R01 OUT (C),A
;R01 LD HL,#FFD0
;R01 LD DE,ID_BUFFER
;R01 LD BC,#30
;R01 LDIR
;R01 POP BC
;R01 OUT (C),B
;R01 XOR A
;R01 LD BC,#1FFD
;R01 OUT (C),A
;R01 RET
RCHAIN:
LD E,L
LDI
DEC L
LD L,(HL)
INC L
RET Z
DEC L
JR RCHAIN
CCHAIN:
LD HL,MEMMAP2
LD DE,#C200
XOR A
CCHAINC:
CP (HL)
JR Z,NOCOPYC
LD E,L
LDI
DEC L
NOCOPYC:
INC L
JR NZ,CCHAINC
LD HL,TPOINTD
LD DE,SYS_PAGE.RAMD_KEYS
LD BC,SYS_PAGE.RAMD_KEYS.NUM
LDIR
RET
TRQUICK:
;REGISTER #1E
; %0000'0011 - TR DOS A: Default / FDD / HDD / RMD
; %0000'1100 - TR DOS B: Default / FDD / HDD / RMD
; %0011'0000 - TR DOS C: Default / FDD / HDD / RMD
; %1100'0000 - TR DOS D: Default / FDD / HDD / RMD
LD BC,#031E
LD A,0
CALL TRDOSX
LD BC,#0C1E
LD A,1
CALL TRDOSX
LD BC,#301E
LD A,2
CALL TRDOSX
LD BC,#C01E
LD A,3
TRDOSX:
; PUSH AF
; CALL G_VALUE
; POP BC
; OR A
; RET Z
; LD C,BIOS.FDD_TO_DRV
; DEC A
; JP Z,ToBIOS_18
; LD C,BIOS.HDD_TO_DRV
; DEC A
; JP Z,ToBIOS_18
; SCF
; RET
PUSH AF
CALL G_VALUE
POP BC
OR A
RET Z
DEC A
JP Z,FDD_TO_DRV
DEC A
JP Z,HDD_TO_DRV
SCF
RET
; ®âªà뢠¥â ¯®àâ #FE ­  ç⥭¨¥ ¢ 3-© ª à⥠¯®à⮢
; OPENDOS:
; DI
; IN A,(SLOT3)
; EX AF,AF'
; LD A,#40
; OUT (SLOT3),A
; LD HL,#C000
; LD DE,#F000
; LD BC,#0400
; LDIR
; LD A,#40
; LD (#F26E),A
; LD (#F27E),A
; LD (#F2EE),A
; LD (#F2FE),A
; LD (#F36E),A
; LD (#F37E),A
; LD (#F3EE),A
; LD (#F3FE),A
; LD HL,#F000
; LD DE,#F400
; LD BC,#0C00
; LDIR
; EX AF,AF'
; OUT (SLOT3),A
; RET
;
setFRAME:
.double:
LD HL,.dataDoubleAll
JR .setElements
.single:
LD HL,.dataSingleAll
JR .setElements
.high: LD HL,.dataSingleDown
JR .setElements
.low: LD HL,.dataSingleUp
JR .setElements
.medium:
LD HL,.dataSingleMedium
; JR .setElements
.setElements:
LD DE,ElementsBuffer
LD BC,ElementsBuffer.Size
LDIR
RET
.dataDoubleAll: BYTE "ɻͺȼ", "̹ËÊ" ; #C9,#BB,#CD,#BA,#C8,#BC, #CC,#B9,#CB,#CA
.dataSingleAll: BYTE "ڿ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
;
/*
SDOUBLE:
DB #C9
DB #BB
DB #CD
DB #BA
DB #C8
DB #BC
DB #CC
DB #B9
DB #CB
DB #CA
SSINGLE:
DB #DA
DB #BF
DB #C4
DB #B3
DB #C0
DB #D9
DB #C3
DB #B4
DB #C2
DB #C1
SSIN_DW:
DB #C9
DB #BB
DB #C4
DB #BA
DB #C7
DB #B6
DB #C7
DB #B6
DB #D1
DB #C1
SSIN_UP:
DB #C7
DB #B6
DB #C4
DB #BA
DB #C8
DB #BC
DB #C7
DB #B6
DB #C2
DB #CF
SSIN_AL:
DB #C7
DB #B6
DB #C4
DB #BA
DB #C7
DB #B6
DB #C7
DB #B6
DB #C2
DB #C1
;
SELEM:
UL: DB #DA
UR: DB #BF
ZL: DB #C4
VL: DB #B3
LL: DB #C0
LR: DB #D9
LC: DB #C3
RC: DB #B4
UC: DB #C2
DC: DB #C1
;
*/
INCLUDE 'VIDEO_IO.asm'
INCLUDE 'AUTOIDE.asm'
INCLUDE 'SETTINGS.asm'
INCLUDE 'KEY.asm'
;.......................................
;
KEY: EI
JP WAITKEY
FindStringAddr:
LD L,A
LD H,0
LD BC,memBUFFER.Messages
ADD HL,HL
ADD HL,BC
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
RET
/*
Get_Item_Address:
LD L,A
LD H,0
LD BC,MSG_Buffer
ADD HL,HL
ADD HL,BC
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
INC HL
INC HL
RET
*/
POSTLEN:
CALL FindStringAddr
LD BC,#0100
XOR A
CPIR
LD A,#FF
SUB C
SRL A
LD C,A
LD A,40
SUB C
LD E,A
;JP ScreenPOS.LOCAT
JP LP_SET_PLACE
POSTMSG:
CALL FindStringAddr
JP PRINTZ
POSTMSC:
CALL FindStringAddr
LD A,E
JP CPRINTZ
;
SETLAND:
LD A,#0E ; !HARDCODE CMOS ï祩ª  options
CALL READCMS
AND #04 ; !HARDCODE CMOS §­ ç¥­¨¥ ï§ëª 
JR NZ,.RUS
LD HL,MSG_ENG
LD DE,memBUFFER.Messages
LD BC,MSG_ENG.size
LDIR
RET
.RUS:
LD HL,MSG_RUS
LD DE,memBUFFER.Messages
LD BC,MSG_RUS.size
LDIR
RET
;
;
;---------------------------------------
INCLUDE 'src/bios/ROM/SETUP/messages.z80'
;---------------------------------------
;
/*
MSG_Buffer_Length EQU MSG_ENG_END-MSG_ENG
STACK EQU $+128
MSG_Buffer EQU STACK+2
TMP_BUFFER EQU MSG_Buffer+MSG_Buffer_Length
IF TMP_BUFFER+1024 > #C000
DISPLAY 'Page limit exceeded by: ',/A,$-#C000
ASSERT TMP_BUFFER+1024 > #C000
ENDIF
*/
STRUCT MAIN_BUFFERS
ID BLOCK #100
Messages BLOCK MSG_ENG.size
Shared BLOCK 1024
End BYTE
ENDS
memBUFFER MAIN_BUFFERS = $
STACK EQU #C000
.size EQU 128
; ID_BUFFER EQU $
; MSG_Buffer EQU ID_BUFFER+#100
; TMP_BUFFER EQU MSG_Buffer + MSG_ENG.size
IF memBUFFER.End-1 > #C000-STACK.size
DISPLAY 'memBUFFER.Shared overlaps STACK by: ',/A,(memBUFFER.End-1)-(#C000-STACK.size)
ASSERT memBUFFER.End-1 < #C000-STACK.size
ENDIF
IFDEF PREBUILD
OUTEND
DISPLAY '-----[Set_Pictures Prebuild start]-----'
MMU 1 e, 0 ; áâà ­¨æ  0 ¢ ¡ ­ªã 0 ¨ ¯à®¢¥àª  ­  £à ­¨æë.
ORG ROM_MAP.LOGO
INCLUDE 'src/bios/logo/Set_Pictures.asm'
DISPLAY '-----[Set_Pictures Prebuild done ]-----'
ELSE
DISPLAY '------------------[Main.asm]------------------'
DISPLAY 'End code address: ',/A,$-1
DISPLAY 'Code size: ',/A,$-COMPILE_ADDR.MAIN
DISPLAY 'End buffers address: ',/A,memBUFFER.End-1
DISPLAY 'Free memory: ',/A,#C000-(memBUFFER.End-1)-STACK.size
DISPLAY 'Unused bytes before INT_POINTER: ',/A,INT_POINTER-before_intPointer
ENDIF
;