mirror of
https://github.com/Tolik-Trek/Estex-DSS.git
synced 2026-06-15 17:31:47 +03:00
706 lines
17 KiB
NASM
706 lines
17 KiB
NASM
;!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 ; ¯ãâì á¨á⥬ë
|
||
|