Initial commit

Estex DSS
This commit is contained in:
Anatoliy Belyanskiy 2023-06-14 19:08:44 +10:00
commit 91774c8b23
35 changed files with 17347 additions and 0 deletions

3
.gitmodules vendored Normal file
View File

@ -0,0 +1,3 @@
[submodule "Shared_Includes"]
path = Shared_Includes
url = https://github.com/Tolik-Trek/Shared_Includes.git

706
BOOT/BOOT.ASM Normal file
View File

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

155
BOOT/BOOTNAME.ASM Normal file
View File

@ -0,0 +1,155 @@
;[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
;

756
BOOT/DSSBOOT.ASM Normal file
View File

@ -0,0 +1,756 @@
;---------------------------------------------------------------
;Rev Date Name Decription
;---------------------------------------------------------------
;R04 25-03-2023 BAO ; !FIXIT
;R03 23-01-2000 DNS OPTIMIZE NEW BOOTING PROCEDURE
;R02 08-01-2000 DNS NEW BOOTING PROCEDURE
;R01 25-05-1998 DNS Console printing
;R00 09-11-1998 DNS Color printing start message
; Install CGA palette
; +------------------------------+
; + System Bootstrap +
; + Initial revision 09 Nov 1998 +
; +------------------------------+
DEFINE ORIGINAL_DSS 0
DEFINE UNIVERSAL_BOOT 1
DISP #8000
OUTPUT 'build/DSSloader.bin'
ADRIVE EQU #00
CDRIVE EQU #02
DRIVE:
_mSYSID
DI
LD (DRIVE),A
LD C,BIOS.EXT_VERSION
RST #18
LD A,INCORR
JR C,FAIL
LD A,(DRIVE)
BIT 7,A
JR Z,GOOD_DRIVE
EX DE,HL
LD DE,#0215 ; ¥á«¨ ¢¥àá¨ï ­¨¦¥ 2.21, â® ®è¨¡ª 
SBC HL,DE
LD A,INCORR
JR C,FAIL
GOOD_DRIVE:
LD DE,#8200
LD HL,0
LD IX,2
LD BC,2*256+BIOS.DRV_READ
LD A,(DRIVE)
RST #18
JR C,NULL
JP CONTINU
FAIL CALL MESSAGE
NULL LD A,FAILURE
CALL MESSAGE
DI
HALT
JR $
FMESAGE LD HL,MSG0
LD BC,MSGE-MSG0
INC A
EX AF,AF'
XOR A
EX AF,AF'
NEXTMSG EX AF,AF'
CPIR
RET PO
RET NZ
EX AF,AF'
DEC A
JR NZ,NEXTMSG
RET
MESSAGE CALL FMESAGE
JR PRINTZ
;R01 Start
PRINTZ LD A,(HL) ;R01
INC HL
OR A
RET Z
CALL PRINTX
JR PRINTZ
PRINTX CP #0D
JR Z,CR_
CP #0A
JR Z,LF_
LD BC,#0182
RST #18
RET
CR_ LD C,#8E
RST #18
LD E,0
LD C,#84
RST #18
RET
LF_ LD C,#8E
RST #18
LD A,#1F
CP D
JR NZ,LF2
PUSH DE
PUSH HL
LD DE,#0020
LD BC,#018A
RST #18
LD DE,#1F00
LD C,#84
RST #18
LD A," "
LD BC,#5082
RST #18
POP HL
POP DE
DEC D
LF2 INC D
LD C,#84
RST #18
RET ;R01
;R01 End
FAILURE EQU 0
INCORR EQU 1
ERRPART EQU 2
ERRIBPB EQU 3
NO_SYS EQU 4
NOSHELL EQU 5
STARTDO EQU 6
;a BIOS version that is incompatible with this version of DOS
; 0 10 20 30 40 50 60 70 80
MSG0 DB 0
DB 13,10,"The system has been halted. Press RESET to restart your computer.",13,10
DB 0
DB 13,10
DB "You started your computer with a BIOS version that is incompatible with this",13,10
DB "version of DSS. Please update BIOS to run this version of DSS.",13,10
DB 0
DB "Invalid partition table.",13,10
DB 0
DB "Invalid BOOT sector.",13,10
DB 0
DB "Can't open file SYSTEM.DOS ...",13,10
DB 0
DB "Can't open file SYSTEM.EXE ...",13,10
DB 0
DB 13,10,"Starting DSS... ",13,10,13,10
DB 0
MSGE DB 0
CONTINU
LD HL,0
LD (DISKL),HL
LD (DISKH),HL
LD BC,1*256+BIOS.GetMem
RST #18 ;GET PAGE FOR DOS
LD (BANKDOS),A
CALL GET_BPB ;READ BPB
LD A,ERRIBPB
JP C,FAIL
CALL GETROOT
LD A,NO_SYS
JP C,FAIL
LD HL,(FCLUSTR)
LD DE,#C000
CALL FLOAD
DI
XOR A
OUT (SYS_PORT.OFF),A
LD A,#10
LD BC,#7FFD
OUT (C),A
LD A,1
LD B,#1F ;1FFD
OUT (C),A
LD A,(BANKDOS)
OUT (SLOT0),A
;DOS LOADED
IF UNIVERSAL_BOOT
LD A,(DRIVE)
LD C,#00
RST #10
jp c,XFAIL
LD A,STARTDO
CALL DOSMESS
LD A,(DRIVE)
LD B,1
LD C,Dss.BootDSK
RST #10
LD B,0
ELSE
IF ORIGINAL_DSS
LD C,#00
RST #10
ELSE
LD A,(DRIVE)
LD C,#00
RST #10
jp c,XFAIL
ENDIF
LD A,STARTDO
CALL DOSMESS
IF ORIGINAL_DSS
LD A,(DRIVE)
LD B,1
LD C,Dss.BootDSK
RST #10
LD B,0
ENDIF
ENDIF
LD C,Dss.BootDSK
RST #10
LD B,"A"
ADD A,B
LD HL,ROOT
LD (HL),A
LD C,Dss.ChDir
RST #10
LD HL,PSHELL
LD BC,Dss.Exec
RST #10
LD A,NOSHELL
JP XFAIL
PSHELL: DB '\SYSTEM.EXE /P',0
ROOT: DB 'X:\',0
DOSMESS CALL FMESAGE
LD C,Dss.PChars
RST #10
RET
XFAIL CALL DOSMESS
LD A,FAILURE
CALL DOSMESS
DI
HALT
.halt JR .halt
PART_TB PUSH BC
LD HL,(BOOT+510)
LD DE,#AA55
AND A
SBC HL,DE
JR NZ,ERRP
LD IX,BOOT+#01BE
LD B,4
DOSAGA LD A,(IX+4)
CP #0E
JR Z,YEPDOS
CP 6
JR Z,YEPDOS
CP 4
JR Z,YEPDOS
CP 1
JR Z,YEPDOS
LD DE,#10
; ®è¨¡ª  ¢ ®à¨£¨­ «¥
; ADD IY,DE
ADD IX,DE
DJNZ DOSAGA
ERRP LD A,ERRPART
JP FAIL
YEPDOS LD E,(IX+08)
LD D,(IX+09)
LD L,(IX+10)
LD H,(IX+11)
LD XH,D
LD XL,E
LD (DISKL),IX
LD (DISKH),HL
LD DE,BOOT
LD BC,1*256+BIOS.DRV_READ
LD A,(DRIVE)
RST #18
POP BC
LD A,C
RET
SET_PRM PUSH BC
LD A,B
LD C,BIOS.DRV_GET_PAR
RST #18
LD A,(BOOT.S_P_T)
LD L,A
POP AF
PUSH AF
LD C,BIOS.DRV_SET_PAR
RST #18
POP BC
LD A,C
RET
GET_BPB LD IX,#0000
LD HL,#0000
LD DE,BOOT
LD BC,1*256+BIOS.DRV_READ
LD A,(DRIVE)
RST #18
RET C
LD A,(DRIVE)
LD B,A
AND #F0
LD C,A
CP #80
JR NZ,NX1
CALL PART_TB ;HDD
RET C
NX1 CP #00
JR NZ,NX2
CALL SET_PRM ;FDD
NX2: LD HL,(BOOT+510)
LD DE,#AA55
AND A
SBC HL,DE
SCF
RET NZ
LD IY,BOOT ;Analysing Block Parametr BIOS
LD A,(IY+_sBOOT_SEC.ID_FORM)
CP #F0
RET C
LD HL,0 ;calc. first sector FAT
LD (DIR_FRH),HL
LD E,(IY+_sBOOT_SEC.RESERVE) ;Reserve sec
LD D,(IY+_sBOOT_SEC.RESERVE+1)
ADD HL,DE
LD (FAT_FRM),HL ;first sector FAT
LD E,(IY+_sBOOT_SEC.S_P_F) ;sectors in FAT
LD D,(IY+_sBOOT_SEC.S_P_F+1)
LD A,(BOOT.FAT_NUM) ;amount FATs
C_DATA1 ADD HL,DE
DEC A
JR NZ,C_DATA1
LD (DIR_FRM),HL ;first sector DIR
EX DE,HL
LD L,(IY+_sBOOT_SEC.F_P_DIR) ;Number file handel
LD H,(IY+_sBOOT_SEC.F_P_DIR+1)
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD A,H
SRL A
LD (DIR_S_S),A ;Sectors per dir
LD L,A
LD H,0
ADD HL,DE
LD (DAT_FRM),HL ;First sector data
LD C,(IY+_sBOOT_SEC.B_P_S) ;Size sector
LD B,(IY+_sBOOT_SEC.B_P_S+1)
LD HL,0
LD A,(BOOT.S_P_C)
NEXTAD3
ADD HL,BC ;calc. cluster size
DEC A
JR NZ,NEXTAD3
LD (CLU_LEN),HL
LD HL,BOOT.ID_FAT
LD DE,FATMSG
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"
SCF
RET NZ
LD A,(HL)
CP "6" ; FAT16
LD HL,#FFFF
JR Z,BPB_FAT
CP "2" ; FAT12
SCF
RET NZ
LD HL,#0FFF
BPB_FAT
LD (FAT_TYP),A
LD (ENDCLUS),HL
LD IX,(DISKL)
LD HL,(DISKH)
LD DE,(FAT_FRM)
LD BC,#0000
ADD IX,DE
ADC HL,BC
;HL:IX
LD DE,FAT
LD BC,3*256+BIOS.DRV_READ
LD A,(DRIVE)
RST #18
RET C
LD HL,0
LD (FATCASH),HL
XOR A
RET
IBMDOS_ LD A,(IY+_sBOOT_SEC.ID_FORM)
CP #F0
RET C
CP #F8
LD A,"6"
LD HL,#FFFF
JR Z,BPB_FAT
LD A,"2"
LD HL,#0FFF
JR BPB_FAT
GETROOT LD HL,(DIR_FRH)
LD IX,(DIR_FRL)
LD BC,(DISKL)
LD DE,(DISKH)
LD A,(DIR_S_S)
NEXTSEC PUSH AF
ADD IX,BC
ADC HL,DE
;HL:IX
PUSH IX
PUSH HL
LD BC,1*256+BIOS.DRV_READ
LD DE,DIR
LD A,(DRIVE)
RST #18
CALL SEARCH
POP HL
POP IX
POP BC
RET C
RET NZ
LD A,B
LD DE,0
LD BC,1
DEC A
JR NZ,NEXTSEC
SCF
RET
SEARCH LD C,17 ;HANDELS PER SECTOR 512/32 + 1
LD IX,DIR-#0020
SKIPNAM LD DE,#0020
ADD IX,DE
DEC C
RET Z
LD A,(IX+00)
OR A
SCF
RET Z
CP #E5
JR Z,SKIPNAM
LD A,(IX+11)
AND #10
JR NZ,SKIPNAM
LD HL,MASKARE
LD D,XH
LD E,XL
LD B,11
SEARCH2 LD A,(DE)
CP (HL)
JR NZ,SKIPNAM
INC HL
INC DE
DJNZ SEARCH2
LD D,XH
LD E,XL
LD HL,HANDBUF
EX DE,HL
LD BC,#0020
LDIR
XOR A
INC A
RET
; HL - CLUSTER
; DE - ADDRESS
FLOAD LD (READMEM),DE
LD_FILE PUSH HL
CALL NSECTOR
LD DE,(READMEM)
LD A,(BOOT.S_P_C)
CP #20
JR C,SMCLUS
LD BC,#2052
LD A,(BANKDOS)
EX AF,AF'
LD A,(DRIVE)
RST #18
POP HL
AND A
RET
SMCLUS LD B,A
LD C,#52
LD A,(BANKDOS)
EX AF,AF'
LD A,(DRIVE)
RST #18
LD HL,(READMEM)
LD DE,(CLU_LEN)
ADD HL,DE
LD (READMEM),HL
POP HL
RET C
CALL R_F_FAT
RET C
EX DE,HL
JP LD_FILE
; HL - CLUSTER
; HL:IX - SECTOR
NSECTOR DEC HL
DEC HL
EX DE,HL
LD A,(BOOT.S_P_C)
LD B,A
LD HL,0
LD IX,0
ADD_DE1 ADD IX,DE
JP NC,ADD_DE2
INC HL
ADD_DE2 DJNZ ADD_DE1
LD DE,(DAT_FRM)
ADD IX,DE
LD DE,#0000
ADC HL,DE
LD DE,(DISKL)
ADD IX,DE
LD DE,(DISKH)
ADC HL,DE
RET
;-----------------
; HL - CLUSTER
; DE - (CLUSTER)
R_F_FAT PUSH HL
LD A,(FAT_TYP)
CP "2"
JP Z,R_F_F12
R_F_F16 LD DE,768 ; DE - CLUSTERS IN CASH
XOR A
R_F_00H INC A ; HL - CLUSTER
SBC HL,DE
JP NC,R_F_00H
ADD HL,DE
ADD HL,HL ; HL - FAT OFFSET (FROM CASH)
DEC A
LD BC,(FATCASH) ; A - ELEMENT OF CASH
CP C
CALL NZ,RE_FAT
LD DE,FAT
ADD HL,DE
LD E,(HL)
INC HL
LD D,(HL)
LD HL,#FFEF
XOR A
SBC HL,DE
POP HL
RET
R_F_F12 LD D,H
LD E,L
ADD HL,HL
ADD HL,DE
RR H
RR L
PUSH AF
EX DE,HL
LD HL,(BOOT.B_P_S)
LD B,H
LD C,L
ADD HL,HL
ADD HL,BC
EX DE,HL
XOR A ; DE - SIZE SECTOR * 3
R_F_00 INC A ; HL - FAT OFFSET
SBC HL,DE
JP NC,R_F_00
ADD HL,DE
DEC A
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)
JP C,R_F_F01
LD A,D
AND #0F
LD D,A
JP 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 LD HL,#0FEF
XOR A
SBC HL,DE
POP HL
RET
RE_FAT PUSH HL
LD L,A
LD H,0
LD (FATCASH),HL
LD E,L
LD D,H
ADD HL,HL
ADD HL,DE
LD IX,0
LD DE,(FAT_FRM)
ADD HL,DE
EX DE,HL
JR NC,NOINX
INC IX
NOINX LD HL,(DISKL)
ADD HL,DE
EX DE,HL
LD BC,(DISKH)
JR NC,NOINX2
INC IX
NOINX2 ADD IX,BC
PUSH IX
PUSH DE
POP IX
POP HL
LD DE,FAT
LD BC,#0355
LD A,(DRIVE)
RST #18
POP HL
RET
MASKARE DB "SYSTEM DOS"
FATMSG DB "FAT"
; Area for boot sector [512Bytes]
BOOT _sBOOT_SEC = $
; BOOT EQU $
; ID_NAME EQU BOOT+#03 ; +03 DOS NAME
; ; Block Parameters BIOS
; B_P_S EQU BOOT+#0B ; +0B BYTE PER SECTOR
; S_P_C EQU BOOT+#0D ; +0D SECTORS PER CLUSTER
; RESERVE EQU BOOT+#0E ; +0E RESERVE SECTORS
; FAT_NUM EQU BOOT+#10 ; +10 AMOUNT FATS
; F_P_DIR EQU BOOT+#11 ; +11 FILES IN DIRECTORY
; S_P_D EQU BOOT+#13 ; +13 ALL SECTORS ON DISK
; ID_FORM EQU BOOT+#15 ; +15 ID FORMAT
; S_P_F EQU BOOT+#16 ; +16 SIZE FAT IN SECTORS
; S_P_T EQU BOOT+#18 ; +18 SECTOR PER TRACK
; HEADS EQU BOOT+#1A ; +1A AMOUNT SIDES
; HIDDEN EQU BOOT+#1C ; +1C HIDDEN SECTORS
; ID_FAT EQU BOOT+#36 ; +36 FAT ID
; ; end boot sector
DIR EQU BOOT+512
FAT EQU DIR+512
VALUE EQU 3*512+FAT
FATCASH EQU VALUE+0
FAT_FRM EQU VALUE+2 ; MSD_FAT_SEC first sector FAT
DIR_FRH EQU VALUE+4 ; MSD_CAT_SEC first sector DIR
DIR_FRL EQU VALUE+6 ; MSD_CAT_SEC first sector DIR
DIR_FRM EQU VALUE+6
DIR_S_S EQU VALUE+8 ; DIR_SEC_SIZE
DAT_FRM EQU VALUE+9 ; MSD_DAT_SEC
FAT_TYP EQU VALUE+11; TYPE FAT (#32 - 12bit, #36 - 16bit)
CLU_LEN EQU VALUE+12; CLASTER_LEN
ENDCLUS EQU VALUE+14
HANDBUF EQU VALUE+16
FTIME EQU VALUE+16+22
FDATE EQU VALUE+16+24
FCLUSTR EQU VALUE+16+26
FSIZE0 EQU VALUE+16+28
FSIZE1 EQU VALUE+16+30
DISKH EQU VALUE+48
DISKL EQU VALUE+50
READMEM EQU VALUE+52
SHEL_FM EQU VALUE+54
BANKDOS EQU VALUE+55
; EQU VALUE+56
;-----------------
BLOCK #8600-$-3,0
DB 'SPT'
; BIGA EQU (($/256)+1)*256
; BIGA2 EQU BIGA-$-2
; DS BIGA2
; DB "dp"
; E______
;STACK EQU (($/256)+2)*256
ENT
;START DI
; LD (SPZ+1),SP
; LD SP,#BFFF
; LD C,#FE
; CALL #3D13
;SPZ LD SP,#0000
; EI
; RET
OUTEND
;[]-----------------------------------------------------------[]

9
BOOT/README.TXT Normal file
View File

@ -0,0 +1,9 @@
<EFBFBD>ணࠬ¬  § ¯¨á¨ ­  FDD/HDD boot-§ £àã§ç¨ª  ¨ ä ©«®¢ á¨á⥬ë.
”¨âç¨ ¯à®£à ¬¬ë:
- ®â«¨ç¨¥ ®â ®à¨£¨­ «ì­®£® boot-¨­áâ ««ïâ®à , íâ  ¬®¦¥â
¯¥à¥¯¨á뢠âì 㦥 ãáâ ­®¢«¥­­ë© boot-§ £àã§ç¨ª.
- ” ©«ë á¨á⥬ë (system.dos, system.exe) ¬®£ãâ ¨¬¥âì
«î¡ë¥ à §¬¥àë.
- <20>ਠ§ £à㧪¥ ª®¬¯ìîâ¥à  á ¤¨áª¥âë, § ¯à è¨¢ ¥âáï ­®¢ ï
¤¨áª¥â  ¤«ï á®§¤ ­¨ï ¨§ ­¥¥ § £à㧮筮©.

2276
Console/CONSOLE.ASM Normal file

File diff suppressed because it is too large Load Diff

71
Console/DOS_EQU.ASM Normal file
View File

@ -0,0 +1,71 @@
/*
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
*/

104
Console/DSS.INC Normal file
View File

@ -0,0 +1,104 @@
DSS_VERSION EQU #00
DSS_CHDISK EQU #01
DSS_CURDISK EQU #02
DSS_DSKINFO EQU #03
;DSS_G_ENTRY EQU #04
; EQU #05
; EQU #06
; EQU #07
; EQU #08
DSS_BOOTDSK EQU #09
;File io
DSS_CREATE EQU #0A
DSS_CREAT_N EQU #0B
; EQU #0C
;DSS_ERASE EQU #0D
DSS_DELETE EQU #0E
;DSS_MOVE EQU #0F
DSS_RENAME EQU #10
DSS_OPEN EQU #11
DSS_CLOSE EQU #12
DSS_READ EQU #13
DSS_WRITE EQU #14
DSS_MOVE_FP EQU #15
DSS_ATTRIB EQU #16
DSS_GET_D_T EQU #17
DSS_PUT_D_T EQU #18
DSS_F_FIRST EQU #19
DSS_F_NEXT EQU #1A
DSS_MKDIR EQU #1B
DSS_RMDIR EQU #1C
DSS_CHDIR EQU #1D
DSS_CURDIR EQU #1E
; EQU #1F
; EQU #20
DSS_SYSTIME EQU #21
DSS_SETTIME EQU #22
; EQU #23
; EQU #24
; EQU #25
; EQU #26
; EQU #27
; EQU #28
; EQU #29
; EQU #2A
; EQU #2B
; EQU #2C
; EQU #2D
; EQU #2E
; EQU #2F
;Keyboard
DSS_WAITKEY EQU #30
DSS_SCANKEY EQU #31
DSS_ECHOKEY EQU #32
DSS_CTRLKEY EQU #33
;DSS_EDIT EQU #34
DSS_K_CLEAR EQU #35
DSS_K_SETUP EQU #36
DSS_TESTKEY EQU #37
;Memory
DSS_SETWIN EQU #38
DSS_SETWIN1 EQU #39
DSS_SETWIN2 EQU #3A
DSS_SETWIN3 EQU #3B
DSS_INFOMEM EQU #3C
DSS_GETMEM EQU #3D
DSS_FREEMEM EQU #3E
DSS_SETMEM EQU #3F
;Execution
DSS_EXEC EQU #40
DSS_EXIT EQU #41
DSS_WAIT EQU #42
DSS_GSWITCH EQU #43
DSS_DOSNAME EQU #44
DSS_EX_PATH EQU #45
DSS_ENVIRON EQU #46
DSS_APPINFO EQU #47
; EQU #48
; EQU #49
; EQU #4A
; EQU #4B
; EQU #4C
; EQU #4D
; EQU #4E
; EQU #4F
DSS_SETVMOD EQU #50
DSS_GETVMOD EQU #51
DSS_LOCATE EQU #52
DSS_CURSOR EQU #53
DSS_SELPAGE EQU #54
DSS_SCROLL EQU #55
DSS_CLEAR EQU #56
DSS_RDCHAR EQU #57
DSS_WRCHAR EQU #58
DSS_WINCOPY EQU #59
DSS_WINREST EQU #5A
DSS_PUTCHAR EQU #5B
DSS_PCHARS EQU #5C
;DSS_RES_PRN EQU #5D
;DSS_CTRLPRN EQU #5E
DSS_PRINT EQU #5F
;

66
Console/Errors.TXT Normal file
View File

@ -0,0 +1,66 @@
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

4
Console/HISTORY.TXT Normal file
View File

@ -0,0 +1,4 @@
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

2074
Console/SYS.old Normal file

File diff suppressed because it is too large Load Diff

32
DSS/CHANGES.LOG Normal file
View File

@ -0,0 +1,32 @@
;ˆ§¬¥­¥­¨ï ¯®á«¥ ¢¥àᨨ 1.70
‚ ¦­®¥:
‘।­¥¥:
‚®®¡é¥ ­¥ ¢ ¦­®¥:
¨á¯à ¢¨âì ¢ë室 ¨§ ä㭪樨 #41 ¯à¨ ¢®§¬®¦­®¬ 㢥«¨ç¥­¨¨ ­®¬¥à  â áª¨ ­  1 ¯à¨ 255
; TEST
;ˆ§¬¥­¥­¨ï ¯®á«¥ ¢¥àᨨ 1.60
10.02.2003 - „®¡ ¢«¥­  ¢¨§ã «¨§ æ¨ï ªãàá®à  ¢ ä㭪樨 ECHOKEY.
06.02.2003 - ˆá¯à ¢«¥­  ®è¨¡ª  ¢ à §¡®à¥ ¨¬¥­¨ ä ©«  ­ ç¨­ î饣®áï á â®çª¨.
29.01.2003 - ˆá¯à ¢«¥­  ®è¨¡ª  ¢ PUT_D_T, ­¥ ®¡­®¢«ï« áì ¤ â  ¢ ä ©« å, ¢ ª®â®àë¥ ­¥ ¯à®¨§¢®¤¨« áì § ¯¨áì.
;ˆ§¬¥­¥­¨ï ¯®á«¥ ¢¥àᨨ 1.60RC
05.12.2002 - <20>¥ «¨§®¢ ­  fn. APPINFO 47h, ¨­ä®à¬ æ¨ï ® ¯à¨«®¦¥­¨¨.
26.11.2002 - ˆá¯à ¢«¥­  ®è¨¡ª  ¢ CHDIR, ­¥ ¢ë¯®«­ï«áï § ¯à®á "." ¨§ ROOT
19.11.2002 - „®¡ ¢«¥­  ª®à४â¨à®¢ª   âਡãâ  ä ©«  ¯à¨ ¥£® á®§¤ ­¨¨.
19.11.2002 - „®¡ ¢«¥­® ¬ áª¨à®¢ ­¨¥  ââਡãâ  VOLUME LABEL.
19.11.2002 - ˆá¯à ¢«¥­  ®è¨¡ª  á  âਡã⮬ system.
17.11.2002 - <20>¥ «¨§®¢ ­® system environment, fn. 46h
07.11.2002 - „®¡ ¢«¥­ § ¯à¥â/à §à¥è¥­¨¥ ¯à¥à뢠­¨© ¢ ä㭪樨 WINCOPY ¨ WINREST
07.11.2002 - ˆá¯à ¢«¥­  ®è¨¡ª  ¢ ä㭪樨 SCROLL (A=0)
;ˆ§¬¥­¥­¨ï ¯®á«¥ ¢¥àᨨ 1.55
06.08.2001 - „®¡ ¢«¥­  ¯®¤¤¥à¦ª  Secondary IDE
06.08.2001 - ˆá¯à ¢«¥­  ®è¨¡ª  á ¯®¤à §¤¥« ¬¨ ¢â®à®£® ¢¨­ç¥áâ¥à 
11.07.2001 - <20>®¤¤¥à¦ª  ¯à¨­â¥à  ¤«ï Sp2000
30.07.2001 - ˆá¯à ¢«¥­® ®¯¨á ­¨¥ ¢å®¤­ëå ¯ à ¬¥â஢ ä㭪樨 㤠«¥­¨ï ä ©« (0Eh);
;ˆ§¬¥­¥­¨ï ¯®á«¥ ¢¥àᨨ 1.54
18.07.2001 - „®¡ ¢«¥­® ®¯¨á ­¨¥ à ¡®âë á £à ä¨ç¥áª¨¬ íªà ­®¬;
18.07.2001 - „®¡ ¢«¥­® ®¯¨á ­¨¥ ¯ à ¬¥âà  ä㭪樨 ¯®«ã祭¨ï ०¨¬  íªà ­ (51h);
15.03.2001 - „®¡ ¢«¥­® ®¯¨á ­¨¥ ä㭪樨 à ¡®âë á ª®¬ ­¤­®© áâப®©(45h);

249
DSS/DISK_X.ASM Normal file
View File

@ -0,0 +1,249 @@
; DISK DRIVER SPECIFICATION
;---------------------------------------------
; COMMAND 00h (INITIALIZATION)
;
; INPUT: A - DRIVE LETTER
; IX - ENVIRONMENT
; RETURN: A - AMOUNT DRIVE SUPPORT
; HL - LENGTH DRIVER
;---------------------------------------------
; COMMAND 01h (OPEN)
;
; INPUT: A - DRIVE
;
;---------------------------------------------
; COMMAND 02h (CLOSE)
;
; INPUT: A - DRIVE
; RETURN: A -
;---------------------------------------------
; COMMAND 03h (MEDIA CHECK)
;
; INPUT: A - DRIVE
; RETURN: A - 00h - OLD DISK, 0FFh - NEW DISK
;---------------------------------------------
; COMMAND 04h (GET BPB)
;
; INPUT: HL - ADDRESS
; A - DRIVE
;---------------------------------------------
; COMMAND 05h (INPUT)
;
; INPUT: IX:DE - ABSOLUTE SECTOR
; HL - MEMORY ADDRESS
; B - SECTORS COUNT
; A - DRIVE
;---------------------------------------------
; COMMAND 06h (OUTPUT)
;
; INPUT: IX:DE - ABSOLUTE SECTOR
; HL - MEMORY ADDRESS
; B - SECTORS COUNT
; A - DRIVE
;---------------------------------------------
; COMMAND 07h (REMOVABLE)
;
; INPUT: A - DRIVE
; RETURN: A = 0 - REMOVABLE
; A = 1 - NONREMOVABLE
;---------------------------------------------
; COMMAND 08h (GENERIC IOCTL)
;
; INPUT: A - DRIVE
; B - SUBCOMMAND
; DE - MAGIC NUMBER (55AAh)
; SUBCOMMAND
;----------------------
; 00 - GET DEVICE PARAMETERS
; 01 - READ TRACK
; 02 - TEST TRACK
; 80 - SET DEVICE PARAMETERS
; 81 - WRITE TRACK
; 82 - FORMAT TRACK
;---------------------------------------------
;
; ERRORS:
; 0 - NO ERRORS
; 1 - BAD COMMAND
; 2 - BAD DRIVE NUMBER
; 3 - UNKNOW FORMAT
; 4 - NOT READY
; 5 - SEEK ERROR
; 6 - SECTOR NOT FOUND
; 7 - CRC ERROR
; 8 - WRITE PROTECT
; 9 - READ ERROR
; 10 - WRITE ERROR
; 11 - FAILURE
; 12 - BUSY (DEVICE OPENED)
; 13 - RESERVED
;INTDISK PUSH HL
; PUSH BC
; LD HL,DEVICE
; INC A
;INTD001 DEC A
; JP Z,YEP
; LD C,(HL)
; INC C
; INC HL
; INC HL
; INC HL
; JP NZ,INTD001
; POP BC
; POP HL
; LD A,2
; SCF
; RET
;YEP LD A,(HL)
; INC HL
; LD C,(HL)
; INC HL
; LD H,(HL)
; LD L,C
; POP BC
; EX (SP),HL
; RET
DSS_MAX_DRIVES_AMOUNT EQU 26
INTDISK:
CP #FF
JR NZ,.noNeedRescan
CP C
JR Z,INITDVC_RET_DRIVE
.noNeedRescan:
PUSH HL
PUSH BC
LD C,A
ADD A,A
ADD A,C
LD C,A
LD B,0
LD HL,DEVICE
ADD HL,BC
LD A,(HL)
INC A
JR Z,NODEV
DEC A
INC HL
LD C,(HL)
INC HL
LD H,(HL)
LD L,C
POP BC
EX (SP),HL
RET
NODEV POP BC
POP HL
LD A,DSS_Error.drv.INVALID_DRIVE
SCF
RET
PDEVICE DW DEVICE
DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT*3,#FF
.End: DB #FF
FLOPPY EQU #0001
FIXED EQU #0002
CDROM EQU #0004
NETWORK EQU #0008
;DISKS: DB 27 ;LENGTH DISK INFO
; DW FLOPPY ;DISK TYPE
; DB 2,"A:" ;DISK NAME
; DB 11,"NO NAME "
; DB 8,"FAT12 "
; DB #00 ;PHISICAL DRIVE NUMBER
;
; DB 27 ;LENGTH DISK INFO
; DW FLOPPY ;DISK TYPE
; DB 2,"B:" ;DISK NAME
; DB 11,"NO NAME "
; DB 8,"FAT12 "
; DB #01 ;PHISICAL DRIVE NUMBER
;
; DB 27 ;LENGTH DISK INFO
; DW FIXED ;DISK TYPE
; DB 2,"C:" ;DISK NAME
; DB 11,"NO NAME "
; DB 8,"FAT16 "
; DB #80 ;PHISICAL DRIVE NUMBER
;
; DB #00 ;END OF TABLE
INITDVC_RET_DRIVE:
CALL INITDVC
LD A,(LDRIVE)
AND A
RET
INITDVC XOR A
LD (LDRIVE),A
LD HL,DEVICE
LD (PDEVICE),HL
LD C,A
CALL FDDRIVE
LD DE,FDDRIVE
CALL MAKEDVC
// XOR A
LD C,0
CALL HDDRIVE
LD DE,HDDRIVE
CALL MAKEDVC
// XOR A
LD C,0
CALL RMDRIVE
LD DE,RMDRIVE
CALL MAKEDVC
XOR A
RET
MAKEDVC LD C,A
LD HL,LDRIVE
ADD A,(HL)
LD (HL),A
LD A,C
LD C,0
OR A
RET Z
LD HL,(PDEVICE)
.loop: LD (HL),C
INC HL
LD (HL),E
INC HL
LD (HL),D
INC HL
INC C
DEC A
JR NZ,.loop
LD (PDEVICE),HL
DEC A
LD (HL),A
RET
;DEVICE DB #00
; DW FDDRIVE ; FDD A
; DB #01
; DW FDDRIVE ; FDD B
; DB #00
; DW HDDRIVE ; HDD C
; DB #01
; DW HDDRIVE ; HDD D
; DB #02
; DW HDDRIVE ; HDD E
; DB #03
; DW HDDRIVE ; HDD F
; DB #04
; DW HDDRIVE ; HDD G
; DB #05
; DW HDDRIVE ; HDD H
; DB #06
; DW HDDRIVE ; HDD I
; DB #07
; DW HDDRIVE ; HDD J
; DB #FF

572
DSS/DOS-MAIN.ASM Normal file
View File

@ -0,0 +1,572 @@
;[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

1748
DSS/DOS5.ASM Normal file

File diff suppressed because it is too large Load Diff

831
DSS/DOS_FM.ASM Normal file
View File

@ -0,0 +1,831 @@
;[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]

547
DSS/DOS_X.ASM Normal file
View File

@ -0,0 +1,547 @@
;[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]

237
DSS/DRV-MAIN.ASM Normal file
View File

@ -0,0 +1,237 @@
;[BEGIN]
;//MODULE: DRV-MAIN AUTHOR: Denis Parinov
;//CREATE: 2003-03-12
;---------------------------------------------------------------
;Rev Date Name Description
;---------------------------------------------------------------
;R00 2003-03-19 DNS Initial version
;---------------------------------------------------------------
// INCLUDE "hardware.inc"
// INCLUDE "bios.inc"
; ORG #0000
MODULE DRV ; !FIXIT ®¡®©â¨áì ¡¥§ ¬®¤ã«ï
;PAGEDRV EQU 0
;!TODO
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
; <[NOT USED]> ;
A0000: JP RST_00 ;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
;
;
RST_00:
LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
;
;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
; <[BIOS API]> ;
BLOCK 8-$,#FF ;
A0008: PUSH AF ;
LD A,SYS_PORT.PAGE8;
OUT (SYS_PORT.ON),A ;
POP AF ;
RET ;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
;
;!FIXIT
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
; <[DSS API]> ;
BLOCK #10-$,#FF ;
A0010: ;JP RST_10 ;
DI : HALT ;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
;
;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
; <[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
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
; <[NOT USED]> ;
BLOCK #20-$,#FF ;
A0020: JP RST_20 ;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
;
;
RST_20:
LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
;
;!TODO
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
; <[NOT USED]> ;
BLOCK #28-$,#FF ;
A0028: JP RST_28 ;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
;
;
RST_28:
LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
;
;!TODO
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
; <[NOT USED]> ;
BLOCK #30-$,#FF ;
A0030: JP RST_30 ;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
;
;
RST_30:
LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
;
;!FIXIT
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
; <[MAIN INT]> ;
BLOCK #38-$,#FF ;
A0038: ;
// JP RST_38 ;
; RST_38: ;
; 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 ;
; 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 ;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
;
;
KEYSCAN: RET ;!FIXIT
;
;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
; <[ NMI ]> ;
NMI: RETN ;
BLOCK #66-$,#FF ;
A0066: JP NMI ;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
;
;-------------------------------;
;ADRST10 EQU #00 ;!!!!!
;-------------------------------;
;!FIXIT
RST_10 PUSH HL
LD L,C
LD H,ADRST10/256
LD C,(HL)
INC H
LD H,(HL)
LD L,C
EX (SP),HL
RET
;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
; <[DRIVE PAGE SWITCH]> ;
BLOCK #7E-$,0 ;
PORTAL.toMAIN: ;
PUSH BC ;
RETBANK+2: ;
LD BC,0*256+SLOT0 ;
OUT (C),B ;
ASSERT $!=84,'-> Portal error!';
;Entry point from DSS main page ; !FIXIT ¥á«¨ 2 à §  ¯à¨«¥â¥âì ­  íâã â®çªã ¢å®¤ , â® § áàñâáï RETBANK
LD (RETBANK),A ;
POP BC ;
POP AF ;
ADCALL+1: ;
CALL DISPATCH ; ¯ âç¨âáï ­  INTDISK
JR PORTAL.toMAIN ;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
;
/*
push hl
*/
;!FIXIT çñâ ­¥ â® âãâ
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
LD B,#00; ;
OUT (C),A ;
;--- ;
POP BC ;
RET ;
PORTAL.outDRV: ;
RET ;
;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
;
;
DISPATCH
CALL INITDVC
LD HL,INTDISK
LD (ADCALL),HL
LD A,(LDRIVE)
AND A
RET
;
LDRIVE DB #00
INCLUDE 'disk_x.asm'
INCLUDE 'ide_drv0.asm'
INCLUDE 'fdd_drv0.asm'
;INCLUDE 'ram_drv0.asm'
INCLUDE 'ram_drv1.asm'
DB 0
ENDMODULE
; OUTEND
;[END]

72
DSS/DSS_MACROSES.Z80 Normal file
View File

@ -0,0 +1,72 @@
;
MACRO _mSavePath
; PUSH HL
; LD HL,BACK_CUR_PATH
; EX (SP),HL
; CALL SAVE_CUR_PATH
ENDM
;
;
MACRO _mRestorePath
; CALL BACK_CUR_PATH
ENDM
;
;
MACRO _mRestorStackAfterRestorePath
; POP HL ;CLEAR STACK "BACK_CUR_PATH"
ENDM
;
;
MACRO _mDSS_Version
DB 'DSS_'
db '0'+VERS
db '.'
db MODF/10+'0'
db MODF-(MODF/10)*10+'0'
ENDM
;
;
MACRO C_OSTYPE
IF OSTYPE = DP
C_OSNAME
DB "-DP [",#30+REVISION,']',0
ELSEIF OSTYPE = BETA
C_OSNAME
DB '-BETA [',#30+REVISION,']',0
ELSEIF OSTYPE = RC
C_OSNAME
DB '-RC [',#30+REVISION,']',0
ELSEIF OSTYPE = RELEASE
C_OSRELEASE
;DB "-RELEASE",0
ELSE
C_OSNAME
DB "-UNKNOWN",0
ENDIF
ENDM
;
;
MACRO C_OSNAME
DB "ESTEX",0
ENDM
;
;
MACRO C_OSRELEASE
DB "Estex DSS",0
ENDM
;

62
DSS/DSS_MAP.TXT Normal file
View File

@ -0,0 +1,62 @@
0000-0038h RESTARTS
003B-006BH 38h Interrupt
0066-0068h NMI
0069-0072h RST10 routine
0073-007Fh Align space
0080-0085h CALL interpage gate
0086-00C3h BPB struct
00C4-00FAh DSS INIT routine
00FB-00FFH SPACE
0100-01FFH MEMORY TABLE (OWNER)
0200-03FFH FUNCTIONS ADDRESSES
0400-043FH KEYBOARD BUFFER
0440-0BD1H KEYBOARD DRIVER
0BD2-0EF5H SCREEN DRIVER
0EF6-1100H FAT ROUTINES
1101-1342H DISK IO ROUTINES
1343-1443H CURRENT DIR NAME BUFFER
1444-16BDH HANDLES AND FILE IO ROUTINES
16BE-25C7H FILE AND DIR ROUTINES (DOS5)
25C8-27ACH EXECUTE ROUTINES
27AD-2882H MEMORY ROUTINES
2883-2CAEH EXEC
?2CAF-2EAEH EXEBUFFER (GLUK?)
2EAF-2FAEH PROCESS STACK BUFFER
2FAF-30CBH ENVIRONMENT ROUTINES
30CC-35E0H MOUSE DRIVER
35E1-36E0H MOUSE IMAGE BUFFER
36E1-370DH DTA BUFFER
370D-37FFH SPACE
3800-39FFH BUFFER & SECTOR BUFFER
3832-3833H ENDCODE
3833-3FFFH FREE-SPACE

241
DSS/ENVIRON.ASM Normal file
View File

@ -0,0 +1,241 @@
;[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]

1228
DSS/EXECUTE.ASM Normal file

File diff suppressed because it is too large Load Diff

473
DSS/FAT_X.ASM Normal file
View File

@ -0,0 +1,473 @@
;[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]

366
DSS/FDD_DRV0.ASM Normal file
View File

@ -0,0 +1,366 @@
; 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
;==============================================

706
DSS/IDE_DRV0.ASM Normal file
View File

@ -0,0 +1,706 @@
;---------------------------------------------------------------
;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
;=======================================================

920
DSS/INTMOUSE.ASM Normal file
View File

@ -0,0 +1,920 @@
;[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]

927
DSS/KEYINTER.ASM Normal file
View File

@ -0,0 +1,927 @@
;[BEGIN]
;//MODULE: KEYINTER
;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
;//UPDATE: 24-10-1999 DNS Restore module
;------------------------------------------------
;R02 13-04-2023 BAO FIX BUG IN K_CLEAR WITH STACK OVERFLOW
;R01 10-02-2003 DNS Add cursor visualisation
;
_mInfoALIGN 256,0
;KEYBOARD BUFFER
SBUF: BLOCK 64,0
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
UNCODE DW 0
WAITKEY LD HL,HOST
LD A,(HEAD)
CP (HL)
JR Z,WAITKEY
CALL GETSYM
LD A,E
AND A
RET
SCANKEY LD HL,HOST
LD A,(HEAD)
CP (HL)
RET Z
CALL GETSYM
LD A,E
RET
;
;
IF CLASSIC_CURSOR ;------------------------------;
ECHOKEY:
CURCOUNT+1: LD A,#FF ;R01
INC A ;R01
LD (CURCOUNT),A ;R01
AND #FF ;R01
JR NZ,NOTUR ;R01
CURSYM+1: LD A,#00 ;R01
XOR #01 ;R01
LD (CURSYM),A ;R01
LD A," " ;R01
JR Z,CURSKI ;R01
LD A,"_" ;R01
CURSKI: CALL PUTCHAR ;R01
LD A,8 ;R01 BACKSPACE
CALL PUTCHAR ;R01
NOTUR: CALL SCANKEY
JR Z,ECHOKEY
PUSH DE
PUSH BC
PUSH AF ;R01
LD A," " ;R01
CALL PUTCHAR ;R01
LD A,8 ;R01 BACKSPACE
CALL PUTCHAR ;R01
POP AF ;R01
CALL PUTCHAR
POP BC
POP DE
LD A,E
AND A
RET
ELSE ;------------------------------;
delay_curs: EQU 11 ; ç áâ®â  ¬¨£ ­¨ï ªãàá®à 
INS_CUR_ZG: EQU #19
CURSOR_ZG: EQU #1A
NORM_ZG: EQU #1B
ECHOKEY: CALL Cursor_On ; ¢ª«. ªãàá®à, ãáâ ­®¢¨âì 䮪ãá ­  "Input Line"
EI
.loop: CALL SCANKEY
JR Z,.loop
PUSH DE
PUSH BC
PUSH AF
CALL Cursor_Off ; ¢ëª«. ªãàá®à
POP AF
OR A ; ¤®¡ ¢¨«
CALL NZ,PUTCHAR ; ¢ë¢®¤ "a" ­  íªà ­
POP BC
POP DE
LD A,E
AND A
RET
Cursor:
.Flag+1: LD A,0 ; ä« £ ªãàá®à  00-­¥â/01-¥áâì
CPL
LD (.Flag),A
; ‚ª«îç¨âì ªãàá®à
Cursor_On: LD C,BIOS.LP_GET_PLACE ; ã§­ âì ¯®«®¦. ªãàá®à 
RST ToBIOS
LD (Cursor_Off.pos),DE
XOR A
LD C,BIOS.WIN_GET_SYM ; ¯®«ãç¨âì ᨬ¢®«
RST ToBIOS
LD BC,NORM_ZG*256+BIOS.WIN_PUT_SYM ; b=§­ ª®£¥­., á=ᨬ¢®« ­  íªà ­
LD A,(Cursor.Flag)
OR A
JR Z,.put
LD B,CURSOR_ZG ; ç¥àâ 
LD A,(KEYFLAG) ; ä« £¨ ª« ¢ë
BIT 1,A ; ¡¨â Ins
JR NZ,.put
LD B,INS_CUR_ZG ; ¡«®ª
.put: XOR A ; ­®¬¥à ®ª­ 
RST ToBIOS
LD A,1
LD (Cursor_Off.Flag),A
LD A,delay_curs
RET
; ‚몫îç¨âì ªãàá®à
Cursor_Off:
.Flag+1: LD A,0 ; ä« £ ªãàá®à : 00-¢ëª«/01-¢ª«
OR A
RET Z
LD A,-1 ; = #FF
LD (Cursor.Flag),A
INC A
LD (.Flag),A
LD A,delay_curs
LD (cursor_interrupt.timer),A
.pos+1: LD DE,0 ; Y/X ¯®«®¦.
BIT 7,E
RET NZ
LD C,BIOS.WIN_GET_SYM ; ¯®«ãç¨âì ᨬ¢®«
XOR A
RST ToBIOS
XOR A
LD BC,NORM_ZG*256+BIOS.WIN_PUT_SYM ; ᨬ¢®« ­  íªà ­
RST ToBIOS
RET
; ‚¥ªâ®à ®¡á«ã¦¨¢ ­¨ï ªãàá®à 
cursor_interrupt:
LD A,(Cursor_Off.Flag)
OR A
RET Z
.timer+1: LD A,1 ; ¯ ã§  ¬¨£ ­¨ï
DEC A
CALL Z,Cursor
LD (.timer),A
RET
; <20> áâனª  §­ ª®£¥­¥à â®à  ªãàá®à  ç¥àâ®çª®©
SETUP_CURSORS:
in a,(SLOT2)
push af ; á®åà. ¯®àâ
ld a,(BANKTBL+TXTPAGE) ; 2-© «®£. ­®¬¥à áâà ­¨æë à áè. „Ž‘
out (SLOT2),a
; ¯®«ãç¨âì á¨áâ. §­ ª®£¥­.
ld de,#8000 ;!HARDCODE ¡ãä¥à ¤«ï 2048 ¡ ©â ¤ ­­ëå
push de
ld c,BIOS.WIN_GET_ZG ; ¯®«ãç¨âì §­ ª®£¥­.
rst ToBIOS
; § ¯®«­¨âì ª®¤®¬ #FF 2 ­¨¦­¨¥ «¨­¨¨
ld hl,#8000+(2048-(2*256)) ;!HARDCODE ¯®á«¥¤­¨¥ 512 ¡ ©â
ld bc,511
ld a,CURSOR_ZG; ; ­®¬¥à §­ ª®£¥­. "ç¥àâ®çª "
call .fill_data_font
pop hl
; § ¯®«­¨âì ®áâ «ì­ë¥ 6 «¨­¨© (¯®«­ë© ¡«®ª)
ld bc,2048-513 ;!HARDCODE
ld a,INS_CUR_ZG ; ­®¬¥à §­ ª®£¥­. "¡«®ª"
call .fill_data_font
pop af
out (SLOT2),a ; ¢®ááâ. ¯®àâ
ret
; <20> áâனª  §­ ª®£¥­. ¨ ¥£® ॣ¨áâà æ¨ï
; ¢å®¤: a=­®¬¥à §­ ª®£¥­.
; hl=¤ ­­ë¥
; bc=à §¬¥à ¤ ­­ëå
.fill_data_font:
ld e,l
ld d,h
ld (hl),#FF
inc de
ldir
ld de,#8000 ; §­ ª®£¥­.
ld c,BIOS.WIN_SET_ZG ; ãáâ. §­ ª®£¥­.
rst ToBIOS
ret
;
ENDIF ;------------------------------;
CTRLKEY LD HL,HOST
LD A,(HEAD)
CP (HL)
LD BC,(KEYFLAG)
LD A,#00
RET Z
DEC A
RET
TESTKEY LD HL,HOST
LD A,(HEAD)
CP (HL)
RET Z
LD L,(HL)
LD H,SBUF/256
LD E,(HL)
INC L
LD D,(HL)
INC L
LD B,(HL)
INC L
LD C,(HL)
LD A,E
RET
; K_CLEAR LD A,(HOST)
; LD (HEAD),A
; LD A,#2F
; CP B
; JR C,K_C2
; LD A,DSS_Error.sys.INVALID_FUNCTION
; SCF
; RET
; K_C2 LD A,#34 ;R02
; CP B
; JR NC,K_C3
; LD A,DSS_Error.sys.INVALID_FUNCTION
; SCF
; RET
; K_C3 LD C,B
; RST #10
; RET
;small optimization
K_CLEAR LD A,(HOST)
LD (HEAD),A
LD A,#2F
CP B
JR NC,.error
LD A,#34 ;R02
CP B
JR C,.error
LD C,B
JP #10
.error: LD A,DSS_Error.sys.INVALID_FUNCTION
SCF
RET
;
PUTSYM LD HL,HEAD
LD A,(HOST)
SUB 4
AND #3F
CP (HL)
JR Z,FULL_BF
LD A,(HL)
INC (HL)
INC (HL)
INC (HL)
INC (HL)
RES 6,(HL)
LD L,A
LD H,SBUF/256
LD (HL),E
INC L
LD (HL),D
INC L
LD (HL),B
INC L
LD (HL),C
RET
GETSYM LD HL,HOST
LD A,(HEAD)
CP (HL)
RET Z
LD A,(HL)
INC (HL)
INC (HL)
INC (HL)
INC (HL)
RES 6,(HL)
LD L,A
LD H,SBUF/256
LD E,(HL)
INC L
LD D,(HL)
INC L
LD B,(HL)
INC L
LD C,(HL)
RET
FULL_BF EX AF,AF'
BIT SF_BUFF,(IX+SOUND_K)
JR Z,FBF
EXX
LD DE,230
LD HL,50
CALL BEEP
EXX
FBF EX AF,AF'
RET
E0_KEY SET FLAG_E0,(IX+KEYFLG)
JR RESCAN
F0_KEY SET FLAG_F0,(IX+KEYFLG)
JR RESCAN
E1_KEY SET FLAG_E1,(IX+KEYFLG)
JR RESCAN
KEYSCAN LD IX,KEYFLAG
RESCAN IN A,(COM_A)
BIT 0,A
RET Z
IN A,(DAT_A)
CP #F0
JR Z,F0_KEY
CP #E0
JR Z,E0_KEY
CP #E1
JR Z,E1_KEY
BIT FLAG_F0,(IX+KEYFLG)
JR NZ,UN_KEY
LD L,A
CALL XLAT
CALL SHIFTS
RES FLAG_E0,(IX+KEYFLG)
RES FLAG_E1,(IX+KEYFLG)
RET Z ;IT'S SHIFT KEY
CALL INPCODE ;L - AT POS. CODE
PUTCODE:
LD HL,#1C00 ;Caps Lock
AND A
SBC HL,DE
CALL Z,CAPS_X
LD HL,#B800 ;Ctrl + Space
AND A
SBC HL,DE
CALL Z,RUS_X
LD HL,#5000 ;Insert
AND A
SBC HL,DE
CALL Z,INS_X
LD HL,#4900 ;Num Lock
AND A
SBC HL,DE
CALL Z,NUM_X
LD HL,#C900 ;Pause Lock
AND A
SBC HL,DE
CALL Z,PAUSE_X
LD HL,#4800 ;Scroll Lock
AND A
SBC HL,DE
CALL Z,SCL_X
;small optimization
; LD HL,#CF00 ;Ctrl + Alt + Del
; AND A
; SBC HL,DE
; CALL Z,RST_X
;;;
LD BC,(KEYFLAG)
CALL PUTSYM
RET
UN_KEY RES FLAG_F0,(IX+KEYFLG)
LD L,A
CALL XLAT
CALL UNSHIFT
RES FLAG_E0,(IX+KEYFLG)
LD H,0
LD (UNCODE),HL
RET
CAPS_X LD A,(IX+K_LOCK)
XOR 1<<CAPS_L
LD (IX+K_LOCK),A
RET
RUS_X BIT X_CTRL,(IX+K_SHIFT)
RET Z
LD A,(IX+K_LOCK)
XOR 1<<LANG_L
LD (IX+K_LOCK),A
BIT SF_ALT,(IX+SOUND_K)
RET Z
EXX
LD DE,190
LD HL,20
CALL BEEP
EXX
RET
INS_X LD A,(IX+K_LOCK)
XOR 1<<INS_L
LD (IX+K_LOCK),A
RET
NUM_X LD A,(IX+K_LOCK)
XOR 1<<NUM_L
LD (IX+K_LOCK),A
RET
PAUSE_X BIT X_CTRL,(IX+K_SHIFT)
RET Z
POP HL ;!!!!! “ ‘ ©¬ ­  ã¡à ­ POP
LD A,(IX+K_LOCK)
XOR 1<<PAUSE_L
LD (IX+K_LOCK),A
BIT PAUSE_L,A
RET Z
EI
PAUSE_ HALT
BIT PAUSE_L,(IX+K_LOCK)
JR NZ,PAUSE_
DI
RET
SCL_X LD A,(IX+K_LOCK)
XOR 1<<SCRL_L
LD (IX+K_LOCK),A
RET
;small optimization
; RST_X BIT X_CTRL,(IX+K_SHIFT)
; RET Z
; BIT X_ALT,(IX+K_SHIFT)
; RET Z
; XOR A
; LD BC,#01FD
; RST ToBIOS
; RET
;;;
UNSHIFT LD A,L
CP #37 ;L ALT
JR NZ,USH1
RES L_ALT,(IX+K_SHIFT)
BIT R_ALT,(IX+K_SHIFT)
RET NZ
RES X_ALT,(IX+K_SHIFT)
RET
USH1 CP #39 ;R ALT
JR NZ,USH2
RES R_ALT,(IX+K_SHIFT)
BIT L_ALT,(IX+K_SHIFT)
RET NZ
RES X_ALT,(IX+K_SHIFT)
RET
USH2 CP #36 ;L CTRL
JR NZ,USH3
RES L_CTRL,(IX+K_SHIFT)
BIT R_CTRL,(IX+K_SHIFT)
RET NZ
RES X_CTRL,(IX+K_SHIFT)
RET
USH3 CP #3A ;R CTRL
JR NZ,USH4
RES R_CTRL,(IX+K_SHIFT)
BIT L_CTRL,(IX+K_SHIFT)
RET NZ
RES X_CTRL,(IX+K_SHIFT)
RET
USH4 CP #29 ;L SHIFT
JR NZ,USH5
RES L_SHIFT,(IX+K_SHIFT)
RET
USH5 CP #34 ;R SHIFT
JR NZ,USH6
RES R_SHIFT,(IX+K_SHIFT)
USH6 RET
SHIFTS LD A,L
CP #37 ;L ALT
JR NZ,NSH1
SET L_ALT,(IX+K_SHIFT)
SET X_ALT,(IX+K_SHIFT)
RET
NSH1 CP #39 ;R ALT
JR NZ,NSH2
SET R_ALT,(IX+K_SHIFT)
SET X_ALT,(IX+K_SHIFT)
RET
NSH2 CP #36 ;L CTRL
JR NZ,NSH3
SET L_CTRL,(IX+K_SHIFT)
SET X_CTRL,(IX+K_SHIFT)
RET
NSH3 CP #3A ;R CTRL
JR NZ,NSH4
SET R_CTRL,(IX+K_SHIFT)
SET X_CTRL,(IX+K_SHIFT)
RET
NSH4 CP #29 ;L SHIFT
JR NZ,NSH5
SET L_SHIFT,(IX+K_SHIFT)
RET
NSH5 CP #34 ;R SHIFT
JR NZ,NSH6
SET R_SHIFT,(IX+K_SHIFT)
NSH6 RET
;
;;
_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
;
XLAT BIT FLAG_E0,(IX+KEYFLG)
JR Z,W_O_E0
CP #11 ;Right ALT
LD L,#39
RET Z
CP #14 ;Right CTRL
LD L,#3A
RET Z
CP #5A ;enter
LD L,#4E
RET Z
CP #4A ; /
LD L,#4A
RET Z
CP #7C ; * - Print Screen
LD L,#47
RET Z
LD L,A
W_O_E0 LD H,high XLAT_T
LD L,(HL)
RET
;;
;
;INPCODE BIT 1,(IX+1) ;00110000
; JR NZ,FN_KEY ;LRCAcaRP
INPCODE LD D,L
LD E,0
BIT LANG_L,(IX+K_LOCK)
JP NZ,RUSCODE
LD A,(IX+K_SHIFT)
AND #C0
JR NZ,SHIFT_L
SET 7,D
BIT X_ALT,(IX+K_SHIFT)
RET NZ
BIT X_CTRL,(IX+K_SHIFT)
RET NZ
LD D,L
BIT CAPS_L,(IX+K_LOCK)
LD BC,CAPSTAB
JR NZ,CONVER
LD BC,NORMTAB
CONVER LD H,0
ADD HL,BC
LD E,(HL)
RET
SHIFT_L LD BC,SHIFTAB
BIT CAPS_L,(IX+K_LOCK)
JR Z,CONVER5
LD BC,SHF2TAB
CONVER5 LD H,0
ADD HL,BC
LD E,(HL)
SET 7,D
RET
RUSCODE LD A,(IX+K_SHIFT)
AND #C0
JR NZ,SHIFT_R
SET 7,D
BIT X_ALT,(IX+K_SHIFT)
RET NZ
BIT X_CTRL,(IX+K_SHIFT)
RET NZ
LD D,L
BIT CAPS_L,(IX+K_LOCK)
LD BC,CAPSRUS
JR NZ,CONVER2
LD BC,NORMRUS
CONVER2 LD H,0
ADD HL,BC
LD E,(HL)
RET
SHIFT_R LD BC,SHIFRUS
BIT CAPS_L,(IX+K_LOCK)
JR Z,CONVER4
LD BC,SHF2RUS
CONVER4 LD H,0
ADD HL,BC
LD E,(HL)
SET 7,D
RET
K_SETUP INC B
DEC B
JP Z,KEYMAP
DEC B
JP Z,K_SND_R
DEC B
JP Z,K_SND_W
LD A,DSS_Error.sys.INVALID_ACCESS
SCF
RET
K_SND_R LD A,(SOUND_K)
AND A
RET
K_SND_W LD (SOUND_K),A
AND A
RET
KEYMAP LD BC,ENDNORM-NORMTAB
BIT 7,A
JR NZ,READMAP
LD DE,NORMTAB
OR A
JR Z,LTAB
LD DE,SHIFTAB
DEC A
JR Z,LTAB
LD DE,CAPSTAB
DEC A
JR Z,LTAB
LD DE,SHF2TAB
DEC A
JR Z,LTAB
LD DE,NORMRUS
DEC A
JR Z,LTAB
LD DE,SHIFRUS
DEC A
JR Z,LTAB
LD DE,CAPSRUS
DEC A
JR Z,LTAB
LD DE,SHF2RUS
DEC A
JR Z,LTAB
XOR A ; ????? ¬®¦¥â âãâ ­ ¤® .INVALID_COMMAND ?
SCF
RET
LTAB LDIR
XOR A
RET
READMAP RES 7,A
LD DE,NORMTAB
OR A
JR Z,RTAB
LD DE,SHIFTAB
DEC A
JR Z,RTAB
LD DE,CAPSTAB
DEC A
JR Z,RTAB
LD DE,SHF2TAB
DEC A
JR Z,RTAB
LD DE,NORMRUS
DEC A
JR Z,RTAB
LD DE,SHIFRUS
DEC A
JR Z,RTAB
LD DE,CAPSRUS
DEC A
JR Z,RTAB
LD DE,SHF2RUS
DEC A
JR Z,RTAB
XOR A ; ????? ¬®¦¥â âãâ ­ ¤® .INVALID_COMMAND ?
SCF
RET
RTAB EX DE,HL
LDIR
XOR A
RET
; `
; 0
; Esc,"1","2","3","4","5","6","7","8","9","0","-","=",Back
; 1 2 3 4 5 6 7 8 9 A B C D E
; Tab,"Q","W","E","R","T","Y","U","I","O","P","[","]"
; F 10 11 12 13 14 15 16 17 18 19 1A 1B
; Cps,"A","S","D","F","G","H","J","K","L",";","'",Enter
; 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28
; LSh,"Z","X","C","V","B","N","M",",",".","/",RSh,#5C
; 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35
; LCl,LAt,SPC,Rat,RCl,F01,F02,F03,F04,F05,F06,F07,F08
; 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42
; F09,F10,F11,F12,prn,scr,num,"/","*","-","+",ent,Del
; 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
; Ins,End,Dwn,PgD,Lft,"5",Rgh,Hom,Upp,PgU
; 50 51 52 53 54 55 56 57 58 59
;
;================================
Esc EQU #1B
Bcs EQU #08
Tab EQU #09
Cps EQU #00
Spc EQU #20
Ent EQU #0D
;Standart ASCII tables
NORMTAB DB "`",Esc,"1","2","3","4","5","6","7","8","9","0","-","=",Bcs
DB Tab,"q","w","e","r","t","y","u","i","o","p","[","]"
DB Cps,"a","s","d","f","g","h","j","k","l",";","'",Ent
DB #00,"z","x","c","v","b","n","m",#2C,".","/",#00,#5C
DB #00,#00,Spc,#00,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00
DB #00,#00,#00,"/","*","-","+",Ent,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00
ENDNORM
SHIFTAB DB "~",Esc,"!","@","#","$","%","^","&","*","(",")","_","+",Bcs
DB Tab,"Q","W","E","R","T","Y","U","I","O","P","{","}"
DB Cps,"A","S","D","F","G","H","J","K","L",":",#22,Ent
DB #00,"Z","X","C","V","B","N","M","<",">","?",#00,"|"
DB #00,#00,Spc,#00,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00
DB #00,#00,#00,"/","*","-","+",Ent,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00
CAPSTAB DB "`",Esc,"1","2","3","4","5","6","7","8","9","0","-","=",Bcs
DB Tab,"Q","W","E","R","T","Y","U","I","O","P","[","]"
DB Cps,"A","S","D","F","G","H","J","K","L",";","'",Ent
DB #00,"Z","X","C","V","B","N","M",#2C,".","/",#00,#5C
DB #00,#00,Spc,#00,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00
DB #00,#00,#00,"/","*","-","+",Ent,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00
SHF2TAB DB "~",Esc,"!","@","#","$","%","^","&","*","(",")","_","+",Bcs
DB Tab,"q","w","e","r","t","y","u","i","o","p","{","}"
DB Cps,"a","s","d","f","g","h","j","k","l",":",#22,Ent
DB #00,"z","x","c","v","b","n","m","<",">","?",#00,"|"
DB #00,#00,Spc,#00,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00
DB #00,#00,#00,"/","*","-","+",Ent,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00
;Standart Russian tables
NORMRUS DB #F1,Esc,"1","2","3","4","5","6","7","8","9","0","-","=",Bcs
DB Tab,#A9,#E6,#E3,#AA,#A5,#AD,#A3,#E8,#E9,#A7,#E5,#EA
DB Cps,#E4,#EB,#A2,#A0,#AF,#E0,#AE,#AB,#A4,#A6,#ED,Ent
DB #00,#EF,#E7,#E1,#AC,#A8,#E2,#EC,#A1,#EE,".",#00,#5C
DB #00,#00,Spc,#00,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00
DB #00,#00,#00,"/","*","-","+",Ent,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00
SHIFRUS DB #F0,Esc,"!",#22,"#","$",":",#2C,".",";","?","%","_","+",Bcs
DB Tab,#89,#96,#93,#8A,#85,#8D,#83,#98,#99,#87,#95,#9A
DB Cps,#94,#9B,#82,#80,#8F,#90,#8E,#8B,#84,#86,#9D,Ent
DB #00,#9F,#97,#91,#8C,#88,#92,#9C,#81,#9E,#2C,#00,"|"
DB #00,#00,Spc,#00,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00
DB #00,#00,#00,"/","*","-","+",Ent,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00
CAPSRUS DB #F0,Esc,"1","2","3","4","5","6","7","8","9","0","-","=",Bcs
DB Tab,#89,#96,#93,#8A,#85,#8D,#83,#98,#99,#87,#95,#9A
DB Cps,#94,#9B,#82,#80,#8F,#90,#8E,#8B,#84,#86,#9D,Ent
DB #00,#9F,#97,#91,#8C,#88,#92,#9C,#81,#9E,".",#00,#5C
DB #00,#00,Spc,#00,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00
DB #00,#00,#00,"/","*","-","+",Ent,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00
SHF2RUS DB #F1,Esc,"!",#22,"#","$",":",#2C,".",";","?","%","_","+",Bcs
DB Tab,#A9,#E6,#E3,#AA,#A5,#AD,#A3,#E8,#E9,#A7,#E5,#EA
DB Cps,#E4,#EB,#A2,#A0,#AF,#E0,#AE,#AB,#A4,#A6,#ED,Ent
DB #00,#EF,#E7,#E1,#AC,#A8,#E2,#EC,#A1,#EE,#2C,#00,"|"
DB #00,#00,Spc,#00,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00
DB #00,#00,#00,"/","*","-","+",Ent,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00
;================================
BEEP LD A,#10
OUT (#FE),A
LD B,D
LD C,E
BPP DEC BC
LD A,B
OR C
JR NZ,BPP
LD A,#00
OUT (#FE),A
LD B,D
LD C,E
BPP2 DEC BC
LD A,B
OR C
JR NZ,BPP2
DEC HL
LD A,H
OR L
JR NZ,BEEP
RET
COM_A EQU #19 ;!FIXIT sp2000.inc
DAT_A EQU #18 ;!FIXIT sp2000.inc
KINIT XOR A ;LD A,0
OUT (COM_A),A
INC A ;LD A,1
OUT (COM_A),A
XOR A ;LD A,0 ;#18
OUT (COM_A),A
LD A,3
OUT (COM_A),A
LD A,#C1
OUT (COM_A),A
LD A,4
OUT (COM_A),A
LD A,#07 ;#05
OUT (COM_A),A
LD A,5
OUT (COM_A),A
LD A,#62
OUT (COM_A),A
RET
;//MODULE: KEYINTER
;[END]

12
DSS/KNOWN.BUG Normal file
View File

@ -0,0 +1,12 @@
+ function WINCOPY & WINREST не запрещают прерывания перед вызовом BIOS (используется вывод стеком!).
- при выводе на консоль длинного текста, экран не скролируется. Проверять на достижение 80 позиции!
+ ошибка в функции SCROLL A=0.
+ ошибка при просмотре каталога в функциях установки атрибутов пропускаются системные файлы. п/п SEARCH MASK=#23
- игнорирование ошибок при записи системных областей FAT/DIR, невозможность отработать ошибку write-protect, так как она теряется при попытке записать измененный каталог на диск. Но возникает ошибка file not found так как сразо после создания система открывает файл.
- ошибка разбора допустимого имени файла, если оно состоит из "." так как подрузомевается пробелы точка пробелы.

613
DSS/RAM_DRV0.ASM Normal file
View File

@ -0,0 +1,613 @@
;
; 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 $
;

477
DSS/RAM_DRV1.ASM Normal file
View File

@ -0,0 +1,477 @@
; 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 $
;

67
DSS/Structures.inc Normal file
View File

@ -0,0 +1,67 @@
;
STRUCT _sStack ; 256 bytes
buffer BLOCK 255,0
SPoint BYTE 0
ENDS
;
;
STRUCT _sEXE_HEADER ; 512 bytes
EXE_EXT TEXT 3,{"EX","E"}
VERSION BYTE 0
OFFCOD1 WORD 0
OFFCOD2 WORD 0
LOADER WORD 0
RESERVED BLOCK 6,0
LD_ADDR WORD 0
PC_REG WORD 0
SP_REG WORD 0
RESERVED2 BLOCK 490,0
ENDS
;
;File Manipulator (FM)
STRUCT _sFM ; 44 bytes
.NAME: TEXT 8,{". "," "} ;+00 NAME
.EXT: TEXT 3,{" "," "} ;+08 EXT
.ATTRIBUT: BYTE #10 ;+11 ATTRIBUT
.RESERVED_L: BYTE 0 ;+12 RESERVED; !TODO á«¥¤ãî騩 ª« áâ¥à ¤«ï ç⥭¨ï
.RESERVED_H: BYTE 0 ;+13 RESERVED; !TODO á«¥¤ãî騩 ª« áâ¥à ¤«ï § ¯¨á¨
.RESERVED_X: BLOCK 8,0 ;+14 RESERVED
.TIME: WORD #0000 ;+22 TIME
.DATE: WORD #0000 ;+24 DATE
.ST_CLUSTER: WORD #0000 ;+26 START CLUSTER
.F_SIZE: DWORD #0000 ;+28 SIZE FILE
.F_POSITION: DWORD #0000 ;+32 FILE POSITION (FP)
.DIR_CLUSTER: WORD #0000 ;+36 DIRECTORY CLUSTER
.HANDLE: WORD #0000 ;+38 HANDLE NUMBER
.DRIVE: BYTE #00 ;+40 DRIVE OR CURRENT
.ACCESS_MODE: BYTE #00 ;+41 ACCESS MODE
.TASK_NUM: BYTE #00 ;+42 TASK
.EMPTY: BYTE #00 ;+43 EMPTY
ENDS
;
; NAM EQU 0 ; LEN4 EQU 31
; EXT EQU 8 ; POS1 EQU 32
; ATR EQU 11 ; POS2 EQU 33
; TIM1 EQU 22 ; POS3 EQU 34
; TIM2 EQU 23 ; POS4 EQU 35
; DAT1 EQU 24 ; DIRCLU1 EQU 36
; DAT2 EQU 25 ; DIRCLU2 EQU 37
; CLU1 EQU 26 ; HND1 EQU 38
; CLU2 EQU 27 ; HND2 EQU 39
; LEN1 EQU 28 ; FDRV EQU 40
; LEN2 EQU 29 ; AMODE EQU 41
; LEN3 EQU 30 ; FTASK EQU 42
;
STRUCT _sBuffers
FileManipulator _sFM ; 44 bytes * FMCOUNT
FM_RESERVE BLOCK _sFM * (FMCOUNT-1),0
BootSector _sBOOT_SEC ; 62 bytes ;!TODO ¯¥à¥­¥á⨠¢ ®¡« áâì ¡ãä¥à®¢
EXE_Header _sEXE_HEADER ; 512 bytes
Stack _sStack ; 256 bytes
Buffer BLOCK 512,0 ; FOR BUFFER & SECBUF
MemoryTable BLOCK 256,0 ; 256 bytes
ENDS
;

24
DSS/VERSION.INC Normal file
View File

@ -0,0 +1,24 @@
;
; DSS Version
VERS EQU 01 ;Version Number (XX.)
MODF EQU 70 ;Modification (.xx)
BUILD EQU 1
;
; Release Types
RELEASE EQU 0
RC EQU 1
BETA EQU 2
DP EQU 3
;
; Bulid Type
OSTYPE EQU BETA
REVISION EQU 1
;
; Default date
DAY EQU 30
MONTH EQU 03
YEAR EQU 2023
;

682
DSS/VIDEO.ASM Normal file
View File

@ -0,0 +1,682 @@
;[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]

36
DSS/defines.inc Normal file
View File

@ -0,0 +1,36 @@
;
DEFINE TEST_FEATURE 1
;
;
DEFINE SHORT_RSTx10_TABLE 0 ; 㪮à®ç¥­­ ï â ¡«¨æ  ä㭪権 rst #10. 96 ä㭪権.
;
;
DEFINE MAX_RAMDRIVES 16
DEFINE NeedSafePort_Y 1
DEFINE TABisSPACES 1
DEFINE CLASSIC_CURSOR 0
;
;-------------------[MEMORY]-------------------------;
DEFINE USING_MEMPAGES 4
;!FIXIT ᤥ« âì ⨯  DIRPAGE EQU 0 + BANKTBL ¨ ã¯à®áâ¨âì BANK
DIRPAGE EQU 0
FATPAGE EQU 1
TXTPAGE EQU 2
ENVPAGE EQU 2
DRVPAGE EQU 3
;
DIRSPEC.DEPTH EQU 256 ; '\' + 1..255
TXTADDR EQU #C000
ENVADDR EQU #E400
DIR EQU #C000
FAT EQU #C000
FMCOUNT EQU 10 ; Š®«¨ç¥á⢮ ä ©«®¢ëå ¬ ­¨¯ã«ïâ®à®¢
HANDBUF.SIZE EQU 32
;----------------------------------------------------;
;

1
Shared_Includes Submodule

@ -0,0 +1 @@
Subproject commit 6e27011b6259b0256ce65d91a53ef1185223eafa