Release DSS v1.71.57, Shell v1.2.522

This commit is contained in:
Tolik 2025-06-25 23:27:23 +10:00
commit 607856305f
137 changed files with 26064 additions and 16405 deletions

View File

@ -1,706 +0,0 @@
; <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 ; ¯ãâì á¨á⥬ë

View File

@ -1,155 +0,0 @@
;[BEGIN]
;
; BOOTNAME.EXE
;
MODULE BOOTname
ORG #8100-512
INCLUDE "dss.inc"
DB "EXE" ;EXE ID
DB #00 ;EXE VERSION
DW #0200 ;CODE OFFSET LOW
DW #0000 ;CODE OFFSET HIGH
DW #0000 ;END-BEG ;PRIMARY LOADER
DW #0000 ;
DW #0000 ;RESERVED
DW #0000 ;
DW #8100 ;LOAD ADDRESS
DW #8100 ;START ADDRESS
DW #BFFF ;STACK ADDRESS
DS 490
START
LD BC,0*256+DSS_BOOTDSK
LD C,2 ;curdisk
RST #10
JR C,NERR
ADD A,"A" ;correct to the human format
LD (BOOTDRIVE),A
LD HL,BOOTSTRING
LD BC,2*256+DSS_ENVIRON
RST #10
NERR CALL C,ERROR
LD C,DSS_EXIT
RST #10
RET
BOOTSTRING DB "BOOTDISK="
BOOTDRIVE DB "C:",0
CRLF LD A,#0D
LD C,DSS_PUTCHAR
RST #10
LD A,#0A
LD C,DSS_PUTCHAR
RST #10
RET
ERROR LD E,A
LD D,0
JP ERR_MSG
ERR_MSG CALL FMESAGE
CALL PRINTZ
CALL CRLF
CALL CRLF
RET
FMESAGE INC DE
LD HL,ERR0
LD BC,ERR1-ERR0
LCPIR XOR A
CPIR
RET PO
RET NZ
DEC DE
LD A,D
OR E
JP NZ,LCPIR
RET
PUTPRM LD BC,15
PUTPRMA LD A,(HL)
LDI
RET PO
OR A
JR NZ,PUTPRMA
RET
PRINTZ LD A,(HL)
INC HL
OR A
RET Z
CP "%"
JR NZ,PRINTZ2
LD A,(HL)
INC HL
SUB "1"
PUSH HL
LD L,A
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD BC,PRM1
ADD HL,BC
LD C,DSS_PCHARS
RST #10
POP HL
JR PRINTZ
PRINTZ2 LD C,DSS_PUTCHAR
RST #10
JP PRINTZ
PRM1 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PRM2 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PRM3 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PRM4 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PRM5 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PRM6 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PRM7 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PRM8 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PRM9 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
ERR0 DB #00
DB "Bad command or file name",0
DB "Invalid function",0
DB "Invalid drive number",0
DB "File not found",0
DB "Path not found",0
DB "Invalid handle",0
DB "Extended error 6",0
DB "File exist",0
DB "File read only",0
DB "Root overflow",0
DB "No free space",0
DB "Directory not empty",0
DB "Can't delete current directory",0
DB "Invalid media",0
DB "Unknown operation",0
DB "Directory exist",0
DB "Invalid filename",0
DB "Invalid EXE-file",0
DB "Not supported EXE-file",0
DB "Access denied",0
DB "Not ready",0
DB "Seek error",0
DB "Sector not found",0
DB "CRC error",0
DB "Write protect",0
DB "Read error",0
DB "Write error",0
DB "Drive failure",0
DB "Extended error 28",0
DB "Extended error 29",0
DB "No free memory",0
DB "Invalid memory block",0
DB "Extended error 32",0
DB "Extended error 33",0
DB "Extended error 34",0
DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
ERR1
;
ENDMODULE
;

File diff suppressed because it is too large Load Diff

989
BOOT/boot.asm Normal file
View File

@ -0,0 +1,989 @@
////////////////////////////////////////////////////////////////////////
; 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
IF EXEinfoMACRO
BLOCK 10,' ' ; ‚ëà ¢­¨¢ ­¨¥ ¤«ï ªà á¨¢®£® ®â®¡à ¦¥­¨ï ¢ HEX
BYTE ' Bootloader '
BYTE ' installer '
BYTE ' for DSS. '
BYTE ' Vasil Ivanov, '
BYTE ' Anatoliy '
BYTE ' Belyanskiy. '
BYTE ' Sprinter Team, '
BYTE ' 2025 '
ENDIF
ENDM
; ¢¥àá¨ï ¯à®£à ¬¬ë
major_version equ 3 ; áâ. ­®¬¥à ¢¥àᨨ
minor_version equ 0 ; ¬«. ­®¬¥à
;;
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),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,DSS_Error.sys.COMMON_ERROR
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: pop hl ; ª®¬-áâப 
; ¢ë¤¥«¨âì ¯ à ¬¥âà ª®¬-áâப¨
call get_drive_letter
push af
xor a ; ¨­¤¥ªá áâப¨ â¨â« 
call print_string
pop af
jp c,help ; ­¥â ¯ à ¬¥â஢
ld (disk),a ; § ¤ ­­ë© ­®¬¥à ¤¨áª 
; ã§­ âì ­®¬¥à boot-¤¨áª  á¨á⥬ë
ld bc,Dss.BootDSK.Get
RST ToDSS
ld (boot_disk),a ; ¤¨áª (A=0,B=1,..)
; ¯à®¢¥à¨âì ­  ᮢ¯ ¤¥­¨¥ ¤¨áª®¢
same_fdd: ld hl,disk
cp (hl)
jr nz,.next
ld hl,read_sys_files.swap_flag
.flag+1: ld (hl),0 ; ãáâ. ä« £
;
; —⥭¨¥ ¢ ¡ ­ª¨ ä ©«®¢ á¨á⥬ë
;
.next: ld a,(boot_disk) ; ¤¨áª § £à㧪¨ Ž‘
ld hl,root_path ; "X:\" ª®à¥­ì ¤¨áª 
add a,'A'
ld (hl),a
ld c,Dss.ChDir ; ᬥ­  ª â «®£ 
RST ToDSS
;--------------------------------------------
; —⥭¨¥ ä ©«  system.exe
;--------------------------------------------
read_sys_files: ;
.noFiles+1: ld a,0
or a
jr nz,.write_boot
;
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
.swap_flag+1: ld a,1
or a
jr nz,.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,(disk) ; 楫¥¢®© ¤¨áª
ld hl,root_path ; "X:\" áâப  ¯ãâ¨
add a,'A'
ld (hl),a
ld c,Dss.ChDir ; ᬥ­  ⥪. ª â «®£ 
RST ToDSS
;--------------------------------------------
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 ; ®è¨¡ª 
;
; ‡ ¯¨á âì boot-§ £àã§ç¨ª
.write_boot: ld a,2 ; ¨­¤¥ªá áâப¨ "Installing boot loader..."
call print_string
call write_boot_loader
jr c,write_error ; ®è¨¡ª  à ¡®âë á ¤¥¢ ©á®¬
;
ld a,(disk) ; § ¤ ­­ë© ­®¬¥à ¤¨áª 
add a,'A'
ld (messages.lett1),a
ld a,1 ; ¨­¤¥ªá áâப¨ "System installed on disk "
call print_string
;
ld a,(read_sys_files.swap_flag)
or a
jr nz,.not_fdd
; § ¯à®á¨âì á¨á⥬­ë© ¤¨áª
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+1: 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,DSS_Error.sys.COMMON_ERROR
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:
CALL SETUP_ZERO_SECTOR
;; ¯¥à¥ª¨¤ë¢ ­¨¥ ç á⨠§ £àã§ç¨ª  ¢ 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
.no_push: CALL SETUP_ZERO_SECTOR
;; ¯¥à¥ª¨¤ë¢ ­¨¥ ç á⨠§ £àã§ç¨ª  ¢ 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
;; § é¨â  ®â ¡ ª« ­¨§¬  (§ £à㧪  á í⮣® ¤¨áª  ­  PC ¯à¨¢¥¤¥â ª § ¢¨á ­¨î. JMP $)
;LD HL,#FEEB ; opcode jmp $
;LD (buffer),HL
; § ¯¨áì ¢ 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
SETUP_ZERO_SECTOR:
; ¯¥à¥ª¨¤ë¢ ­¨¥ ç á⨠§ £àã§ç¨ª  ¢ 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
; § é¨â  ®â ¡ ª« ­¨§¬  (§ £à㧪  á í⮣® ¤¨áª  ­  PC ¯à¨¢¥¤¥â ª § ¢¨á ­¨î. JMP $)
LD HL,#FEEB ; opcode jmp $
LD (buffer),HL
RET
;-------------------------------------------------
; ‚뤥«¨âì § ¤ ­­ë© ¤¨áª ¨§ ª®¬-áâப¨
;
; ¢å®¤: hl=¡ãä¥à áâப¨
; ¢ë室: a=­®¬¥à ¤¨áª 
; CF-¯à¨ ®è¨¡ª¥
;-------------------------------------------------
get_drive_letter:
; § ç¨á⪠ ¡ãä¥à 
xor a
ld (buffer+1),a
;
inc hl ; ¡ãä¥à áâப¨
ld de,buffer ; ¡ãä¥à ¤«ï ¢ë¤¥«. ¯ à ¬¥âà 
ld c,Dss.GSwitch ; ¢ë¤¥«¨âì ¯ à ¬¥âà ª®¬. áâப¨
RST ToDSS
;
;rra
rl b ; ¯à¨§­ ª ª®­æ  ¯ à ¬¥â஢
;
ld de,buffer
ld a,(de)
inc de
ld c,a ; á®åà. 'a'
ld a,(de)
cp ':'
jr nz,.get_drive_err ; ¤¨áª ­¥ § ¤ ­
inc de
ld a,(de)
or a
jr nz,.get_drive_err ; ­¥¯à ¢¨«ì­ë¥ ¯ à ¬¥âàë
;
rr b ; ¯à¨§­ ª ª®­æ  ¯ à ¬¥â஢
jr c,.checkChar
;
push bc
ld de,buffer ; ¡ãä¥à ¤«ï ¢ë¤¥«. ¯ à ¬¥âà 
ld c,Dss.GSwitch ; ¢ë¤¥«¨âì ¯ à ¬¥âà ª®¬. áâப¨
RST ToDSS
pop bc
jr nc,.get_drive_err ; ­¥¯à ¢¨«ì­ë¥ ¯ à ¬¥âàë
;
ld de,buffer ; ¡ãä¥à ¤«ï ¢ë¤¥«. ¯ à ¬¥âà 
ld a,(de)
cp "0"
ret c ; ­¥¯à ¢¨«ì­ë¥ ¯ à ¬¥âàë
cp "4"
jr nc,.get_drive_err ; ­¥¯à ¢¨«ì­ë¥ ¯ à ¬¥âàë
;
ld b,a
inc de
ld a,(de)
or a
jr nz,.get_drive_err ; ­¥¯à ¢¨«ì­ë¥ ¯ à ¬¥âàë
;
ld a,b
;0 - standart
;1 - silent
;2 - no_files
;3 - no_files+silent
sub "0"
jr z,.checkChar
rra
ld (read_sys_files.noFiles),a
ld (same_fdd.flag),a
rla
and 1
ld (print_string.silentMode),a
; ¯à®¢¥à塞 ¡ãª¢ã
.checkChar: ld a,c ; ¢®ááâ. 'a'
and %1101'1111
cp 'A'
ret c ; ®è¨¡ª 
cp 'Z'+1
jr nc,.get_drive_err
sub '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) 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'
.silentMode+1: ld a,0
or a
ret nz
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 ; ¯ãâì á¨á⥬ë

File diff suppressed because it is too large Load Diff

View File

@ -1,71 +0,0 @@
/*
VERSION EQU #00
CHDISK EQU #01
CURDISK EQU #02
DSKINFO EQU #03
G_ENTRY EQU #04
BOOTDSK EQU #09
CREATE EQU #0A
CREAT_N EQU #0B
ERASE EQU #0D
DELETE EQU #0E
MOVE EQU #0F
RENAME EQU #10
OPEN EQU #11
CLOSE EQU #12
READ EQU #13
WRITE EQU #14
MOVE_FP EQU #15
ATTRIB EQU #16
GET_D_T EQU #17
PUT_D_T EQU #18
F_FIRST EQU #19
F_NEXT EQU #1A
MKDIR EQU #1B
RMDIR EQU #1C
CHDIR EQU #1D
CURDIR EQU #1E
SYSTIME EQU #21
SETTIME EQU #22
WAITKEY EQU #30
SCANKEY EQU #31
ECHOKEY EQU #32
CTRLKEY EQU #33
EDIT EQU #34
K_CLEAR EQU #35
SETWIN EQU #38
SETWIN1 EQU #39
SETWIN2 EQU #3A
SETWIN3 EQU #3B
FREEMEM EQU #3C
GETMEM EQU #3D
RETMEM EQU #3E
SETMEM EQU #3F
EXEC EQU #40
EXIT EQU #41
WAIT EQU #42
GSWITCH EQU #43
DOSNAME EQU #44
SETVMOD EQU #50
GETVMOD EQU #51
LOCATE EQU #52
CURSOR EQU #53
SELPAGE EQU #54
SCROLL EQU #55
CLEAR EQU #56
RDCHAR EQU #57
WRCHAR EQU #58
WINCOPY EQU #59
WINREST EQU #5A
PUTCHAR EQU #5B
PCHARS EQU #5C
RES_PRN EQU #5D
CTRLPRN EQU #5E
PRINT EQU #5F
*/

View File

@ -1,66 +0,0 @@
No free file handles
Bad Command or file name
Access denied
Memory allocation error
Cannot load COMMAND, system halted
Cannot start COMMAND, exiting
Top level process aborted, cannot continue
Write protect error
Invalid unit
Not ready
Invalid device request
Data error
Invalid device request parameters
Seek error
Invalid media type
Sector not found
Printer out of paper error
Write fault error
Read fault error
General failure
Sharing violation
Lock violation
Invalid disk change
FCB unavailable
System resource exhausted
Code page mismatch
Out of input
Insufficient disk space
Too many parameters
Required parameter missing
Invalid switch
Invalid keyword
Parameter value not inallowed range
Parameter value not allowed
Parameter value not allowed
Parameter format not correct
Invalid parameter
Invalid parameter combination
Invalid function
File not found
Path not found
Too many open files
Access denied
Invalid handle
Memory control blocks destroyed
Insufficient memory
Invalid memory block address
Invalid Environment
Invalid format
Invalid function parameter
Invalid data
Invalid drive specification
Attempt to remove current directory
Not same device
No more files
File exists
Cannot make directory entry
Fail on INT 24
Too many redirections
Duplicate redirection
Invalid password
Invalid parameter
Network data fault
Function not supported by network
Required system component not installed

View File

@ -1,4 +0,0 @@
21-02-2003 FIX BUG WITH LINE MERGE IN BAT-FILE
14-12-2002 ADD BAT-PARAMETERS %1 %2
11-12-2002 ADD BAT-VARIABLES %VAR%
03-10-2002 FIX BUG WITH OUTPUT AT THE SCREEN IN BAT-MODE

File diff suppressed because it is too large Load Diff

211
DSS/API.asm Normal file
View File

@ -0,0 +1,211 @@
;[BEGIN]
;//MODULE: DOS_X
;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
;//UPDATE: 24-10-1999 DNS Restore module
;---------------------------------------------------------------
;Rev Date Name Description
;---------------------------------------------------------------
;R011 17-04-2023 BAO ‚६¥­­ë© ª®áâë«ì ¤«ï ­¥¤®¯ã᪠­¨ï ¯¥à¥¯®«­¥­¨ï ¡ãä¥à  ¯ã⨠ª â «®£ 
;R010 15-04-2023 BAO FIXED BUG WITH CHANGE DISK WITHOUT CHANGE PATH
;R009 13-04-2023 BAO FIX BUG WITH PARSING DIRECTORY BUFFER
;R13 06-04-2023 BAO ”ã­ªæ¨î SETBOOT ¬®¦­® ¢ë§¢ âì ⮫쪮 à § (¥á«¨ § ¢¥àè¨âáï ª®à४⭮)
;R12 03-04-2023 BAO „®¡ ¢«¥­  äã­ªæ¨ï à¥áª ­  ¤à ©¢®¢ LD C,8 : RST #10
;R008 15-04-2003 DNS SAVE AND RESTORE CUR-PATH MACROS
;R11 15-04-2003 DNS ROUTINE FOR STORE CURDISK AND CURDIR
;R10 03-04-2003 DNS IMPROVED FN. VERSION
;R09 27-03-2003 DNS PASTED SET/GET BOOT FN.
;R007 06-02-2003 DNS FIX BUG IN MASK ROUTINE, IT ALLOW NAMES WHICH BEGAN FROM "." ".NAM"
;R006 29-01-2003 DNS FIX BUG WITH SET FILE DATE AND TIME
;R005 26-11-2002 DNS FIX ERROR IN CHDIR, DON'T ALLOWED "." FOR ROOT
;R004 19-11-2002 DNS DON'T ALLOW DIR & LABEL ATTR FOR FILES
;R003 19-11-2002 DNS ADD RESET OF VOLUME LABEL ATTRIBUT
;R002 19-11-2002 DNS FIX GET/SET ATTRIBUTES
;R101 07-11-2002 DNS FIX BUG WITH SCROLLUP FN. (A=0)
;R102 07-11-2002 DNS CORRECT FN. WINCOPY & WINREST, ADD "DI+EI"
;R001 16-12-1999 DNS Y2K fix
;R06 21-11-1999 DNS FN. DISKINF SUPPORT ALL DISKS
;R05 21-11-1999 DNS BUG FIX SIGNATURE #55AA IN BOOT SECTOR
;R04 08-11-1999 DNS KILL OLD FUNCTIONS
;R03 23-11-1998 DNS BUG FIX (IX+28) -> (IY+28)
;R02 21-11-1998 DNS CHANGE FUNCTION "MAKE FAT"
;R01 20-11-1998 DNS REPAIR FUNCTION "SAVE"
;
;---------------------------------------------------------------
; VIDEO
include 'API/Clear.asm'
include 'API/PChars.asm'
include 'API/PutChar.asm'
include 'API/Locate.asm'
include 'API/Cursor.asm'
include 'API/RdChar.asm'
include 'API/WrChar.asm'
include 'API/WinCopy.asm'
include 'API/WinRest.asm'
include 'API/Scroll.asm'
include 'API/SelPage.asm'
include 'API/GetVMod.asm'
include 'API/SetVMod.asm'
;
include 'API/Version.asm'
include 'API/bootDsk.asm'
include 'API/curDisk.asm'
include 'API/diskINF.asm'
include 'API/ScanDRV.asm'
include 'API/Attribute.asm'
include 'API/Create.asm'
include 'API/Delete.asm'
include 'API/Rename.asm'
include 'API/Open.asm'
include 'API/Close.asm'
include 'API/Find.asm'
include 'API/ChDisk.asm'
include 'API/CurrDir.asm'
include 'API/Time.asm'
include 'API/GetDateTime.asm'
include 'API/SetDateTime.asm'
include 'API/ChDir.asm'
include 'API/MkDir.asm'
include 'API/RmDir.asm'
include 'API/DosName.asm'
include 'API/Read.asm'
include 'API/Write.asm'
include 'API/FreeMem.asm'
include 'API/GetMem.asm'
include 'API/RetMem.asm'
include 'API/SetMem.asm'
include 'API/SetWin.asm'
include 'API/AppInfo.asm'
include 'API/Ex_Path.asm'
include 'API/GSwitch.asm'
include 'API/Environ.ASM'
include 'API/Lib_Sub.asm'
include "API/EXECUTE.ASM"
include "API/Print.asm"
include "API/Move_FP.asm"
;R09
;„ã¡«ì - CHDISK = OPENDSK
;CHDISK:
; PUSH AF
; LD C,Dss.DRV.Open
; RST ToDSS.DRV
; POP BC
; JP C,NDISK11
; LD A,B
; LD (CORE_BUFFERS.FS_Buffer.DRIVE),A
; CALL RD_BPB
; RET C
; LD A,(LDRIVE)
; AND A
; RET
;NDISK11:
; CP DSS_Error.sys.INVALID_DRIVE
; SCF
; RET Z
; LD A,DSS_Error.sys.NOT_READY
; RET
;
;R04
;SIZE2CL: LD DE,(B_P_C)
; XOR A
; SCF
;S2C01: RR D
; RR E
; JR C,S2C02
; RR H
; RR L
; RR B
; RR C
; JP NC,S2C01
; LD A,1
; JP S2C01
;S2C02: OR A
; RET Z
; INC BC
; RET
;L_SEC_X: DW 0
;H_SEC_X: DW 0
;
;GOD EQU 1999-1980*512
;FHAND DB " "
; DB " "
; DB #20
; DW 0,0,0,0,0
; DW #0000
; DW 5*32+19+GOD
;SAVEC DW #0000
;SIZEC DW #0000,#0000
;=============================================
;//MODULE: DOS_X
;[END]
;R11
; IF SAVE_PATH_MACRO
; SAVE_CUR_PATH
; PUSH IX
; PUSH IY
; PUSH HL
; PUSH DE
; PUSH BC
; PUSH AF
;
; SET_PAGE_X ENVPAGE
; PUSH AF
;
; CALL CURRDSK
; ADD A,"A"
; LD HL,TMP_CURDIR_AUTO
; LD (HL),A
; INC HL
; LD A,":"
; LD (HL),A
; INC HL
; CALL CURRDIR_FN
;
; POP AF
; OUT (SLOT3),A
;
; POP AF
; POP BC
; POP DE
; POP HL
; POP IY
; POP IX
; RET
;
; BACK_CUR_PATH:
; RET NC
; .force: PUSH IY
; PUSH IX
; PUSH HL
; PUSH DE
; PUSH BC
; PUSH AF
;
; SET_PAGE_X ENVPAGE
; PUSH AF
;
; LD HL,TMP_CURDIR_AUTO
; CALL CHDIR
;
; POP AF
; OUT (SLOT3),A
;
; POP AF
; POP BC
; POP DE
; POP HL
; POP IX
; POP IY
; RET
; ENDIF
;

101
DSS/API/AppInfo.asm Normal file
View File

@ -0,0 +1,101 @@
;---------------------------------------------------------------
;Rev Date Name Description
;---------------------------------------------------------------
;R10 13-04-2023 BAO FIX BUG WITH PARSING DIRECTORY BUFFER
//////////////////////////////////////////////////////////////////////
; !FIXIT âãâ ®¤­¨ § âã¯ë ¨ ¤¥¡¨«¨§¬
; ”ã­ªæ¨ï #47. <20>®«ã祭¨¥ ¨­ä®à¬ æ¨¨ ¯à¨«®¦¥­¨ï.
;
; ¢å®¤: HL - ¡ãä¥à ¤ ­­ëå
; B - ­®¬¥à ¯®¤ä㭪樨:
; B=0 - ¯®«ã祭¨¥ ¯ à ¬¥â஢ ª®¬ ­¤­®© áâப¨
; B=1 - ¯®«ã祭¨¥ ¯®«­®£® ¯ã⨠ª ª â «®£ã ¯à®£à ¬¬ë
; B=2 - ¯®«ã祭¨¥ ¯®«­®£® ¯ã⨠¨ ¨¬¥­¨ ä ©«  ¯à®£à ¬¬ë
; ¢ë室: ­¥â
;
; APPLICATION INFO
;====================
; B = 0 - GET APP_PARAM
; B = 1 - GET APP_PATH
; B = 2 - GET APP_FULLNAME
//////////////////////////////////////////////////////////////////////
;LAST_PSP_PTR: DW 0
APPINFO: INC B
;
DJNZ .FN1
; ¯®«ã祭¨¥ ¯ à ¬¥â஢ ª®¬ ­¤­®© áâப¨ EX DE,HL
XOR A
LD (DE),A
LD HL,(.LAST_PSP_PTR)
LD C,(HL)
INC C
RET Z
INC HL
LDIR
AND A
RET
.FN1: DJNZ .FN2
; ¯®«ã祭¨¥ ¯®«­®£® ¯ã⨠ª ª â «®£ã ¯à®£à ¬¬ë
EX DE,HL
.LAST_PSP_PTR+1:
LD HL,0
LD C,(HL)
INC HL
ADD HL,BC
INC HL
INC HL
PUSH HL
LD BC,#100 ;!HARDCODE ¤«¨­  ª®¬¬ ­¤­®© áâப¨
XOR A
CPIR
DEC HL ;R10 ;[x] ¨á¯à ¢«¥­ ¡ £ á ¯ àᨭ£®¬ ¡ãä¥à  ª â «®£ 
DEC HL ;R10,5 - ­¥ â¥á⨫ ;!!!!!
LD BC,#100 ;R10 ;[x] ­¥ ¡ë«® í⮩ ª®¬ ­¤ë, CPDR ¬®£ ­¥ ¯à®è¥àáâ¨âì ¢áñ ;!HARDCODE ¤«¨­  ª®¬¬ ­¤­®© áâப¨
LD A,'\'
CPDR
INC HL
INC HL
POP BC
AND A
SBC HL,BC
;R10 ;[x] ¬®£«® ¢áñ ¢ ª®á¬®á ã«¥â¥âì
LD A,DSS_Error.sys.COMMON_ERROR
JR C,.error
;
LD A,B ;EX HL,A,BC
LD B,H
LD H,A
LD A,C
LD C,L
LD L,A
LDIR
XOR A
LD (DE),A
RET
;
.FN2: DJNZ .FN3
; ¯®«ã祭¨¥ ¯®«­®£® ¯ã⨠¨ ¨¬¥­¨ ä ©« 
EX DE,HL
LD HL,(.LAST_PSP_PTR)
LD C,(HL)
INC HL
ADD HL,BC
INC HL
INC HL
;
.loop LD A,(HL)
LDI
OR A
JR NZ,.loop
;
RET
;
.FN3:
;
; ®è¨¡ª 
LD A,DSS_Error.sys.INVALID_FUNCTION
.error: SCF
RET
;

94
DSS/API/Attribute.asm Normal file
View File

@ -0,0 +1,94 @@
////////////////////////////////////////////////////////////////////////
; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00
; A - ATTRIB
; B - MODE
; B = #00 GET ATTRIB
; B = #01 SET ATTRIB
; OUTPUT: A - ATTRIB
////////////////////////////////////////////////////////////////////////
ATTRIB: ;!TEST Current Dir ;[x] 15/10/23
LD C,A
;
PUSH HL
PUSH BC
CALL DIR_PATH_CHECK
POP BC
POP HL
RET C
LD A,C
;
;
INC B
DJNZ .B_1
; B = 0
.READ: ;!TEST ;[x] 16/11/23 optimize get attribute
;XOR A
;
CALL .OPENATR ;R002
RET C
;!TEST ;[x] 16/11/23 optimize get attribute
LD A,(HANDBUF + FAT_DIRECTORY_RECORD.ATTRIBUT)
;LD B,(IY+_sFM.ATTRIBUT)
;PUSH BC
;CALL CLOSE
;POP BC
;RET C
;LD A,B
;
RET
;
.B_1: DJNZ .B_2
;
.WRITE_FN: AND FAT_ATTR.NoVolID ; [x] 2/12/23 ä¨ªá ¤«ï volume ID
.WRITE: PUSH AF
XOR A
;!TEST ;[x] 16/11/23 optimize get attribute
LD (OPEN_FN.TMP),A
;
CALL .OPENATR ;R002
;!TEST ;[x] 16/11/23 optimize get attribute
CALL NC,OPEN_FN.FM
;
POP BC
RET C
SET 7,(IY+_sFM.ACCESS_MODE)
;RES 3,B ;CLEAR LABEL ATTR ;R003
LD (IY+_sFM.FS_REC.ATTRIBUT),B
PUSH BC
CALL CLOSE_FN
.error: POP BC
RET C
LD A,B
RET
;R002
; ¢ë室: ¥á«¨ CF = 0, â® DE = record index
;!TEST 9/11/23 record index
.OPENATR: ;!TEST ;[x] 16/11/23 optimize get attribute
;LD (OPEN.TMP),A ; à ¡. ï祩ª  (§¤¥áì  âਡãâ § ¯¨á¨)
;
CALL SetPath_GetName ; â¥áâ ­  ¤®¯ãáâ. ¨¬ï ¨ ­ áâà. ­  ¤¨áª
RET C
; [ ] 26/06/2024
CALL CHECK_64kb_CLUSTER
RET C
;
CALL MASK
RET C
LD A,FAT_ATTR.NoVolID
;!TEST ;[x] 16/11/23 optimize get attribute
JP SEARCH.Custom
;CALL SEARCH.Custom
;RET C ; § ¯¨áì ­¥ ­ ©¤¥­ 
;JP OPEN.FM ; ­  ¯®¨áª ᢮¡. ¤¥áªà¨¯â®à 
;
;
; [ ] ; !TODO ¤«ï ª®¬ ­¤ë LABEL ¢ Shell
; 1. ¯à®¢¥à¨âì çâ® ¢ HL 㪠§ ­  ⮫쪮 ¬¥âª  ¢ ª ¢ë窠å
; 2. ¥á«¨ ¬¥âª  ¡¥§ ­¥¤®¯ãá⨬ëå ᨬ¢®«®¢, â® ¤¥« ¥¬ ¥ñ ­¥
; ⮫쪮 ¢ BPB, ­® ¨ ­  ª®à­¥¢®¬ à §¤¥«¥, ¨­ ç¥ 㤠«ï¥¬ ­  ª®à­¥¢®¬
; 3. ®âªà뢠¥¬ âà¥¡ã¥¬ë© ¤¨áª ç¥à¥§ .force, ç⮡ á¡à®á¨âì ªíè¨
.B_2: DJNZ .error_fn
;
.error_fn: LD A,DSS_Error.sys.INVALID_FUNCTION
SCF
RET

36
DSS/API/ChDir.asm Normal file
View File

@ -0,0 +1,36 @@
////////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #1D. ‘¬¥­  ⥪ã饣® ª â «®£ .
; Œ¥­ï¥â ⥪ã騩 ª â «®£ ¨ ⥪ã騩 ¤¨áª, ¥á«¨ ®­ 㪠§ ­ ¢ ä ©«®¢®©
; ᯥæ¨ä¨ª æ¨¨. …᫨ ¯ãâì ­ ç¨­ ¥âáï á "\" - íâ® ®§­ ç ¥â ¯ãâì ®â
; ª®à­¥¢®£® ª â «®£ , ¨­ ç¥ ®â ⥪ã饣®.
;
; ¢å®¤: HL - 㪠§ â¥«ì ­  ¨¬ï ª â «®£ 
; ¢ë室: ­¥â
;
; INPUT: HL - "C:\DIR\DIR\DIR_NAME[\]",0
////////////////////////////////////////////////////////////////////////
CHDIR_FN:
;!TEST Current Dir ;[x] 15/10/23
;
PUSH HL
CALL DIR_PATH_CHECK
POP HL
RET C
CALL CHDIR
; ¥á«¨ 㤠筮, â® ª®¯¨à㥬 WorkDirectory ¢ CurrentDirectory
JP NC,DIR_PATH_CHANGE.FullCurrent
; ¥á«¨ ­¥ã¤ ç­®, â® ¢®§¢à é ¥¬áï â㤠 ®âªã¤  ¯à¨è«¨
PUSH AF
LD HL,CORE_BUFFERS.CurrentDirectory
CALL CHDIR
POP AF
RET
;
CHDIR: CALL SetPath_GetName ; â¥áâ ­  ¤®¯ãáâ. ¨¬ï ¨ ­ áâà. ­  ¤¨áª
RET C
LD HL,TMPNAME
LD A,(HL)
OR A
RET Z
JP OPENDIR
;

24
DSS/API/ChDisk.asm Normal file
View File

@ -0,0 +1,24 @@
////////////////////////////////////////////////////////////////////////
;
;
////////////////////////////////////////////////////////////////////////
CHDISK_FN: CALL CHDISK
RET C
PUSH AF
CALL DIR_PATH_CHANGE.FullCurrent
POP AF
RET
CHDISK: ;[x] ¡®«¥¥ ª®à४⭠ï ᬥ­  ¤¨áª 
CALL OPENDSK
;
;R010
RET C
LD HL,CORE_BUFFERS.WorkDirectory
LD (HL),0
PUSH AF
CALL OPENDIR
POP BC
RET C
LD A,B
RET
;

24
DSS/API/ChnDisk.asm Normal file
View File

@ -0,0 +1,24 @@
////////////////////////////////////////////////////////////////////////
;
;
////////////////////////////////////////////////////////////////////////
CHDISK_FN: CALL CHDISK
RET C
PUSH AF
CALL DIR_PATH_CHANGE.FullCurrent
POP AF
RET
CHDISK: ;[x] ¡®«¥¥ ª®à४⭠ï ᬥ­  ¤¨áª 
CALL OPENDSK
;
;R010
RET C
LD HL,CORE_BUFFERS.WorkDirectory
LD (HL),0
PUSH AF
CALL OPENDIR
POP BC
RET C
LD A,B
RET
;

20
DSS/API/Clear.asm Normal file
View File

@ -0,0 +1,20 @@
;///////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #56. Žç¨áâ¨âì ®ª­®.
;
; ¢å®¤: D - áâப  «¥¢®£® ¢¥àå­¥£® 㣫  ®ª­ 
; E - á⮫¡¥æ «¥¢®£® ¢¥àå­¥£® 㣫  ®ª­ 
; H - ¢ëá®â  ®ª­ 
; L - è¨à¨­  ®ª­ 
; A - ᨬ¢®« § ¯®«­¨â¥«ì
; B -  âਡãâ § ¯®«­¨â¥«ì
; ¢ë室: ­¥â
;///////////////////////////////////////////////////////////////////////
CLEAR: LD C,A
LD A,B
LD (.shell_color),A
LD A,C
LD C,BIOS.LP_CLS_WIN2
JP ToBIOS
;
.shell_color: DB COLORS.CGA.INK.LGRAY
;///////////////////////////////////////////////////////////////////////

91
DSS/API/Close.asm Normal file
View File

@ -0,0 +1,91 @@
; [x] fat32 ;!TEST
////////////////////////////////////////////////////////////////////////
;‚室­ë¥ §­ ç¥­¨ï:
; C - #12
; A - ä ©«®¢ë© ¬ ­¨¯ã«ïâ®à
;‚ë室­ë¥ §­ ç¥­¨ï:
; A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
////////////////////////////////////////////////////////////////////////
CLOSE_FN:
;R008 ;
;CLOSE: ;
LD (.TMP),A
CALL SET_FM
RET C
LD A,(TASK)
CP (IY+_sFM.TASK_NUM)
LD A,DSS_Error.sys.ACCESS_DENIED
SCF
RET NZ
BIT 7,(IY+_sFM.ACCESS_MODE)
JR Z,.NOTMODF
;
LD E,(IY+_sFM.DIR_CLUSTER_L)
LD D,(IY+_sFM.DIR_CLUSTER_L+1)
PUSH DE
; [x] fat32
LD E,(IY+_sFM.DIR_CLUSTER_H)
LD D,(IY+_sFM.DIR_CLUSTER_H+1)
PUSH DE
;
; [x] 15/11/2023 -bug with bad clusters ;!TEST
LD A,(IY+_sFM.DRIVE)
CALL OPENDSK
JR C,.error
;
XOR A
CALL SET_FM
; [x] fat32
POP DE
LD (IY+_sFM.DIR_CLUSTER_H),E
LD (IY+_sFM.DIR_CLUSTER_H+1),D
LD (IY+_sFM.FS_REC.FIRST_CLUSTER_H),E
LD (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1),D
;
POP DE
LD (IY+_sFM.DIR_CLUSTER_L),E
LD (IY+_sFM.DIR_CLUSTER_L+1),D
; [x] 15/11/2023 -bug with bad clusters ;!TEST
LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L),E
LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1),D
;
CALL LOADDIR
.TMP+1: LD A,0
CALL SET_FM
;
SET_PAGE_X DIRPAGE
;
;!TEST 9/11/23 record index
; LD HL,DIR
; LD DE,FAT_DIRECTORY_RECORD
; LD C,(IY+_sFM.HANDLE)
; LD B,(IY+_sFM.HANDLE+1)
; JR .CLOSE2
; .CLOSE1:
; ADD HL,DE
; DEC BC
; .CLOSE2:
; LD A,B
; OR C
; JR NZ,.CLOSE1
LD L,(IY+_sFM.HANDLE)
LD H,(IY+_sFM.HANDLE+1)
;
LD D,YH
LD E,YL
EX DE,HL
;PUSH HL
;SET_PAGE_X DIRPAGE
;POP HL
LD BC,FAT_DIRECTORY_RECORD
LDIR
OUT (SLOT3),A
CALL SAVEDIR
.NOTMODF:
LD A,(.TMP)
JP RES_FM
;
.error: POP DE
POP DE
RET
;

111
DSS/API/Create.asm Normal file
View File

@ -0,0 +1,111 @@
////////////////////////////////////////////////////////////////////////
; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00
; A - File attribute
; OUTPUT: A - FM
////////////////////////////////////////////////////////////////////////
CREATE: ;!TEST Current Dir ;[x] 15/10/23 ;CREATE_FN:
PUSH HL
LD C,A
;
PUSH BC
CALL DIR_PATH_CHECK
POP BC
POP HL
RET C
LD A,C
;
CALL .Prepare
RET C
CALL SEARCH.File
; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024
;CALL NC,DEL_FN.DELETE ;FILE EXIST RECREAT
CALL NC,.FILE_EXISTS_DEL ;FILE EXIST RECREAT
CP DSS_Error.sys.FILE_NOT_FOUND
JR Z,.DO
SCF
RET
.FILE_EXISTS_DEL:
CALL DELETE_REC_FAT
LD A,DSS_Error.sys.FILE_NOT_FOUND
RET
;
; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00
; OUTPUT: A - FM
.NEW: ;!TEST Current Dir ;[x] 15/10/23
PUSH HL
LD C,A
;
PUSH BC
CALL DIR_PATH_CHECK
POP BC
POP HL
RET C
LD A,C
;
CALL .Prepare
RET C
CALL SEARCH.File
; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024
; LD A,DSS_Error.sys.FILE_EXISTS
; CCF
; RET C
JR NC,.FILE_EXISTS
CP DSS_Error.sys.FILE_NOT_FOUND
SCF
RET NZ
;
;
;no_file_found
.DO: ; FAT_DIRECTORY_RECORD.NAME + .EXT
LD HL,MASKARE
LD DE,HANDBUF
LD BC,11
LDIR
EX DE,HL
.TMP+1: LD A,0
; FAT_DIRECTORY_RECORD.ATTRIBUT
LD (HL),A
INC HL
LD BC,#0A00 ;!HARDCODE
; .RESERVED_NT .. .FIRST_CLUSTER_H
.loop1: LD (HL),C
INC HL
DJNZ .loop1
; .TIME .. .DATE
CALL WRITE_DATE_TIME_TO_DIRECTORY_RECORD
;
LD BC,#0600
;
.loop2: LD (HL),C
INC HL
DJNZ .loop2
;
CALL WRT_HND
RET C
;CALL SAVEDIR
.PATH0+1: LD HL,0
XOR A
LD (OPEN_FN.TMP),A
JP OPEN_FN.FILE ;R008
;
.Prepare: ;AND #E7 ;R004 %76A00SHR = !FAT_ATTR ;!HARDCODE
AND FAT_ATTR.NoDIRnoVolID
LD (.TMP),A
LD (.PATH0),HL
CALL SetPath_GetName
RET C
; [ ] 26/06/2024
CALL CHECK_64kb_CLUSTER
RET C
;
; [ ] 25/02/2025 - ä ©« ­¥ á®§¤ áâáï, ¥á«¨ ­¥â ᢮¡®¤­®£® ¬ ­¨¯ã«ïâ®à 
CALL GET_FM
RET C
;
JP MASK
;
; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024
.FILE_EXISTS: LD A,DSS_Error.sys.FILE_EXISTS
CCF
RET
;

24
DSS/API/CurrDir.asm Normal file
View File

@ -0,0 +1,24 @@
////////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #1E. ˆ­ä®à¬ æ¨ï ® ⥪ã饬 ª â «®£¥.
;
; ¢å®¤: HL - ¡ãä¥à ¢ ¯ ¬ï⨠256 ¡ ©â
; ¢ë室: A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
////////////////////////////////////////////////////////////////////////
CURRDIR: LD DE,CORE_BUFFERS.WorkDirectory
JR CURRDIR_FN.skip
CURRDIR_FN:
LD DE,CORE_BUFFERS.CurrentDirectory
.skip: EX DE,HL
LD BC,DIRECTORY_PATH_LENGTH ;[x] 15/11/2023 ¬®£«® ¢ë©â¨ §  ¯à¥¤¥«ë ¡ãä¥à 
XOR A
.loop: CP (HL)
LDI
JP PO,.error ;[x] 15/11/2023 ¬®£«® ¢ë©â¨ §  ¯à¥¤¥«ë ¡ãä¥à 
JR NZ,.loop
RET
;[x] 15/11/2023 ¬®£«® ¢ë©â¨ §  ¯à¥¤¥«ë ¡ãä¥à 
.error: LD A,DSS_Error.sys.TOO_DEEP_DIR_DEPTH
SCF
RET
;
;

10
DSS/API/Cursor.asm Normal file
View File

@ -0,0 +1,10 @@
;///////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #53. “§­ âì ¯®«®¦¥­¨¥ ªãàá®à .
;
; ¢å®¤: ­¥â
; ¢ë室: D - áâப  ªãàá®à 
; E - ª®«®­ª  ªãàá®à 
;///////////////////////////////////////////////////////////////////////
CURSOR: LD C,BIOS.LP_GET_PLACE
JP ToBIOS
;///////////////////////////////////////////////////////////////////////

34
DSS/API/Delete.asm Normal file
View File

@ -0,0 +1,34 @@
; [x] fat32 ;!TEST
////////////////////////////////////////////////////////////////////////
; INPUT: HL - "c:\dir\filename.ext",#00 without simbols * ?
////////////////////////////////////////////////////////////////////////
DEL_FN: ;Current Dir ;[x] 15/10/23
PUSH HL
CALL DIR_PATH_CHECK
POP HL
RET C
;
CALL SetPath_GetName ; â¥áâ ­  ¤®¯ãáâ. ¨¬ï ¨ ­ áâà. ­  ¤¨áª
RET C
; [ ] 26/06/2024
CALL CHECK_64kb_CLUSTER
RET C
;
CALL MASK
RET C
;
;!TEST optimization
;LD HL,MASKARE
;LD BC,11
;LD A,"?"
;CPIR
;LD A,DSS_Error.sys.INVALID_NAME
;SCF
CALL CHECK_NAME
;
RET Z
CALL LOADDIR
CALL SEARCH.File
RET C
JP DELETE_REC_FAT ; ¯®¬¥â¨âì § ¯¨áì ª ª "㤠«¥­­ ï"
;

22
DSS/API/DosName.asm Normal file
View File

@ -0,0 +1,22 @@
////////////////////////////////////////////////////////////////////////
;‚室­ë¥ §­ ç¥­¨ï:
; C - #44
; B = 0, ¯à¥®¡à §®¢ âì ¨§ 11 ᨬ¢®«ì­®£® ä®à¬ â  ¢ ä®à¬ â „Ž‘
; HL - 11 ᨬ¢®«®¢ ¨¬¥­¨ ä ©« 
; DE - ¡ãä¥à ¤«ï ¨¬¥­¨ ¢ ä®à¬ â¥ „Ž‘
; B = 1, ¯à¥®¡à §®¢ âì ¨§ ä®à¬ â  „Ž‘ ¢ 11 ᨬ¢®«ì­ë© ä®à¬ â
; HL - ¨¬ï ä ©«  ¢ ä®à¬ â¥ „Ž‘
; DE - 11 ᨬ¢®«®¢ ¨¬¥­¨ ä ©« 
;‚ë室­ë¥ §­ ç¥­¨ï:
; A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
////////////////////////////////////////////////////////////////////////
DOSNAME:
INC B
DEC B
JP Z,GetName
DEC B
JP Z,MASK.custom
LD A,DSS_Error.sys.INVALID_FUNCTION
SCF
RET
;

294
DSS/API/Environ.asm Normal file
View File

@ -0,0 +1,294 @@
;[BEGIN]
;//MODULE: ENVIRON
;//CREATE: 10-11-2002 AUTHOR: Denis Parinov
;---------------------------------------------------------------
;Rev Date Name Description
;---------------------------------------------------------------
;R02 13-05-2023 BAO ˆ­¨æ¨ «¨§ æ¨ï ¯¥à¥¬¥­­®© BOOTDSK ¯à¨ áâ àâ¥
;R03 09-03-2007 VAS ”ã­ªæ¨ï ENV_EX ⥯¥àì ®¡à¥§ ¥â ᫨誮¬ ¤«¨­­ãî áâப㠯¥à¥¤ ¢ë室®¬
;R01 19-11-2002 DNS CORRECT DE ADDRESS IN GETENV
;---------------------------------------------------------------
;/////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #46. ‘¨á⥬­®¥ ®ªà㦥­¨¥.
;
; ¢å®¤: B - ­®¬¥à ¯®¤ä㭪樨:
; B=#FF, ¨­¨æ¨ «¨§ æ¨ï
; B=0, ¯®«ã祭¨¥ á¨á⥬­®£® ®ªà㦥­¨ï.
; HL - ¡ãä¥à
; B=1, ¯®«ãç¨âì ¯¥à¥¬¥­­ãî ®ªà㦥­¨ï.
; HL - ¨¬ï ¯¥à¥¬¥­­®©
; DE - ¡ãä¥à ¤«ï §­ ç¥­¨ï ¯¥à¥¬¥­­®©
; B=2, ãáâ ­®¢¨âì/㤠«¨âì ¯¥à¥¬¥­­ãî ®ªà㦥­¨ï
; HL - <20><EFBFBD>…Œ…<C592><E280A6>€Ÿ=‡<>€—…<E28094>ˆ
; ª®­æ¥ áâப¨ ­®«ì.
; ¢ë室: A - á®áâ®ï­¨¥, ¥á«¨ CF=0
; DE - 㪠§ë¢ ¥â ­  ª®­¥æ ¡ãä¥à  (⮫쪮 ¤«ï B=1)
; A=#FF - ¯¥à¥¬¥­­ ï ®¡­ à㦥­ 
; A=0 - ¯¥à¥¬¥­­ ï ­¥ ®¡­ à㦥­ 
; A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
;/////////////////////////////////////////////////////////////////////
ENVIRON:
INC B
JR Z,INITENV ; B=#FF
DEC B
JR Z,READENV ; B=0. ¯®«ãç¨âì á¨áâ. ®ªà㦥­¨¥
DEC B
JP Z,GETENV ; B=1. ¯®«ãç¨âì ¯¥à¥¬. ®ªà㦥­¨ï
DEC B
JP Z,SETENV ; B=2. ãáâ ­®¢¨âì/㤠«¨âì ¯¥à¥¬. ®ªà㦥­¨ï
LD A,DSS_Error.sys.INVALID_FUNCTION
SCF
RET
;-------------------------------------------------
; ˆ­¨æ¨ «¨§ æ¨ï ¡ãä¥à  ¯¥à¥¬¥­­ëå ®ªà㦥­¨ï
;-------------------------------------------------
INITENV:
SET_PAGE_X ENVPAGE
PUSH AF
;
;R02
LD A,(BOOTDSK.NUM)
ADD A,'A'
LD (DEFAULT_ENV.boot_disk),A
;
LD DE,ENVIRONMENT ; ­ ç «® ¡ãä¥à  ¯¥à¥¬¥­­ëå ®ªà㦥­¨ï
XOR A
LD (DE),A
INC DE
LD HL,DEFAULT_ENV
LD BC,DEF_ENV_SIZE
LDIR
LD (DE),A
EX DE,HL
LD DE,ENVIRONMENT
AND A
SBC HL,DE
LD (ENVSIZE),HL
;
POP AF
OUT (SLOT3),A
AND A
RET
;-------------------------------------------------
; <20>®«ãç¨âì á¨áâ. ®ªà㦥­¨¥
;-------------------------------------------------
READENV:
PUSH HL
SET_PAGE_X ENVPAGE
LD H,A
LD C,SLOT3
IN L,(C)
EXX
LD HL,ENVIRONMENT
INC HL
POP DE
LD BC,(ENVSIZE)
EXX
;
.loop: OUT (C),L
EXX
LD A,(HL)
EXX
OUT (C),H
EXX
LD (DE),A
INC HL
INC DE
DEC BC
LD A,B
OR C
EXX
JR NZ,.loop
//XOR A
;A=0
RET
;-------------------------------------------------
; <20>®«ãç¨âì ¯¥à¥¬¥­­ãî ®ªà㦥­¨ï
;-------------------------------------------------
GETENV: PUSH DE
CALL ENV_EX ; ᪮¯¨à. áâப㠯¥à¥¬. ®ªàã¦. ¢ ¡ãä¥àë
SET_PAGE_X ENVPAGE
EX AF,AF'
CALL F_ENV ; RET: DE - VAR VALUE; HL - VAR ADDRESS; BC - ENVIRONMENT SIZE
POP DE
LD A,0
LD (DE),A
JR NC,.exit
.loop: LD A,(HL)
LDI
OR A
JR NZ,.loop
DEC DE ;R01
LD A,#FF
.exit: EX AF,AF'
OUT (SLOT3),A
EX AF,AF'
AND A
RET
;-------------------------------------------------
; “áâ ­®¢¨âì/“¤ «¨âì ¯¥à¥¬¥­­ãî ®ªà㦥­¨ï
;
; ¢å®¤: hl=¨¬ï ¯¥à¥¬. ¨ §­ ç¥­¨¥, à §¤¥«. ᨬ¢®«®¬ "="
;-------------------------------------------------
SETENV: CALL ENV_EX ; ᪮¯¨à. áâப㠯¥à¥¬. ®ªàã¦. ¢ ¡ãä¥àë
SET_PAGE_X ENVPAGE
PUSH AF
CALL F_ENV ; RET: DE - VAR VALUE; HL - VAR ADDRESS; BC - ENVIRONMENT SIZE
JR NC,PENV
XOR A
CPIR
LD A,B
OR C
JR Z,PENV
LDIR
PENV LD A,(ENVVALUE)
OR A
JR Z,CLR_ENV
LD HL,ENVNAME
F_EVN2 LD A,(HL)
LDI
CP "="
JR NZ,F_EVN2
LD HL,ENVVALUE
F_EVN3 LD A,(HL)
LDI
OR A
JR NZ,F_EVN3
CLR_ENV XOR A
LD (DE),A
LD HL,ENVIRONMENT
EX DE,HL
SBC HL,DE
LD (ENVSIZE),HL
;
POP AF
OUT (SLOT3),A
AND A
RET
; RET:
; DE - VAR VALUE
; HL - VAR ADDRESS
; BC - ENVIRONMENT SIZE
F_ENV LD HL,ENVIRONMENT
LD BC,(ENVSIZE)
PUSH HL
F_EVN0 POP DE
LD DE,ENVNAME
XOR A
CPIR
PUSH HL
F_EVN1 LD A,(HL)
OR A
JR Z,END_OF_ENV
LD A,(DE)
CP (HL)
INC HL
INC DE
DEC BC
JR NZ,F_EVN0
CP "="
JR NZ,F_EVN1
SCF
END_OF_ENV
POP DE
RET
;-----------------------------------------------------------
; ‘ª®¯¨à®¢ âì áâப㠯¥à¥¬¥­­®© ®ªà㦥­¨ï ¢ ¡ãä¥àë
; (¨¬ï ¨ §­ ç¥­¨¥ ¢ à §­ë¥ ¡ãä¥àë)
; ¢å®¤: hl=¨¬ï ¯¥à¥¬. ¨ §­ ç¥­¨¥, à §¤¥«. ᨬ¢®«®¬ "="
;-----------------------------------------------------------
ENV_EX: LD B,ENVIRONMENT_STRING_LENGTH ; 255 ¬ ªá. ¤«¨­  áâப¨ (¨¬ï+§­ ç.)
LD DE,ENVNAME ; ªã¤ 
ENV_E0: XOR A
LD (DE),A
LD (ENVVALUE),A
; ᪮¯¨à. ¢ "ENVNAME" ¨¬ï ¯¥à¥¬¥­­®©
ENV_E1: LD A,(HL)
INC HL
CP "="
JR Z,EQUAL_SG
OR A
JR Z,ENV_E3
CALL UPPER
LD (DE),A
INC DE
DJNZ ENV_E1
;R03
; ᫨誮¬ ¤«¨­­ ï áâப 
ld a,b
ld (de),a ; ®¡à¥§ âì ᫨誮¬ ¤«¨­­ãî áâபã
inc de
;
SCF
RET
; §­ ç¥­¨¥ ­¥ § ¤ ­®
ENV_E3: LD A,"="
LD (DE),A
INC DE
XOR A
LD (DE),A
INC DE
RET
; §­ ç¥­¨¥ § ¤ ­®
EQUAL_SG: LD (DE),A ; á®åà. "="
INC DE
XOR A
LD (DE),A ; ¢ ª®­¥æ ¨¬¥­¨ ¯¥à¥¬.
; ᪮¯¨à. ¢ "ENVVALUE" §­ ç¥­¨¥ ¯¥à¥¬¥­­®© (áâப㠯ã⥩)
LD DE,ENVVALUE ; 512 ¡ ©â, ¡ãä¥à
LD (DE),A
LD C,#FF ; ç⮡ë "ldi" ­¥ ¯®à⨫  "b"
ENV_E2 LD A,(HL)
LDI
OR A
RET Z ; ª®­¥æ áâப¨ §­ ç. ¯¥à¥¬¥­­®©
DJNZ ENV_E2
;R03
; ᫨誮¬ ¤«¨­­ ï áâப 
ld a,b
ld (de),a ; ®¡à¥§ âì ᫨誮¬ ¤«¨­­ãî áâபã
inc de
;
SCF
RET
ENVNAME EQU CORE_BUFFERS.EXEBUFF ;DS 32
ENVVALUE EQU CORE_BUFFERS.BUFFER //#3800 ; BUFFER ;DS 128
ENVSIZE DW DEF_ENV_SIZE ;E_END-ENVIRONMENT ;160
ENVIRONMENT EQU ENVADDR
DEFAULT_ENV: DB 'BOOTDSK=' ;R02
.boot_disk: DB 'X:',0 ;R02
; DB 'SYSTEM=C:\system.exe',0
; DB 'PATH=\SYSTEM\;\COMMAND\;',0
DEF_ENV_SIZE EQU $-DEFAULT_ENV ;R02
; DB 'SYSTEM=C:\system.exe',0
; DB 'PATH=\SYSTEM\;\COMMAND\;',0
; DB 0
; DB 'SYSTEM=C:\system.exe',0
; DB 'PATH=C:\;\FN\;',0
; DB 'OS=ESTEX',0
; DB 'VAR1=000',0
; DB 'OSNAME=ESTEX 2002',0
; DB 0

240
DSS/API/Ex_Path.asm Normal file
View File

@ -0,0 +1,240 @@
//////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #45. <20> §¡®à ª®¬ ­¤­®© áâப¨.
;
; ¢å®¤: HL - 㪠§ â¥«ì ª®¬ ­¤­®© áâப¨
; DE - 㪠§ â¥«ì ­  ¡ãä¥à ¯®«ì§®¢ â¥«ï
; B - ­®¬¥à ¯®¤ä㭪樨:
; 0 - <20> §®¡à âì áâபã
; 1 - ‚뤥«¨âì ¨¬ï ¤¨áª 
; 2 - ‚뤥«¨âì ¤¨à¥ªâ®à¨î
; 3 - ‚뤥«¨âì ¨¬ï ä ©« 
; 4 - ‚뤥«¨âì à áè¨à¥­¨¥ ä ©« 
; 5 - ‚뤥«¨âì ¨¬ï ¤¨áª , ¯ãâì ª ä ©«ã, ¨¬ï ä ©«  ¨ à áè. ä ©« 
; 6 - ‡ à¥§¥à¢¨à®¢ ­® ;!TODO ¯à¥®¡à §®¢ âì ®â­®á¨â¥«ì­ë© ¯ãâì ¢ ¯®«­ë© ; [ ]
; 7 - ‚뤥«¨âì ¯ à ¬¥âà ª®¬ ­¤­®© áâப¨
; 8 - <20>८¡à §®¢ âì ¨§ 11 ᨬ¢®«ì­®£® ä®à¬ â  ¢ ä®à¬ â „Ž‘
; 9 - <20>८¡à §®¢ âì ¨§ ä®à¬ â  „Ž‘ ¢ 11 ᨬ¢®«ì­ë© ä®à¬ â
; ¢ë室: ­¥â
//////////////////////////////////////////////////////////////////////
GLOB_PR EQU 7 ;%10000000
DRIV_PR EQU 3 ;%00001000
PATH_PR EQU 2 ;%00000100
EXTN_PR EQU 1 ;%00000010
NAM_PR EQU 0 ;%00000001
EX_PATH: EXX
LD HL,NM_PATH_A ;BUILT-IN BUFFER FOR PATH ;!!!!! ¨á¯®«ì§ã¥âáï ®¡é¨© ¡ãä¥à
LD (NM_PATH),HL
LD HL,NM_NAME_A
LD (NM_NAME),HL
LD HL,NM_EXTN_A
LD (NM_EXTN),HL
LD HL,NM_DRIVE_A
LD (NM_DRIVE),HL
EXX
INC B
DEC B
JR Z,.FULL ;0 ; à §®¡à âì áâபã
DEC B
JR Z,.GET_DRIVE ;1 ; ¢ë¤¥«¨âì ¨¬ï ¤¨áª 
DEC B
JR Z,.GET_PATH ;2 ; ¢ë¤¥«¨âì ¤¨à¥ªâ®à¨î
DEC B
JR Z,.GET_NAME ;3 ; ¢ë¤¥«¨âì ¨¬ï ä ©« 
DEC B
JR Z,.GET_TYPE ;4 ; ¢ë¤¥«¨âì à áè¨à¥­¨¥ ä ©« 
DEC B
JR Z,.GET_ALL_EX ;5 ; ¢ë¤¥«¨âì ¤¨áª, ¯ãâì, ä ©« ¨ à áè.
DEC B
JR Z,.EX_RESR ;6 ; § à¥§¥à¢¨à®¢ ­®
DEC B
JP Z,GSWITCH ;7 ; ¢ë¤¥«¨âì ¯ à ¬¥âà ª®¬-áâப¨
DEC B
JP Z,GetName ;8 ; ¯à¥®¡à. ¨¬ï 11 -> 8.3 ä®à¬ â
DEC B
JP Z,MASK.custom ;9 ; ¯à¥®¡à. ¨¬ï 8.3 -> 11 ä®à¬ â
.EX_RESR: LD A,DSS_Error.sys.INVALID_FUNCTION
SCF
RET
; ‚뤥«¨âì ¨¬ï ¤¨áª 
.GET_DRIVE: LD (NM_DRIVE),DE
CALL .FULL
RET C
LD DE,(NM_DRIVE)
LD A,(DE)
DEC A
CP #FF
RET Z
CP "A"-1
JR C,.GD_error
CP "Z"
JR NC,.GD_error
SUB "A"-1
RET
;
.GD_error: LD A,DSS_Error.sys.INVALID_DRIVE
SCF
RET
; ‚뤥«¨âì ¤¨à¥ªâ®à¨î
.GET_PATH: LD (NM_PATH),DE
JR .FULL
; ‚뤥«¨âì ¨¬ï ä ©« 
.GET_NAME: LD (NM_NAME),DE
JR .FULL
; ‚뤥«¨âì à áè¨à¥­¨¥ ä ©« 
.GET_TYPE: LD (NM_EXTN),DE
JR .FULL
; ‚뤥«¨âì ¤¨áª, ¯ãâì, ä ©« ¨ à áè.
.GET_ALL_EX: EX DE,HL
LD C,(HL)
INC HL
LD B,(HL)
INC HL
LD (NM_DRIVE),BC
LD C,(HL)
INC HL
LD B,(HL)
INC HL
LD (NM_PATH),BC
LD C,(HL)
INC HL
LD B,(HL)
INC HL
LD (NM_NAME),BC
LD C,(HL)
INC HL
LD B,(HL)
LD (NM_EXTN),BC
EX DE,HL
;JR EX_FULL
; <20> §®¡à âì áâபã
.FULL: EX AF,AF'
EXX
XOR A
LD HL,(NM_PATH)
LD (HL),A
LD HL,(NM_NAME) ;  ¤à¥á ¡ãä¥à  ¯®¤ ¨¬ï ä ©« 
LD (HL),A
LD HL,(NM_EXTN)
LD (HL),A
LD HL,(NM_DRIVE)
LD (HL),A
EXX
EX AF,AF'
.PAT0: LD DE,TMPBUF
LD BC,#0D01 ;!HARDCODE áç¥â稪¨
.PAT1: LD A,(HL)
CALL UPPER ; a..z -> A..Z
LD (DE),A
INC HL
INC DE
INC C ; ++áç¥â稪
CP '\'
JR Z,.PATH_YEP
CP ":"
JR Z,.DRIVE_YEP
CP "!"
JR C,.NAME_YEP
CP "?"
JR Z,.GLOBP1
CP "*"
JR Z,.GLOBP1
.PAT2: DJNZ .PAT1
LD A,DSS_Error.sys.INVALID_NAME
SCF
RET
;
.GLOBP1: EX AF,AF'
SET GLOB_PR,A
EX AF,AF'
JR .PAT2
;
.NAME_YEP: LD A,2
CP C
JR Z,.NOFNAME
PUSH HL
LD HL,TMPBUF
LD DE,(NM_NAME) ;  ¤à¥á ¡ãä¥à  ¯®¤ ¨¬ï ä ©« 
LD B,0
DEC C
DEC C
LD A,C
LDIR
LD C,A
XOR A
LD (DE),A
LD HL,(NM_NAME)
LD A,"."
CPIR
JR NZ,.NOEXTN
LD C,3
LD DE,(NM_EXTN)
.EXTSK0: LD A,(HL)
OR A
JR NZ,.EXTSK1
LD A,' '
DEC HL
.EXTSK1: LD (DE),A
INC HL
INC DE
DEC C
JR NZ,.EXTSK0
XOR A
LD (DE),A
EX AF,AF'
SET EXTN_PR,A ; 㪠§ ­® à áè. ä ©« 
EX AF,AF'
.NOEXTN: EX AF,AF'
SET NAM_PR,A ; 㪠§ ­® ¨¬ï ä ©« 
EX AF,AF'
POP HL
.NOFNAME: EX AF,AF'
AND A
RET
;
.DRIVE_YEP: XOR A
LD (DE),A
PUSH HL
LD HL,TMPBUF
LD DE,(NM_DRIVE)
LD B,0
LDIR
POP HL
EX AF,AF'
SET DRIV_PR,A ; 㪠§ ­® ¨¬ï ¤¨áª 
EX AF,AF'
JP .PAT0
;
.PATH_YEP: XOR A
LD (DE),A
PUSH HL
PUSH BC
LD HL,(NM_PATH)
LD BC,#00FF ; !FIXIT £«ã¡¨­  ¡ãä¥à  ­¥ § ¢¨á¨â ®â CurrentDirectory.DEPTH
CPIR
DEC HL
EX DE,HL
LD HL,TMPBUF ; 12 ¯à®¡¥«®¢
POP BC
LD B,0
LDIR
POP HL
EX AF,AF'
SET PATH_PR,A
EX AF,AF'
JP .PAT0
;!TODO ¯¥à¥­¥áâ¨/§ ¬¥­¨âì ­  ®¡é¨©
TMPBUF: DB " ",#00 ; 12 ¯à®¡¥«®¢
NM_DRIVE: DW NM_DRIVE_A
NM_NAME: DW NM_NAME_A
NM_EXTN: DW NM_EXTN_A
NM_PATH: DW NM_PATH_A
NM_DRIVE_A: BLOCK 9,0
NM_NAME_A: DB " ",#00 ; 12 ¯à®¡¥«®¢
NM_EXTN_A: DB " ",0
NM_PATH_A EQU CORE_BUFFERS.BUFFER ;DS 256 ;!!!!! shared buffer

791
DSS/API/Execute.ASM Normal file
View File

@ -0,0 +1,791 @@
;[BEGIN]
;//MODULE: EXECUTE
;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
;//UPDATE: 24-10-1999 DNS Restore module
;-------------------------------------------------------------------------------------------------------------------------
;Rev Date Name Description
;-------------------------------------------------------------------------------------------------------------------------
;R12 20-07-2023 BAO <20>ਠ§ ¢¥à襭¨¨ ¯à¨«®¦¥­¨ï " ¢ à¨©­®" ¢ ¢®§¢à é ¥¬®¥ ¯à¨«®¦¥­¨¥ ¯¥à¥¤ ñâáï ª®¤ ®è¨¡ª¨ ¨ ä« £ CF=1
;R11 17-04-2023 BAO OPTIMIZED BUFFERS, FREED UP 768 BYTES FOR CODE
;R09 -- 14-04-2003 DNS NOW EXEC DON'T FOLLOW TO PROGRAM'S DIR
;R08 05-12-2002 DNS FIX BUG WITH INCREMENT TASK ID AND OPEN *.EXE ERROR
;R07 05-12-2002 DNS FIX FOR EXECUTING IN CURRENT DIR WITHOUT PATH
;R06 02-12-2002 DNS FIX BUG WITH NULL-TERMINATED STRING
;R05 02-12-2002 DNS ADD APP_PATH TO THE PROGRAM PREFIX
;R04 26-11-2002 DNS TRY TO FIX EXEC WITH PATH
;R03 19-11-2002 DNS CHECK SUBFN. FOR FN. EXEC
;R02 24-05-1999 DNS FIX CREATE PSP AND
; MOVE EXEC STACK
; 14-05-1999 DNS DECREASE HEADER SIZE FOR EXE-FILE
;-------------------------------------------------------------------------------------------------------------------------
RELATIVE_DIR EQU 0
ABSOLUTE_DIR EQU 1
MACRO _mINCTASK
LD HL,TASK ;R08
INC (HL) ;R08
ENDM
;
MACRO _mDECTASK
LD HL,TASK ;R08
DEC (HL) ;R08
ENDM
;-------------------------------------------------------------------------------------------------------------------------
;;;
;TMP_CURDIR_AUTO EQU #FB00
; ­¥ ­ã¦­® ¥á«¨ SAVE_PATH_MACRO = 1
; TMP_CURDIR EQU #FD00
;///////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #40. ‚믮«­¨âì ä ©«.
;
; ¢å®¤: HL - 㪠§ â¥«ì ­  ¨¬ï ä ©« 
; B=0 - § £à㧨âì ¨ ¢ë¯®«­¨âì ¯à®£à ¬¬ã á ª®à®âª¨¬ ¨¬¥­¥¬ (¡¥§ ¯®«­®£® ¯ã⨠¤® ¯à®£à ¬¬ë)
; B=1 - § £à㧨âì ¨ ¢ë¯®«­¨âì ¯à®£à ¬¬ã á ¯®«­ë¬ ¯ãâñ¬ ¤® ¯à®£à ¬¬ë
; ¢ë室: A - ª®¤ § ¢¥à襭¨ï, ¥á«¨ CF=0
; ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
;---------------------------------------------------------------------
; ‡ £à㧨âì ¨ ¢ë¯®«­¨âì ¯à®£à ¬¬ã.
; äã­ª. #40, B=0.
;
; 1) Žâªà뢠¥â exe-ä ©« ­  ç⥭¨¥;
; 2) ‘ç¨â뢠¥â ¢ à ¡®çãî ®¡« áâì ¯à¥ä¨ªá exe-ä ©« ;
; 3) ‚뤥«ï¥â ¡«®ª ¯ ¬ïâ¨, âà¥¡ã¥¬ë© ¤«ï § £à㧪¨ ¢á¥£® ä ©«  ¨«¨ ¯¥à¢¨ç­®£®
; § £àã§ç¨ª , ¥á«¨ ¥£® à §¬¥à ­¥ à ¢¥­ ­ã«î;
; 4) ‘®åà ­ï¥â á⥪;
; 5) <20>®¤ª«îç ¥â áâà ­¨æë ¨§ ¢ë¤¥«¥­­®£® ¡«®ª ;
; 6) ‘âந⠯à¥ä¨ªá § ¯ã᪠ ¯à®£à ¬¬ë ¨ ãáâ ­ ¢«¨¢ ¥â ­  ­¥£® ॣ¨áâà IX;
; 7) ‘ç¨â뢠¥â ä ©« ¯®  ¤à¥áã 㪠§ ­­®¬ã ¢ ᬥ饭¨¨ 16 (€¤à¥á à á¯®«®¦¥­¨ï
; ª®¤  ¢ ¯ ¬ïâ¨);
; 8) ‡ ªà뢠¥â exe-ä ©«, ¥á«¨ íâ® ­¥ ¯¥à¢¨ç­ë© § £àã§ç¨ª;
; 9) “áâ ­ ¢«¨¢ ¥â á⥪ à ¢­ë¬ §­ ç¥­¨î ¨§ ᬥ饭¨ï 20 (€¤à¥á à á¯. á⥪ );
; 10) <20>¥à¥¤ ¥â ã¯à ¢«¥­¨¥ ¯®  ¤à¥áã 㪠§ ­­®¬ã ¢ ᬥ饭¨¨ 18 (€¤à¥á § ¯ã᪠);
;
; <20>à¥ä¨ªá § ¯ã᪠ ä ©« :
;
; -03 1 db ? ; „¥áªà¨¯â®à ä ©« , ¥á«¨ exe-ä ©« á ¯¥à¢¨ç­ë¬ § £àã§ç¨ª®¬
; -02 1 db ? ; ˆ¤¥­â¨ä¨ª â®à ¡«®ª  ¯ ¬ïâ¨
; -01 1 db ? ; “஢¥­ì ⥪ã饩 ¯à®£à ¬¬ë
; +00 1 db ? ; „«¨­  ª®¬-áâப¨
; +01 127 ds ? ; <20> à ¬¥âàë ª®¬-áâப¨, § ª ­ç¨¢ ¥âáï ­ã«¥¬
;///////////////////////////////////////////////////////////////////////
EXEC: LD (CMDLINE),HL
INC B ;R03
DEC B ;R03
JR Z,.VAR_1 ;R03
DEC B ;R03
JR Z,.VAR_2 ;R03
LD A,DSS_Error.sys.INVALID_FUNCTION ;R03
SCF ;R03
RET ;R03
;
.VAR_1: ;LD (CMDLINE),HL
CALL CHECKPATH ;CHECK FOR '\' - SHORT/FULL NAME
;LD HL,(CMDLINE)
JR C,EXEC0_SHORT
.VAR_2: CALL EXEC_1
LD A,DSS_Error.sys.FILE_NOT_FOUND
SCF
RET ; File not found - exit
; ¯à¨ ¢ë室¥ á ®è¨¡ª®©, ¢ ॣ¨áâॠ€ - ª®¤ ®è¨¡ª¨
EXEC_1: ;LD (CMDLINE),HL
LD HL,(CMDLINE)
LD A,FAT_ATTR.READ_ONLY
LD (OPEN_FN.TMP),A
CALL SetPath_GetName
RET C
; LD HL,TMPNAME
; LD DE,MASKARE
CALL MASK
RET C
CALL TST_EXT
RET C
_mINCTASK ;R08
CALL OPEN_FN.FILE
JR C,.Error
POP HL ; 㡨ࠥ¬ «¨è­¨©  ¤à¥á_¢®§¢à â _¢_¢ë§¢ ¢èãî_¯à®æ¥¤ãàã
JP EXEC02 ;R07 CONTINUE EXECUTING PROGRAM
.Error: _mDECTASK ;R08
AND A
RET
;JR NC,.noError
;_mDECTASK ;R08
;AND A
;RET
;
;.noError:
;POP HL ; 㡨ࠥ¬ «¨è­¨©  ¤à¥á_¢®§¢à â _¢_¢ë§¢ ¢èãî_¯à®æ¥¤ãàã
;JP EXEC02 ;R07 CONTINUE EXECUTING PROGRAM
;
;SHORT NAME
;TRY TO FIND IN CURRENT DIRECTORY
EXEC0_SHORT: ; ¥á«¨ ã¡à âì, â® ¡ã¤¥â ª ª ¢ linux - ª®à®âª®¥ ¨¬ï § ¯ã᪠¥â EXE ⮫쪮 ¨§ ¯à®¯¨á ­­ëå ¤¨à¥ªâ®à¨©,
;   ¥á«¨ ­ã¦­® § ¯ãáâ¨âì ä ©« ¨§ ⥪ã饩 ¤¨à¥ªâ®à¨¨, â® â ª: ".\run.exe"
CALL EXEC_1
RET C
;
;FILE NOT FOUND, SEARCHING IN PATH
; GET PATH AND ETC.
LD HL,ENVPATH
LD DE,ENVPAGE.ENVTEMP
LD B,high Dss.Environ.Get
CALL ENVIRON
LD HL,(CMDLINE)
LD DE,CORE_BUFFERS.EXEBUFF
COPYEXN: LD A,(HL)
LDI
OR A
JR NZ,COPYEXN
CALL FINDPATH
;[x] 1/10/2023
LD A,DSS_Error.sys.FILE_NOT_FOUND
RET C
;
LD HL,(CMDLINE)
JR EXEC.VAR_2
;
EXEC02: LD (EXE_FM),A
LD HL,CORE_BUFFERS.EXEBUFF
LD DE,_sEXE_HEADER.UnUsedPoint ; #0080 ;!#0200(512) ;R02
LD A,(EXE_FM)
CALL READ
JP C,ERREXE
LD IX,CORE_BUFFERS.EXEBUFF
LD HL,(CORE_BUFFERS.EXEBUFF.EXE_EXT)
LD DE,'E'+'X'*256
;AND A - ­¥ ­ã¦­®, ¥á«¨ ¡ë ¡ë« CF=1, â® çãâì ¢ëè¥ ¬ë ¡ë ã諨 ­  JP C,ERREXE
SBC HL,DE
LD A,DSS_Error.sys.INVALID_EXE
SCF
JP NZ,ERREXE
;
LD A,MINIMUM_EXE_VERSION
CP (IX + _sEXE_HEADER.VERSION)
LD A,DSS_Error.sys.UNKNOWN_EXE
JP C,ERREXE
;
LD DE,(CORE_BUFFERS.EXEBUFF.LOADER)
LD A,E
OR D
JP NZ,PRELOAD
; A=0
LD H,A
LD L,A
LD XL,A
LD XH,A
;
LD B,high Dss.Move_FP.FrEnd
LD A,(EXE_FM)
CALL MOVE_FP
LD DE,(CORE_BUFFERS.EXEBUFF.LD_ADDR)
LD A,D
AND #3F
LD D,A
ADD IX,DE
;!TEST
JR NC,.no_inc_hl
INC HL
;LD DE,#0000
;ADC HL,DE
;
.no_inc_hl: LD A,XH
SLA A
RL L
RL H
SLA A
RL L
RL H
OR XL
JR Z,.NOINK
INC HL
.NOINK: LD A,H
OR A
JP NZ,ERREXE0
LD B,L
LD HL,.RET_1
LD (_ret),HL
JP _TST_PROC
;
; ‡ ¯ã᪠¡¥§ § £àã§ç¨ª 
.RET_1: LD DE,(CORE_BUFFERS.EXEBUFF.LD_ADDR)
XOR A
LD H,A
LD L,A
SBC HL,DE
EX DE,HL ; de=ç¨á«® ç¨â. ¡ ©â
LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) ; ¡ãä¥à
LD A,(EXE_FM) ; ¤¥áªà. ä ©« 
CALL READ ; ç⥭¨¥ ¨§ ä ©« 
LD A,(EXE_FM) ; ¤¥áªà. ä ©« 
CALL CLOSE_FN ; § ªàëâì ä ©«
;
JP _TST_PROC_2
;
RETFAR: LD B,DSS_Error.sys.UNEXPECTED_APP_TRMN
JP LEAVE ; § ¢¥àè¨âì ¯à®£à ¬¬ã (¯à®æ¥áá)
;-------------------------------------------------
; …᫨ à áè. ä ©«  ­¥ § ¤ ­®, § ¤ âì "exe".
; …᫨ à áè. ä ©«  § ¤ ­®, áà ¢­¨âì ¥£® á "exe".
;-------------------------------------------------
TST_EXT: LD HL,EXE_EXT ; "EXE"
LD DE,MASKARE+8
LD B,3
LD A,(DE)
CP ' '
JR NZ,.loop ; § ¤ ­® à áè.
LDI
LDI
LDI
XOR A
RET
; áà ¢­¨âì à áè. á "EXE"
.loop: LD A,(DE)
CP (HL)
SCF
RET NZ ; ­¥ ᮢ¯ ¤ ¥â
INC HL
INC DE
DJNZ .loop
XOR A ; Ok
RET
;
ERREXE0: LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY
ERREXE: PUSH AF
LD A,(EXE_FM)
CALL CLOSE_FN
_mDECTASK
POP AF
RET
;!TODO áà ¢­¨âì á EXEC02
PRELOAD: EX DE,HL
LD DE,(CORE_BUFFERS.EXEBUFF.LD_ADDR)
LD A,D
AND #3F
LD D,A
ADD HL,DE
XOR A
SLA H
RLA
SLA H
RLA
LD B,A
LD A,H
OR L
JR Z,NOINK2
INC B
NOINK2: LD HL,_RET_2
LD (_ret),HL
JR _TST_PROC
;
; ‡ ¯ãáª á § £àã§ç¨ª®¬
_RET_2: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) ; ¡ãä¥à
LD DE,(CORE_BUFFERS.EXEBUFF.LOADER) ; ç¨á«® ç¨â. ¡ ©â
LD A,(EXE_FM) ; ¤¥áªà. ä ©« 
CALL READ ; ç⥭¨¥ ¨§ ä ©« 
JP _TST_PROC_2
;-------------------------------------------------------------------;[ ]
_TST_PROC: CALL GETMEM
JP C,ERREXE0
LD (EXE_MEM),A
EXX
POP DE ;á­¨¬ ¥¬ á® á⥪   ¤à¥á ¢®§¢à â 
LD HL,#0000
ADD HL,SP
LD SP,(EXSTACK)
; ! „ «¥¥ á⥪ ¢ ­ã«¥¢®© áâà ­¨æ¥! BIOS ¨ ­¥ DSS-MAIN ­¥ ¢ë§ë¢ âì
PUSH HL ; +2 EXSTACK size for 1 task
PUSH DE ; +2
;
IN A,(SLOT3)
LD D,A
IN A,(SLOT2)
LD E,A
IN A,(SLOT1)
PUSH DE ; +2
PUSH AF ; +2
LD (EXSTACK),SP
LD SP,HL
; ;
EXX
;
;!TEST 27/03/2024
LD DE,RAMMAP+3
LD A,(EXE_MEM)
LD BC,4*256 + BIOS.GetMemPage
.mem_loop: PUSH AF
PUSH BC
DEC B
RST ToBIOS
LD (DE),A
DEC DE
POP BC
POP AF
DJNZ .mem_loop
;
; LD DE,RAMMAP
; ;
; LD A,(EXE_MEM)
; LD BC,0*256 + BIOS.GetMemPage
; RST ToBIOS
; LD (DE),A
; INC DE
; ;
; LD A,(EXE_MEM)
; LD BC,1*256 + BIOS.GetMemPage
; RST ToBIOS
; LD (DE),A
; INC DE
; ;
; LD A,(EXE_MEM)
; LD BC,2*256 + BIOS.GetMemPage
; RST ToBIOS
; LD (DE),A
; INC DE
; ;
; LD A,(EXE_MEM)
; LD BC,3*256 + BIOS.GetMemPage
; RST ToBIOS
; LD (DE),A
;
;
LD HL,(CMDLINE)
LD DE,CORE_BUFFERS.BUFFER+1
CALL SCOPYS
LD A,#80 ;!HARDCODE cmd line size
SUB B
LD (CORE_BUFFERS.BUFFER),A
;
LD SP,CORE_BUFFERS.EXEBUFF + _sEXE_HEADER ;R02
; ! „ «¥¥ á⥪ ¢ ­ã«¥¢®© áâà ­¨æ¥! BIOS ¨ ­¥ DSS-MAIN ­¥ ¢ë§ë¢ âì
LD A,SHARED_PAGE
OUT (SLOT1),A
OUT (SLOT2),A
OUT (SLOT3),A
LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR)
LD DE,RAMMAP
LD A,H
AND #C0
;!TEST
CP #80
JR Z,FR8000
JR NC,FRC000
;
FR4000: LD A,(DE)
OUT (SLOT1),A
INC DE
FR8000: LD A,(DE)
OUT (SLOT2),A
INC DE
FRC000: LD A,(DE)
OUT (SLOT3),A
CALL M_PSP
;
LD HL,(CORE_BUFFERS.EXEBUFF.OFFCOD2)
LD IX,(CORE_BUFFERS.EXEBUFF.OFFCOD1)
LD B,high Dss.Move_FP.FrStart
LD A,(EXE_FM)
CALL MOVE_FP
;
LD SP,#403F ;R02 ;!HARDCODE STACK before start EXE. “áâ ­ ¢«¨¢ ¥âáï ª®£¤  ¢®âª­ãâë SHARED_PAGE
_ret+1: JP 0 ;EXEC02.RET1 ¨«¨ _RET_2
_TST_PROC_2: LD SP,(CORE_BUFFERS.EXEBUFF.SP_REG)
LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR)
LD DE,#0080 ;!HARDCODE CLP_Buffer
XOR A
SBC HL,DE
EX DE,HL
LD XH,D
LD XL,E
LD HL,(CORE_BUFFERS.EXEBUFF.PC_REG)
LD DE,RETFAR ;  ¤à¥á ¯/¯ "­¥®¦¨¤ ­­®¥ § ¢¥à襭¨¥ ¯à®æ¥áá "
PUSH DE
PUSH HL
;!TEST Current Dir ;[x] 15/10/23
PUSH IX
LD HL,CORE_BUFFERS.CurrentPath
LD A,(CORE_BUFFERS.EXEBUFF.VERSION)
;
OR A
JR NZ,.set_path
CALL DIR_PATH_CHANGE.FullCurrent
LD HL,CORE_BUFFERS.CurrentPath
.set_path: CALL CHDIR_FN
POP IX
;
RET
;-----------------------------------------------------------------------
; ! ¢ë§ë¢ ¥âáï ª®£¤  á⥪ ¢ ­ã«¥¢®© áâà ­¨æ¥!
M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR)
DEC H
LD D,H
LD E,L
INC DE
LD BC,#00FF ;!HARDCODE
LD (HL),B
LDIR
EX DE,HL
DEC H
LD DE,#0080
ADD HL,DE
EX DE,HL
LD XH,D
LD XL,E
LD HL,CORE_BUFFERS.BUFFER
LD C,(HL)
INC C
LDIR
EX DE,HL ;R06
LD (HL),B
LD A,(TASK)
LD (IX-1),A
LD A,(EXE_MEM)
LD (IX-2),A
LD A,(EXE_FM)
LD (IX-3),A
;R05
INC HL
LD (HL),B
INC HL
;!FIXIT âãâ ¢®ááâ ­ ¢«¨¢ âì ¯à ¢¨«ì­ë© ª â «®£
CALL CURDISK
ADD A,'A'
LD (HL),A
INC HL
LD A,':'
LD (HL),A
INC HL
PUSH HL
CALL CURRDIR
;
POP HL
XOR A
LD BC,#0100 ;!FIXIT ­¥â ¯à¨¢ï§ª¨ ª CurrentDirectory.DEPTH
CPIR ;!FIXIT ­¥â ¯à®¢¥àª¨ ­  ¢ë室 ¯® BC=0
DEC HL
DEC HL
LD A,'\' ;
CP (HL)
INC HL
JR Z,.YP_ESLA
LD (HL),A
INC HL
.YP_ESLA: EX DE,HL
LD HL,TMPNAME
.loop: LD A,(HL)
LDI
CP ' '+1
JR NC,.loop
DEC DE
XOR A
LD (DE),A
LD (APPINFO.LAST_PSP_PTR),IX
;
RET
;
SCOPYS: LD BC,#80*256 + ' '+1 ;!HARDCODE cmd line size
.loop: LD A,(HL)
CP C
JR C,.copy
INC HL
DJNZ .loop
XOR A
LD (DE),A
LD B,#80
RET
;
.copy: LD BC,#80*256 + ' ' ;!HARDCODE cmd line size
.loop2: LD A,(HL)
LD (DE),A
INC HL
INC DE
CP C
RET C
DJNZ .loop2
RET
;---------------------------------------------------------------------
ENVPATH: DB "PATH=",0
EXE_EXT: DB "EXE"
TASK: DB #01 ; ã஢¥­ì ⥪ã饩 ¯à®£à ¬¬ë
;
RAMMAP: DB #00,#00,#00,#00
ErrorLevel: DB #00 ; ª®¤ § ¢¥à襭¨ï ¯à®£à ¬¬ë (¯à®æ¥áá )
EXE_FM: DB #00 ; ¤¥áªà. ä ©« 
EXE_MEM: DB #00 ; ¨¤¥­â¨ä¨ª â®à ¡«®ª  ¯ ¬ïâ¨
CMDLINE: DW #0000
EXSTACK: DW CORE_BUFFERS.XSTACK.Spoint ;  ¤à¥á á⥪ 
;/////////////////////////////////////////////////////////////////////
;/////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #41. ‡ ¢¥àè¨âì ¯à®£à ¬¬ã (¯à®æ¥áá).
;
; ¢å®¤: B - ª®¤ § ¢¥à襭¨ï
; ¢ë室: A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
;
; ‚ë室 ¨§ EXE-ä ©« :
;
; 1) Žá¢®¡®¦¤ îâáï ¢á¥ ¡«®ª¨ ¯ ¬ï⨠ª®â®àë¥ ¢ë¤¥«ï«¨áì ¤ ­­®¬ã ¯à¨«®¦¥­¨î.
; 2) ‡ ªà뢠îâáï ¢á¥ ä ©«ë ®âªàëâë¥ ¯à¨«®¦¥­¨¥¬
; 3) ‚®ááâ ­ ¢«¨¢ îâáï áâà ­¨æë ª®â®àë¥ ¡ë«¨ ¯®¤ª«îç¥­ë ¤® § ¯ã᪠ EXE-ä ©« .
; 4) ‚ᯮ¬¨­ ¥âáï á⥪.
; 5) ॣ¨áâà A ¯®¬¥é ¥âáï ª®¤ ¢®§¢à â  ¨ ¢ë¯®«­ï¥âáï RET.
;
;/////////////////////////////////////////////////////////////////////
LEAVE: LD A,R
PUSH AF ; INT ON/OFF
DI
;
LD A,B
LD (ErrorLevel),A
CALL FREE_PROCESS_MEMORY
;[x] 10/12/23 close EXE FMs
CALL FREE_PROCESS_FMs
;
_mDECTASK
;
POP DE ; INT ON/OFF
LD SP,(EXSTACK)
; âãâ á⥪ ¢ ­ã«¥¢®© áâà ­¨æ¥!
POP AF ; -2 EXSTACK size for 1 task
POP HL ; -2
OUT (SLOT1),A
LD A,L
OUT (SLOT2),A
LD A,H
OUT (SLOT3),A
;
LD A,E ; INT ON/OFF
POP DE ; -2
POP HL ; -2
LD (EXSTACK),SP
LD SP,HL
;
;!TEST
AND %0000'0100 ; PO/PE flag
JR Z,.no_ei
EI
.no_ei: ;
EX DE,HL
LD A,(ErrorLevel)
;R12
CP DSS_Error.sys.UNEXPECTED_APP_TRMN
JR Z,.error_exit
CP DSS_Error.sys.USER_ABORT
JR NZ,.norm_exit
.error_exit: SCF
JP (HL)
;
.norm_exit: AND A
JP (HL)
;/////////////////////////////////////////////////////////////////////
;/////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #42. <20>®«ãç¨âì ª®¤ § ¢¥à襭¨ï ¯à®£à ¬¬ë.
;
; ¢å®¤: ­¥â
; ¢ë室: A - ª®¤ § ¢¥à襭¨ï
;/////////////////////////////////////////////////////////////////////
GET_ERR: LD A,(ErrorLevel)
AND A
RET
;/////////////////////////////////////////////////////////////////////
;-----------------------------------------------------------------------
FREE_PROCESS_MEMORY:
;LD HL,MEMTAB
LD HL,CORE_BUFFERS.MemoryTable ; ¬ áᨢ ᯨ᪠ ¢ë¤¥«. áâà ­¨æ
LD BC,256 ;!HARDCODE à §¬¥à ¡«®ª  áâà ­¨æ އ“
.loop: LD A,(TASK)
CPIR
RET NZ
PUSH HL
PUSH BC
DEC HL
AND A
;LD DE,MEMTAB
LD DE,CORE_BUFFERS.MemoryTable ; ¬ áᨢ ᯨ᪠ ¢ë¤¥«. áâà ­¨æ
SBC HL,DE
LD A,L
CALL RETMEM ; ®á¢®¡. ¡«®ª ¯ ¬ïâ¨
POP BC
POP HL
JP .loop
;-----------------------------------------------------------------------
;-----------------------------------------------------------------------
FREE_PROCESS_FMs:
LD IY,CORE_BUFFERS.FM_BUF - CORE_BUFFERS.FM_BUF.Size
LD DE,CORE_BUFFERS.FM_BUF.Size
LD B,FMCOUNT+1
LD A,(TASK)
.loop: ADD IY,DE
CP (IY+_sFM.TASK_NUM)
JR NZ,.next
; close fm
PUSH AF
XOR A
OR (IY+_sFM.TASK_NUM)
JR Z,.skip
PUSH IY
PUSH DE
LD A,FMCOUNT+1
SUB B
PUSH BC
CALL CLOSE_FN
POP BC
POP DE
POP IY
.skip: POP AF
;
.next: DJNZ .loop
RET
;
;-----------------------------------------------------------------------
;-----------------------------------------------------------------------
CHECKPATH: ; !TODO ᤥ« âì ¯à®¢¥àªã ­  ª®«¨ç¥á⢮ 横«®¢
LD A,(HL)
INC HL
CP '\'
RET Z
; CP '/' ;ALT SLASH
; RET Z
CP " "+1
JR NC,CHECKPATH
RET
;-----------------------------------------------------------------------
;-----------------------------------------------------------------------
FINDPATH:
SET_PAGE_X ENVPAGE
PUSH AF
;!TEST
;CALL CURRDSK_FN
;ADD A,"A"
;LD HL,TMP_CURDIR
;LD (HL),A
;INC HL
;LD A,":"
;LD (HL),A
;INC HL
;CALL CURRDIR_FN
;
CALL .MAKE_PATH_ARRAY
LD HL,ENVPAGE.PATH_PNT_ARRAY
.NEXTPATHI:
LD E,(HL)
INC HL
LD D,(HL)
INC HL
BIT ABSOLUTE_DIR,(HL)
INC HL
PUSH HL
PUSH BC
EX DE,HL
CALL Z,.GOTO_CURDIR
CALL NZ,CHDIR
JR C,.BADPATH
LD HL,CORE_BUFFERS.EXEBUFF
CALL MASK.name
JR C,.BADPATH
CALL TST_EXT
JR C,.BADPATH
CALL SEARCH.File
.BADPATH:
POP BC
POP HL
JR NC,.PATHFOUND
DJNZ .NEXTPATHI
SCF
.PATHFOUND:
POP BC
LD A,B
OUT (SLOT3),A
LD A,DSS_Error.sys.PATH_NOT_FOUND
RET
.GOTO_CURDIR:
PUSH AF
PUSH HL
LD HL,CORE_BUFFERS.CurrentDirectory
CALL CHDIR
POP HL
POP AF
RET
.MAKE_PATH_ARRAY:
LD HL,ENVPAGE.PATH_PNT_ARRAY-1 ;R04 -1
LD DE,ENVPAGE.ENVTEMP-1
LD B,#00
.NEXTAR:
LD (HL),C ;R04
INC HL ;R04
XOR A
LD (DE),A
LD C,A
INC DE
LD (HL),E
INC HL
LD (HL),D
INC HL
;R04 LD (HL),C
;R04 INC HL
INC B
.NEXTRT:
LD A,(DE)
CP '\'
JR NZ,.NEXTCH
.NEXTDR:
SET ABSOLUTE_DIR,C
.NEXTRL:
;SET RELATIVE_DIR,C ;!TODO ????
.NEXTCH:
LD A,(DE)
CP ";"
JR Z,.NEXTAR
INC DE
; CP "."
; JR Z,NEXTRL
CP ":"
JR Z,.NEXTRT
OR A
JR NZ,.NEXTCH
LD (HL),C ;R04
INC HL ;R04
LD (HL),A
INC HL
LD (HL),A
RET
;-----------------------------------------------------------------------
;R11 \\\\\\\\\\\\\\\\\\\\\\\\\\\\
;;
; EXEBUFF:
; DB "EXE"
; DB #00
; OFFCOD1 DW #0000
; OFFCOD2 DW #0000
; LOADER DW #0000
; DW #0000
; DW #0000
; DW #0000
; LD_ADDR DW #0000
; PC_REG DW #0000
; SP_REG DW #0000
; BLOCK 512-($-EXEBUFF),0
; ;(!!!HERE STACK FOR EXEC!!!)
; BLOCK 255,0
; XSTACK DB #00
;R11 ////////////////////////////
;

121
DSS/API/Find.asm Normal file
View File

@ -0,0 +1,121 @@
////////////////////////////////////////////////////////////////////////
;‚室­ë¥ §­ ç¥­¨ï:
; C - #19
; HL - 㪠§ â¥«ì ­  ä ©«®¢ãî ᯥæ¨ä¨ª æ¨î
; DE - à ¡®ç¨© ¡ãä¥à 44 ¡ ©â , ¥á«¨ B=0, ¨­ ç¥ 256 ¡ ©â
; A -  âਡãâë, ¨á¯®«ì§ã¥¬ë¥ ¯à¨ ¯®¨áª¥
; B = #00 - ¨¬ï ­ ©¤¥­­®£® ä ©«  ¢ ä®à¬ â¥ 11 ¡ ©â "FilenameExt"
; B = #01 - ¨¬ï ­ ©¤¥­­®£® ä ©«  ¢ ä®à¬ â¥ DOS "filename.ext",0
; ¯®¨áª ¡¥§ ®£à ­¨ç¥­¨¥ ­  à §¬¥à ª â «®£ :
; !TODO B = #02 - ¨¬ï ­ ©¤¥­­®£® ä ©«  ¢ ä®à¬ â¥ DOS + LFN
; !TODO B = #80 - ¨¬ï ­ ©¤¥­­®£® ä ©«  ¢ ä®à¬ â¥ 11 ¡ ©â "FilenameExt"
; !TODO B = #81 - ¨¬ï ­ ©¤¥­­®£® ä ©«  ¢ ä®à¬ â¥ DOS "filename.ext",0
;‚ë室­ë¥ §­ ç¥­¨ï:
; A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
////////////////////////////////////////////////////////////////////////
F_FIRST_FN: CALL F_FIRST.INIT_VARS
PUSH HL
;!TEST Current Dir ;[x] 15/10/23
CALL DIR_PATH_CHECK
POP HL
RET C
;
JR F_FIRST.begin
;
F_FIRST: CALL .INIT_VARS
.begin: CALL SetPath_GetName
;CALL LOADDIR
RET C
CALL MASK
RET C
LD A,(.SEARCH_ATTRIBUT)
CALL SEARCH.Custom
RET C
LD HL,MASKARE
.DTABUF+1: LD DE,0
LD BC,FAT_DIRECTORY_RECORD.ATTRIBUT ; ª®¯¨à㥬 .NAME ¨ .EXT
LDIR
.SEARCH_ATTRIBUT+1:
LD A,0 ; DSS_FCB_MAIN.SEARCH_ATTRIBUT
LD (DE),A
.FIND_S: INC DE
;!TODO «ãçè¥ âã⠨ᯮ«ì§®¢ âì ª ª ¢ record index ¤«ï ¯¥à¥¡®à  ª â «®£  > #4000 bytes
LD BC,FAT_DIRECTORY_RECORD
ADD IX,BC
LD (F_NEXT.CURHND),IX
LD HL,HANDBUF + FAT_DIRECTORY_RECORD.RESERVED_NT
LD BC,HANDBUF.SIZE - FAT_DIRECTORY_RECORD.RESERVED_NT
LDIR
LD A,(HANDBUF + FAT_DIRECTORY_RECORD.ATTRIBUT)
LD (DE),A
INC DE
LD HL,HANDBUF
.FNDMODE+1: LD A,0
OR A
JR NZ,.FIND_M2
LD BC,11 ;!HARDCODE
LDIR
.exit: LD A,F_NEXT.NO_NEXT.NO
LD (F_NEXT.NO_NEXT),A
XOR A
RET
.FIND_M2: ;!TODO LFN
;CP 2
;CALL NC,GetName_LFN
;CALL C,GetName
;
CALL GetName
JR .exit
;
.INIT_VARS: LD (.SEARCH_ATTRIBUT),A
LD (.DTABUF),DE
LD A,B
LD (.FNDMODE),A
RET
////////////////////////////////////////////////////////////////////////
;
;
////////////////////////////////////////////////////////////////////////
F_NEXT:
.NO_NEXT.YES EQU 0
.NO_NEXT.NO EQU #FF
.NO_NEXT+1:
LD A,0
OR A
LD A,DSS_Error.sys.INVALID_ACCESS
SCF
RET Z
LD (F_FIRST.DTABUF),DE
EX DE,HL
LD DE,MASKARE
LD BC,11 ;!HARDCODE
LDIR
XOR A ; F_NEXT.NO_NEXT.YES
LD (F_NEXT.NO_NEXT),A
LD A,(HL)
PUSH HL
CALL .NSEARCH
POP DE
RET C
JP F_FIRST.FIND_S
.NSEARCH:
EX AF,AF'
SET_PAGE_X DIRPAGE
;PUSH AF
EX AF,AF'
CPL
LD C,A
;!TEST 9/11/23 record index
; EXX
; LD DE,0
; EXX
;
.CURHND+2:
LD IX,0
LD A,XH
OR XL
JP Z,SEARCH.error_too_many_files
JP SEARCH.loop
;

10
DSS/API/FreeMem.asm Normal file
View File

@ -0,0 +1,10 @@
//////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #3C. ˆ­ä®à¬ æ¨ï ® ¯ ¬ïâ¨.
;
; ¢å®¤: ­¥â
; ¢ë室: HL - ®¡é¥¥ ª®«-¢® áâà ­¨æ
; BC - ª®«-¢® ᢮¡. áâà ­¨æ
//////////////////////////////////////////////////////////////////////
FREEMEM: LD C,BIOS.GetMemSize
JP ToBIOS
;

31
DSS/API/GSwitch.asm Normal file
View File

@ -0,0 +1,31 @@
//////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #43. ‚뤥«¨âì ¯ à ¬¥âà ª®¬ ­¤­®© áâப¨.
;
; ¢å®¤: HL - 㪠§ â¥«ì ª®¬ ­¤­®© áâப¨
; DE - ¡ãä¥à ¤«ï ¢ë¤¥«. ¯ à ¬¥âà 
; ¢ë室: HL - 㪠§ â¥«ì ­  á«¥¤. ¯ à ¬¥âà ª®¬-áâப¨
; CF=0 - ª®­¥æ áâப¨ ­¥ ¤®á⨣­ãâ (¥áâì ¤à㣨¥ ¯ à ¬¥âàë)
; CF=1 - ª®­¥æ áâப¨ (¢ ¡ãä¥à ¯¥à¥­¥áñ­ ¯®á«¥¤­¨© ¯ à ¬¥âà ¨«¨ ­®«ì)
;
;ENTRY: HL - COMMAND LINE
; DE - SWITCH BUFFER
;EXIT: BUFFER
//////////////////////////////////////////////////////////////////////
GSWITCH: XOR A
LD (DE),A
.loop1: LD A,(HL)
INC HL
CP " "
RET C
JR Z,.loop1
.loop2: LD (DE),A
LD A,(HL)
INC HL
INC DE
CP " "+1
JR NC,.loop2
CP " "
LD A,0
LD (DE),A
RET
;

24
DSS/API/GetDateTime.asm Normal file
View File

@ -0,0 +1,24 @@
////////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #17. ˆ­ä®à¬ æ¨ï ® ¤ â¥ ¨ ¢à¥¬¥­¨ ä ©« .
;
; ¢å®¤: A - ¤¥áªà¨¯â®à ä ©« 
; ¢ë室: D - ¤¥­ì
; E - ¬¥áïæ
; IX - £®¤
; H - ç á
; L - ¬¨­ãâë
; B - ᥪ㭤ë
; A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
////////////////////////////////////////////////////////////////////////
GET_D_T:
CALL SET_FM
RET C
; ¢à¥¬ï/¤ âã ¨§ áâàãªâãàë ¤¥áªà.
LD E,(IY+_sFM.FS_REC.TIME) ; ¢à¥¬ï
LD D,(IY+_sFM.FS_REC.TIME+1) ;
LD C,(IY+_sFM.FS_REC.DATE) ; ¤ â 
LD B,(IY+_sFM.FS_REC.DATE+1) ;
CALL RMKTIME ; à áª®¤¨à®¢ âì ¢à¥¬ï/¤ âã
AND A
RET
;

19
DSS/API/GetMem.asm Normal file
View File

@ -0,0 +1,19 @@
//////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #3D. ‚뤥«¥­¨¥ ¡«®ª  ¯ ¬ïâ¨.
;
; ¢å®¤: B - à §¬¥à ¡«®ª  ¢ áâà ­¨æ å ¯® 16kB
; ¢ë室: A - ¨¤¥­â¨ä¨ª â®à ¡«®ª  ¯ ¬ïâ¨, ¥á«¨ CF=0
; A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
//////////////////////////////////////////////////////////////////////
GETMEM: LD C,BIOS.GetMem
RST ToBIOS
LD E,A
LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY
RET C
LD D,#00
LD HL,CORE_BUFFERS.MemoryTable ; ¬ áᨢ ᯨ᪠ ¢ë¤¥«. áâà ­¨æ
ADD HL,DE
LD A,(TASK) ; ã஢¥­ì ⥪ã饩 ¯à®£à ¬¬ë
LD (HL),A
LD A,E
RET

14
DSS/API/GetVMod.asm Normal file
View File

@ -0,0 +1,14 @@
;///////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #51. <20>®«ãç¨âì ⥪ã騩 ०¨¬ íªà ­ .
;
; ¢å®¤: ­¥â
; ¢ë室: A - ⥪ã騩 ०¨¬ íªà ­ 
; B - áâà ­¨æ  íªà ­  0/1
;///////////////////////////////////////////////////////////////////////
GETVMOD:
IN A,(SCREEN_SWITCH)
LD B,A
LD A,(VMODE)
AND A
RET
;///////////////////////////////////////////////////////////////////////

14
DSS/API/Lib_Sub.asm Normal file
View File

@ -0,0 +1,14 @@
;[ ] 11/02/2024 - ”γ­<CEB3>ζ¨ο α ―®―®«­ο¥¬λ¬¨ ―®¤δγ­<CEB3>ζ¨ο¬¨)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; B = 1 ‚λ§®Ά δγ­<CEB3>樨 SETUP_CURSORS ¤«ο Ά®ααβ ­®Ά«¥­¨ο α¨α⥬­λε θΰ¨δβ®Ά DSS ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LIB_SUB:
DJNZ .B_2
; func B = 1
JP SETUP_CURSORS
;
.B_2: ; func B > 1 or 0
SCF
RET
;
;

10
DSS/API/Locate.asm Normal file
View File

@ -0,0 +1,10 @@
;///////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #52. “áâ ­®¢¨âì ¯®«®¦¥­¨¥ ªãàá®à .
;
; ¢å®¤: D - áâப  ªãàá®à 
; E - ª®«®­ª  ªãàá®à 
; ¢ë室: ­¥â
;///////////////////////////////////////////////////////////////////////
LOCATE: LD C,BIOS.LP_SET_PLACE
JP ToBIOS
;///////////////////////////////////////////////////////////////////////

197
DSS/API/MkDir.asm Normal file
View File

@ -0,0 +1,197 @@
; [x] fat32 ;!TEST
////////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #1B. ‘®§¤ ­¨¥ ª â «®£ .
;
; ¢å®¤: HL - 㪠§ â¥«ì ­  ¨¬ï ª â «®£ 
; ¢ë室: A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
;
; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0
////////////////////////////////////////////////////////////////////////
MKDIR:
;error
.DIR_EXISTS: LD A,DSS_Error.sys.DIR_EXISTS
CCF
RET
;
; Entry point ;!TEST Current Dir ;[x] 15/10/23
.B: PUSH HL
CALL DIR_PATH_CHECK
POP HL
RET C
CALL .START
PUSH AF
LD HL,CORE_BUFFERS.CurrentDirectory
CALL CHDIR
POP AF
RET
;
.START: CALL SetPath_GetName ; â¥áâ ­  ¤®¯ãáâ. ¨¬ï ¨ ­ áâà. ­  ¤¨áª
RET C
; [ ] 26/06/2024
CALL CHECK_64kb_CLUSTER
RET C
;
CALL MASK
RET C
;!TEST optimization à ­¥¥ SetPath_GetName 㦥 § £à㧨« ¤¨à¥ªâ®à¨î
;CALL LOADDIR ; ¯à®ç¨â âì ᯨ᮪ ª â «®£ 
;
CALL SEARCH.Dir ; ¯®¨áª § ¯¨á¨ ª â «®£  ¢ ᯨ᪥ ¤¨áª 
; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024
; LD A,DSS_Error.sys.DIR_EXISTS
; CCF
; RET C ; ª â «®£ ­ ©¤¥­
JR NC,.DIR_EXISTS
CP DSS_Error.sys.FILE_NOT_FOUND
SCF
RET NZ
;
CALL G_CLUST
RET C
; fat32
PUSH HL ; ¬« ¤è¨© ­®¬¥à ᥪâ®à 
EXX
PUSH HL ; áâ à訩 ­®¬¥à ᥪâ®à 
EXX
;
XOR A ; 㬥­ìè¨âì
CALL SET_NEW_FREE_CLUSTERS ; [ ] free clusters for FSInfo
;
CALL WRITE_TO_FAT ; § ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à 
CALL WRITE_FAT_TABLE ; ¯®¤ª«. ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª
LD HL,MASKARE
LD DE,HANDBUF
LD BC,11
LDIR
EX DE,HL
LD A,FAT_ATTR.DIRECTORY ;  âਡãâ § ¯¨á¨ ª â «®£ 
; FAT_DIRECTORY_RECORD.ATTRIBUT
LD (HL),A
INC HL
LD BC,#0800 ; b=áç¥â稪
;
.loop1: LD (HL),C
INC HL
DJNZ .loop1
; FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H
; fat32 § ¯¨áì áâ à襣® ­®¬¥à  ª« áâ¥à  .FIRST_CLUSTER_H
POP DE
PUSH DE ; áâ à訩 ­®¬¥à ᥪâ®à 
LD (HL),E
INC HL
LD (HL),D
INC HL
;
CALL WRITE_DATE_TIME_TO_DIRECTORY_RECORD
; § ¯¨áì ¬« ¤è¥£® ­®¬¥à  ª« áâ¥à  .FIRST_CLUSTER_L
POP BC ; áâ à訩 ­®¬¥à ᥪâ®à 
POP DE ; ¬« ¤è¨© ­®¬¥à ᥪâ®à 
PUSH DE
PUSH BC
; FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L
LD (HL),E
INC HL
LD (HL),D
INC HL
; FAT_DIRECTORY_RECORD.F_SIZE
LD BC,#0400 ; b=áç¥â稪
.loop2: LD (HL),C
INC HL
DJNZ .loop2
;
CALL WRT_HND ; ᪮¯¨à. ­®¢ãî § ¯¨áì ¢ ᯨ᮪ ¤¨áª  (ª â «®£ )
;CALL SAVEDIR ; ¨ á¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª
;
; á®§¤ ñ¬ á«ã¦¥¡­ë¥ ª â «®£¨ "." ¨ ".." ¢ á®§¤ ­­®¬ ª â «®£¥
; Š€’€‹Žƒ "."
LD HL,CORE_BUFFERS.SECTOR_BUFFER ; ¡ãä¥à
LD (HL),"." ; § ¯¨áì ⥪. ª â «®£ 
LD BC,10*256 + ' ' ; !HARDCODE b=áç¥â稪, c=¯à®¡¥«
;
.loop3: INC HL
LD (HL),C
DJNZ .loop3
; ᪮¯¨à®¢ âì ¡ ©âë 11..31 FAT_DIRECTORY_RECORD
INC HL
LD DE,HANDBUF+FAT_DIRECTORY_RECORD.ATTRIBUT ; ï祩ª   âਡã⮢ ä ©« 
EX DE,HL
LD BC,21 ; !HARDCODE
LDIR
; Š€’€‹Žƒ ".."
EX DE,HL
LD (HL),"." ; § ¯¨áì த¨â. ª â «®£ 
INC HL
LD (HL),"."
LD BC,9*256 + ' ' ; b=áç¥â稪, c=¯à®¡¥«
.loop4: INC HL
LD (HL),C
DJNZ .loop4
;
INC HL
SET_PAGE_X DIRPAGE
PUSH AF
;
LD DE,DIRPAGE.buffer + FAT_DIRECTORY_RECORD.ATTRIBUT ;  âਡãâë § ¯¨á¨
;
LD A,(DIRPAGE.buffer)
CP "."
JR Z,.copy_dir_record
;
;LD IX,HANDBUF
XOR A
LD (HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L),A
LD (HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1),A
LD (HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H),A
LD (HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1),A
LD DE,HANDBUF + FAT_DIRECTORY_RECORD.ATTRIBUT ; ï祩ª   âਡã⮢ ä ©« 
.copy_dir_record:
EX DE,HL
LD BC,HANDBUF.SIZE - FAT_DIRECTORY_RECORD.ATTRIBUT ; 21
LDIR
POP AF
OUT (SLOT3),A
;
EX DE,HL
LD D,H
LD E,L
INC DE
LD (HL),0
LD BC,512-65 ;!HARDCODE ;!FIXIT ; [ ] sector size
LDIR
;
POP HL ; áâ à訩 ­®¬¥à ᥪâ®à 
EXX
POP HL ; ¬« ¤è¨© ­®¬¥à ᥪâ®à 
CALL CLUSTER_TO_SECTOR
LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster) ; ᥪâ®à®¢ ­  ª« áâ¥à
.MKD12: PUSH AF
PUSH HL ; áâ. à §àï¤
PUSH IX ; ­®¬¥à «®£. ᥪâ®à 
;
CALL WRITE_SECTOR
; !FIXIT ­¥â ¯à®¢¥àª¨ ­  ®è¨¡ªã
;
LD HL,CORE_BUFFERS.SECTOR_BUFFER
; [x] optimization
LD A,(HL)
OR A
JR Z,.skip_clean
;
LD DE,CORE_BUFFERS.SECTOR_BUFFER+1
LD BC,511 ;!HARDCODE ;!FIXIT ; [ ] sector size
LD (HL),0
LDIR
.skip_clean: ;
POP IX
POP HL
INC IX
LD A,XH
OR XL
JR NZ,.MKD11
INC HL
.MKD11 POP AF
DEC A
JR NZ,.MKD12
AND A
RET
;

41
DSS/API/Move_FP.asm Normal file
View File

@ -0,0 +1,41 @@
; HL:IX - OFFSET POINTER
; A - FILE MANIPULATOR
MOVE_FP: CALL SET_FM
RET C
INC B
DJNZ .B_1
;from Start File
; B=0
.F_start: LD C,B
LD D,B
LD E,B
JP .DO
;
.B_1: DJNZ .B_2
;from Current Position
.F_current: LD C,(IY+_sFM.F_POSITION)
LD B,(IY+_sFM.F_POSITION+1)
LD E,(IY+_sFM.F_POSITION+2)
LD D,(IY+_sFM.F_POSITION+3)
.DO: ADD IX,BC
ADC HL,DE
LD D,XH
LD E,XL
LD (IY+_sFM.F_POSITION),E
LD (IY+_sFM.F_POSITION+1),D
LD (IY+_sFM.F_POSITION+2),L
LD (IY+_sFM.F_POSITION+3),H
XOR A
RET
;
.B_2: DJNZ .error
;from End File
.B_end: LD C,(IY + _sFM.FS_REC.F_SIZE)
LD B,(IY + _sFM.FS_REC.F_SIZE+1)
LD E,(IY + _sFM.FS_REC.F_SIZE+2)
LD D,(IY + _sFM.FS_REC.F_SIZE+3)
JP .DO
; B > 2
.error: LD A,DSS_Error.sys.INVALID_FUNCTION
SCF
RET

91
DSS/API/Open.asm Normal file
View File

@ -0,0 +1,91 @@
; [x] fat32 ;!TEST
////////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #11. Žâªàë⨥ ä ©« .
;
; ¢å®¤: HL - 㪠§ â¥«ì ­  ¨¬ï ä ©« 
; A - ०¨¬ ¤®áâ㯠:
; A=0 ç⥭¨¥/§ ¯¨áì
; A=1 ç⥭¨¥
; A=2 § ¯¨áì
; ;!TODO A=3 § ¯¨áì ¡¥§ «¨è­¨å á®åà ­¥­¨© ªíè  FAT
; ;!TODO A=4 § ¯¨á âì ªíè FAT
; ¢ë室: CF=0, A - ¤¥áªà¨¯â®à ä ©« .
; CF=1, A - ª®¤ ®è¨¡ª¨.
////////////////////////////////////////////////////////////////////////
OPEN_FN: ;!TEST Current Dir ;[x] 15/10/23
;AND #7F ; ACCESS_MODE bit7 - ¤«ï ¢­ãâ७­¥£® ¨á¯®«ì§®¢ ­¨ï))) ;!TODO
LD (.TMP),A
PUSH HL
CALL DIR_PATH_CHECK.forceCheck
POP HL
RET C
;!FIXIT ᤥ« âì ª ª ¢ mkdir ¨«¨ rmdir?
;R008 ;
;.start: ;
CALL SetPath_GetName
RET C
CALL MASK
RET C
.FILE: CALL SEARCH.File ; enter point from EXEC, CREATE
RET C
;R002 ;!TEST 9/11/23 record index
.FM: PUSH DE ; á®å࠭塞 㪠§ â¥«ì ­  § ¯¨áì ¢ ª â «®£¥ FS (¯®«ã祭 ¨§ SEARCH)
;
CALL GET_FM ; enter point from ATTRIB
RET C
LD A,C
EX AF,AF'
;!TEST 9/11/23 record index 㪠§ â¥«ì ­  § ¯¨áì ¢ ª â «®£¥ FS
POP DE
; EXX
LD (IY+_sFM.HANDLE),E
LD (IY+_sFM.HANDLE+1),D
; EXX
;
LD D,YH
LD E,YL
LD HL,HANDBUF
LD BC,HANDBUF.SIZE
LDIR
.TMP+1: LD A,0
LD (IY+_sFM.ACCESS_MODE),A
LD A,(TASK)
LD (IY+_sFM.TASK_NUM),A
;!FIXIT ®¯â¨¬¨§­ãâì âãâ § ­ã«¥­¨¥
XOR A
LD (IY+_sFM.OptimizedClusters),A
LD (IY+_sFM.KnownCluster_L),A
LD (IY+_sFM.KnownCluster_L+1),A
LD (IY+_sFM.KnownOffset_L),A
LD (IY+_sFM.KnownOffset_L+1),A
; fat32
LD (IY+_sFM.KnownCluster_H),A
LD (IY+_sFM.KnownCluster_H+1),A
LD (IY+_sFM.KnownOffset_H),A
LD (IY+_sFM.KnownOffset_H+1),A
;
LD (IY+_sFM.F_POSITION),A
LD (IY+_sFM.F_POSITION+1),A
LD (IY+_sFM.F_POSITION+2),A
LD (IY+_sFM.F_POSITION+3),A
LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
LD (IY+_sFM.DRIVE),A
; fat32
LD HL,CORE_BUFFERS.FM_BUF+_sFM.FS_REC.FIRST_CLUSTER_H
LD E,(HL)
INC HL
LD D,(HL)
LD (IY+_sFM.DIR_CLUSTER_H),E
LD (IY+_sFM.DIR_CLUSTER_H+1),D
;
LD HL,CORE_BUFFERS.FM_BUF+_sFM.FS_REC.FIRST_CLUSTER_L ; work directory FM
LD E,(HL)
INC HL
LD D,(HL)
LD (IY+_sFM.DIR_CLUSTER_L),E
LD (IY+_sFM.DIR_CLUSTER_L+1),D
;
EX AF,AF'
AND A
RET
;

30
DSS/API/PChars.asm Normal file
View File

@ -0,0 +1,30 @@
;///////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #5C. ‚뢮¤ áâப¨ ­  íªà ­.
;
; ¢å®¤: HL - 㪠§ â¥«ì ­  áâபã ᨬ¢®«®¢
; ¢ë室: HL - 㪠§ â¥«ì ­  á«¥¤ãîéãî áâபã ᨬ¢®«®¢
; PRINT NULL-TERMINATED CHARS STRING
;///////////////////////////////////////////////////////////////////////
; PCHARS: LD A,(HL)
; INC HL
; OR A
; RET Z
; CALL PUTCHAR
; JP PCHARS
;///////////////////////////////////////////////////////////////////////
PCHARS: XOR A ; no attr-mode
LD A,(CLEAR.shell_color)
LD B,A
EX AF,AF'
XOR A ; no XY-mode
LD C,BIOS.LP_PR_LINE_DIR
LD IY,0 ; YH = YL = B
JP ToBIOS
;///////////////////////////////////////////////////////////////////////
; A -  âਡãâë ¢ë¢®¤¨¬®£® ᨬ¢®«  ¥á«¨ CF'
; CF - XY-mode
; DE - ¬¥á⮠ᨬ¢®«  ¢ ®ª­¥, ¥á«¨ CF=1
; HL -  ¤à¥á á ¢ë¢®¤¨¬®© áâப®©
; B - 梥⠪®­á®«¨ (¨á¯®«ì§ã¥âáï ¯à¨ áªà®««¥ ¨ ®ç¨á⪥ ®ª­ )
; IY - ¤¢  ᯥæ.ᨬ¢®«  ¤«ï ¢ë室  á CF=1. „®«¦­ë ¡ëâì à ¢­ë B, ¥á«¨ ­¥ ­ã¦­ë
; CF' - ¢ë¢®¤¨âì ᨬ¢®« á  âਡãâ ¬¨

74
DSS/API/Print.asm Normal file
View File

@ -0,0 +1,74 @@
;///////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #5F. ‚뢮¤ ᨬ¢®«  ­  ¯à¨­â¥à ¡¥§ ®¦¨¤ ­¨ï.
;
; ˆ­â¥à¯à¥â æ¨ï ¡ ©â  á®áâ®ï­¨ï ¯à¨­â¥à :
; 0..2 - ­¥ ¨á¯®«ì§ãîâáï, ®¡ëç­® ãáâ. ¢ "1"
; 3 - ®è¨¡ª  ¯à¨­â¥à  - ¥áâì/­¥â (1/0)
; 4 - ¯à¨­â¥à ¯®¤ª«î祭/­¥ ¯®¤ª«î祭 (1/0)
; 5 - ¡ã¬ £¨ ­¥â/¥áâì (1/0)
; 6 - ¯à¨­â¥à £®â®¢/¢ë¢®¤¨â ®ç¥à¥¤­®© ᨬ¢®« (1/0)
; 7 - ¯à¨­â¥à ᢮¡®¤¥­/§ ­ïâ (1/0)
;
; ¢å®¤: A - ᨬ¢®«
; ¢ë室: B - ᨬ¢®«
; CF - ®è¨¡ª , A=¡ ©â á®áâ®ï­¨ï (¡¨âë 7..3)
;///////////////////////////////////////////////////////////////////////
Z84_SP:
.LPT_A EQU Z84.SIO.Ch_B.Ctrl
.LPT_B EQU Z84.PIO.Port_A.Data
.LPT1_C EQU Z84.PIO.Port_A.Command
.LPT2_D EQU Z84.PIO.Port_B.Data
.LPT2_C EQU Z84.PIO.Port_B.Command
;
PRINT: AND A
LD B,A ; á®å࠭塞 ᨬ¢®«
;
LD A,R
DI
PUSH AF
; reg 0
XOR A
OUT (Z84_SP.LPT_A),A
LD A,%0001'0000 ; Reset EXT/STATUS interrupts
OUT (Z84_SP.LPT_A),A
XOR A
OUT (Z84_SP.LPT_A),A
IN A,(Z84_SP.LPT_A) ; IN (1Bh): bit 5 - busy, Bit 3 - Ack
LD C,A
BIT 5,A ; IN (19h): bit 5 - Paper Enable, Bit 3 - Select
JR NZ,.LPTBUSY
AND %11011000
JR Z,.LPTBUSY
LD A,B ; ¢®ááâ ­ ¢«¨¢ ¥¬ ᨬ¢®«
OUT (Z84_SP.LPT_B),A
POP AF
RET PO
EI
RET
;
.LPTBUSY: POP AF
LD A,C
SCF
RET PO
EI
RET
; ; ;
; B - SYMBOL
; CF = 1 - PRINTER BUSY
PRINT_INIT: DI
LD A,#CF
; port #1F ⮫쪮 ç¥p¥§ LD BC,1F : Out (BC),reg (¢  «ìâ¥à¥ ¨¤ñâ ¯¥à¥å¢ â í⮣® ¯®àâ  ¯à®æ , ¥á«¨ ®­ ¢ ª®¬ ­¤¥ ® 㪠§ ­)
LD BC,Z84_SP.LPT2_C
OUT (C),A
;[x] 29/9/23
;LD A,#63
LD A,63
;
OUT (C),A
LD A,#C0 ; Bit 7 - Select (1), Bit 6 - Auto_Line_Feed (1)
OUT (Z84_SP.LPT2_D),A
LD A,#0F ; Init printer port for Out
OUT (Z84_SP.LPT1_C),A
RET
;///////////////////////////////////////////////////////////////////////

127
DSS/API/PutChar.asm Normal file
View File

@ -0,0 +1,127 @@
;///////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #5B. ‚뢮¤ ᨬ¢®«  ­  íªà ­ ¢ ⥪. ¯®§¨æ¨¨.
;
; ¢å®¤: A - ᨬ¢®«
; ¢ë室: ­¥â
;///////////////////////////////////////////////////////////////////////
; PUTCHAR: ;CALL .NO_SCROLL
; CP #0E
; JR C,.control_characters
; ;
; LD BC,1*256 + BIOS.LP_PRINT_SYM
; ;[x] CR+LF+SCROLL
; RST ToBIOS
; ;
; ; ¯à®¢¥àª  ­  ¯¥à¥å®¤ ªãàá®à  ¢ á ¬®¥ ­ ç «® (X:Y == 0:0)
; CALL CURSOR
; LD A,D
; OR E
; RET NZ
; ;
; .LFF: PUSH HL
; LD BC,1*256 + BIOS.LP_SCROLL_UD
; LD DE,#0020
; RST ToBIOS
; LD DE,#1F00
; CALL LOCATE
; LD A,' '
; LD BC,#50*256 + BIOS.LP_PRINT_SYM
; RST ToBIOS
; LD DE,#1F00
; CALL LOCATE
; POP HL
; RET
; .TB_: CALL CURSOR
; IF TABisSPACES
; LD B,E
; LD A,E
; AND #F8
; ADD A,8
; SUB B
; LD B,A
; LD A,' '
; LD C,BIOS.LP_PRINT_SYM
; JP ToBIOS
; ELSE
; LD A,E
; ADD A,8
; AND #78 ;????? £«ï­ãâì, çâ® ¡ã¤¥â ¥á«¨ ª®®à¤¨­ âë ªãàá®à  ¢ ª®­æ¥ áâப¨ ¯®çâ¨
; LD E,A
; JP LOCATE
; ENDIF
; .BK_: CALL CURSOR
; XOR A
; CP E
; RET Z
; DEC E
; JP LOCATE
; ;
; .LF_: CALL CURSOR
; LD A,D
; CP #1F
; JR NC,.LFF
; INC D
; IFN EnoughtOnly_LF
; JP LOCATE
; ELSE
; CALL LOCATE
; ; !!!! <20>… à §à뢠âì LF_ ¨ CR_ !!!!
; ENDIF
; .CR_: CALL CURSOR
; LD E,0
; JP LOCATE
; ;
; .control_characters:
; CP "\r"
; JR Z,.CR_
; CP "\n"
; JR Z,.LF_
; CP "\t" ; tab
; JR Z,.TB_
; CP "\b" ; backspace
; JR Z,.BK_
; CP "\a" ; [x] Beep in PChars/PUTCHAR
; RET NZ
; ; [x] Beep in PChars/PUTCHAR
; .BELL: LD DE,1200
; PUSH HL
; LD HL,4
; CALL BEEP
; POP HL
; RET
; ;
; ; [x] -bug with Vasil's version of cursor
; .NO_SCROLL: CP #0E
; JR C,.control_characters
; LD BC,1*256 + BIOS.LP_PRINT_SYM
; JP ToBIOS
;///////////////////////////////////////////////////////////////////////
;///////////////////////////////////////////////////////////////////////
PUTCHAR: PUSH HL
;
LD L,A
XOR A ; no attr-mode
LD H,A
PUSH HL ; ª« ¤ñ¬ ­  á⥪ ¯¥ç â ¥¬ë© ᨬ¢®«
LD L,A
ADD HL,SP
;
LD A,(CLEAR.shell_color)
LD B,A
EX AF,AF'
XOR A ; no XY-mode
LD C,BIOS.LP_PR_LINE_DIR
LD IY,0 ; YH = YL = B
RST ToBIOS
POP HL ; ¢®ááâ ­ ¢«¨¢ ¥¬ á⥪
;
POP HL
RET
; .NO_SCROLL:
; .CHAR: DZ "X"
;///////////////////////////////////////////////////////////////////////

15
DSS/API/RdChar.asm Normal file
View File

@ -0,0 +1,15 @@
;///////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #57. <20>à®ç¨â âì ᨬ¢®« á íªà ­ .
;
; ¢å®¤: D - áâப 
; E - ª®«®­ª 
; ¢ë室: A - ᨬ¢®«
; B -  âਡãâ
;///////////////////////////////////////////////////////////////////////
RDCHAR: XOR A
LD C,BIOS.WIN_GET_SYM
RST ToBIOS
LD A,L
LD B,H
RET
;///////////////////////////////////////////////////////////////////////

173
DSS/API/Read.asm Normal file
View File

@ -0,0 +1,173 @@
; HL - BUFFER ADDRESS
; DE - BLOCK SIZE
; A - FM
READ: LD (.R_POINT),HL
LD (.S_POINT),HL
CALL SET_FM
RET C
CALL .TEST_SIZE
;
LD A,D
OR E
JP Z,.NOREAD
;
PUSH DE
LD A,(IY+_sFM.DRIVE)
CALL OPENDSK
JP C,.ERR_1
CALL GET_OFFSET_IN_SECTORS
;
JP NZ,.ROV1
.ROV4: POP BC
PUSH BC
SRL B
JR Z,.ROV2
; ç⥭¨¥ áà §ã ¢ ¡ãä¥à ¯®«ì§®¢ â¥«ï
LD (.SECTORH),HL
LD (.SECTORL),DE
.R_POINT+2: LD IX,0
CALL BLOCK_READ
JP C,.ERR_1
LD DE,(.R_POINT)
.PointerOnBuffer+1:
LD HL,0 // LD HL,(READMEM)
AND A
SBC HL,DE
LD C,H
LD B,0
ADD HL,DE
LD (.R_POINT),HL
SRL C
.SECTORL+1: LD HL,0 // LD HL,(SECTORL)
ADD HL,BC
EX DE,HL
.SECTORH+1: LD HL,0 // LD HL,(SECTORH)
LD C,B
ADC HL,BC
.ROV2: POP BC
LD A,B
AND #01
LD B,A
OR C
JP Z,.ROV6
; ç⥭¨¥ ç¥à¥§ ¡ãä¥à DSS, ¥á«¨ à §¬¥à ¤ ­­ëå < 512
PUSH BC
LD IX,CORE_BUFFERS.BUFFER+#C000
LD B,1
IN A,(SLOT3)
PUSH AF
IN A,(SLOT0)
OUT (SLOT3),A
CALL BLOCK_READ
POP BC
LD C,SLOT3
OUT (C),B
JP C,.ERR_1
LD HL,CORE_BUFFERS.BUFFER
LD DE,(.R_POINT)
POP BC
LDIR
LD (.R_POINT),DE
.ROV6: LD HL,(.R_POINT)
.S_POINT+1: LD DE,0
;EX DE,HL
AND A
SBC HL,DE
PUSH HL
EX DE,HL
LD XH,D
LD XL,E
LD HL,0
CALL MOVE_FP.F_current
POP DE
.NOREAD: ;
.COD+1: LD A,0
OR A
RET
;
.ROV1: PUSH BC
PUSH HL
PUSH DE
LD IX,CORE_BUFFERS.BUFFER+#C000
LD B,1
IN A,(SLOT3)
PUSH AF
IN A,(SLOT0)
OUT (SLOT3),A
CALL BLOCK_READ
POP BC
LD C,SLOT3
OUT (C),B
POP HL
JP C,.ERR_3
; inc HL:DE
LD BC,1
ADD HL,BC
EX DE,HL
POP HL
LD C,B
ADC HL,BC
;
EXX
POP DE
LD HL,512 ;!HARDCODE ;!FIXIT ; [ ] sector size
AND A
SBC HL,DE
LD B,H
LD C,L
POP HL
AND A
SBC HL,BC
JR NC,.ROV3
ADD HL,BC
LD B,H
LD C,L
LD HL,0 ;!TODO ¬®¦­® âãâ ã¯à®áâ¨âì ¤ «ì­¥©èãî ¢¥âªã?
.ROV3: PUSH HL
LD HL,CORE_BUFFERS.BUFFER
ADD HL,DE
LD DE,(.R_POINT)
LDIR
LD (.R_POINT),DE
EXX
JP .ROV4
;
.ERR_3: POP HL
POP HL
.ERR_1: POP BC
;SCF
RET
;
.TEST_SIZE: XOR A
LD (READ.COD),A
LD L,(IY+_sFM.F_POSITION) ;FP LOW
LD H,(IY+_sFM.F_POSITION+1)
ADD HL,DE
;
EXX
;LD DE,0 ;!TEST
LD L,(IY+_sFM.F_POSITION+2) ;FP HIGH
LD H,(IY+_sFM.F_POSITION+3)
;!TEST
JR NC,.no_inc_hl
INC HL
;ADC HL,DE
;
.no_inc_hl: EXX ;HL':HL - NEW FP
;
LD C,(IY+_sFM.FS_REC.F_SIZE)
LD B,(IY+_sFM.FS_REC.F_SIZE+1) ;SIZE LOW
AND A
SBC HL,BC
EXX
LD C,(IY+_sFM.FS_REC.F_SIZE+2) ;SIZE HIGH
LD B,(IY+_sFM.FS_REC.F_SIZE+3)
SBC HL,BC
EXX
RET C ;OK READ ALL
EX DE,HL
SBC HL,DE ;VERY BIG
EX DE,HL
LD A,#FF
LD (READ.COD),A
RET

85
DSS/API/Rename.asm Normal file
View File

@ -0,0 +1,85 @@
////////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #10. <20>¥à¥¨¬¥­®¢ ­¨¥ ä ©« .
; ƒ«®¡ «ì­ë¥ ᨬ¢®«ë * ¨ ? ¢ ¨¬¥­ å ä ©«®¢ ­¥ ¤®¯ã᪠îâáï.
;
; ¢å®¤: HL - 㪠§ â¥«ì ­  áâ à®¥ ¨¬ï ä ©« 
; DE - 㪠§ â¥«ì ­  ­®¢®¥ ¨¬ï ä ©« 
; ¢ë室: A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
;
; INPUT: HL - "old_name.ext",#00 without simbols * ?
; DE - "new_name.ext",#00 without simbols * ?
////////////////////////////////////////////////////////////////////////
RENAME: ;!TEST Current Dir ;[x] 15/10/23
PUSH HL
PUSH DE
CALL DIR_PATH_CHECK.forceCheck
POP DE
POP HL
RET C
;
; !TODO ¢®âª­ãâì âãâ SetPath_GetName, ç⮡ ¬®¦­® ¡ë«® 㤠«ïâì ¯® ®â­®á¨â¥«ì­ë¬ ¯ãâï¬?
;
; [ ] 26/06/2024
PUSH HL
CALL CHECK_64kb_CLUSTER
POP HL
RET C
;
PUSH DE
CALL MASK.name
POP DE
RET C
;!TEST optimization
;LD HL,MASKARE
;LD BC,11
;LD A,"?"
;CPIR
;LD A,DSS_Error.sys.INVALID_NAME
;SCF
CALL CHECK_NAME
;
RET Z
PUSH DE
CALL LOADDIR ; ¯à®ç¨â âì ᯨ᮪ ª â «®£ 
;LD A,#33
LD A,FAT_ATTR.NoSYSnoVolID
CALL SEARCH.Custom ; ¯®¨áª § ¯¨á¨ ¢ ᯨ᪥ ¤¨áª 
POP HL
RET C
;LD DE,MASKARE
CALL MASK.name
RET C
;!TEST optimization
;LD HL,MASKARE
;LD BC,11
;LD A,"?"
;CPIR
;LD A,DSS_Error.sys.INVALID_NAME
;SCF
CALL CHECK_NAME
;
RET Z
PUSH IX
LD A,FAT_ATTR.NoSYSnoVolID
CALL SEARCH.Custom ; ¯®¨áª § ¯¨á¨ ¢ ᯨ᪥ ¤¨áª 
POP IX
LD A,DSS_Error.sys.FILE_EXISTS
CCF
RET C
SET_PAGE_X DIRPAGE
EX AF,AF'
;
LD HL,MASKARE
LD D,XH
LD E,XL
LD BC,11
LDIR
;
CALL DELETE_LFN_RECORDS ; [ ] 㤠«¥­¨¥ § ¯¨á¨ LFN
;
EX AF,AF'
OUT (SLOT3),A
JP SAVEDIR
; ; ;

29
DSS/API/RetMem.asm Normal file
View File

@ -0,0 +1,29 @@
//////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #3E. Žá¢®¡®¦¤¥­¨¥ ¡«®ª  ¯ ¬ïâ¨.
;
; ¢å®¤: A - ¨¤¥­â¨ä¨ª â®à ¡«®ª  ¯ ¬ïâ¨
; ¢ë室: A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
//////////////////////////////////////////////////////////////////////
RETMEM: LD E,A
LD D,#00
;LD HL,MEMTAB ; ¬ áᨢ ᯨ᪠ ¢ë¤¥«. áâà ­¨æ
LD HL,CORE_BUFFERS.MemoryTable ; ¬ áᨢ ᯨ᪠ ¢ë¤¥«. áâà ­¨æ
ADD HL,DE
LD A,(TASK) ; ã஢¥­ì ⥪ã饩 ¯à®£à ¬¬ë
CP (HL)
LD A,DSS_Error.sys.INVALID_MEMORY_HND
SCF
RET NZ
;PUSH DE
LD A,E
LD C,BIOS.FreeMem
RST ToBIOS
;POP DE
LD A,DSS_Error.sys.INVALID_MEMORY_HND
RET C
;LD HL,MEMTAB
LD HL,CORE_BUFFERS.MemoryTable
ADD HL,DE
XOR A
LD (HL),A
RET

125
DSS/API/RmDir.asm Normal file
View File

@ -0,0 +1,125 @@
; [x] fat32 ;!TEST
////////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #1C. “¤ «¥­¨¥ ª â «®£ .
; Œ®¦­® 㤠«¨âì ⮫쪮 ¯ãá⮩ ª â «®£.
;
; ¢å®¤: HL - 㪠§ â¥«ì ­  ¨¬ï ª â «®£ 
; ¢ë室: A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
;
; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0
////////////////////////////////////////////////////////////////////////
RMDIR: ;!TEST Current Dir ;[x] 15/10/23
PUSH HL
CALL DIR_PATH_CHECK
POP HL
RET C
CALL .START
PUSH AF
LD HL,CORE_BUFFERS.CurrentDirectory
CALL CHDIR
CALL DIR_PATH_CHANGE.Current
POP AF
RET
;
.START: CALL SetPath_GetName
RET C
; [ ] 26/06/2024
CALL CHECK_64kb_CLUSTER
RET C
;
CALL MASK
RET C
;!TEST optimization
;LD HL,MASKARE
;LD BC,11
;LD A,"?"
;CPIR
;LD A,DSS_Error.sys.INVALID_NAME
;SCF
CALL CHECK_NAME
;
RET Z
CALL LOADDIR
CALL SEARCH.Dir
RET C
; fat32
LD HL,(HANDBUF+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H)
EXX
LD HL,(HANDBUF+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L)
PUSH IX ;!TODO record index. ¢®§¬®¦­®, çâ® ¬®¦¥â á«®¬ âìáï, ¥á«¨ ¡®«ìè¥ áâà ­¨æë
;
;!TODO <20>à®æ¥¤ãà  ¯®«­®£® ¢ëç¨â뢠­¨ï ª â «®£  (¢á¥ ª« áâ¥àë). Œ®¦­® § ¤¥©á⢮¢ âì ¢ ¤àã£¨å ¬¥áâ å
.read_dir_big_loop:
PUSH HL
EXX
PUSH HL
EXX
CALL CLUSTER_TO_SECTOR
LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster)
LD B,A
; ­ ç¨­ ¥¬ ¢ëç¨â뢠âì ᮤ¥à¦¨¬®¥ ª â «®£  ¯®á¥ªâ®à­®
.read_dir_loop: ;PUSH AF
PUSH BC
PUSH HL
PUSH IX
CALL READ_SECTOR
; !FIXIT ­¥â ¯à®¢¥àª¨ ­  ®è¨¡ªã
;
;!HARDCODE sector size. 16 * 32 = 512; 32 - à §¬¥à § ¯¨á¨, 512 - à §¬¥à áç¨â ­­®£® ᥪâ®à 
LD B,16
LD HL,CORE_BUFFERS.SECTOR_BUFFER
.check_dir_loop:;
LD A,(HL)
OR A
JP Z,.dir_empty
CP "."
JR Z,.next_record
CP #E5 ;!HARDCODE ¡ ©â 㤠«¥­¨ï ä ©« 
JR Z,.next_record
LD DE,FAT_DIRECTORY_RECORD.ATTRIBUT ; ᬥé. ¤® ¡ ©â   âਡã⮢
ADD HL,DE
LD A,(HL)
SBC HL,DE
AND FAT_ATTR.VOLUME_ID
SCF
JP Z,.error ;DIR NOT EMPTY
.next_record: LD DE,FAT_DIRECTORY_RECORD
ADD HL,DE
DJNZ .check_dir_loop
;
POP IX
POP HL
INC IX
LD A,XH
OR XL
JR NZ,.no_inc_hl
INC HL
.no_inc_hl: POP BC
DJNZ .read_dir_loop
; fat32
EXX
POP HL ; ­®¬¥à ª« áâ¥à 
EXX
POP HL ; ­®¬¥à ª« áâ¥à 
CALL READ_FROM_FAT ; ¯à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à 
EX DE,HL ; hl=­®¬¥à á«¥¤. ª« áâ¥à 
EXX
EX DE,HL ; hl=­®¬¥à á«¥¤. ª« áâ¥à 
EXX
JR NC,.read_dir_big_loop ; ­¥ ª®­¥æ 楯®çª¨
;
.delete: POP IX
JP DELETE_REC_FAT ; ¯®¬¥â¨âì § ¯¨áì ª ª "㤠«¥­­ ï"
;
.dir_empty: ; CF = 0
.error: ; CF = 1
POP HL
POP HL
POP HL
POP HL
POP HL
JR NC,.delete
POP HL
LD A,DSS_Error.sys.DIR_NOT_EMPTY
RET
;

62
DSS/API/ScanDRV.asm Normal file
View File

@ -0,0 +1,62 @@
;R12
;///////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #08 (DSS_RESCAN). <20>¥à¥áª ­¨à®¢ âì ¤¥¢ ©áë á¨á⥬ë.
;
; ¢å®¤: ­¥â
; ¢ë室: A - ­®¬¥à ¯®á«¥¤­¥£® «®£. ¤¨áª  ¢ á¨á⥬¥
;///////////////////////////////////////////////////////////////////////
; INCLUDE 'ScanDRV.asm'
;!TODO ª®¤ ¤¨ª® ª®áâë«ì­ë© ¨ ¡ã¤¥â ¯¥à¥¤¥« ­ ¢¬¥áâ¥ á ¯à®æ¥¤ãன INITDVC
SCANDRV:
; 1. § ¯®¬¨­ ¥¬ á®áâ®ï­¨¥ ¯à¥à뢠­¨©
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
LD A,R
DI
PUSH AF
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
; 2. ã§­ ñ¬ ¡ãª¢ã ¡ãâ-¤¨áª 
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
LD A,(BOOTDSK.NUM)
;CALL BOOTDSK.GET
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
; 3. ¢ë§ë¢ ¥¬ à¥áª ­
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
; A = Boot disk
LD B,A
LD A,Dss.DRV.RescanDRV
LD C,Dss.DRV.RescanDRV
RST ToDSS.DRV
; ¯à®¢¥àª  ­  ®è¨¡ªã boot disk lost
LD HL,.BOOT_DSK_LOST
LD E, +(80-.BOOT_DSK_LOST.size)/2 ; coord X
LD BC,.BOOT_DSK_LOST.size
JP C,KERNEL_PANIC
;
LD (LDRIVE),A
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
; 4. ­  ¢á直© á«ãç © ¯¥à¥ç¨â뢠¥¬ ¤¨à४â®à¨î
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
LD A,(CORE_BUFFERS.CurrentPath)
SUB 'A'
CALL OPENDSK.open
JR NC,.disk_norm
LD A,(BOOTDSK.NUM)
CALL OPENDSK.open
;
.disk_norm: LD HL,CORE_BUFFERS.CurrentDirectory
CALL CHDIR
JR NC,.exit
LD HL,CORE_BUFFERS.CurrentDirectory
LD (HL),0
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
; 5. ¢ë室
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
.exit: POP AF
RET PO
EI
RET
.BOOT_DSK_LOST: DZ "Boot drive lost o_O"
.BOOT_DSK_LOST.size EQU $-.BOOT_DSK_LOST
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
;///////////////////////////////////////////////////////////////////////

105
DSS/API/Scroll.asm Normal file
View File

@ -0,0 +1,105 @@
;///////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #55. ‘ªà®««¨­£ íªà ­ .
;
; ¢å®¤: D - áâப  «¥¢®£® ¢¥àå­¥£® 㣫  ®ª­ 
; E - ª®«®­ª  «¥¢®£® ¢¥àå­¥£® 㣫  ®ª­ 
; H - ¢ëá®â  ®ª­ 
; L - è¨à¨­  ®ª­ 
; B = 1 - ¯à®ªàã⪠ ¢¢¥àå
; B = 2 - ¯à®ªàã⪠ ¢­¨§
; A = 0 - ®ç¨é âì áâபã
; ¢ë室: ­¥â
;///////////////////////////////////////////////////////////////////////
SCROLL: DJNZ .SCR_DW ;!TODO § ¬¥­¨âì ­  BIOS.LP_SCROLL_UD ¨ ¯®á¬®âà¥âì, çâ® èãáâ॥
;[x] 04/04/23
;LD B,A
;LD C,H
;PUSH BC
PUSH AF
;
PUSH DE
PUSH HL
LD XH,D
LD XL,E
INC D
DEC H
LD C,BIOS.WIN_MOVE
;[x] 29/9/23
LD A,R
PUSH AF
;
XOR A
DI ;[x] 29/9/23
RST ToBIOS
;[x] 29/9/23
POP AF
JP PO,.skip_EI
EI
.skip_EI:
POP HL
POP DE
;[x] 04/04/23
;POP BC
POP AF
;XOR A
;CP B
AND A
;
RET NZ
LD A,D
ADD A,H
DEC A ;R101
LD D,A
.print: PUSH DE ;R101
CALL LOCATE
LD A,' '
LD B,L
LD C,BIOS.LP_PRINT_SYM
RST ToBIOS
POP DE ;R101
JP LOCATE ;R101
;AND A
;RET
.SCR_DW:
DJNZ .SCR_ERR
;[x] 04/04/23
;LD B,A
;LD C,H
;PUSH BC
PUSH AF
;
PUSH DE
PUSH HL
LD XH,D
LD XL,E
INC XH
DEC H
LD C,BIOS.WIN_MOVE
;[x] 29/9/23
LD A,R
PUSH AF
;
XOR A
DI ;[x] 29/9/23
RST ToBIOS
; [x] 29/9/23
POP AF
JP PO,.skip2_EI:
EI
.skip2_EI:
POP HL
POP DE
;[x] 29/9/23
;POP BC
POP AF
;XOR A
;CP B
AND A
;
RET NZ
JP SCROLL.print
.SCR_ERR:
LD A,DSS_Error.sys.INVALID_FUNCTION
SCF
RET
;///////////////////////////////////////////////////////////////////////

20
DSS/API/SelPage.asm Normal file
View File

@ -0,0 +1,20 @@
;///////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #54. ‚ë¡à âì  ªâ¨¢­ãî áâà ­¨æã íªà ­ .
;
; ¢å®¤: B - áâà ­¨æ  íªà ­  0/1
; ¢ë室: A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
;///////////////////////////////////////////////////////////////////////
SELPAGE:
LD A,(VMODE)
;BIT 7,A
CP %1000'0000
JR NC,.SEL2
PUSH BC
LD C,A
CALL SETVMOD.TEXT_M
POP BC
.SEL2: LD A,B
AND #01
OUT (SCREEN_SWITCH),A
RET
;///////////////////////////////////////////////////////////////////////

32
DSS/API/SetDateTime.asm Normal file
View File

@ -0,0 +1,32 @@
////////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #18. ˆ§¬¥­¥­¨¥ ¤ âë ¨ ¢à¥¬¥­¨ ä ©« .
;
; ¢å®¤: A - ¤¥áªà¨¯â®à ä ©« 
; D - ¤¥­ì
; E - ¬¥áïæ
; IX - £®¤
; H - ç á
; L - ¬¨­ãâë
; B - ᥪ㭤ë
; ¢ë室: A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
////////////////////////////////////////////////////////////////////////
;!FIXIT ­ ¤®? CHECK_64kb_CLUSTER
PUT_D_T: PUSH AF
CALL MK_TIME ; § ª®¤¨à®¢ âì ¢à¥¬ï/¤ âã
POP AF ; ¤¥áªà¨¯â®à
PUSH DE
PUSH BC
CALL SET_FM
POP BC
POP DE
RET C
; [ ] VFAT
LD (IY + _sFM.FS_REC.TIME),E
LD (IY + _sFM.FS_REC.TIME+1),D
LD (IY + _sFM.FS_REC.DATE),C
LD (IY + _sFM.FS_REC.DATE+1),B
SET 7,(IY + _sFM.ACCESS_MODE) ;R006 ; ãáâ. ¯à¨§­ ª ¨§¬¥­¥­¨ï ä ©« 
AND A
RET
;

73
DSS/API/SetMem.asm Normal file
View File

@ -0,0 +1,73 @@
//////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #3F. ˆ§¬¥­¥­¨¥ ¡«®ª  ¯ ¬ïâ¨.
;
; ¢å®¤: A - ¨¤¥­â¨ä¨ª â®à ¡«®ª  ¯ ¬ïâ¨
; B - ­®¢ë© à §¬¥à ¡«®ª 
; ¢ë室: A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
//////////////////////////////////////////////////////////////////////
SETMEM: LD E,A
LD D,#00
;LD HL,MEMTAB
LD HL,CORE_BUFFERS.MemoryTable ; ¬ áᨢ ᯨ᪠ ¢ë¤¥«. áâà ­¨æ
ADD HL,DE
LD A,(TASK)
CP (HL)
LD A,DSS_Error.sys.INVALID_MEMORY_HND
SCF
RET NZ
LD D,B
PUSH DE
LD A,E
CALL .SIZEBLK
POP DE
LD A,DSS_Error.sys.INVALID_MEMORY_HND
RET C
LD A,B
CP D
RET Z
JR C,.INCMEM
; DECMEM
LD B,D
LD A,E
LD C,BIOS.DivMemBlocks
RST ToBIOS
LD A,B
LD C,BIOS.FreeMem
RST ToBIOS
XOR A
RET
; „®¡ ¢¨âì áâà ­¨æ ¯ ¬ï⨠ª ¡«®ªã
.INCMEM:
LD A,D
SUB B
LD B,A
LD C,E
PUSH BC
LD C,BIOS.GetMem
RST ToBIOS
POP BC
LD B,A
LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY
RET C
LD A,C
LD C,BIOS.MergeMemBlocks
RST ToBIOS
XOR A
RET
;
.SIZEBLK:
LD B,#FF
LD C,A
.loop: INC B
PUSH BC
LD A,C
LD C,BIOS.GetMemPage
RST ToBIOS
POP BC
JR NC,.loop
OR A
SCF
RET Z
XOR A
RET
;

256
DSS/API/SetVMod.asm Normal file
View File

@ -0,0 +1,256 @@
;///////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #50. ‚ë¡®à ०¨¬  íªà ­ .
;
; ¢å®¤: A - ०¨¬ íªà ­ 
; #02 - ⥪áâ®¢ë© 40x32x16 梥⮢
; #03 - ⥪áâ®¢ë© 80x32x16 梥⮢
; #81 - £à ä¨ç¥áª¨© 320x256x256 梥⮢
; #82 - £à ä¨ç¥áª¨© 640x256x16 梥⮢
; B - áâà ­¨æ  íªà ­  0/1
; ¢ë室: A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
;///////////////////////////////////////////////////////////////////////
SETVMOD: CP %1000'0000
LD C,A
JR NC,.GRAPH
.TEXT_M: LD IX,BACKTXT
PUSH IX
EX AF,AF'
LD A,(VMODE)
LD (BACKTXT.VMODE),A
EX AF,AF'
OR A
JR Z,.NOMODE
DEC A
JR Z,.NOMODE
DEC A
LD HL,TAB_40x32
JR Z,.SET_TXT_MODE
DEC A
LD HL,TAB_80x32
JR Z,.SET_TXT_MODE
.NOMODE: POP IX
LD A,DSS_Error.sys.INVALID_VIDEO_MODE
SCF
RET
; “áâ ­®¢ª  £à ä. ०¨¬®¢
.GRAPH: CALL SAVETXT
AND #7F
JR Z,.G320_16c ; !TODO § ¬¥­¨âì ­  áãé¥áâ¢ãî騩 ०¨¬
DEC A
JR Z,.G320_256c
DEC A
JR Z,.G640_16c
;DEC A
;JP Z,.G640_256c ; !TODO § ¬¥­¨âì ­  áãé¥áâ¢ãî騩 ०¨¬
.G320_16c: LD A,DSS_Error.sys.INVALID_VIDEO_MODE
SCF
RET
;
.SET_TXT_MODE: PUSH BC
LD A,B
RLCA
RLCA
RLCA
RLCA
OR B
AND #11
XOR #10
LD E,A
.SETMODE_END: CALL SETMODE
POP BC
LD A,C
LD (VMODE),A
LD A,B
AND #01
OUT (SCREEN_SWITCH),A
LD A,(VMODE)
LD C,Dss.Mouse.SetVideoMode
RST ToDSS.Mouse
SAFE_PORTY
XOR A
RET
;
.G320_256c: PUSH BC
LD HL,TAB_320x256_0
LD E,#11
CALL SETMODE
LD HL,TAB_320x256_1
LD E,#00
JP .SETMODE_END
;
.G640_16c: PUSH BC
LD HL,TAB_640x256_0
LD E,#11
CALL SETMODE
LD HL,TAB_640x256_1
LD E,#00
JP .SETMODE_END
;
VMODE: DB #03
;-----------------------------------------------------------------------
; Žâªàëâì ®ª­®
; ¢å®¤: hl=®¯¨á â¥«ì ®ª­ 
; e=ä« £¨ ®ª­ 
;
;02h - TEXT 40 x 32 (16 colors)
;03h - TEXT 80 x 32 (16 colors)
;80h - GRAF 320 x 256 (16 colors) ;!TODO § ­ïâì ¤à㣨¬
;81h - GRAF 320 x 256 (256 colors)
;82h - GRAF 640 x 256 (16 colors)
;83h - GRAF 640 x 256 (256 colors) ;!TODO § ­ïâì ¤à㣨¬
;-----------------------------------------------------------------------
SETMODE: PUSH DE
LD DE,SYS_PAGE.SHARED_BUFFER_32b ; £àï§­ë© å ª. ª¨¤ ¥â ¤ ­­ë¥ ¢ ¡ãä¥à á«ã¦¥¡­®© áâà ­¨æë ¡¨®á .
LD BC,ScreenDescriptorTable.Size ; <20>ˆŽ ¯à¨ ¨á¯®«ì§®¢ ­¨¨ IX ¯à¥¤¯®« £ ¥â, çâ® ®­ 㪠§ë¢ ¥â
IN A,(SLOT3) ; ­   ¤à¥á ­¨¦¥ #C000 ¨ ¢áâ ¢«ï¥â ¢ âà¥âìî ¡ ­ªã áâà ­¨æã #FE
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LDIR
EX AF,AF'
OUT (SLOT3),A
.skip_EI: POP DE
LD IX,SYS_PAGE.SHARED_BUFFER_32b ; £àï§­ë© å ª.
LD C,BIOS.WIN_OPEN
RST ToBIOS
SAFE_PORTY
XOR A
RET
;IX+0 ;HORIZONTAL
;IX+1 ;VERTICAL
;IX+2 ;X - COORD
;IX+3 ;Y - COORD
;IX+4 ;MODE
;IX+5 ;EXT MODE
;IX+6 ;VIDEO RAM X OFFSET (SIGNPLACES)
;IX+7 ;VIDEO RAM Y OFFSET (SIGNPLACES)
;
;.......................................................................
;+0 X à §¬¥à ®ª­  ¢ §­ ª®¬¥áâ å
;+1 Y à §¬¥à ®ª­  ¢ §­ ª®¬¥áâ å
;+2 X ¯®«®¦. ®ª­  ­  íªà ­¥
;+3 Y ¯®«®¦. ®ª­  ­  íªà ­¥
;+4 ०¨¬ §­ ª®¬¥áâ 
;+5 ¤®¯. ०¨¬ §­ ª®¬¥áâ  (bit0=1 ᯥª.  ¤à¥á æ¨ï íªà ­ )
;+6 X ¯®«®¦. ¢ ¯®«¥ £à ä¨ª¨ (¢ §­ ª®¬¥áâ å)
;+7 Y ¯®«®¦. ¢ ¯®«¥ £à ä¨ª¨ (¢ §­ ª®¬¥áâ å)
ScreenDescriptorTable EQU $
; 80x32. ⥪á⮢®¥, §­ ª®¬¥áâ® 16x8, #0B - ­®¬¥à §­ ª®£¥­.
TAB_80x32 DB 40,32,0,0,%0001'1011,0,0,0 ;1
; 40x32. ⥪á⮢®¥, §­ ª®¬¥áâ® 8x8, #0B - ­®¬¥à §­ ª®£¥­.
TAB_40x32 DB 40,32,0,0,%0011'1011,0,0,0 ;2
; 640x256. £à ä¨ç¥áª®¥, 0-© íªà ­
TAB_640x256_0 DB 40,32,0,0,%0000'0000,0,0,0 ;3
; 320x256. £à ä¨ç¥áª®¥, 0-© íªà ­
TAB_320x256_0 DB 40,32,0,0,%0010'0000,0,0,0 ;4
; 640x256. £à ä¨ç¥áª®¥, 1-© íªà ­
TAB_640x256_1 DB 40,32,0,0,%0100'0000,0,40,0 ;5
; 320x256. £à ä¨ç¥áª®¥, 1-© íªà ­
TAB_320x256_1 DB 40,32,0,0,%0110'0000,0,40,0 ;6
ScreenDescriptorTable.Size EQU ($ - ScreenDescriptorTable)/6
;.......................................................................
;
/*
PIC_320X256_1:
DB 40,32,0,0,32,0,8,0
DB 0, 0,0,0, 0,0,0,0
*/
;-----------------------------------------------------------------------
; ‘®åà ­¨âì íªà ­ ⥪áâ. ०¨¬ .
; „«ï ¡ãä¥à  íªà ­  ¨á¯. 2-ï ¡ ­ª  à áè¨à¥­¨ï „Ž‘.
SAVETXT: PUSH AF
LD A,(VMODE)
CP %1000'0000
JR NC,.NOSAVET
SUB #02
JR C,.NOSAVET
;
PUSH BC
PUSH DE
PUSH HL
PUSH IX
;
PUSH AF
LD C,BIOS.LP_GET_PLACE
RST ToBIOS
LD (BACKTXT.CURS),DE
POP AF
LD IX,#C000
LD HL,#2050
OR A
JR NZ,.SVTEXT1
LD L,#28
.SVTEXT1: LD (BACKTXT.WinMax),HL
LD DE,#0000
LD A,(BANKTBL+TXTPAGE)
LD B,A
LD C,BIOS.WIN_COPY
;[x] 29/9/23
LD A,R
PUSH AF
;
XOR A
DI
RST ToBIOS
;[x] 29/9/23
POP AF
JP PO,.skip_EI
EI
.skip_EI: ;
POP IX
POP HL
POP DE
POP BC
.NOSAVET: POP AF
RET
;-----------------------------------------------------------------------
BACKTXT: PUSH AF
.VMODE+1: LD A,#00
;BIT 7,A
CP %1000'0000
JR C,.NOBACKT
;
PUSH BC
PUSH DE
PUSH HL
PUSH IX
LD IX,#C000
.WinMax+1: LD HL,#2050
LD DE,#0000
LD A,(BANKTBL+TXTPAGE)
LD B,A
LD C,BIOS.WIN_RESTORE
;[x] 29/9/23
LD A,R
PUSH AF
;
XOR A
DI
RST ToBIOS
;[x] 29/9/23
POP AF
JP PO,.no_ei
EI
.no_ei: ;
.CURS+1: LD DE,#0000
CALL LOCATE
POP IX
POP HL
POP DE
POP BC
.NOBACKT: POP AF
RET
;///////////////////////////////////////////////////////////////////////

96
DSS/API/SetWin.asm Normal file
View File

@ -0,0 +1,96 @@
//////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #38. <20>®¤ª«î祭¨¥ áâà ­¨æë ¯ ¬ïâ¨.
;
; ¢å®¤: A - ¨¤¥­â¨ä. ¡«®ª  ¯ ¬ïâ¨
; B - ­®¬¥à áâà ­¨æë ¢ ¡«®ª¥ (0,1,2,..)
; H - ¡¨âë 6 ¨ 7 § ¤ îâ ­®¬¥à ®ª­ , ¢ ª®â®à®¥ ¡ã¤¥â ¯®¤ª«. áâà ­¨æ 
; ¢ë室: A - ­®¬¥à áâà ­¨æë, ¥á«¨ CF=0
; A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
; if B = 0FFh, then logical page number got from DE
//////////////////////////////////////////////////////////////////////
SETWIN: LD C,A
LD A,H
AND %1100'0000
JR NZ,.no_error
OR %0100'0000
.no_error: RRCA
OR %100'0010
LD H,A ;SLOT number
LD A,C
.ALL: LD C,BIOS.GetMemPage
EX DE,HL
RST ToBIOS
EX DE,HL
RET C
LD C,H ;SLOT number
IN B,(C)
OUT (C),A
LD A,B
RET
; SETWIN: BIT 7,H ; if #8000 or high?
; JR Z,SETWIN1 ; no, go to open in SLOT1
; BIT 6,H ; if #C000 or high?
; JR Z,SETWIN2 ; no, go to open in SLOT2
; JR SETWIN3 ; yes, go to open in SLOT3
//////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #39. <20>®¤ª«î祭¨¥ áâà ­¨æë ¯ ¬ï⨠¢ ¯¥à¢®¥ ®ª­®.
;
; ¢å®¤: A - ¨¤¥­â¨ä. ¡«®ª  ¯ ¬ïâ¨
; B - ­®¬¥à áâà ­¨æë ¢ ¡«®ª¥ (0,1,2,..)
; ¢ë室: A - ­®¬¥à áâà ­¨æë, ¥á«¨ CF=0
; A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
//////////////////////////////////////////////////////////////////////
SETWIN1: LD H,SLOT1
JR SETWIN.ALL
; SETWIN1: LD C,BIOS.GetMemPage
; EX DE,HL
; RST ToBIOS
; EX DE,HL
; RET C
; LD C,SLOT1
; IN B,(C)
; OUT (C),A
; LD A,B
; RET
//////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #3A. <20>®¤ª«î祭¨¥ áâà ­¨æë ¯ ¬ï⨠¢® ¢â®à®¥ ®ª­®.
;
; ¢å®¤: A - ¨¤¥­â¨ä. ¡«®ª  ¯ ¬ïâ¨
; B - ­®¬¥à áâà ­¨æë ¢ ¡«®ª¥ (0,1,2,..)
; ¢ë室: A - ­®¬¥à áâà ­¨æë, ¥á«¨ CF=0
; A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
//////////////////////////////////////////////////////////////////////
SETWIN2: LD H,SLOT2
JR SETWIN.ALL
; SETWIN2 LD C,BIOS.GetMemPage
; EX DE,HL
; RST ToBIOS
; EX DE,HL
; RET C
; LD C,SLOT2
; IN B,(C)
; OUT (C),A
; LD A,B
; RET
//////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #3B. <20>®¤ª«î祭¨¥ áâà ­¨æë ¯ ¬ï⨠¢ âà¥âì¥ ®ª­®.
;
; ¢å®¤: A - ¨¤¥­â¨ä. ¡«®ª  ¯ ¬ïâ¨
; B - ­®¬¥à áâà ­¨æë ¢ ¡«®ª¥ (0,1,2,..)
; ¢ë室: A - ­®¬¥à áâà ­¨æë, ¥á«¨ CF=0
; A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
//////////////////////////////////////////////////////////////////////
SETWIN3: LD H,SLOT3
JR SETWIN.ALL
; SETWIN3: LD C,BIOS.GetMemPage
; EX DE,HL
; RST ToBIOS
; EX DE,HL
; RET C
; LD C,SLOT3
; IN B,(C)
; OUT (C),A
; LD A,B
; RET

200
DSS/API/Time.asm Normal file
View File

@ -0,0 +1,200 @@
////////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #21. ’¥ªãé ï ¤ â  ¨ ¢à¥¬ï.
;
; ¢å®¤: ­¥â
; ¢ë室: D - ¤¥­ì
; E - ¬¥áïæ
; IX - £®¤
; H - ç á
; L - ¬¨­ãâë
; B - ᥪ㭤ë
; C - ¤¥­ì ­¥¤¥«¨
////////////////////////////////////////////////////////////////////////
SYSTIME:
LD C,BIOS.CMOS_TEST
RST ToBIOS
JP C,.NOCMOS
;
LD D,CMOS.Register.date
CALL RCMOS
PUSH AF
LD D,CMOS.Register.month
CALL RCMOS
POP DE
LD E,A
PUSH DE
LD D,CMOS.Register.hours
CALL RCMOS
PUSH AF
LD D,CMOS.Register.minutes
CALL RCMOS
POP DE
LD E,A
PUSH DE
LD D,CMOS.Register.seconds
CALL RCMOS
PUSH AF
LD D,CMOS.Register.dayOfWeek
LD C,BIOS.CMOS_RD
RST ToBIOS
POP DE
LD E,A
PUSH DE
LD D,CMOS.Register.year
CALL RCMOS ;READ AND CONVERT TO DECIMAL
PUSH AF
LD D,CMOS.Register.century
LD C,BIOS.CMOS_RD
RST ToBIOS
LD XH,A
POP AF
CP 80 ;R001, TEST DECIMAL FIX
PUSH AF
JR C,.XXIAGE
LD A,#19
CP XH
JR Z,.GOODAGE
JR .BADAGE
.XXIAGE:
LD A,#20
CP XH
JR Z,.GOODAGE
.BADAGE:
PUSH AF
LD D,CMOS.Register.century
LD C,BIOS.CMOS_WR
RST ToBIOS
POP AF
LD XH,A
.GOODAGE:
POP AF
LD XL,A
LD A,XH
CALL BCD2HEX
LD L,A
LD H,0
LD C,L
LD B,H
LD XH,B
ADD HL,HL
ADD HL,HL
ADD HL,BC
ADD HL,HL ;*10
LD B,H
LD C,L
ADD HL,HL
ADD HL,HL
ADD HL,BC
ADD HL,HL ;*10(100)
EX DE,HL
ADD IX,DE
POP BC
POP HL
POP DE
AND A
RET
.NOCMOS:
.NC_DAY+1:
LD DE,DAY*256+MONTH ;DAY/MONTH
.NC_HOUR+1:
LD HL,0 ;HOUR/MINUTE
.NC_SEC+1:
LD BC,1 ;SECOND/WEEKDAY
.NC_YEAR+2:
LD IX,YEAR ;YEAR
AND A
RET
;
////////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #22. “áâ ­®¢¨âì ⥪ãéãî ¤ âã ¨ ¢à¥¬ï.
;
; ¢å®¤: D - ¤¥­ì
; E - ¬¥áïæ
; IX - £®¤
; H - ç á
; L - ¬¨­ãâë
; B - ᥪ㭤ë
; ¢ë室: A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
////////////////////////////////////////////////////////////////////////
SETTIME:
PUSH IX
PUSH BC
PUSH HL
PUSH DE
;
; [x] 25/01/2024
CALL CalcDayOfWeek
PUSH HL
;
LD C,BIOS.CMOS_TEST
RST ToBIOS
JR C,.NOCMOS2
;
; [x] 25/01/2024
POP AF
LD D,CMOS.Register.dayOfWeek
LD C,BIOS.CMOS_WR
RST ToBIOS
;
POP AF
PUSH AF
LD D,CMOS.Register.date
CALL WCMOS
POP BC
LD A,C
LD D,CMOS.Register.month
CALL WCMOS
POP AF
PUSH AF
LD D,CMOS.Register.hours
CALL WCMOS
POP BC
LD A,C
LD D,CMOS.Register.minutes
CALL WCMOS
POP AF
;PUSH AF ; [ ] ¡ £ á ãáâ ­®¢ª®© ¤­ï ­¥¤¥«¨ ¨§ ॣ¨áâà  C. <20> è¥« Hard
LD D,CMOS.Register.seconds
CALL WCMOS
; [x] ¡ £ á ãáâ ­®¢ª®© ¤­ï ­¥¤¥«¨ ¨§ ॣ¨áâà  C. <20> è¥« Hard
;POP BC
;LD A,C
;LD D,CMOS.Register.dayOfWeek
;LD C,BIOS.CMOS_WR
;RST ToBIOS
;
POP HL
XOR A
LD DE,100
.YR: INC A
SBC HL,DE
JR NC,.YR
ADD HL,DE
DEC A
PUSH HL
LD D,CMOS.Register.century
CALL WCMOS
POP BC
LD A,C
LD D,CMOS.Register.year
CALL WCMOS
AND A
RET
; !FIXIT ­®¢ë© ¡¨®á ¢ëáâ ¢«ï¥â ¢à¥¬ï, ¥á«¨ á ­¨¬ çâ®-â® ­¥ â ª.
.NOCMOS2:
POP AF
POP DE
POP HL
POP BC
POP IX
LD C,A
;
LD (SYSTIME.NC_DAY),DE ;DAY/MONTH
LD (SYSTIME.NC_HOUR),HL ;HOUR/MINUTE
LD (SYSTIME.NC_SEC),BC ;SECOND/WEEKDAY
LD (SYSTIME.NC_YEAR),IX ;YEAR
AND A
RET
;

19
DSS/API/Version.asm Normal file
View File

@ -0,0 +1,19 @@
;/////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #00. ‚¥àá¨ï „Ž‘.
; ‚®§¢à é ¥â ­®¬¥à ¢¥àᨨ ¤¨áª®¢®© á¨á⥬ë.
; ¢å®¤: ­¥â
; ¢ë室: DE = ­®¬¥à ¢¥àᨨ/¬®¤¨ä¨ª æ¨¨
; BC = ­®¬¥à ¡¨«¤  (0..999)
;/////////////////////////////////////////////////////////////////////
VERSION:
;XOR A
;LD H,A ;!TODO ¯¨å âì á OSINFO
;LD L,A
LD HL,0
LD DE,VERS*256+MODF
LD BC,BUILD
RET
//;R10
//OSINFO:
//OSINFO_SIG: DB "OSINFOSTRUCTURE",0

23
DSS/API/WinCopy.asm Normal file
View File

@ -0,0 +1,23 @@
;///////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #59. ‘®åà ­¨âì ®ª­® íªà ­ .
;
; ¢å®¤: D - áâப 
; E - ª®«®­ª  «¥¢®£® ¢¥àå­¥£® 㣫  ®ª­ 
; H - ¢ëá®â  ®ª­ 
; L - è¨à¨­  ®ª­ 
; B - áâà ­¨æ  ¡ãä¥à , ¥á«¨ IX >= #C000
; IX -  ¤à¥á ¡ãä¥à 
; ¢ë室: ­¥â
;///////////////////////////////////////////////////////////////////////
WINCOPY: AND A
LD A,R ;R102
PUSH AF ;R102
XOR A
LD C,BIOS.WIN_COPY
DI ;R102
RST ToBIOS
POP AF ;R102
RET PO ;R102
EI ;R102
RET
;///////////////////////////////////////////////////////////////////////

23
DSS/API/WinRest.asm Normal file
View File

@ -0,0 +1,23 @@
;///////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #5A. ‚®ááâ ­®¢¨âì ®ª­® íªà ­ .
;
; ¢å®¤: D - áâப 
; E - ª®«®­ª  «¥¢®£® ¢¥àå­¥£® 㣫  ®ª­ 
; H - ¢ëá®â  ®ª­ 
; L - è¨à¨­  ®ª­ 
; B - áâà ­¨æ  ¡ãä¥à , ¥á«¨ IX >= #C000
; IX -  ¤à¥á ¡ãä¥à 
; ¢ë室: ­¥â
;///////////////////////////////////////////////////////////////////////
WINREST: AND A
LD A,R ;R102
PUSH AF ;R102
XOR A
DI ;R102
LD C,BIOS.WIN_RESTORE
RST ToBIOS
POP AF ;R102
RET PO ;R102
EI ;R102
RET
;///////////////////////////////////////////////////////////////////////

25
DSS/API/WrChar.asm Normal file
View File

@ -0,0 +1,25 @@
;///////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #58. ‚뢥á⨠ᨬ¢®« ­  íªà ­.
; “¯à ¢«ïî騥 ᨬ¢®«ë ¢ë¢®¤ïâáï ª ª ®¡ëç­ë¥ ᨬ¢®«ë.
;
; ¢å®¤: D - áâப 
; E - ª®«®­ª 
; A - ᨬ¢®«
; B -  âਡãâ
; ¢ë室: ­¥â
;!FIXIT slow ª ª ¡¥§ WIN_GET_SYM âãâ ®¡®©â¨áì?
;///////////////////////////////////////////////////////////////////////
WRCHAR: ;LD C,A
;PUSH BC
;PUSH DE
;XOR A
;LD C,BIOS.WIN_GET_SYM
;RST ToBIOS
;POP DE
;POP HL
LD L,A
LD H,B
XOR A
LD BC,BIOS.WIN_PUT_SYM.NoChangeZG
JP ToBIOS
;///////////////////////////////////////////////////////////////////////

197
DSS/API/Write.asm Normal file
View File

@ -0,0 +1,197 @@
WRITE.ERR3:
POP HL
WRITE.ERR2:
POP HL
WRITE.ERR1:
POP BC
;SCF
RET
WRITE.RD_ONLY:
POP DE
LD A,DSS_Error.sys.READONLY
SCF
RET
; HL - ADDRESS
; DE - SIZE
; A - FM
WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] ¨§¡ëâ®ç­ë¥ ¢ë§®¢ë WRITE_FAT_TABLE
CALL .Start
PUSH AF
LD A,(CORE_BUFFERS.FS_Buffer.CacheUpdated)
OR A
CALL NZ,WRITE_FAT_TABLE ; ¯®¤ª«. ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª
POP AF
RET
;
.Start: LD (.R_POINT),HL
LD (.S_POINT),HL
PUSH DE
CALL SET_FM
JR C,.ERR1
LD A,(IY+_sFM.ACCESS_MODE)
AND Dss.Open.R
JR NZ,.RD_ONLY
SET 7,(IY + _sFM.ACCESS_MODE)
SET 5,(IY + _sFM.FS_REC.ATTRIBUT)
LD A,(IY + _sFM.DRIVE)
CALL OPENDSK
JR C,.ERR1
; [ ] 26/06/2024
CALL CHECK_64kb_CLUSTER
RET C
;
CALL GET_OFFSET_IN_SECTORS
;
JP NZ,.WOV1
;
.WOV4: POP BC
PUSH BC
SRL B
JR Z,.WOV2
PUSH HL
PUSH DE
PUSH BC
.R_POINT+2: LD IX,0
CALL BLOCK_WRITE
POP BC
JR C,.ERR3
LD C,B
LD HL,(.R_POINT)
LD DE,#0200 ;!HARDCODE sector size
.WOV5: ADD HL,DE
DJNZ .WOV5
; B=0
LD (.R_POINT),HL ;!FIXIT íâ® §­ ç¥­¨¥ 㦥 à ácç¨â뢠¥âáï ¯¥à¥¤ ¢ë室®¬ ¢ BLOCK_WRITE?
;LD B,0
POP HL
ADD HL,BC
EX DE,HL
POP HL
LD C,B
ADC HL,BC
.WOV2: POP BC
LD A,B
AND #01
LD B,A
OR C
JR Z,.WOV6
PUSH HL
PUSH DE
PUSH BC
LD IX,CORE_BUFFERS.BUFFER+#C000
LD B,1
IN A,(SLOT3)
PUSH AF
IN A,(SLOT0)
OUT (SLOT3),A
CALL BLOCK_READ
POP BC
LD C,SLOT3
OUT (C),B
LD DE,CORE_BUFFERS.BUFFER
LD HL,(.R_POINT)
POP BC
JP C,.ERR2
LDIR
LD (.R_POINT),HL
POP DE
POP HL
LD IX,CORE_BUFFERS.BUFFER+#C000
LD B,1
IN A,(SLOT3)
PUSH AF
IN A,(SLOT0)
OUT (SLOT3),A
CALL BLOCK_WRITE
POP BC
LD C,SLOT3
OUT (C),B
RET C
.WOV6: LD HL,(.R_POINT)
.S_POINT+1: LD DE,0
; CF=0
;AND A
SBC HL,DE
PUSH HL
EX DE,HL
LD XH,D
LD XL,E
LD HL,0
CALL MOVE_FP.F_current
CALL MOVE_CP
POP DE
RET NC ; …᫨ à §¬¥à ä ©«  ­  ¤¨áª¥ <20>… áâ « ¡®«ìè¥, 祬 ¡ë«
; …᫨ à §¬¥à ä ©«  ­  ¤¨áª¥ áâ « ¡®«ìè¥, 祬 ¡ë«
LD L,(IY + _sFM.F_POSITION+0)
LD H,(IY + _sFM.F_POSITION+1)
LD C,(IY + _sFM.F_POSITION+2)
LD B,(IY + _sFM.F_POSITION+3)
LD (IY + _sFM.FS_REC.F_SIZE+0),L
LD (IY + _sFM.FS_REC.F_SIZE+1),H
LD (IY + _sFM.FS_REC.F_SIZE+2),C
LD (IY + _sFM.FS_REC.F_SIZE+3),B
AND A
RET
;
.WOV1: PUSH BC
PUSH HL
PUSH DE
LD IX,CORE_BUFFERS.BUFFER+#C000
LD B,1
IN A,(SLOT3)
PUSH AF
IN A,(SLOT0)
OUT (SLOT3),A
CALL BLOCK_READ
POP BC
LD C,SLOT3
OUT (C),B
POP DE
POP HL
EXX
POP DE
JP C,.ERR1
LD HL,512 ;!HARDCODE ;!FIXIT ; [ ] sector size
AND A
SBC HL,DE
LD B,H
LD C,L
POP HL
AND A
SBC HL,BC
JR NC,.WOV3
ADD HL,BC
LD B,H
LD C,L
LD HL,0
.WOV3: PUSH HL
LD HL,CORE_BUFFERS.BUFFER
ADD HL,DE
LD DE,(.R_POINT)
EX DE,HL
LDIR
LD (.R_POINT),HL
EXX
PUSH HL
PUSH DE
LD IX,CORE_BUFFERS.BUFFER+#C000
LD B,1
IN A,(SLOT3)
PUSH AF
IN A,(SLOT0)
OUT (SLOT3),A
CALL BLOCK_WRITE
POP BC
LD C,SLOT3
OUT (C),B
POP HL
JP C,.ERR2
LD BC,1
ADD HL,BC
EX DE,HL
POP HL
LD C,B
ADC HL,BC
JP .WOV4
;

73
DSS/API/bootDsk.asm Normal file
View File

@ -0,0 +1,73 @@
;/////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #09. <20>®¬¥à á¨á⥬­®£® ¤¨áª .
; ‚®§¢à é ¥â ­®¬¥à ¤¨áª , c ª®â®à®£® § £à㦥­  á¨á⥬ .
;
; <20>ਠB = 0 (GET)
; ¢ë室: A - ­®¬¥à á¨á⥬­®£® ¤¨áª  (0=A,1=B,..)
; <20>ਠB = 1 (SET - ¨á¯. boot-§ £àã§ç¨ª á¨á⥬ë, ¯®á«¥ 祣® äã­ªæ¨ï ­¥¤®áâ㯭 )
; ¢å®¤: H - ­®¬¥à ãáâனá⢠, L - ­®¬¥à à §¤¥«  ­  ãáâனá⢥
; ¢ë室:
;/////////////////////////////////////////////////////////////////////
BOOTDSK:
INC B
DEC B
JR Z,.GET
DEC B
.chg: JR Z,.SET ;R13 ¬¥­ï¥âáï ­  JR ,SETBOOT ¯®á«¥ ¯¥à¢®£® 㤠筮£® ¨á¯®«­¥­¨ï SETBOOT
LD A,DSS_Error.sys.INVALID_FUNCTION
SCF
RET
.GET: ;GET BOOT DISK
.NUM+1: LD A,0 ;R09
AND A
RET
; ‘®®¡é¨âì DSS á ª ª®£® ¤¨áª  § £à㦠¥âáï á¨á⥬ .
; ˆá¯. § £àã§ç¨ª á¨áâ¥¬ë ¤«ï ¨­¨æ. ï祩ª¨ "boot_disk".
.SET: LD B,H ;SET BOOT DISK
LD C,0
;[x] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
LD (.part),HL
;
.loop: PUSH BC
LD A,C
LD DE,Dss.DRV.GenIOCTL.Enter
LD BC,Dss.DRV.GenIOCTL.GetParams
RST ToDSS.DRV
;[x] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
LD A,C ; ­®¬¥à ¯ àâ¨æ¨¨ ¢ MBR ¤¨áª 
;
POP BC
JR C,.NoSupport
EX AF,AF' ;PHISICAL DRIVE NUMBER
CP B
JR NZ,.NoSupport
;[x] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
EX AF,AF' ; ­®¬¥à ¯ àâ¨æ¨¨ ¢ MBR ¤¨áª 
.part+1: LD HL,0
CP L
JR NZ,.NoSupport
;
;R13
LD A,#38 ; opcode for JR C,addr
LD (BOOTDSK.chg),A
;R13
LD A,C
LD (BOOTDSK.NUM),A
AND A
RET
.NoSupport:
INC C
LD A,(LDRIVE)
CP C
JR NZ,.loop
SCF
RET
; <20>®¬¥à ¯®á«¥¤­¥£® ¤¨áª  ¢ á¨á⥬¥
LDRIVE: DB DSS_MAX_DRIVES_AMOUNT
IF COMPILE_UNUSED_CODE
TDRIVE: DB #00
TCLUST: DW #0000
TCOUNT: DW #0000
ENDIF
;

22
DSS/API/curDisk.asm Normal file
View File

@ -0,0 +1,22 @@
;/////////////////////////////////////////////////////////////////////
; ”ã­ªæ¨ï #02. <20>®¬¥à ⥪ã饣® ¤¨áª .
;
; ¢å®¤: ­¥â
; ¢ë室: A - ­®¬¥à ¤¨áª  (0=A,1=B,..)
; C - ­®¬¥à ¯®á«¥¤­¥£® ¤¨áª  ¢ á¨á⥬¥
;/////////////////////////////////////////////////////////////////////
CURDISK_FN:
LD A,(LDRIVE)
LD C,A
LD A,(CORE_BUFFERS.CurrentPath)
SUB 'A'
RET NC
LD A,DSS_Error.sys.INVALID_DRIVE
RET
CURDISK:
LD A,(LDRIVE)
LD C,A
LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
AND A
RET
;

259
DSS/API/diskINF.asm Normal file
View File

@ -0,0 +1,259 @@
;/////////////////////////////////////////////////////////////////////
; [ ] ­®¢ ï ¯®¤äã­ªæ¨ï á ¡¨â®¬ 7 ¢ ॣ. €
; ‚®§¢à é ¥â ¨­ä®à¬ æ¨î ®¡ ®¡é¥¬ ¨ ᢮¡®¤­®¬ ¯à®áâà ­á⢥ ¤¨áª®¢®£®
; ãáâனá⢠.
;
; ¢å®¤: A - ­®¬¥à ¤¨áª  (0=A,1=B .. 25=Z. #FF-⥪ã騩)
; <09>ਠA bit7 = 1:
; A and #7F - ­®¬¥à ¤¨áª 
; HL - ¡ãä¥à (256 ¡ ©â®¢) ¤«ï à áè¨à¥­­ëå ¤ ­­ëå:
; B != 0 - áç¨â âì ᢮¡®¤­®¥ ¬¥áâ®
; ;
; à §¬¥à ¯®«ï - 1 ¡ ©â
; ” ©«®¢ ï á¨á⥬ 
; ;
; à §¬¥à ¯®«ï - 1 ¡ ©â
; ‘¥à¨©­ë© ­®¬¥à ¤¨áª 
; ;
; à §¬¥à ¯®«ï - 1 ¡ ©â
; Œ¥âª  ¤¨áª 
; ;
; à §¬¥à ¯®«ï - 1 ¡ ©â
; 䨧¨ç¥áª¨© ­®¬¥à ¤¨áª , ­®¬¥à à §¤¥« 
; ;
; à §¬¥à ¯®«ï - 1 ¡ ©â
; § à¥§¥à¢¨à®¢ ­®
; ;
; ¢ë室: CF=0:
; A - à §¬¥à ª« áâ¥à  ¢ ᥪâ®à å
; HL':HL - ®¡é¥¥ ª®«-¢® ª« áâ¥à®¢
; DE':DE - ᢮¡®¤­ëå ª« áâ¥à®¢
; BC - à §¬¥à ᥪâ®à  ¢ ¡ ©â å
; CF=1:
; A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Œ¥âª  ¤¨áª  ¯à®¢¥àï¥âáï á­ ç «  ¢ ª®à­¥¢®¬ ª â «®£¥ ¨ ¥á«¨ â ¬ ;
; ­¥â, â® ¡¥àñâáï ¬¥âª  ¨§ BPB ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;/////////////////////////////////////////////////////////////////////
DISKINF: LD C,B
LD B,1
;
CP #80
JP C,.CustomDisk
CP #FF
JR Z,.CurrentDisk
; more info
LD B,C
AND %0111'1111
PUSH HL
PUSH AF
CALL .CustomDisk
POP IX
JR C,.error
;
EX (SP),HL
PUSH DE
PUSH AF
PUSH BC
;;;;
;
EX DE,HL
LD HL,FAT_STRING ;!HARDCODE FAT FS
LD C,5 ;!HARDCODE _sBOOT_SECTOR_PARAMS.ID_FAT.length
CALL .mCOPY_LOOP
; 12, 16 or 32
LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE)
CP FAT_TYPE.x16
JR C,.next_prm
;
PUSH DE
DEC DE
LD A,'6'
JR Z,.put_char
; fat 32
DEC DE
LD A,'3'
.put_char: LD (DE),A
POP DE
;
.next_prm: LD HL,CORE_BUFFERS.FS_Buffer.BPB_SERIAL_NUMBER
LD C,4 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER
CALL .mCOPY_LOOP
;
; fat32
EXX
PUSH DE
PUSH HL
EXX
;LD HL,CORE_BUFFERS.FS_Buffer.BPB_LABEL
PUSH IX
CALL GET_LABEL
LD C,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL
CALL .mCOPY_LOOP
POP AF
PUSH DE
;LD A,XH
LD DE,Dss.DRV.GenIOCTL.Enter
LD BC,Dss.DRV.GenIOCTL.GetParams
RST ToDSS.DRV
POP DE
; fat32
EXX
POP HL
POP DE
EXX
JR C,.error_drv
LD A,2 ;!HARDCODE ¤«¨­  ¯®«ï ü4 2 ¡ ©â : 䨧 ­®¬¥à ¤¨áª , ­®¬¥à à §¤¥«  ¤¨áª 
LD (DE),A
INC DE
EX AF,AF'
LD (DE),A ;䨧 ­®¬¥à ¤¨áª 
INC DE
LD A,C
LD (DE),A ;­®¬¥à à §¤¥«  ¤¨áª 
INC DE
;
.error_drv: EX AF,AF'
XOR A
LD (DE),A
;;;;
POP BC
POP AF
POP DE
EX AF,AF'
JR C,.error
EX AF,AF'
.error: POP HL
RET
;
.CurrentDisk: LD A,(CORE_BUFFERS.CurrentPath)
SUB 'A'
LD HL,CORE_BUFFERS.FS_Buffer.DRIVE
CP (HL)
JR Z,.CheckFreeSpace
;
.CustomDisk: PUSH BC
CALL CHDISK ;R06
POP BC
RET C
;
.CheckFreeSpace:; ¥á«¨ GetFreeSpace ­¥ ¢ë§ë¢ ¥âáï
XOR A
OR B
LD BC,(CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_L)
EXX
LD BC,(CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_H)
EXX
CALL NZ,GetFreeSpace
;
;.FRESP2:
; A = 0 if B != 0 before .GetFreeSpace
;
LD H,B
LD L,C
LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_L),HL
EX DE,HL
EXX
LD H,B
LD L,C
LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_H),HL
EX DE,HL
EXX
LD HL,(CORE_BUFFERS.FS_Buffer.MaxClusterLow)
DEC HL
; fat 32
EXX
LD HL,(CORE_BUFFERS.FS_Buffer.MaxClusterHigh)
JR NC,.skip_dec_hl
DEC HL
.skip_dec_hl: EXX
LD BC,(CORE_BUFFERS.FS_Buffer.BytesPerSector)
LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster)
AND A
RET
;
; [ ] 22/11/23 ¯®¤äã­ªæ¨ï á ¤®¯.¨­ä®©
.mCOPY_LOOP: LD B,0
EX DE,HL
LD (HL),C
EX DE,HL
INC DE
LDIR
RET
;
;
GetFreeSpace: LD A,1
LD (CORE_BUFFERS.FS_Buffer.UPD_FSINFO),A
LD HL,2 ; fat32 ­®¬¥à ª« áâ¥à  ®â ª®â®à®£® áç¨â âì
XOR A
; fat32
EXX
LD H,A
LD L,A
LD B,A
LD C,A
EXX
LD B,A
LD C,A
.loop_free_space:;!FIXIT
PUSH BC
EXX
PUSH BC
EXX
CALL READ_FROM_FAT
EXX
POP BC
EXX
POP BC
CP DSS_Error.sys.DISK_FULL
RET Z
; fat 32
EXX
LD A,E
OR D
EXX
OR E
OR D
JR NZ,.skip
;
INC BC
LD A,B
OR C
JR NZ,.skip
EXX
INC BC
EXX
;
.skip: INC HL
LD A,L
OR H
JR NZ,.loop_free_space
EXX
INC HL
EXX
JP .loop_free_space
;
FAT_STRING: DB 'FAT12'
;
; DE - ¡ãä¥à
GET_LABEL: PUSH DE
LD HL,.LABEL_MASK ; "\*.*" ¨¬ï ¬¥âª¨
LD A,FAT_ATTR.VOLUME_ID ;  âਡãâ ¬¥âª¨ ⮬ 
LD B,high Dss.F_First.FATname
CALL F_FIRST
POP DE
.from_BPB: LD HL,CORE_BUFFERS.FS_Buffer.BPB_LABEL
RET C
; [ ] 07/03/2025 ª®áâë«ì ¤«ï  âਡãâ  0. <20> áâ®ï« ‘ ¢¥«¨©))
LD HL,BUFFER_FIND.REC_Attr
ADD HL,DE
LD A,(HL)
OR A
SCF
JR Z,.from_BPB
;
LD HL,BUFFER_FIND.REC_Name
ADD HL,DE
RET
.LABEL_MASK: DB '\*.*',0

View File

@ -1,12 +1,50 @@
;ˆ§¬¥­¥­¨ï ¯®á«¥ ¢¥àᨨ 1.70 !FIXIT
‚ ¦­®¥: [ ] D:\>copy dss\system.dos c:\system.dos (bp 812d, 8136)
Can't open source file
[ ] E:\BIN\MENU>c:\dss
çâ®-â® ¯à® § ¯®«­¥­­®áâì ¤¨à¥ªâ®à¨¨
[ ] C:\????? ¨«¨ ?????
¨á¯®«­ï¥âáï ª ª ª®¬ ­¤ 
-----------------------------------------------------------------------------------------------------------------------------------------------
!TODO
‚ ¦­®¥:
[ ] ¯¥à¥¤ ­ ç «®¬ à ¡®âë «î¡®© ¯à®æ¥¤ãàë § ¯¨á¨/ç⥭¨ï ¤à ©¢  ãáâ ­ ¢«¨¢ âì ä« £, ç⮡ ­¥ ¡ë«® ¯®¢â®à­®£® ¢ë§®¢  (¨§ ¯à¥à뢠­¨ï, ­ ¯à¨¬¥à)
[ ] ¡«®ª¨à®¢ª  ä ©«®¢ ¢ ä ©«®¢ëå ¬ ­¨¯ã«ïâ®à å (ç⮡ ­¥ ®âªà뢠âì ­  § ¯¨áì 㦥 ®âªàëâë© ­  § ¯¨áì ä ©«, ­ ¯à¨¬¥à)
‘।­¥¥: ‘।­¥¥:
[x] ¯¥à¥¤ à¥áª ­®¬ ¤à ©¢®¢ ¯à®¢¥àïâì ®âªàëâë¥ åí­¤«ë ¨ ¥á«¨ ¡ãª¢  ¤¨áª  ¬¥­ï¥âáï, â® ¬¥­ïâì ¤à ©¢ ¢ åí­¤«¥
[?] ­ ç âì à ¡®â âì á äã­ªæ¨ï¬¨ REMOVABLE ¨ MEDIA CHECK rst #18. ‚®§¢à é âì §­ ç¥­¨¥ #FF, ¥á«¨ ¯®à冷ª ¡ãª¢ ¨§¬¥­¨«áï
‚®®¡é¥ ­¥ ¢ ¦­®¥: ‚®®¡é¥ ­¥ ¢ ¦­®¥:
¨á¯à ¢¨âì ¢ë室 ¨§ ä㭪樨 #41 ¯à¨ ¢®§¬®¦­®¬ 㢥«¨ç¥­¨¨ ­®¬¥à  â áª¨ ­  1 ¯à¨ 255 [ ] ¨á¯à ¢¨âì ¢ë室 ¨§ ä㭪樨 #41 ¯à¨ ¢®§¬®¦­®¬ 㢥«¨ç¥­¨¨ ­®¬¥à  â áª¨ ­  1 ¯à¨ 255
-----------------------------------------------------------------------------------------------------------------------------------------------
DSS 1.71.35
ˆ§¬¥­¥­¨ï ¯®á«¥ ¢¥àᨨ 1.70.2
- ¤®á ¨ ¡¨®á ¬®£ãâ ãáâ ­ ¢«¨¢ âì § ç¥¬-⮠०¨¬ txt 40x32 ¨ ­®à¬ «ì­® ¢ ­ñ¬ ¢ë¢®¤¨âì ⥪áâ
- LOADDIR:fix ¬ãá®à ¢ áâà ­¨æ¥ ª â «®£ , ¥á«¨ ª â «®£ ¬¥­ìè¥ áâà ­¨æë
- DiskINF: ª®áâë«ì ¤«ï  âਡãâ  0. <20> áâ®ï« ‘ ¢¥«¨©)). …᫨ ¢ ª®à­¥ à ­ìè¥ ¬¥âª¨ ¤¨áª  ¯®¯ ¤ «áï ä ©« á  âਡã⮬ 0, â® äã­ªæ¨ï ¢®§¢à é «  ¥£® ¨¬ï ª ª ¬¥âªã ¤¨áª 
- ¯à®æ¥¤ãà  § ¯ã᪠ EXE ¬®£«  § «¥§âì ­¥ ¢ âã ¯ ¯ªã ¯¥à¥¤ ¯¥à¥¤ ç¥© ã¯à ¢«¥­¨ï § ¯ã᪠¥¬®¬ã ¯à¨«®¦¥­¨î á ¢¥àᨥ© EXE = 0 ¢ § £®«®¢ª¥
- ATAPI ãáâனá⢮ ¢á¥£¤  ¯®«ã砥⠡㪢ã, ¤ ¦¥ ¡¥§ ­®á¨â¥«ï
- Ž¡à ¡ â뢠¥âáï ®è¨¡ª  "ᬥ­  ­®á¨â¥«ï"
- ä ©« ­¥ á®§¤ áâáï, ¥á«¨ ­¥â ᢮¡®¤­®£® ¬ ­¨¯ã«ïâ®à 
- ¯®¬¥­ï« ª¢ ¤à â¨ª ªãàá®à  ¢ ª®­á®«¨ ¤«ï ०¨¬  OVR (ª®â®àë© ¯®á«¥ ­ ¦ â¨ï ­  Ins)
- Œ¥«ª¨¥ ¯à ¢ª¨, àîè¥çª¨, ¡ £ä¨ªáë ­¥ã¯®¬ï­ãâë¥ ¢ í⮬ ᯨ᪥ ¯® ¯à¨ç¨­¥  ¬­¥§¨¨ ¨ å « â­®áâ¨
; TEST
DSS 1.70.2
ˆ§¬¥­¥­¨ï ¯®á«¥ ¢¥àᨨ 1.70
CORE:
[+] ¯à¨ ç⥭¨¨/§ ¯¨á¨ ä ©«  ­¥ ¯à®¨á室¨â "宫®á⮥" ¯¥à¥ç¨â뢠­¨¥ FAT ®â ­ ç «  ä ©« 
[+] ¯¥à¥ç¨â뢠­¨¥ BPB ⥯¥àì ¤¥« ¥âáï ­¥ ­  ª ¦¤ë© ç¨å,   ª®£¤  ­ ¤® (¨ ¡ £  ¯à¨ § £à㧪¥ á ¤¨áª  "B:" ­¥â :-P )
[+] ¨§¬¥­¥­  à ¡®â  á RAM DISK, ⥯¥àì ®­ ¬®¦¥â ¡ëâì § £àã§®ç­ë¬
[+] ¨á¯à ¢«¥­ë ¡ £¨ ¢ äã­ªæ¨ïå: WINCOPY, WINREST, SCROLL, SETVMOD, SELPAGE
SHELL:
[+] ¨á¯à ¢«¥­ ¡ £ á "C:\>CD E:\"
[+] ¨á¯à ¢«¥­ë ¡ £¨ á ®¡à ¡®âª®© ¡ãä¥à®¢ ª®¬ ­¤­®© áâப¨
UNSORTED:
[+] ¨á¯à ¢«¥­ ¡ £ á ¯¥à¥ª«î祭¨¥¬ ­  ¤à㣮© ¤¨áª ¨§ ­¥ª®à­¥¢®© ¤¨à¥ªâ®à¨¨, ª®£¤  ­  ­®¢®¬ ¤¨áª¥ ®ª §ë¢ «áï ¢ ­¥áãé¥áâ¢ãî饩 ¤¨à¥ªâ®à¨¨
[+] ¬¥«ª¨¥ ¨ ­¥ ®ç¥­ì ®¯â¨¬¨§ æ¨¨
;ˆ§¬¥­¥­¨ï ¯®á«¥ ¢¥àᨨ 1.60 ;ˆ§¬¥­¥­¨ï ¯®á«¥ ¢¥àᨨ 1.60
10.02.2003 - „®¡ ¢«¥­  ¢¨§ã «¨§ æ¨ï ªãàá®à  ¢ ä㭪樨 ECHOKEY. 10.02.2003 - „®¡ ¢«¥­  ¢¨§ã «¨§ æ¨ï ªãàá®à  ¢ ä㭪樨 ECHOKEY.

View File

@ -1,572 +0,0 @@
;[BEGIN]
;//MODULE: DOS-MAIN AUTHOR: Denis Parinov
;//CREATE: A LONG TIME AGO :)
;---------------------------------------------------------------
;Rev Date Name Description
;---------------------------------------------------------------
;[ ] ¯ãâì ⥪ã饣® ª â «®£  ¢ DIR ¢ë¢®¤¨âáï á £«îª®¬ ¥á«¨ ®­ ¤«¨­¥¥ 256 ¡ ©â®¢
;[ ] ¯ãâì ¢ ¯à¨£« è¥­¨¨ ª®­á®«¨ ¢ë¢®¤¨âáï á £«îª®¬ ¥á«¨ ¯ãâì ¤«¨­¥¥ 256 ¡ ©â®¢
;[ ] ;!FIXIT ª ª®©-â® ¡ £ ¯à¨ ª®â®à®¬ ¥á«¨ ­¥â ¤¨áª  ¨ ­  ­¥£® ¯®«¥§âì, â® ¢áñ «®¬ ¥âáï
;R11 17-04-2023 BAO OPTIMIZED BUFFERS, FREED UP 768 BYTES FOR CODE
;R10 14-04-2023 BAO €¢ à¨©­ë© § ¢¨á®­ á ¢ë¢®¤®¬ á®®¡é¥­¨ï ¯à¨ áâ à⥠á¨á⥬ë, ¥á«¨ ­¥â ᢮¡®¤­®© ¯ ¬ïâ¨
;R09 08-04-2023 BAO ‘®ªà é¥­¨¥ à §¬¥à  â ¡«¨æë API ¤® 96 ä㭪権 (0 - #5F). (Ž¯æ¨®­ «ì­® ¯à¨ ª®¬¯¨«ï樨)
;R08 15-04-2003 DNS RENAMED FN. OPEN AND CLOSE
;R07 31-03-2003 DNS NEW DEPLOYING ROUTINE
;R06 31-03-2003 DNS RELAYOUTING MEMORY
;R05 27-03-2003 DNS CHANGE DRV. INIT. METHOD
;R04 27-03-2003 DNS DRIVERS MOVE TO SPECIAL PAGE
;R03 14-03-2003 DNS CODE OPTIMIZATION
;R02 19-11-2002 DNS ADD ENVIRONMENT INITIALIZATION
;R01 14-11-2002 DNS CUT AND MOVE BPB-STRUCT
;---------------------------------------------------------------
; OUTPUT './Build/system.dos'
; MODULE MAIN
//SPRINTER EQU 2000
includelua 'Shared_includes/lua/Functions.lua'
INCLUDE 'defines.inc'
include 'shared_includes/constants/sp2000.inc'
include 'shared_includes/constants/bios_equ.inc'
include 'shared_includes/constants/dss_equ.inc'
include 'shared_includes/structures/FileSystem.inc'
include 'shared_includes/macroses/accelerator.z80'
include 'shared_includes/macroses/macros.z80'
include 'Structures.inc'
INCLUDE 'VERSION.INC'
INCLUDE 'DSS_MACROSES.Z80'
;PAGEDRV EQU #00
; DIRPAGE EQU 0
; FATPAGE EQU 1
; TXTPAGE EQU 2
; ENVPAGE EQU 2
; DRVPAGE EQU 3
; ENVPAGE EQU 3
; DRVPAGE EQU 4
; TXTADDR EQU #C000
; ENVADDR EQU #E400
; DIR EQU #C000
; FAT EQU #C000
;
; = -- = -- = -- = -- = = -- = -- = = -- = -- = = -- = -- = -- = -- = --;
ORG 0
;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
; <[CLOSE TASK]> ;
RST_0x00: JP LEAVE ;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
;
;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
; <[BIOS API]> ;
_mInfoBLOCK 8-$,#FF ;
RST_0x08: PUSH AF ;
LD A,SYS_PORT.PAGE8;
OUT (SYS_PORT.ON),A ;
POP AF ;
RET ;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
;
;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
; <[DSS API]> ;
_mInfoBLOCK #10-$,#FF ;
RST_0x10: JP RST_10 ;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
;
;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
; <[DRIVE API]> ;
_mInfoBLOCK #18-$,#FF ;
;A0018 JP INTDISK ;
RST_0x18: PUSH AF ;
PUSH BC ;
DRV_PG_NUMBER+2: ;
LD BC,0*256+SLOT0 ;
JP PORTAL.outMAIN ;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
;
;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
; <[NOT USED]> ;
_mInfoBLOCK #20-$,#FF ;
RST_0x20: JP RST_20 ;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
;
;
RST_20:
RST_28:
NOPS: LD A,DSS_Error.sys.INVALID_FUNCTION
SCF
RET
;
;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
; <[NOT USED]> ;
_mInfoBLOCK #28-$,#FF ;
RST_0x28: JP RST_28 ;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
;
;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
; <[MOUSE API]> ;
_mInfoBLOCK #30-$,#FF ;
RST_0x30: JP INTMOUS ;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
;
;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
; <[MAIN INT]> ;
_mInfoBLOCK #38-$,#FF ;
RST_38: ;
JP RST_0x38 ; <20>â®â ¤¦ ¬¯ ­ã¦¥­, ç⮡ á®äâë ¬®£«¨ «¥£ª® ¬¥­ïâì ®¡à ¡®â稪 ­  ᢮©. Š®áâë«ì­®.
RST_0x38: ;
INT_: 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 ;
LD C,#80 ;
RST #30 ;
IFN CLASSIC_CURSOR ;
CALL cursor_interrupt; ¢¥ªâ®à ®¡á«ã¦. ªãàá®à  ;!!!!! VASIL
ENDIF ;
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 ;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
;
;
NMI: RETN
;
;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
; <[ NMI ]> ;
_mInfoBLOCK #66-$,#FF ;
NMI_0x66: JP NMI ;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
;
;
RST_10: PUSH HL
LD L,C
IF SHORT_RSTx10_TABLE
;[ ] R09
LD H,A
LD A,#5F
SUB C
JR C,.error
LD A,H
;[ ] R09
ENDIF
LD H,high ADRST10
LD C,(HL)
INC H
LD H,(HL)
LD L,C
EX (SP),HL
RET
IF SHORT_RSTx10_TABLE
;[ ] R09
.error: POP HL
JR NOPS
;[ ] R09
ENDIF
;
;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
; <[DRIVE PAGE SWITCH]> ;
_mInfoBLOCK #80-$,0 ;
;ENTER: ;
PORTAL.outMAIN: ;
IN A,(C) ;
OUT (C),B ;
ASSERT $!=84,'-> Portal error!';
POP BC ;
RET ;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
;
; = -- = -- = -- = -- = = -- = -- = = -- = -- = = -- = -- = -- = -- = --;
;
/*
STRUCT _sBOOT_SEC
.JMP: BLOCK 3,0 ; +#00 "JMP"
.ID_NAME: TEXT 8,{"DSS_1.7","0"} ; +#03 DOS NAME - DB "DSS_1.70"
; Block Parameters BIOS
.B_P_S: WORD #200 ; +#0B BYTE PER SECTOR
.S_P_C: BYTE 2 ; +#0D SECTORS PER CLUSTER
.RESERVE: WORD 1 ; +#0E RESERVE SECTORS
.FAT_NUM: BYTE 2 ; +#10 AMOUNT FATS
.F_P_DIR: WORD 112 ; +#11 FILES IN DIRECTORY
.S_P_D: WORD 1440 ; +#13 ALL SECTORS ON DISK
.ID_FORM: BYTE #F0 ; +#15 ID FORMAT
.S_P_F: WORD 2 ; +#16 SIZE FAT IN SECTORS
.S_P_T: WORD 9 ; +#18 SECTOR PER TRACK
.HEADS: WORD 2 ; +#1A AMOUNT SIDES
.HIDDEN: DWORD 0 ; +#1C HIDDEN SECTORS
.BPB_BIG_TOTAL_SECTORS: DWORD 0 ; +#20 BIG TOTAL SECTOR
.BPB_PHISICAL_DRIVE_NUMBER: WORD #80 ; +#24 PHISICAL DRIVE NUMBER
.BPB_EXT_BOOT_RECORD_SIGNATURE: BYTE #29 ; +#26 EXTENDED BOOT RECORD SIGNATURE
.BPB_SERIAL_NUMBER: DWORD 0 ; +#27 VOLUME SERIAL NUMBER
.BPB_LABEL: TEXT 8,{"NO NAME"," "} ; +#2B DISK LABEL
.ID_FAT: TEXT 8,{"FAT16"," "} ; +#36 FILE SYSTEM ID ( BPB_FS_ID )
ENDS
*/
;R01
; Area for boot sector BootSector.
;BootSector _sBOOT_SEC ,{ "DSS_","0"+VERS,".",MODF/10+"0",MODF-(MODF/10)*10+"0" }
; end boot sector
;R01
; <20>¥à¢ë© áâ àâ á¨á⥬ë, ¯®á«¥ ¨­¨æ¨ «¨§ æ¨¨  ¤à¥á ¢ â ¡«¨æ¥ ¬¥­ï¥âáï ­  VERSION
F_START:
DI
CALL DEPLOY ;R07 ;íâ  ¯à®æ¥¤ãà  § âàñâáï ¯®á«¥ ¨á¯®«­¥­¨ï
RET C ;R10
CALL KINIT
CALL PRINT_INIT
LD C,0
RST #30
LD A,(VMODE)
LD C,#81
RST #30
;CALL INITDVC ;R05
;R05
LD C,#00
RST #18
LD (LDRIVE),A
;R05
EI
;Set new address fn. VERSION
LD HL,ADRST10
LD (HL),low VERSION ;R03
INC H
LD (HL),high VERSION ;R03
;------[CLEAR BUFFERS]------;
;R07 ;R11
LD HL,CLEAR_ZONE.start
LD DE,CLEAR_ZONE.start+1
LD BC,CLEAR_ZONE.size-1
LD (HL),0
LDIR
;R07 ;R11
;R11
LD HL,FM_BUF
LD (HL),'.'
;R11
;---------------------------;
;R02
;LD B,#FF ;INIT ENVIRONMENT
CALL INITENV
IFN CLASSIC_CURSOR
CALL SETUP_CURSORS
ENDIF
;R02
JP VERSION
;R03
;R07Allocate memory
; LD BC,#03C2
; RST ToBIOS
; LD HL,BANKTBL
; LD C,A
; LD B,#FF
;VERINIT INC B
; PUSH BC
; PUSH HL
; LD A,C
; LD C,#C4
; RST ToBIOS
; POP HL
; POP BC
; LD (HL),A
; INC HL
; JR NC,VERINIT
;R07;R03
;R07 JP INIT2 ;R03
; DS $/256+1*256-$,0 c:\bin\menu
MEMTAB BLOCK 256,0
_mInfoALIGN 256,0
;------------------------------------------------------------------------------------------------------------------------;
GO_ZERO EQU #0000
;FUNCTION ADDRESS ARRAY
ADRST10: ;DS 512 ;,0
;...............................................[LOW ADDRESS ]:
; 0 1 2 3 4 5 6 7 8 9 DEC HEX
DB low F_START, low CHNDISK, low CURRDSK, low DISKINF, low NOPS, low NOPS, low NOPS, low NOPS, low SCANDRV, low BOOTDSK ; 0 00..09
DB low CREATE, low CREAT_N, low NOPS, low NOPS, low DELETE, low NOPS, low RENAME, low OPEN_FN, low CLOSE_FN, low READ ; 1 A0..13
DB low WRITE, low MOVE_FP, low ATTRIB, low GET_D_T, low PUT_D_T, low F_FIRST, low F_NEXT, low MKDIR, low RMDIR, low CHDIR ; 2 14..1D
DB low CURRDIR, low NOPS, low NOPS, low SYSTIME, low SETTIME, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 3 1E..27
DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low WAITKEY, low SCANKEY ; 4 28..31
DB low ECHOKEY, low CTRLKEY, low NOPS, low K_CLEAR, low K_SETUP, low TESTKEY, low SETWIN, low SETWIN1, low SETWIN2, low SETWIN3 ; 5 32..3B
DB low FREEMEM, low GETMEM, low RETMEM, low SETMEM, low EXEC, low LEAVE, low WAIT, low GSWITCH, low DOSNAME, low EX_PATH ; 6 3C..45
DB low ENVIRON, low APPINFO, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 7 46..4F
DB low SETVMOD, low GETVMOD, low LOCATE, low CURSOR, low SELPAGE, low SCROLL, low CLEAR, low RDCHAR, low WRCHAR, low WINCOPY ; 8 50..59
DB low WINREST, low PUTCHAR, low PCHARS, low NOPS, low NOPS, low PRINT ; 9 5A..5F
IFN SHORT_RSTx10_TABLE
;[ ] R09
DB low NOPS, low NOPS, low NOPS, low NOPS ; 9 60..63
DB low NOPS, low NOPS, low NOPS, low NOPS, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO ; 10 64..6D
DUP 13
DB low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO; 110-239 6E-EF
EDUP
DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 24 F0..F9
DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; END ; 25 FA..FF
ELSE ;!TODO free space
_mInfoBLOCK ADRST10+#100 - $,0
;[ ] R09
ENDIF
;...............................................[HIGH ADDRESS]:
DB high F_START,high CHNDISK,high CURRDSK,high DISKINF,high NOPS, high NOPS, high NOPS, high NOPS, high SCANDRV, high BOOTDSK
DB high CREATE, high CREAT_N,high NOPS, high NOPS, high DELETE, high NOPS, high RENAME, high OPEN_FN,high CLOSE_FN,high READ
DB high WRITE, high MOVE_FP,high ATTRIB, high GET_D_T,high PUT_D_T,high F_FIRST,high F_NEXT, high MKDIR, high RMDIR, high CHDIR
DB high CURRDIR,high NOPS, high NOPS, high SYSTIME,high SETTIME,high NOPS, high NOPS, high NOPS, high NOPS, high NOPS
DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high WAITKEY, high SCANKEY
DB high ECHOKEY,high CTRLKEY,high NOPS, high K_CLEAR,high K_SETUP,high TESTKEY,high SETWIN, high SETWIN1,high SETWIN2, high SETWIN3
DB high FREEMEM,high GETMEM, high RETMEM, high SETMEM, high EXEC, high LEAVE, high WAIT, high GSWITCH,high DOSNAME, high EX_PATH
DB high ENVIRON,high APPINFO,high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS
DB high SETVMOD,high GETVMOD,high LOCATE, high CURSOR, high SELPAGE,high SCROLL, high CLEAR, high RDCHAR, high WRCHAR, high WINCOPY
DB high WINREST,high PUTCHAR,high PCHARS, high NOPS, high NOPS, high PRINT
IFN SHORT_RSTx10_TABLE
;[ ] R09
DB high NOPS, high NOPS, high NOPS, high NOPS
DB high NOPS, high NOPS, high NOPS, high NOPS, high GO_ZERO,high GO_ZERO,high GO_ZERO,high GO_ZERO,high GO_ZERO, high GO_ZERO
DUP 13
DB high GO_ZERO,high GO_ZERO,high GO_ZERO,high GO_ZERO,high GO_ZERO,high GO_ZERO,high GO_ZERO,high GO_ZERO,high GO_ZERO, high GO_ZERO
EDUP
DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS
DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS ; END
ELSE
;!TODO free space
;_mInfoBLOCK ADRST10+#200 - $,0
;[ ] R09
ENDIF
; DB low WINREST, low PUTCHAR, low PCHARS, low NOPS, low NOPS, low PRINT, low NOPS, low NOPS, low NOPS, low NOPS ; 9 5A..63
; DB high WINREST,high PUTCHAR,high PCHARS, high NOPS, high NOPS, high PRINT, high NOPS, high NOPS, high NOPS, high NOPS
;---------------------------------------------------------------------------------------------------------------------------------------------------------------;
;[INCLUDE]
;!TODO § ¬¥­¨âì ¯®-¬ ªá¨¬®¬ã ¢áñ ¢ KEYINTER.ASM ­  ¢ë§®¢ë ¡¨®á 
INCLUDE "KEYINTER.ASM" ;!FIXIT ¨§-§  ¡ãä¥à  á ¢ëà ¢­¨¢ ­¨¥¬ align 256 ¢ ­ ç «¥ ¯à¨å®¤¨âáï ADRST10 ¤®¡¨¢ âì ­ã«ï¬¨ ¢ ª®­æ¥
INCLUDE "VIDEO.ASM"
INCLUDE "FAT_X.ASM"
INCLUDE "DOS_X.ASM"
INCLUDE "DOS_FM.ASM"
INCLUDE "DOS5.ASM"
INCLUDE "EXECUTE.ASM"
INCLUDE "ENVIRON.ASM"
INCLUDE "INTMOUSE.ASM"
;
DISPLAY "DOS-MAIN end address: ",/H,$-1
;
;
;> > > > > > > > > > > > > > > > BUFFERS < < < < < < < < < < < < < < < <
;
;
CLEAR_ZONE.start EQU $
BUFFERSplace _sBuffers=$
FM_BUF _sFM = BUFFERSplace.FileManipulator
.Size EQU _sFM
.FullSize EQU FMCOUNT*FM_BUF.Size
BootSector _sBOOT_SEC = BUFFERSplace.BootSector
EXEBUFF _sEXE_HEADER = BUFFERSplace.EXE_Header
XSTACK EQU BUFFERSplace.Stack.SPoint
BUFFER EQU BUFFERSplace.Buffer
SECBUF EQU BUFFER
CLEAR_ZONE.size EQU _sBuffers
/*
;R11 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;!TEST
FM_BUF _sFM=$
.Size EQU _sFM
.FullSize EQU FMCOUNT*FM_BUF.Size
;?????   ­¥ £à㧨âáï «¨ ¯®«­®áâìî ᥪâ®à ¢ 512 ¡ ©â®¢ ¯à¨ § £à㧪¥ åí¤¥à ?
EXEBUFF _sEXE_HEADER=$+FM_BUF.FullSize
; EXEBUFF:
; DB "EXE"
; DB #00
; OFFCOD1 DW #0000
; OFFCOD2 DW #0000
; LOADER DW #0000
; DW #0000
; DW #0000
; DW #0000
; LD_ADDR DW #0000
; PC_REG DW #0000
; SP_REG DW #0000
; BLOCK 512-($-EXEBUFF),0
;(!!!HERE STACK FOR EXEC!!!)
; BLOCK 255,0
;XSTACK DB #00
XSTACK EQU EXEBUFF+_sEXE_HEADER+255
BUFFER EQU XSTACK+1
SECBUF EQU BUFFER
;R11 ////////////////////////////////
*/
DISPLAY "FM_BUF addr: ",/H,FM_BUF
DISPLAY "FM_BUF.Size: ",/H,FM_BUF.Size
DISPLAY "FM_BUF.FullSize: ",/H,FM_BUF.FullSize
DISPLAY "EXEBUFF: ",/H,EXEBUFF
DISPLAY "XSTACK: ",/H,XSTACK
DISPLAY "BUFFER: ",/H,BUFFER
;
;
;> > > > > > > > > > > > > > > > BUFFERS < < < < < < < < < < < < < < < <
;
;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||;
; !!!!! íâ  ¯à®æ¥¤ãà  § âàñâáï ¯®á«¥ ¨á¯®«­¥­¨ï
DEPLOY:
;Allocate memory
LD BC,USING_MEMPAGES*256+#C2
RST ToBIOS ;GET DSS PAGES HANDLE
RET C ;R10
LD HL,BANKTBL
LD C,A
LD B,#FF
.loop: INC B
PUSH BC
PUSH HL
LD A,C
LD C,#C4 ; !FIXIT ­  .GetMemBlkPages - ¯¨å âì íâã áâà ­¨æã ¢ á«®â 1 (®­  ¡ã¤¥â ¨ ¢ 0 ᫮⥠¨ ¢ 1) ¨ ¢ë§ë¢ âì ¡¨®á
RST ToBIOS
POP HL
POP BC
LD (HL),A
INC HL
JR NC,.loop
;
IN A,(SLOT0)
LD (DRV.MAIN_PG_NUMBER),A
LD A,DRVPAGE
CALL BANK
PUSH AF
LD HL,DRV_CONTENT
LD DE,#C000
LD BC,DRV_CONTENT.SIZE
LDIR
IN A,(SLOT3)
LD (DRV_PG_NUMBER),A
POP AF
OUT (SLOT3),A
AND A ;R10
RET
; .halt: POP HL ;á­¨¬ ¥¬ «¨è­¥¥ á® á⥪ 
; ; LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY
; ; SCF
; RET
; defb 0
IF ENVVALUE != BUFFER
ASSERT "Warning! ENVVALUE != BUFFER"
//BLOCK 1000,0
ENDIF
;--- --- --- --- [Build version] --- --- --- ---;
; C_OSTYPE
;--- --- --- --- --- --- --- --- --- --- --- ---;
DISPLAY "DEPLOY end address: ",/H,$
;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||;
DISPLAY "Space for DRV-MAIN: ",/A,#4000-$," bytes."
DRV_CONTENT:
; ENDMODULE
DISP 0
INCLUDE 'DRV-MAIN.ASM'
ENT
DRV_CONTENT.SIZE EQU $-DRV_CONTENT
DISPLAY " END ADDRESS: ",/H,$
// ASSERT $<#4001,'-> Memory leack!!!';
;[END]
;
; DTA DB " "
; DB " "
; DB #20
; DW 0,0,0,0,0
; DW 0
; DW 0
; CLUSTER DW 0
; SIZE DW 0,0
; ASCIIZ DB "FILENAME.EXT",#00
;R06
;R06 BUFFER
;R06 SECBUF DB ". ",#10
;R06 DW 0,0,0,0,0
;R06 DW #0000
;R06 DW #0000
;R06 DW #0000
;R06 DW #0000,0000
;R06 DB ".. ",#10
;R06 DW 0,0,0,0,0
;R06 DW #0000
;R06 DW #0000
;R06 DW #0000
;R06 DW #0000,0000
;R06 DS 512-64 ;,0

File diff suppressed because it is too large Load Diff

View File

@ -1,831 +0,0 @@
;[BEGIN]
;//MODULE: DOS_FM
;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
;//UPDATE: 24-10-1999 DNS Restore module
;---------------------------------------------------------------
;Rev Date Name Description
;---------------------------------------------------------------
;R01 16-11-1999 DNS ERROR READING FAT CHAIN
;---------------------------------------------------------------
;FMS DB FMCOUNT
;ACCESS MODE:
; 00 - READ/WRITE
; 01 - READ
; 02 - WRITE
;FM_BUF:
;File Manipulator (FM)
; BYTE '. ' ;+00 NAME
; BYTE ' ' ;+08 EXT
; BYTE #10 ;+11 ATTRIBUT
; BYTE 0 ;+12 RESERVED; !TODO á«¥¤ãî騩 ª« áâ¥à ¤«ï ç⥭¨ï
; BYTE 0 ;+13 RESERVED; !TODO á«¥¤ãî騩 ª« áâ¥à ¤«ï § ¯¨á¨
; BLOCK 8,0 ;+14 RESERVED
; WORD #0000 ;+22 TIME
; WORD #0000 ;+24 DATE
; WORD #0000 ;+26 START CLUSTER
; DWORD #0000 ;+28 SIZE FILE
; DWORD #0000 ;+32 FILE POSITION (FP)
; WORD #0000 ;+36 DIRECTORY CLUSTER
; WORD #0000 ;+38 HANDLE NUMBER
; BYTE #00 ;+40 DRIVE OR CURRENT
; BYTE #00 ;+41 ACCESS MODE
; BYTE #00 ;+42 TASK
; BYTE #00 ;+43 EMPTY
/*
;!TEST
FM_BUF: _sFM
.Size EQU _sFM
BLOCK (FMCOUNT-1)*FM_BUF.Size, 0
*/
MACRO _mFM_FIND
CP FMCOUNT+1
JR NC,ABS_FM
PUSH DE
LD IY,FM_BUF
LD DE,FM_BUF.Size
AND A
JR Z,.endLoop
.loop: ADD IY,DE
DEC A
JR NZ,.loop
.endLoop:
POP DE
; A=0
OR (IY) ;+00 NAME
ENDM
SET_FM:
_mFM_FIND
LD A,0 ;!FIXIT ­®¬¥à ®è¨¡ª¨
RET NZ
ABS_FM LD A,DSS_Error.sys.INVALID_HANDLE
SCF
RET
RES_FM:
_mFM_FIND
LD A,5
EXX
SCF
RET Z
XOR A
LD (IY+0),A
RET
GET_FM: LD B,FMCOUNT
LD C,#FF
LD IY,FM_BUF-FM_BUF.Size
LD DE,FM_BUF.Size
.loop: ADD IY,DE
INC C
LD A,(IY+0)
OR A
RET Z
DJNZ .loop
LD A,DSS_Error.sys.NO_HANDLES
SCF
RET
; HL:IX - OFFSET POINTER
; A - FILE MANIPULATOR
MOVE_FP CALL SET_FM
RET C
INC B
DEC B
JR Z,.F_start
DEC B
JR Z,.F_current
DEC B
JR Z,.B_end
LD A,DSS_Error.sys.INVALID_FUNCTION
SCF
RET
;from Start File
.F_start:
; B=0
LD C,B
LD D,B
LD E,B
JR MOVE_F1
;from End File
.B_end: LD C,(IY+28)
LD B,(IY+29)
LD E,(IY+30)
LD D,(IY+31)
JR MOVE_F1
;from Current Position
.F_current:
LD C,(IY+32)
LD B,(IY+33)
LD E,(IY+34)
LD D,(IY+35)
MOVE_F1 ADD IX,BC
ADC HL,DE
LD D,XH
LD E,XL
LD (IY+32),E
LD (IY+33),D
LD (IY+34),L
LD (IY+35),H
XOR A
RET
;FP COMPARE
; CY - FILE POINTER > SIZE
; NC - FILE POINTER < SIZE
MOVE_CP LD L,(IY+28)
LD H,(IY+29)
LD E,(IY+32)
LD D,(IY+33)
AND A
SBC HL,DE
LD L,(IY+30)
LD H,(IY+31)
LD E,(IY+34)
LD D,(IY+35)
SBC HL,DE
RET
;--------------------
ECL2 POP BC
POP DE
AND A
RET
BLOKRD0 POP BC
POP DE
SCF
RET
;READ SECTORS OF FILE
;HL:DE - FP (in sectors)
; B - Amount sectors
BLOK_RD PUSH BC
LD (READMEM),IX
LD A,(BootSector.S_P_C) ;SECTORS PER CLUSTER
LD C,A
LD B,0
CALL DIV32
LD B,XH
LD C,XL
PUSH HL ;RESIDUE
LD L,(IY+26) ;START CLUSTER
LD H,(IY+27)
LD A,H
OR L
JR NZ,BLOKRD2
JR ECL2 ;R01 JR BLOKRD0
BLOKRD1 PUSH BC
CALL R_F_FAT
POP BC
JR C,ECL2 ;R01
EX DE,HL
DEC BC
BLOKRD2 LD A,B
OR C
JR NZ,BLOKRD1
POP DE
POP BC
LD A,(BootSector.S_P_C)
SUB E
LD C,A ;\
CP B ; \
JR C,BLOKRD3 ;SIZE > RESIDUE CLUSTER ; \
LD C,B ;SIZE < CLUSTER ;->-|--> ; !TODO à §®¡à âìáï
BLOKRD3 LD A,B ; /
SUB C ; /
LD B,A ;/
PUSH HL
PUSH BC
PUSH DE
CALL NSECTOR
POP DE
ADD IX,DE
JR NC,BLOKRD4
INC HL
BLOKRD4 LD DE,(READMEM)
LD A,(FatBuffer.DRIVE)
LD B,C
LD C,5
RST #18
JP C,BLOKRD0
POP BC
LD HL,(READMEM)
LD DE,(BootSector.B_P_S)
BLOKRD5 ADD HL,DE
DEC C
JR NZ,BLOKRD5
LD (READMEM),HL
POP DE
LD A,B
OR A
RET Z
BLOKRD6 LD HL,BootSector.S_P_C
LD A,B
SUB (HL)
LD B,A
LD C,(HL)
JR NC,BLOKRD7
LD B,0
ADD A,(HL) ;0 AND CF
LD C,A
OR A ;CLEAR CF
RET Z
BLOKRD7 EX DE,HL
PUSH BC
CALL R_F_FAT
POP BC
JP C,ECL1 ;R01?
EX DE,HL
PUSH HL
PUSH BC
CALL NSECTOR
LD DE,(READMEM)
LD A,(FatBuffer.DRIVE)
LD B,C
LD C,5
RST #18
JP C,BLOKRD0
POP BC
LD HL,(READMEM)
LD DE,(BootSector.B_P_S)
BLOKRD8 ADD HL,DE
DEC C
JR NZ,BLOKRD8
LD (READMEM),HL
POP DE
JR BLOKRD6
ECL1 AND A
RET
;--------------------
BLOKWRC POP BC
BLOKWR0 POP BC
POP DE
SCF
RET
;WRITE SECTORS OF FILE
;HL:DE - FP (in sectors)
; B - Amount sectors
BLOK_WR PUSH BC
LD (READMEM),IX
LD A,(BootSector.S_P_C) ;SECTORS PER CLUSTER
LD C,A
LD B,0
CALL DIV32
LD B,XH
LD C,XL
PUSH HL ;RESIDUE
LD L,(IY+26) ;START CLUSTER
LD H,(IY+27)
LD A,H
OR L
JR NZ,BLOKWR2
PUSH BC
CALL G_CLUST
JR C,BLOKWRC
LD (IY+26),L
LD (IY+27),H
LD DE,(FatBuffer.ENDCLUS)
CALL W_T_FAT
PUSH HL
CALL WR_FAT
POP HL
POP BC
JR BLOKWR2
BLOKWR1 PUSH BC
CALL R_F_FAT
JR NC,BLOKWRB
PUSH HL
CALL INC_FAT
POP HL
JR C,BLOKWRC
CALL R_F_FAT
BLOKWRB POP BC
EX DE,HL
DEC BC
BLOKWR2 LD A,B
OR C
JR NZ,BLOKWR1
POP DE
POP BC
LD A,(BootSector.S_P_C)
SUB E
LD C,A
CP B
JR C,BLOKWR3 ;SIZE > RESIDUE CLUSTER
LD C,B ;SIZE < CLUSTER
BLOKWR3 LD A,B
SUB C
LD B,A
PUSH HL
PUSH BC
PUSH DE
CALL NSECTOR
POP DE
ADD IX,DE
JR NC,BLOKWR4
INC HL
BLOKWR4 LD DE,(READMEM)
LD A,(FatBuffer.DRIVE)
LD B,C
LD C,6
RST #18
JP C,BLOKWR0
POP BC
LD HL,(READMEM)
LD DE,(BootSector.B_P_S)
BLOKWR5 ADD HL,DE
DEC C
JR NZ,BLOKWR5
LD (READMEM),HL
POP DE
LD A,B
OR A
RET Z
BLOKWR6 LD HL,BootSector.S_P_C
LD A,B
SUB (HL)
LD B,A
LD C,(HL)
JR NC,BLOKWR7
LD B,0
ADD A,(HL) ;0 AND CF
LD C,A
OR A ;CLEAR CF
RET Z
BLOKWR7 EX DE,HL
PUSH BC
CALL R_F_FAT
JR NC,BLOKWR9
PUSH HL
CALL INC_FAT
POP HL
JR C,BLOKWRA
CALL R_F_FAT
BLOKWR9 POP BC
EX DE,HL
PUSH HL
PUSH BC
CALL NSECTOR
LD DE,(READMEM)
LD A,(FatBuffer.DRIVE)
LD B,C
LD C,6
RST #18
JP C,BLOKWR0
POP BC
LD HL,(READMEM)
LD DE,(BootSector.B_P_S)
BLOKWR8 ADD HL,DE
DEC C
JR NZ,BLOKWR8
LD (READMEM),HL
POP DE
JR BLOKWR6
BLOKWRA POP BC
LD A,DSS_Error.sys.DISK_FULL
SCF
RET
TSTSIZE XOR A
LD (READCOD),A
LD L,(IY+32) ;FP LOW
LD H,(IY+33)
ADD HL,DE
EXX
LD DE,0
LD L,(IY+34) ;FP HIGH
LD H,(IY+35)
ADC HL,DE
EXX ;HL':HL - NEW FP
LD C,(IY+28)
LD B,(IY+29) ;SIZE LOW
AND A
SBC HL,BC
EXX
LD C,(IY+30) ;SIZE HIGH
LD B,(IY+31)
SBC HL,BC
EXX
RET C ;OK READ ALL
EX DE,HL
SBC HL,DE ;VERY BIG
EX DE,HL
LD A,#FF
LD (READCOD),A
RET
; HL - ADDRESS
; DE - SIZE
; A - FM
READ LD (R_POINT),HL
LD (S_POINT),HL
CALL SET_FM
RET C
CALL TSTSIZE
LD A,D
OR E
JP Z,NOREAD
PUSH DE
LD A,(IY+_sFM.DRIVE)
CALL OPENDSK
JP C,RPERR1
LD C,(IY+_sFM.F_POSITION)
LD E,(IY+_sFM.F_POSITION+1)
LD A,E
AND #01
LD B,A
LD D,(IY+_sFM.F_POSITION+2)
LD L,(IY+_sFM.F_POSITION+3)
LD H,0
OR A
RR L
RR D
RR E ;HL:DE FP (in sectors)
; BC FP residue (in bytes)
LD A,B
OR C
JP NZ,ROV1
ROV4 POP BC
PUSH BC
SRL B
JR Z,ROV2
LD (SECTORH),HL
LD (SECTORL),DE
LD IX,(R_POINT)
CALL BLOK_RD
JP C,RPERR1
LD DE,(R_POINT)
READMEM+1: LD HL,0 // LD HL,(READMEM)
AND A
SBC HL,DE
LD C,H
LD B,0
ADD HL,DE
LD (R_POINT),HL
SRL C
SECTORL+1: LD HL,0 // LD HL,(SECTORL)
ADD HL,BC
EX DE,HL
SECTORH+1: LD HL,0 // LD HL,(SECTORH)
LD C,B
ADC HL,BC
ROV2 POP BC
LD A,B
AND #01
LD B,A
OR C
JP Z,ROV6
PUSH BC
LD IX,BUFFER+#C000
LD B,1
IN A,(SLOT3)
PUSH AF
IN A,(SLOT0)
OUT (SLOT3),A
CALL BLOK_RD
POP BC
LD C,SLOT3
OUT (C),B
JP C,RPERR1
LD HL,BUFFER
LD DE,(R_POINT)
POP BC
LDIR
LD (R_POINT),DE
ROV6:
S_POINT+1: LD HL,0 // LD HL,(S_POINT)
LD DE,(R_POINT)
EX DE,HL
AND A
SBC HL,DE
PUSH HL
EX DE,HL
LD XH,D
LD XL,E
LD HL,0
CALL MOVE_FP.F_current
POP DE
NOREAD:
READCOD+1: LD A,0 // LD A,(READCOD)
OR A
RET
ROV1 PUSH BC
PUSH HL
PUSH DE
LD IX,BUFFER+#C000
LD B,1
IN A,(SLOT3)
PUSH AF
IN A,(SLOT0)
OUT (SLOT3),A
CALL BLOK_RD
POP BC
LD C,SLOT3
OUT (C),B
POP HL
JP C,RPERR3
LD BC,1
ADD HL,BC
EX DE,HL
POP HL
LD C,B
ADC HL,BC
EXX
POP DE
LD HL,512
AND A
SBC HL,DE
LD B,H
LD C,L
POP HL
AND A
SBC HL,BC
JR NC,ROV3
ADD HL,BC
LD B,H
LD C,L
LD HL,0
ROV3 PUSH HL
LD HL,BUFFER
ADD HL,DE
LD DE,(R_POINT)
LDIR
LD (R_POINT),DE
EXX
JP ROV4
RPERR3 POP HL
RPERR2 POP HL
RPERR1 POP BC
SCF
RET
PWERR3 POP HL
PWERR2 POP HL
PWERR1 POP BC
SCF
RET
RD_ONLY POP DE
LD A,DSS_Error.sys.READONLY
SCF
RET
; HL - ADDRESS
; DE - SIZE
; A - FM
WRITE LD (R_POINT),HL
LD (S_POINT),HL
PUSH DE
CALL SET_FM
JP C,PWERR1
LD A,(IY+_sFM.ACCESS_MODE)
AND #01
JR NZ,RD_ONLY
SET 7,(IY+_sFM.ACCESS_MODE)
SET 5,(IY+_sFM.ATTRIBUT)
LD A,(IY+_sFM.DRIVE)
CALL OPENDSK
JP C,PWERR1
LD C,(IY+32)
LD A,(IY+33)
LD E,A
AND #01
LD B,A
LD D,(IY+34)
LD L,(IY+35)
LD H,0
OR A
RR L
RR D
RR E ;HL:DE FP (in sectors)
; BC FP residue (in bytes)
LD A,B
OR C
JP NZ,WOV1
WOV4 POP BC
PUSH BC
SRL B
JR Z,WOV2
PUSH HL
PUSH DE
PUSH BC
R_POINT+2: LD IX,0 // LD IX,(R_POINT)
CALL BLOK_WR
POP BC
JP C,PWERR3
LD C,B
LD HL,(R_POINT)
LD DE,#0200
WOV5 ADD HL,DE
DJNZ WOV5
LD (R_POINT),HL
LD B,0
POP HL
ADD HL,BC
EX DE,HL
POP HL
LD C,B
ADC HL,BC
WOV2 POP BC
LD A,B
AND #01
LD B,A
OR C
JP Z,WOV6
PUSH HL
PUSH DE
PUSH BC
LD IX,BUFFER+#C000
LD B,1
IN A,(SLOT3)
PUSH AF
IN A,(SLOT0)
OUT (SLOT3),A
CALL BLOK_RD
POP BC
LD C,SLOT3
OUT (C),B
LD DE,BUFFER
LD HL,(R_POINT)
POP BC
JP C,PWERR2
LDIR
LD (R_POINT),HL
POP DE
POP HL
LD IX,BUFFER+#C000
LD B,1
IN A,(SLOT3)
PUSH AF
IN A,(SLOT0)
OUT (SLOT3),A
CALL BLOK_WR
POP BC
LD C,SLOT3
OUT (C),B
RET C
WOV6 LD DE,(S_POINT)
LD HL,(R_POINT)
AND A
SBC HL,DE
PUSH HL
EX DE,HL
LD XH,D
LD XL,E
LD HL,0
CALL MOVE_FP.F_current
CALL MOVE_CP
POP DE
RET NC
LD L,(IY+32)
LD H,(IY+33)
LD C,(IY+34)
LD B,(IY+35)
LD (IY+28),L
LD (IY+29),H
LD (IY+30),C
LD (IY+31),B
AND A
RET
WOV1 PUSH BC
PUSH HL
PUSH DE
LD IX,BUFFER+#C000
LD B,1
IN A,(SLOT3)
PUSH AF
IN A,(SLOT0)
OUT (SLOT3),A
CALL BLOK_RD
POP BC
LD C,SLOT3
OUT (C),B
POP DE
POP HL
EXX
POP DE
JP C,PWERR1
LD HL,512
AND A
SBC HL,DE
LD B,H
LD C,L
POP HL
AND A
SBC HL,BC
JR NC,WOV3
ADD HL,BC
LD B,H
LD C,L
LD HL,0
WOV3 PUSH HL
LD HL,BUFFER
ADD HL,DE
LD DE,(R_POINT)
EX DE,HL
LDIR
LD (R_POINT),HL
EXX
PUSH HL
PUSH DE
LD IX,BUFFER+#C000
LD B,1
IN A,(SLOT3)
PUSH AF
IN A,(SLOT0)
OUT (SLOT3),A
CALL BLOK_WR
POP BC
LD C,SLOT3
OUT (C),B
POP HL
JP C,PWERR2
LD BC,1
ADD HL,BC
EX DE,HL
POP HL
LD C,B
ADC HL,BC
JP WOV4
; HL - CLUSTER
; HL:IX - SECTOR
NSECTOR DEC HL
DEC HL
EX DE,HL
LD A,(BootSector.S_P_C)
LD B,A
LD HL,0
LD IX,0
ADD_DE1 ADD IX,DE
JR NC,ADD_DE2
INC HL
ADD_DE2 DJNZ ADD_DE1
LD DE,(FatBuffer.DAT_FRM)
ADD IX,DE
LD DE,#0000
ADC HL,DE
RET
; HL:DE / BC => DE:IX HL-OSTATOK
DIV32 LD XH,D
LD XL,E
EX DE,HL
LD HL,0
LD A,#20
DIV001 ADD IX,IX
EX DE,HL
ADC HL,HL
EX DE,HL
ADC HL,HL
SBC HL,BC
JR NC,DIV002
ADD HL,BC
DEC A
JR NZ,DIV001
RET
DIV002 INC IX
DEC A
JR NZ,DIV001
RET
//READCOD DB #00
//READMEM DW #0000
//SECTORH DW 0
//SECTORL DW 0
//R_POINT DW 0
//S_POINT DW 0
;//MODULE: DOS_FM
;[END]

615
DSS/DOS_Proc.asm Normal file
View File

@ -0,0 +1,615 @@
;[BEGIN]
;//MODULE: DOS_X
;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
;//UPDATE: 24-10-1999 DNS Restore module
;---------------------------------------------------------------
;Rev Date Name Description
;---------------------------------------------------------------
;R13 06-04-2023 BAO ”ã­ªæ¨î SETBOOT ¬®¦­® ¢ë§¢ âì ⮫쪮 à § (¥á«¨ § ¢¥àè¨âáï ª®à४⭮)
;R12 03-04-2023 BAO „®¡ ¢«¥­  äã­ªæ¨ï à¥áª ­  ¤à ©¢®¢ LD C,8 : RST #10
;R11 15-04-2003 DNS ROUTINE FOR STORE CURDISK AND CURDIR
;R10 03-04-2003 DNS IMPROVED FN. VERSION
;R09 27-03-2003 DNS PASTED SET/GET BOOT FN.
;R08 14-11-2002 DNS IMPROVE BPB-FUNCTION
;R07 17-12-1999 DNS BUG FIX SIGNATURE #55AA AT 510 OFFSET
;R06 21-11-1999 DNS FN. DISKINF SUPPORT ALL DISKS
;R05 21-11-1999 DNS BUG FIX SIGNATURE #55AA IN BOOT SECTOR
;R04 08-11-1999 DNS KILL OLD FUNCTIONS
;R03 23-11-1998 DNS BUG FIX (IX+28) -> (IY+28)
;R02 21-11-1998 DNS CHANGE FUNCTION "MAKE FAT"
;R01 20-11-1998 DNS REPAIR FUNCTION "SAVE"
;---------------------------------------------------------------
;----------------------------------------------------------------------;
; HL - 11 bytes filename "FILENAMEEXT"
; DE - DOS filename "FILENAME.EXT",0
; GetName:
; LD BC,#08FF
; .GETN1: LD A,(HL)
; CP " "
; JR NZ,.GETN3
; .GETN2: INC HL
; DJNZ .GETN2
; JR .GETN4
; .GETN3: LDI
; DJNZ .GETN1
; ;
; .GETN4: LD A,(HL)
; CP " "
; LD A,"."
; JR NZ,.GETN5
; LD A,#00
; .GETN5: LD (DE),A
; INC DE
; RET Z
; LD B,#03
; .GETN6: LD A,(HL)
; CP " "
; RET Z
; LDI
; XOR A
; LD (DE),A
; DJNZ .GETN6
; RET
;---------------;---------------;---------------
;!TODO LFN
GetName: LD BC,#08FF ;!HARDCODE ¤«¨­  ¨¬¥­¨ + áçñâ稪
LD A,' '
.loop: CP (HL)
JR Z,.skip
LDI
DJNZ .loop
JP .extension
;
.skip: LD C,B
LD B,0
; CF=0
ADC HL,BC
.extension: CP (HL)
LD A,"."
JR NZ,.copy_ext
XOR A
.copy_ext: LD (DE),A
INC DE
RET Z ;no copy extension
; copy extension
LD BC,#03FF ;!HARDCODE ¤«¨­  à áè¨à¥­¨ï + áçñâ稪
LD A,' '
.loop2: CP (HL)
JR Z,.exit
LDI
DJNZ .loop2
.exit: XOR A
LD (DE),A
RET
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
; old GETWORD
; ’¥áâ ­  ¤®¯ãá⨬®¥ ¨¬ï ¨ ­ áâநâìáï ­  ¤¨áª.
; ¢å®¤: hl=áâப  ¨¬¥­¨
; ¢ë室: (TMPNAME)
SetPath_GetName:
; !TEST
INC HL
LD A,(HL)
DEC HL
CP ':'
JR NZ,.dir_loop
LD A,(HL)
CP 'a'
JR C,.next
CP 'z'+1
JR NC,.next
SUB %0010'0000
.next: SUB 'A'
INC HL
INC HL
PUSH HL
CALL CHDISK
;CALL OPENDSK
POP HL
RET C
LD A,(HL)
OR A
JR Z,.done
CP ' ' ;
JR Z,.done
CP '\' ;
SCF
LD A,DSS_Error.sys.PATH_NOT_FOUND
RET NZ
INC HL
;
.dir_loop: LD DE,TMPNAME
LD BC,#0DFF
.loop: LD A,(HL)
INC HL
CP '\' ;
JR Z,.DIR_NAME
; AND A
; JR Z,.DIR_NAME
;CP ':'
;JR Z,.DRV_NAME
LD (DE),A
INC DE
CP ' '+1
CCF
RET NC
DJNZ .loop
LD A,DSS_Error.sys.INVALID_NAME
SCF
RET
;
.done: XOR A
LD (TMPNAME),A
RET
;
.DIR_NAME: XOR A
LD (DE),A
PUSH HL
LD HL,TMPNAME
CALL OPENDIR
POP HL
RET C
JR .dir_loop
; .DRV_NAME:
; LD A,(TMPNAME)
; CP 'a'
; JR C,.next
; CP '{'
; JR NC,.next
; SUB #20
; .next: SUB 'A'
; PUSH HL
; ;!TEST CHDISK OPENDSK
; ;CALL OPENDSK
; CALL CHDISK
; ;
; POP HL
; RET C
; JR .loop
;
; <20>ãä¥à ¨¬¥­¨ 8.3 ä®à¬ â 
TMPNAME: DZ ' ' ; 12 ¯à®¡¥«®¢ ¨ 0 ;!FIXIT ª ¡ãä¥à ¬
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
; IN: A - drive number
OPENDSK: ;!TEST DRV.Open ®¡å®¤ R10
LD B,A
LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
CP B
JR NZ,.open
PUSH BC
LD C,Dss.DRV.MediaCheck
RST ToDSS.DRV
POP BC
JR Z,.exit
JR C,.error
JR .skip_open ;!FIXIT ª®£¤  DRV.MediaCheck ¨ DRV.Open ¡ã¤ã⠮⫨ç âìáï
;
.open: LD A,B
;
.force: PUSH AF
LD C,Dss.DRV.Open
RST ToDSS.DRV
POP BC
JP C,.error
;[x] 29/02/2024 fix "open drive error"
.skip_open: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
LD D,A
PUSH DE
;
LD A,B
LD (CORE_BUFFERS.FS_Buffer.DRIVE),A
;
CALL RD_BPB
;[x] 29/02/2024 fix "open drive error"
POP DE
JR C,.error_bpb
; RET C
;
.exit: LD A,(LDRIVE)
AND A
RET
; !FIXIT ª®áâë«ì ¤«ï Flex Navigator ; [ ] media change
.error: CALL .error_convert
LD A,C
SCF
RET
;
.error_convert: CP DSS_Error.drv.INVALID_DRIVE
LD C,DSS_Error.sys.INVALID_DRIVE
RET Z
;
CP DSS_Error.drv.ATAPI.UnitAttention
LD C,DSS_Error.sys.MEDIA_CHANGED
RET Z
;
CP DSS_Error.drv.UNKNOWN_FORMAT
LD C,DSS_Error.sys.UNKNOWN_FORMAT
RET Z
;
LD C,DSS_Error.sys.NOT_READY
RET
;
;[x] 29/02/2024 fix "open drive error"; 20/06/2024 fixed
.error_bpb: PUSH AF ; á®å࠭塞 ­®¬¥à ®è¨¡ª¨
LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
CP D
JR Z,.next_check
;
LD A,D
CP #FF
SCF
JR Z,.set_panic
;
LD (CORE_BUFFERS.FS_Buffer.DRIVE),A
CALL OPENDSK.force
JR NC,.err_exit
;
LD A,(BOOTDSK.NUM)
LD (CORE_BUFFERS.FS_Buffer.DRIVE),A
CALL OPENDSK.force
;
.err_exit: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
ADD 'A'
LD (CORE_BUFFERS.CurrentPath),A
POP AF
RET
;
.next_check: LD A,(BOOTDSK.NUM)
CP D
SCF
.reBPB: CALL NZ,OPENDSK.force
; ¯à®¢¥àª  ­  ®è¨¡ªã
.set_panic: LD HL,.NOT_READY
LD E, +(80-.NOT_READY.size)/2 ; coord X
LD BC,.NOT_READY.size
JR NC,.err_exit
JP KERNEL_PANIC
;
.errorCycle: DB 0
.NOT_READY: DZ "Boot drive error..."
.NOT_READY.size EQU $-.NOT_READY
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
; <20>८¡à §®¢ âì ¨¬ï 8.3 -> 11 ä®à¬ â
; ¢å®¤: hl = 8.3 ¨¬ï
; de = ¡ãä¥à ¨¬¥­¨ 11 ᨬ¢. ä®à¬ â 
; ¯à¨ ®è¨¡ª¥ CF - ­¥¤®¯. ¨¬ï
;
; HL - MASK "file*.t??"
; DE - 11 bytes filename
; RET: C=2 FILE WITHOUT EXTENTION
; C=1 FILE WITH EXTENTION
MASK: LD HL,TMPNAME
.name: LD DE,MASKARE
.custom: PUSH HL
PUSH DE
LD H,D
LD L,E
INC DE
LD (HL),' '
LD BC,10 ;!HARDCODE = size (FileName + Extension - 1)
LDIR
POP DE
POP HL
LD A,(HL)
CP '.' ;R007
SCF ;R007
JR Z,.MASKB ;R007
CP ' '+1
.MASKB: LD A,DSS_Error.sys.INVALID_NAME
RET C
LD BC,#0902 ; B - áç¥â稪
.MASK1: LD A,(HL)
CP ' '+1
CCF
RET NC
;
CP '*'
JR Z,.MASK3
CP '.'
JR Z,.MASK5
CP '"'
JR Z,.MASK_ERR
CP '+'
JR Z,.MASK_ERR
CP ','
JR Z,.MASK_ERR
CP '/'
JR Z,.MASK_ERR
CP ':'
JR Z,.MASK_ERR
CP ';'
JR Z,.MASK_ERR
CP '<'
JR Z,.MASK_ERR
CP '='
JR Z,.MASK_ERR
CP '>'
JR Z,.MASK_ERR
CP '['
JR Z,.MASK_ERR
CP '\'
JR Z,.MASK_ERR
CP ']'
JR Z,.MASK_ERR
CP '|'
JR Z,.MASK_ERR
CALL UPPER ; a..z -> A..Z
.MASK2: LD (DE),A
INC HL
INC DE
DJNZ .MASK1
.MASK_ERR:
LD A,DSS_Error.sys.INVALID_NAME
SCF
RET
;
.MASK3: LD A,'?'
INC HL
DJNZ .MASK6
JR .MASK_ERR
;
.MASK6: LD (DE),A
INC DE
DJNZ .MASK6
LD B,1
JR .MASK1
;
.MASK5: LD A,' '
INC HL
DJNZ .MASK4
LD B,4
DEC C
JR NZ,.MASK1
JR .MASK_ERR
;
.MASK4: LD (DE),A
INC DE
DJNZ .MASK4
LD B,4
DEC C
JR NZ,.MASK1
JR .MASK_ERR
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
;!TEST Current Dir ;[x] 15/10/23
DIR_PATH_CHANGE:
.FullCurrent: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
ADD 'A'
LD (CORE_BUFFERS.CurrentPath),A
;
.Current: LD HL,CORE_BUFFERS.CurrentDirectory
JP CURRDIR
;
.FullWork: LD A,(CORE_BUFFERS.CurrentPath)
SUB 'A'
LD (CORE_BUFFERS.FS_Buffer.DRIVE),A
;
.Work: LD HL,CORE_BUFFERS.WorkDirectory
JP CURRDIR_FN
;
DIR_PATH_CHECK: LD A,(HL)
CP '\'
JR NZ,.notRootDir
;
CALL .checkDrive
RET Z
LD A,(CORE_BUFFERS.CurrentPath)
SUB 'A'
JP OPENDSK
;
.notRootDir: INC HL
LD A,(HL)
CP ':'
RET Z
;
.forceCheck: ;LD HL,CurrentDirectory+1
LD BC,CORE_BUFFERS.CurrentDirectory.DEPTH-1
CALL .checkDrive
JR Z,.checkDir
;
LD HL,CORE_BUFFERS.CurrentPath
LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
ADD 'A'
CP (HL)
JR NZ,.gotoPath
;
.checkDir: LD HL,CORE_BUFFERS.CurrentDirectory+1
LD DE,CORE_BUFFERS.WorkDirectory+1
; áçñâ稪
LD A,B
LD B,C
EX AF,AF'
;
.loop: LD A,(DE)
AND A
JR Z,.end
CP (HL)
INC HL
INC DE
JR NZ,.gotoPath
DJNZ .loop
EX AF,AF'
SUB 1
RET C
EX AF,AF'
DJNZ .loop
;
.gotoPath: LD C,B
EX AF,AF'
LD B,A
CALL FINDDIR.CHECK_SLASH
LD A,DSS_Error.sys.PATH_NOT_FOUND
RET C
LD HL,CORE_BUFFERS.CurrentPath
JP SetPath_GetName
;
.end: CP (HL)
RET Z
JR .gotoPath
;
.checkDrive: LD HL,CORE_BUFFERS.CurrentPath
LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
ADD 'A'
CP (HL)
RET
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
CHECK_NAME:
LD HL,MASKARE
.custom: LD BC,11 ;!HARDCODE
LD A,"?"
CPIR
LD A,DSS_Error.sys.INVALID_NAME
SCF
RET
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
;FMS DB FMCOUNT
;ACCESS MODE:
; 00 - READ/WRITE
; 01 - READ
; 02 - WRITE
;FM_BUF:
;File Manipulator (FM)
; BYTE '. ' ;+00 NAME
; BYTE ' ' ;+08 EXT
; BYTE #10 ;+11 ATTRIBUT
; BYTE 0 ;+12 RESERVED; !TODO á«¥¤ãî騩 ª« áâ¥à ¤«ï ç⥭¨ï
; BYTE 0 ;+13 RESERVED; !TODO á«¥¤ãî騩 ª« áâ¥à ¤«ï § ¯¨á¨
; BLOCK 8,0 ;+14 RESERVED
; WORD #0000 ;+22 TIME
; WORD #0000 ;+24 DATE
; WORD #0000 ;+26 START CLUSTER
; DWORD #0000 ;+28 SIZE FILE
; DWORD #0000 ;+32 FILE POSITION (FP)
; WORD #0000 ;+36 DIRECTORY CLUSTER
; WORD #0000 ;+38 HANDLE NUMBER
; BYTE #00 ;+40 DRIVE OR CURRENT
; BYTE #00 ;+41 ACCESS MODE
; BYTE #00 ;+42 TASK
; BYTE #00 ;+43 EMPTY
/*
;!TEST
FM_BUF: _sFM
.Size EQU _sFM
BLOCK (FMCOUNT-1)*FM_BUF.Size, 0
*/
////////////////////////////////////////////////////////////////////////
; ­  ¢ë室¥ ¡¥§ ®è¨¡®ª IY 㪠§ë¢ ¥â ­  ä ©«®¢ë© ¬ ­¨¯ã«ïâ®à
FM_FIND: CP FMCOUNT+1
JR NC,.error
;
PUSH DE
LD IY,CORE_BUFFERS.FM_BUF
LD DE,CORE_BUFFERS.FM_BUF.Size
AND A
JR Z,.endLoop
.loop: ADD IY,DE
DEC A
JR NZ,.loop
.endLoop: POP DE
; A=0
OR (IY) ;+00 NAME
RET
;
.error: XOR A
LD A,DSS_Error.sys.INVALID_HANDLE
RET
SET_FM: CALL FM_FIND
; error
;LD A,DSS_Error.sys.INVALID_HANDLE
; CF = 1
SCF
RET Z
; no error
XOR A ;LD A,DSS_Error.sys.NO_ERROR
; CF = 0
RET
RES_FM: CALL FM_FIND
; error
; LD A,DSS_Error.sys.INVALID_HANDLE
SCF
RET Z
; no error
XOR A
LD (IY + _sFM.FS_REC.NAME),A
RET
;
;!TODO CHECK LOCKING
GET_FM: LD B,FMCOUNT
LD C,#FF
LD IY,CORE_BUFFERS.FM_BUF - CORE_BUFFERS.FM_BUF.Size
LD DE,CORE_BUFFERS.FM_BUF.Size
.loop: ADD IY,DE
INC C
LD A,(IY + _sFM.FS_REC.NAME)
OR A
RET Z
DJNZ .loop
LD A,DSS_Error.sys.NO_HANDLES
SCF
RET
;FP COMPARE
; CY - FILE POINTER > SIZE
; NC - FILE POINTER < SIZE
MOVE_CP:
LD L,(IY + _sFM.FS_REC.F_SIZE)
LD H,(IY + _sFM.FS_REC.F_SIZE+1)
LD E,(IY + _sFM.F_POSITION)
LD D,(IY + _sFM.F_POSITION+1)
AND A
SBC HL,DE
LD L,(IY + _sFM.FS_REC.F_SIZE+2)
LD H,(IY + _sFM.FS_REC.F_SIZE+3)
LD E,(IY + _sFM.F_POSITION+2)
LD D,(IY + _sFM.F_POSITION+3)
SBC HL,DE
RET
;
;----------------------------------------------------------------------;
; [x] fat32 ; [ ] CDFS
; !TODO ¯¥à¥­¥á⨠¯®â®¬ ¢ FS module
RD_BPB: CALL READ_BPB
RET C
;
LD DE,#AA55 ; ᨣ­ âãà  ;R05
LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07
;
AND A
SBC HL,DE
JP Z,FAT_BPB
;
; CDFS check
;
;
.UnknownBPB: LD A,DSS_Error.sys.UNKNOWN_FORMAT
SCF
RET
;----------------------------------------------------------------------;

View File

@ -1,547 +0,0 @@
;[BEGIN]
;//MODULE: DOS_X
;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
;//UPDATE: 24-10-1999 DNS Restore module
;---------------------------------------------------------------
;Rev Date Name Description
;---------------------------------------------------------------
;R13 06-04-2023 BAO ”ã­ªæ¨î SETBOOT ¬®¦­® ¢ë§¢ âì ⮫쪮 à § (¥á«¨ § ¢¥àè¨âáï ª®à४⭮)
;R12 03-04-2023 BAO „®¡ ¢«¥­  äã­ªæ¨ï à¥áª ­  ¤à ©¢®¢ LD C,8 : RST #10
;R11 15-04-2003 DNS ROUTINE FOR STORE CURDISK AND CURDIR ;!FIXIT à ¡®â ¥â ªà¨¢®
;R10 03-04-2003 DNS IMPROVED FN. VERSION
;R09 27-03-2003 DNS PASTED SET/GET BOOT FN.
;R08 14-11-2002 DNS IMPROVE BPB-FUNCTION
;R07 17-12-1999 DNS BUG FIX SIGNATURE #55AA AT 510 OFFSET
;R06 21-11-1999 DNS FN. DISKINF SUPPORT ALL DISKS
;R05 21-11-1999 DNS BUG FIX SIGNATURE #55AA IN BOOT SECTOR
;R04 08-11-1999 DNS KILL OLD FUNCTIONS
;R03 23-11-1998 DNS BUG FIX (IX+28) -> (IY+28)
;R02 21-11-1998 DNS CHANGE FUNCTION "MAKE FAT"
;R01 20-11-1998 DNS REPAIR FUNCTION "SAVE"
;---------------------------------------------------------------
; RGADR EQU #89 ;VIDEO CONTROL REGISTER
; SLOT0 EQU #82 ;WIN #0000-#3FFF
; SLOT1 EQU #A2 ;WIN #4000-#7FFF
; SLOT2 EQU #C2 ;WIN #8000-#BFFF
; SLOT3 EQU #E2 ;WIN #C000-#FFFF
; SYSPAGE EQU #FE
;Commands for restart #10
//NOPS: LD A,DSS_Error.sys.INVALID_FUNCTION
// SCF
// RET
VERSION:
LD DE,VERS*256+MODF
XOR A
LD H,A ;!TODO ¯¨å âì á OSINFO
LD L,A
LD BC,BUILD
RET
//;R10
//OSINFO:
//OSINFO_SIG: DB "OSINFOSTRUCTURE",0
;R09
BOOTDRV: DB #FF
BOOTDSK:
INC B
DEC B
JR Z,GETBOOT
DEC B
.chg: JR Z,SETBOOT ;R13 ¬¥­ï¥âáï ­  JR ,SETBOOT ¯®á«¥ ¯¥à¢®£® 㤠筮£® ¨á¯®«­¥­¨ï SETBOOT
LD A,DSS_Error.sys.INVALID_FUNCTION
SCF
RET
;GET BOOT DISK
GETBOOT LD A,(BOOTDRV)
AND A
RET
;SET BOOT DISK
SETBOOT:
LD B,A
LD C,0
.loop: PUSH BC
LD A,C
LD BC,#0008
LD DE,#55AA
RST #18
POP BC
JR C,.NoSupport
EX AF,AF' ;PHISICAL DRIVE NUMBER
CP B
JR NZ,.NoSupport
;R13
LD A,#38 ; opcode for JR C,addr
LD (BOOTDSK.chg),A
;R13
LD A,C
LD (BOOTDRV),A
AND A
RET
.NoSupport:
INC C
LD A,(LDRIVE)
CP C
JR NZ,.loop
SCF
RET
;R09
;!!!!! „ã¡«ì - CHNDISK = OPENDSK
/*
CHNDISK:
PUSH AF
LD C,1
RST #18
POP BC
JP C,NDISK11
LD A,B
LD (FatBuffer.DRIVE),A
CALL RD_BPB
RET C
LD A,(LDRIVE)
AND A
RET
NDISK11:
CP DSS_Error.sys.INVALID_DRIVE
SCF
RET Z
LD A,DSS_Error.sys.NOT_READY
RET
*/
CURRDSK: LD A,(FatBuffer.DRIVE)
AND A
RET
DISKINF: INC A
JR Z,CURRDS ;R06
DEC A ;R06
CALL CHNDISK ;R06
RET C ;R06
CURRDS: LD HL,2
LD BC,0
FRESP: PUSH BC
CALL R_F_FAT
POP BC
CP 10
JR Z,FRESP2
LD A,E
OR D
JR NZ,SKIC
INC BC
SKIC: INC HL
JP FRESP
FRESP2: LD D,B
LD E,C
LD HL,(MAX_CLU)
DEC HL
LD BC,(BootSector.B_P_S)
LD A,(BootSector.S_P_C)
AND A
RET
LDRIVE: DB #02
TDRIVE: DB #00
TCLUST: DW #0000
TCOUNT: DW #0000
;R04SIZE2CL LD DE,(B_P_C)
;R04 XOR A
;R04 SCF
;R04S2C01 RR D
;R04 RR E
;R04 JR C,S2C02
;R04 RR H
;R04 RR L
;R04 RR B
;R04 RR C
;R04 JP NC,S2C01
;R04 LD A,1
;R04 JP S2C01
;R04S2C02 OR A
;R04 RET Z
;R04 INC BC
;R04 RET
;R04L_SEC_X DW 0
;R04H_SEC_X DW 0
; !FIXIT çñâ ­¥ ¨á¯®«ì§ã¥âáï
TESTDSK LD A,(FatBuffer.DRIVE)
LD C,3
RST #18
OR A
RET Z
RD_BPB LD C,SLOT3
IN B,(C)
PUSH BC
;!!!!! «ãçè¥ ®áâ ¢¨âì ª ª ¢ ®à¨£¨­ «¥, ¯®â®¬ã çâ® ¢ë§®¢ í⮩ ä㭪樨
; ¬®¦¥â ¢ ¤ «ì­¥©è¥¬ ¯®­ ¤®¡¨âìáï, ¨ ¯ã᪠© ®­  á ¬  ¤®áâ ñâ ¯¥à¥¬¥­­ãî DRIVE
; ex af,af' ;1451
; in a,(SLOT0) ;1452
; out (SLOT3),a ;1454
; ld de,SECBUF+#C000 ;1456
; ex af,af' ;1459
IN A,(SLOT0)
OUT (SLOT3),A
;R08 LD DE,BOOT+#C000
LD DE,SECBUF+#C000 ;R08
LD A,(FatBuffer.DRIVE)
;!!!!! ------------------------------
LD C,4
RST #18
POP BC
OUT (C),B
JP C,RDERR1
PUSH IY
LD DE,#AA55 ;R05
;R08 LD HL,(BOOT+510) ;R07
LD HL,(SECBUF+510) ;R08
AND A ;R05
SBC HL,DE ;R05
JP NZ,ERR_BPB ;R05
;R08
LD HL,SECBUF ;R08
LD DE,BootSector ;R08
LD BC,_sBOOT_SEC ;R08 size
LDIR
;R08
LD IY,BootSector
LD A,(IY+_sBOOT_SEC.ID_FORM)
CP #F0
JP C,ERR_BPB
LD HL,0 ; calc. first sector FAT
LD E,(IY+_sBOOT_SEC.RESERVE) ;Reserve sec
LD D,(IY+_sBOOT_SEC.RESERVE+1)
ADD HL,DE
; LD E,(IY+#1C) ;Hidden sec
; LD D,(IY+#1D)
; ADD HL,DE
; LD (FatBuffer.FAT_FRM),HL ; first sector FAT
LD (FatBuffer.FAT1_XX),HL ; first sector FAT #1
LD (FatBuffer.FAT2_XX),HL
LD E,(IY+_sBOOT_SEC.S_P_F) ; sectors in FAT
LD D,(IY+_sBOOT_SEC.S_P_F+1)
LD A,(BootSector.FAT_NUM) ; amount FATs
CP 1
JR Z,C_DATA1
DEC A
ADD HL,DE
LD (FatBuffer.FAT2_XX),HL
C_DATA1 ADD HL,DE
DEC A
JR NZ,C_DATA1
LD (FatBuffer.DIR_FRM),HL ; first sector DIR
LD C,(IY+#0B) ; Size sectors
LD B,(IY+#0C)
RL C
RL B
RL C
RL B
RL C
RL B
LD C,B
LD B,0 ; BC - File handels in sectors
LD A,C
LD (FatBuffer.F_P_S),A
LD E,(IY+_sBOOT_SEC.F_P_DIR) ; Number file handel
LD D,(IY+_sBOOT_SEC.F_P_DIR+1)
EX DE,HL
DEC HL
XOR A
NEXTAD2
INC A
JP Z,ERR_BPB
SBC HL,BC
JR NC,NEXTAD2
EX DE,HL
LD C,A ; A - sectors in DIR
LD B,0
LD (FatBuffer.DIR_S_S),A
ADD HL,BC ; Start DATA area
LD (FatBuffer.DAT_FRM),HL
;LD HL,0
LD H,B ; âãâ ¢ B ­®«ì ¤®«¦¥­ ¡ëâì
LD L,B
LD C,(IY+#0B) ; Size sector
LD B,(IY+#0C)
LD A,(BootSector.S_P_C)
NEXTAD3
ADD HL,BC ; calc. cluster size
DEC A
JR NZ,NEXTAD3
LD (FatBuffer.CLU_LEN),HL
EX DE,HL
LD HL,#3FFF
XOR A
NEXTAD4
INC A
JP Z,ERR_BPB
SBC HL,DE
JR NC,NEXTAD4
LD (FatBuffer.C_P_B),A ; A - Clusters per bank (16k)
LD HL,BootSector.ID_FAT
LD DE,FatBuffer.MSG
LD B,3
R_BPBL1
LD A,(DE)
CP (HL)
JP NZ,IBMDOS_
INC HL
INC DE
DJNZ R_BPBL1
FID LD A,(HL)
INC HL
CP #20
JR Z,FID
CP "1"
JP NZ,ERR_BPB
LD A,(HL)
CP "6" ; FAT16
LD HL,#FFFF
JR Z,BPB_FAT
CP "2" ; FAT12
JP NZ,ERR_BPB
LD HL,#0FFF
BPB_FAT
LD (FatBuffer.FAT_TYP),A
LD (FatBuffer.ENDCLUS),HL
LD HL,0
LD C,(IY+_sBOOT_SEC.S_P_T) ; Sector per track
LD B,(IY+_sBOOT_SEC.S_P_T+1)
LD A,(BootSector.HEADS)
BPB_L1: ; calc. sector per cylinder
ADD HL,BC
DEC A
JR NZ,BPB_L1
LD (FatBuffer.S_X_H),HL
LD DE,(FatBuffer.DAT_FRM)
; LD E,(IY+#1C) ;Hidden sec
; LD D,(IY+#1D)
; AND A
; SBC HL,DE
; EX DE,HL
LD L,(IY+_sBOOT_SEC.S_P_D)
LD H,(IY+_sBOOT_SEC.S_P_D+1)
LD A,H
OR L
JP NZ,HDDSMAL
LD L,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS)
LD H,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+1)
LD C,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+2)
LD B,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+3)
AND A
SBC HL,DE
JP NC,HDDBIG
DEC BC
JP HDDBIG
HDDSMAL:
; AND A ;âãâ CF ¯®«î¡ á á¡à®è¥­ ¤®«¦¥­ ¡ëâì
SBC HL,DE
LD BC,0
HDDBIG LD A,(BootSector.S_P_C)
SCF
S4C01 RRA
JR C,S4C02
RR B
RR C
RR H
RR L
JP S4C01
S4C02 INC HL
LD (MAX_CLU),HL
POP IY
; LD DE,FAT
; LD HL,0
; LD IX,(FAT_FRM)
; LD B,3
; LD A,(DRIVE)
; LD C,5
; RST #18
; JP C,RDERR1
LD HL,0
LD (FATCASH),HL
LD A,FATPAGE
CALL BANK
PUSH AF
XOR A
CALL RE_FAT
POP AF
OUT (SLOT3),A
CALL R_CLUST
XOR A
RET
IBMDOS_ LD A,(IY+_sBOOT_SEC.ID_FORM)
CP #F0
JR C,ERR_BPB
;????? ­ ¤® «¨ ¨§¬¥­¨âì?
// OR 2
// CP #FA ; ID ram-¤¨áª 
CP #F8 ;   ¥á«¨ ­¥ F8?
;?????
LD A,'6'
LD HL,#FFFF
JP Z,BPB_FAT
LD A,'2'
LD HL,#0FFF
JP BPB_FAT
ERR_BPB:
POP IY
LD A,DSS_Error.sys.UNKNOWN_FORMAT
SCF
RET
RDERR1: LD A,DSS_Error.sys.NOT_READY
SCF
RET
;
FatBuffer:
.MSG: DB 'FAT'
.READ_PG: DB #00
.BLOCK: DB #00
.DIR_CLU: DW #0000
.DRIVE: DB #01
.FAT_FRM:
.FAT1_XX: DW #0000 ; MSD_FAT_SEC first sector FAT
.FAT2_XX: DW #0000
.DIR_FRH: DW #0000 ; MSD_CAT_SEC first sector DIR
.DIR_FRL:
.DIR_FRM: DW #0000 ; MSD_CAT_SEC first sector DIR
.F_P_S: DB #00 ; ç¨á«® ä ©«®¢ëå § ¯¨á¥© ¢ ᥪâ®à¥
.DIR_S_S: DB #00 ; DIR_SEC_SIZE
.DAT_FRM: DW #0000 ; MSD_DAT_SEC
.CLU_LEN:
.B_P_C: DW #0000 ; CLUSTER_LEN
.C_P_B: DB #00 ; A - Clusters per bank (16k) (ç¨á«® ª« áâ¥à®¢ ­  ¡«®ª އ“) ; ????? íâ® ¨á¯®«ì§ã¥âáï?
.FAT_TYP: DB #00 ; TYPE FAT (#32 - 12bit, #36 - 16bit)
.S_X_H: DW #0000 ; ª®«¨ç¥á⢮ ᥪâ®à®¢ ­  樫¨­¤à¥ ; ????? íâ® ¨á¯®«ì§ã¥âáï?
.ENDCLUS: DW #FFFF
;
;
DIRSPEC: DB '\'
BLOCK DIRSPEC.DEPTH,0 ;????? <20>ë«® 255, ã ‘ ©¬ ­  256
;
;R11
; !TODO ¯®ç¨­¨âì
SAVE_CUR_PATH
PUSH IX
PUSH IY
PUSH HL
PUSH DE
PUSH BC
PUSH AF
;
LD A,ENVPAGE
CALL BANK
PUSH AF
CALL CURRDSK
ADD A,"A"
LD HL,TMP_CURDIR
LD (HL),A
INC HL
LD A,":"
LD (HL),A
INC HL
CALL CURRDIR
; ¯®ç¥¬ã ­¥ POP AF : OUT (SLOT3),A
//POP BC
//LD A,B
//OUT (SLOT3),A
POP AF
OUT (SLOT3),A
;
;
POP AF
POP BC
POP DE
POP HL
POP IY
POP IX
RET
; !TODO ¯®ç¨­¨âì
BACK_CUR_PATH:
PUSH IY
PUSH IX
PUSH HL
PUSH DE
PUSH BC
PUSH AF
;
LD A,ENVPAGE
CALL BANK
PUSH AF
LD HL,TMP_CURDIR
CALL CHDIR
; ¯®ç¥¬ã ­¥ POP AF : OUT (SLOT3),A
//POP BC
//LD A,B
//OUT (SLOT3),A
POP AF
OUT (SLOT3),A
;
POP AF
POP BC
POP DE
POP HL
POP IX
POP IY
RET
;R11
;R12
SCANDRV:
DI ;!FIXIT ¢ DRV-MAIN ¬®£ãâ ¡ëâì ¯à®¡«¥¬ë á ¯à¥à뢠­¨ï¬¨
LD A,#FF
LD C,#FF
RST #18
LD (LDRIVE),A
EI
RET
;R12
;GOD EQU 1999-1980*512
;FHAND DB " "
; DB " "
; DB #20
; DW 0,0,0,0,0
; DW #0000
; DW 5*32+19+GOD
;SAVEC DW #0000
;SIZEC DW #0000,#0000
;=============================================
;//MODULE: DOS_X
;[END]

View File

@ -6,232 +6,361 @@
;--------------------------------------------------------------- ;---------------------------------------------------------------
;R00 2003-03-19 DNS Initial version ;R00 2003-03-19 DNS Initial version
;--------------------------------------------------------------- ;---------------------------------------------------------------
// INCLUDE "hardware.inc"
// INCLUDE "bios.inc"
; ORG #0000 ; ORG #0000
MODULE DRV ; !FIXIT ®¡®©â¨áì ¡¥§ ¬®¤ã«ï
;PAGEDRV EQU 0 ;PAGEDRV EQU 0
;===============;
;!FIXIT ¢ ¯à®æ¥¤ãॠª®â®à ï ¡ã¤¥â ®â¢¥ç âì §  ¯¥à¥å®¤ ¨§ í⮩ áâà ­¨æë ®¡à â­® ¢ MAIN ¤«ï ¢ë§®¢  ä㭪権
; „‘‘ ¨, ¢®§¬®¦­®, ¯®¢â®à­®¬ã § å®¤ã ¢ íâã áâà ­¨æã ç¥à¥§ RST #18 ¨§ ¤à㣨å áâà ­¨æ (ª®â®àëå ¯®ª  ­¥â)
; ᤥ« âì ­¥çâ® ¯®¤®¡­®¥ á ¯à®£à ¬¬­ë¬ á⥪®¬ áâà ­¨æ. <20>â  ¯à®æ¥¤ãà  ¨å á®åà ­ï¥â, ¯à¨¬¥à­® â ª ï ¦¥
; ¤®«¦­  ¢®ááâ ­ ¢«¨¢ âì.
; PUSH HL
;.SP+1: LD HL,DRV_PAGE.RSTx18_RET_PAGES
; LD (HL),A
; DEC L ; <20>¥ HL,   L - ç⮡ § ª®«ì楢 âì ®¡« áâì
; LD (.SP),HL
; POP HL
;===============;
;!TODO ;!TODO
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ////////////////////////////////////////////////////////////////////////
; <[NOT USED]> ; ; <[NOT USED]>
A0000: JP RST_00 ; A0000: JP RST_00
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ////////////////////////////////////////////////////////////////////////
;
; ;
RST_00: RST_00:
LD A,DSS_Error.drv.INVALID_COMMAND LD A,BIOS.Error.InvalidSubFunction
SCF SCF
RET RET
; ;
; ////////////////////////////////////////////////////////////////////////
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[BIOS API]>
; <[BIOS API]> ; BLOCK 8-$,#C7 ; #C7 - "RST 0" opcode
BLOCK 8-$,#FF ; A0008: PUSH AF
A0008: PUSH AF ; LD A,SYS_PORT.PAGE8
LD A,SYS_PORT.PAGE8; OUT (SYS_PORT.ON),A
OUT (SYS_PORT.ON),A ; POP AF
POP AF ; RET
RET ; ////////////////////////////////////////////////////////////////////////
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
;
;!FIXIT ;!FIXIT
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ////////////////////////////////////////////////////////////////////////
; <[DSS API]> ; ; <[DSS API]>
BLOCK #10-$,#FF ; BLOCK #10-$,#C7 ; #C7 - "RST 0" opcode
A0010: ;JP RST_10 ; A0010: ;JP DRV_PAGE.RST_10
DI : HALT ; DI : HALT
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ////////////////////////////////////////////////////////////////////////
;
////////////////////////////////////////////////////////////////////////
; <[DRIVE API]>
BLOCK #18-$,#C7 ; #C7 - "RST 0" opcode
;A0018 JP INTDISK
A0018: ;PUSH AF
;PUSH BC
SCF
RET
DRV_PAGE.MAIN_PAGE_NUMBER+2:
LD BC,0*256 + SLOT0 ; !FIXIT á ­¥ ¤®«¦­ë ¢áâ ¢«ïâìáï ­®¬¥à  ¢ë¤¥«¥­­ëå áâà ­¨æ?
;JP PORTAL.outDRV
////////////////////////////////////////////////////////////////////////
;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
; <[DRIVE API]> ;
BLOCK #18-$,#FF ;
;A0018 JP INTDISK ;
A0018: PUSH AF ;
PUSH BC ;
MAIN_PG_NUMBER+2: ;
LD BC,0*256+SLOT0 ; !FIXIT á ­¥ ¤®«¦­ë ¢áâ ¢«ïâìáï ­®¬¥à  ¢ë¤¥«¥­­ëå áâà ­¨æ?
JP PORTAL.outDRV ;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
;
;!TODO ;!TODO
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ////////////////////////////////////////////////////////////////////////
; <[NOT USED]> ; ; <[NOT USED]>
BLOCK #20-$,#FF ; BLOCK #20-$,#C7 ; #C7 - "RST 0" opcode
A0020: JP RST_20 ; A0020: JP DRV_PAGE.RST_20
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ////////////////////////////////////////////////////////////////////////
;
; ;
RST_20: DRV_PAGE.RST_20:
LD A,DSS_Error.drv.INVALID_COMMAND LD A,BIOS.Error.InvalidSubFunction
SCF SCF
RET RET
; ;
;!TODO ;!TODO
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ////////////////////////////////////////////////////////////////////////
; <[NOT USED]> ; ; <[NOT USED]>
BLOCK #28-$,#FF ; BLOCK #28-$,#C7 ; #C7 - "RST 0" opcode
A0028: JP RST_28 ; A0028: JP DRV_PAGE.RST_28
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ////////////////////////////////////////////////////////////////////////
;
; ;
RST_28: DRV_PAGE.RST_28:
LD A,DSS_Error.drv.INVALID_COMMAND LD A,BIOS.Error.InvalidSubFunction
SCF SCF
RET RET
; ;
;!TODO ////////////////////////////////////////////////////////////////////////
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; BLOCK #30-$,#C7 ; #C7 - "RST 0" opcode
; <[NOT USED]> ; RST_30: JP MOUSE_DRV.API
BLOCK #30-$,#FF ; .RET: OUT (SLOT0),A
A0030: JP RST_30 ; JP MOUSE_HANDLER
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ////////////////////////////////////////////////////////////////////////
;
;
RST_30:
LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
;
;!FIXIT ;!FIXIT
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ////////////////////////////////////////////////////////////////////////
; <[MAIN INT]> ; ; <[MAIN INT]> ;
BLOCK #38-$,#FF ; BLOCK #38-$,#C7 ;
A0038: ; /*
// JP RST_38 ; ;!TEST SIO INT
; RST_38: ; ; reg 0 - error reset
; INT_: PUSH AF ; IF KEYBOARD_INT_ENABLED && MOUSE_INT_ENABLED == 0
; EX AF,AF' ; PUSH AF
; PUSH AF ; ; reg 0 - error reset
; PUSH BC ; LD A,%0011'0000
; PUSH DE ; OUT (Z84.SIO.Ch_A.Ctrl),A
; PUSH HL ; ; reg 0 - return from int
; EXX ; LD A,%0011'1000
; PUSH BC ; OUT (Z84.SIO.Ch_A.Ctrl),A
; PUSH DE ; POP AF
; PUSH HL ; ELSEIF MOUSE_INT_ENABLED && KEYBOARD_INT_ENABLED == 0
; PUSH IX ; PUSH AF
; PUSH IY ; ; reg 0 - error reset
; CALL KEYSCAN ; LD A,%0011'0000
; LD C,#80 ; OUT (Z84.SIO.Ch_B.Ctrl),A
; RST #30 ; ; reg 0 - return from int
; POP IY ; LD A,%0011'1000
; POP IX ; OUT (Z84.SIO.Ch_B.Ctrl),A
; POP HL ; POP AF
; POP DE ; ELSEIF MOUSE_INT_ENABLED && KEYBOARD_INT_ENABLED
; POP BC ; PUSH AF
; EXX ; ; reg 0 - error reset
; POP HL ; LD A,%0011'0000
; POP DE ; OUT (Z84.SIO.Ch_A.Ctrl),A
; POP BC ; OUT (Z84.SIO.Ch_B.Ctrl),A
; POP AF ; ; reg 0 - return from int
; EX AF,AF' ; LD A,%0011'1000
; POP AF ; OUT (Z84.SIO.Ch_A.Ctrl),A
OUT (Z84.SIO.Ch_B.Ctrl),A
POP AF
ENDIF
EI ; EI ;
RETI ; RETI ;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; */
; RST_38_DRV: JP .Portal
BLOCK RST_38_IM1.Portal - $,0
.Portal: PUSH AF
LD A,(DRV_PAGE.MAIN_PAGE_NUMBER)
OUT (SLOT0),A
POP AF
EI
RETI
////////////////////////////////////////////////////////////////////////
; ;
KEYSCAN: RET ;!FIXIT DRV_PAGE.KEYSCAN: RET ;!FIXIT
; ;
;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ////////////////////////////////////////////////////////////////////////
; <[ NMI ]> ; ; <[ NMI ]> ;
NMI: RETN ; DRV_PAGE.NMI: RETN ;
BLOCK #66-$,#FF ; BLOCK #66-$,#C7;
A0066: JP NMI ; A0066: JP DRV_PAGE.NMI ;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ////////////////////////////////////////////////////////////////////////
;
;-------------------------------; ;-------------------------------;
;ADRST10 EQU #00 ;!!!!! ;ADRST10 EQU #00 ; ;!!!!!
;-------------------------------; ;-------------------------------;
;!FIXIT ;!FIXIT
RST_10 PUSH HL ; DRV_PAGE.RST_10:
LD L,C ; PUSH HL
LD H,ADRST10/256 ; LD L,C
LD C,(HL) ; LD H,ADRST10/256
INC H ; LD C,(HL)
LD H,(HL) ; INC H
LD L,C ; LD H,(HL)
EX (SP),HL ; LD L,C
RET ; EX (SP),HL
; RET
;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ////////////////////////////////////////////////////////////////////////
; <[DRIVE PAGE SWITCH]> ; ; <[DRIVE PAGE SWITCH]> ;
BLOCK #7E-$,0 ; BLOCK PORTAL.RSTx18_SWITCH_ADDRESS-$-(PORTAL.out_DRV.switch - PORTAL.out_DRV),#C7
PORTAL.toMAIN: ; PORTAL.out_DRV: PUSH BC
PUSH BC ; .RETBANK+2: LD BC,SLOT0 + 0*256; ;!!!!! ReScnDRV ¨á¯®«ì§ã¥â íâ® §­ ç¥­¨¥
RETBANK+2: ; .switch: OUT (C),B
LD BC,0*256+SLOT0 ; ASSERT $!=84,'-> Portal error!';
OUT (C),B ; ;Entry point from DSS main page
ASSERT $!=84,'-> Portal error!'; LD (.RETBANK),A
;Entry point from DSS main page ; !FIXIT ¥á«¨ 2 à §  ¯à¨«¥â¥âì ­  íâã â®çªã ¢å®¤ , â® § áàñâáï RETBANK POP BC
LD (RETBANK),A ; POP AF
POP BC ; .ADCALL+1: CALL DISPATCH ; ¯ âç¨âáï ­  INTDISK
POP AF ; JR NC,PORTAL.out_DRV
ADCALL+1: ; OR DSS_Error.DRV_MASK
CALL DISPATCH ; ¯ âç¨âáï ­  INTDISK SCF
JR PORTAL.toMAIN ; JP PORTAL.out_DRV
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ////////////////////////////////////////////////////////////////////////
;
/*
push hl
*/
;!FIXIT çñâ ­¥ â® âãâ
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
LD B,#00; ;
OUT (C),A ;
;--- ;
POP BC ;
RET ;
PORTAL.outDRV: ;
RET ;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
;
; ////////////////////////////////////////////////////////////////////////
DISPATCH MOUSE_HANDLER: POP AF
CALL INITDVC CALL MOUSE_DRV.API
PUSH AF
.CorePage EQU $$$ + 1
LD A,#FF
JP RST_30.RET
////////////////////////////////////////////////////////////////////////
DRV_PAGE.LDRIVE: DB #00
DISPATCH:
LD HL,INTDISK LD HL,INTDISK
LD (ADCALL),HL LD (PORTAL.out_DRV.ADCALL),HL
LD A,(LDRIVE) INITDVC_RET_DRIVE:
CALL INITDVC
LD A,(DRV_PAGE.LDRIVE)
AND A AND A
RET RET
INCLUDE 'dss/Drivers/media/shared.asm'
INCLUDE 'dss/Drivers/media/ata_atapi-drv.asm'
INCLUDE 'dss/Drivers/media/fdd-drv.asm'
INCLUDE 'dss/Drivers/media/ram_disk-drv.asm'
INCLUDE "dss/Drivers/input/MOUSE.ASM"
/////////////////////////// [ DRIVE TABLES ] \\\\\\\\\\\\\\\\\\\\\\\\\\\;
;
;--------------------------[shared.asm table]--------------------------;
DEVICE EQU $
.TBL_Entry EQU 3
.Size EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry
.End EQU DEVICE.Size + 1 ; ¤«ï á⮯-¡ ©â  #FF
;----------------------------------------------------------------------;
; ;
LDRIVE DB #00 ;
;--------------------------[shared.asm table]--------------------------;
;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
;+01 LONG SECTOR OFFSET
;+05 LONG SIZE IN SECTORS
;+09 BYTE PARTITION RECORD NUMBER (in drive MBR)
;+10 WORD Sector Size
;+12 BYTE Removable Media Byte flags
;+13_15 FREE
;
LOGDRV EQU DEVICE + DEVICE.End
.TBL_Entry EQU 16
.Size EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry
;!TODO ᤥ« âì áâàãªâãன
.PHISICAL_DRV_NUMBER EQU 0
.SECTOR_OFFSET EQU 1
.SIZE_IN_SECTORS EQU 5
.PARTITION_RECORD_NUM EQU 9
.SECTOR_SIZE EQU 10 ; word
.MediaParameters EQU 12 ; bit0=1 removable, bit1=1 drive changed, bit7..2 reserved
.Reserved_1 EQU 13
.Reserved_2 EQU 14
.Reserved_3 EQU 15
; ‚•Ž„: L - «®£¨ç¥áª¨© ­®¬¥à ¢ â ¡«¨æ¥
; ‚›•Ž„: IY - ­ ç «® § ¯¨á¨
; <20>Ž<EFBFBD>ˆ: HL, IY. HL<-->DE
; MACRO LOGDRV_ENTRY_FIND tbl_addr
; LD H,0
; ADD HL,HL
; ADD HL,HL
; ADD HL,HL
; ADD HL,HL
; ;LD B,H
; ;LD C,L
; EX DE,HL
; LD IY,tbl_addr
; ADD IY,DE
; ENDM
;----------------------------------------------------------------------;
;
INCLUDE 'disk_x.asm' ;
INCLUDE 'ide_drv0.asm' ;-----------------------[ram_disk-drv.asm table]-----------------------;
INCLUDE 'fdd_drv0.asm' ; <E28099>ˆ€ ‘ŽŽ’‚…’‘’‚ˆŸ Œ…†„“ ”ˆ‡ˆ—…‘ŠˆŒ <20>ŽŒ…<C592>ŽŒ <20>€Œ„ˆŠ€ ˆ …ƒŽ RAM-DISK ID
;INCLUDE 'ram_drv0.asm' ; Log Number: DB RAM_Drive_Log_Number, RAM_Drive_ID ;(BIOS 0-15), (Block ID for BIOS)
INCLUDE 'ram_drv1.asm' RAMDTBL EQU LOGDRV + LOGDRV.Size
.TBL_Entry EQU 2
.Size EQU .TBL_Entry * MAX_RAMDRIVES
; RAMDTBL: DUP MAX_RAMDRIVES * RAMDTBL.TBL_Entry
; DB #FF
; EDUP
; .Size EQU $-RAMDTBL
;----------------------------------------------------------------------;
;
////////////////////////////////////////////////////////////////////////;
DB 0
///////////////////////// [ DRIVE TABLES COPY] \\\\\\\\\\\\\\\\\\\\\\\\\;
ENDMODULE MODULE OLD_TABLES
;
;--------------------------[shared.asm table]--------------------------;
DEVICE EQU @RAMDTBL + @RAMDTBL.Size
.TBL_Entry EQU @DEVICE.TBL_Entry
.Size: EQU @DEVICE.Size
.End EQU @DEVICE.End
;----------------------------------------------------------------------;
;
;
;--------------------------[shared.asm table]--------------------------;
;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
;+01 LONG SECTOR OFFSET
;+05 LONG SIZE IN SECTORS
;+09 FREE
;+15
LOGDRV EQU DEVICE + DEVICE.End
.TBL_Entry EQU @LOGDRV.TBL_Entry
.Size EQU @LOGDRV.Size
;----------------------------------------------------------------------;
;
;
;-----------------------[ram_disk-drv.asm table]-----------------------;
; <E28099>ˆ€ ‘ŽŽ’‚…’‘’‚ˆŸ Œ…†„“ ”ˆ‡ˆ—…‘ŠˆŒ <20>ŽŒ…<C592>ŽŒ <20>€Œ„ˆŠ€ ˆ …ƒŽ RAM-DISK ID
; Log Number: DB RAM_Drive_Log_Number, RAM_Drive_ID ;(BIOS 0-15), (Block ID for BIOS)
RAMDTBL EQU LOGDRV + LOGDRV.Size
.TBL_Entry EQU @RAMDTBL.TBL_Entry
.Size EQU @RAMDTBL.Size
; RAMDTBL: DUP MAX_RAMDRIVES * RAMDTBL.TBL_Entry
; DB #FF
; EDUP
; .Size EQU $-RAMDTBL
;----------------------------------------------------------------------;
;
ENDMODULE
////////////////////////////////////////////////////////////////////////;
;DISPLAY "DEVICE start: ", /H, DEVICE
;DISPLAY "Old DEVICE start: ", /H, OLD_TABLES.DEVICE
;DISPLAY "LOGDRV start: ", /H, LOGDRV
;DISPLAY "Old LOGDRV start: ", /H, OLD_TABLES.LOGDRV
;DISPLAY "RAMDTBL start: ", /H, RAMDTBL
;DISPLAY "Old RAMDTBL start: ", /H, OLD_TABLES.RAMDTBL
;
;DRV_TEMP_BUFFER:
;---------[256 bytes stack for return pages of RST #18 callers]--------;
; #3F00 - #3FFF
DRV_PAGE.RSTx18_RET_PAGES EQU #3FFF
;----------------------------------------------------------------------;
; ASSERT ((#4000-DRV_TEMP_BUFFER-256) > (DEVICE.Size + LOGDRV.Size + RAMDTBL.Size)), "No space for DRV_TEMP_BUFFER in DRV-MAIN page"
; ENDMODULE
; OUTEND ; OUTEND
;[END] ;[END]

735
DSS/DSS-MAIN.ASM Normal file
View File

@ -0,0 +1,735 @@
;[BEGIN]
;//MODULE: DOS-MAIN AUTHOR: Denis Parinov
;//CREATE: A LONG TIME AGO :)
;---------------------------------------------------------------
;Rev Date Name Description
;---------------------------------------------------------------
;[ ] 㢥«¨ç¨âì ¤«¨­ã PATH ¨ áâப¨ BAT
;[ ] ¯ãâì ⥪ã饣® ª â «®£  ¢ DIR ¢ë¢®¤¨âáï á £«îª®¬ ¥á«¨ ®­ ¤«¨­¥¥ 256 ¡ ©â®¢
;[ ] ¯ãâì ¢ ¯à¨£« è¥­¨¨ ª®­á®«¨ ¢ë¢®¤¨âáï á £«îª®¬ ¥á«¨ ¯ãâì ¤«¨­¥¥ 256 ¡ ©â®¢
;[ ] ;!FIXIT ª ª®©-â® ¡ £ ¯à¨ ª®â®à®¬ ¥á«¨ ­¥â ¤¨áª  ¨ ­  ­¥£® ¯®«¥§âì, â® ¢áñ «®¬ ¥âáï
;R12 24-07-2023 BAO Check minimum BIOS version on boot
;R11 17-04-2023 BAO OPTIMIZED BUFFERS, FREED UP 768 BYTES FOR CODE
;R10 14-04-2023 BAO €¢ à¨©­ë© § ¢¨á®­ á ¢ë¢®¤®¬ á®®¡é¥­¨ï ¯à¨ áâ à⥠á¨á⥬ë, ¥á«¨ ­¥â ᢮¡®¤­®© ¯ ¬ïâ¨
;R09 08-04-2023 BAO ‘®ªà é¥­¨¥ à §¬¥à  â ¡«¨æë API ¤® 96 ä㭪権 (0 - #5F). (Ž¯æ¨®­ «ì­® ¯à¨ ª®¬¯¨«ï樨)
;R08 15-04-2003 DNS RENAMED FN. OPEN AND CLOSE
;R07 31-03-2003 DNS NEW DEPLOYING ROUTINE
;R06 31-03-2003 DNS RELAYOUTING MEMORY
;R05 27-03-2003 DNS CHANGE DRV. INIT. METHOD
;R04 27-03-2003 DNS DRIVERS MOVE TO SPECIAL PAGE
;R03 14-03-2003 DNS CODE OPTIMIZATION
;R02 19-11-2002 DNS ADD ENVIRONMENT INITIALIZATION
;R01 14-11-2002 DNS CUT AND MOVE BPB-STRUCT
;---------------------------------------------------------------
; OUTPUT './Build/system.dos'
; MODULE MAIN
//SPRINTER EQU 2000
includelua 'Shared_includes/lua/Functions.lua'
include 'shared_includes/structures/FileSystem.inc'
include 'shared_includes/constants/sp2000.inc'
INCLUDE 'defines.inc'
include 'Structures.inc'
include 'shared_includes/constants/standart_colors.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 'VERSION.INC'
INCLUDE 'DSS_MACROSES.Z80'
;PAGEDRV EQU #00
; DIRPAGE EQU 0
; FATPAGE EQU 1
; TXTPAGE EQU 2
; ENVPAGE EQU 2
; DRVPAGE EQU 3
; ENVPAGE EQU 3
; DRVPAGE EQU 4
; TXTADDR EQU #C000
; ENVADDR EQU #E400
; DIR EQU #C000
; FAT EQU #C000
;
; = -- = -- = -- = -- = = -- = -- = = -- = -- = = -- = -- = -- = -- = --;
ORG 0
;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
; <[CLOSE TASK]> ;
RST_0x00: JP RETFAR ; ;EXECUTE.ASM R12
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
;
;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
; <[BIOS API]> ;
_mInfoBLOCK 8-$,#FF ;
RST_0x08: PUSH AF ;
LD A,SYS_PORT.BIOS ;
OUT (SYS_PORT.ON),A ;
POP AF ;
RET ;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
;
;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
; <[DSS API]> ;
_mInfoBLOCK #10-$,#FF ;
RST_0x10: JP RST_10 ;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
;
;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
; <[DRIVE API]> ;
_mInfoBLOCK #18-$,#FF ;
;A0018 JP INTDISK ;
RST_0x18: PUSH AF ;
PUSH BC ;
DRV_PG_NUMBER+2: ;
LD BC,0*256+SLOT0 ;
JP PORTAL.out_MAIN ;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
;
;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
; <[NOT USED]> ;
_mInfoBLOCK #20-$,#FF ;
RST_0x20: JP RST_20 ;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
;
;
RST_20:
RST_28:
NOPS: LD A,DSS_Error.sys.INVALID_FUNCTION
SCF
RET
;
;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
; <[NOT USED]> ;
_mInfoBLOCK #28-$,#FF ;
RST_0x28: JP RST_28 ;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
;
;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
; <[MOUSE API]> ;
_mInfoBLOCK #30-$,#FF ;
RST_0x30: PUSH AF
.drv_page+1: LD A,#FF
OUT (SLOT0),A
POP AF
RET
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
;
////////////////////////////////////////////////////////////////////////
; <[MAIN INT]>
_mInfoBLOCK #38-$,#FF
;¤«ï ⮣®, ç⮡ á®äâë ¬®£«¨ ¬¥­ïâì ®¡à ¡®â稪 ­  ᢮©.
RST_38_IM1: JP .Handler
.Handler: CALL INTx38_Handler
EI
RETI
;
.Portal: PUSH AF
LD A,(RST_0x30.drv_page)
OUT (SLOT0),A
;POP AF
PUSH HL
LD HL,(RST_38_IM1+1)
XOR A
CP H
JR NZ,.error
LD A,low .Handler
CP L
JR NZ,.error
POP HL
POP AF
CALL INTx38_Handler
JR .Portal
;
.error: POP HL
POP AF
JR .Portal
;
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
;
;NMI: RETN
;
;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
; <[ NMI ]> ;
_mInfoBLOCK #66-$,#FF ;
NMI_0x66: RETN ;JP NMI ;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
;
////////////////////////////////////////////////////////////////////////
;
RST_10: PUSH HL
LD L,C
IF SHORT_RSTx10_TABLE
;[ ] R09
LD H,A
LD A,+(DSS_API_TABLE.low_short)
SUB C
JR C,.error
LD A,H
;[ ] R09
ENDIF
LD H,high DSS_API_TABLE
LD C,(HL)
INC H
LD H,(HL)
LD L,C
EX (SP),HL
RET
IF SHORT_RSTx10_TABLE
;[ ] R09
.error: POP HL
JR NOPS
;[ ] R09
ENDIF
;
;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
; <[DRIVE PAGE SWITCH]> ;
_mInfoBLOCK #80-$,0 ;
;ENTER: ;
PORTAL.out_MAIN: ;
IN A,(C) ;
OUT (C),B ;
ASSERT $!=84,'-> Portal error!';
POP BC ;
RET ;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
;
;R01
; Area for boot sector BootSector.
;BootSector _sBOOT_SECTOR_PARAMS ,{ "DSS_","0"+VERS,".",MODF/10+"0",MODF-(MODF/10)*10+"0" }
; end boot sector
;R01
; = -- = -- = -- = -- = = -- = -- = = -- = -- = = -- = -- = -- = -- = --;
;
;
CLEAR_BUFFER_AND_INIT_PROC:
;------[CLEAR BUFFERS]------;
;R07 ;R11
XOR A
LD HL,CLEAR_ZONE.start
LD DE,CLEAR_ZONE.start+1
LD BC,CLEAR_ZONE.size-1
LD (HL),A
LDIR
LD HL,':'*256 + 'X'
LD (CORE_BUFFERS.CurrentPath),HL
LD A,'\' ;
LD (CORE_BUFFERS.CurrentDirectory),A
LD (CORE_BUFFERS.WorkDirectory),A
;
LD A,#FF
LD (CORE_BUFFERS.FS_Buffer.DRIVE),A
;
;R07 ;R11
;R11
LD HL,CORE_BUFFERS.FM_BUF
LD (HL),'.'
;R11
;---------------------------;
;R02
;LD B,#FF ;INIT ENVIRONMENT
CALL INITENV
; IFN CLASSIC_CURSOR
CALL SETUP_CURSORS
; ENDIF
;R02
JP VERSION
INTx38_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
LD C,Dss.Mouse.GetPackets
RST ToDSS.Mouse
;CALL M_INT
; IFN CLASSIC_CURSOR
CALL cursor_interrupt; ¢¥ªâ®à ®¡á«ã¦. ªãàá®à  ;!!!!! VASIL
; ENDIF
POP IY
POP IX
POP HL
POP DE
POP BC
EXX
POP HL
POP DE
POP BC
POP AF
EX AF,AF'
POP AF
RET
;R03
;R07Allocate memory
; LD BC,#03C2
; RST ToBIOS
; LD HL,BANKTBL
; LD C,A
; LD B,#FF
;VERINIT INC B
; PUSH BC
; PUSH HL
; LD A,C
; LD C,#C4
; RST ToBIOS
; POP HL
; POP BC
; LD (HL),A
; INC HL
; JR NC,VERINIT
;R07;R03
;R07 JP INIT2 ;R03
; DS $/256+1*256-$,0 c:\bin\menu
;----------------------------------------------------------------------;
;MEMTAB: BLOCK 256,0
;----------------------------------------------------------------------;
_mInfoALIGN 256,0
;------------------------------------------------------------------------------------------------------------------------;
GO_ZERO EQU #0000
;FUNCTION ADDRESS ARRAY
DSS_API_TABLE: ;DS 512 ;,0
;...............................................[LOW ADDRESS ]:
; 0 1 2 3 4 5 6 7 8 9 DEC HEX
DB low F_START, low CHDISK_FN, low CURDISK_FN,low DISKINF, low NOPS, low NOPS, low NOPS, low NOPS, low SCANDRV, low BOOTDSK ; 0 00..09
DB low CREATE, low CREATE.NEW, low NOPS, low NOPS, low DEL_FN, low NOPS, low RENAME, low OPEN_FN, low CLOSE_FN, low READ ; 1 0A..13
DB low WRITE, low MOVE_FP, low ATTRIB, low GET_D_T, low PUT_D_T, low F_FIRST_FN,low F_NEXT, low MKDIR.B, low RMDIR, low CHDIR_FN ; 2 14..1D
DB low CURRDIR_FN,low NOPS, low NOPS, low SYSTIME, low SETTIME, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 3 1E..27
DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low WAITKEY, low SCANKEY ; 4 28..31
DB low ECHOKEY, low CTRLKEY, low NOPS, low K_CLEAR, low K_SETUP, low TESTKEY, low SETWIN, low SETWIN1, low SETWIN2, low SETWIN3 ; 5 32..3B
DB low FREEMEM, low GETMEM, low RETMEM, low SETMEM, low EXEC, low LEAVE, low GET_ERR, low GSWITCH, low DOSNAME, low EX_PATH ; 6 3C..45
DB low ENVIRON, low APPINFO, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 7 46..4F
DB low SETVMOD, low GETVMOD, low LOCATE, low CURSOR, low SELPAGE, low SCROLL, low CLEAR, low RDCHAR, low WRCHAR, low WINCOPY ; 8 50..59
DB low WINREST, low PUTCHAR, low PCHARS, low LIB_SUB, low NOPS, low PRINT ; 9 5A..5F
;[ ] R09
.low_short EQU $ - DSS_API_TABLE
IFN SHORT_RSTx10_TABLE
;
DB low NOPS, low NOPS, low NOPS, low NOPS ; 9 60..63
DB low NOPS, low NOPS, low NOPS, low NOPS, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO ; 10 64..6D
DUP 13
DB low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO ; 110-239 6E-EF
EDUP
DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 24 F0..F9
DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; END ; 25 FA..FF
;
ELSE ;!TODO free space
_mInfoBLOCK DSS_API_TABLE+#100 - $,0
;[ ] R09
ENDIF
;...............................................[HIGH ADDRESS]:
DB high F_START, high CHDISK_FN, high CURDISK_FN,high DISKINF,high NOPS, high NOPS, high NOPS, high NOPS, high SCANDRV, high BOOTDSK
DB high CREATE, high CREATE.NEW,high NOPS, high NOPS, high DEL_FN, high NOPS, high RENAME, high OPEN_FN,high CLOSE_FN,high READ
DB high WRITE, high MOVE_FP, high ATTRIB, high GET_D_T,high PUT_D_T,high F_FIRST_FN,high F_NEXT, high MKDIR.B,high RMDIR, high CHDIR_FN
DB high CURRDIR_FN,high NOPS, high NOPS, high SYSTIME,high SETTIME,high NOPS, high NOPS, high NOPS, high NOPS, high NOPS
DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high WAITKEY, high SCANKEY
DB high ECHOKEY, high CTRLKEY, high NOPS, high K_CLEAR,high K_SETUP,high TESTKEY, high SETWIN, high SETWIN1,high SETWIN2, high SETWIN3
DB high FREEMEM, high GETMEM, high RETMEM, high SETMEM, high EXEC, high LEAVE, high GET_ERR,high GSWITCH,high DOSNAME, high EX_PATH
DB high ENVIRON, high APPINFO, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS
DB high SETVMOD, high GETVMOD, high LOCATE, high CURSOR, high SELPAGE,high SCROLL, high CLEAR, high RDCHAR, high WRCHAR, high WINCOPY
DB high WINREST, high PUTCHAR, high PCHARS, high LIB_SUB,high NOPS, high PRINT
;[ ] R09
.high_short EQU $ - DSS_API_TABLE - .low_short
IFN SHORT_RSTx10_TABLE
;
DB high NOPS, high NOPS, high NOPS, high NOPS
DB high NOPS, high NOPS, high NOPS, high NOPS, high GO_ZERO,high GO_ZERO, high GO_ZERO,high GO_ZERO,high GO_ZERO, high GO_ZERO
DUP 13
DB high GO_ZERO, high GO_ZERO, high GO_ZERO, high GO_ZERO,high GO_ZERO,high GO_ZERO, high GO_ZERO,high GO_ZERO,high GO_ZERO, high GO_ZERO
EDUP
DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS
DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS ; END
;
ELSE
;!TODO free space
;_mInfoBLOCK DSS_API_TABLE+#200 - $,0
;[ ] R09
ENDIF
; DB low WINREST, low PUTCHAR, low PCHARS, low NOPS, low NOPS, low PRINT, low NOPS, low NOPS, low NOPS, low NOPS ; 9 5A..63
; DB high WINREST,high PUTCHAR,high PCHARS, high NOPS, high NOPS, high PRINT, high NOPS, high NOPS, high NOPS, high NOPS
;---------------------------------------------------------------------------------------------------------------------------------------------------------------;
;[INCLUDE]
;!TODO § ¬¥­¨âì ¯®-¬ ªá¨¬®¬ã ¢áñ ¢ KEYINTER.ASM ­  ¢ë§®¢ë ¡¨®á 
INCLUDE "KEYINTER.ASM"
INCLUDE "API.ASM"
INCLUDE "DOS_Proc.asm"
INCLUDE "FS_Module.asm"
INCLUDE "Procedures.asm"
;INCLUDE "drivers/drv_to_sys_errors.asm" ; !TODO
; [ ] 26/06/2024& read only 64kb cluster ; !TODO cluster 64kb
CHECK_64kb_CLUSTER:
LD HL,(CORE_BUFFERS.FS_Buffer.BytesPerCluster)
; CF=0
ADC HL,HL
LD A,DSS_Error.sys.WRITE_PROTECT
RET NZ
CCF
RET
;
;!FIXIT ª ¡ãä¥à ¬
; Œ áᨢ «®£. ­®¬¥à®¢ ¡ ­®ª à áè¨à¥­¨ï DSS
BANKTBL: BLOCK USING_MEMPAGES+1,#FF ; +1 ¤«ï COREPAGE
HANDBUF: BLOCK HANDBUF.SIZE,0
;
; ; FAT_DIRECTORY_RECORD ; !HARDCODE
MASKARE: BLOCK 8,0 ; ¨¬ï ä ©« 
BLOCK 3,0 ; à áè.
BLOCK 21,0 ; 11+21=32
;
DISPLAY "DOS-MAIN end address: ",/H,$-1
;
;!TODO ª ¡ãä¥à ¬!
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
; 259
CurrentPath: DB 'X'
DB ':'
CurrentDirectory: DB '\'
.DEPTH: EQU DIRECTORY_PATH_LENGTH
BLOCK CurrentDirectory.DEPTH,0 ; ­¥ .DEPTH-1 ç⮡ ¡ë« 0 ¢ ª®­æ¥
;
; 257
WorkDirectory: DB '\'
.DEPTH: EQU DIRECTORY_PATH_LENGTH
BLOCK WorkDirectory.DEPTH,0 ; ­¥ .DEPTH-1 ç⮡ ¡ë« 0 ¢ ª®­æ¥
; 516
*/
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;
;> > > > > > > > > > > > > > > > BUFFERS < < < < < < < < < < < < < < < <
;
;
CLEAR_ZONE.start EQU $
MODULE CORE_BUFFERS
BUFFERSplace _sBuffers=$
FM_BUF _sFM = BUFFERSplace.FileManipulator
.Size EQU _sFM
.FullSize EQU FMCOUNT*FM_BUF.Size
FS_Buffer _sFS_Buffer = BUFFERSplace.FS_Buffer
EXEBUFF _sEXE_HEADER = BUFFERSplace.EXE_Header
XSTACK _sStack = BUFFERSplace.Stack
.Spoint EQU XSTACK + _sStack
BUFFER EQU BUFFERSplace.Buffer
SECTOR_BUFFER EQU BUFFER ;!TODO ®â¤¥«¨âì SECTOR_BUFFER ®â BUFFER
MemoryTable EQU BUFFERSplace.MemoryTable
CurrentPath EQU BUFFERSplace.CurrentPath
CurrentDirectory EQU BUFFERSplace.CurrentDirectory
.DEPTH EQU DIRECTORY_PATH_LENGTH
WorkDirectory EQU BUFFERSplace.WorkDirectory
.DEPTH EQU DIRECTORY_PATH_LENGTH
ENDMODULE
;
; CurrentPath EQU CORE_BUFFERS.BUFFERSplace + _sBuffers
; CurrentDirectory EQU CurrentPath + 2
; .DEPTH: EQU DIRECTORY_PATH_LENGTH
; ;
; WorkDirectory EQU CurrentDirectory + 1 + CurrentDirectory.DEPTH
; .DEPTH: EQU DIRECTORY_PATH_LENGTH
;
CLEAR_ZONE.size EQU _sBuffers
ASSERT (CLEAR_ZONE.start + _sBuffers)<#4000, "Warning!!! OUT OF SLOT0"
DISPLAY "--- --- --- --- --- --- --- ---"
DISPLAY "CLEAR_ZONE.start ", /H, CLEAR_ZONE.start
DISPLAY "CLEAR_ZONE.Size ", /H, CLEAR_ZONE.size
DISPLAY "--- --- --- --- --- --- --- ---"
DISPLAY "Consist: "
DISPLAY " FM_BUF ", /H, CORE_BUFFERS.FM_BUF
DISPLAY " FM_BUF.Size: ", /H, CORE_BUFFERS.FM_BUF.Size
DISPLAY " FM_BUF.FullSize ", /H, CORE_BUFFERS.FM_BUF.FullSize
DISPLAY " FS_Buffer ", /H, CORE_BUFFERS.FS_Buffer
DISPLAY " FS_Buffer.Size ", /H, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.FS_Buffer
DISPLAY " EXEBUFF ", /H, CORE_BUFFERS.EXEBUFF
DISPLAY " Size ", /H, CORE_BUFFERS.XSTACK - CORE_BUFFERS.EXEBUFF
DISPLAY " XSTACK ", /H, CORE_BUFFERS.XSTACK
DISPLAY " Size ", /H, CORE_BUFFERS.BUFFER - CORE_BUFFERS.XSTACK
DISPLAY " BUFFER ", /H, CORE_BUFFERS.BUFFER
DISPLAY " Size ", /H, CORE_BUFFERS.MemoryTable - CORE_BUFFERS.BUFFER
DISPLAY " MemoryTable ", /H, CORE_BUFFERS.MemoryTable
DISPLAY " Size ", /H, _sBuffers - (CORE_BUFFERS.MemoryTable - CORE_BUFFERS.BUFFERSplace)
DISPLAY "--- --- --- --- --- --- --- ---"
DISPLAY "CLEAR_ZONE.End ", /H, CLEAR_ZONE.start + CLEAR_ZONE.size
DISPLAY "--- --- --- --- --- --- --- ---"
EXPORT CORE_BUFFERS.BUFFERSplace
EXPORT CORE_BUFFERS.FM_BUF
EXPORT CORE_BUFFERS.FS_Buffer
EXPORT CORE_BUFFERS.EXEBUFF
EXPORT CORE_BUFFERS.XSTACK
EXPORT CORE_BUFFERS.BUFFER
EXPORT CORE_BUFFERS.SECTOR_BUFFER
EXPORT CORE_BUFFERS.MemoryTable
EXPORT CORE_BUFFERS.CurrentDirectory
EXPORT CORE_BUFFERS.WorkDirectory
/*
;R11 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
FM_BUF _sFM=$
.Size EQU _sFM
.FullSize EQU FMCOUNT*FM_BUF.Size
;?????   ­¥ £à㧨âáï «¨ ¯®«­®áâìî ᥪâ®à ¢ 512 ¡ ©â®¢ ¯à¨ § £à㧪¥ åí¤¥à ?
EXEBUFF _sEXE_HEADER=$+FM_BUF.FullSize
; EXEBUFF:
; DB "EXE"
; DB #00
; OFFCOD1 DW #0000
; OFFCOD2 DW #0000
; LOADER DW #0000
; DW #0000
; DW #0000
; DW #0000
; LD_ADDR DW #0000
; PC_REG DW #0000
; SP_REG DW #0000
; BLOCK 512-($-EXEBUFF),0
;(!!!HERE STACK FOR EXEC!!!)
; BLOCK 255,0
;XSTACK DB #00
XSTACK EQU EXEBUFF+_sEXE_HEADER+255
BUFFER EQU XSTACK+1
SECTOR_BUFFER EQU BUFFER
;R11 ////////////////////////////////
*/
;
;> > > > > > > > > > > > > > > > BUFFERS < < < < < < < < < < < < < < < <
;
;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
; § âàñâáï ¯®á«¥ ¨­¨æ¨ «¨§ æ¨¨
;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
; <20>¥à¢ë© áâ àâ á¨á⥬ë, ¯®á«¥ ¨­¨æ¨ «¨§ æ¨¨  ¤à¥á ¢ â ¡«¨æ¥ ¬¥­ï¥âáï ­  VERSION
F_START: DI
;[x] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
;LD (.saveDRV),A
LD H,A
LD (.saveDRV),HL ; H - ­®¬¥à ãáâனá⢠, L - ­®¬¥à à §¤¥«  ­  ãáâனá⢥
;
;R12
LD HL,0 ; ¯¨á âì ¢ ­¨ªã¤ 
LD C,BIOS.FN_VERSION
RST ToBIOS
JR C,.err_oldBIOS
EX DE,HL
LD DE,MINIMUM_BIOS_VERSION
SBC HL,DE
JR C,.err_oldBIOS
; LD A,(.saveDRV+1)
; CP 2 ;¯à®¢¥àª  ­  § £à㧪ã á ¤¨áª¥âë, ¥á«¨ á ¤¨áª¥âë, â® ¬®¦­® ¯à®¨£­®à¨âì § ¯ã᪠­  BIOS ­¨¦¥ 2.55
; JR NC,.err_oldBIOS
; LD HL,#C9AF ; XOR A : RET opcodes
; LD (DRV_CONTENT + INITDVC.if_old),HL
;
.good: CALL DEPLOY ;R07 ;íâ  ¯à®æ¥¤ãà  § âàñâáï ¯®á«¥ ¨á¯®«­¥­¨ï
RET C ;R10
CALL KEYBOARD_INIT
CALL PRINT_INIT
LD C,Dss.Mouse.Init
RST ToDSS.Mouse
LD A,(VMODE)
LD C,Dss.Mouse.SetVideoMode
RST ToDSS.Mouse
;CALL INITDVC ;R05
;R05
LD C,Dss.DRV.Init
RST ToDSS.DRV
LD (LDRIVE),A
;R05
.saveDRV+1:
;[x] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
LD HL,0 ; H - ­®¬¥à ãáâனá⢠, L - ­®¬¥à à §¤¥«  ­  ãáâனá⢥
;LD A,H
;LD A,0
;
;LD B,1
CALL BOOTDSK.SET
RET C
;
EI
;Set new address fn. VERSION
LD HL,DSS_API_TABLE
LD (HL),low VERSION ;R03
INC H
LD (HL),high VERSION ;R03
JP CLEAR_BUFFER_AND_INIT_PROC
;
;R12
.err_oldBIOS:
IN A,(SLOT0)
OUT (SLOT3),A
LD HL,.err_oldBIOS_message + SLOT3.MEM_ADDR
;LD C,Dss.PChars
;RST ToDSS
CALL PCHARS
SCF
RET
.err_oldBIOS_message:
DB "\r\nWARNING! This version of DSS requires BIOS v"
DB STR_MINIMUM_BIOS_VERSION
DZ " or later to boot from IDE."
;
DEPLOY: ;Allocate memory
LD BC,USING_MEMPAGES*256 + BIOS.GetMem
RST ToBIOS
RET C ;R10
LD C,A
IN A,(SLOT3)
PUSH AF
IN A,(SLOT0)
LD (DRV_CONTENT + DRV_PAGE.MAIN_PAGE_NUMBER),A ;!TEST
OUT (SLOT3),A
LD A,C
LD HL,BANKTBL + #C000
LD C,BIOS.GetMemBlkPages
RST ToBIOS
; ¤®«¦­  ¨¤â¨ ¯®á«¥ GetMemBlkPages, ç⮡ ¢¬¥áâ®
; § ªà뢠誨 #FF ¯®áâ ¢¨âì áâà ­¨æã COREPAGE
LD HL,BANKTBL + COREPAGE
IN A,(SLOT0)
LD (HL),A
; ¤«ï API ¤à ©¢¥à  ¬ë誨
LD (MOUSE_HANDLER.CorePage),A
LD A,(BANKTBL + DRVPAGE)
LD (RST_0x30.drv_page),A
POP AF
OUT (SLOT3),A
SET_PAGE_X DRVPAGE
PUSH AF
LD HL,DRV_CONTENT
LD DE,#C000
LD BC,DRV_CONTENT.SIZE
LDIR
IN A,(SLOT3)
LD (DRV_PG_NUMBER),A
POP AF
OUT (SLOT3),A
AND A ;R10
RET
IF ENVVALUE != CORE_BUFFERS.BUFFER
ASSERT "Warning! ENVVALUE != BUFFER"
//BLOCK 1000,0
ENDIF
;--- --- --- --- [Build version] --- --- --- ---;
; C_OSTYPE
;--- --- --- --- --- --- --- --- --- --- --- ---;
DISPLAY "FAT MODULE SIZE: ",/A,FAT_MODULE_SIZE
DISPLAY "DEPLOY end address: ",/H,$
;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||;
DISPLAY "Space for DRV-MAIN: ",/A,#4000-$," bytes."
DRV_CONTENT:
DISP 0
INCLUDE 'DRV-MAIN.ASM'
ENT
DRV_CONTENT.SIZE EQU $-DRV_CONTENT
BIN_END_ADDRESS EQU $
DISPLAY "END ADDRESS: ",/H,BIN_END_ADDRESS
DISPLAY "Memory leacks when > ",/H, #4000+SUBLOAD_SIZE*512
ASSERT $ < (#4001+SUBLOAD_SIZE*512),'-> Memory leack!!!';
ASSERT DRV_CONTENT.SIZE < #4001,'-> Drivers code size > #4000!!!';
;[END]
;
; DTA DB " "
; DB " "
; DB #20
; DW 0,0,0,0,0
; DW 0
; DW 0
; CLUSTER DW 0
; SIZE DW 0,0
; ASCIIZ DB "FILENAME.EXT",#00
;R06
;R06 BUFFER
;R06 SECTOR_BUFFER DB ". ",#10
;R06 DW 0,0,0,0,0
;R06 DW #0000
;R06 DW #0000
;R06 DW #0000
;R06 DW #0000,0000
;R06 DB ".. ",#10
;R06 DW 0,0,0,0,0
;R06 DW #0000
;R06 DW #0000
;R06 DW #0000
;R06 DW #0000,0000
;R06 DS 512-64 ;,0

View File

@ -1,20 +1,142 @@
; ;
MACRO _mSavePath ; MACRO BUFFER_KEYINTER
; PUSH HL ; _mInfoALIGN 256,0
; LD HL,BACK_CUR_PATH ; ;KEYBOARD BUFFER
; EX (SP),HL ; SBUF: BLOCK 64,0
; CALL SAVE_CUR_PATH
ENDM
; HEAD DB #00
; HOST DB #00
; K_LOCK EQU $-KEYFLAG
; LANG_L EQU 7
; PAUSE_L EQU 6
; RES5_L EQU 5
; RES4_L EQU 4
; NUM_L EQU 3
; SCRL_L EQU 2
; INS_L EQU 1
; CAPS_L EQU 0
; KEYFLAG DB #02 ;D0-Key Pressed
; K_SHIFT EQU $-KEYFLAG
; L_SHIFT EQU 7
; R_SHIFT EQU 6
; X_CTRL EQU 5
; X_ALT EQU 4
; L_CTRL EQU 3
; L_ALT EQU 2
; R_CTRL EQU 1
; R_ALT EQU 0
; KEYCTRL DB #00
; KEYFLG EQU $-KEYFLAG
; FLAG_E0 EQU 7
; FLAG_F0 EQU 6
; FLAG_E1 EQU 5
; FLAG_04 EQU 4
; FLAG_03 EQU 3
; FLAG_02 EQU 2
; FLAG_01 EQU 1
; FLAG_00 EQU 0
; DB #00
; SOUND_K EQU $-KEYFLAG
; FLAG_S7 EQU 7
; FLAG_S6 EQU 6
; FLAG_S5 EQU 5
; FLAG_S4 EQU 4
; FLAG_S3 EQU 3
; FLAG_S2 EQU 2
; SF_ALT EQU 1
; SF_BUFF EQU 0
; DB #03
; ;
; ; D15 - LShift
; ; D14 - RShift
; ; D13 - CTRL
; ; D12 - ALT
; ; D11 - LCTRL
; ; D10 - LALT
; ; D9 - RCTRL
; ; D8 - RALT
; ; D7 - Language Lock
; ; D6 - Reserved
; ; D5 - Reserved
; ; D4 - Reserved
; ; D3 - Num Lock
; ; D2 - Scroll Lock
; ; D1 - Insert Lock
; ; D0 - Caps Lock
; ;
; ; D15 - Keystroke
; ; D14
; ; D13 \
; ; D12 \
; ; D11 -- Position code (0...5Ah)
; ; D10 /
; ; D9 /
; ; D8
; ; D7..D0 - ASCII code
; ;
; ENDM
; ;
; ;
MACRO _mRestorePath ; MACRO TABLE_XLAT_T
; CALL BACK_CUR_PATH ; _mInfoALIGN 256,0
; ; 0 1 2 3 4 5 6 7 8 9 A B C D E F
; XLAT_T: DB #00,#43,#00,#3F,#3D,#3B,#3C,#46,#00,#44,#42,#40,#3E,#0F,#00,#00 ;00
; DB #00,#37,#29,#00,#36,#10,#02,#00,#00,#00,#2A,#1E,#1D,#11,#03,#00 ;10
; DB #00,#2C,#2B,#1F,#12,#05,#04,#00,#00,#38,#2D,#20,#14,#13,#06,#00 ;20
; DB #00,#2F,#2E,#22,#21,#15,#07,#00,#00,#00,#30,#23,#16,#08,#09,#00 ;30
; DB #00,#31,#24,#17,#18,#0B,#0A,#00,#00,#32,#33,#25,#26,#19,#0C,#00 ;40
; DB #00,#00,#27,#00,#1A,#0D,#00,#00,#1C,#34,#28,#1B,#00,#35,#00,#00 ;50
; DB #00,#00,#00,#00,#00,#00,#0E,#00,#00,#51,#00,#54,#57,#00,#00,#00 ;60
; DB #50,#4F,#52,#55,#56,#58,#01,#49,#45,#4D,#53,#4C,#4B,#59,#48,#00 ;70
; DB #00,#00,#00,#41,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 ;80
; ENDM
;
;
; ‚•Ž„: L - «®£¨ç¥áª¨© ­®¬¥à ¢ â ¡«¨æ¥
; ‚›•Ž„: IY - ­ ç «® § ¯¨á¨
; <20>Ž<EFBFBD>ˆ: HL, DE, IY.
MACRO LOGDRV_ENTRY_FIND tbl_addr
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
EX DE,HL
LD IY,tbl_addr
ADD IY,DE
ENDM ENDM
; ;
; ;
MACRO _mRestorStackAfterRestorePath MACRO _CALC_DEVICE_ENTRY tbl_addr
; POP HL ;CLEAR STACK "BACK_CUR_PATH" CP DSS_MAX_DRIVES_AMOUNT+1
JR C,.norm
; Error!
LD A,DSS_MAX_DRIVES_AMOUNT
.norm: LD C,A
ADD A,A
ADD A,C
LD C,A
LD B,0
LD HL,tbl_addr
ADD HL,BC
ENDM
;
;
MACRO SET_PAGE_X new_page
LD A,(BANKTBL+new_page)
LD B,A
LD C,SLOT3
IN A,(SLOT3)
OUT (C),B
ENDM ENDM
; ;
@ -69,4 +191,30 @@
MACRO C_OSRELEASE MACRO C_OSRELEASE
DB "Estex DSS",0 DB "Estex DSS",0
ENDM ENDM
;
////////////////////////////////////////////////////////////////////////
;
; MACRO _mSavePath force
; IF SAVE_PATH_MACRO
; PUSH HL
; IF force==1
; LD HL,BACK_CUR_PATH.force
; ELSE
; LD HL,BACK_CUR_PATH
; ENDIF
; EX (SP),HL
; CALL SAVE_CUR_PATH
; ENDIF
; ENDM
; MACRO _mRestorePath
; IF SAVE_PATH_MACRO
; CALL BACK_CUR_PATH.force
; ENDIF
; ENDM
; MACRO _mRestorStackAfterRestorePath
; IF SAVE_PATH_MACRO
; POP HL ;CLEAR STACK "BACK_CUR_PATH"
; ENDIF
; ENDM
; ;

View File

@ -1,241 +0,0 @@
;[BEGIN]
;//MODULE: ENVIRON
;//CREATE: 10-11-2002 AUTHOR: Denis Parinov
;---------------------------------------------------------------
;Rev Date Name Description
;---------------------------------------------------------------
;R01 19-11-2002 DNS CORRECT DE ADDRESS IN GETENV
;---------------------------------------------------------------
; LD HL,MYVAR
; CALL SETENV
; LD HL,MYVAR2
; LD DE,MYBUF
; CALL GETENV
ENVIRON:
INC B
JR Z,INITENV ;B=FF
DEC B
JR Z,READENV ;B=0
DEC B
JP Z,GETENV ;B=1
DEC B
JP Z,SETENV ;B=2
LD A,DSS_Error.sys.INVALID_FUNCTION
SCF
RET
INITENV LD A,ENVPAGE
CALL BANK
PUSH AF
LD DE,ENVIRONMENT
XOR A
LD (DE),A
INC DE
LD HL,DEFAULT_ENV
LD BC,DEF_ENV_SIZE
LDIR
LD (DE),A
EX DE,HL
LD DE,ENVIRONMENT
AND A
SBC HL,DE
LD (ENVSIZE),HL
POP AF
OUT (SLOT3),A
AND A
RET
READENV:
PUSH HL
LD A,ENVPAGE
CALL BANK
LD H,A
LD C,SLOT3
IN L,(C)
EXX
LD HL,ENVIRONMENT
INC HL
POP DE
LD BC,(ENVSIZE)
EXX
;
.loop: OUT (C),L
EXX
LD A,(HL)
EXX
OUT (C),H
EXX
LD (DE),A
INC HL
INC DE
DEC BC
LD A,B
OR C
EXX
JR NZ,.loop
XOR A
RET
GETENV
PUSH DE
CALL ENV_EX
LD A,ENVPAGE
CALL BANK
EX AF,AF'
CALL F_ENV
POP DE
LD A,0
LD (DE),A
JR NC,GE_1
GE_0 LD A,(HL)
LDI
OR A
JR NZ,GE_0
DEC DE ;R01
LD A,#FF
GE_1 EX AF,AF'
OUT (SLOT3),A
EX AF,AF'
AND A
RET
SETENV: CALL ENV_EX
;
LD A,ENVPAGE
CALL BANK
PUSH AF
;
CALL F_ENV
JR NC,PENV
XOR A
CPIR
LD A,B
OR C
JR Z,PENV
LDIR
; DEC DE
PENV LD A,(ENVVALUE)
OR A
JR Z,CLR_ENV
LD HL,ENVNAME
F_EVN2 LD A,(HL)
LDI
CP "="
JR NZ,F_EVN2
LD HL,ENVVALUE
F_EVN3 LD A,(HL)
LDI
OR A
JR NZ,F_EVN3
CLR_ENV XOR A
LD (DE),A
LD HL,ENVIRONMENT
EX DE,HL
SBC HL,DE
LD (ENVSIZE),HL
;
POP AF
OUT (SLOT3),A
AND A
RET
; RET:
; DE - VAR VALUE
; HL - VAR ADDRESS
; BC - ENVIRONMENT SIZE
F_ENV LD HL,ENVIRONMENT
LD BC,(ENVSIZE)
PUSH HL
F_EVN0 POP DE
LD DE,ENVNAME
XOR A
CPIR
PUSH HL
F_EVN1 LD A,(HL)
OR A
JR Z,END_OF_ENV
LD A,(DE)
CP (HL)
INC HL
INC DE
DEC BC
JR NZ,F_EVN0
CP "="
JR NZ,F_EVN1
SCF
END_OF_ENV
POP DE
RET
ENV_EX LD B,32
LD DE,ENVNAME
ENV_E0 XOR A
LD (DE),A
LD (ENVVALUE),A
ENV_E1 LD A,(HL)
INC HL
CP "="
JR Z,EQUAL_SG
OR A
JR Z,ENV_E3
CALL UPPER
LD (DE),A
INC DE
DJNZ ENV_E1
SCF
RET
ENV_E3 LD A,"="
LD (DE),A
INC DE
XOR A
LD (DE),A
INC DE
RET
EQUAL_SG:
LD (DE),A
INC DE
XOR A
LD (DE),A
LD DE,ENVVALUE
LD (DE),A
LD C,#FF
ENV_E2 LD A,(HL)
LDI
OR A
RET Z
DJNZ ENV_E2
SCF
RET
ENVNAME EQU EXEBUFF ;DS 32
ENVVALUE EQU BUFFER //#3800 ; BUFFER ;DS 128
ENVSIZE DW 1 ;E_END-ENVIRONMENT ;160
ENVIRONMENT EQU ENVADDR
DEFAULT_ENV
; DB "SYSTEM=C:\\system.exe",0
; DB "PATH=\\SYSTEM\\;\\COMMAND\\;",0
DB 0 ; "",0
DEF_ENV_SIZE EQU $-DEFAULT_ENV
; DB 0
; DB "SYSTEM=C:\system.exe",0
; DB "PATH=C:\;\FN\;",0
; DB "OS=ESTEX",0
; DB "VAR1=000",0
; DB "OSNAME=ESTEX 2002",0
; DB 0
;E_END
;[END]

File diff suppressed because it is too large Load Diff

View File

@ -1,473 +0,0 @@
;[BEGIN]
;//MODULE: FAT_X
;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
;//UPDATE: 24-10-1999 DNS Restore module
;---------------------------------------------------------------
;Rev Date Name Description
;---------------------------------------------------------------
;R01 10-02-1999 DNS UPGRADE FAT CASH
;---------------------------------------------------------------
R_CLUST LD HL,#0001
LD (G_CLUST.num),HL
RET
G_CLUST:
.num+1: LD HL,#0001
G_CLUS1: INC HL
CALL R_F_FAT
CP 10
SCF
RET Z
LD A,D
OR E
JR NZ,G_CLUS1
LD (G_CLUST.num),HL
XOR A
RET
; HL - CLUSTER
INC_FAT PUSH HL
CALL G_CLUST
POP DE
RET C
PUSH HL
PUSH HL
EX DE,HL
INC_FA2 CALL R_F_FAT
EX DE,HL
JR NC,INC_FA2
EX DE,HL
POP DE
CALL W_T_FAT
POP HL
LD DE,(FatBuffer.ENDCLUS)
CALL W_T_FAT
CALL WR_FAT
AND A
RET
;R01
; HL - CLUSTER
; DE - (CLUSTER)
R_F_FAT EX DE,HL
LD HL,(MAX_CLU)
AND A
SBC HL,DE
EX DE,HL
LD A,10
RET C
EXX
LD A,FATPAGE
CALL BANK
EXX
PUSH HL
PUSH AF
LD A,(FatBuffer.FAT_TYP)
CP "2"
JP Z,R_F_F12
R_F_F16 LD A,H
LD B,A
AND #0F
LD H,A
LD A,B
RRCA
RRCA
RRCA
RRCA
AND #0F ; A - BLOCK FAT (1 BLOCK = 8192 BYTES)
ADD HL,HL ; HL - FAT OFFSET (FROM CASH)
LD BC,(FATCASH) ; C - BLOCK FAT IN CASH
CP C
CALL NZ,RE_FAT ; A <> C - READ NEW BLOCK FAT
LD DE,FAT
ADD HL,DE
LD E,(HL)
INC HL
LD D,(HL)
POP AF
OUT (SLOT3),A
LD HL,#FFEF
XOR A ;DssErr.sys.NO_ERROR
SBC HL,DE
POP HL
;LD A,DssErr.sys.NO_ERROR
RET
;R01; HL - CLUSTER
;R01; DE - (CLUSTER)
;R01
;R01R_F_FAT EX DE,HL
;R01 LD HL,(MAX_CLU)
;R01 AND A
;R01 SBC HL,DE
;R01 EX DE,HL
;R01 LD A,10
;R01 RET C
;R01 PUSH HL
;R01 LD A,(FAT_TYP)
;R01 CP "2"
;R01 JP Z,R_F_F12
;R01R_F_F16 LD DE,768 ; DE - CLUSTERS IN CASH
;R01 XOR A
;R01R_F_00H INC A ; HL - CLUSTER
;R01 SBC HL,DE
;R01 JP NC,R_F_00H
;R01 ADD HL,DE
;R01 ADD HL,HL ; HL - FAT OFFSET (FROM CASH)
;R01 DEC A
;R01 LD BC,(FATCASH) ; A - ELEMENT OF CASH
;R01 CP C
;R01 CALL NZ,RE_FAT
;R01 LD DE,FAT
;R01 ADD HL,DE
;R01 LD E,(HL)
;R01 INC HL
;R01 LD D,(HL)
;R01 LD HL,#FFEF
;R01 AND A
;R01 SBC HL,DE
;R01 POP HL
;R01 LD A,0
;R01 RET
;R01
;R01R_F_F12 LD D,H
;R01 LD E,L
;R01 ADD HL,HL
;R01 ADD HL,DE
;R01 RR H
;R01 RR L
;R01 PUSH AF
;R01 EX DE,HL
;R01 LD HL,(B_P_S)
;R01 LD B,H
;R01 LD C,L
;R01 ADD HL,HL
;R01 ADD HL,BC
;R01 EX DE,HL
;R01 XOR A ; DE - SIZE SECTOR * 3
;R01R_F_00 INC A ; HL - FAT OFFSET
;R01 SBC HL,DE
;R01 JP NC,R_F_00
;R01 ADD HL,DE
;R01 DEC A
R_F_F12 LD D,H
LD E,L
ADD HL,HL
ADD HL,DE
RR H
RR L ;CLUSTER * 1.5
PUSH AF
LD A,H
LD B,A
AND #1F
LD H,A
LD A,B
RLCA
RLCA
RLCA
AND #07
LD BC,(FATCASH)
CP C
CALL NZ,RE_FAT
LD DE,FAT
ADD HL,DE
POP AF
LD E,(HL)
INC HL
LD D,(HL)
JR C,R_F_F01
LD A,D
AND #0F
LD D,A
JR R_F_F02
R_F_F01 LD A,E
AND #F0
LD E,A
RR D
RR E
RR D
RR E
RR D
RR E
RR D
RR E
R_F_F02 POP AF
OUT (SLOT3),A
LD HL,#0FEF
XOR A ; ®¡­ã«ï¥¬ CF ¨ ãáâ ­ ¢«¨¢ ¥¬ ª®¤ ®è¨¡ª¨ = ­ã«î
SBC HL,DE
POP HL
RET
; HL - CLUSTER
; DE - (CLUSTER)
W_T_FAT PUSH DE
EX DE,HL
LD HL,(MAX_CLU)
AND A
SBC HL,DE
EX DE,HL
POP DE
LD A,10
RET C
EXX
LD A,FATPAGE
CALL BANK
EXX
PUSH HL
PUSH AF
LD A,1
LD (FATCASH+1),A
LD A,(FatBuffer.FAT_TYP)
CP "2"
JP Z,W_T_F12
W_T_F16 PUSH DE
LD A,H
LD B,A
AND #0F
LD H,A
LD A,B
RRCA
RRCA
RRCA
RRCA
AND #0F ; A - BLOCK FAT (1 BLOCK = 8192 BYTES)
ADD HL,HL ; HL - FAT OFFSET (FROM CASH)
LD BC,(FATCASH) ; C - BLOCK FAT IN CASH
CP C
CALL NZ,RE_FAT ; A <> C - READ NEW BLOCK FAT
LD DE,FAT
ADD HL,DE
POP DE
LD (HL),E
INC HL
LD (HL),D
POP AF
POP HL
OUT (SLOT3),A
XOR A
RET
W_T_F12 PUSH DE
LD D,H
LD E,L
ADD HL,HL
ADD HL,DE
RR H
RR L ;CLUSTER * 1.5
PUSH AF
LD A,H
LD B,A
AND #1F
LD H,A
LD A,B
RLCA
RLCA
RLCA
AND #07
LD BC,(FATCASH)
CP C
CALL NZ,RE_FAT
LD DE,FAT
ADD HL,DE
POP AF
POP DE
JP C,W_T_F01
LD (HL),E
INC HL
LD A,(HL)
AND #F0
OR D
LD (HL),A
POP AF
POP HL
OUT (SLOT3),A
AND A
RET
W_T_F01 SLA E
RL D
RL E
RL D
RL E
RL D
RL E
RL D
LD A,(HL)
AND #0F
OR E
LD (HL),A
INC HL
LD (HL),D
POP AF
POP HL
OUT (SLOT3),A
AND A
RET
;R01
; A - NEW FAT BLOCK
RE_FAT PUSH HL
PUSH AF
LD A,(FATCASH+1)
OR A
CALL NZ,WR_FAT_
POP AF
LD L,A
LD H,0
LD (FATCASH),HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL ;FAT BLOCK * 16 = SECTOR OF FAT
LD DE,(FatBuffer.FAT_FRM)
ADD HL,DE
EX DE,HL
LD IX,0
ADD IX,DE
LD HL,0 ;HL:IX - SECTOR FAT FOR READING
LD DE,FAT ; DE - FAT ADDRESS
LD A,(FatBuffer.DRIVE)
; LD B,16
; LD C,5
LD BC,16*256 + 5 ;ॣ B: 16 * 512 = 8192 (CASH SIZE)
RST #18
POP HL
RET
WR_FAT EXX
LD A,FATPAGE
CALL BANK
EXX
PUSH AF
CALL WR_FAT_
POP AF
OUT (SLOT3),A
RET
WR_FAT_ LD HL,(FATCASH)
LD H,0
LD (FATCASH),HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL ;FAT BLOCK * 16 = SECTOR OF FAT
PUSH HL
LD B,H
LD C,L ;BC - BLOCK OF FAT
LD DE,16
ADD HL,DE ;+ SIZE CASH (16 SECTORS)
LD DE,(BootSector.S_P_F)
LD A,16
AND A
SBC HL,DE
JR C,WALLFAT
EX DE,HL
LD HL,16
; AND A ;âãâ â®ç­® CF ­¥ ¢§¢¥¤ñ­
SBC HL,DE
JP C,FATERR
LD A,L
WALLFAT LD H,B
LD L,C
LD DE,(FatBuffer.FAT_FRM)
ADD HL,DE
EX DE,HL
LD IX,0
ADD IX,DE
LD HL,0 ;HL:IX - SECTOR OF FAT FOR SAVE
LD DE,FAT
LD B,A
LD C,6
LD A,(FatBuffer.DRIVE)
PUSH BC
RST #18
POP BC
POP HL
LD DE,(FatBuffer.FAT2_XX)
ADD HL,DE
EX DE,HL
LD IX,0
ADD IX,DE
LD DE,FAT
LD HL,0
LD A,(FatBuffer.DRIVE)
LD C,6
RST #18
RET
;R01
;R01WR_FAT LD HL,(FATCASH)
;R01 LD H,0
;R01 LD (FATCASH),HL
;R01 LD E,L
;R01 LD D,H
;R01 ADD HL,HL
;R01 ADD HL,DE
;R01 PUSH HL
;R01 LD B,H
;R01 LD C,L
;R01 INC HL
;R01 INC HL
;R01 INC HL
;R01 LD DE,(S_P_F)
;R01 LD A,3
;R01 AND A
;R01 SBC HL,DE
;R01 JP C,WR_FAT1
;R01 EX DE,HL
;R01 LD HL,3
;R01 AND A
;R01 SBC HL,DE
;R01 JP C,FATERR
;R01 LD A,L
;R01WR_FAT1 LD H,B
;R01 LD L,C
;R01 LD DE,(FAT_FRM)
;R01 ADD HL,DE
;R01 EX DE,HL
;R01 LD IX,0
;R01 ADD IX,DE
;R01 LD DE,FAT
;R01 LD HL,0
;R01 LD B,A
;R01 LD C,6
;R01 LD A,(DRIVE)
;R01 PUSH BC
;R01 RST #18
;R01 POP BC
;R01 POP HL
;R01 LD DE,(FAT2_XX)
;R01 ADD HL,DE
;R01 EX DE,HL
;R01 LD IX,0
;R01 ADD IX,DE
;R01 LD DE,FAT
;R01 LD HL,0
;R01 LD A,(DRIVE)
;R01 LD C,6
;R01 RST #18
;R01 RET
FATERR: POP HL
; SCF
RET
FATCASH DW #0000
MAX_CLU DW #0FF0
;//MODULE: FAT_X
;[END]

View File

@ -1,366 +0,0 @@
; Disk Driver Specification ver. 2.00
;[]===========================================================[]
;Procedure : Initialization
;
;Function : Initialization device(s)
;
;Input : C = 00h
; IX - Environment
;Output : A = Amount drive support
; HL = Size driver
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Open
;
;Function : Open disk
;
;Input : C = 01h
; A - Drive
;Output : None
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Close
;
;Function : Close disk
;
;Input : C = 02h
; A - Drive
;Output : None
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Media check
;
;Function : Checking change line
;
;Input : C = 03h
; A - Drive
;Output : A = 00h disk no changed
; A = 0FFh disk changed
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Get BPB
;
;Function : Get Block Parameters BIOS
;
;Input : C = 04h
; DE - Address
;Output : None
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Input
;
;Function : Input from disk
;
;Input : C = 05h
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
;Output : None
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Output
;
;Function : Output to disk
;
;Input : C = 06h
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
;Output : None
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Removable
;
;Function : Checking change line
;
;Input : C = 07h
; A - Drive
;Output : A = 00h Removable
; A = FFh Nonremovable
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Generic IOCTL
;
;Function : Generic Input Output Control
;
;Input : C = 08h
; B - Subcommand
; DE = 55AAh Magic Number
; Subcommand
;----------------------
; 00h - Get Device Parameters
; 01h - Read track
; 02h - Test track
; 80h - Set Device Parameters
; 81h - Write track
; 82h - Format track
;Output :
;
;[]===========================================================[]
;
; Errors:
; 0 (00h) - NO ERRORS
; 1 (01h) - BAD COMMAND
; 2 (02h) - BAD DRIVE NUMBER
; 3 (03h) - UNKNOW FORMAT
; 4 (04h) - NOT READY
; 5 (05h) - SEEK ERROR
; 6 (06h) - SECTOR NOT FOUND
; 7 (07h) - CRC ERROR
; 8 (08h) - WRITE PROTECT
; 9 (09h) - READ ERROR
; 10 (0Ah) - WRITE ERROR
; 11 (0Bh) - FAILURE
; 12 (0Ch) - BUSY (DEVICE OPENED)
; 13 (0Dh) - RESERVED
R_COM EQU #0F ;Command/Status
R_TRK EQU #3F ;Track
R_SEC EQU #5F ;Sector
R_DAT EQU #7F ;Data
R_DSK EQU #FF ;Drive Control
COM_B EQU #1B
FDDRIVE:
INC C
DEC C
JP Z,.INIT ;#00
DEC C
JP Z,.RESE ;#01
DEC C
JP Z,.STAT ;#02
DEC C
JP Z,.CHEK ;#03
DEC C
JP Z,.GBPB ;#04
DEC C
JP Z,.READD ;#05
DEC C
JP Z,.WRITED ;#06
DEC C
JP Z,.REMOV_F ;#07
DEC C
JP Z,.IOCTL_F ;#08
DEC C
JP Z,.RESRV_F ;#09
.RESRV_F:
LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
;Commands for restart #18
.INIT: LD A,2 ;ª®«¨ç¥á⢮ FDD ¢ ª®¬¯¥ ;!FIXIT   ¥á«¨ ®âª«îçã ¢ <20>ˆŽ?
AND A
RET
.RESE: LD C,#51
RST ToBIOS
RET
.STAT: XOR A
RET
;!FIXIT ¯à®¢¥àïâì ƒ93 ª®£¤  íâ® áâ ­¥â ¢®§¬®¦­ë¬
.CHEK: LD A,#FF
AND A
RET
;DE - ADDRESS
.GBPB: LD IX,0
LD HL,0
PUSH DE
PUSH AF
LD BC,#0155
RST ToBIOS
POP DE
POP HL
RET C
LD BC,#0018
ADD HL,BC
LD E,(HL)
PUSH DE
LD A,D
LD C,#58
RST ToBIOS
LD A,H
POP HL
PUSH HL
LD H,A
POP AF
LD C,#59
RST ToBIOS
XOR A
RET
;READTR:
XOR A
RET
.READD: LD C,#55
RST ToBIOS
RET
.WRITED:
LD C,#56
RST ToBIOS
RET
; 00 - GET DEVICE PARAMETERS
; 01 - READ TRACK
; 02 - TEST TRACK
; 80 - SET DEVICE PARAMETERS
; 81 - WRITE TRACK
; 82 - FORMAT TRACK
.IOCTL_F:
BIT 7,B
JR NZ,.O_CTL_F
INC B
DEC B
JP Z,.FGETPRM
; DEC B
; JP Z,FRDTRAC
; DEC B
; JP Z,FCHTRAC
LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
.O_CTL_F:
RES 7,B
INC B
DEC B
JP Z,.FSETPRM
; DEC B
; JP Z,FWRTRAC
; DEC B
; JP Z,FFRTRAC
LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
; HL:DE - SECTORS ON LOGICAL DISK
; HL' - CYLINDERS ON PHISICAL DISK
; DE' - HEADS ON PHISICAL DISK
; BC' - SECTORS PER TRACK ON PHISICAL DISK
; A' - PHISICAL DRIVE NUMBER
; A - EXTENDED INFORMATION
; D0...D3 - "0" RESERVED (MAY BE OTHER)
; D4 - DEVICE MASTER/SLAVE
; D5 - "1" RESERVED
; D6 - ADDRESSING MODE LBA/CHS
; D7 - "1" RESERVED
.FGETPRM:
EX DE,HL
LD BC,#55AA
AND A
SBC HL,BC
LD L,A
LD A,DSS_Error.drv.GENERAL_FAILURE
SCF
RET NZ
LD A,L
AND #0F
PUSH AF
LD C,#58
RST ToBIOS
JR C,.NONEF
PUSH HL
PUSH DE
LD A,H
LD H,0
.MULL1 ADD HL,HL
DEC A
JR NZ,.MULL1
; HL - SECTOR PER CYLLINDER
LD B,H
LD C,L
LD HL,0
EX AF,AF'
XOR A
.MULL2 EX AF,AF'
ADD HL,BC
ADC A,0
DEC DE
EX AF,AF'
LD A,D
OR E
JR NZ,.MULL2
EX AF,AF'
LD E,A
EX DE,HL
EXX
POP DE
POP HL
POP AF
EX AF,AF'
LD A,B
LD C,L
LD B,0
LD L,H
LD H,B
EX DE,HL
EXX
AND A
RET
.NONEF POP AF
LD A,DSS_Error.drv.INVALID_DRIVE
SCF
RET
; HL:DE - SECTORS ON LOGICAL DISK
; HL' - CYLINDERS ON PHISICAL DISK
; DE' - HEADS ON PHISICAL DISK
; BC' - SECTORS PER TRACK ON PHISICAL DISK
; A' - EXTENDED INFORMATION
; D0...D3 - "0" RESERVED (MAY BE OTHER)
; D4 - DEVICE MASTER/SLAVE
; D5 - "1" RESERVED
; D6 - ADDRESSING MODE LBA/CHS
; D7 - "1" RESERVED
.FSETPRM:
PUSH AF
EXX
EX DE,HL
LD H,L
LD L,C
POP AF
AND #0F
PUSH AF
PUSH HL
PUSH DE
LD C,#58
RST ToBIOS
POP DE
POP HL
JR C,.NONEF
POP AF
LD C,#59
RST ToBIOS
RET C
AND A
RET
.REMOV_F:
LD A,1
AND A
RET
;==============================================

13
DSS/FS/CDFS.ASM Normal file
View File

@ -0,0 +1,13 @@
; INITDISK - ¨­¨æ¨ «¨§ æ¨ï ¡ãª¢ë ¤¨áª  - ¯¥à¥­¥á⨠ªã᮪ ¢ RD_BPB
; LOADDIR - § £à㧪  á CDFS ¤¨à¥ªâ®à¨¨ ¨  ¤ ¯â æ¨ï ¯®¤ FAT
;
/*
¤¥« âì ¯à®¢¥àªã ­  ä â:
CHECK_ROOT_CLUSTER
-= RST ToDSS.FS =-
RD_BPB - shared_fs.asm - ¡à âì ᨣ­ âãàã #AA55 ¨«¨ ¨§ CDFS.RD_BPB ¨ ¤ «¥¥ 㦥 RST_FS
LOADDIR
*/

2780
DSS/FS/FAT.asm Normal file

File diff suppressed because it is too large Load Diff

8
DSS/FS_Module.asm Normal file
View File

@ -0,0 +1,8 @@
INCLUDE "FS/FAT.ASM"
INCLUDE "FS/CDFS.ASM"
/*
READ_BPB ; <20>à®ç¨â âì BPB ¢ SECTOR_BUFFER
*/

View File

@ -1,706 +0,0 @@
;---------------------------------------------------------------
;Rev Date Name Description
;---------------------------------------------------------------
;R02 06-08-2001 DNS Secondary IDE
;R01 06-08-2001 DNS Fixed BUG with partitions on Second hard disk
;---------------------------------------------------------------
;
; Disk Driver Specification ver. 2.20
;[]===========================================================[]
;Procedure : Initialization
;
;Function : Initialization device(s)
;
;Input : C = 00h
; IX - Environment
;Output : A = Amount drive support
; HL = Size driver
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Open
;
;Function : Open disk
;
;Input : C = 01h
; A - Drive
;Output : None
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Close
;
;Function : Close disk
;
;Input : C = 02h
; A - Drive
;Output : None
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Media check
;
;Function : Checking change line
;
;Input : C = 03h
; A - Drive
;Output : A = 00h disk no changed
; A = 0FFh disk changed
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Get BPB
;
;Function : Get Block Parameters BIOS
;
;Input : C = 04h
; DE - Address
;Output : None
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Input
;
;Function : Input from disk
;
;Input : C = 05h
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
;Output : None
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Output
;
;Function : Output to disk
;
;Input : C = 06h
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
;Output : None
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Removable
;
;Function : Checking change line
;
;Input : C = 07h
; A - Drive
;Output : A = 00h Removable
; A = FFh Nonremovable
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Generic IOCTL
;
;Function : Generic Input Output Control
;
;Input : C = 08h
; B - Subcommand
; DE = 55AAh Magic Number
; Subcommand
;----------------------
; 00h - Get Device Parameters
; 01h - Read track
; 02h - Test track
; 80h - Set Device Parameters
; 81h - Write track
; 82h - Format track
;Output :
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Read Long
;
;Function : Reading sectors from disk
;
;Input : C = 0Ah
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
; A'- Page
;Output : A'- Next Page
; HL:IX - Next Logical Block (sector)
; DE - Next Address
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Write Long
;
;Function : Writing sectors to disk
;
;Input : C = 0Bh
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
; A'- Page
;Output : A'- Next Page
; HL:IX - Next Logical Block (sector)
; DE - Next Address
;
;[]===========================================================[]
;
; Errors:
; 0 (00h) - NO ERRORS
; 1 (01h) - BAD COMMAND
; 2 (02h) - BAD DRIVE NUMBER
; 3 (03h) - UNKNOW FORMAT
; 4 (04h) - NOT READY
; 5 (05h) - SEEK ERROR
; 6 (06h) - SECTOR NOT FOUND
; 7 (07h) - CRC ERROR
; 8 (08h) - WRITE PROTECT
; 9 (09h) - READ ERROR
; 10 (0Ah) - WRITE ERROR
; 11 (0Bh) - FAILURE
; 12 (0Ch) - BUSY (DEVICE OPENED)
; 13 (0Dh) - RESERVED
LD_DSK EQU 16
IDE0 EQU #0C1C0
IDE1 EQU #0C1C8
PART EQU #C000
HDDRIVE INC C
DEC C
JP Z,INIT_H ;#00
DEC C
JP Z,RESE_H ;#01
DEC C
JP Z,STAT_H ;#02
DEC C
JP Z,CHEK_H ;#03
DEC C
JP Z,GBPB_H ;#04
DEC C
JP Z,READH ;#05
DEC C
JP Z,WRITEH ;#06
DEC C
JP Z,REMOV_H ;#07
DEC C
JP Z,IOCTL_H ;#08
DEC C
JP Z,RESR_H ;#09
DEC C
JP Z,LREADH ;#0A
DEC C
JP Z,LWRITEH ;#0B
RESR_H LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
;Commands for restart #18
INIT_H PUSH IY
LD HL,LOGDRV
LD (OFFSECT),HL
LD IX,DEVICE_CFG
LD C,#5F
RST ToBIOS
XOR A
LD B,(IX+2) ;HDD
CP B
JR Z,NO_HARDS
LD C,#80
NX_DVCI PUSH BC
LD A,C
LD (DRV),A
CALL PARTIT
POP BC
INC C
DJNZ NX_DVCI
;R02
;R02 LD A,#80
;R02 LD (DRV),A
;R02 LD C,SLOT3
;R02 IN B,(C)
;R02 LD A,SYSPAGE
;R02 OUT (C),A
;R02 LD HL,IDE0
;R02 CALL YEP_DRV
;R02 OUT (C),B
;R02 CALL NZ,PARTIT
;R02
;R02 LD A,#81
;R02 LD (DRV),A
;R02 LD C,SLOT3
;R02 IN B,(C)
;R02 LD A,SYSPAGE
;R02 OUT (C),A
;R02 LD HL,IDE1
;R02 CALL YEP_DRV
;R02 OUT (C),B
;R02 CALL NZ,PARTIT
NO_HARDS
POP IY
LD HL,(OFFSECT)
LD DE,LOGDRV
XOR A
SBC HL,DE
RET Z
LD DE,LD_DSK
DRVCLC INC A
SBC HL,DE
JR NZ,DRVCLC
AND A
RET
DEVICE_CFG EQU #4000
; DB 0 ;LEN
; DB 0 ;FDD COUNT
; DB 0 ;HDD COUNT
; DB 0 ;CDROM COUNT
; DS 28 ;RESERVED
YEP_DRV LD A,#FF
; CP (HL)
; RET NZ
INC HL
CP (HL)
RET NZ
INC HL
CP (HL)
RET NZ
INC HL
CP (HL)
RET NZ
INC HL
CP (HL)
RET NZ
INC HL
CP (HL)
RET
;+00 ;SECTORS PER TRACK
;+01 ;TRACKS PER CYLLINDER
;+02 ;RESERVED
;+03 ;HDD/DRIVE/LBA
;+04 ;SECTOR PER CYLINDER LOW
;+05 ;SECTOR PER CYLINDER HIGH
;+06 ;RESERVED
;+07 ;RESERVED
DRVHD_H EQU 0
SC_PT_H EQU 1
HEADS_H EQU 2
CYL_L_H EQU 3
CYL_H_H EQU 4
SPCLL_H EQU 5
SPCLH_H EQU 6
;IDE0 DB #FF ;DRIVE/HEAD REGISTER ;00
; DB #FF ;SECTORS PER TRACK ;01
; DB #FF ;HEADS ;02
; DB #FF ;CYLINDERS LOW ;03
; DB #FF ;CYLINDERS HIGH ;04
; DB #FF ;SECTOR PER CYLINDER LOW ;05
; DB #FF ;SECTOR PER CYLINDER HIGH ;06
; DB #FF ;RESERVED ;07
;IDE1 DB #FF ;DRIVE/HEAD REGISTER ;00
; DB #FF ;SECTORS PER TRACK ;01
; DB #FF ;HEADS ;02
; DB #FF ;CYLINDERS LOW ;03
; DB #FF ;CYLINDERS HIGH ;04
; DB #FF ;SECTOR PER CYLINDER LOW ;05
; DB #FF ;SECTOR PER CYLINDER HIGH ;06
; DB #FF ;RESERVED ;07
LOGDRV DS 12*LD_DSK
;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
;+01 LONG SECTOR OFFSET
;+05 LONG SIZE IN SECTORS
;+09 FREE
;+15
SELHDD PUSH DE
PUSH BC
PUSH HL
LD L,A
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
EX DE,HL
LD IY,LOGDRV
ADD IY,DE
LD C,(IY+1)
LD B,(IY+2)
LD E,(IY+3)
LD D,(IY+4)
POP HL
ADD IX,BC
ADC HL,DE
LD A,(IY+0) ;DRIVE NUMBER
POP BC
POP DE
RET
; 00 - GET DEVICE PARAMETERS
; 01 - READ TRACK
; 02 - TEST TRACK
; 80 - SET DEVICE PARAMETERS
; 81 - WRITE TRACK
; 82 - FORMAT TRACK
IOCTL_H BIT 7,B
JR NZ,O_CTL_H
INC B
DEC B
JP Z,HGETPRM
DEC B
JP Z,HRDTRAC
DEC B
JP Z,HCHTRAC
LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
O_CTL_H RES 7,B
INC B
DEC B
JP Z,HSETPRM
DEC B
JP Z,HWRTRAC
DEC B
JP Z,HFRTRAC
LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
HRDTRAC LD A,DSS_Error.drv.GENERAL_FAILURE
SCF
RET
HCHTRAC LD B,L
CALL CHECKH
RET
HSETPRM AND A
RET
HWRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE
SCF
RET
HFRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE
SCF
RET
; HL:DE - SECTORS ON LOGICAL DISK
; HL' - CYLINDERS ON PHISICAL DISK
; DE' - HEADS ON PHISICAL DISK
; BC' - SECTORS PER TRACK ON PHISICAL DISK
; A' - PHISICAL DRIVE NUMBER
; A - DRIVE/HEAD REGISTER PHISICAL DISK
; D0...D3 - "0" RESERVED (MAY BE OTHER)
; D4 - DEVICE MASTER/SLAVE
; D5 - "1" RESERVED
; D6 - ADDRESSING MODE LBA/CHS
; D7 - "1" RESERVED
HGETPRM EX DE,HL
LD BC,#55AA
AND A
SBC HL,BC
LD L,A
LD A,DSS_Error.drv.GENERAL_FAILURE
SCF
RET NZ
PUSH IY
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD B,H
LD C,L
LD IY,LOGDRV ;!FIXIT ­ å७  âãâ ¨­¤¥ªá­ë©?
ADD IY,BC
LD E,(IY+5)
LD D,(IY+6)
LD L,(IY+7)
LD H,(IY+8)
LD A,(IY+0)
LD C,A
LD IY,IDE0 ;!FIXIT IDE CHANELS âã⠢ᥣ® 2 ª ­ «  à ¡®â îâ
AND #0F
JR Z,GELH1
LD IY,IDE1
GELH1 IN A,(SLOT3)
PUSH AF
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(IY+DRVHD_H) ;HDD/DRV
EXX
LD L,(IY+CYL_L_H) ;CYLINDER LOW
LD H,(IY+CYL_H_H) ;CYLINDER HIGH
LD E,(IY+HEADS_H) ;HEADS
LD D,0
LD C,(IY+SC_PT_H) ;SECTORS
LD B,0
EXX
EX AF,AF'
POP AF
OUT (SLOT3),A
LD A,C
EX AF,AF'
POP IY
AND A
RET
REMOV_H LD A,1
AND A
RET
RESE_H XOR A
RET
STAT_H XOR A
RET
CHEK_H LD A,#FF
AND A
RET
;HL:IX - SECTOR
; DE - ADDRESS
GBPB_H PUSH IY
PUSH DE
LD L,A
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD B,H
LD C,L
LD IY,LOGDRV
ADD IY,BC
LD E,(IY+1)
LD D,(IY+2)
LD L,(IY+3)
LD H,(IY+4)
LD XL,E
LD XH,D
LD A,(IY+0)
POP DE
POP IY
LD BC,#0155
RST ToBIOS
RET
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
; A'- PAGE
;READ SECTOR
LREADH PUSH IY
CALL SELHDD
LD C,#52 ; A - HDD NUMBER +128
RST ToBIOS
POP IY
RET
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
; A'- PAGE
;WRITE SECTOR
LWRITEH PUSH IY
CALL SELHDD
LD C,#53 ; A - HDD NUMBER +128
RST ToBIOS
POP IY
RET
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
;WRITE SECTOR
WRITEH PUSH IY
CALL SELHDD
LD C,#56 ; A - HDD NUMBER +128
RST ToBIOS
POP IY
RET
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
;READ SECTOR
READH PUSH IY
CALL SELHDD
LD C,#55 ; A - HDD NUMBER +128
RST ToBIOS
POP IY
RET
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
;CHECK SECTOR
CHECKH PUSH IY
CALL SELHDD
LD C,#54 ; A - HDD NUMBER +128
RST ToBIOS
POP IY
RET
;-----------------
EASYDOS
MEDIDOS
HIGHDOS LD E,(IY+08)
LD D,(IY+09)
LD L,(IY+10)
LD H,(IY+11)
LD IX,(CURSECL)
ADD IX,DE
LD DE,(CURSECH)
ADC HL,DE
LD D,XH
LD E,XL
LD IX,(OFFSECT)
LD (IX+1),E ;BPB SECTOR
LD (IX+2),D
LD (IX+3),L
LD (IX+4),H
; LD DE,(CURSECL)
; LD HL,(CURSECH)
; LD (IX+1),E ;START DISK
; LD (IX+2),D
; LD (IX+3),L
; LD (IX+4),H
LD E,(IY+12)
LD D,(IY+13)
LD L,(IY+14)
LD H,(IY+15)
LD (IX+5),E ;SIZE DISK
LD (IX+6),D
LD (IX+7),L
LD (IX+8),H
LD A,(DRV)
LD (IX+0),A
LD DE,LD_DSK ; DSKITEM
ADD IX,DE
LD (OFFSECT),IX
NXTPART LD DE,#10
ADD IY,DE
POP BC
DJNZ DOSAGA
AND A
RET
PARTIT IN A,(SLOT3)
PUSH AF
LD A,#FF
OUT (SLOT3),A
CALL PARTIT1
POP AF
OUT (SLOT3),A
RET
PARTIT1 LD IX,0
LD DE,0
LD (EXTDOSL),DE ;R01
LD (EXTDOSH),IX ;R01
PARTIT2 LD (CURSECL),DE
LD (CURSECH),IX
CALL LOADSEC
LD HL,(PART+510)
LD DE,#AA55
AND A
SBC HL,DE
JR NZ,NODEFIN
LD IY,PART+#01BE
LD B,4
DOSAGA PUSH BC
LD A,(IY+4)
CP 5
JR NZ,NOEXTDS
SUBLEV PUSH IY
LD DE,(CURSECL)
LD IX,(CURSECH)
PUSH DE
PUSH IX
CALL EXTDOS
POP IX
POP DE
LD (CURSECL),DE
LD (CURSECH),IX
CALL LOADSEC
POP IY
JP NXTPART
NOEXTDS CP #0F
JP Z,SUBLEV
CP #0E
JP Z,HIGHDOS
CP 6
JP Z,HIGHDOS
CP 4
JP Z,MEDIDOS
CP 1
JP Z,EASYDOS
POP BC
OR A
RET Z
NODEFIN SCF
RET
EXTDOS
LD HL,(EXTDOSL)
LD DE,(EXTDOSH)
LD A,L
OR H
OR E
OR D
LD E,(IY+08)
LD D,(IY+09)
LD L,(IY+10)
LD H,(IY+11)
JP NZ,EXTDOS2
LD (EXTDOSL),DE
LD (EXTDOSH),HL
LD IX,(EXTDOSH)
JP PARTIT2
EXTDOS2 LD IX,(EXTDOSL)
ADD IX,DE
PUSH IX
LD DE,(EXTDOSH)
ADC HL,DE
PUSH HL
POP IX
POP DE
JP PARTIT2
LOADSEC PUSH IY
LD IX,(CURSECL)
LD HL,(CURSECH)
LD DE,PART
LD BC,#0155
LD A,(DRV)
RST ToBIOS
POP IY
RET
DRV DB #00 ;PHISICAL DRIVE NUMBER
CURSECL DW #0000 ;CURRENT SECTOR LOADED
CURSECH DW #0000
EXTDOSL DW #0000 ;CURRENT PARTITION TABLE
EXTDOSH DW #0000
OFFSECT DW LOGDRV ;POINTER ON CURRENT DISK RECORD
;=======================================================

View File

@ -1,920 +0,0 @@
;[BEGIN]
;//MODULE: INTMOUSE
;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
;//UPDATE: 24-10-1999 DNS Restore module
CMOUSE EQU #1B ; !FIXIT ­  sp2000.inc
DMOUSE EQU #1A ; !FIXIT ­  sp2000.inc
; MOUSE SOFTWARE SPECIFICATION
;---------------------------------------------
; COMMAND 00h (INITIALIZATION)
;
; RETURN: NC - MOUSE PRESENT
; C - MOUSE ABSENT
;---------------------------------------------
; COMMAND 01h (SHOW MOUSE CURSOR)
;
; RETURN: NC - DONE
; C - MOUSE ON SCREEN
;---------------------------------------------
; COMMAND 02h (HIDE MOUSE CURSOR)
;
; RETURN: NC - DONE
; C - NONE MOUSE
;---------------------------------------------
; COMMAND 03h (READ MOUSE STATE)
;
; RETURN: HL - X COORD
; DE - Y COORD
; A - BUTTONS D2-D0 (MIDDLE,RIGHT,LEFT)
;---------------------------------------------
; COMMAND 04h (GOTO MOUSE CURSOR)
;
; INPUT: HL - X COORD
; DE - Y COORD
;---------------------------------------------
; COMMAND 05h (RESERVED)
;---------------------------------------------
; COMMAND 06h (RESERVED)
;---------------------------------------------
; COMMAND 07h (SET VERT. BOUNDS)
;
; INPUT: HL - Y MIN
; DE - Y MAX
;---------------------------------------------
; COMMAND 08h (SET HORZ. BOUNDS)
;
; INPUT: HL - X MIN
; DE - X MAX
;---------------------------------------------
; COMMAND 09h (LOAD CURSOR)
;
; INPUT: IX - CURSOR IMAGE
; H - HEIGHT CURSOR
; L - WIDTH CURSOR
; D - Y HOT SPOT
; E - X HOT SPOT
; B = 0
;---------------------------------------------
; COMMAND 0Ah (SET CURSOR IN TEXT MODES)
;
; INPUT: H - AND SIMBOL MASK
; L - XOR SIMBOL MASK
; D - AND ATTRIBUT MASK
; E - XOR ATTRIBUT MASK
; B = 0
;---------------------------------------------
; COMMAND 0Bh (RETURN CURSOR)
;
; INPUT: IX - CURSOR IMAGE BUFFER
; OUTPUT: H - HEIGHT CURSOR
; L - WIDTH CURSOR
; D - Y HOT SPOT
; E - X HOT SPOT
;---------------------------------------------
; COMMAND 0Ch (RESERVED)
;---------------------------------------------
; COMMAND 0Dh (RESERVED)
;---------------------------------------------
; COMMAND 0Eh (GET SENSETIVE)
; OUTPUT: H - VERTICAL SENSETIVE
; L - HORIZONTAL SENSETIVE
;---------------------------------------------
; COMMAND 0Fh (SET SENSETIVE)
; INPUT: H - VERTICAL SENSETIVE
; L - HORIZONTAL SENSETIVE
;---------------------------------------------
; COMMAND 80h (MOUSE HARDWARE INTERRUPT)
;---------------------------------------------
; COMMAND 81h (CHANGE VIDEO MODE)
; INPUT: A - MODE
;---------------------------------------------
; COMMAND 82h (RESERVED)
;---------------------------------------------
; COMMAND 83h (MOUSE REFRESH)
;---------------------------------------------
; ERRORS: 0 - NO ERROR
; 1 - COMMAND NOT PRESENT
; 2 - DEVICE ABSENT
; 3 - CURSOR ON (UZHE)
; 4 - CURSOR OFF (UZHE)
; 5 - CURSOR IMAGE VERY BIG
INTMOUS BIT 7,C
JP NZ,EMOUSE
INC C
DEC C
JP Z,MS_INIT
DEC C
JP Z,MS_SHOW
DEC C
JP Z,MS_HIDD
DEC C
JP Z,MS_READ
DEC C
JP Z,MS_GOTO
DEC C
JP Z,MS_RESR
DEC C
JP Z,MS_RESR
DEC C
JP Z,MS_VERT
DEC C
JP Z,MS_HORZ
DEC C
JP Z,MS_CURS
DEC C
JP Z,MS_MASK
DEC C
JP Z,MS_BCUR
DEC C
JP Z,MS_RESR
DEC C
JP Z,MS_RESR
DEC C
JP Z,MS_GSEN
DEC C
JP Z,MS_SENT
MS_RESR LD A,DSS_Error.mouse.INVALID_COMMAND
SCF
RET
EMOUSE RES 7,C
INC C
DEC C
JP Z,M_INT
DEC C
JP Z,M_MODE
DEC C
JR Z,M_RESR
DEC C
JP Z,M_REFR
M_RESR LD A,DSS_Error.mouse.INVALID_COMMAND
SCF
RET
MS_INIT DI
LD A,85
OUT (#10),A
LD A,45
OUT (#10),A
XOR A ;LD A,0
OUT (CMOUSE),A
INC A ;LD A,1
OUT (CMOUSE),A
DEC A ;LD A,0
OUT (CMOUSE),A
LD A,3
OUT (CMOUSE),A
LD A,#41
OUT (CMOUSE),A
LD A,4
OUT (CMOUSE),A
LD A,#47
OUT (CMOUSE),A
LD A,5
OUT (CMOUSE),A
LD A,#E0
OUT (CMOUSE),A
EI
XOR A
RET
MS_SHOW PUSH IX
PUSH HL
PUSH DE
EX AF,AF'
PUSH AF
LD HL,(PIX_X)
LD DE,(PIX_Y)
DI
CALL MOUSE
XOR A
LD (REFRESH+1),A
EI
POP AF
EX AF,AF'
POP DE
POP HL
POP IX
XOR A
RET
MS_HIDD PUSH IX
PUSH HL
PUSH DE
EX AF,AF'
PUSH AF
DI
LD A,1
LD (REFRESH+1),A
CALL RESTORE
EI
POP AF
EX AF,AF'
POP DE
POP HL
POP IX
XOR A
RET
MS_READ LD HL,(PIX_X)
LD DE,(PIX_Y)
LD A,(MB)
AND A
RET
MS_GOTO PUSH IX
PUSH HL
PUSH DE
LD (PIX_X),HL
LD (PIX_Y),DE
EX AF,AF'
PUSH AF
DI
CALL REFRESH
EI
POP AF
EX AF,AF'
POP DE
POP HL
POP IX
XOR A
RET
MS_CURS PUSH BC
PUSH DE
PUSH HL
PUSH IX
LD A,L
LD (M_XSIZE),A
LD A,H
LD (M_YSIZE),A
LD C,E
LD B,0
LD (XHOT_SP),BC
LD C,D
LD B,0
LD (YHOT_SP),BC
EXX
LD A,(M_XSIZE)
LD C,A
LD B,0
LD A,(M_YSIZE)
LD HL,0
MSCURS1 ADD HL,BC
DEC A
JR NZ,MSCURS1
PUSH HL
LD BC,M_IMAGE.Size+1
AND A
SBC HL,BC
CCF
EXX
POP BC
POP HL
LD A,5
JR C,NOLOADM
LD DE,M_IMAGE
DI
LDIR
XOR A
NOLOADM POP HL
POP DE
POP BC
EI
RET
MS_BCUR PUSH IX
EXX
LD A,(M_XSIZE)
LD C,A
LD B,0
LD A,(M_YSIZE)
LD HL,0
MSBCUR1 ADD HL,BC
DEC A
JR NZ,MSBCUR1
PUSH HL
LD BC,M_IMAGE.Size+1
AND A
SBC HL,BC
CCF
EXX
POP BC
POP HL
LD A,5
JR C,NOSAVEM
LD DE,M_IMAGE
EX DE,HL
DI
LDIR
LD A,(M_XSIZE)
LD L,A
LD A,(M_YSIZE)
LD H,A
LD BC,(XHOT_SP)
LD E,C
LD BC,(YHOT_SP)
LD D,C
LD BC,0
XOR A
NOSAVEM EI
RET
MS_HORZ
LD (MIN_X),HL
LD (MAX_X),DE
XOR A
RET
MS_VERT
LD (MIN_Y),HL
LD (MAX_Y),DE
XOR A
RET
MS_MASK
LD (ANDXORS),HL
LD (ANDXORA),DE
XOR A
RET
; H - VERTICAL SENSETIVE
; L - HORIZONTAL SENSETIVE
MS_SENT
LD (SENSEXY),HL
XOR A
RET
MS_GSEN
LD HL,(SENSEXY)
XOR A
RET
MOUSET LD (REST_XT+1),HL
LD (REST_YT+1),DE
;Y
SRL D
RR E
SRL D
RR E
SRL D
RR E
LD D,E
;X
SRL H
RR L
SRL H
RR L
SRL H
RR L
LD E,L
IN A,(PORT_Y)
LD XH,A
IN A,(SLOT1)
LD XL,A
;
DI
;
LD A,#54
OUT (SLOT1),A
;
LD A,D
ADD A,A
ADD A,A ;Y * 4
LD L,A
LD H,#43 ;+ #4300
;
IN A,(RGMOD)
RRCA
AND #80
OR #01
ADD A,E
OUT (PORT_Y),A
INC L
LD A,(HL) ;SIMBOL
LD BC,(ANDXORS)
AND B
XOR C
LD (HL),A
INC L
LD A,(HL) ;ATTRIBUT
LD BC,(ANDXORA)
AND B
XOR C
LD (HL),A
;
LD A,XL
OUT (SLOT1),A
LD A,XH
OUT (PORT_Y),A
RET
RESTORT
REST_XT LD HL,#0000
REST_YT LD DE,#0000
;Y
SRL D
RR E
SRL D
RR E
SRL D
RR E
LD D,E
;X
SRL H
RR L
SRL H
RR L
SRL H
RR L
LD E,L
IN A,(PORT_Y)
LD XH,A
IN A,(SLOT1)
LD XL,A
;
DI
;
LD A,#50
OUT (SLOT1),A
;
LD A,D
ADD A,A
ADD A,A ;Y * 4
LD L,A
LD H,#43 ;+ #4300
;
IN A,(RGMOD)
RRCA
AND #80
OR #01
ADD A,E
OUT (PORT_Y),A
INC L
LD A,(HL) ;SIMBOL
LD (HL),A
INC L
LD A,(HL) ;ATTRIBUT
LD (HL),A
;
LD A,XL
OUT (SLOT1),A
LD A,XH
OUT (PORT_Y),A
RET
RESTORE:
.sw+1: LD A,#00
BIT 7,A
JP Z,RESTORT
RESTORG IN A,(SLOT3)
LD B,A
IN A,(PORT_Y)
LD C,A
PUSH BC
LD A,#50
OUT (SLOT3),A
REST_X LD HL,0
REST_Y LD DE,0
LD A,E
EX AF,AF'
REST_V LD A,#00
AND 1
LD DE,#C000 ;screen 0
JR Z,AA2
LD DE,#C000+320 ;screen 1
AA2 ADD HL,DE
REST_A LD A,0
LD XH,A
EX AF,AF'
REST_H
RS002 LD BC,10
OUT (PORT_Y),A
EX AF,AF'
LD (PUSH_HL),HL
LD D,H
LD E,L
LDIR
PUSH_HL+1: LD HL,#0000
; POP HL
EX AF,AF'
INC A
JR Z,RS003
DEC XH
JR NZ,RS002
RS003 POP BC
LD A,B
OUT (SLOT3),A
LD A,C
OUT (PORT_Y),A
XOR A
RET
;HL/DE - X/Y
MOUSE LD A,(MODE_M)
LD (RESTORE.sw),A
BIT 7,A
JP Z,MOUSET
MOUSEG CP #82 ;640x256x16
JR NZ,NOFX
SRL H
RR L
NOFX LD IX,M_IMAGE
LD A,(M_XSIZE)
LD C,A
LD B,0
LD (REALXS),BC
LD (REST_H+1),BC
LD C,B
LD (SKIPXF),BC
LD A,(M_YSIZE)
LD (REST_A+1),A
LD C,A
LD B,0
LD (REALYS),BC
LD BC,(YHOT_SP)
LD A,E
SUB C
LD E,A
JR NC,GOODY
NEG
LD E,A
LD A,(M_XSIZE)
LD C,A
LD B,0
LD A,(M_YSIZE)
SUB E
SKIPMY ADD IX,BC
DEC E
JR NZ,SKIPMY
LD C,A
LD (REALYS),BC
GOODY LD BC,(XHOT_SP)
AND A
SBC HL,BC
JR NC,GOODX
LD B,H
LD C,L
LD HL,0
AND A
SBC HL,BC
LD (SKIPXF),HL
LD A,(M_XSIZE)
SUB L
LD L,A
LD (REALXS),HL
LD HL,0
GOODX LD (REST_X+1),HL
LD (REST_Y+1),DE
PUSH HL
IN A,(SLOT3)
LD H,A
IN A,(PORT_Y)
LD L,A
EX (SP),HL
LD A,#5C
OUT (SLOT3),A
LD A,E
EX AF,AF'
IN A,(RGMOD)
LD (REST_V+1),A
AND 1
LD DE,#C000 ;PAGE 0
JR Z,AA1
LD DE,#C000+320 ;PAGE 1
AA1 ADD HL,DE
LD D,XH
LD E,XL
EX DE,HL ;HL - BITMAP
LD BC,(REALYS)
LD XH,C
EX AF,AF'
MS002 LD BC,(SKIPXF)
ADD HL,BC
LD BC,(REALXS)
OUT (PORT_Y),A
EX AF,AF'
;USH DE
LD (PUSH_DE+1),DE
LDIR
PUSH_DE LD DE,#0000
; POP DE
EX AF,AF'
INC A
JR Z,MS003
DEC XH
JR NZ,MS002
MS003 POP BC
LD A,B
OUT (SLOT3),A
LD A,C
OUT (PORT_Y),A
XOR A
RET
READ_M IN A,(CMOUSE)
RRCA
RET NC
IN A,(DMOUSE)
LD L,A
BIT 6,A
CCF
RET Z
TST_01 IN A,(CMOUSE)
RRCA
JP NC,TST_01
IN A,(DMOUSE)
LD E,A
BIT 6,A
CCF
RET NZ
TST_02 IN A,(CMOUSE)
RRCA
JR NC,TST_02
IN A,(DMOUSE)
LD D,A
BIT 6,A
CCF
RET NZ
LD A,E
AND #3F
LD E,A
LD A,L
AND #03
RRCA
RRCA
OR E
LD E,A
LD A,D
AND #3F
LD D,A
LD A,L
AND #0C
RRCA
RRCA
RRCA
RRCA
OR D
LD D,A
LD A,L
RLCA
RLCA
RLCA
RES 6,A
JR NC,STBU
SET 6,A
STBU RLCA
RLCA
AND #03
LD (MB),A
CALL SENSE
LD A,E
LD (MX),A
LD A,D
LD (MY),A
SCF
RET
MCORECT LD HL,(PIX_X)
LD DE,(MX)
LD D,0
BIT 7,E
JR NZ,DECX
ADD HL,DE
LD (PIX_X),HL
EX DE,HL
LD HL,(MAX_X)
AND A
SBC HL,DE
JP NC,YCOO
LD HL,(MAX_X)
LD (PIX_X),HL
JP YCOO
DECX LD A,E
NEG
LD E,A
AND A
SBC HL,DE
LD (PIX_X),HL
JR C,YCOO2
LD DE,(MIN_X)
SBC HL,DE
JR NC,YCOO
YCOO2 LD HL,(MIN_X)
LD (PIX_X),HL
YCOO LD HL,(PIX_Y)
LD DE,(MY)
LD D,0
BIT 7,E
JR NZ,DECY
ADD HL,DE
LD (PIX_Y),HL
EX DE,HL
LD HL,(MAX_Y)
AND A
SBC HL,DE
RET NC
LD HL,(MAX_Y)
LD (PIX_Y),HL
RET
DECY LD A,E
NEG
LD E,A
AND A
SBC HL,DE
LD (PIX_Y),HL
JR C,XCOO
LD DE,(MIN_Y)
SBC HL,DE
RET NC
XCOO LD HL,(MIN_Y)
LD (PIX_Y),HL
RET
SENSE LD HL,(SENSEXY)
LD A,L
OR L
RET Z
DEC A
RET Z
LD A,E
BIT 7,A
LD B,#FF
JR Z,SEN1
LD B,#7F
NEG
SEN1 INC B
SUB L
JR NC,SEN1
BIT 7,B
JR Z,SEN2
LD A,B
RES 7,A
NEG
LD B,A
SEN2 LD E,B
LD A,D
BIT 7,A
LD B,#FF
JR Z,SEN3
LD B,#7F
NEG
SEN3 INC B
SUB H
JR NC,SEN3
BIT 7,B
JR Z,SEN4
LD A,B
RES 7,A
NEG
LD B,A
SEN4 LD D,B
RET
M_MODE LD (MODE_M),A
OR A
JR Z,UNKMODE
CP 1
JR Z,UNKMODE
CP 2
JR Z,S320256
CP 3
JR Z,S640256
BIT 7,A
JR Z,UNKMODE
RES 7,A
CP 1
JR Z,S320256
CP 2
JR Z,S640256
UNKMODE XOR A ; ????? ¬®¦¥â âãâ ­ ¤® .INVALID_COMMAND ?
SCF
RET
S320256
LD HL,0 ;MIN X
LD DE,319 ;MAX X
CALL MS_HORZ
LD HL,0 ;MIN X
LD DE,255 ;MAX X
CALL MS_VERT
XOR A
RET
S640256
LD HL,0 ;MIN X
LD DE,639 ;MAX X
CALL MS_HORZ
LD HL,0 ;MIN X
LD DE,255 ;MAX X
CALL MS_VERT
XOR A
RET
;Mouse Interrupt
M_INT IN A,(SLOT3)
LD B,A
IN A,(PORT_Y)
LD C,A
PUSH BC
CALL REFRESH ;Refresh mouse
CALL CONTROL
POP BC
LD A,B
OUT (SLOT3),A
LD A,C
OUT (PORT_Y),A
RET
M_REFR CALL CONTROL
AND A
RET
CONTROL CALL READ_M
RET NC
CALL MCORECT
LD A,#00
LD (REDY+1),A
RET
REFRESH LD A,#01
OR A
RET NZ
REDY LD A,#00
; OR A
; RET NZ
CALL RESTORE
LD HL,(PIX_X)
LD DE,(PIX_Y)
CALL MOUSE
LD A,#FF
LD (REDY+1),A
RET
MODE_M DB #03
PIX_X DW 160
PIX_Y DW 128
MX DB #00
MY DB #00
MB DB #00
MB_OLD DB #00 ; !FIXIT - ­¥ ­ã¦­®?
MIN_X DW 0
MAX_X DW 319
MIN_Y DW 0
MAX_Y DW 255
SENSEXY
SENSE_X DB 0
SENSE_Y DB 0
XHOT_SP DW 0
YHOT_SP DW 0
ANDXORS DW #FF00
ANDXORA DW #FF77
M_XSIZE DB 10
M_YSIZE DB 14
SKIPXF DW 0
REALXS DW 0
REALYS DW 0
Xx EQU #00
Ww EQU #FE
Nn EQU #FF
;MS_BMP
M_IMAGE:
DB Xx,Xx,Nn,Nn,Nn,Nn,Nn,Nn,Nn,Nn
DB Xx,Ww,Xx,Nn,Nn,Nn,Nn,Nn,Nn,Nn
DB Xx,Ww,Ww,Xx,Nn,Nn,Nn,Nn,Nn,Nn
DB Xx,Ww,Ww,Ww,Xx,Nn,Nn,Nn,Nn,Nn
DB Xx,Ww,Ww,Ww,Ww,Xx,Nn,Nn,Nn,Nn
DB Xx,Ww,Ww,Ww,Ww,Ww,Xx,Nn,Nn,Nn
DB Xx,Ww,Ww,Ww,Ww,Ww,Ww,Xx,Nn,Nn
DB Xx,Ww,Ww,Ww,Ww,Xx,Xx,Xx,Xx,Nn
DB Xx,Ww,Ww,Xx,Ww,Xx,Nn,Nn,Nn,Nn
DB Xx,Ww,Xx,Xx,Ww,Ww,Xx,Nn,Nn,Nn
DB Xx,Xx,Nn,Nn,Xx,Ww,Xx,Nn,Nn,Nn
DB Xx,Nn,Nn,Nn,Xx,Ww,Ww,Xx,Nn,Nn
DB Nn,Nn,Nn,Nn,Nn,Xx,Xx,Nn,Nn,Nn
DB Nn,Nn,Nn,Nn,Nn,Nn,Nn,Nn,Nn,Nn
BLOCK 256-($-M_IMAGE),0
.Size EQU $-M_IMAGE
;//MODULE: INTMOUSE
;[END]

File diff suppressed because it is too large Load Diff

View File

@ -1,12 +1,13 @@
+ function WINCOPY & WINREST не запрещают прерывания перед вызовом BIOS (используется вывод стеком!). FIXED:
+ function WINCOPY & WINREST ­¥ § ¯à¥é îâ ¯à¥à뢠­¨ï ¯¥à¥¤ ¢ë§®¢®¬ BIOS (¨á¯®«ì§ã¥âáï ¢ë¢®¤ á⥪®¬!).
- при выводе на консоль длинного текста, экран не скролируется. Проверять на достижение 80 позиции! + ¯à¨ ¢ë¢®¤¥ ­  ª®­á®«ì ¤«¨­­®£® ⥪áâ , íªà ­ ­¥ áªà®«¨àã¥âáï. <20>஢¥àïâì ­  ¤®á⨦¥­¨¥ 80 ¯®§¨æ¨¨!
+ ошибка в функции SCROLL A=0. ? ®è¨¡ª  ¢ ä㭪樨 SCROLL A=0.
+ ошибка при просмотре каталога в функциях установки атрибутов пропускаются системные файлы. п/п SEARCH MASK=#23 + ®è¨¡ª  ¯à¨ ¯à®á¬®âॠª â «®£  ¢ äã­ªæ¨ïå ãáâ ­®¢ª¨  âਡã⮢ ¯à®¯ã᪠îâáï á¨á⥬­ë¥ ä ©«ë. ¯/¯ SEARCH MASK=#23
- игнорирование ошибок при записи системных областей FAT/DIR, невозможность отработать ошибку write-protect, так как она теряется при попытке записать измененный каталог на диск. Но возникает ошибка file not found так как сразо после создания система открывает файл. - ¨£­®à¨à®¢ ­¨¥ ®è¨¡®ª ¯à¨ § ¯¨á¨ á¨á⥬­ëå ®¡« á⥩ FAT/DIR, ­¥¢®§¬®¦­®áâì ®âà ¡®â âì ®è¨¡ªã write-protect, â ª ª ª ®­  â¥àï¥âáï ¯à¨ ¯®¯ë⪥ § ¯¨á âì ¨§¬¥­¥­­ë© ª â «®£ ­  ¤¨áª. <20>® ¢®§­¨ª ¥â ®è¨¡ª  file not found â ª ª ª áà §ã ¯®á«¥ á®§¤ ­¨ï á¨á⥬  ®âªà뢠¥â ä ©«.
- ошибка разбора допустимого имени файла, если оно состоит из "." так как подрузомевается пробелы точка пробелы. - ®è¨¡ª  à §¡®à  ¤®¯ãá⨬®£® ¨¬¥­¨ ä ©« , ¥á«¨ ®­® á®á⮨⠨§ "." â ª ª ª ¯®¤à §ã¬¥¢ ¥âáï ¯à®¡¥«ë â®çª  ¯à®¡¥«ë.

426
DSS/Procedures.asm Normal file
View File

@ -0,0 +1,426 @@
;!TODO Procedures
;----------------------------------------------------------------------;
; ‡ ª®¤¨à®¢ âì ¢à¥¬ï/¤ âã
; ¢å®¤: de - ¤¥­ì/¬¥áïæ
; hl - ç áë/¬¨­ãâë
; b - ᥪ㭤ë
; ix - £®¤
; ¢ë室: de - ¢à¥¬ï
; bc - ¬¥áïæ/¤¥­ì
; ix - £®¤
;
;INPUT: D - DAY; E - MONTH
; H - HOUR; L - MINUTE
; B - SECOND (0...59)
; IX- YEAR (0...65535)
;OUTPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2
; BC - yyyyyyymmmmddddd y - year, m - month, d - day
; (1980-2108)
MK_TIME:
LD A,L
RLCA
RLCA
SLA A
RL H
SLA A
RL H
SLA A
RL H
SRL B
OR B
LD L,A
LD BC,#F844 ;(-1980)
ADD IX,BC
LD A,E
RLCA
RLCA
RLCA
RLCA
AND #F0
LD B,XL
SLA A
RL B
OR D
LD C,A
EX DE,HL
AND A
RET
;----------------------------------------------------------------------;
;!TODO Procedures
;----------------------------------------------------------------------;
; <20> áª®¤¨à®¢ âì ¢à¥¬ï/¤ âã
; ¢å®¤: de - ¢à¥¬ï
; bc - ¬¥áïæ/¤¥­ì
; ix - £®¤
; ¢ë室: de - ¤¥­ì/¬¥áïæ
; hl - ç áë/¬¨­ãâë
; b - ᥪ㭤ë
; ix - £®¤
;
;INPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2
; BC - yyyyyyymmmmddddd y - year, m - month, d - day
; (1980-2108)
;OUTPUT: D - DAY; E - MONTH
; H - HOUR; L - MINUTE
; B - SECOND (0...59)
; IX- YEAR (0...65535)
RMKTIME:
EX DE,HL
LD A,C
AND #1F
LD D,A
SRL B
RR C
LD A,C
RRCA
RRCA
RRCA
RRCA
AND #0F
LD E,A
LD C,B
LD B,0
LD IX,1980
ADD IX,BC
LD A,L
AND #1F
ADD A,A
LD B,A
SRL H
RR L
SRL H
RR L
SRL H
RR L
SRL L
SRL L
AND A
RET
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
; [x] 25/01/2024
; ¢å®¤: D - ¤¥­ì
; E - ¬¥áïæ
; IX - £®¤
; ¢ë室: H - ¤¥­ì ­¥¤¥«¨ (1 - ¢®áªà¥á¥­ì¥)
CalcDayOfWeek: LD A,D
LD (.day),A
; x = (14 ? ¬¥áïæ) / 12
; y = £®¤ ? x
LD A,E
CP 3
LD A,0
JR NC,1F
DEC IX
LD A,12
1: ; y = IX
; m = ¬¥áïæ + 12 * x ? 2
ADD E
SUB 2
; m = A
; HL = (31 * m)
LD D,0
LD E,A
RLA
RLA
RLA
LD H,D
LD L,A
ADD HL,HL
ADD HL,HL
SBC HL,DE
; (31 * m) = HL
; BC = (31 * m) / 12
LD B,H
LD C,L
; D=0
LD E,12
CALL BC_Div_DE
; (31 * m) / 12 = BC
LD (.m31_12),BC
; y / 4
PUSH IX
POP BC
; D=0
LD E,4
CALL BC_Div_DE
; y / 4 = BC
PUSH BC
; y / 100
PUSH IX
POP BC
; D=0
LD E,100
CALL BC_Div_DE
; y / 100 = BC
PUSH BC
; y / 400
PUSH IX
POP BC
LD DE,400
CALL BC_Div_DE
; y / 400 = BC
; y/400 - y/100
AND A
LD H,B
LD L,C
POP DE
SBC HL,DE
; y/400 - y/100 = HL
; y/4 ? y/100 + y/400
POP DE
ADD HL,DE
; y/4 ? y/100 + y/400 + (31 * m)/12
.m31_12+1: LD DE,0
ADD HL,DE
; y + y/4 ? y/100 + y/400 + (31 * m)/12
EX DE,HL
ADD IX,DE
; ¤¥­ì + y + y/4 ? y/100 + y/400 + (31 * m)/12
LD D,0
.day+1: LD E,0
ADD IX,DE
; 7000 + (¤¥­ì + y + y/4 ? y/100 + y/400 + (31 * m)/12)
LD DE,7000
ADD IX,DE
; (7000 + (¤¥­ì + y + y/4 ? y/100 + y/400 + (31 * m)/12)) mod 7
LD B,XH
LD C,XL
LD DE,7
CALL BC_Div_DE
; „¥­ì<C2AD>¥¤¥«¨ = L
LD H,L
INC H
RET
; x = (14 ? ¬¥áïæ) / 12
; y = £®¤ ? x
; m = ¬¥áïæ + 12 * x ? 2
; „¥­ì<C2AD>¥¤¥«¨ = (7000 + (¤¥­ì + y + y/4 ? y/100 + y/400 + (31 * m)/12)) mod 7
; ‚ᥠ¤¥«¥­¨ï 楫®ç¨á«¥­­ë¥ (®áâ â®ª ®â¡à á뢠¥âáï).
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
; a..z -> A..Z
UPPER: CP 'a'
RET C
CP 'z' + 1
JR NC,.CheckRUS
.Dec: SUB #20
RET
;
.CheckRUS: CP ' ' ; àãááª ï ¡ãª¢   , ª®¤ #A0
RET C
CP '¯'+1 ; àãááª ï ¡ãª¢  ¯, ª®¤ #AF + 1
JR C,.Dec
;
.BGUPPER: CP 'à' ; àãááª ï ¡ãª¢  à, ª®¤ #E0
RET C
CP 'ð' ; àãááª ï ¡ãª¢  ð, ª®¤ #F0
JR NC,.HGUPPER
SUB #50
RET
;
.HGUPPER: CP 'ñ' ; àãááª ï ¡ãª¢  ñ, ª®¤ #F1
RET NZ
DEC A
RET
;----------------------------------------------------------------------;
;!TODO hardware
;----------------------------------------------------------------------;
; —⥭¨¥ ॣ¨áâ஢ CMOS
; ¢å®¤: d=­®¬¥à ॣ¨áâà 
RCMOS: LD C,BIOS.CMOS_RD
RST ToBIOS
;JP BCD2HEX
; INPUT : A - BCD
; OUTPUT: A - HEX
BCD2HEX:
LD E,A
RRCA
RRCA
RRCA
RRCA
AND #0F
LD D,A
ADD A,A
ADD A,A
ADD A,D
ADD A,A
LD D,A
LD A,E
AND #0F
ADD A,D
RET
;----------------------------------------------------------------------;
;!TODO hardware
;----------------------------------------------------------------------;
; ‡ ¯¨áì ॣ¨áâ஢ CMOS
; ¢å®¤: d=­®¬¥à ॣ¨áâà 
WCMOS: CALL HEX2BCD
LD C,BIOS.CMOS_WR
JP ToBIOS
; INPUT : A - HEX
; OUTPUT: A - BCD
HEX2BCD:
LD BC,#0AFF
.loop: INC C
SUB B
JR NC,.loop
ADD A,B
LD B,A
LD A,C
RLCA
RLCA
RLCA
RLCA
AND #F0
OR B
RET
;----------------------------------------------------------------------;
;
;
;----------------------------------------------------------------------;
;BC/DE ==> BC, remainder in HL
; ­¥ ¯®àâ¨â DE
BC_Div_DE:
ld hl,0
ld a,b
ld b,16
;shift the bits from BC into HL
.div_loop:
sla c
rla
adc hl,hl
sbc hl,de
jr nc,.div_inc_acc
add hl,de
db $FE ;this begins the instruction `cp *`, so it eats the next byte.
.div_inc_acc:
inc c
djnz .div_loop
ld b,a
ret
;----------------------------------------------------------------------;
;
;----------------------------------------------------------------------;
; HL:DE / A => DE:BC, H=0, L - ®áâ â®ª
DIV_by_Shifts:
LD C,A
DEC A
JR Z,.exit
;
AND E
LD B,A ; ®áâ â®ª
LD A,C
RRCA
;
.loop: SRL H
RR L
RR D
RR E
RRCA
JP NC,.loop
LD A,B
.exit: LD B,D
LD C,E
EX DE,HL
LD H,0
LD L,A
RET
;----------------------------------------------------------------------;
;===============================================================================================================================
MACRO PRINT_LINE_KERNEL_PANIC coordY, txtString, txtStringSize, txtColor
LD HL,txtString
LD BC,txtColor*256 + txtStringSize
LD DE,coordY * 256 + (80 - txtStringSize)/2
CALL .PRINT_LINE
ENDM ; 12 bytes
;
;-----------------------[]
; HL - á®®¡é¥­¨¥
; E - ª®®à¤¨­ â  X ­  ⥪á⮢®¬ íªà ­¥
; BC - ¤«¨­  á®®¡é¥­¨ï
KERNEL_PANIC:
DI
;
PUSH DE
PUSH HL
PUSH BC
;
LD E,1
LD BC,BIOS.LP_OPEN_S.TXT_80x32_Default
RST ToBIOS
;
LD HL,#2050
LD DE,0
LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN
RST ToBIOS
;
LD A,1
OUT (SCREEN_SWITCH),A ; set scr-2
;
PRINT_LINE_KERNEL_PANIC 13, .kernel_panic, .kernel_panic.size, +(COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INK.RED)
PRINT_LINE_KERNEL_PANIC 18, .press_CAD, .press_CAD.size, +(COLORS.CGA.PAPER.BLUE + COLORS.CGA.INK.WHITE)
;
POP BC
POP HL
LD DE,#A000
LD A,C
LDIR
;
POP DE
LD D,15
LD C,BIOS.LP_SET_PLACE
RST ToBIOS
;
LD HL,#A000
LD DE,0*256 + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INK.WHITE
LD B,A
LD C,BIOS.LP_PRINT_LINE3
RST ToBIOS
;
.loop: DI
HALT
JR .loop
;
.PRINT_LINE:
PUSH BC
PUSH DE
LD DE,#A000
LD B,E
LD A,C
LDIR
;
POP DE
LD C,BIOS.LP_SET_PLACE
RST ToBIOS
;
POP DE
LD E,D
LD HL,#A000
LD D,L
LD B,A
LD C,BIOS.LP_PRINT_LINE3
JP ToBIOS
;
.kernel_panic: DZ "KERNEL PANIC!"
.kernel_panic.size EQU $-.kernel_panic
;
.press_CAD: DZ "Press Ctrl+Alt+Del or RESET."
.press_CAD.size EQU $-.press_CAD
;-----------------------[]
;===============================================================================================================================

View File

@ -1,613 +0,0 @@
;
; SYSPAGE EQU #FE
; SLOT1 EQU #A2
; SLOT2 EQU #C2
; SLOT3 EQU #E2
; ORG #3CDB
; Disk Driver Specification ver. 2.20
;[]===========================================================[ 0]
;Procedure : Initialization
;
;Function : Initialization device(s)
;
;Input : C = 00h
; IX - Environment
;Output : A = Amount drive support
; HL = Size driver
;[]===========================================================[ 0]
;[]===========================================================[ 1]
;Procedure : Open
;
;Function : Open disk
;
;Input : C = 01h
; A - Drive
;Output : None
;
;[]===========================================================[ 1]
;[]===========================================================[ 2]
;Procedure : Close
;
;Function : Close disk
;
;Input : C = 02h
; A - Drive
;Output : None
;
;[]===========================================================[ 2]
;[]===========================================================[ 3]
;!TODO
;Procedure : Media check
;
;Function : Checking change line
;
;Input : C = 03h
; A - Drive
;Output : A = 00h disk no changed
; A = 0FFh disk changed
;
;[]===========================================================[ 3]
;[]===========================================================[ 4]
;Procedure : Get BPB
;
;Function : Get Block Parameters BIOS
;
;Input : C = 04h
; DE - Address
;Output : None
;
;[]===========================================================[ 4]
;[]===========================================================[ 5]
;Procedure : Input
;
;Function : Input from disk
;
;Input : C = 05h
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
;Output : None
;
;[]===========================================================[ 5]
;[]===========================================================[ 6]
;Procedure : Output
;
;Function : Output to disk
;
;Input : C = 06h
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
;Output : None
;
;[]===========================================================[ 6]
;[]===========================================================[ 7]
;!TODO
;Procedure : Removable
;
;Function : Checking change line
;
;Input : C = 07h
; A - Drive
;Output : A = 00h Removable
; A = FFh Nonremovable
;
;[]===========================================================[ 7]
;[]===========================================================[ 8]
;Procedure : Generic IOCTL
;
;Function : Generic Input Output Control
;
;Input : C = 08h
; B - Subcommand
; DE = 55AAh Magic Number
; Subcommand
;----------------------
; 00h - Get Device Parameters
; 01h - Read track
; 02h - Test track
; 80h - Set Device Parameters
; 81h - Write track
; 82h - Format track
;Output :
;
;[]===========================================================[ 8]
;[]===========================================================[ 9]
; RESERVED
;[]===========================================================[ 9]
;[]===========================================================[ 10]
;!TODO
;Procedure : Read Long
;
;Function : Reading sectors from disk
;
;Input : C = 0Ah
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
; A'- Page
;Output : A'- Next Page
; HL:IX - Next Logical Block (sector)
; DE - Next Address
;
;[]===========================================================[ 10]
;[]===========================================================[ 11]
;!TODO
;Procedure : Write Long
;
;Function : Writing sectors to disk
;
;Input : C = 0Bh
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
; A'- Page
;Output : A'- Next Page
; HL:IX - Next Logical Block (sector)
; DE - Next Address
;
;[]===========================================================[ 11]
;
; Errors:
; 0 (00h) - NO ERRORS
; 1 (01h) - BAD COMMAND
; 2 (02h) - BAD DRIVE NUMBER
; 3 (03h) - UNKNOW FORMAT
; 4 (04h) - NOT READY
; 5 (05h) - SEEK ERROR
; 6 (06h) - SECTOR NOT FOUND
; 7 (07h) - CRC ERROR
; 8 (08h) - WRITE PROTECT
; 9 (09h) - READ ERROR
; 10 (0Ah) - WRITE ERROR
; 11 (0Bh) - FAILURE
; 12 (0Ch) - BUSY (DEVICE OPENED)
; 13 (0Dh) - RESERVED
RMDRIVE:
INC C
DEC C
JP Z,INIT_RD ; 0
DEC C
JR Z,RESE_RD ; 1
DEC C
JR Z,STAT_RD ; 2
DEC C
JR Z,CHEK_RD ; 3
DEC C
JR Z,GBPB_RD ; 4
DEC C
JR Z,READR ; 5
DEC C
JR Z,WRITER ; 6
DEC C
JR Z,REMOV_R ; 7
DEC C
JP Z,IOCTL_R ; 8
; DEC C
; JP Z,RESR_H ; 9
; DEC C
; JP Z,LREADH ; 10
; DEC C
; JP Z,LWRITEH ; 11
.error:
LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
REMOV_R:
RESE_RD:
STAT_RD:
XOR A
RET
;!FIXIT ᤥ« âì ¢ SYS_PAGE ¤«ï à ¬¤¨áª®¢ ¯¥à¥¬¥­­ë¥ ¨ ¡à âì ®ââ㤠 §­ ç¥­¨¥
CHEK_RD LD A,#FF
AND A
RET
;DE - ADDRESS
GBPB_RD LD IX,0
LD HL,0
LD B,#01
;JP READR
;READ SECTORS
; HL:IX - SECTOR
; DE - ADDRESS
; B - COUNT
; A - DRIVE
READR PUSH BC
PUSH IX
PUSH HL
PUSH BC
CALL RAMADDR
POP BC
LD IX,512
RAMRLOP PUSH BC
PUSH IX
CALL LRDSEC
POP IX
POP BC
DJNZ RAMRLOP
POP HL
POP IX
POP BC
XOR A
CP B
LD C,B
LD B,A
JR Z,DYEP256
ADD IX,BC
LD C,B
ADC HL,BC
XOR A
RET
DYEP256 INC B
ADD IX,BC
LD B,C
ADC HL,BC
XOR A
RET
;WRITE SECTORS
; HL:IX - SECTOR
; DE - ADDRESS
; B - COUNT
; A - DRIVE
WRITER PUSH BC
PUSH IX
PUSH HL
PUSH BC
CALL RAMADDR
POP BC
LD IX,512
RAMWLOP PUSH BC
PUSH IX
CALL WRDSEC
POP IX
POP BC
DJNZ RAMWLOP
POP HL
POP IX
POP BC
XOR A
CP B
LD C,B
LD B,A
JR Z,WYEP256
ADD IX,BC
LD C,B
ADC HL,BC
XOR A
RET
WYEP256 INC B
ADD IX,BC
LD B,C
ADC HL,BC
XOR A
RET
INIT_RD:
.SectorSize EQU 512 ;!HARDCODE
LD HL,.SectorSize
LD A,#80
.loop: SRL A
RR H
JR NC,.loop
LD (S_P_P),A
LD BC,#0*256 + BIOS.GET_RAMD_ST ; <20>®«ã祭¨¥ ¨¤¥­â¨ä¨ª â®à  ¡«®ª , ­ §­ ç¥­­®£® ­  RAM-Disk
LD DE,RAMDTBL
.initLoop:
PUSH BC
LD A,B
PUSH DE
RST ToBIOS
POP DE
OR A
JR Z,.noDRV
LD (DE),A
INC DE
POP BC
LD A,B
LD (DE),A
INC DE
JP 1F
.noDRV: POP BC
1: INC B
LD A,RAMDTBL.Size / 2
CP B
JR NZ,.initLoop
LD HL,RAMDTBL
EX DE,HL
AND A
SBC HL,DE
SRL L
LD A,L
; LD HL,ENDDRVR
AND A
RET
; <E28099>ˆ€ ‘ŽŽ’‚…’‘’‚ˆŸ Œ…†„“ ”ˆ‡ˆ—…‘ŠˆŒ <20>ŽŒ…<C592>ŽŒ <20>€Œ„ˆŠ€ ˆ …ƒŽ RAM-DISK ID
; DB RAM_DRIVE_ID, RAM_DRIVE_NUMBER
RAMDTBL: DUP MAX_RAMDRIVES * 2
DB #FF
EDUP
.Size EQU $-RAMDTBL
; SECTOR / S_P_P = START PAGE
; INPUT : HL:IX -SECTOR
; OUTPUT: A':HL - ADDRESS
RAMADDR LD BC,RAMDTBL
SLA A
ADD A,C
LD C,A
LD A,0
ADC A,B
LD B,A
LD A,(BC)
EX AF,AF'
LD B,XH
LD C,XL
LD A,(S_P_P) ; (S_P_P) ;SECTORS PER Page
;AGE
DIVR0 RRCA
JR C,DIVR1
RR H
RR L
RR B
RR C
JR DIVR0
DIVR1 LD B,C
LD C,#C4 ;GET FIRST PAGE
EX AF,AF'
RST ToBIOS
EX AF,AF'
LD A,(S_P_P)
LD C,A
DEC C
LD A,XL
AND C
INC A
LD HL,#C000
LD BC,512
SBC HL,BC
ADDLP ADD HL,BC
DEC A
JR NZ,ADDLP
RET
S_P_P DB #00
; A':HL - ADDRESS SOURCE
; DE - ADDRESS DESTINATION
LRDSEC LD A,D
CP #A0
LD C,SLOT3
SET 6,H
JR C,RMDL02
LD C,SLOT1
RES 7,H
RMDL02 IN A,(C)
EX AF,AF'
DI
OUT (C),A
LD B,XH
LD XH,C
LD C,XL
LDIR
EX AF,AF'
LD C,XH
OUT (C),A
LD A,H
AND #7F
EI
RET NZ
LD C,SLOT3 ;GET NEXT PAGE
IN B,(C)
LD A,SYS_PAGE
OUT (C),A
EX AF,AF'
LD XH,#C2
LD XL,A
LD A,(IX)
EX AF,AF'
OUT (C),B
LD H,#C0
RET
; A':HL - ADDRESS SOURCE
; DE - ADDRESS DESTINATION
WRDSEC LD A,D
CP #A0
LD C,SLOT3
SET 6,H
JR C,WMDL02
LD C,SLOT1
RES 7,H
WMDL02 IN A,(C)
EX AF,AF'
DI
OUT (C),A
LD B,XH
LD XH,C
LD C,XL
EX DE,HL
LDIR
EX DE,HL
EX AF,AF'
LD C,XH
OUT (C),A
LD A,H
AND #7F
EI
RET NZ
LD C,SLOT3 ;GET NEXT PAGE
IN B,(C)
LD A,SYS_PAGE
OUT (C),A
EX AF,AF'
LD XH,#C2
LD XL,A
LD A,(IX)
EX AF,AF'
OUT (C),B
LD H,#C0
RET
;;
;;
; 00 - GET DEVICE PARAMETERS
; 01 - READ TRACK
; 02 - TEST TRACK
; 80 - SET DEVICE PARAMETERS
; 81 - WRITE TRACK
; 82 - FORMAT TRACK
IOCTL_R:
BIT 7,B
JR NZ,.O_CTL_F
INC B
DEC B
JP Z,.RGETPRM
; DEC B
; JP Z,FRDTRAC
; DEC B
; JP Z,FCHTRAC
LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
.O_CTL_F:
RES 7,B
INC B
DEC B
JP Z,.RSETPRM
; DEC B
; JP Z,FWRTRAC
; DEC B
; JP Z,FFRTRAC
LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
; HL:DE - SECTORS ON LOGICAL DISK
; HL' - CYLINDERS ON PHISICAL DISK
; DE' - HEADS ON PHISICAL DISK
; BC' - SECTORS PER TRACK ON PHISICAL DISK
; A' - PHISICAL DRIVE NUMBER
; A - EXTENDED INFORMATION
; D0...D3 - "0" RESERVED (MAY BE OTHER)
; D4 - DEVICE MASTER/SLAVE
; D5 - "1" RESERVED
; D6 - ADDRESSING MODE LBA/CHS
; D7 - "1" RESERVED
.RGETPRM:
EX DE,HL
LD BC,#55AA
AND A
SBC HL,BC
LD L,A
LD A,DSS_Error.drv.GENERAL_FAILURE
SCF
RET NZ
EX AF,AF'
LD BC,RAMDTBL
LD A,L
SLA A
ADD A,C
LD C,A
LD A,0
ADC A,B
LD B,A
INC BC
LD A,(BC)
ADD #60 ;!HARDCODE ᤥ« âì ­®¬¥à  à §­ëå ãáâனá⢠ç¥à¥§ ¬¥âª¨
PUSH AF
PUSH AF
EX AF,AF'
POP AF
LD C,BIOS.DRV_GET_PAR
RST ToBIOS
PUSH HL ;ç¨á«® £®«®¢®ª, ç¨á«® ᥪâ®à®¢ (­  楫¨­¤à)
PUSH DE ;ª®«¨ç¥á⢮ 樫¨­¤à®¢
EXX
POP HL ;ª®«¨ç¥á⢮ 樫¨­¤à®¢
POP BC ;ç¨á«® ᥪâ®à®¢ (­  楫¨­¤à)
LD D,0
LD E,B ;ç¨á«® £®«®¢®ª
LD B,D
EXX
LD A,L
RRA
JR C,.end
.loopShift:
SLA E
RL D
RRA
JR NC,.loopShift
.end:
EX AF,AF'
POP AF
EX AF,AF'
XOR A
LD L,A
LD H,L
LD A,%10100000
RET
;!HARDCODE
.RSETPRM:
AND A
RET
ENDDRVR EQU $
;

View File

@ -1,477 +0,0 @@
; SYSPAGE EQU #FE
; SLOT1 EQU #A2
; SLOT2 EQU #C2
; SLOT3 EQU #E2
; ORG #3CDB
; Disk Driver Specification ver. 2.20
;[]===========================================================[ 0]
;Procedure : Initialization
;
;Function : Initialization device(s)
;
;Input : C = 00h
; IX - Environment
;Output : A = Amount drive support
; HL = Size driver
;[]===========================================================[ 0]
;[]===========================================================[ 1]
;Procedure : Open
;
;Function : Open disk
;
;Input : C = 01h
; A - Drive
;Output : None
;
;[]===========================================================[ 1]
;[]===========================================================[ 2]
;Procedure : Close
;
;Function : Close disk
;
;Input : C = 02h
; A - Drive
;Output : None
;
;[]===========================================================[ 2]
;[]===========================================================[ 3]
;!TODO
;Procedure : Media check
;
;Function : Checking change line
;
;Input : C = 03h
; A - Drive
;Output : A = 00h disk no changed
; A = 0FFh disk changed
;
;[]===========================================================[ 3]
;[]===========================================================[ 4]
;Procedure : Get BPB
;
;Function : Get Block Parameters BIOS
;
;Input : C = 04h
; DE - Address
;Output : None
;
;[]===========================================================[ 4]
;[]===========================================================[ 5]
;Procedure : Input
;
;Function : Input from disk
;
;Input : C = 05h
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
;Output : None
;
;[]===========================================================[ 5]
;[]===========================================================[ 6]
;Procedure : Output
;
;Function : Output to disk
;
;Input : C = 06h
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
;Output : None
;
;[]===========================================================[ 6]
;[]===========================================================[ 7]
;!TODO
;Procedure : Removable
;
;Function : Checking change line
;
;Input : C = 07h
; A - Drive
;Output : A = 00h Removable
; A = FFh Nonremovable
;
;[]===========================================================[ 7]
;[]===========================================================[ 8]
;Procedure : Generic IOCTL
;
;Function : Generic Input Output Control
;
;Input : C = 08h
; B - Subcommand
; DE = 55AAh Magic Number
; Subcommand
;----------------------
; 00h - Get Device Parameters
; 01h - Read track
; 02h - Test track
; 80h - Set Device Parameters
; 81h - Write track
; 82h - Format track
;Output :
;
;[]===========================================================[ 8]
;[]===========================================================[ 9]
; RESERVED
;[]===========================================================[ 9]
;[]===========================================================[ 10]
;!TODO
;Procedure : Read Long
;
;Function : Reading sectors from disk
;
;Input : C = 0Ah
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
; A'- Page
;Output : A'- Next Page
; HL:IX - Next Logical Block (sector)
; DE - Next Address
;
;[]===========================================================[ 10]
;[]===========================================================[ 11]
;!TODO
;Procedure : Write Long
;
;Function : Writing sectors to disk
;
;Input : C = 0Bh
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
; A'- Page
;Output : A'- Next Page
; HL:IX - Next Logical Block (sector)
; DE - Next Address
;
;[]===========================================================[ 11]
;
; Errors:
; 0 (00h) - NO ERRORS
; 1 (01h) - BAD COMMAND
; 2 (02h) - BAD DRIVE NUMBER
; 3 (03h) - UNKNOW FORMAT
; 4 (04h) - NOT READY
; 5 (05h) - SEEK ERROR
; 6 (06h) - SECTOR NOT FOUND
; 7 (07h) - CRC ERROR
; 8 (08h) - WRITE PROTECT
; 9 (09h) - READ ERROR
; 10 (0Ah) - WRITE ERROR
; 11 (0Bh) - FAILURE
; 12 (0Ch) - BUSY (DEVICE OPENED)
; 13 (0Dh) - RESERVED
; MACRO _mGET_RAMDRV_NUM
; PUSH BC
; LD BC,RAMDTBL
; SLA A
; ADD A,C
; LD C,A
; LD A,0
; ADC A,B
; LD B,A
; INC BC
; LD A,(BC)
; OR #60
; POP BC
; ENDM
MACRO _mGET_RAMDRV_NUM
LD BC,RAMDTBL
SLA A
ADD A,C
LD C,A
LD A,0
ADC A,B
LD B,A
INC BC
LD A,(BC)
OR #60 ;!HARDCODE ᤥ« âì ­®¬¥à  à §­ëå ãáâனá⢠ç¥à¥§ ¬¥âª¨
ENDM
; parser
RMDRIVE:
INC C
DEC C
JP Z,INIT_RD ; 0
DEC C
JR Z,RESET_RD ; 1
DEC C
JR Z,STATUS_RD ; 2
DEC C
JR Z,CHEK_RD ; 3
DEC C
JR Z,GBPB_RD ; 4
DEC C
JR Z,READ_RD ; 5
DEC C
JR Z,WRITE_RD ; 6
DEC C
JR Z,REMOV_RD ; 7
DEC C
JP Z,IOCTL_RD ; 8
DEC C
JP Z,.error ; 9 RESR_H
DEC C
JP Z,LREAD_RD ; 10
DEC C
JP Z,LWRITE_RD ; 11
.error:
LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
REMOV_RD:
RESET_RD:
STATUS_RD:
XOR A
RET
;!FIXIT ᤥ« âì ¢ SYS_PAGE ¤«ï à ¬¤¨áª®¢ ¯¥à¥¬¥­­ë¥ ¨ ¡à âì ®ââ㤠 §­ ç¥­¨¥
CHEK_RD LD A,#FF
AND A
RET
;DE - ADDRESS
GBPB_RD LD IX,0
LD HL,0
LD B,#01
;JP READ_RD
;READ SECTORS
; HL:IX - SECTOR
; DE - ADDRESS
; B - COUNT
; A - DRIVE
READ_RD:
PUSH BC
_mGET_RAMDRV_NUM
POP BC
LD C,BIOS.DRV_READ
JP ToBIOS
; RST ToBIOS
; XOR A
; RET
LREAD_RD:
PUSH BC
_mGET_RAMDRV_NUM
POP BC
LD C,BIOS.DRV_READ_LONG
JP ToBIOS
; RST ToBIOS
; XOR A
; RET
;WRITE SECTORS
; HL:IX - SECTOR
; DE - ADDRESS
; B - COUNT
; A - DRIVE
WRITE_RD:
PUSH BC
_mGET_RAMDRV_NUM
POP BC
LD C,BIOS.DRV_WRITE
JP ToBIOS
; RST ToBIOS
; XOR A
; RET
LWRITE_RD:
PUSH BC
_mGET_RAMDRV_NUM
POP BC
LD C,BIOS.DRV_WRITE_LONG
JP ToBIOS
; RST ToBIOS
; XOR A
; RET
;S_P_P DB #00
INIT_RD:
; .SectorSize EQU 512 ;!HARDCODE
; LD HL,.SectorSize
; LD A,#80
; .loop: SRL A
; RR H
; JR NC,.loop
; LD (S_P_P),A
LD BC,#0*256 + BIOS.GET_RAMD_ST ; <20>®«ã祭¨¥ ¨¤¥­â¨ä¨ª â®à  ¡«®ª , ­ §­ ç¥­­®£® ­  RAM-Disk
LD DE,RAMDTBL
.initLoop:
PUSH BC
LD A,B
PUSH DE
RST ToBIOS
POP DE
OR A
JR Z,.noDRV
LD (DE),A
INC DE
POP BC
LD A,B
LD (DE),A
INC DE
JP 1F
.noDRV: POP BC
1: INC B
LD A,RAMDTBL.Size / 2
CP B
JR NZ,.initLoop
LD HL,RAMDTBL
EX DE,HL
AND A
SBC HL,DE
SRL L
LD A,L
; LD HL,ENDDRVR
AND A
RET
; <E28099>ˆ€ ‘ŽŽ’‚…’‘’‚ˆŸ Œ…†„“ ”ˆ‡ˆ—…‘ŠˆŒ <20>ŽŒ…<C592>ŽŒ <20>€Œ„ˆŠ€ ˆ …ƒŽ RAM-DISK ID
; DB RAM_DRIVE_ID, RAM_DRIVE_NUMBER
RAMDTBL: DUP MAX_RAMDRIVES * 2
DB #FF
EDUP
.Size EQU $-RAMDTBL
;
; 00 - GET DEVICE PARAMETERS
; 01 - READ TRACK
; 02 - TEST TRACK
; 80 - SET DEVICE PARAMETERS
; 81 - WRITE TRACK
; 82 - FORMAT TRACK
IOCTL_RD:
BIT 7,B
JR NZ,.O_CTL_F
INC B
DEC B
JP Z,.RGETPRM
; DEC B
; JP Z,FRDTRAC
; DEC B
; JP Z,FCHTRAC
LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
.O_CTL_F:
; RES 7,B
; INC B
; DEC B
; JP Z,.RSETPRM
; DEC B
; JP Z,FWRTRAC
; DEC B
; JP Z,FFRTRAC
LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
; HL:DE - SECTORS ON LOGICAL DISK
; HL' - CYLINDERS ON PHISICAL DISK
; DE' - HEADS ON PHISICAL DISK
; BC' - SECTORS PER TRACK ON PHISICAL DISK
; A' - PHISICAL DRIVE NUMBER
; A - EXTENDED INFORMATION
; D0...D3 - "0" RESERVED (MAY BE OTHER)
; D4 - DEVICE MASTER/SLAVE
; D5 - "1" RESERVED
; D6 - ADDRESSING MODE LBA/CHS
; D7 - "1" RESERVED
.RGETPRM:
EX DE,HL
LD BC,#55AA
AND A
SBC HL,BC
LD L,A
LD A,DSS_Error.drv.GENERAL_FAILURE
SCF
RET NZ
EX AF,AF'
LD A,L
_mGET_RAMDRV_NUM
PUSH AF
PUSH AF
EX AF,AF'
POP AF
LD C,BIOS.DRV_GET_PAR
RST ToBIOS
PUSH HL ;ç¨á«® £®«®¢®ª, ç¨á«® ᥪâ®à®¢ (­  楫¨­¤à)
PUSH DE ;ª®«¨ç¥á⢮ 樫¨­¤à®¢
EXX
POP HL ;ª®«¨ç¥á⢮ 樫¨­¤à®¢
POP BC ;ç¨á«® ᥪâ®à®¢ (­  楫¨­¤à)
LD D,0
LD E,B ;ç¨á«® £®«®¢®ª
LD B,D
EXX
LD A,L
RRA
JR C,.end
.loopShift:
SLA E
RL D
RRA
JR NC,.loopShift
.end:
EX AF,AF'
POP AF
EX AF,AF'
XOR A
LD L,A
LD H,L
LD A,%10100000
RET
; !TODO
; !FIXIT
; .RSETPRM:
; AND A
; RET
ENDDRVR EQU $
;

View File

@ -1,45 +1,67 @@
; ;
STRUCT _sStack ; 256 bytes STRUCT _sStack ; 256 bytes
buffer BLOCK 255,0 .buffer BLOCK 256,0
SPoint BYTE 0 ;.SPoint BYTE 0
ENDS ENDS
; ;
; ;
STRUCT _sEXE_HEADER ; 512 bytes STRUCT _sEXE_HEADER ; 512 bytes
EXE_EXT TEXT 3,{"EX","E"} .EXE_EXT TEXT 3,{"EX","E"} ; 0-2 EXE ‘¨£­ âãà 
VERSION BYTE 0 .VERSION BYTE 0 ; 3 Version of EXE file
OFFCOD1 WORD 0 .OFFCOD1 WORD 00 ; 4-5 ª ª®£® ᬥ饭¨ï ¢ ä ©«¥ ¡ã¤¥â £à㧨âìáï ª®¤ ¢
OFFCOD2 WORD 0 .OFFCOD2 WORD 00 ; 6-7 ¯ ¬ïâì ¯®  ¤à¥áã (Code_addr) Low addr, High addr.
LOADER WORD 0 .LOADER WORD 00 ; 8-9 <EFBFBD> §¬¥à ¯¥à¢¨ç­®£® § £àã§ç¨ª  ¨«¨ 0
RESERVED BLOCK 6,0 .RESERVED BLOCK 6,0 ; 10-15 Reserved
LD_ADDR WORD 0 .LD_ADDR WORD 00 ; 16-17 €¤à¥á à á¯®«®¦¥­¨ï ª®¤  ¢ ¯ ¬ï⨠(#4100-#FFFF)
PC_REG WORD 0 .PC_REG WORD 00 ; 18-19 €¤à¥á ¢ ¯ ¬ïâ¨ á ª®â®à®£® § ¯ãáâ¨âáï ª®¤ (Reg. PC)
SP_REG WORD 0 .SP_REG WORD 00 ; 20-21 €¤à¥á á⥪  (Reg. SP)
RESERVED2 BLOCK 490,0 .UnUsedPoint BYTE 0 ; 22
; ¢ .RESERVED2 ­¥«ì§ï ¯à®¯¨á âì BLOCK 512-.UnUsedPoint,0; ¯®í⮬ã å à¤ª®¤
.RESERVED2 BLOCK 512-23,0 ; 23-512 Œ®¦­® ¨á¯®«ì§®¢ âì ¯®¤ ⥪áâ ¤«ï ¢ë¯¥­¤àñ¦  ¨«¨ ­¥ ¨á¯®«ì§®¢ âì
ENDS ENDS
; ;
;File Manipulator (FM) ;File Manipulator (FM)
STRUCT _sFM ; 44 bytes ;[ ] fat32
.NAME: TEXT 8,{". "," "} ;+00 NAME STRUCT _sFM ; 54 bytes
.EXT: TEXT 3,{" "," "} ;+08 EXT ; from FAT
.ATTRIBUT: BYTE #10 ;+11 ATTRIBUT ; .NAME: TEXT 8,{". "," "} ;+ #00 +00 NAME
.RESERVED_L: BYTE 0 ;+12 RESERVED; !TODO á«¥¤ãî騩 ª« áâ¥à ¤«ï ç⥭¨ï ; .EXT: TEXT 3,{" "," "} ;+ #08 +08 EXT
.RESERVED_H: BYTE 0 ;+13 RESERVED; !TODO á«¥¤ãî騩 ª« áâ¥à ¤«ï § ¯¨á¨ ; .ATTRIBUT: BYTE #10 ;+ #0B +11 ATTRIBUT
.RESERVED_X: BLOCK 8,0 ;+14 RESERVED ; .RESERVED_NT: BYTE #00 ;+ #0C +12 RESERVED
.TIME: WORD #0000 ;+22 TIME ; .RESERVED_FAT32: BYTE #00 ;+ #0D +13 RESERVED
.DATE: WORD #0000 ;+24 DATE ; .CREATE_TIME_FAT32: WORD #0000 ;+ #0E +14 RESERVED
.ST_CLUSTER: WORD #0000 ;+26 START CLUSTER ; .CREATE_DATE_FAT32: WORD #0000 ;+ #10 +16 RESERVED
.F_SIZE: DWORD #0000 ;+28 SIZE FILE ; .RESERVED_FAT32_1: WORD #0000 ;+ #12 +18 RESERVED
.F_POSITION: DWORD #0000 ;+32 FILE POSITION (FP) ; .FIRST_CLUSTER_H: WORD #0000 ;+ #14 +20 RESERVED
.DIR_CLUSTER: WORD #0000 ;+36 DIRECTORY CLUSTER ; .TIME: WORD #0000 ;+ #16 +22 TIME
.HANDLE: WORD #0000 ;+38 HANDLE NUMBER ; .DATE: WORD #0000 ;+ #18 +24 DATE
.DRIVE: BYTE #00 ;+40 DRIVE OR CURRENT ; .FIRST_CLUSTER_L: WORD #0000 ;+ #1A +26 START CLUSTER ; [ ] fat32
.ACCESS_MODE: BYTE #00 ;+41 ACCESS MODE ; .F_SIZE: DWORD #00000000 ;+ #1C +28 SIZE FILE
.TASK_NUM: BYTE #00 ;+42 TASK .FS_REC FAT_DIRECTORY_RECORD
.EMPTY: BYTE #00 ;+43 EMPTY ; from Core
.F_POSITION DWORD #00000000 ;+ #20 +32 FILE POSITION (FP)
.DIR_CLUSTER_L WORD #0000 ;+ #24 +36 DIRECTORY CLUSTER LOW
.DIR_CLUSTER_H WORD #0000 ;+ #24 +38 DIRECTORY CLUSTER HIGH ; [x] fat32
.HANDLE WORD #0000 ;+ #28 +40 HANDLE NUMBER
.DRIVE BYTE #00 ;+ #2A +42 DRIVE OR CURRENT
.ACCESS_MODE BYTE #00 ;+ #2B +43 ACCESS MODE
.TASK_NUM BYTE #00 ;+ #2C +44 TASK
.OptimizedClusters BYTE #00 ;+ #2D +45
.KnownCluster_L WORD #0000 ;+ #2E +46 Œ« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à  ¤«ï ª®â®à®£® ¨§¢¥áâ­® ®â­®á¨â¥«ì­®¥ ᬥ饭¨¥ ¢­ãâਠ䠩« 
.KnownCluster_H WORD #0000 ;+ #30 +48 ‘â à襥 á«®¢® ­®¬¥à  ª« áâ¥à  ¤«ï ª®â®à®£® ¨§¢¥áâ­® ®â­®á¨â¥«ì­®¥ ᬥ饭¨¥ ¢­ãâਠ䠩« 
.KnownOffset_L WORD #0000 ;+ #32 +50 Œ« ¤è¥¥ á«®¢® ᬥ饭¨ï (¢ ª« áâ¥à å) ®â­®á¨â¥«ì­® ­ ç «  ä ©«  ¤«ï á®åà ­¥­­®£® ­®¬¥à  ª« áâ¥à .
.KnownOffset_H WORD #0000 ;+ #34 +52 ‘â à襥 á«®¢® ᬥ饭¨ï (¢ ª« áâ¥à å) ®â­®á¨â¥«ì­® ­ ç «  ä ©«  ¤«ï á®åà ­¥­­®£® ­®¬¥à  ª« áâ¥à .
ENDS ENDS
;ACCESS MODE: A=0 ç⥭¨¥/§ ¯¨áì
; A=1 ç⥭¨¥
; A=2 § ¯¨áì
; ;!TODO A=3 § ¯¨áì ¡¥§ «¨è­¨å á®åà ­¥­¨© ªíè  FAT
; ;!TODO A=4 § ¯¨á âì ªíè FAT
;
; ;
; NAM EQU 0 ; LEN4 EQU 31 ; NAM EQU 0 ; LEN4 EQU 31
; EXT EQU 8 ; POS1 EQU 32 ; EXT EQU 8 ; POS1 EQU 32
@ -55,13 +77,58 @@ RESERVED2 BLOCK 490,0
; LEN3 EQU 30 ; FTASK EQU 42 ; LEN3 EQU 30 ; FTASK EQU 42
; ;
STRUCT _sBuffers STRUCT _sFS_Buffer
FileManipulator _sFM ; 44 bytes * FMCOUNT .DRIVE: BYTE #FF
FM_RESERVE BLOCK _sFM * (FMCOUNT-1),0 .FAT_TYPE: BYTE #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; fat32
BootSector _sBOOT_SEC ; 62 bytes ;!TODO ¯¥à¥­¥á⨠¢ ®¡« áâì ¡ãä¥à®¢ .CacheBlock: WORD #0000
EXE_Header _sEXE_HEADER ; 512 bytes .CacheUpdated: BYTE #00
Stack _sStack ; 256 bytes ;.SectorsPerBank: BYTE #00
Buffer BLOCK 512,0 ; FOR BUFFER & SECBUF .RootDirStartCluster_L: WORD #0000
MemoryTable BLOCK 256,0 ; 256 bytes .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 0
.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 ENDS
; ;
;
STRUCT _sBuffers
.FileManipulator _sFM ; 44 bytes + 44 bytes * (FMCOUNT-1)
.FM_RESERVE BLOCK _sFM * (FMCOUNT-1),0 ;
.FS_Buffer _sFS_Buffer
;.BootSector BLOCK 90,0 ; _sBOOT_SECTOR_PARAMS: 62 bytes FAT16, 90 bytes FAT32
.EXE_Header _sEXE_HEADER ; 512 bytes
.Stack _sStack ; 256 bytes
.Buffer BLOCK 512,0 ; FOR BUFFER & SECTOR_BUFFER
.MemoryTable BLOCK 256,0 ; 256 bytes
.CurrentPath WORD 0
.CurrentDirectory BLOCK DIRECTORY_PATH_LENGTH,0
.WorkDirectory BLOCK DIRECTORY_PATH_LENGTH,0
ENDS
;

View File

@ -1,10 +1,42 @@
IFNDEF INCREASE_BUILD
DEFINE INCREASE_BUILD 0
ELSE
DEFINE+ INCREASE_BUILD 1
ENDIF
;------------------[ „®áâ ñ¬ ⥪ãéãî ¤ âã ¨ BUILD++ ]-----------------[]
LUA PASS1
dss_date, dss_month, dss_year = Get_date_RU(sj.get_define("__DATE__"))
if sj.get_define("INCREASE_BUILD") > "0" then
dss_build = increase_build("./DSS/build.txt")
else
dss_build = get_build("./DSS/build.txt")
end
if dss_build > 999 then
dss_build = 999
print("WARNING! Build > 999","WARNING! Build > 999","WARNING! Build > 999","WARNING! Build > 999","\aWARNING! Build > 999\a")
end
ENDLUA
LUA ALLPASS
sj.insert_label("lua_DAY", dss_date)
sj.insert_label("lua_MONTH", dss_month)
sj.insert_label("lua_YEAR", dss_year)
sj.insert_label("lua_BUILD", dss_build)
ENDLUA
;---------------------------------------------------------------------[]
; ;
; DSS Version ; DSS full version
VERS EQU 01 ;Version Number (XX.) ; ­®¬¥à ¢¥àᨨ (0..9)
MODF EQU 70 ;Modification (.xx) VERS EQU 1
BUILD EQU 1 ; ­®¬¥à ¬®¤¨ä¨ª æ¨¨ (0..99)
MODF EQU 71
; ­®¬¥à ¡¨«¤  (0..999)
BUILD EQU lua_BUILD
; ;
; Release Types ; Release Types
RELEASE EQU 0 RELEASE EQU 0
RC EQU 1 RC EQU 1
@ -12,13 +44,13 @@ BETA EQU 2
DP EQU 3 DP EQU 3
; ;
; Bulid Type ; Build Type
OSTYPE EQU BETA OSTYPE EQU BETA
REVISION EQU 1 REVISION EQU 1
; ;
; Default date ; Current date
DAY EQU 30 DAY EQU lua_DAY
MONTH EQU 03 MONTH EQU lua_MONTH
YEAR EQU 2023 YEAR EQU lua_YEAR
; ;

View File

@ -1,682 +0,0 @@
;[BEGIN]
;//MODULE: VIDEO
;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
;//UPDATE: 24-10-1999 DNS Restore module
;---------------------------------------------------------------
;Rev Date Name Description
;---------------------------------------------------------------
;R02 07-11-2002 DNS CORRECT FN. WINCOPY & WINREST, ADD "DI+EI"
;R01 07-11-2002 DNS FIX BUG WITH SCROLLUP FN. (A=0)
;---------------------------------------------------------------
; CLEAR TEXT WINDOW
CLEAR LD C,BIOS.LP_CLS_WIN2
RST ToBIOS
AND A
RET
;
; PRINT NULL-TERMINATED CHARS STRING
; HL - STRING POINTER
PCHARS LD A,(HL)
INC HL
OR A
RET Z
;PUSH HL
CALL PUTCHAR
;POP HL
JP PCHARS
; PRINT CHAR
; A - CHAR
PUTCHAR:
CP #0D
JP Z,CR_
CP #0A
JP Z,LF_
CP #09
JP Z,TB_
CP #08
JP Z,BK_
; CP #20
; JP NC,CHAR
CHAR: LD BC,1*256 + BIOS.LP_PRINT_SYM
RST ToBIOS
; €‰Œ€<C592> âãâ ­ á¨«ì­ë© áªà®«« íªà ­  ¥á«¨ ­ ¯¥ç â « ¢ ¯®§¨æ¨¨ ¯®á«¥¤­¥£® ᨬ¢®«  ¯®á«¥¤­¥© áâப¨
; push af
; ld a,e
; cp #4F
; jp nz,.exit
; ld a,d
; cp #1F
; jp nz,.exit
; ld e,0
; ld c,#84
; rst 8
; call LFF
; .exit:
; pop af
; €‰Œ€<C592>
RET
BK_: LD C,BIOS.LP_GET_PLACE ;GET CURSOR
RST ToBIOS
XOR A
CP E
JP Z,LOCATE
DEC E
JP LOCATE
TB_: LD C,BIOS.LP_GET_PLACE ;GET CURSOR
RST ToBIOS
IF TABisSPACES
LD B,E
LD A,E
AND #F8
ADD A,8
SUB B
LD B,A
LD C,BIOS.LP_PRINT_SYM
LD A,#20
RST ToBIOS
RET
ELSE
LD A,E
ADD A,8
AND #78
LD E,A
JP LOCATE
ENDIF
LF_: LD C,BIOS.LP_GET_PLACE ;GET CURSOR
RST ToBIOS
LD A,D
CP #1F
JP NC,LFF
INC D
//JP LOCATE
CALL LOCATE ; !!!!! ‘ ©¬ ­
CR_: LD C,BIOS.LP_GET_PLACE ;GET CURSOR
RST ToBIOS
LD E,0
JP LOCATE
LFF: PUSH HL
;PUSH DE
LD BC,1*256 + BIOS.LP_SCROLL_UD
LD DE,#0020
EI
HALT
DI
RST ToBIOS
LD DE,#1F00
;PUSH DE
CALL LOCATE
LD A,#20
LD BC,#50*256 + BIOS.LP_PRINT_SYM
RST ToBIOS
EI
;POP DE
LD DE,#1F00
CALL LOCATE
POP HL
RET
;
; SET CURRENT CURSOR POSITION
;===============================
; D = Y
; E = X
LOCATE: LD C,BIOS.LP_SET_PLACE
RST ToBIOS
RET
; GET CURRENT CURSOR POSITION
; out:
; D - Y
; E - X
CURSOR: LD C,BIOS.LP_GET_PLACE
RST ToBIOS
RET
; READ CHAR & ATTR FROM THE SCREEN
; in:
; D - Y
; E - X
; out:
; A - CHAR
; B - ATTR
RDCHAR: XOR A
LD C,BIOS.WIN_GET_SYM
RST ToBIOS
LD A,L
LD B,H
AND A
RET
; WRITE CHAR & ATTR TO THE SCREEN
; D - Y
; E - X
; A - CHAR
; B - ATTR
;!FIXIT slow ª ª ¡¥§ WIN_GET_SYM âãâ ®¡®©â¨áì?
WRCHAR: LD C,A
PUSH BC
PUSH DE
XOR A
LD C,BIOS.WIN_GET_SYM
RST ToBIOS
POP DE
POP HL
XOR A
LD C,BIOS.WIN_PUT_SYM
RST ToBIOS
AND A
RET
; COPY WINDOW FROM THE SCREEN
; D - Y
; E - X
; H - HEIGHT
; L - WIDTH
; IX - ADDRESS
; B - PAGE, IF IX > 0C000H ; FIXIT ­¥ ª®áïª «¨ âãâ? ¡ ­ª  ¤®«¦­  ¢ A' ¯¥à¥¤ ¢ âìáï,   ­¥ B
WINCOPY: AND A
LD A,R ;R02
PUSH AF ;R02
XOR A
EX AF,AF' ;R03
LD A,B ;R03 ;!TEST
EX AF,AF' ;R03
LD C,BIOS.WIN_COPY
DI ;R02
RST ToBIOS
POP AF ;R02
RET PO ;R02
EI ;R02
RET
; RESTORE WINDOW TO THE SCREEN
; D - Y
; E - X
; H - HEIGHT
; L - WIDTH
; IX - ADDRESS
; B - PAGE, IF IX > 0C000H ; FIXIT ­¥ ª®áïª «¨ âãâ? ¡ ­ª  ¤®«¦­  ¢ A' ¯¥à¥¤ ¢ âìáï,   ­¥ B
WINREST: AND A
LD A,R ;R02
PUSH AF ;R02
XOR A
EX AF,AF' ;R03
LD A,B ;R03 ;!TEST
EX AF,AF' ;R03
DI ;R02
LD C,BIOS.WIN_RESTORE
RST ToBIOS
POP AF ;R02
RET PO ;R02
EI ;R02
RET
; SCROLL WINDOW
; D - Y
; E - X
; H - HEIGHT
; L - WIDTH
; B - SCROLL DIRECTION
; B = 1 - SCROLL UP
; B = 2 - SCROLL DOWN
; A = 0 - CLEAR LINE
SCROLL: DJNZ SCR_DW
LD B,A
LD C,H
PUSH BC
PUSH DE
PUSH HL
LD XH,D
LD XL,E
INC D
DEC H
LD C,BIOS.WIN_MOVE
XOR A
RST ToBIOS
POP HL
POP DE
POP BC
XOR A
CP B
RET NZ
LD A,D
ADD A,H
DEC A ;R01
LD D,A
.print: PUSH DE ;R01
CALL LOCATE
LD A,#20
LD B,L
LD C,BIOS.LP_PRINT_SYM
RST ToBIOS
POP DE ;R01
CALL LOCATE ;R01
AND A
RET
SCR_DW: DJNZ SCR_ERR
LD B,A
LD C,L
PUSH BC ;R03 ;!TEST
PUSH DE
PUSH HL
LD XH,D
LD XL,E
INC XH
DEC H
LD C,BIOS.WIN_MOVE
XOR A
RST ToBIOS
POP HL
POP DE
POP BC ;R03 ;!TEST
XOR A
CP B
JR Z,SCROLL.print
; PUSH DE ;R01
; CALL LOCATE
; LD A,#20
; LD B,L
; LD C,BIOS.LP_PRINT_SYM
; RST ToBIOS
; POP DE ;R01
; CALL LOCATE ;R01
; AND A
RET
SCR_ERR:
LD A,DSS_Error.sys.INVALID_FUNCTION
SCF
RET
; SELECT SCREEN PAGE
; B - SCREEN PAGE
SELPAGE ;PUSH BC
LD A,(VMODE)
BIT 7,A
JR NZ,SEL2
PUSH BC
LD C,A
CALL SETVMOD.TEXT_M
POP BC
SEL2 ;POP BC
LD A,B
AND #01
OUT (SCREEN_SWITCH),A
RET
; GET CURRENT VIDEO MODE
; out:
; A - MODE
; B - PAGE
GETVMOD IN A,(SCREEN_SWITCH)
LD B,A
LD A,(VMODE)
AND A
RET
; SET CURRENT VIDEO MODE
; A - MODE
; B - PAGE
SETVMOD: BIT 7,A
LD C,A
JR NZ,GRAPH
.TEXT_M: LD IX,BACKTXT
PUSH IX
EX AF,AF'
LD A,(VMODE)
LD (VVMODE),A
EX AF,AF'
INC A
DEC A
JR Z,.NOMODE
DEC A
JR Z,.NOMODE
DEC A
LD HL,TAB_40x32
JP Z,T_40_32
DEC A
LD HL,TAB_80x32
JP Z,T_80_32
.NOMODE: POP IX
LD A,DSS_Error.sys.INVALID_VIDEO_MODE
SCF
RET
GRAPH: CALL SAVETXT
AND #7F
JR Z,G320_16 ; !TODO ? - ¯®ª  ®âà ¡ â뢠¥â ª ª ®è¨¡ª 
DEC A
JP Z,G320_56
DEC A
JP Z,G640_16
; DEC A
; JP Z,G640_56 ; !TODO ? - ¯®ª  ®âà ¡ â뢠¥â ª ª ®è¨¡ª 
G320_16: LD A,DSS_Error.sys.INVALID_VIDEO_MODE
SCF
RET
T_80_32:
T_40_32: PUSH BC
; LD HL,TAB2
LD A,B
RLCA
RLCA
RLCA
RLCA
OR B
AND #11
XOR #10
LD E,A
GRAPH_NEXT:
CALL SETMODE
POP BC
LD A,C
LD (VMODE),A
LD A,B
AND #01
OUT (SCREEN_SWITCH),A
LD A,(VMODE)
LD C,#81
RST #30
SAFE_PORTY
XOR A
RET
; T_80_32 PUSH BC
; LD HL,TAB1
; LD A,B
; RLCA
; RLCA
; RLCA
; RLCA
; OR B
; AND #11
; XOR #10
; LD E,A
; CALL SETMODE
; POP BC
; LD A,C
; LD (VMODE),A
; LD A,B
; AND #01
; OUT (SCREEN_SWITCH),A
; LD A,(VMODE)
; LD C,#81
; RST #30
; SAFE_PORTY
; XOR A
; RET
G320_56 PUSH BC
LD HL,TAB_320x256_0
LD E,#11
CALL SETMODE
LD HL,TAB_320x256_1
LD E,#00
JR GRAPH_NEXT
; CALL SETMODE
; POP BC
; LD A,C
; LD (VMODE),A
; LD A,B
; AND #01
; OUT (SCREEN_SWITCH),A
; LD A,(VMODE)
; LD C,#81
; RST #30
; SAFE_PORTY
; XOR A
; RET
G640_16 PUSH BC
LD HL,TAB_640x256_0
LD E,#11
CALL SETMODE
LD HL,TAB_640x256_1
LD E,#00
JR GRAPH_NEXT
; CALL SETMODE
; POP BC
; LD A,C
; LD (VMODE),A
; LD A,B
; AND #01
; OUT (SCREEN_SWITCH),A
; LD A,(VMODE)
; LD C,#81
; RST #30
; SAFE_PORTY
; XOR A
; RET
VMODE: DB #03
;02h - TEXT 40 x 32 (16 colors)
;03h - TEXT 80 x 32 (16 colors)
;80h - GRAF 320 x 256 (16 colors)
;81h - GRAF 320 x 256 (256 colors)
;82h - GRAF 640 x 256 (16 colors)
;83h - GRAF 640 x 256 (256 colors) UNUSED
SETMODE: PUSH DE
LD DE,#FEE0 ;!HARDCODE £àï§­ë© å ª. ª¨¤ ¥â ¤ ­­ë¥ ¢ ¡ãä¥à á«ã¦¥¡­®© áâà ­¨æë ¡¨®á .
LD BC,ScreenDescriptorTable.Size ; <20>ˆŽ ¯à¨ ¨á¯®«ì§®¢ ­¨¨ IX ¯à¥¤¯®« £ ¥â, çâ® ®­ 㪠§ë¢ ¥â
;CALL MOVBIOS ; ­   ¤à¥á ­¨¦¥ #C000 ¨ ¢áâ ¢«ï¥â ¢ âà¥âìî ¡ ­ªã áâà ­¨æã #FE
;LD A,R
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LDIR
EX AF,AF'
OUT (SLOT3),A
;JP PO,.skip_EI
;EI
.skip_EI: POP DE
LD IX,#FEE0 ;!HARDCODE £àï§­ë© å ª.
;LD HL,#0000
LD C,BIOS.WIN_OPEN
RST ToBIOS
SAFE_PORTY ;????? - ¢®§¬®¦­®, ç⮠⥯¥àì ­¥ ­ã¦­®, ¢¥§¤¥ á ¡ ­ª®© 3 à ¡®â îâ, ¯à®¢¥à¨âì
XOR A
RET
; MOVBIOS: LD A,R
; IN A,(SLOT3)
; EX AF,AF'
; LD A,SYS_PAGE
; OUT (SLOT3),A
; LDIR
; EX AF,AF'
; OUT (SLOT3),A
; RET PO
; EI
; RET
;IX+0 ;HORIZONTAL
;IX+1 ;VERTICAL
;IX+2 ;X - COORD
;IX+3 ;Y - COORD
;IX+4 ;MODE
;IX+5 ;EXT MODE
;IX+6 ;VIDEO RAM X OFFSET (SIGNPLACES)
;IX+7 ;VIDEO RAM Y OFFSET (SIGNPLACES)
;
;.......................................................................
ScreenDescriptorTable EQU $
;80x32
TAB_80x32 DB #28,#20,#00,#00,#1B,#00,#00,#00 ;1
;40x32
TAB_40x32 DB #28,#20,#00,#00,#3B,#00,#00,#00 ;2
;640x256 PAGE 0
TAB_640x256_0 DB #28,#20,#00,#00,#00,#00,#00,#00 ;3
;320x256 PAGE 0
TAB_320x256_0 DB #28,#20,#00,#00,#20,#00,#00,#00 ;4
;640x256 PAGE 1
TAB_640x256_1 DB #28,#20,#00,#00,#40,#00,#28,#00 ;5
;320x256 PAGE 1
TAB_320x256_1 DB #28,#20,#00,#00,#60,#00,#28,#00 ;6
ScreenDescriptorTable.Size EQU ($ - ScreenDescriptorTable)/6
;.......................................................................
;
SAVETXT PUSH AF
;;!!!!! ¯¥à¥­¥á¥­  «®£¨ª  áã¯¥à ¤¨ç ©è¥£® ã᪮७¨ï
LD A,(VMODE)
BIT 7,A
JR NZ,NOSAVET
SUB #02
JR C,NOSAVET
;;
PUSH BC
PUSH DE
PUSH HL
PUSH IX
PUSH AF
LD C,BIOS.LP_GET_PLACE
RST ToBIOS
LD (TCURS),DE
POP AF
LD IX,#C000
LD HL,#2050
OR A
JR NZ,SVTEXT1
LD L,#28
SVTEXT1 LD (SVHL1),HL
LD DE,#0000
EX AF,AF' ;R03
LD A,(BANKTBL+TXTPAGE)
LD B,A ;!TEST
EX AF,AF' ;R03
LD C,BIOS.WIN_COPY
XOR A
DI
RST ToBIOS
EI
POP IX
POP HL
POP DE
POP BC
NOSAVET: POP AF
RET
BACKTXT PUSH AF
VVMODE+1:
LD A,#00
BIT 7,A
JR Z,NOBACKT
PUSH BC
PUSH DE
PUSH HL
PUSH IX
LD IX,#C000
SVHL1+1:
LD HL,#2050
LD DE,#0000
EX AF,AF' ;R03
LD A,(BANKTBL+TXTPAGE)
LD B,A ;!TEST
EX AF,AF' ;R03
LD C,BIOS.WIN_RESTORE
XOR A
DI
RST ToBIOS
EI
TCURS+1:
LD DE,#0000
LD C,BIOS.LP_SET_PLACE
RST ToBIOS
POP IX
POP HL
POP DE
POP BC
NOBACKT: POP AF
RET
; SEND A SYMBOL TO THE PRINTER
;==============================
; A - SYMBOL
;!FIXIT § ¬¥­¨âì ­  sp2000.inc
LPT_A EQU #1B
LPT_B EQU #1C
PRINT: AND A
LD B,A
LD A,R
LD A,B
DI
PUSH AF
XOR A
OUT (LPT_A),A
LD A,#10
OUT (LPT_A),A
XOR A
OUT (LPT_A),A
IN A,(LPT_A) ; IN (1Bh): bit 5 - busy, Bit 3 - Ack
;ld c,a ; €‰Œ€<C592>
BIT 5,A ; IN (19h): bit 5 - Paper Enable, Bit 3 - Select
JR NZ,LPTBUSY
;and %11011000 ; €‰Œ€<C592>
;jr z,LPTBUSY ; €‰Œ€<C592>
LD A,B
OUT (LPT_B),A
POP AF
RET PO
EI
RET
LPTBUSY:
POP AF
;ld a,c ; €‰Œ€<C592>
SCF
RET PO
EI
RET
; B - SYMBOL
; CF = 1 - PRINTER BUSY
;!FIXIT § ¬¥­¨âì ­  sp2000.inc
LPT1_C EQU #1D
LPT2_D EQU #1E
LPT2_C EQU #1F
PRINT_INIT:
DI
LD A,#CF ; port #1F ⮫쪮 ç¥p¥§ LD BC,1F : Out (BC),reg (¢  «ìâ¥à¥ ¨¤ñâ ¯¥à¥å¢ â í⮣® ¯®àâ  ¯à®æ , ¥á«¨ ®­ ¢ ª®¬ ­¤¥ ® 㪠§ ­)
LD BC,LPT2_C
OUT (C),A
LD A,#63
OUT (C),A
LD A,#C0 ; Bit 7 - Select (1), Bit 6 - Auto_Line_Feed (1)
OUT (LPT2_D),A
LD A,#0F ; Init printer port for Out
OUT (LPT1_C),A
; €‰Œ€<C592> <E2809A>…‡€
XOR A ;LD A,0
OUT (COM_A),A
;LD A,0
OUT (COM_A),A ; ????? ­ ¤® «¨ ¢â®à®© à § § ááë« âì ¨ ¢®®¡é¥ ¨¬¥¥â «¨ á¬ëá« com ¨­¨â¨âì?
LD A,5
OUT (COM_A),A
LD A,#62 ; bit 7 - Direction for Bufer (0), Bit 1 - Bufer Enable (1)
OUT (COM_A),A
RET
; €‰Œ€<C592> <E2809A>…‡€
;//MODULE: VIDEO
;[END]

1
DSS/build.txt Normal file
View File

@ -0,0 +1 @@
57

View File

@ -1,36 +1,160 @@
; ;
DEFINE TEST_FEATURE 1 DEFINE TEST_FEATURE 0
; ;
; ;
DEFINE SHORT_RSTx10_TABLE 0 ; 㪮à®ç¥­­ ï â ¡«¨æ  ä㭪権 rst #10. 96 ä㭪権. DEFINE MINIMUM_EXE_VERSION 1
; ;
; ;
DEFINE MAX_RAMDRIVES 16 DEFINE SHORT_RSTx10_TABLE 0 ; 㪮à®ç¥­­ ï â ¡«¨æ  ä㭪権 rst #10. 96 ä㭪権.
DEFINE NeedSafePort_Y 1 DEFINE COMPILE_UNUSED_CODE 0
DEFINE TABisSPACES 1 ;
DEFINE CLASSIC_CURSOR 0
; MOUSE
DEFINE MOUSE_COM_BAUD 0 ; 1 - 2485, 2 - 4807, else - 1215 (default)
DEFINE MOUSE_INT_ENABLED 0 ; INT from SIO ch. B
DEFINE MOUSE_READ_PORT_TIMEOUT 5*512 ; Š®áâë«ì­ë© â ©¬- ãâ ­  ®¦¨¤ ­¨¥ ¡ ©â  ®â ¬ë誨. …᫨ = 0, â® «¨è­¨© ª®¤ ­¥ ª®¬¯¨«¨âáï
; KEYBOARD
DEFINE KEYBOARD_INT_ENABLED 0 ; INT from SIO ch. A
DEFINE CHANGE_LANG_CTRL_SHIFT 1 ; [x] 0: Ctrl + Space, 1: Ctrl + Shift.
DEFINE BREAK_PROCESS_CODE #AC00 ; CTRL+C
DEFINE USE_E1_SCANCODE 0
; DEFINE CLASSIC_CURSOR 0
;
;LD_DSK EQU 16 ; ¬ ªá¨¬ «ì­®¥ ª®«¨ç¥á⢮ «®£¨ç¥áª¨å HDD ¤¨áª®¢ ¢ á¨á⥬¥
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
DEFINE CHANGE_FREE_CLU_AFTER_DEL 1
SERVICE_SECTORS:
.FAT12 EQU #0FEF
.FAT16 EQU #FFEF
.FAT32.High EQU #0FFF
.FAT32.Low EQU #FFEF
FAT_TYPE:
.x32 EQU #32
.x16 EQU #16
.x12 EQU #12
; define _bit (1<?((FAT_CACHE.Sectors-1)
; define _shift _bit&1)) + _bit&2)) + _bit&4)) + _bit&8)) + _bit&16)) + _bit&32)) + _bit&64)) + _bit&128))
; ;
; FAT_CACHE:
; .Size EQU #2000
; .Sector_Size EQU #200
; .Sectors EQU .Size / .Sector_Size
; ; for FAT16
; .bytes_record_16 EQU 2
; .Degree_16 EQU _shift
; .Size_Mask_16 EQU high (.Size/.bytes_record_16 - 1)
; .Part_Mask_16 EQU ((1<<(.bytes_record_16*8)) / (.Size/2))-1
; ; for FAT12 ;!TODO
; .bytes_record_12 EQU 2
; .Degree_12 EQU _shift
; .Size_Mask_12 EQU high (.Size/.bytes_record_12 - 1)
; .Part_Mask_12 EQU ((1<<(.bytes_record_12*8)) / (.Size/2))-1
; DISPLAY "bytes_record_16 = ",/H,.bytes_record_16
; DISPLAY "Degree_16 = ",/H,.Degree_16
; DISPLAY "Size_Mask_16 = ",/H,.Size_Mask_16
; DISPLAY "Part_Mask_16 = ",/H,.Part_Mask_16
; DISPLAY "bytes_record_12 = ",/H,.bytes_record_12
; DISPLAY "Degree_12 = ",/H,.Degree_12
; DISPLAY "Size_Mask_12 = ",/H,.Size_Mask_12
; DISPLAY "Part_Mask_12 = ",/H,.Part_Mask_12
; undefine _bit
; undefine _shift
FAT_CACHE:
.Sector_Size EQU #200
.Degree EQU 4
; for FAT32
.Size_32 EQU #4000
.Sectors_32 EQU .Size_32 / .Sector_Size ; #20
.Degree_32 EQU 5
.Size_Mask_32 EQU #0F
.Part_Mask_32 EQU #0F
.bytes_record_32 EQU 2
; for FAT16
.Size_16 EQU #2000
.Sectors_16 EQU .Size_16 / .Sector_Size ; #10
.Degree_16 EQU .Degree
.Size_Mask_16 EQU #0F
.Part_Mask_16 EQU #0F
.bytes_record_16 EQU 2
; for FAT12 ;!TODO
.Size_12 EQU #2000
;.bytes_record_12 EQU 2
;.Degree_12 EQU _shift
;.Size_Mask_12 EQU high (.Size/.bytes_record_12 - 1)
;.Part_Mask_12 EQU ((1<<(.bytes_record_12*8)) / (.Size/2))-1
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
DEFINE NeedSafePort_Y 1
; DEFINE TABisSPACES 0
; DEFINE EnoughtOnly_LF 0
DEFINE NON_REMOVABLE_FDD 0
;
DSS_MAX_SECTOR_SIZE EQU 512
DSS_MAX_DRIVES_AMOUNT EQU 26
MAX_RAMDRIVES EQU 16
MINIMUM_BIOS_VERSION EQU 3*256 + 06 ; version 2.55
DEFINE STR_MINIMUM_BIOS_VERSION '0' + high MINIMUM_BIOS_VERSION, '.', '0'+(low MINIMUM_BIOS_VERSION)/10, '0'+(low MINIMUM_BIOS_VERSION)-((low MINIMUM_BIOS_VERSION)/10)*10
; ;
;-------------------[MEMORY]-------------------------; ;-------------------[MEMORY]-------------------------;
DEFINE USING_MEMPAGES 4 DEFINE PORTAL.RSTx18_SWITCH_ADDRESS #82
; DEFINE OLD_SET_BANK 0
;!FIXIT ᤥ« âì ⨯  DIRPAGE EQU 0 + BANKTBL ¨ ã¯à®áâ¨âì BANK
DIRPAGE EQU 0 ;---------------------[ «®£.­®¬¥à  áâà ­¨æ ¯ ¬ï⨠]---------------------
FATPAGE EQU 1 DEFINE USING_MEMPAGES 4 ; à §¬¥à ¡«®ª  ¤®¯®«­¨â¥«ì­ëå áâà ­¨æ
TXTPAGE EQU 2 ; ªíè ᯨ᪠ ª â «®£ 
ENVPAGE EQU 2 DIRPAGE EQU 0
DRVPAGE EQU 3 .buffer EQU #C000
FATPAGE EQU 1
.cache EQU #C000
TXTPAGE EQU 2
ENVPAGE EQU TXTPAGE
.PATH_PNT_ARRAY EQU #FC80
.ENVTEMP EQU #FE00
DRVPAGE EQU 3
; ;
COREPAGE EQU 4 ; ®­  ®â¤¥«ì­® ¨ ­¥ á ¡«®ª®¬ ¢ëè¥.
;-----------------------------------------------------------------------
DIRECTORY_PATH_LENGTH EQU 256 ; '\' + 255, 0
ENVIRONMENT_STRING_LENGTH EQU 255
DIRSPEC.DEPTH EQU 256 ; '\' + 1..255 TXTADDR EQU #C000
ENVADDR EQU #E400
;DIR EQU #C000
;FAT_CACHE EQU #C000
TXTADDR EQU #C000 FMCOUNT EQU 10 ; Š®«¨ç¥á⢮ ä ©«®¢ëå ¬ ­¨¯ã«ïâ®à®¢
ENVADDR EQU #E400 HANDBUF.SIZE EQU FAT_DIRECTORY_RECORD
DIR EQU #C000
FAT EQU #C000
FMCOUNT EQU 10 ; Š®«¨ç¥á⢮ ä ©«®¢ëå ¬ ­¨¯ã«ïâ®à®¢
HANDBUF.SIZE EQU 32
;----------------------------------------------------; ;----------------------------------------------------;
; ;
;
;----------------------------------------------------;
IF MOUSE_COM_BAUD = 1
MOUSE_BAUD:
.multiplier_1 EQU %0100'0000 ; ¯¥à¢ë© ¬­®¦¨â¥«ì = 16.
.multiplier_2 EQU 22 ; ¢â®à®© ¬­®¦¨â¥«ì = 22. 875000/Œ­1*Œ­2=2485
ELSEIF MOUSE_COM_BAUD = 2
MOUSE_BAUD:
.multiplier_1 EQU %0000'0000 ; ¯¥à¢ë© ¬­®¦¨â¥«ì = 1.
.multiplier_2 EQU 182 ; ¢â®à®© ¬­®¦¨â¥«ì = 182. 875000/Œ­1*Œ­2=4807
ELSE
MOUSE_BAUD:
.multiplier_1 EQU %0100'0000 ; ¯¥à¢ë© ¬­®¦¨â¥«ì = 16.
.multiplier_2 EQU 45 ; ¢â®à®© ¬­®¦¨â¥«ì = 45. 875000/Œ­1*Œ­2=1215
ENDIF
;----------------------------------------------------;
;
;
;----------------------------------------------------;
SUBLOAD_SIZE EQU 2 ; ª®«-¢® ᥪâ®à®¢ ª®â®à®¥ ­ ¤® ¯®¤£à㧨âì ¯®á«¥ § £à㧪¨ system.dos ¢ áâà ­¨æã
;----------------------------------------------------;

View File

@ -0,0 +1,76 @@
; 19/04/2025  ¢â®¯¥à¥¢®¤ ­®¬¥à  ®è¨¡ª¨ DRV/BIOS ¢ SYS
DRV_ERROR_TO_SYS:
RET NC
RLA
JR NC,.no_correction
;
PUSH HL
PUSH AF
;
SRL A
CP .Size
LD HL,.TABLE
ADD A,L
JR NC,.no_inc
;
INC H
.no_inc: LD L,A
LD L,(HL)
POP AF
LD A,L
POP HL
RET
;
.no_correction: RRA
RET
.TABLE: DB DSS_Error.sys.Unknown_Error ;BIOS.Error.NoErrors ; 0
DB DSS_Error.sys.INVALID_FUNCTION ;BIOS.Error.InvalidSubFunction ; 1
DB DSS_Error.sys.INVALID_DRIVE ;BIOS.Error.BadNumber ; 2
DB DSS_Error.sys.UNKNOWN_FORMAT ;BIOS.Error.UnknownDevice ; 3
DB DSS_Error.sys.NOT_READY ;BIOS.Error.NotReady ; 4
DB DSS_Error.sys.SEEK_ERROR ;BIOS.Error.Seek ; 5
DB DSS_Error.sys.SECTOR_NOT_FOUND ;BIOS.Error.SectorNotFound ; 6
DB DSS_Error.sys.CRC_ERROR ;BIOS.Error.CRC ; 7
DB DSS_Error.sys.WRITE_PROTECT ;BIOS.Error.WriteProtect ; 8
DB DSS_Error.sys.READ_ERROR ;BIOS.Error.Read ; 9
DB DSS_Error.sys.WRITE_ERROR ;BIOS.Error.Write ; 10
DB DSS_Error.sys.DRIVE_FAILURE ;BIOS.Error.Failure ; 11
DB DSS_Error.sys.BUSY_NO_MEDIA ;BIOS.Error.Busy ; 12
DB DSS_Error.sys.Unknown_Error ;#8D ; 13
DB DSS_Error.sys.Unknown_Error ;#8E ; 14
DB DSS_Error.sys.Unknown_Error ;#8F ; 15
DB DSS_Error.sys.Unknown_Error ;#90 ; 16
DB DSS_Error.sys.Unknown_Error ;#91 ; 17
DB DSS_Error.sys.Unknown_Error ;#92 ; 18
DB DSS_Error.sys.Unknown_Error ;#93 ; 19
DB DSS_Error.sys.Unknown_Error ;#94 ; 20
DB DSS_Error.sys.Unknown_Error ;#95 ; 21
DB DSS_Error.sys.Unknown_Error ;#96 ; 22
DB DSS_Error.sys.Unknown_Error ;#97 ; 23
DB DSS_Error.sys.Unknown_Error ;#98 ; 24
DB DSS_Error.sys.Unknown_Error ;#99 ; 25
DB DSS_Error.sys.Unknown_Error ;#9A ; 26
DB DSS_Error.sys.Unknown_Error ;#9B ; 27
DB DSS_Error.sys.Unknown_Error ;#9C ; 28
DB DSS_Error.sys.Unknown_Error ;#9D ; 29
DB DSS_Error.sys.Unknown_Error ;#9E ; 30
DB DSS_Error.sys.NOT_SUPPORTED ;BIOS.Error.NotSupported ; 31
DB DSS_Error.sys.Unknown_Error ;BIOS.Error.ATAPI.NoSence ; 32
DB DSS_Error.sys.Unknown_Error ;BIOS.Error.ATAPI.RecoveredError; 33
DB DSS_Error.sys.NOT_READY ;BIOS.Error.ATAPI.NotReady ; 34
DB DSS_Error.sys.BUSY_NO_MEDIA ;BIOS.Error.ATAPI.MediumError ; 35
DB DSS_Error.sys.DRIVE_FAILURE ;BIOS.Error.ATAPI.HardwareError ; 36
DB DSS_Error.sys.INVALID_ACCESS ;BIOS.Error.ATAPI.IllegalRequest; 37
DB DSS_Error.sys.MEDIA_CHANGED ;BIOS.Error.ATAPI.UnitAttention ; 38
DB DSS_Error.sys.ACCESS_DENIED ;BIOS.Error.ATAPI.DataProtect ; 39
DB DSS_Error.sys.Unknown_Error ;BIOS.Error.ATAPI; ; 40
DB DSS_Error.sys.Unknown_Error ;BIOS.Error.ATAPI; ; 41
DB DSS_Error.sys.Unknown_Error ;BIOS.Error.ATAPI; ; 42
DB DSS_Error.sys.NOT_READY ;BIOS.Error.ATAPI.AbortedCommand; 43
DB DSS_Error.sys.Unknown_Error ;BIOS.Error.ATAPI; ; 44
DB DSS_Error.sys.Unknown_Error ;BIOS.Error.ATAPI; ; 45
DB DSS_Error.sys.WRITE_ERROR ;BIOS.Error.ATAPI.Miscompare ; 46
DB DSS_Error.sys.Unknown_Error ;BIOS.Error.ATAPI; ; 47
DB DSS_Error.sys.NOT_READY ;BIOS.Error.ATAPI.TimeOut ; 48
.Size EQU .TABLE - $

1100
DSS/drivers/Input/MOUSE.ASM Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,524 @@
;[BEGIN]
;
; CDX.EXE [command] [-switches] [directory]
;
;commands:
; OPEN
; EJECT
; CLOSE
; COPY
; LIST
; DUMP
; COMMAND
; -h,? Help page
DEFINE _MAME 1
CR EQU 13
LF EQU 10
INCLUDE "Shared_Includes/constants/BIOS_equ.inc"
INCLUDE "Shared_Includes/constants/dss_equ.inc"
INCLUDE "Shared_Includes/constants/Sp2000.inc"
ORG #8100-22
DB "EXE" ;EXE ID
DB #00 ;EXE VERSION
DW #0016 ;CODE OFFSET LOW
DW #0000 ;CODE OFFSET HIGH
DW #0000 ;END-BEG ;PRIMARY LOADER
DW #0000 ;
DW #0000 ;RESERVED
DW #0000 ;
DW START ;LOAD ADDRESS
DW START ;START ADDRESS
DW #BFFF ;STACK ADDRESS
;DS 490
START: PUSH IX
;
XOR A
;
; LD HL,BUF1
; LD (HL),A
; LD DE,BUF1+1
; LD BC,BUFFERS_END-1
; LDIR
;
LD HL,'\' ;
LD (DIRSPEC),HL
;
LD HL,BUF1
LD B,BUFERS_NUMBER
.initBuffersLoop:
LD (HL),A
INC H
DJNZ .initBuffersLoop
;
LD A,MSG_HELLO
CALL MESSAGE
;
CALL INIT
JR NC,.next
;
LD HL,PRM1
LD (HL),0
LD A,MSG_NO_CDROM
CALL MESSAGE
LD A,1
LD (STOPMODE),A
;
.next: LD C,Dss.Version
RST ToDSS ;GET DSS VERSION
EX DE,HL
AND A
LD DE,#0146 ;1.70
SBC HL,DE ;CHECK DSS VERSION
POP HL
;
JP C,OLD_DSS
LD IX,BUF_PTRS
CALL EX_COMMAND_LINE
CALL MALLOC
JR C,QUIT
;CALL FIND_CDROM
LD A,(STOPMODE)
OR A
CALL Z,COMMAND
CALL MDEALLOC
QUIT: CALL CRLF
.loop: LD BC,Dss.Exit
RST ToDSS
JP .loop
OLD_DSS
LD A,MSG_OLD_DSS
CALL MESSAGE
JR QUIT
HNDMEM DB #FF
MALLOC
LD BC,2*256 + Dss.GetMem
RST ToDSS
JR NC,M_ALLOK
LD A,MSG_MEMERROR
CALL MESSAGE
SCF
RET
M_ALLOK
LD (HNDMEM),A
LD BC,1*256 + Dss.SetWin3
RST ToDSS
LD HL,BANKTBL
LD C,BIOS.GetMemBlkPages
LD A,(HNDMEM)
JP ToBIOS
MDEALLOC
LD A,(HNDMEM)
LD C,Dss.FreeMem
JP ToDSS
; FIND_CDROM
; LD IX,DEV_CFG
; LD C,BIOS.DRV_LIST
; RST ToBIOS
; LD A,(IX+3) ;CDROM
; OR A
; JR Z,W_O_CD
; LD A,(CDDRIVE)
; INC A
; RET NZ
; LD A,SLAVE ;DEFAULT
; LD (CDDRIVE),A
; RET
; W_O_CD LD A,MSG_NO_CDROM
; CALL MESSAGE
; LD A,1
; LD (STOPMODE),A
; SCF
; RET
;BUF_PRINT
; LD HL,BUF_PTRS
;BUF_PL LD E,(HL)
; INC HL
; LD D,(HL)
; INC HL
; LD A,D
; OR E
; RET Z
; PUSH HL
; EX DE,HL
; LD C,Dss.PCHARS
; RST ToDSS
; CALL CRLF
; POP HL
; JR BUF_PL
;OPEN_FILE
; LD HL,FILENAME
; XOR A
; LD C,Dss.OPEN
; RST ToDSS
; LD (FILEHND),A
; RET NC
; LD HL,FILENAME
; CALL PUTVAR
; LD A,MSG_CANT_OPEN
; CALL MESSAGE
; SCF
; RET
;CLOSE_FILE
; LD A,(FILEHND)
; LD C,Dss.CLOSE
; RST ToDSS
; RET
INIT: XOR A
LD (STOPMODE),A
DEC A
LD (CDDRIVE),A
;
LD BC,+(#C0-1)*256 + BIOS.DRV_DETECT
.loop: INC B
LD A,B
CP #C4
SCF
RET Z
PUSH BC
RST ToBIOS
POP BC
JR C,.loop
LD A,B
LD (CDDRIVE),A
RET
;
; LD C,BIOS.DRV_RESET
; JP ToBIOS
; RET
;VARIABLES
; FILENAME DS 256
; FILEHND DB #FF
STOPMODE DB #00
INCLUDE "cmdparse.asm"
INCLUDE "command.asm"
INCLUDE "cd_dos.asm"
CRLF: PUSH HL
LD HL,MSG0.crlf
LD C,Dss.PChars
; LD A,#0D
; LD C,Dss.PutChar
; RST #10
; LD A,#0A
; LD C,Dss.PutChar
RST ToDSS
POP HL
RET
;
ERROR CP MAX_DSS_ERR
LD E,A
LD D,0
JP C,ERR_MSG
LD E,D
JP ERR_MSG
ERR_MSG PUSH DE
LD HL,ERRCDX
CALL PRINTZ
POP DE
CALL FMESAGE
CALL PRINTZ
CALL CRLF
JP CRLF
FMESAGE INC DE
LD HL,SYS_ERRORS
LD BC,SYS_ERRORS.Size
LCPIR XOR A
CPIR
RET PO
RET NZ
DEC DE
LD A,D
OR E
JP NZ,LCPIR
RET
MAX_DSS_ERR EQU 33
ERRCDX DB "CDX: ",0
include 'Shared_includes/constants/dss_errors.z80'
; ERR0 DB #00
; DB "Unknown error",0
; DB "Invalid function",0
; DB "Invalid drive number",0
; DB "File not found",0
; DB "Path not found",0
; DB "Invalid handle",0
; DB "Extended error 6",0
; DB "File exist",0
; DB "File read only",0
; DB "Root overflow",0
; DB "No free space",0
; DB "Directory not empty",0
; DB "Can't delete current directory",0
; DB "Invalid media",0
; DB "Unknown operation",0 ;R02
; DB "Directory exist",0
; DB "Invalid filename",0
; DB "Invalid EXE-file",0
; DB "Not supported EXE-file",0
; DB "Access denied",0
; DB "Not ready",0
; DB "Seek error",0
; DB "Sector not found",0
; DB "CRC error",0
; DB "Write protect",0
; DB "Read error",0
; DB "Write error",0
; DB "Drive failure",0
; DB "Extended error 28",0
; DB "Extended error 29",0
; DB "No free memory",0
; DB "Invalid memory block",0
; DB "Extended error 32",0
; DB "Extended error 33",0
; DB "Extended error 34",0
; DB "35",0
; DB "36",0
; DB "37",0
; DB "38",0
; DB "39",0
; DB "40",0
; DB "41",0
; DB "42",0
; DB "43",0
; DB "44",0
; DB "45",0
; DB "46",0
; DB "47",0
; DB "48",0
; DB "49",0
; DB "50"
; DB 0
; ERR1
;FIND_MESSAGE
; LD E,A
; LD D,0
; CALL MESAGE
; RET
MESSAGE LD E,A
LD D,0
CALL MESAGE
JP PRINTZ
;
MESAGE INC DE
LD HL,MSG0
LD BC,MSG1-MSG0
LCPIR2 XOR A
CPIR
RET PO
RET NZ
DEC DE
LD A,D
OR E
JP NZ,LCPIR2
RET
PRINTZ LD A,(HL)
INC HL
OR A
RET Z
CP "%"
JR NZ,PRINTZ2
LD A,(HL)
INC HL
SUB "1"
PUSH HL
LD L,A
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD BC,PRM1
ADD HL,BC
LD C,Dss.PChars
RST ToDSS
POP HL
JR PRINTZ
PRINTZ2 LD C,Dss.PutChar
RST ToDSS
JP PRINTZ
PRINT_ LD BC,1*256 + BIOS.LP_PRINT_SYM
JP ToBIOS
PUTVAR LD DE,PRM1
PUTPRM LD BC,15
PUTPRMA LD A,(HL)
LDI
RET PO
OR A
JR NZ,PUTPRMA
RET
CDDRIVE DB #FF
PRM1 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PRM2 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PRM3 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PRM4 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PRM5 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PRM6 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PRM7 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PRM8 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
PRM9 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
MSG_HELLO EQU 0
MSG_TRAY_OPEN EQU 1
MSG_TRAY_CLOSE EQU 2
MSG_USAGE EQU 3
MSG_UNK_DEVICE_NUMBER EQU 4
MSG_UNK_COMMAND EQU 5
;MSG_DISABLED EQU 6
;MSG_ENABLED EQU 7
MSG_DONE EQU 6 ;8
MSG_NO_CDROM EQU 7 ;9
MSG_IO_ERROR EQU 8 ;10
MSG_OLD_DSS EQU 9 ;11
MSG_COPYFILE EQU 10 ;12
MSG_DIRHEAD EQU 11 ;13
MSG_DIRENTRY EQU 12 ;14
MSG_MEMERROR EQU 13 ;15
MSG_COPYTO EQU 14 ;16
MSG_CD_READ_ERR EQU 15 ;17
MSG_F_WRITE_ERR EQU 16 ;18
MSG_FAILURE EQU 17 ;19
MSG_ERR_DEST EQU 18 ;20
MSG_COPYABORTED EQU 19 ;21
MSG0 BYTE 0
;0
BYTE "CDROM eXtension utility v1.01, 2023 (c) Sprinter Team",CR,LF
DZ "Type CDX.EXE -? for help.",CR,LF,CR,LF
;1
DZ "Opening tray..."
;2
DZ "Closing tray..."
; 01234567890123456789012345678901234567890123456789012345678901234567890123456789
;3
BYTE ' Usage: CDX.EXE [-switches] [command] [param1] [param2]',CR,LF,CR,LF
BYTE 'Commands:',CR,LF
BYTE ' CDX.EXE OPEN - Open tray',CR,LF
BYTE ' CDX.EXE CLOSE - Close tray',CR,LF
BYTE ' CDX.EXE LIST [\cd_path\][pattern] - Show CDROM filelist',CR,LF
BYTE ' CDX.EXE COPY \source d:\destination\ - Copy file(s) from CDROM to another disk',CR,LF
BYTE ' CDX.EXE DUMP sector [offset] - Show sector dump from CDROM',CR,LF
BYTE CR,LF
BYTE 'Switches:',CR,LF
BYTE ' -1 CDROM installed as Primary IDE Master device',CR,LF
BYTE ' -2 CDROM installed as Primary IDE Slave device',CR,LF
BYTE ' -3 CDROM installed as Secondary IDE Master device',CR,LF
BYTE ' -4 CDROM installed as Secondary IDE Slave device',CR,LF
DZ ' -h,? Help page',CR,LF
;4
DZ " Error: Unknown device number %1",CR,LF
;5
DZ " Error: Unknown command: %1",CR,LF
;6
;DZ "Disabled"
;7
;DZ "Enabled"
;6
DZ "Done!",CR,LF
;7
DZ " Error: Can't find CDROM device %1",CR,LF
;8
DZ " Error: I/O Error",CR,LF
;9
DZ " Error: Need DSS version 1.70 or higher",CR,LF
;10
DZ "Copying "
;11
DZ "Directory of CDROM:"
;12 FILENAME EXT SIZE DATE TIME
DZ "%1 %2 %3 %4 %5",CR,LF
;13
DZ " Error: Memory allocation error",CR,LF
;14
DZ " to "
;15
DZ " Error: Reading failure",CR,LF
;16
DZ " Error: Writing failure",CR,LF
;17
DZ "Failure!",CR,LF
;18
DZ " Error: Can't open destination file",CR,LF
;19
DZ "Copying aborted",CR,LF
;20
.crlf: DZ CR,LF
;21
BYTE 0
MSG1
BUF_PTRS
DW BUF1,BUF2,BUF3,BUF4,0
;-------------------------------/BUFFERS\-------------------------------;
FF_STRUCT:
DB "12345678"
DB "123"
DB #00
DW 0,0,0,0
CDFPOSH DW 0 ;CLUSTER HIGH
CDFTIME DW 0 ;TIME
CDFDATE DW 0 ;DATE
CDFPOSL DW 0 ;CLUSTER
CDFSIZE DW 0,0 ;SIZE
CDFATTR DB #00 ;ATTR
CDFNAME DB "12345678123",0
;
BUFFERS_START EQU $
;DS 256-($-FF_STRUCT)
DIRSPEC: EQU FF_STRUCT+256
;DB '\',0
;DS 254
BUF1 EQU DIRSPEC+256
BUF2 EQU DIRSPEC+256+256
BUF3 EQU DIRSPEC+256+256+256
BUF4 EQU DIRSPEC+256+256+256+256
ARGCBUF EQU DIRSPEC+256+256+256+256+256
DUMPBUF EQU DIRSPEC+256+256+256+256+256+256
BUFFERS_END EQU DUMPBUF+2048-BUFFERS_START
;
BUFERS_NUMBER EQU 6
;
ASSERT (DUMPBUF+2048 < #C000), "NO FREE SPACE FOR BUFFERS"
;-----------------------------------------------------------------------;
DEV_CFG
;[END]

View File

@ -0,0 +1,7 @@
CDROM eXtension utility version 1.01
------------------------------------------------
It's utility came for solving the problem with support CDROM in DSS ver 1.x.
It's allow browse and copy files that stored on your CD. Also utility has commands
for tray control.

View File

@ -0,0 +1,89 @@
; HL - exe-prefix
; IX - pointers at work buffers
EX_COMMAND_LINE
INC HL
NEXTPR LD DE,ARGCBUF
LD BC,Dss.EX_Path.GSWITCH
RST ToDSS
PUSH AF
PUSH HL
LD A,(ARGCBUF)
OR A
JR Z,EOCL ;end of command line
CP "-"
JR Z,ITCKEY
CP "/"
JR Z,ITCKEY
LD HL,ARGCBUF
LD E,(IX+0)
LD D,(IX+1)
INC IX
INC IX
LD A,D
OR E
JR Z,CL_FAILURE
; LD A,1
; LD (NAME_FLG),A
MOVNAME LD A,(HL)
LDI
OR A
JR NZ,MOVNAME
EOCL POP HL
POP AF
JR NC,NEXTPR
RET
CL_FAILURE
POP HL
POP AF
RET
ITCKEY: LD A,(ARGCBUF+1)
CP "5"
JR NC,.HELP
CP "1"
JR NC,.number
; ERROR
LD HL,ARGCBUF+1
CALL PUTVAR
LD A,MSG_UNK_DEVICE_NUMBER
CALL MESSAGE
LD A,1
LD (STOPMODE),A
JR EOCL
;
.number:;
SUB A,'1'
OR #C0
LD (CDDRIVE),A
LD C,BIOS.DRV_RESET
RST ToBIOS
JR NC,EOCL
;
LD HL,ARGCBUF+1
CALL PUTVAR
LD A,MSG_NO_CDROM
CALL MESSAGE
LD A,1
LD (STOPMODE),A
SCF
JR CL_FAILURE
;
.HELP: LD A,MSG_USAGE
CALL MESSAGE
LD A,1
LD (STOPMODE),A
JR EOCL
; MAS_CD:
; ;LD A,MASTER
; ;LD (CDDRIVE),A
; JR EOCL
; SLA_CD:
; ;LD A,SLAVE
; ;LD (CDDRIVE),A
; JR EOCL

View File

@ -0,0 +1,942 @@
COMMAND LD HL,BUF1
LD A,(HL)
OR A
RET Z
DEC HL
SKIPSP INC HL
LD A,(HL)
CP 9
JR Z,SKIPSP
CP " "
JR Z,SKIPSP
COMP01 LD D,H
LD E,L
XOR A
LD BC,255
CPIR
LD A,254
SUB C
LD C,A
LD HL,CMDLIST
COMP004 PUSH BC
PUSH DE
COMP000 LD A,(DE)
CP #61
JP C,COMP001
CP #7B
JP NC,COMP001
SUB #20
COMP001 CP (HL)
JP NZ,COMP002
INC HL
INC DE
DEC C
JP NZ,COMP000
XOR A
CP (HL)
JP NZ,COMP002
POP BC
POP BC
LD A,(DE)
CP " "
JR NZ,NOSPC
INC DE
NOSPC INC HL
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
JP (HL)
COMP002 XOR A
LD C,#FF
CPI
JP NZ,$-2
INC HL
INC HL
POP DE
POP BC
LD A,(HL)
OR A
JP NZ,COMP004
LD HL,BUF1
CALL PUTVAR
LD A,MSG_UNK_COMMAND
CALL MESSAGE
SCF
RET
CMDLIST DB "CLOSE",0
DW CCLOSE
DB "COPY",0
DW CCOPY
DB "DUMP",0
DW CDUMP
DB "EJECT",0
DW COPEN
DB "HELP",0
DW CHELP
DB "LIST",0
DW CDIR
DB "OPEN",0
DW COPEN
DB "SECTORDUMP",0
DW CDUMP
DB 0
CHELP: LD A,MSG_USAGE
JP MESSAGE
CCLOSE: LD A,MSG_TRAY_CLOSE
CALL MESSAGE
LD A,(CDDRIVE)
LD BC,BIOS.DRV_EXTENDED.CD_Close
RST ToBIOS
LD A,MSG_DONE
JP MESSAGE
COPEN: LD A,MSG_TRAY_OPEN
CALL MESSAGE
LD A,(CDDRIVE)
LD BC,BIOS.DRV_EXTENDED.CD_Eject
RST ToBIOS
LD A,MSG_DONE
JP MESSAGE
CCOPY: CALL CHANGEDISK
JR NC,.CH2OK
JP ERROR
.CH2OK: CALL EX_COPY_PARAM
LD HL,BUF2
LD DE,FF_STRUCT
LD A,FAT_ATTR.NoDIRnoVolID
LD B,1
CALL F_FIRST
JP C,ERROR
.COPIER:
CALL MAKECOPY
RET C
LD A,(COPYMODE)
BIT DSTFILE,A
RET NZ
;
LD C,Dss.ScanKey
RST ToDSS
JR Z,.NONSTOP
LD HL,#011B ;ESC
AND A
SBC HL,DE
JR NZ,.NONSTOP
LD A,MSG_COPYABORTED
CALL MESSAGE
SCF
RET
.NONSTOP:
LD DE,FF_STRUCT
CALL F_NEXT
JR NC,.COPIER
XOR A
RET
; IFNOTFOUND
; CALL ERROR
; RET
;IFOK
MAKECOPY:
LD A,(COPYMODE)
BIT SRCPATT,A
JR NZ,.WITH_SRC_PATT
BIT DSTFILE,A
JR NZ,.WITH_DST_FILE
.WITH_SRC_PATT:
LD HL,CDFNAME
.YCR1: LD A,(HL)
CP "A"
JR C,.NCR1
CP "Z"+1
JR NC,.NCR1
ADD A,#20
LD (HL),A
.NCR1: OR A
INC HL
JR NZ,.YCR1
;
LD HL,CDFNAME
LD DE,(SRC_PUT_ADR)
.CZSL2: LD A,(HL)
LDI
OR A
JR NZ,.CZSL2
;
LD A,(COPYMODE)
BIT DSTFILE,A
JR NZ,.WITH_DST_FILE
;
LD HL,CDFNAME
LD DE,(DST_PUT_ADR)
.CZSL1: LD A,(HL)
LDI
OR A
JR NZ,.CZSL1
;
.WITH_DST_FILE:
LD HL,BUF3
LD A,(CDFATTR)
LD C,Dss.Create
RST ToDSS
JR NC,.OFOK
LD A,MSG_ERR_DEST
CALL MESSAGE
SCF
RET
;
.OFOK: LD (FHND),A
LD A,MSG_COPYFILE
CALL MESSAGE
LD HL,BUF2
LD C,Dss.PChars
RST ToDSS
LD A,MSG_COPYTO
CALL MESSAGE
LD HL,BUF3
LD C,Dss.PChars
RST ToDSS
LD A," "
LD C,Dss.PutChar
RST ToDSS
LD IX,FF_STRUCT
LD E,(IX+LEN1)
LD D,(IX+LEN2)
LD (CL_SIZE),DE
LD E,(IX+LEN3)
LD D,(IX+LEN4)
LD (CH_SIZE),DE
LD E,(IX+CLU1)
LD D,(IX+CLU2)
LD (CL_OFFSET),DE
LD E,(IX+CLU3)
LD D,(IX+CLU4)
LD (CH_OFFSET),DE
.CDCOPY_LOOP:
CALL RCDFSB ;!!!!!
JR C,.COPY_FAULT
CALL WDATAB
JR C,.COPY_FAULT
JR NZ,.CDCOPY_LOOP
;
LD DE,(CDFTIME)
LD BC,(CDFDATE)
CALL RMKTIME
LD A,(FHND)
LD C,Dss.Put_D_T ;COPY DATE AND TIME
RST ToDSS
;
LD A,(FHND)
LD C,Dss.Close
RST ToDSS
LD A,MSG_DONE
CALL MESSAGE
AND A
RET
.COPY_FAULT:
LD A,(FHND)
LD C,Dss.Close
RST ToDSS
SCF
RET
EX_COPY_PARAM
LD HL,BUF2 ;SOURCE
LD BC,255
XOR A
CPIR
DEC HL
EX DE,HL
LD HL,256
AND A
SBC HL,BC
LD B,H
LD C,L
EX DE,HL
LD A,'\' ;
CPDR
INC HL
INC HL
LD (SRC_PUT_ADR),HL
;
LD HL,BUF2
LD BC,Dss.EX_Path.GET_ALL
RST ToDSS
AND #80
LD A,(COPYMODE)
SET SRCPATT,A
JR NZ,.NOPATSR
RES SRCPATT,A
.NOPATSR:
LD (COPYMODE),A
LD HL,BUF3 ;DESTINATION
LD BC,Dss.EX_Path.GET_ALL
RST ToDSS
AND #81 ;PATTERN & FILENAME
CP #01 ;IF FILENAME=1 AND PATTERN=0
LD A,(COPYMODE)
SET DSTFILE,A
JR Z,.SINGC1
RES DSTFILE,A
.SINGC1:
LD (COPYMODE),A
RET Z
LD HL,BUF3
LD BC,255
XOR A
CPIR ;MOVE TO END OF STRING
DEC HL ;MOVE TO ZERO-CHAR
DEC HL ;MOVE TO LAST CHAR
LD A,(HL) ;GET LAST CHAR
INC HL ;MOVE TO ZERO-CHAR
CP '\' ;IS IT BACKSLASH?
LD (DST_PUT_ADR),HL ;SAVE END ADDRESS
RET Z
LD A,'\' ;
LD (HL),A ;PUT BACKSLASH TO THE END OF STRING
INC HL ;MOVE TO THE NEW END OF STRING
LD (DST_PUT_ADR),HL ;SAVE END ADDRESS
LD (HL),0 ;PUT ZERO CHAR
RET
DSTFILE EQU 0 ;SPECIFIED DESTINATION FILENAME
SRCPATT EQU 3 ;SPECIFIED SOURCE PATTERN A??.*
COPYMODE DB 0
SRC_PUT_ADR DW BUF2
DST_PUT_ADR DW BUF3
CL_OFFSET DW 0
CH_OFFSET DW 0
CL_SIZE DW 0
CH_SIZE DW 0
BYTECOUNTER DW 0
WDATAB: LD DE,(BYTECOUNTER)
LD A,D
OR E
RET Z
LD HL,#C000
LD A,(FHND)
LD C,Dss.Write
RST ToDSS
JR C,.WRDERR
XOR A
INC A
RET
.WRDERR:
LD A,MSG_FAILURE
CALL MESSAGE
CALL CRLF
LD A,MSG_F_WRITE_ERR
CALL MESSAGE
XOR A
SCF
RET
RCDFSB: LD HL,(CL_SIZE)
LD DE,(CH_SIZE)
LD A,H
OR L
OR D
OR E
LD BC,0
LD (BYTECOUNTER),BC
RET Z ;SIZE = 0
AND A
LD BC,#4000 ;BLOCKSIZE
SBC HL,BC
LD B,C
EX DE,HL
SBC HL,BC
EX DE,HL
LD BC,#4000
JR NC,.RC_NOCAR
;CORRECT RESULT
ADD HL,BC
LD B,C
EX DE,HL
ADC HL,BC
EX DE,HL
LD B,H
LD C,L
LD HL,0
LD DE,0
.RC_NOCAR:
LD (CL_SIZE),HL
LD (CH_SIZE),DE
LD (BYTECOUNTER),BC
;
LD A,B
SRL B
SRL B
SRL B
AND #07
OR C
JR Z,.RC_EVEN_NUM
INC B
.RC_EVEN_NUM:
LD A,B
LD C,B
LD B,0
;
LD IX,(CL_OFFSET)
LD HL,(CH_OFFSET)
PUSH IX
PUSH HL
ADD IX,BC
LD C,B
ADC HL,BC
LD (CL_OFFSET),IX
LD (CH_OFFSET),HL
POP HL
POP IX
LD B,A
LD A,(CDDRIVE)
LD DE,#C000
LD C,BIOS.DRV_READ
RST ToBIOS
LD BC,(BYTECOUNTER)
RET NC
LD A,MSG_FAILURE
CALL MESSAGE
CALL CRLF
LD A,MSG_CD_READ_ERR
CALL MESSAGE
SCF
RET
FHND DB #FF
;----------------------
CDIR: CALL CHANGEDISK
JP C,ERROR
LD HL,BUF2
LD A,(HL)
OR A
JR NZ,.NODEFD
LD HL,DEFDIR
JR .PATPRESNT
.NODEFD:
LD BC,Dss.EX_Path.GET_ALL
RST ToDSS
BIT 7,A ;PATTERN
LD HL,BUF2
JR NZ,.PATPRESNT
;
LD BC,255
XOR A
CPIR ;MOVE TO END OF STRING
DEC HL ;MOVE TO ZERO-CHAR
DEC HL ;MOVE TO LAST CHAR
LD A,(HL) ;GET LAST CHAR
INC HL ;MOVE TO ZERO-CHAR
CP '\' ;IS IT BACKSLASH?
JR Z,.WITHSL9
LD A,'\' ;
LD (HL),A ;PUT BACKSLASH TO THE END OF STRING
INC HL ;MOVE TO THE NEW END OF STRING
.WITHSL9:
LD A,"*"
LD (HL),A
INC HL
LD (HL),"."
INC HL
LD (HL),A
INC HL
LD (HL),0
LD HL,BUF2
.PATPRESNT
LD DE,FF_STRUCT
LD A,FAT_ATTR.NoVolID
LD B,0
CALL F_FIRST
JP C,ERROR
.CDIR_HEAD:
LD A,MSG_DIRHEAD
CALL MESSAGE
LD HL,DIRSPEC
LD C,Dss.PChars
RST ToDSS
CALL CRLF
CALL CRLF
.CDIR_LOOP:
LD HL,CDFNAME
CALL PNAME
LD DE,FF_STRUCT
CALL F_NEXT
JR NC,.CDIR_LOOP
RET
; FF_STRUCT
; DB "12345678"
; DB "123"
; DB #00
; DW 0,0,0,0
; CDFPOSH DW 0 ;CLUSTER HIGH
; CDFTIME DW 0 ;TIME
; CDFDATE DW 0 ;DATE
; CDFPOSL DW 0 ;CLUSTER
; CDFSIZE DW 0,0 ;SIZE
; CDFATTR DB #00 ;ATTR
; CDFNAME DB "12345678123",0
; ; DS 44
; DS 256-($-FF_STRUCT)
PNAME LD BC,8
LD DE,PRM1
LDIR
XOR A
LD (DE),A
LD DE,PRM2
LDI
LDI
LDI
LD (DE),A
LD IX,FF_STRUCT
CALL PRNSIZE
CALL PRNDATE
CALL PRNTIME
LD A,MSG_DIRENTRY
JP MESSAGE
PRNDATE LD B,(IX+25)
LD C,(IX+24)
LD HL,SIZEBFF
CALL DATE
LD (HL),0
LD HL,SIZEBFF
LD DE,PRM4
LD A,(HL)
CP "0"
JP NZ,PUTPRM
LD (HL),#20
JP PUTPRM
PRNTIME LD B,(IX+22)
LD C,(IX+23)
LD HL,SIZEBFF
CALL TIME
LD (HL),0
LD HL,SIZEBFF
LD DE,PRM5
LD A,(HL)
CP "0"
JP NZ,PUTPRM
LD (HL),#20
JP PUTPRM
TIME: SRL C
RR B
SRL C
RR B
SRL C
RR B
SRL B
SRL B
LD A,C
CALL NUMB
LD (HL),":"
INC HL
LD A,B
JP NUMB
DATE: LD A,C
AND #1F
PUSH BC
CALL NUMB
LD (HL),"."
INC HL
POP BC
LD A,C
SRL B
RLA
RLA
RLA
RLA
AND #0F
CALL NUMB
LD (HL),"."
INC HL
LD A,B
ADD A,#50
CP 100
JP C,NUMB
.SUB100:
SUB 100
CP 100
JP C,NUMB
JR .SUB100
NUMB: LD C,#2F
.NUMB1: INC C
SUB 10
JP NC,.NUMB1
ADD A,10
ADD A,#30
LD (HL),C
INC HL
LD (HL),A
INC HL
RET
PRNSIZE LD A,(IX+32)
LD HL,DIRIDD
AND #10
JP NZ,.PRZ
LD L,(IX+28)
LD H,(IX+29)
EXX
LD L,(IX+30)
LD H,(IX+31)
EXX
PUSH IX
CALL MAKE_LN
LD HL,L32BIT_+9
LD A,(HL)
CP #20
JR NZ,.ALR
LD A,#30
LD (HL),A
.ALR: LD DE,SIZEBFF
LD HL,L32BIT_;; +1
LDI
LD A," "
LD (DE),A
INC DE
LDI
LDI
LDI
LD (DE),A
INC DE
LDI
LDI
LDI
LD (DE),A
INC DE
LDI
LDI
LDI
LD HL,SIZEBFF
POP IX
.PRZ: LD DE,PRM3
JP PUTPRM
MAKE_LN:
LD IX,L32BIT_
EXX
LD DE,#3B9A ; 1000000000
EXX
LD DE,#CA00
CALL GET_DIG
EXX
LD DE,#05F5 ; 100000000
EXX
LD DE,#E100
CALL GET_DIG
EXX
LD DE,#0098 ; 10000000
EXX
LD DE,#9680
CALL GET_DIG
EXX
LD DE,#000F ; 1000000
EXX
LD DE,#4240
CALL GET_DIG
EXX
LD DE,#0001 ; 100000
EXX
LD DE,#86A0
CALL GET_DIG
EXX
LD DE,#0000 ; 10000
EXX
LD DE,#2710
CALL GET_DIG
EXX
LD DE,#0000 ; 1000
EXX
LD DE,#03E8
CALL GET_DIG
EXX
LD DE,#0000 ; 100
EXX
LD DE,#0064
CALL GET_DIG
EXX
LD DE,#0000 ; 10
EXX
LD DE,#000A
CALL GET_DIG
LD A,L ; 1
ADD A,#30
LD (IX+0),A
INC IX
LD HL,L32BIT_
LD DE,#2030
;
.KILLZ: LD A,(HL)
CP E
JR NZ,.KILLZ2
LD (HL),D
INC HL
JP .KILLZ
.KILLZ2:
LD HL,L32BIT_+9
LD A,(HL)
CP D
RET NZ
LD (HL),E
RET
; HL:HL - DE:DE
GET_DIG:
XOR A
.INC_DG:
INC A
SBC HL,DE
EXX
SBC HL,DE
EXX
JP NC,.INC_DG
ADD HL,DE
EXX
ADC HL,DE
EXX
DEC A
ADD A,#30
LD (IX+0),A
INC IX
RET
L32BIT_ DB "0000000000"
DIRIDD DB "<DIR> ",0
SIZEBFF DB "0 000 000 000",0,0
DEFDIR DB #5C,"*.*",0
;------------------------
CDUMP: LD HL,BUF2
LD BC,#0000
CALL GETNUM
; LD XL,C
; LD XH,0
; LD HL,0
LD A,(CDDRIVE)
LD DE,DUMPBUF
LD BC,1*256 + BIOS.DRV_READ
RST ToBIOS
JR C,.DMPERR
;
LD HL,BUF3
CALL GETNUM
PUSH IX
POP BC
LD A,B
AND #07
LD B,A
LD HL,2048-#01C0
AND A
SBC HL,BC
JR NC,.GOODOFFS
LD BC,2048-#01C0
.GOODOFFS:
LD HL,DUMPBUF
ADD HL,BC
;
CALL DUMP
JP CRLF
.DMPERR:
LD A,MSG_IO_ERROR
JP MESSAGE
;
GETNUM: EXX
LD IX,0
LD HL,0
EXX
.GETNUM0:
LD A,(HL)
OR A
JR Z,.EGETN
INC HL
CP "0"
JR C,.GETNUM0
CP "9"+1
JR NC,.GETNUM0
SUB "0"
;
EXX
PUSH IX ;
PUSH HL
POP DE
POP BC ;LD DE:BC,HL:IX
;
ADD IX,IX
ADC HL,HL ;x2
ADD IX,IX
ADC HL,HL ;x4
ADD IX,BC
ADC HL,DE ;x5
ADD IX,IX
ADC HL,HL ;x10
;
LD C,A
LD B,0
ADD IX,BC
LD C,B
ADC HL,BC
EXX
JR .GETNUM0
.EGETN: EXX
;PUSH IX
PUSH HL
EXX
POP HL
;POP IX
RET
;;;;;;;;;;;;;;;
; LD A,(HL)
; OR A
; RET Z
; INC HL
; CP "0"
; JR C,GETNUM
; CP "9"+1
; JR NC,GETNUM
; SUB "0"
; LD B,A
;
; LD A,C
; ADD A,A
; ADD A,A
; ADD A,C
; ADD A,A
;
; ADD A,B
; LD C,A
; JR GETNUM
;;;;;;;;;;;;;;;;
UPDUMP: BYTE " +00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF ",CR,LF
DZ " -------------------------------------------------- +----------------+"
DUMP: PUSH HL
LD HL,UPDUMP
LD C,Dss.PChars
RST ToDSS
POP HL
LD BC,#1C00
.L1: PUSH BC
PUSH BC
CALL CRLF
;
LD DE,DUMPBUF
AND A
SBC HL,DE
LD A,L
PUSH AF
LD A,H
ADD HL,DE
;
CALL PHEX
POP AF
CALL PHEX
LD A,":"
CALL PRNCHAR
LD A," "
CALL PRNCHAR
LD A," "
CALL PRNCHAR
POP BC
PUSH HL
;
LD B,#08
.L2: PUSH BC
LD A,(HL)
INC HL
CALL PHEX
LD A," "
CALL PRNCHAR
POP BC
INC C
DJNZ .L2
;
LD A," "
CALL PRNCHAR
;
LD B,#08
.L2_00: PUSH BC
LD A,(HL)
INC HL
CALL PHEX
LD A," "
CALL PRNCHAR
POP BC
INC C
DJNZ .L2_00
;
LD A," "
CALL PRNCHAR
;
LD A,"|"
CALL PRNCHAR
POP HL
LD B,#10
.LLL: LD A,(HL)
INC HL
PUSH BC
CALL PRINT_
POP BC
DJNZ .LLL
LD A,"|"
CALL PRNCHAR
;
LD A,C
POP BC
LD C,A
DJNZ .L1
RET
PHEX: LD E,A
RRCA
RRCA
RRCA
RRCA
AND #0F
ADD A,#30
CP #3A
JR C,.PHEX2
ADD A,7
.PHEX2: CALL PRINT_
LD A,E
AND #0F
ADD A,#30
CP #3A
JR C,.PHEX3
ADD A,7
.PHEX3: CALL PRINT_
RET
PRNCHAR:
LD C,Dss.PutChar
JP ToDSS
;

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,525 @@
NAM EQU 0
EXT EQU 8
ATR EQU 11
CLU3 EQU 20
CLU4 EQU 21
TIM1 EQU 22
TIM2 EQU 23
DAT1 EQU 24
DAT2 EQU 25
CLU1 EQU 26
CLU2 EQU 27
LEN1 EQU 28
LEN2 EQU 29
LEN3 EQU 30
LEN4 EQU 31
POS1 EQU 32
POS2 EQU 33
POS3 EQU 34
POS4 EQU 35
DIRCLU1 EQU 36
DIRCLU2 EQU 37
HND1 EQU 38
HND2 EQU 39
FDRV EQU 40
AMODE EQU 41
FTASK EQU 42
DIR EQU #C000
DIRPAGE EQU 0
;ACCESS MODE:
; 00 - READ/WRITE
; 01 - READ
; 02 - WRITE
;File Manipulator (FM)
FM_BUF DEFB ". " ;+00 NAME
DEFB " " ;+08 EXT
DEFB #10 ;+11 ATTRIBUT
DEFB 0,0,0,0,0,0,0,0,0,0 ;+12 RESERVED
DEFW #0000 ;+22 TIME
DEFW #0000 ;+24 DATE
DEFW #0000 ;+26 START CLUSTER
DEFW #0000,#0000 ;+28 SIZE FILE
DEFW #0000,#0000 ;+32 FILE POSITION (FP)
DEFW #0000 ;+36 DIRECTORY CLUSTER
DEFW #0000 ;+38 HANDLE NUMBER
DEFB #00 ;+40 DRIVE OR CURRENT
DEFB #00 ;+41 ACCESS MODE
DEFB #00 ;+42 TASK
DEFB #00 ;+43 EMPTY
END_FM
;End of FM
DEFS 44*1,0
FM_SIZE EQU END_FM-FM_BUF
SET_FM PUSH DE
INC A
LD IY,FM_BUF-FM_SIZE
LD DE,FM_SIZE
SET_FM1 ADD IY,DE
DEC A
JR NZ,SET_FM1
POP DE
LD A,(IY+0)
OR A
LD A,0
RET NZ
LD A,5
SCF
RET
; HL:IX - OFFSET POINTER
; A - FILE MANIPULATOR
MOVE_FP CALL SET_FM
RET C
INC B
DEC B
JP Z,MOVE_FA
DEC B
JP Z,MOVE_FB
DEC B
JP Z,MOVE_FC
LD A,1
SCF
RET
;from Start File
MOVE_FA LD BC,0
LD DE,0
JR MOVE_F1
;from End File
MOVE_FC LD C,(IY+28)
LD B,(IY+29)
LD E,(IY+30)
LD D,(IY+31)
JR MOVE_F1
;from Current Position
MOVE_FB LD C,(IY+32)
LD B,(IY+33)
LD E,(IY+34)
LD D,(IY+35)
MOVE_F1 ADD IX,BC
ADC HL,DE
LD D,HX
LD E,LX
LD (IY+32),E
LD (IY+33),D
LD (IY+34),L
LD (IY+35),H
XOR A
RET
;FP COMPARE
; CY - FILE POINTER > SIZE
; NC - FILE POINTER < SIZE
MOVE_CP LD L,(IY+28)
LD H,(IY+29)
LD E,(IY+32)
LD D,(IY+33)
AND A
SBC HL,DE
LD L,(IY+30)
LD H,(IY+31)
LD E,(IY+34)
LD D,(IY+35)
SBC HL,DE
RET
INITDISK
LD B,4
CD_I_LP PUSH BC
LD DE,DIR
LD HL,#0000
LD IX,#0010
LD BC,#0105
; LD A,(DRIVE)
CALL CDCMD
; RST #18
POP BC
JR NC,CD_I_OK
DJNZ CD_I_LP
UNKCD SCF
RET
CD_I_OK LD HL,DIR
LD A,(HL)
INC HL
CP #01
JR NZ,UNKCD
LD A,(HL)
INC HL
CP "C"
JR NZ,UNKCD
LD A,(HL)
INC HL
CP "D"
JR NZ,UNKCD
LD HL,DIR+#009E
LD DE,ROOTDIR
LDI
LDI
LDI
LDI
LD HL,DIR+#00A6
LD DE,ROOTLEN
LDI
LDI
LDI
LDI
; POP AF
; OUT (PAGE3),A
; LD HL,0
; LD (FATCASH),HL
XOR A
RET
LOADDIR XOR A
LD A,DIRPAGE
CALL BANK
PUSH AF
LD B,3
LOADFFF PUSH BC
LD HL,#C000
LD DE,#C001
LD BC,#3FFF
LD (HL),L
LDIR
; LD A,(DRIVE)
; LD (IY+FDRV),A
;; LD C,(IY+LEN1)
LD C,(IY+LEN2)
LD B,(IY+LEN3)
LD E,(IY+LEN4)
LD D,0
SRL D
RR E
RR B
RR C
SRL D
RR E
RR B
RR C
SRL D
RR E
RR B
RR C
LD E,(IY+CLU1)
LD D,(IY+CLU2)
LD L,(IY+CLU3)
LD H,(IY+CLU4)
LD HX,D
LD LX,E
LD B,C
LD A,B
OR A
JR Z,ERRLEND
CP #08
JR C,NORLEND
LD B,8
NORLEND LD A,(DRIVE)
LD C,5
LD DE,DIR
CALL CDCMD
; RST #18
POP BC
JR NC,LOADMMM
DEC B
JP NZ,LOADFFF
POP AF
OUT (PAGE3),A
SCF
LD A,20
RET
ERRLEND POP BC
POP AF
OUT (PAGE3),A
SCF
LD A,20
RET
LOADMMM POP AF
OUT (PAGE3),A
CALL CORRDIR
AND A
RET
CORRDIR LD A,DIRPAGE
CALL BANK
PUSH AF
LD HL,DIR
LD DE,DIR
CORRL1 PUSH DE
LD C,(HL)
LD B,0
LD DE,ENTRYBF
LDIR
POP DE
PUSH HL
LD HL,FCDFLEN
LD C,(HL)
LD B,0
ADD HL,BC
INC HL
LD (HL),0
SBC HL,BC
PUSH DE
CALL MASK
POP HL
LD BC,11
ADD HL,BC
LD A,(FCDFLAG)
AND 2
LD A,#00 ;ATTRIBUT FILE
JR Z,CORRL0
LD A,#10 ;ATTRIBUT DIRECTORY
CORRL0 LD (HL),A
INC HL
XOR A
LD B,8
FILLCDN LD (HL),A
INC HL
DJNZ FILLCDN
LD A,(FCDSEC+2)
LD (HL),A
INC HL
LD A,(FCDSEC+3)
LD (HL),A
INC HL
LD DE,#0000 ;TIME
LD (HL),E
INC HL
LD (HL),D
INC HL
LD DE,#0000 ;DATE
LD (HL),E
INC HL
LD (HL),D
INC HL
LD DE,(FCDSEC)
LD (HL),E
INC HL
LD (HL),D
INC HL
EX DE,HL
LD HL,FCDLEN
LDI
LDI
LDI
LDI
POP HL
BIT 7,H
JR Z,CORRL2
LD A,(HL)
OR A
JP NZ,CORRL1
LD L,0
INC H
JR Z,CORRL2
LD A,(HL)
OR A
JP NZ,CORRL1
CORRL2 XOR A
LD (DE),A
LD DE,(ROOTDIR+0)
LD L,(IY+CLU1)
LD H,(IY+CLU2)
AND A
SBC HL,DE
JR NZ,CORRL6
LD DE,(ROOTDIR+2)
LD L,(IY+CLU3)
LD H,(IY+CLU4)
AND A
SBC HL,DE
JR NZ,CORRL6
LD HL,DIR
LD A,(HL)
CP " "
JR NZ,CORRL4
LD (HL),#E5
LD BC,#0020
ADD HL,BC
LD A,(HL)
CP " "
JR NZ,CORRL4
LD (HL),#E5
JR CORRL4
CORRL6 LD HL,DIR
LD A,(HL)
CP " "
JR NZ,CORRL4
LD (HL),"."
LD BC,#0020
ADD HL,BC
LD A,(HL)
CP " "
JR NZ,CORRL4
LD (HL),"."
INC HL
LD (HL),"."
CORRL4 POP AF
OUT (PAGE3),A
AND A
RET
ENTRYBF
DEFB #00 ;Entry lenght
DEFB #00 ;XAR in LBN
FCDSEC DEFW #00,#00 ;Start sector (Intel)
DEFW #00,#00 ;Start sector (Motorola)
FCDLEN DEFW #00,#00 ;Lenght file (Intel)
DEFW #00,#00 ;Lenght file (Motorola)
FCDYEAR DEFB #00 ;Year
FCDMOUN DEFB #00 ;Month
FCDDAY DEFB #00 ;Day
FCDHOUR DEFB #00 ;Hour
FCDMIN DEFB #00 ;Minute
FCDSECN DEFB #00 ;Second
DEFB #00 ;Reserve
FCDFLAG DEFB #00 ;Flag
DEFB #00 ;Interlive size
DEFB #00 ;Interlive skip factor
DEFW #0000 ;Volume Set Sequence (Intel)
DEFW #0000 ;Volume Set Sequence (Motorola)
FCDFLEN DEFB #00
DEFSA EQU $-ENTRYBF
FCDNAME DEFS #100-DEFSA
ROOTDIR DEFW 0,0
ROOTLEN DEFW 0,0
DIRSIZE DEFW 0
BANK LD C,A
LD B,0
LD HL,BANKTBL
ADD HL,BC
IN A,(PAGE3)
LD C,PAGE3
OUTI
RET
BANKTBL DEFB #FF,#FF,#FF,#FF,#FF,#FF,#FF,#FF
DEFB #FF,#FF,#FF,#FF,#FF,#FF,#FF,#FF
HANDTA DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
MASKARE
DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
; HL - MASK "file*.t??"
; DE - 11 bytes filename
; RET: C=2 FILE WITHOUT EXTENTION
; C=1 FILE WITH EXTENTION
MASK PUSH HL
PUSH DE
LD H,D
LD L,E
INC DE
LD (HL),#20
LD BC,10
LDIR
POP DE
POP HL
LD A,(HL)
CP #21
RET C
LD BC,#0902
MASK1 LD A,(HL)
CP #21
CCF
RET NC
CP #22
JR Z,MASK7
CP "*"
JR Z,MASK3
CP "+"
JR Z,MASK7
CP ","
JR Z,MASK7
CP "."
JR Z,MASK5
CP "/"
JR Z,MASK7
CP ":"
JR Z,MASK7
CP ";"
JR Z,MASK7
CP "<"
JR Z,MASK7
CP "="
JR Z,MASK7
CP ">"
JR Z,MASK7
CP "["
JR Z,MASK7
CP '\' ;
JR Z,MASK7
CP "]"
JR Z,MASK7
CP "|"
JR Z,MASK7
CP "a"
JR C,MASK2
CP "{"
JR NC,MASK2
SUB #20
MASK2 LD (DE),A
INC HL
INC DE
DJNZ MASK1
MASK7 LD A,16
SCF
RET
MASK3 LD A,"?"
INC HL
DJNZ MASK6
LD A,16
SCF
RET
MASK6 LD (DE),A
INC DE
DJNZ MASK6
LD B,1
JR MASK1
MASK5 LD A," "
INC HL
DJNZ MASK4
LD B,4
DEC C
JP NZ,MASK1
LD A,16
SCF
RET
MASK4 LD (DE),A
INC DE
DJNZ MASK4
LD B,4
DEC C
JP NZ,MASK1
LD A,16
SCF
RET

View File

@ -0,0 +1,372 @@
MASTER EQU 0
SLAVE EQU 1
;========================================================
R170 EQU #0050 ;Data
R171 EQU #0051 ;Error
R172 EQU #0052 ;Direct
R173 EQU #0053 ;Reserve
R174 EQU #0054 ;Lenght block low
R175 EQU #0055 ;Lenght block high
R176 EQU #4052 ;Drive device
R177 EQU #4053 ;Status
W170 EQU #0150 ;Data
W171 EQU #0151 ;????
W172 EQU #0152 ;????
W173 EQU #0153 ;Reserve
W174 EQU #0154 ;Lenght block low
W175 EQU #0155 ;Lenght block high
W176 EQU #4152 ;Drive device
W177 EQU #4153 ;Command
BSY EQU 7
DRQ EQU 3
ERR EQU 0
;-----------------------------------------------------------------------;
SIZESEC: DW #0800
PKTSIZE: DB 12
;-----------------------------------------------------------------------;
CDCMD BIT 7,C
JP NZ,EXTCD
INC C
DEC C
JP Z,RESETCD ; 0
DEC C
JP Z,RESETCD ; 1
DEC C
JP Z,NOPCDC ; 2
DEC C
JP Z,CHEK_C ; 3
DEC C
JP Z,GBPB_C ; 4 ; [ ] ¯¥à¥­¥á⨠¢ DSS
DEC C
JP Z,READC ; 5
DEC C
JP Z,NOPCDC ; 6
NOPCDC LD A,1
SCF
RET
EXTCD RES 7,C
INC C
DEC C
JP Z,NOPCDC
DEC C
JP Z,OPENC
DEC C
JP Z,CLOSC
JP NOPCDC
RESETCD LD B,50
RESECD PUSH BC
LD A,(CDDRIVE)
CALL CD_TEST
POP BC
RET NC
OR A
RET Z
EI
HALT
DJNZ RESECD
RET
CHEK_C LD A,(CDDRIVE)
CALL CD_TEST
LD A,#FF
AND A
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; [ ] ¯¥à¥­¥á⨠¢ DSS
GBPB_C LD HL,CD_BPB
LD BC,#0200
LDIR
XOR A
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
READC LD A,(CDDRIVE)
JP CD_READ
OPENC LD A,(CDDRIVE)
JP CD_OPEN
CLOSC LD A,(CDDRIVE)
JP CD_CLOS
CD_TEST LD HL,CMDNOPP
LD DE,0
JP AP_COM
CD_OPEN LD HL,CMDOPEN
LD DE,0
JP AP_COM
CD_CLOS LD HL,CMDCLOS
LD DE,0
JP AP_COM
; HL:IX - SECTOR
; DE - ADDRESS
; B - SECTOR COUNT
; A - DRIVE
CD_READ:
LD C,A
LD A,H
LD (SECREAD+0),A
LD A,L
LD (SECREAD+1),A
LD A,XH
LD (SECREAD+2),A
LD A,XL
LD (SECREAD+3),A
LD A,B
LD (COUNT+1),A
LD HL,CMDREAD
LD A,C
CALL AP_COM
RET
; INPUT: HL - AP paket (12bytes)
; RETURN: CF - ERROR
; 01h - RECOVERED ERROR
; 02h - NOT READY
; 03h - MEDIUM ERROR
; 04h - HARDWARE ERROR
; 05h - ILLEGAL REQUEST
; 06h - UNIT ATTETION
; 07h - DATA PROTECT
; 0Bh - ABORTED COMMAND
; 80h - TIME OUT
AP_COM ;AND #01
;LD A,#A0 ;0
;JR Z,APCOM1
;LD A,#B0
APCOM1 ;LD BC,W176
;OUT (C),A ;SELECT DRIVE
EXX
LD DE,#8000
LD BC,R177
CALL WAITPRT
EXX
JR NC,CDREADY
LD BC,W177
LD A,#08
OUT (C),A
LD B,#80
DJNZ $
EXX
LD DE,#8000
LD BC,R177
CALL WAITPRT
EXX
RET C
CDREADY XOR A
EXX
LD BC,W171
OUT (C),A
LD DE,(SIZESEC) ;SIZE BLOCK
LD BC,W174
OUT (C),E
LD BC,W175
OUT (C),D
LD BC,W177
LD A,#A0 ;ATAPI.Packet
OUT (C),A
LD DE,#8000
LD BC,R177
CALL WAITPRT
EXX
RET C
EXX
LD DE,#0908
LD BC,R177
CALL WAITPRT
EXX
BIT ERR,A
JR NZ,CDERROR
JR NC,YEP_DRQ
LD A,#80
RET
YEP_DRQ LD BC,W170
LD A,(PKTSIZE)
SRL A
OUTPKT OUTI
OUTI
DEC A
JR NZ,OUTPKT
LD B,#80
DJNZ $
AP_LOOP EXX
LD DE,#8000
LD BC,R177
CALL WAITPRT
EXX
RET C
LD BC,R177
IN A,(C)
BIT ERR,A
JR Z,NO_ERR
CDERROR LD BC,R171 ;ERROR
IN A,(C)
RRCA
RRCA
RRCA
RRCA
AND #0F
SCF
RET
NO_ERR BIT DRQ,A
LD A,0
RET Z ;NO DATA REQUEST
EX DE,HL
LD BC,R174
IN E,(C)
LD BC,R175
IN D,(C) ;TRANSFER BLOCK SIZE
LD A,D
OR E
RET Z ;BLOCK = 0
LD BC,R172
IN A,(C)
AND #02
;CP #02
JP NZ,FROM_CD
TO_CD LD BC,R170
WR_T_CD OUTI
OUTI
DEC DE
DEC DE
LD A,D
OR E
JR NZ,WR_T_CD
EX DE,HL
JR AP_LOOP
FROM_CD LD A,H
OR L
JR Z,NULL
LD BC,R170
RD_F_CD INI
INI
DEC DE
DEC DE
LD A,D
OR E
JR NZ,RD_F_CD
EX DE,HL
JR AP_LOOP
NULL LD BC,R170
RD_N_CD IN A,(C)
DEC B
IN A,(C)
DEC B
DEC DE
DEC DE
LD A,D
OR E
JR NZ,RD_N_CD
; DE = 0 !!!
JR AP_LOOP
; E - Second * 10
PAUSE LD HL,#0000
PAUSE1 DEC L
JR NZ,PAUSE1
DEC H
JR NZ,PAUSE1
DEC E
JR NZ,PAUSE1
RET
; D - MASK
; E - PATTERN
; BC - PORT
WAITPRT LD A,100
LD HL,#0000
WAITPX EX AF,AF'
WAITP0 IN A,(C)
CP #FF
JR Z,WAITP1
AND D
CP E
JR NZ,WAITP2
AND A
RET
WAITP2 DEC L
JR NZ,WAITP0
DEC H
JR NZ,WAITP0
EX AF,AF'
DEC A
JR NZ,WAITPX
EX AF,AF'
WAITP1 SCF
RET
CMDNOPP DEFB #00
DEFB 00,00,00
DEFB #00
DEFB 00,00,00
DEFB 00,00,00
DEFB #00
CMDOPEN DEFB #1B
DEFB #00,#00,#00
DEFB #02
DEFB #00,#00,#00,#00,#00,#00,#00
CMDCLOS DEFB #1B
DEFB #00,#00,#00
DEFB #03
DEFB #00,#00,#00,#00,#00,#00,#00
;CMDREAD DEFB #28,#00
CMDREAD DEFB #28,#00
SECREAD DEFB #00,#00,#00,#00
DEFB #00
COUNT DEFB #00,#01
DEFB #00,#00,#00
; Area for boot sector [512Bytes]
CD_BPB DB #00,#00,#00 ; +00 JMP
DB " " ; +03 DOS NAME
; Block Parameters BIOS
DW #0200 ; +0B BYTE PER SECTOR
DB 4 ; +0D SECTORS PER CLUSTER
DW 1 ; +0E RESERVE SECTORS
DB 1 ; +10 AMOUNT FATS
DW 512 ; +11 FILES IN DIRECTORY
DW 0 ; +13 ALL SECTORS ON DISK
DB #F8 ; +15 ID FORMAT
DW 1 ; +16 SIZE FAT IN SECTORS
DW 63 ; +18 SECTOR PER TRACK
DW 255 ; +1A AMOUNT SIDES
DW #0010 ; +1C HIDDEN SECTORS
DS 24
DB "FAT16" ; +36 FAT ID
DS 453
; end boot sector
;========================================================

View File

@ -0,0 +1,356 @@
;CD ROM DRIVE DRIVER
;---------------------------------------------------------------
;Rev Date Name Description
;---------------------------------------------------------------
; 02-08-2001 DNS Initial this module
;---------------------------------------------------------------
;========================================================
R170 EQU #0050 ;Data
R171 EQU #0051 ;Error
R172 EQU #0052 ;Direct
R173 EQU #0053 ;Reserve
R174 EQU #0054 ;Lenght block low
R175 EQU #0055 ;Lenght block high
R176 EQU #4052 ;Drive device
R177 EQU #4053 ;Status
W170 EQU #0150 ;Data
W171 EQU #0151 ;????
W172 EQU #0152 ;????
W173 EQU #0153 ;Reserve
W174 EQU #0154 ;Lenght block low
W175 EQU #0155 ;Lenght block high
W176 EQU #4152 ;Drive device
W177 EQU #4153 ;Command
RAM_ATAPI_PK EQU #FEE0
RAM_ATAPI_READ EQU #FEF0
; BSY EQU 7
; DRQ EQU 3
; ERR EQU 0
RESETC
RESETCD LD B,50
RESECD PUSH BC
LD A,1
CALL CD_TEST
POP BC
RET NC
EI
HALT
DJNZ RESECD
RET
LREADC
READC LD A,1
JP CD_READ
OPENC LD A,1
JP CD_OPEN
CLOSC LD A,1
JP CD_CLOS
SIZESEC EQU #0800
PKTSIZE EQU 12
CD_TEST LD HL,CMDNOPP
LD DE,0
CALL AP_COM
RET
DETECTC
CD_OPEN LD HL,CMDOPEN
LD DE,0
CALL AP_COM
RET
CD_CLOS LD HL,CMDCLOS
LD DE,0
CALL AP_COM
RET
; HL:IX - SECTOR
; DE - ADDRESS
; B - SECTOR COUNT
; A - DRIVE
CD_READ LD C,A
EXX
LD C,PAGE3
IN A,(C)
PUSH AF
LD A,SYSPAGE
OUT (C),A
LD HL,CMDREAD
LD DE,RAM_ATAPI_READ
LD BC,PKTSIZE
LDIR
EXX
LD A,H
LD (RAM_ATAPI_READ+SECREAD+0),A ;R01
LD A,L
LD (RAM_ATAPI_READ+SECREAD+1),A ;R01
LD A,XH
LD (RAM_ATAPI_READ+SECREAD+2),A ;R01
LD A,XL
LD (RAM_ATAPI_READ+SECREAD+3),A ;R01
LD A,B
LD (RAM_ATAPI_READ+COUNT+1),A ;R01
POP AF
OUT (PAGE3),A
;R01 LD HL,CMDREAD
LD HL,RAM_ATAPI_READ
LD A,C
CALL AP_COM
RET
; INPUT: HL - AP paket (12bytes)
; RETURN: CF - ERROR
; 01h - RECOVERED ERROR
; 02h - NOT READY
; 03h - MEDIUM ERROR
; 04h - HARDWARE ERROR
; 05h - ILLEGAL REQUEST
; 06h - UNIT ATTETION
; 07h - DATA PROTECT
; 0Bh - ABORTED COMMAND
; 80h - TIME OUT
AP_COM AND #01
LD A,#A0
JR Z,APCOM1
LD A,#B0
APCOM1 LD BC,W176
OUT (C),A ;SELECT DRIVE
EXX
LD DE,#8000
LD BC,R177
CALL CWAITPRT
EXX
JR NC,CDREADY
LD BC,W177
LD A,#08
OUT (C),A
LD B,#00
DJNZ $
EXX
LD DE,#8000
LD BC,R177
CALL CWAITPRT
EXX
RET C
CDREADY
LD C,PAGE3
IN B,(C)
PUSH DE
PUSH BC
LD A,SYSPAGE
OUT (C),A
LD A,B
LD DE,RAM_ATAPI_PK
LD BC,PKTSIZE
LDIR
POP BC
POP DE
OUT (C),B
XOR A
EXX
OUT (C),A
XOR A
LD BC,W171
OUT (C),A
LD DE,SIZESEC ;SIZE BLOCK
LD BC,W174
OUT (C),E
LD BC,W175
OUT (C),D
LD BC,W177
LD A,#A0
OUT (C),A
LD DE,#8000
LD BC,R177
CALL CWAITPRT
EXX
RET C
EXX
IF _MAME
LD DE,#0808
ELSE
LD DE,#0908
ENDIF
LD BC,R177
CALL CWAITPRT
EXX
BIT ERR,A
JR NZ,CDERROR
JR NC,YEP_DRQ
LD A,#80
RET
YEP_DRQ LD C,PAGE3
IN B,(C)
PUSH BC
LD A,SYSPAGE
OUT (PAGE3),A
LD HL,RAM_ATAPI_PK
LD BC,W170
LD A,PKTSIZE
SRL A
OUTPKT OUTI
OUTI
DEC A
JR NZ,OUTPKT
POP BC
OUT (C),B
LD B,#80
DJNZ $
AP_LOOP EXX
LD DE,#8000
LD BC,R177
CALL CWAITPRT
EXX
RET C
LD BC,R177
IN A,(C)
BIT ERR,A
JR Z,NO_ERR
CDERROR LD BC,R171 ;ERROR
IN A,(C)
RRCA
RRCA
RRCA
RRCA
AND #0F
SCF
RET
NO_ERR BIT DRQ,A
LD A,0
RET Z ;NO DATA REQUEST
EX DE,HL
LD BC,R174
IN E,(C)
LD BC,R175
IN D,(C) ;TRANSFER BLOCK SIZE
LD A,D
OR E
RET Z ;BLOCK = 0
LD BC,R172
IN A,(C)
AND #02
CP #02
JP Z,FROM_CD
TO_CD LD BC,R170
WR_T_CD OUTI
OUTI
DEC DE
DEC DE
LD A,D
OR E
JR NZ,WR_T_CD
EX DE,HL
JR AP_LOOP
FROM_CD LD A,H
OR L
JR Z,NULL
LD BC,R170
RD_F_CD INI
INI
DEC DE
DEC DE
LD A,D
OR E
JR NZ,RD_F_CD
EX DE,HL
JR AP_LOOP
NULL LD BC,R170
RD_N_CD IN A,(C)
DEC B
IN A,(C)
DEC B
DEC DE
DEC DE
LD A,D
OR E
JR NZ,RD_N_CD
; DE = 0 !!!
JR AP_LOOP
; E - Second * 10
PAUSE LD HL,#0000
PAUSE1 DEC L
JR NZ,PAUSE1
DEC H
JR NZ,PAUSE1
DEC E
JR NZ,PAUSE1
RET
; D - MASK
; E - PATTERN
; BC - PORT
CWAITPRT
LD A,100
LD HL,#0000
CWAITPX EX AF,AF'
CWAITP0 IN A,(C)
CP #FF
JR Z,CWAITP1
AND D
CP E
JR NZ,CWAITP2
AND A
RET
CWAITP2 DEC L
JR NZ,CWAITP0
DEC H
JR NZ,CWAITP0
EX AF,AF'
DEC A
JR NZ,CWAITPX
EX AF,AF'
CWAITP1 SCF
RET
CMDNOPP DEFB #00
DEFB 00,00,00
DEFB #00
DEFB 00,00,00
DEFB 00,00,00
DEFB #00
CMDOPEN DEFB #1B
DEFB #00,#00,#00
DEFB #02
DEFB #00,#00,#00,#00,#00,#00,#00
CMDCLOS DEFB #1B
DEFB #00,#00,#00
DEFB #03
DEFB #00,#00,#00,#00,#00,#00,#00
CMDREAD DEFB #28,#00
SECREAD EQU $-CMDREAD
DEFB #00,#00,#00,#00
DEFB #00
COUNT EQU $-CMDREAD
DEFB #00,#01
DEFB #00,#00,#00
;========================================================

View File

@ -0,0 +1,6 @@
00000000 00 43 44 30 30 31 01 45 4c 20 54 4f 52 49 54 4f |.CD001.EL TORITO|
00000010 20 53 50 45 43 49 46 49 43 41 54 49 4f 4e 00 00 | SPECIFICATION..|
00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000040 00 00 00 00 00 00 00 13 00 00 00 00 00 00 00 00 |................|

Some files were not shown because too many files have changed in this diff Show More