Estex-DSS/BOOT/boot.asm

915 lines
24 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.

////////////////////////////////////////////////////////////////////////
; CHANGELOG
; [x] - § £à㧪  á «î¡®£® primary active à §¤¥« 
; [x] - ¯®¤¤¥à¦ª  § £à㧪¨ á FAT32 à §¤¥« 
; [x] - § £à㧪  á RAM ¤¨áª 
; [x] - bug fixes and optimizations)))
////////////////////////////////////////////////////////////////////////
; <20>ணࠬ¬  § ¯¨á¨ ­  FDD/HDD boot-§ £àã§ç¨ª  ¨ ä ©«®¢ á¨á⥬ë.
;
; ‡ £à㦠¥â á¨áâ. ä ©«ë ¨§ ª®à­ï ¤¨áª , á ª®â®à®£® ¡ë« 
; § £à㦥­  á¨á⥬ .
; ”¨âç¨ ¯à®£à ¬¬ë:
; ®â«¨ç¨¥ ®â ®à¨£¨­ «ì­®£® boot-¨­áâ ««ïâ®à , íâ  ¬®¦¥â
; ¯¥à¥¯¨á뢠âì 㦥 ãáâ ­®¢«¥­­ë© boot-§ £àã§ç¨ª.
; ” ©«ë á¨á⥬ë (system.dos, system.exe) ¬®£ãâ ¨¬¥âì
; «î¡ë¥ à §¬¥àë.
; <20>ਠ§ £à㧪¥ ª®¬¯ìîâ¥à  á ¤¨áª¥âë, § ¯à è¨¢ ¥âáï ­®¢ ï
; ¤¨áª¥â  ¤«ï á®§¤ ­¨ï ¨§ ­¥¥ § £à㧮筮©.
;
;
STRUCT _sysFatBuffer
;.DRIVE: BYTE #FF
.FAT_TYPE: BYTE #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; fat32
.CacheBlock: WORD #0000
;.CacheUpdated: BYTE #00
;.SectorsPerBank: BYTE #00
.RootDirStartCluster_L: WORD #0000
.RootDirStartCluster_H: WORD #0000 ; fat32
.FAT1_SEC_L: WORD #0000 ; MSD_FAT_SEC first sector FAT (FAT_FRM)
.FAT1_SEC_H: WORD #0000 ; fat32
;.FAT2_SEC_L: WORD #0000
;.FAT2_SEC_H: WORD #0000 ; fat32
;.Number_Of_FATs BYTE #02
.SectorsPerFAT_L WORD #0000
.SectorsPerFAT_H BYTE #00
.RootDirFirstSector_L: WORD #0000 ; MSD_CAT_SEC first sector DIR
.RootDirFirstSector_H: WORD #0000 ; MSD_CAT_SEC first sector DIR
.DirSizeInSectors: BYTE #00 ; DIR_SEC_SIZE
.FirstDataSector_L: WORD #0000 ; MSD_DAT_SEC low
.FirstDataSector_H: WORD #0000 ; MSD_DAT_SEC high
.BytesPerCluster: WORD #0000 ; CLUSTER_LEN
;.END_CHAIN_CLUSTER_L: WORD #FFFF
;.END_CHAIN_CLUSTER_H: WORD #0FFF
;.MaxClusterLow: WORD #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
;.MaxClusterHigh: WORD #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
;.BytesPerSector: WORD #0000
.SectorsPerCluster: BYTE #00
;.FSINFO_Sector: WORD #01
;.BPB_SERIAL_NUMBER: DWORD #00000000
;.BPB_LABEL: BLOCK 11,' ' ; 11 ¤«ï FAT, 31 ¤«ï CDFS
;.UPD_FSINFO: BYTE 0
;.FREE_CLUSTERS_COUNT_L: WORD #FFFF
;.FREE_CLUSTERS_COUNT_H: WORD #FFFF
;.FilesPerSector: BYTE #00 ; ç¨á«® ä ©«®¢ëå § ¯¨á¥© ¢ ᥪâ®à¥
;.ClustersPerBank: BYTE #00 ; A - Clusters per bank (16k) (ç¨á«® ª« áâ¥à®¢ ­  ¡«®ª އ“)
;.READ_PG: BYTE #00 ;!TODO ­¥ ¨á¯®«ì§ãîâáï ­¥ª®â®àë¥ §­ ç¥­¨ï, ­® § ¤ã¬ª  ­¥¯«®å ï)))
;.S_X_H: DWORD #0000 ; ª®«¨ç¥á⢮ ᥪâ®à®¢ ­  樫¨­¤à¥
ENDS
includelua 'Shared_includes/lua/Functions.lua'
include 'shared_includes/constants/sp2000.inc'
include 'shared_includes/constants/bios_equ.inc'
include 'shared_includes/constants/dss_equ.inc'
include 'shared_includes/macroses/accelerator.z80'
include 'shared_includes/macroses/macros.z80'
include 'shared_includes/structures/FileSystem.inc'
;include 'DSS/structures.inc'
include '../DSS/defines.inc'
LUA PASS1
local date, month, year = Get_date_RU(sj.get_define("__DATE__"))
BuildDate = "'" .. date .. "." .. month .. "." .. year .. "'"
sj.insert_define("SYS_BUILD_DATE", BuildDate)
ENDLUA
LUA ALLPASS
sj.insert_define("SYS_BUILD_DATE", BuildDate)
ENDLUA
DEFINE EXEinfoMACRO 0
DEFINE App_EXE_Version 1
MACRO _mEXEinfo
BLOCK 10,' ' ; ‚ëà ¢­¨¢ ­¨¥ ¤«ï ªà á¨¢®£® ®â®¡à ¦¥­¨ï ¢ HEX
BYTE ' Bootloader '
BYTE ' installer '
BYTE ' for DSS. '
BYTE ' Vasil Ivanov, '
BYTE ' Anatoliy '
BYTE ' Belyanskiy. '
BYTE ' Sprinter Team, '
BYTE ' 2024 '
ENDM
; ¢¥àá¨ï ¯à®£à ¬¬ë
major_version equ 2 ; áâ. ­®¬¥à ¢¥àᨨ
minor_version equ 1 ; ¬«. ­®¬¥à
;;
SECTORS_OF_LOADER EQU 4 ; ᥪâ®à®¢ § £àã§ç¨ª 
.IN_BPB EQU 1
.AFTER_BPB EQU 3
org_addr EQU #8000 + CLP_Buffer
code_addr EQU BEGIN
program_start EQU BEGIN
stack_point EQU #BFFE
Loader_length EQU 0
;
page_buffer equ #C000 ; ¡ãä¥à ä ©«®¢
;;
include 'Shared_Includes/constants/EXE_Header.z80'
ORG org_addr
BEGIN: ;di
in a,(SLOT3)
ld (port+1),a ; á®åà. ¯®àâ
push ix
call save_path ; á®åà. ⥪. ¤¨áª ¨ ¯ãâì
ld c,Dss.Version ; ã§­ âì ¢¥àá¨î „Ž‘
RST ToDSS
ex de,hl ; hl=⥪. ¢¥àá¨ï
ld de,#0146 ; 1.70.810 d=¢¥àá¨ï, e=¬®¤¨ä¨ª æ¨ï, bc - ­®¬¥à ᡮન. de = #0146, bc = 810 dos ver 1.70.810
and a
sbc hl,de
;[x] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
;jr nc,version_ok
jr z,.check_build ; ¥á«¨ ­®¬¥à ¢¥àᨨ 1.70
jr nc,version_ok ; ¥á«¨ ­®¬¥à ¢¥àᨨ ¡®«ìè¥ 1.70
;
.old_ver: pop hl
ld a,11 ; ¨­¤¥ªá áâப¨ "Error: Need DSS version 1.70..."
call print_string
ld a,-1
jp exit
;[x] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
.check_build: ld hl,810 ; 1.70.810 d=¢¥àá¨ï, e=¬®¤¨ä¨ª æ¨ï, bc - ­®¬¥à ᡮન. de = #0146, bc = 810 dos ver 1.70.810
sbc hl,bc
jr nc,BEGIN.old_ver
;
version_ok: xor a ; ¨­¤¥ªá áâப¨ â¨â« 
call print_string
pop hl ; ª®¬-áâப 
; ¢ë¤¥«¨âì ¯ à ¬¥âà ª®¬-áâப¨
call get_drive_letter
jp c,help ; ­¥â ¯ à ¬¥â஢
ld (disk),a ; § ¤ ­­ë© ­®¬¥à ¤¨áª 
; ã§­ âì ­®¬¥à boot-¤¨áª  á¨á⥬ë
ld bc,Dss.BootDSK.Get
RST ToDSS
ld (boot_disk),a ; ¤¨áª (A=0,B=1,..)
; ¯à®¢¥à¨âì ­  ᮢ¯ ¤¥­¨¥ ¤¨áª®¢
ld hl,disk
cp (hl)
jr nz,.next
ld hl,confirm_flag
ld (hl),1 ; ãáâ. ä« £
;
; —⥭¨¥ ¢ ¡ ­ª¨ ä ©«®¢ á¨á⥬ë
;
.next: ld a,(boot_disk) ; ¤¨áª § £à㧪¨ Ž‘
ld hl,root_path ; "X:\" ª®à¥­ì ¤¨áª 
add a,'A'
ld (hl),a
ld c,Dss.ChDir ; ᬥ­  ª â «®£ 
RST ToDSS
;--------------------------------------------
; —⥭¨¥ ä ©«  system.exe
;--------------------------------------------
ld hl,name2 ; ¨¬ï ä ©« 
call read_file ; ¢áï à ¡®â  ¯® § £à㧪¥ ä ©«  ¢ áâà ­¨æë
;jr nc,read_file1_ok
; ®á¢®¡. ¡«®ª ¯ ¬ïâ¨
;read_file_err: ld a,(FILE1_PARAMS.id_blck) ; ¨¤¥­â¨ä. ¡«®ª  ¯ ¬ïâ¨
; ld c,Dss.FreeMem
; RST ToDSS
;ld a,DSS_Error.sys.DISK_FULL ; ª®¤ ®è¨¡ª¨
jp c,exit
; á®åà. à ¡. ï祩ª¨ ä ©«  system.exe
read_file1_ok: ld hl,FILE1_PARAMS ; ®âªã¤ 
ld de,FILE2_PARAMS ; ªã¤ 
ld bc,FILE2_PARAMS.dataSize
ldir
;--------------------------------------------
; —⥭¨¥ ä ©«  system.dos
;--------------------------------------------
ld hl,name1 ; ¨¬ï ä ©« 
call read_file ; ¢áï à ¡®â  ¯® § £à㧪¥ ä ©«  ¢ áâà ­¨æë
;jr c,read_file_err
;ld a,DSS_Error.sys.DISK_FULL; ª®¤ ®è¨¡ª¨
jp c,exit
;jr nc,read_file2_ok
; ®á¢®¡. ¡«®ª ¯ ¬ï⨠system.exe
; file_err1: ld a,(FILE2_PARAMS.id_blck); ¨¤¥­â¨ä. ¡«®ª  ¯ ¬ïâ¨
; ld c,Dss.FreeMem
; RST ToDSS
;jr read_file_err ; ®á¢®¡. ¡«®ª ¯ ¬ï⨠system.dos
confirm_flag+1: ld a,0
or a
jr z,no_confirm
ld a,(boot_disk) ; á¨áâ. ¤¨áª
cp 2
jr nc,no_confirm ; ­¥ ¤¨áª®¢®¤ë
; § ¯à®á¨âì æ¥«¥¢®© ¤¨áª
ld a,(disk) ; § ¤ ­­ë© ­®¬¥à ¤¨áª 
add a,'A'
ld (messages.lett2),a
ld a,5 ; ¨­¤¥ªá áâப¨ "Insert destination disk..."
call print_string
ld bc,Dss.K_CLEAR + Dss.WaitKey*256; ¦¤¥¬ ­ ¦ â¨ï ª« ¢¨è¨
RST ToDSS
no_confirm: ld a,2 ; ¨­¤¥ªá áâப¨ "Installing boot loader..."
call print_string
; “áâ. 楫¥¢®© ¤¨áª/¯ãâì
ld a,(disk) ; 楫¥¢®© ¤¨áª
ld hl,root_path ; "X:\" áâப  ¯ãâ¨
add a,'A'
ld (hl),a
ld c,Dss.ChDir ; ᬥ­  ⥪. ª â «®£ 
RST ToDSS
;--------------------------------------------
; ‡ ¯¨á âì boot-§ £àã§ç¨ª
call write_boot_loader
jr c,write_error ; ®è¨¡ª  à ¡®âë á ¤¥¢ ©á®¬
;
ld a,3 ; ¨­¤¥ªá áâப¨ "Writing system files..."
call print_string
; ‡ ¯¨áì ä ©«  system.dos
ld hl,name1 ; ¨¬ï ä ©« 
call write_file
jr c,write_error
ok_write1: ; ®á¢®¡®¤¨âì ¯ ¬ïâì
; ld a,(FILE1_PARAMS.id_blck) ; ¡«®ª system.dos
; ld c,Dss.FreeMem
; RST ToDSS
;
; § £à. à ¡. ï祩ª¨
ld hl,FILE2_PARAMS ; ®âªã¤ 
ld de,FILE1_PARAMS ; ªã¤ 
ld bc,FILE1_PARAMS.dataSize
ldir
; ‡ ¯¨áì ä ©«  system.exe
ld hl,name2 ; ¨¬ï ä ©« 
call write_file
; ®á¢®¡®¤¨âì ¯ ¬ïâì
; push af
; ld a,(FILE1_PARAMS.id_blck) ; ¡«®ª system.exe
; ld c,Dss.FreeMem
; RST ToDSS
; pop af
;
jr c,write_error
;jr c,exit ; ®è¨¡ª 
;
ld a,(disk) ; § ¤ ­­ë© ­®¬¥à ¤¨áª 
add a,'A'
ld (messages.lett1),a
ld a,1 ; ¨­¤¥ªá áâப¨ "System installed on disk "
call print_string
ld a,(confirm_flag)
or a
jr z,exit
; § ¯à®á¨âì á¨á⥬­ë© ¤¨áª
ld a,(boot_disk) ; á¨áâ. ¤¨áª
cp 2
jr nc,.not_fdd ; ­¥ ¤¨áª®¢®¤ë
add a,'A'
ld (messages.lett3),a
ld a,6 ; ¨­¤¥ªá áâப¨ "Insert system disk..."
call print_string
ld bc,Dss.K_CLEAR + Dss.WaitKey*256; ¦¤¥¬ ­ ¦ â¨ï ª« ¢¨è¨
RST ToDSS
.not_fdd: xor a ; ª®¤ "Ok"
exit: push af
call restore_path ; ¢®ááâ. ⥪. ¤¨áª ¨ ¯ãâì
port: ld a,-1 ; á®åà. ¯®àâ
out (SLOT3),a
pop af
ld c,Dss.Exit ; ¢ë室 ¢ „Ž‘
ld b,a
RST ToDSS
jr $
;
help: ld a,8 ; ¨­¤¥ªá áâப¨ "Invalid drive specification"
call print_string
ld a,4 ; ¨­¤¥ªá áâப¨ åí«¯ 
err_mes: call print_string
ld a,1 ; ª®¤ ®è¨¡ª¨
jr exit
write_error: ld a,7 ; ¨­¤¥ªá áâப¨ "Can't install boot on this disk"
jr err_mes
root_path: db 'X:\',0 ; ¯ãâì
name1: db "SYSTEM.DOS",0
name2: db "SYSTEM.EXE",0
;-------------------------------------------------
; ‡ ¯¨á âì boot-§ £àã§ç¨ª ­  FDD/HDD
; ¢å®¤: ­¥â
; ¢ë室: CF - ®è¨¡ª  à ¡®âë á ¤¥¢ ©á®¬
;-------------------------------------------------
write_boot_loader:
ld a,(disk) ; § ¤ ­­ë© ­®¬¥à ¤¨áª 
ld c,Dss.DRV.Open ; open device
rst ToDSS.DRV
ret c
ld hl,close_device ; â®çª  ¢ë室 
push hl
ld a,(disk) ; § ¤ ­­ë© ­®¬¥à ¤¨áª 
ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à 
ld ix,0 ; ¬«. à §àï¤
ld de,buffer ; ªã¤ 
ld bc,1*256 + Dss.DRV.Read ; ¯à®ç¨â âì 1 ᥪâ®à (boot)
rst ToDSS.DRV
ret c ; ®è¨¡ª  ç⥭¨ï
ld a,(buffer + _sBOOT_SECTOR_PARAMS.DRIVE_TYPE)
cp #F0 ; 1.44Mb
ret c ; ­¥§­ ª®¬ë© ä®à¬ â
jr z,write_to_floppy
cp #F9 ; 720kB
jr z,write_to_floppy
cp #FA ; RAM disk
jr z,write_to_ram_disk
cp #F8 ; ¢¨­â
jp z,write_to_hard_disk
scf ; ­¥§­ ª®¬ë© ä®à¬ â
ret
; § ªàëâì ¤¥¢ ©á
close_device: push af ; á®åà. ä« £
ld a,(disk) ; § ¤ ­­ë© ­®¬¥à ¤¨áª 
ld c,Dss.DRV.Close ; close device
rst ToDSS.DRV
pop af
ret
;-------------------------------------------------
; ‡ ¯¨áì boot-§ £àã§ç¨ª  ­  ¤¨áª¥âã
;
; ¢å®¤: ¤ ­­ë¥ ¨§ buffer
; ¢ë室: CF - ¯à¨ ®è¨¡ª¥ § ¯¨á¨
;-------------------------------------------------
write_to_floppy:
ld a,(buffer + BOOT_SECTOR.Number_of_FATs) ; ç¨á«® ª®¯¨© FAT-®¢
or a
scf
ret z ; ®è¨¡ª 
dec a ; --ç¨á«® ª®¯¨©
jr z,overwrite_floppy ; § £àã§ç¨ª 㦥 § ¯¨á ­, ¯¥à¥§ ¯¨á âì ¥£®
; ­ áâநâì ï祩ª¨ boot-ᥪâ®à 
ld (buffer + BOOT_SECTOR.Number_of_FATs),a ; ç¨á«® ª®¯¨© FAT-®¢
ld hl,(buffer + BOOT_SECTOR.RESERVED_SECTORS) ; § à¥§¥à¢. ᥪâ®à®¢
ld bc,(buffer + BOOT_SECTOR.SectorsPerFAT16) ; ᥪâ®à®¢ ­  FAT
add hl,bc
ld (buffer + BOOT_SECTOR.RESERVED_SECTORS),hl ; § à¥§¥à¢. ᥪâ®à®¢
dec hl
ld de,SECTORS_OF_LOADER.AFTER_BPB
and a
sbc hl,de
ret c
overwrite_floppy:
; ¯¥à¥ª¨¤ë¢ ­¨¥ ç á⨠§ £àã§ç¨ª  ¢ 0 ᥪâ®à
LD HL,DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.physical
LD DE,buffer + (_sBOOT_SECTOR.PARTITION_TABLE - DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.Size)
LD BC,DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.Size
LDIR
;
; § ¯¨á âì boot-ᥪâ®à ­ § ¤
ld a,(disk) ; § ¤ ­­ë© ­®¬¥à ¤¨áª 
ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à 
ld ix,0 ; ¬«. à §àï¤
ld de,buffer ; ®âªã¤ 
ld bc,1*256 + Dss.DRV.Write ; § ¯¨á âì 1 ᥪâ®à
rst ToDSS.DRV
ret c ; ®è¨¡ª  § ¯¨á¨
; § ¯¨á âì § £àã§ç¨ª
ld a,(disk) ; § ¤ ­­ë© ­®¬¥à ¤¨áª 
ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à 
ld ix,1 ; ¬«. à §àï¤
ld de,code_loader ; ®âªã¤  (ª®¤ § £àã§ç¨ª )
ld bc,SECTORS_OF_LOADER.AFTER_BPB*256+Dss.DRV.Write; § ¯¨á âì 3 ᥪâ®à  (à §¬¥à § £à.)
rst ToDSS.DRV
ret
;-------------------------------------------------
; ‡ ¯¨áì boot-§ £àã§ç¨ª  ­  ¤à ©¢
;
; ¢å®¤: ­¥â
; ¢ë室: CF-®è¨¡ª  § ¯¨á¨
;-------------------------------------------------
write_to_ram_disk:
CALL write_no_BPB
RET C
; buffer = sector 0
;
JR write_to_BPB
write_to_hard_disk:
;[x] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
CALL write_no_BPB
RET C
; buffer = sector 0
;
; ¯à®¢¥àª  ­  <20>€Œ-¤¨áª (à §¤¥«ë ­  à ¬¤¨áª¥ ¯®ª  ­¥ ¯®¤¤¥à¦¨¢ îâáï)
LD A,B
CP #80-1 ;!HARDCODE HDD number
JR C,write_to_BPB
;
PUSH BC
CALL Read_MBR
RET NZ
POP BC
PUSH BC
; set active in buffer
INC C
LD HL,buffer + _sBOOT_SECTOR.PARTITION_TABLE.Record_4
LD DE,_sMBR_PARTITION_RECORD ; à §¬¥à ®¤­®© § ¯¨á¨ MBR
LD B,_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD; MBR: Number of entries in the partition table
.loop: XOR A
LD (HL),A
;
LD A,C
CP B
JR NZ,.next
;
LD A,#80
LD (HL),A
PUSH HL
INC HL
INC HL
INC HL
INC HL
LD A,(HL)
POP HL
CP PartitionSysTypes.FAT12
JR Z,.next
CP PartitionSysTypes.FAT16_32Mb
JR Z,.next
CP PartitionSysTypes.FAT16
JR Z,.next
CP PartitionSysTypes.FAT16_LBA
JR Z,.next
CP PartitionSysTypes.FAT32
JR Z,.next
CP PartitionSysTypes.FAT32_LBA
JR Z,.next
; NOT SUPPORTED FS
POP BC
SCF
RET
;
.next: AND A
SBC HL,DE
DJNZ .loop
;
JR write_to_BPB.no_push
write_to_BPB: PUSH BC
; ¯¥à¥ª¨¤ë¢ ­¨¥ ç á⨠§ £àã§ç¨ª  ¢ 0 ᥪâ®à
.no_push: LD HL,DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.physical
LD DE,buffer + (_sBOOT_SECTOR.PARTITION_TABLE - DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.Size)
LD BC,DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.Size
LDIR
; § ¯¨áì ¢ 0 ᥪâ®à ªã᪠ § £àã§ç¨ª 
pop af ; § ¤ ­­ë© ­®¬¥à ¤¨áª 
ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à 
ld ix,0 ; ¬«. à §àï¤
ld de,buffer ; ®âªã¤  (ª®¤ § £àã§ç¨ª )
ld bc,1*256 + BIOS.DRV_WRITE ; § ¯¨á âì 1 ᥪâ®à
RST ToBIOS
RET
;
;
write_no_BPB: ld a,(disk) ; ­®¬¥à § ¤ ­­®£® ¤¨áª 
ld de,Dss.DRV.GenIOCTL.Enter
ld bc,Dss.DRV.GenIOCTL.GetParams
rst ToDSS.DRV
ex af,af'
;[x] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
ld b,a
inc c
scf
ret z
dec c
CP #80 ;!HARDCODE ⨯ ¤à ©¢  - HDD
JR NC,.skip_FAT_check
PUSH BC
; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR
; A - PHISICAL DRIVE NUMBER
; [x] 02/02/2024 ¯à®¢¥àª  ­  ¢«¥§ ¥¬®áâì § £àã§ç¨ª  (ç⮡ ­¥ ¯®¯®àâ¨âì ä â)
CALL Read_MBR
RET NZ
POP BC
LD HL,(buffer + _sBOOT_SECTOR_PARAMS.RESERVED_SECTORS)
; ¬¨­¨¬ «ì­®¥ à ááâ®ï­¨¥ ­  ¤à ©¢¥ ®â ­ã«¥¢®£® ᥪâ®à  ¤® ä â  (¤«¨­  § £àã§ç¨ª  + 1)
LD DE,SECTORS_OF_LOADER.AFTER_BPB + 1
AND A
SBC HL,DE
RET C
;
.skip_FAT_check:;
push bc
ld a,b
ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à 
ld ix,1 ; ¬«. à §àï¤
ld de,code_loader ; ®âªã¤  (ª®¤ § £àã§ç¨ª )
ld bc,SECTORS_OF_LOADER.AFTER_BPB*256+BIOS.DRV_WRITE; § ¯¨á âì 3 ᥪâ®à  (à §¬¥à § £à.)
rst ToBIOS
;[x] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
pop bc
;
ret
; in: a - drive
; out CF = 1.
; ZF = 1 - OK,
; ZF = 0 - error
Read_MBR: LD HL,0
LD IX,0
LD DE,buffer
LD BC,1*256 + BIOS.DRV_READ
RST ToBIOS
LD HL,(buffer + _sBOOT_SECTOR.MBR_SIGNATURE)
LD DE,#AA55
AND A
SBC HL,DE
SCF
RET
;-------------------------------------------------
; ‚뤥«¨âì § ¤ ­­ë© ¤¨áª ¨§ ª®¬-áâப¨
;
; ¢å®¤: hl=¡ãä¥à áâப¨
; ¢ë室: a=­®¬¥à ¤¨áª 
; CF-¯à¨ ®è¨¡ª¥
;-------------------------------------------------
get_drive_letter:
inc hl ; ¡ãä¥à áâப¨
ld de,buffer ; ¡ãä¥à ¤«ï ¢ë¤¥«. ¯ à ¬¥âà 
ld c,Dss.GSwitch ; ¢ë¤¥«¨âì ¯ à ¬¥âà ª®¬. áâப¨
RST ToDSS
ld de,buffer
ld a,(de)
inc de
ld c,a ; á®åà. 'a'
ld a,(de)
inc de
cp ':'
jr nz,get_drive_err ; ¤¨áª ­¥ § ¤ ­
ld a,(de)
inc de
or a
jr nz,get_drive_err ; > 1 ¯ à ¬¥âà 
ld a,c ; ¢®ááâ. 'a'
cp 'A'
jr c,get_drive_err
cp 'z'+1
jr nc,get_drive_err
and %1101'1111
sub 'A'
or a
ret
;
get_drive_err: scf ; ®è¨¡ª 
ret
;----------------------------------------------------
; á®åà. ⥪. á¨á⥬­ë© ¤¨áª ¨ ¯ãâì
;----------------------------------------------------
save_path: ld c,Dss.CurDisk ; ã§­ âì ¤¨áª
RST ToDSS
ld (sys_disk),a
ld hl,sys_path
ld c,Dss.CurDir ; ã§­ âì ¯ãâì
RST ToDSS
ret
;----------------------------------------------------
; ¢®ááâ. ⥪. á¨á⥬­ë© ¤¨áª ¨ ¯ãâì
;----------------------------------------------------
restore_path: ld a,(sys_disk)
ld c,Dss.ChDisk ; ᬥ­  ¤¨áª 
RST ToDSS
ld hl,sys_path
ld c,Dss.ChDir ; ᬥ­  ¯ãâ¨
RST ToDSS
ret
;
;
disk: db 0 ; ­®¬¥à § ¤ ­­®£® ¤¨áª 
boot_disk: db 0 ; ­®¬¥à boot-¤¨áª  á¨á⥬ë
; à ¡. ï祩ª¨ ⥪. ä ©« 
;
; ç⥭¨¥: system.exe, ¤ «¥¥ system.dos
; § ¯¨áì: system.dos, ¤ «¥¥ system.exe
FILE1_PARAMS:
.handle: db -1 ; ¤¥áªà¨¯â®à ä ©« 
.id_blck: db -1 ; ¨¤¥­â¨ä. ¢ë¤¥«. ¡«®ª  ¯ ¬ïâ¨
;
.sizeLow: dw 0 ; ¬«.à §àï¤ à §¬¥à  ä ©« 
.sizeHigh: dw 0 ; áâ.à §àï¤
.dataSize EQU $-FILE1_PARAMS
; á®åà. ¤ ­­ë¥ system.exe
FILE2_PARAMS:
.handle: db -1 ; ¤¥áªà¨¯â®à ä ©« 
.id_blck: db -1 ; ¨¤¥­â¨ä. ¢ë¤¥«. ¡«®ª  ¯ ¬ïâ¨
;
.sizeLow: dw 0 ; ¬«.à §àï¤ à §¬¥à  ä ©« 
.sizeHigh: dw 0 ; áâ.à §àï¤
.dataSize EQU $-FILE2_PARAMS
ASSERT FILE1_PARAMS.dataSize = FILE2_PARAMS.dataSize, "Erorr! FILE1_PARAMS != FILE2_PARAMS"
;
;
;
;
;
; á®®¡é¥­¨ï
messages: db 0
db "\r\nBoot and System files Installer v" ;0
db major_version + '0','.'
db (minor_version / 10) + '0',(minor_version % 10) + '0','.'
db "\r\nBuild date ",SYS_BUILD_DATE
db "\r\nCopyright (c) 2006 Vasil Ivanov."
db "\r\nCopyright (c) 2023-2024 Sprinter Team."
db "\r\n\n",0
;
db "System successfully installed on disk " ;1
.lett1: db "X:\r\n\n",0
;
db "Installing boot loader...\r\n\n",0 ;2
db "Writing system files...\r\n\n",0 ;3
;
db "Syntax: SYS X:\r\n" ;4
db " where X: - drive letter (A..Z)\r\n\n",0
;
db "Insert destination disk in drive " ;5
.lett2: db "X:\r\n"
db "and strike any key when ready ...\r\n\n",0
;
db "Insert system disk in drive " ;6
.lett3: db "X:\r\n"
db "and strike any key when ready ...\r\n\n",0
;
db "Can't install boot on this disk\r\n\n",0 ;7
db "Invalid drive specification\r\n\n",0 ;8
db " Error: Can't open file\r\n\n",0 ;9
db " Error: Can't allocate memory\r\n\n",0 ;10
db " Error: Need DOS version 1.70.811 or higher\r\n\n",0 ;11
db " Error: Reading error\r\n\n",0 ;12
db " Error: Can't create file\r\n\n",0 ;13
db " Error: Writing error\r\n\n",0 ;14
.endmess: db 0
; ‚뢥á⨠áâப㠯® ¨­¤¥ªáã
; ¢å®¤: a=¨­¤¥ªá áâப¨
print_string: call get_string ; ¯®¨áª áâப¨ ¯® ¥¥ ¨­¤¥ªáã ¢ 'a'
ld c,Dss.PChars ; ¢ë¢®¤ áâப¨
RST ToDSS
ret
; ¯®¨áª áâப¨ ¯® ¥¥ ¨­¤¥ªáã ¢ 'a'
get_string: ld hl,messages ; ᯨ᮪ ¬¥áá £ ¤«ï ¨­¤¥ªá. ¤®áâ㯠
ld bc,messages.endmess - messages ; à §¬¥à ᯨ᪠
inc a
ex af,af'
xor a
ex af,af'
get_loop: ex af,af'
cpir
ret po
ret nz
ex af,af'
dec a
jr nz,get_loop
ret
;====================================================
; ‚áï à ¡®â  ¯® § £à㧪¥ ä ©«  ¢ áâà ­¨æë
; ¢å®¤: hl=¨¬ï ä ©« 
; ¢ë室: CF-¯à¨ ®è¨¡ª¥
;====================================================
read_file: ld a,Dss.Open.R ; ­  ç⥭¨¥
ld c,Dss.Open ; ®âªàëâì ä ©«
RST ToDSS
jr nc,.ok ; ¡¥§ ®è¨¡®ª
;
push af
ld a,9 ; ¨­¤¥ªá "Can't open file"
call print_string
pop af
ret
;
.ok: ld (FILE1_PARAMS.handle),a ; ¤¥áªà. ä ©« 
ld hl,0
ld ix,0
ld bc,Dss.Move_FP.FrEnd ; 㪠§ â¥«ì ­  ª®­¥æ ä ©« 
RST ToDSS
ld (FILE1_PARAMS.sizeHigh),hl ; áâ.à §àï¤ à §¬¥à  ä ©« 
ld (FILE1_PARAMS.sizeLow),ix ; ¬«.à §àï¤
call get_memory ; à áç. ¨ ¢ë¤¥«. áâà ­¨æë ¯®¤ ä ©«
jr c,.not_enough ; ­¥ 墠⠥⠯ ¬ïâ¨
call file_to_bank ; § £à. ä ©« ¢ áâà ­¨æë
.close_file: push af
ld a,(FILE1_PARAMS.handle) ; ¤¥áªà. ä ©« 
ld c,Dss.Close ; § ªàëâì ä ©«
RST ToDSS
pop af
ret
;
.not_enough: push af
call .close_file
ld a,10 ; ¨­¤¥ªá "Can't allocate memory"
call print_string
pop af
or a
scf
ret nz
ld a,DSS_Error.sys.NOT_ENOUGH_MEMORY
ret
;----------------------------------------------------
; <20>® à §¬¥àã ä ©«  à ááç¨â âì ­¥®¡å®¤¨¬®¥
; ç¨á«® áâà ­¨æ ¨ ¢ë¤¥«¨âì ¨å.
; ‚ë室: CF - ¯à¨ ­¥å¢ âª¥ ¯ ¬ïâ¨
;----------------------------------------------------
get_memory: ld hl,(FILE1_PARAMS.sizeHigh) ; áâ.à §àï¤ à §¬¥à  ä ©« 
ld bc,(FILE1_PARAMS.sizeLow) ; ¬«.à §àï¤
ld de,#4000 ; ¤¥«¨â¥«ì (à §¬¥à áâà ­¨æë)
xor a
scf
malloc1: rr d
rr e
jr c,malloc2
rr h
rr l
rr b
rr c
jr nc,malloc1
ld a,1
jr malloc1
;
malloc2: or a
jr z,$+3 ;!FIXIT $
inc bc
xor a
cp b
scf
ret nz
; ¢ë¤¥«¨âì ¡«®ª ¯ ¬ïâ¨
ld b,c ; b=ç¨á«® áâà ­¨æ
ld c,Dss.GetMem
RST ToDSS
ld (FILE1_PARAMS.id_blck),a ; ¨¤¥­â¨ä. ¡«®ª 
ret
;----------------------------------------------------
; ‡ £à㧨âì ä ©« ¢ áâà ­¨æë
;----------------------------------------------------
file_to_bank: ld hl,0
ld ix,0
ld a,(FILE1_PARAMS.handle) ; ¤¥áªà. ä ©« 
ld bc,Dss.Move_FP.FrStart ; 㪠§ â¥«ì ­  ­ ç «® ä ©« 
RST ToDSS
ld a,(FILE1_PARAMS.id_blck) ; ¨¤¥­â¨ä. ¡«®ª  ¯ ¬ïâ¨
;ld b,0 ; «®£. ­®¬¥à áâà ­¨æë ¢ ¡«®ª¥
ld bc,0*256 + BIOS.GetMemPage; ¯®«ãç¨âì 䨧. ­®¬¥à áâà ­¨æë ¢ ¡«®ª¥
rst ToBIOS
ret c
.loop: push af
out (SLOT3),a
ld hl,page_buffer ; #C000 ªã¤ 
ld de,#4000 ; ᪮«ìª®
ld a,(FILE1_PARAMS.handle) ; ¤¥áªà. ä ©« 
ld c,Dss.Read ; ç¨â âì ä ©«
RST ToDSS
pop bc
jr c,.error
; ok
cp -1 ; ¯à®ç¨â ­® ¬¥­ì襥 ç¨á«® ¡ ©â ?
ret z ; ¤ 
ld a,b ; a=䨧¨ç. áâà ­¨æ 
ld c,BIOS.GetMemPageNext ; ¯®«ãç¨âì ­®¬¥à á«¥¤. 䨧. áâà ­¨æë ¡«®ª 
rst ToBIOS
ret c
cp #FF
jr nz,.loop ; ­¥ ¯®á«¥¤­ïï áâà ­¨æ 
ret
; error
.error: ld a,12 ; ¨­¤¥ªá "Reading error"
call print_string
scf
ret
;====================================================
; ‡ ¯¨áì ä ©«  ­  ¤¨áª
; ¢å®¤: hl=¨¬ï ä ©« 
; ¢ë室: CF-¯à¨ ®è¨¡ª¥
;====================================================
write_file: ld a,FAT_ATTR.ARCHIVE ;  âਡãâ " à娢­ë©"
ld c,Dss.Create ; á®§¤ âì ä ©«
RST ToDSS
jr nc,.create_ok ; ¡¥§ ®è¨¡®ª
push af
ld a,13 ; ¨­¤¥ªá "Can't create file"
call print_string
pop af
ret
;
.create_ok: ld (FILE1_PARAMS.handle),a ; ¤¥áªà. ä ©« 
ld hl,read_file.close_file ; § ªà. ä ©«
push hl ; â®çª  ¢ë室 
;
; ç⥭¨¥ ä ©«  ¨§ ¡ ­®ª ¨ § ¯¨áì ­  ¤¨áª
ld a,(FILE1_PARAMS.id_blck); ¨¤¥­â¨ä. ¡«®ª  ¯ ¬ïâ¨
;ld b,0 ; «®£. ­®¬¥à áâà ­¨æë ¢ ¡«®ª¥
ld bc,BIOS.GetMemPage ; ¯®«ãç¨âì 䨧. ­®¬¥à áâà ­¨æë ¢ ¡«®ª¥
rst ToBIOS
ret c
.loop: push af
out (SLOT3),a
ld hl,(FILE1_PARAMS.sizeLow) ; ¬«.à §àï¤ à §¬¥à  ä ©« 
ld de,(FILE1_PARAMS.sizeHigh) ; áâ.à §àï¤
ld bc,#4000
xor a
sbc hl,bc
ld b,a
ex de,hl
sbc hl,bc
ex de,hl
jr c,.write_end ; § ¯¨á âì ®áâ â®ª
ld (FILE1_PARAMS.sizeLow),hl
ld (FILE1_PARAMS.sizeHigh),de
;
ld hl,page_buffer ; #C000 ®âªã¤ 
ld de,#4000 ; ᪮«ìª®
ld a,(FILE1_PARAMS.handle) ; ¤¥áªà. ä ©« 
ld c,Dss.Write ; § ¯¨áì ä ©« 
RST ToDSS
pop bc
jr c,.error
; write_ok
; [ ] Fixed 24/06/2024 ª ª®©-â® ¯¥à¥¦¨â®ª ¯à®è«®£®
;cp -1 ; § ¯¨á ­® ¬¥­ì襥 ç¨á«® ¡ ©â ?
;ld a,DSS_Error.sys.DISK_FULL
;scf
;jr nz,.error ; ¤ , ­  ¤¨áª¥ ­¥â ¬¥áâ 
;
ld a,b ; a=䨧¨ç. áâà ­¨æ 
ld c,BIOS.GetMemPageNext ; ¯®«ãç¨âì ­®¬¥à á«¥¤. 䨧. áâà ­¨æë ¡«®ª 
rst ToBIOS
ret c
cp #FF
jr nz,.loop ; ­¥ ¯®á«¥¤­ïï áâà ­¨æ 
ret
;
.write_end: pop af ; ¡ « ­á á⥪ 
ld de,(FILE1_PARAMS.sizeLow) ; ᪮«ìª®
ld a,e
or d
ret z ; 0 ¡ ©â®¢
ld hl,page_buffer ; #C000 ®âªã¤ 
ld a,(FILE1_PARAMS.handle) ; ¤¥áªà. ä ©« 
ld c,Dss.Write ; § ¯¨áì ä ©« 
RST ToDSS
ret nc
;
.error: push af
ld a,14 ; ¨­¤¥ªá "Writing error"
call print_string
pop af
ret
; „Ž‘-§ £àã§ç¨ª
code_loader: include 'dssboot.asm' ; ã­¨¢¥àá «ì­ë© § £àã§ç¨ª ¤«ï áâ à®£® ¨ ­®¢®£® ¤®á 
code_loader.size EQU $-code_loader
ASSERT SECTORS_OF_LOADER*512 >= (code_loader.size), "incorrect value of the SECTORS_OF_LOADER variable"
DISPLAY " dssboot size: ", /D,code_loader.size, " bytes. Sectors: ",/D,(code_loader.size/512 + (code_loader.size mod 512)/(code_loader.size mod 512))
; 512 ¡ ©â, ¡ãä¥à boot-ᥪâ®à 
buffer equ $
sys_disk equ buffer+512 ; ¤¨áª á¨á⥬ë
sys_path equ sys_disk+1 ; ¯ãâì á¨á⥬ë