mirror of
https://github.com/Tolik-Trek/Estex-DSS.git
synced 2026-06-15 01:11:48 +03:00
879 lines
23 KiB
NASM
879 lines
23 KiB
NASM
////////////////////////////////////////////////////////////////////////
|
||
; CHANGELOG
|
||
; [ ] - ®¯à¥¤¥«¥¨¥ ¯®¯ë⪨ ᤥ« âì § £àã§®çë¬ ¥ ¯¥à¢ë© à §¤¥«
|
||
////////////////////////////////////////////////////////////////////////
|
||
|
||
|
||
; <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
|
||
|
||
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'
|
||
|
||
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 0 ; ¬«. ®¬¥à
|
||
;;
|
||
SECTORS_OF_LOADER EQU 4
|
||
|
||
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: 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
|
||
;[ ] 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
|
||
;[ ] 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
|
||
; pop hl ; ¢®ááâ. ¡ « á á⥪
|
||
; call close_device
|
||
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
|
||
; ld a,b
|
||
; or c
|
||
; scf
|
||
; ret z ; 0 ᥪâ®à®¢ FAT
|
||
; ;
|
||
add hl,bc
|
||
ld (buffer + BOOT_SECTOR.RESERVED_SECTORS),hl ; § १¥à¢. ᥪâ®à®¢
|
||
dec hl
|
||
ld de,SECTORS_OF_LOADER
|
||
and a
|
||
sbc hl,de
|
||
ret c
|
||
overwrite_floppy:
|
||
; § ¯¨á âì 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*256 + Dss.DRV.Write ; § ¯¨á âì 3 ᥪâ®à (à §¬¥à § £à.)
|
||
rst ToDSS.DRV
|
||
ret
|
||
|
||
|
||
;-------------------------------------------------
|
||
; ‡ ¯¨áì boot-§ £àã§ç¨ª ¤à ©¢
|
||
;
|
||
; ¢å®¤: ¥â
|
||
; ¢ë室: CF-®è¨¡ª § ¯¨á¨
|
||
;-------------------------------------------------
|
||
write_to_ram_disk:
|
||
write_to_: ld a,(disk) ; ®¬¥à § ¤ ®£® ¤¨áª
|
||
ld de,#55AA
|
||
ld bc,Dss.DRV.GenIOCTL.GetParams
|
||
rst ToDSS.DRV
|
||
ex af,af'
|
||
;[ ] 17.12.2023 § £à㧪 á ªâ¨¢®£® à §¤¥« , ¥ á ¯¥à¢®£®
|
||
ld b,a
|
||
inc c
|
||
scf
|
||
ret z ; !TODO § £à㧪 á à áè¨à¥®£® à §¤¥« ¥ ¯®¤¤¥à¦¨¢ ¥âáï
|
||
dec c
|
||
CP #80 ;!HARDCODE ⨯ ¤à ©¢ - HDD
|
||
JR NC,.skip_FAT_check
|
||
push bc ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR
|
||
; [x] 02/02/2024 ¯à®¢¥àª ¢«¥§ ¥¬®áâì § £àã§ç¨ª (ç⮡ ¥ ¯®¯®àâ¨âì ä â)
|
||
LD HL,0
|
||
LD IX,0
|
||
LD DE,buffer
|
||
LD BC,1*256 + BIOS.DRV_READ
|
||
RST ToBIOS
|
||
POP BC
|
||
LD HL,(buffer + _sBOOT_SECTOR_PARAMS.RESERVED_SECTORS)
|
||
LD DE,SECTORS_OF_LOADER + 1 ; ¬¨¨¬ «ì®¥ à ááâ®ï¨¥ ¤à ©¢¥ ®â ã«¥¢®£® ᥪâ®à ¤® ä â (¤«¨ § £àã§ç¨ª + 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*256 + BIOS.DRV_WRITE ; § ¯¨á âì 3 ᥪâ®à (à §¬¥à § £à.)
|
||
rst ToBIOS
|
||
;[ ] 17.12.2023 § £à㧪 á ªâ¨¢®£® à §¤¥« , ¥ á ¯¥à¢®£®
|
||
pop bc
|
||
;
|
||
ret
|
||
write_to_hard_disk:
|
||
;[x] 17.12.2023 § £à㧪 á ªâ¨¢®£® à §¤¥« , ¥ á ¯¥à¢®£®
|
||
CALL write_to_
|
||
RET C
|
||
; ¯à®¢¥àª <20>€Œ-¤¨áª
|
||
LD A,B
|
||
CP #80-1 ;!HARDCODE HDD number
|
||
CCF
|
||
RET NC
|
||
;
|
||
PUSH BC ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR
|
||
LD HL,0
|
||
LD IX,0
|
||
LD DE,buffer
|
||
LD BC,1*256 + BIOS.DRV_READ
|
||
RST ToBIOS
|
||
; check signature
|
||
LD HL,(buffer + _sBOOT_SECTOR.MBR_SIGNATURE)
|
||
LD DE,#AA55
|
||
AND A
|
||
SBC HL,DE
|
||
POP BC ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR
|
||
SCF
|
||
RET NZ
|
||
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
|
||
;!FIXIT fat32 not supported
|
||
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
|
||
; save buffer to disk
|
||
POP BC ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR
|
||
ld a,b
|
||
ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à
|
||
ld ix,0 ; ¬«. à §àï¤
|
||
ld de,buffer ; ®âªã¤ (ª®¤ § £àã§ç¨ª )
|
||
ld bc,1*256 + BIOS.DRV_WRITE ; § ¯¨á âì 1 ᥪâ®à
|
||
RST ToBIOS
|
||
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\n\nCopyright (c) 2006 Vasil Ivanov."
|
||
db "\r\n\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: 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
|
||
|
||
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 ; ¯ãâì á¨á⥬ë
|
||
|