Estex-DSS/BOOT/BOOT.ASM
Anatoliy Belyanskiy 33f7fbc6b0 ...
2023-07-15 05:04:58 +10:00

706 lines
17 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.

;!TODO ®¯à¥¤¥«¥­¨¥ ¯®¯ë⪨ ᤥ« âì § £àã§®ç­ë¬ ­¥ ¯¥à¢ë© à §¤¥«
; <20>®á«¥¤­ïï । ªæ¨ï: 25.04.2006
; <20>ணࠬ¬  § ¯¨á¨ ­  FDD/HDD boot-§ £àã§ç¨ª  ¨ ä ©«®¢ á¨á⥬ë.
;
; ‡ £à㦠¥â á¨áâ. ä ©«ë ¨§ ª®à­ï ¤¨áª , á ª®â®à®£® ¡ë« 
; § £à㦥­  á¨á⥬ .
; ”¨âç¨ ¯à®£à ¬¬ë:
; ®â«¨ç¨¥ ®â ®à¨£¨­ «ì­®£® boot-¨­áâ ««ïâ®à , íâ  ¬®¦¥â
; ¯¥à¥¯¨á뢠âì 㦥 ãáâ ­®¢«¥­­ë© boot-§ £àã§ç¨ª.
; ” ©«ë á¨á⥬ë (system.dos, system.exe) ¬®£ãâ ¨¬¥âì
; «î¡ë¥ à §¬¥àë.
; <20>ਠ§ £à㧪¥ ª®¬¯ìîâ¥à  á ¤¨áª¥âë, § ¯à è¨¢ ¥âáï ­®¢ ï
; ¤¨áª¥â  ¤«ï á®§¤ ­¨ï ¨§ ­¥¥ § £à㧮筮©.
;
;
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'
DEFINE EXEinfoMACRO 1
MACRO _mEXEinfo
BLOCK 10,' ' ; ‚ëà ¢­¨¢ ­¨¥ ¤«ï ªà á¨¢®£® ®â®¡à ¦¥­¨ï ¢ HEX
BYTE ' Bootloader '
BYTE ' installer '
BYTE ' for DSS. '
BYTE ' Vasil Ivanov, '
BYTE ' Anatoliy '
BYTE ' Belyanskiy. '
BYTE ' Sprinter Team, '
BYTE ' 2023 '
ENDM
; ¢¥àá¨ï ¯à®£à ¬¬ë
major_version equ 1 ; áâ. ­®¬¥à ¢¥àᨨ
minor_version equ 5 ; ¬«. ­®¬¥à
;;
org_addr EQU #8000 + CLP_Buffer
code_addr EQU BEGIN
program_start EQU BEGIN
stack_point EQU #C000
Loader_length EQU 0
;
page_buffer equ 0C000h ; ¡ãä¥à ä ©«®¢
;;
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,0 ; ã§­ âì ¢¥àá¨î „Ž‘
rst 10h
ex de,hl ; hl=⥪. ¢¥àá¨ï
ld de,013Ch ; 1.60 d=¢¥àá¨ï, e=¬®¤¨ä¨ª æ¨ï, bc - ­®¬¥à ᡮન. de = #013E, bc = #0064 dos ver 1.62.100
and a
sbc hl,de
jr nc,version_ok
pop hl
ld a,9 ; ¨­¤¥ªá áâப¨ "Error: Need DSS version 1.60..."
call print_string
ld a,-1
jp exit
version_ok: xor a ; ¨­¤¥ªá áâப¨ â¨â« 
call print_string
pop hl ; ª®¬-áâப 
; ¢ë¤¥«¨âì ¯ à ¬¥âà ª®¬-áâப¨
call get_drive_letter
jp c,help ; ­¥â ¯ à ¬¥â஢
ld (disk),a ; § ¤ ­­ë© ­®¬¥à ¤¨áª 
; ã§­ âì ­®¬¥à boot-¤¨áª  á¨á⥬ë
ld bc,0009h
rst 10h
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,1Dh ; ᬥ­  ª â «®£ 
rst 10h
;--------------------------------------------
; —⥭¨¥ ä ©«  system.exe
;--------------------------------------------
ld hl,name2 ; ¨¬ï ä ©« 
call read_file ; ¢áï à ¡®â  ¯® § £à㧪¥ ä ©«  ¢ áâà ­¨æë
jr nc,read_file1_ok
; ®á¢®¡. ¡«®ª ¯ ¬ïâ¨
read_file_err: ld a,(id_blck) ; ¨¤¥­â¨ä. ¡«®ª  ¯ ¬ïâ¨
ld c,3Eh
rst 10h
ld a,-1 ; ª®¤ ®è¨¡ª¨
jp exit
; á®åà. à ¡. ï祩ª¨ ä ©«  system.exe
read_file1_ok: ld hl,file_handle ; ®âªã¤ 
ld de,hFile1 ; ªã¤ 
ld bc,6
ldir
;--------------------------------------------
; —⥭¨¥ ä ©«  system.dos
;--------------------------------------------
ld hl,name1 ; ¨¬ï ä ©« 
call read_file ; ¢áï à ¡®â  ¯® § £à㧪¥ ä ©«  ¢ áâà ­¨æë
jr nc,read_file2_ok
; ®á¢®¡. ¡«®ª ¯ ¬ï⨠system.exe
file_err1: ld a,(id_mem) ; ¨¤¥­â¨ä. ¡«®ª  ¯ ¬ïâ¨
ld c,3Eh
rst 10h
jr read_file_err ; ®á¢®¡. ¡«®ª ¯ ¬ï⨠system.dos
read_file2_ok:
confirm_flag+*: 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 (lett2),a
ld a,5 ; ¨­¤¥ªá áâப¨ "Insert destination disk..."
call print_string
ld bc,3035h ; ¦¤¥¬ ­ ¦ â¨ï ª« ¢¨è¨
rst 10h
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,1Dh ; ᬥ­  ⥪. ª â «®£ 
rst 10h
;--------------------------------------------
; ‡ ¯¨á âì 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 nc,ok_write1
jr file_err1
;
ok_write1: ; ®á¢®¡®¤¨âì ¯ ¬ïâì
ld a,(id_blck) ; ¡«®ª system.dos
ld c,3Eh
rst 10h
;
; § £à. à ¡. ï祩ª¨
ld hl,hFile1 ; ®âªã¤ 
ld de,file_handle ; ªã¤ 
ld bc,6
ldir
; ‡ ¯¨áì ä ©«  system.exe
ld hl,name2 ; ¨¬ï ä ©« 
call write_file
; ®á¢®¡®¤¨âì ¯ ¬ïâì
push af
ld a,(id_blck) ; ¡«®ª system.exe
ld c,3Eh
rst 10h
pop af
jr c,exit ; ®è¨¡ª 
;
ld a,(disk) ; § ¤ ­­ë© ­®¬¥à ¤¨áª 
add a,'A'
ld (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,exit-1 ; ­¥ ¤¨áª®¢®¤ë
add a,'A'
ld (lett3),a
ld a,6 ; ¨­¤¥ªá áâப¨ "Insert system disk..."
call print_string
ld bc,3035h ; ¦¤¥¬ ­ ¦ â¨ï ª« ¢¨è¨
rst 10h
xor a ; ª®¤ "Ok"
exit: push af
call restore_path ; ¢®ááâ. ⥪. ¤¨áª ¨ ¯ãâì
port: ld a,-1 ; á®åà. ¯®àâ
out (SLOT3),a
pop af
ld c,41h ; ¢ë室 ¢ „Ž‘
ld b,a
rst 10h
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,1 ; open device
rst 18h
ret c
ld hl,close_device ; â®çª  ¢ë室 
push hl
ld a,(disk) ; § ¤ ­­ë© ­®¬¥à ¤¨áª 
ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à 
ld ix,0 ; ¬«. à §àï¤
ld de,buffer ; ªã¤ 
ld bc,0105h ; ¯à®ç¨â âì 1 ᥪâ®à (boot)
rst 18h
ret c ; ®è¨¡ª  ç⥭¨ï
ld a,(buffer+21) ; ¡ ©â ä®à¬ â 
cp 0F0h ; 1.44Mb
ret c ; ­¥§­ ª®¬ë© ä®à¬ â
jr z,write_to_floppy
cp 0F9h ; 720kB
jr z,write_to_floppy
cp 0FAh ; RAM disk
jr z,write_to_ram_disk
; pop hl ; ¢®ááâ. ¡ « ­á á⥪ 
; call close_device
cp 0F8h ; ¢¨­â
jr z,write_to_hard_disk
scf ; ­¥§­ ª®¬ë© ä®à¬ â
ret
; § ªàëâì ¤¥¢ ©á
close_device: push af ; á®åà. ä« £
ld a,(disk) ; § ¤ ­­ë© ­®¬¥à ¤¨áª 
ld c,2 ; close device
rst 18h
pop af
ret
;-------------------------------------------------
; ‡ ¯¨áì boot-§ £àã§ç¨ª  ­  ¤¨áª¥âã
;
; ¢å®¤: ¤ ­­ë¥ ¨§ buffer
; ¢ë室: CF - ¯à¨ ®è¨¡ª¥ § ¯¨á¨
;-------------------------------------------------
write_to_floppy:
ld a,(buffer+16) ; ç¨á«® ª®¯¨© FAT-®¢
or a
scf
ret z ; ®è¨¡ª 
dec a ; --ç¨á«® ª®¯¨©
jr z,overwrite_floppy ; § £àã§ç¨ª 㦥 § ¯¨á ­, ¯¥à¥§ ¯¨á âì ¥£®
; ­ áâநâì ï祩ª¨ boot-ᥪâ®à 
ld (buffer+16),a ; ç¨á«® ª®¯¨© FAT-®¢
ld hl,(buffer+14) ; § à¥§¥à¢. ᥪâ®à®¢
ld bc,(buffer+22) ; ᥪâ®à®¢ ­  FAT
ld a,b
or c
scf
ret z ; 0 ᥪâ®à®¢ ­  FAT
add hl,bc
ld (buffer+14),hl ; § à¥§¥à¢. ᥪâ®à®¢
overwrite_floppy:
; § ¯¨á âì boot-ᥪâ®à ­ § ¤
ld a,(disk) ; § ¤ ­­ë© ­®¬¥à ¤¨áª 
ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à 
ld ix,0 ; ¬«. à §àï¤
ld de,buffer ; ®âªã¤ 
ld bc,0106h ; § ¯¨á âì 1 ᥪâ®à
rst 18h
ret c ; ®è¨¡ª  § ¯¨á¨
; § ¯¨á âì § £àã§ç¨ª
ld a,(disk) ; § ¤ ­­ë© ­®¬¥à ¤¨áª 
ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à 
ld ix,1 ; ¬«. à §àï¤
ld de,code_loader ; ®âªã¤  (ª®¤ § £àã§ç¨ª )
ld bc,0306h ; § ¯¨á âì 3 ᥪâ®à  (à §¬¥à § £à.)
rst 18h
ret
;-------------------------------------------------
; ‡ ¯¨áì boot-§ £àã§ç¨ª  ­  ¤à ©¢
;
; ¢å®¤: ­¥â
; ¢ë室: CF-®è¨¡ª  § ¯¨á¨
;-------------------------------------------------
write_to_ram_disk:
write_to_hard_disk:
ld a,(disk) ; ­®¬¥à § ¤ ­­®£® ¤¨áª 
ld de,#55AA
ld bc,0 * 256 + 8
rst #18
ex af,af'
ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à 
ld ix,1 ; ¬«. à §àï¤
ld de,code_loader ; ®âªã¤  (ª®¤ § £àã§ç¨ª )
ld bc,3*256 + BIOS.DRV_WRITE ; § ¯¨á âì 3 ᥪâ®à  (à §¬¥à § £à.)
rst 08h
ret
;-------------------------------------------------
; ‚뤥«¨âì § ¤ ­­ë© ¤¨áª ¨§ ª®¬-áâப¨
;
; ¢å®¤: hl=¡ãä¥à áâப¨
; ¢ë室: a=­®¬¥à ¤¨áª 
; CF-¯à¨ ®è¨¡ª¥
;-------------------------------------------------
get_drive_letter:
inc hl ; ¡ãä¥à áâப¨
ld de,buffer ; ¡ãä¥à ¤«ï ¢ë¤¥«. ¯ à ¬¥âà 
ld c,43h ; ¢ë¤¥«¨âì ¯ à ¬¥âà ª®¬. áâப¨
rst 10h
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
res 5,a
sub 'A'
or a
ret
;
get_drive_err: scf ; ®è¨¡ª 
ret
;----------------------------------------------------
; á®åà. ⥪. á¨á⥬­ë© ¤¨áª ¨ ¯ãâì
;----------------------------------------------------
save_path: ld c,2 ; ã§­ âì ¤¨áª
rst 10h
ld (sys_disk),a
ld hl,sys_path
ld c,1Eh ; ã§­ âì ¯ãâì
rst 10h
ret
;----------------------------------------------------
; ¢®ááâ. ⥪. á¨á⥬­ë© ¤¨áª ¨ ¯ãâì
;----------------------------------------------------
restore_path: ld a,(sys_disk)
ld c,1 ; ᬥ­  ¤¨áª 
rst 10h
ld hl,sys_path
ld c,1Dh ; ᬥ­  ¯ãâ¨
rst 10h
ret
disk: db 0 ; ­®¬¥à § ¤ ­­®£® ¤¨áª 
boot_disk: db 0 ; ­®¬¥à boot-¤¨áª  á¨á⥬ë
; à ¡. ï祩ª¨ ⥪. ä ©« 
;
; ç⥭¨¥: system.exe, ¤ «¥¥ system.dos
; § ¯¨áì: system.dos, ¤ «¥¥ system.exe
file_handle: db -1 ; ¤¥áªà¨¯â®à ä ©« 
id_blck: db -1 ; ¨¤¥­â¨ä. ¢ë¤¥«. ¡«®ª  ¯ ¬ïâ¨
;
lsize: dw 0 ; ¬«.à §àï¤ à §¬¥à  ä ©« 
hsize: dw 0 ; áâ.à §àï¤
; á®åà. ¤ ­­ë¥ system.exe
hFile1: db -1 ; ¤¥áªà. ä ©« 
id_mem: db -1 ; ¨¤¥­â¨ä. ¡«®ª 
;
dw 0 ; ¬«.à §àï¤
dw 0 ; áâ.à §àï¤
;
;
;
;
;
; á®®¡é¥­¨ï
messages: db 0
db 0Dh,0Ah,"Boot and System files Installer v" ;0
db major_version + '0','.'
db (minor_version / 10) + '0',(minor_version % 10) + '0','.'
db 0Dh,0Ah,0Ah
db "Copyright (c) 2006-2022 Vasil Ivanov."
db 0Dh,0Ah,0Ah
db "Copyright (c) 2023 Sprinter Team."
db 0Dh,0Ah,0Ah,0
;
db "System successfully installed on disk " ;1
lett1: db "X:",0Dh,0Ah,0Ah,0
;
db "Installing boot loader...",0Dh,0Ah,0Ah,0 ;2
db "Writing system files...",0Dh,0Ah,0Ah,0 ;3
;
db "Syntax: SYS X:",0Dh,0Ah ;4
db " where X: - drive letter (A..Z)",0Dh,0Ah,0Ah,0
;
db "Insert destination disk in drive " ;5
lett2: db "X:",0Dh,0Ah
db "and strike any key when ready ...",0Dh,0Ah,0Ah,0
;
db "Insert system disk in drive " ;6
lett3: db "X:",0Dh,0Ah
db "and strike any key when ready ...",0Dh,0Ah,0Ah,0
;
db "Can't install boot on this disk",0Dh,0Ah,0Ah,0 ;7
db "Invalid drive specification",0Dh,0Ah,0Ah,0 ;8
db " Error: Can't open file",0Dh,0Ah,0Ah,0 ;9
db " Error: Can't allocate memory",0Dh,0Ah,0Ah,0 ;10
db " Error: Need DOS version 1.60 or higher",0Dh,0Ah,0Ah,0;11
db " Error: Reading error",0Dh,0Ah,0Ah,0 ;12
db " Error: Can't create file",0Dh,0Ah,0Ah,0 ;13
db " Error: Writing error",0Dh,0Ah,0Ah,0 ;14
endmess: db 0
; ‚뢥á⨠áâப㠯® ¨­¤¥ªáã
; ¢å®¤: a=¨­¤¥ªá áâப¨
print_string: call get_string ; ¯®¨áª áâப¨ ¯® ¥¥ ¨­¤¥ªáã ¢ 'a'
ld c,5Ch ; ¢ë¢®¤ áâப¨
rst 10h
ret
; ¯®¨áª áâப¨ ¯® ¥¥ ¨­¤¥ªáã ¢ 'a'
get_string: ld hl,messages ; ᯨ᮪ ¬¥áá £ ¤«ï ¨­¤¥ªá. ¤®áâ㯠
ld bc,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,1 ; ­  ç⥭¨¥
ld c,11h ; ®âªàëâì ä ©«
rst 10h
jr nc,ok ; ¡¥§ ®è¨¡®ª
ld a,9 ; ¨­¤¥ªá "Can't open file"
call print_string
scf
ret
ok: ld (file_handle),a ; ¤¥áªà. ä ©« 
ld hl,0
ld ix,0
ld bc,0215h ; 㪠§ â¥«ì ­  ª®­¥æ ä ©« 
rst 10h
ld (hsize),hl ; áâ.à §àï¤ à §¬¥à  ä ©« 
ld (lsize),ix ; ¬«.à §àï¤
call get_memory ; à áç. ¨ ¢ë¤¥«. áâà ­¨æë ¯®¤ ä ©«
jr c,not_enough ; ­¥ 墠⠥⠯ ¬ïâ¨
call file_to_bank ; § £à. ä ©« ¢ áâà ­¨æë
close_file: ld a,(file_handle) ; ¤¥áªà. ä ©« 
ld c,12h ; § ªàëâì ä ©«
rst 10h
ret
;
not_enough: call close_file
ld a,10 ; ¨­¤¥ªá "Can't allocate memory"
call print_string
scf
ret
;----------------------------------------------------
; <20>® à §¬¥àã ä ©«  à ááç¨â âì ­¥®¡å®¤¨¬®¥
; ç¨á«® áâà ­¨æ ¨ ¢ë¤¥«¨âì ¨å.
; ‚ë室: CF - ¯à¨ ­¥å¢ âª¥ ¯ ¬ïâ¨
;----------------------------------------------------
get_memory: ld hl,(hsize) ; áâ.à §àï¤ à §¬¥à  ä ©« 
ld bc,(lsize) ; ¬«.à §àï¤
ld de,4000h ; ¤¥«¨â¥«ì (à §¬¥à áâà ­¨æë)
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
inc bc
xor a
cp b
scf
ret nz
; ¢ë¤¥«¨âì ¡«®ª ¯ ¬ïâ¨
ld b,c ; b=ç¨á«® áâà ­¨æ
ld c,3Dh
rst 10h
ld (id_blck),a ; ¨¤¥­â¨ä. ¡«®ª 
ret
;----------------------------------------------------
; ‡ £à㧨âì ä ©« ¢ áâà ­¨æë
;----------------------------------------------------
file_to_bank: ld hl,0
ld ix,0
ld a,(file_handle) ; ¤¥áªà. ä ©« 
ld bc,0015h ; 㪠§ â¥«ì ­  ­ ç «® ä ©« 
rst 10h
ld a,(id_blck) ; ¨¤¥­â¨ä. ¡«®ª  ¯ ¬ïâ¨
ld b,0 ; «®£. ­®¬¥à áâà ­¨æë ¢ ¡«®ª¥
ld c,0C4h ; ¯®«ãç¨âì 䨧. ­®¬¥à áâà ­¨æë ¢ ¡«®ª¥
rst 08h
ret c
loop_to_bank: push af
out (SLOT3),a
ld hl,page_buffer ; #C000 ªã¤ 
ld de,4000h ; ᪮«ìª®
ld a,(file_handle) ; ¤¥áªà. ä ©« 
ld c,13h ; ç¨â âì ä ©«
rst 10h
pop bc
jr nc,ok_to_bank
ld a,12 ; ¨­¤¥ªá "Reading error"
call print_string
scf
ret
;
ok_to_bank: cp -1 ; ¯à®ç¨â ­® ¬¥­ì襥 ç¨á«® ¡ ©â ?
ret z ; ¤ 
ld a,b ; a=䨧¨ç. áâà ­¨æ 
ld c,0C7h ; ¯®«ãç¨âì ­®¬¥à á«¥¤. 䨧. áâà ­¨æë ¡«®ª 
rst 08h
ret c
cp 255
jr nz,loop_to_bank ; ­¥ ¯®á«¥¤­ïï áâà ­¨æ 
ret
;====================================================
; ‡ ¯¨áì ä ©«  ­  ¤¨áª
; ¢å®¤: hl=¨¬ï ä ©« 
; ¢ë室: CF-¯à¨ ®è¨¡ª¥
;====================================================
write_file: ld a,20h ;  âਡãâ " à娢­ë©"
ld c,0Ah ; á®§¤ âì ä ©«
rst 10h
jr nc,create_ok ; ¡¥§ ®è¨¡®ª
ld a,13 ; ¨­¤¥ªá "Can't create file"
call print_string
scf
ret
;
create_ok: ld (file_handle),a ; ¤¥áªà. ä ©« 
ld hl,close_file ; § ªà. ä ©«
push hl ; â®çª  ¢ë室 
;
; ç⥭¨¥ ä ©«  ¨§ ¡ ­®ª ¨ § ¯¨áì ­  ¤¨áª
ld a,(id_blck) ; ¨¤¥­â¨ä. ¡«®ª  ¯ ¬ïâ¨
ld b,0 ; «®£. ­®¬¥à áâà ­¨æë ¢ ¡«®ª¥
ld c,0C4h ; ¯®«ãç¨âì 䨧. ­®¬¥à áâà ­¨æë ¢ ¡«®ª¥
rst 08h
ret c
write_loop: push af
out (SLOT3),a
ld hl,(lsize) ; ¬«.à §àï¤ à §¬¥à  ä ©« 
ld de,(hsize) ; áâ.à §àï¤
ld bc,4000h
xor a
sbc hl,bc
ld b,a
ex de,hl
sbc hl,bc
ex de,hl
jr c,write_end ; § ¯¨á âì ®áâ â®ª
ld (lsize),hl
ld (hsize),de
;
ld hl,page_buffer ; #C000 ®âªã¤ 
ld de,4000h ; ᪮«ìª®
ld a,(file_handle) ; ¤¥áªà. ä ©« 
ld c,14h ; § ¯¨áì ä ©« 
rst 10h
pop bc
jr nc,write_ok
ld a,14 ; ¨­¤¥ªá "Writing error"
call print_string
scf
ret
;
write_ok: cp -1 ; § ¯¨á ­® ¬¥­ì襥 ç¨á«® ¡ ©â ?
scf
ret z ; ¤ , ­  ¤¨áª¥ ­¥â ¬¥áâ 
ld a,b ; a=䨧¨ç. áâà ­¨æ 
ld c,0C7h ; ¯®«ãç¨âì ­®¬¥à á«¥¤. 䨧. áâà ­¨æë ¡«®ª 
rst 08h
ret c
cp 255
jr nz,write_loop ; ­¥ ¯®á«¥¤­ïï áâà ­¨æ 
ret
;
write_end: pop af ; ¡ « ­á á⥪ 
ld de,(lsize) ; ᪮«ìª®
ld a,e
or d
ret z ; 0 ¡ ©â®¢
ld hl,page_buffer ; #C000 ®âªã¤ 
ld a,(file_handle) ; ¤¥áªà. ä ©« 
ld c,14h ; § ¯¨áì ä ©« 
rst 10h
ret
; „Ž‘-§ £àã§ç¨ª
code_loader: include 'dssboot.asm' ; ã­¨¢¥àá «ì­ë© § £àã§ç¨ª ¤«ï áâ à®£® ¨ ­®¢®£® ¤®á 
code_loader.size EQU $-code_loader
DISPLAY " dssboot size: ", /D,code_loader.size, " bytes. Sectors: ",code_loader.size/512
; 512 ¡ ©â, ¡ãä¥à boot-ᥪâ®à 
buffer equ $
sys_disk equ buffer+513 ; ¤¨áª á¨á⥬ë
sys_path equ sys_disk+1 ; ¯ãâì á¨á⥬ë