diff --git a/BOOT/BOOT.ASM b/BOOT/BOOT.ASM
deleted file mode 100644
index 6f51bb4..0000000
--- a/BOOT/BOOT.ASM
+++ /dev/null
@@ -1,706 +0,0 @@
-; Последняя редакция: 25.04.2006
-
-; Программа записи на FDD/HDD boot-загрузчика и файлов системы.
-;
-; Загружает сист. файлы из корня диска, с которого была
-; загружена система.
-;
-
-
-; Фитчи программы:
-; В отличие от оригинального boot-инсталлятора, эта может
-; переписывать уже установленный boot-загрузчик.
-; Файлы системы (system.dos, system.exe) могут иметь
-; любые размеры.
-; При загрузке компьютера с дискеты, запрашивается новая
-; дискета для создания из нее загрузочной.
-;
-;
- 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
-
-
-
-;----------------------------------------------------
-; По размеру файла рассчитать необходимое
-; число страниц и выделить их.
-; Выход: 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 ; путь системы
-
diff --git a/BOOT/BOOTNAME.ASM b/BOOT/BOOTNAME.ASM
deleted file mode 100644
index 33a4f70..0000000
--- a/BOOT/BOOTNAME.ASM
+++ /dev/null
@@ -1,155 +0,0 @@
-;[BEGIN]
-;
-; BOOTNAME.EXE
-;
- MODULE BOOTname
-
- ORG #8100-512
- INCLUDE "dss.inc"
- DB "EXE" ;EXE ID
- DB #00 ;EXE VERSION
- DW #0200 ;CODE OFFSET LOW
- DW #0000 ;CODE OFFSET HIGH
- DW #0000 ;END-BEG ;PRIMARY LOADER
- DW #0000 ;
- DW #0000 ;RESERVED
- DW #0000 ;
- DW #8100 ;LOAD ADDRESS
- DW #8100 ;START ADDRESS
- DW #BFFF ;STACK ADDRESS
- DS 490
-
-START
- LD BC,0*256+DSS_BOOTDSK
- LD C,2 ;curdisk
- RST #10
- JR C,NERR
- ADD A,"A" ;correct to the human format
- LD (BOOTDRIVE),A
- LD HL,BOOTSTRING
- LD BC,2*256+DSS_ENVIRON
- RST #10
-NERR CALL C,ERROR
- LD C,DSS_EXIT
- RST #10
- RET
-
-BOOTSTRING DB "BOOTDISK="
-BOOTDRIVE DB "C:",0
-
-CRLF LD A,#0D
- LD C,DSS_PUTCHAR
- RST #10
- LD A,#0A
- LD C,DSS_PUTCHAR
- RST #10
- RET
-
-ERROR LD E,A
- LD D,0
- JP ERR_MSG
-
-ERR_MSG CALL FMESAGE
- CALL PRINTZ
- CALL CRLF
- CALL CRLF
- RET
-
-FMESAGE INC DE
- LD HL,ERR0
- LD BC,ERR1-ERR0
-LCPIR XOR A
- CPIR
- RET PO
- RET NZ
- DEC DE
- LD A,D
- OR E
- JP NZ,LCPIR
- RET
-
-PUTPRM LD BC,15
-PUTPRMA LD A,(HL)
- LDI
- RET PO
- OR A
- JR NZ,PUTPRMA
- RET
-
-PRINTZ LD A,(HL)
- INC HL
- OR A
- RET Z
- CP "%"
- JR NZ,PRINTZ2
- LD A,(HL)
- INC HL
- SUB "1"
- PUSH HL
- LD L,A
- LD H,0
- ADD HL,HL
- ADD HL,HL
- ADD HL,HL
- ADD HL,HL
- LD BC,PRM1
- ADD HL,BC
- LD C,DSS_PCHARS
- RST #10
- POP HL
- JR PRINTZ
-PRINTZ2 LD C,DSS_PUTCHAR
- RST #10
- JP PRINTZ
-
-PRM1 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-PRM2 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-PRM3 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-PRM4 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-PRM5 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-PRM6 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-PRM7 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-PRM8 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-PRM9 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
-ERR0 DB #00
- DB "Bad command or file name",0
- DB "Invalid function",0
- DB "Invalid drive number",0
- DB "File not found",0
- DB "Path not found",0
- DB "Invalid handle",0
- DB "Extended error 6",0
- DB "File exist",0
- DB "File read only",0
- DB "Root overflow",0
- DB "No free space",0
- DB "Directory not empty",0
- DB "Can't delete current directory",0
- DB "Invalid media",0
- DB "Unknown operation",0
- DB "Directory exist",0
- DB "Invalid filename",0
- DB "Invalid EXE-file",0
- DB "Not supported EXE-file",0
- DB "Access denied",0
- DB "Not ready",0
- DB "Seek error",0
- DB "Sector not found",0
- DB "CRC error",0
- DB "Write protect",0
- DB "Read error",0
- DB "Write error",0
- DB "Drive failure",0
- DB "Extended error 28",0
- DB "Extended error 29",0
- DB "No free memory",0
- DB "Invalid memory block",0
- DB "Extended error 32",0
- DB "Extended error 33",0
- DB "Extended error 34",0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-ERR1
-;
- ENDMODULE
-;
\ No newline at end of file
diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM
index eeef089..1a71a5a 100644
--- a/BOOT/DSSBOOT.ASM
+++ b/BOOT/DSSBOOT.ASM
@@ -1,6 +1,6 @@
-;---------------------------------------------------------------
+;------------------------------------------------------------------------------
;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
@@ -12,745 +12,1301 @@
; + Initial revision 09 Nov 1998 +
; +------------------------------+
+ MODULE DSS_Boot_Loader
+
+; BIOS 3.06 загружает один сектор загрузчика и передаёт ему управление.
+
+ ; 0 - оригинальный вариант запуска DSS, 1 - вариант Саймана
DEFINE ORIGINAL_DSS 0
+ ; 1 - будет грузить версию Саймана и основную. 0 - только основную.
DEFINE UNIVERSAL_BOOT 1
- DISP #8000
+;------------------------------------------------------------------------------
+ORG_ADDRESS EQU #8000
+MAX_SECTORS_PER_PAGE EQU #20 ;максимальное кол-во секторов в странице ;!TODO а если сектор больше 512?
+LOAD_SECTORS EQU SECTORS_OF_LOADER.AFTER_BPB
+LOADER_IN_BPB:
+.MAX_SIZE EQU _sBOOT_SECTOR.PARTITION_TABLE - _sBOOT_SECTOR_PARAMS_FAT32
+;------------------------------------------------------------------------------
+
+ DISP ORG_ADDRESS
OUTPUT 'build/DSSloader.bin'
-ADRIVE EQU #00
-CDRIVE EQU #02
+;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
+DRIVE: _mSYSID
+ DI
+ ; ;!TEST 26/03/2024
+ LD SP,#C000
+ ; ;
+ LD (DRIVE),A
+ ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого
+ XOR A
+ LD (DRIVE+1),A
+ ;
+ LD C,BIOS.DRV_VERSION
+ RST ToBIOS_18
+ ;
+ LD HL,FAIL
+ PUSH HL
+ ;
+ LD HL,MESSAGES.INCORR
+ RET C ; goto FAIL
+ LD A,(DRIVE)
+ BIT 7,A
+ JR Z,GOOD_DRIVE
+ EX DE,HL
+ LD DE,2*256 + 21 ;!HARDCODE если версия ниже 2.21, то ошибка
+ SBC HL,DE
+ LD HL,MESSAGES.INCORR
+ RET C ; goto FAIL
+ ;
+GOOD_DRIVE: LD DE,#8200 ;!HARDCODE
+ LD HL,0
+ LD IX,2
+ LD BC,LOAD_SECTORS*256 + BIOS.DRV_READ ; дозагрузка секторов загрузчика
+ LD A,(DRIVE)
+ RST ToBIOS_18
+ JP NC,CONTINUE
+ JR FAIL.NULL
+////////////////////////////////////////////////////////////////////////
+FAIL: CALL MESSAGE
+.NULL: LD HL,MESSAGES.FAILURE
+ CALL MESSAGE
+ JR $
+;
+MESSAGE: ;R01 Start
+ XOR A
+ OUT (SYS_PORT.ON),A
+.loop: LD A,(HL) ;R01
+ INC HL
+ OR A
+ RET Z
+ CALL PRINTX
+ JR .loop
+;
+PRINTX: CP "\r" ;
+ JR Z,.CR_
+ CP "\n" ;
+ JR Z,.LF_
+ LD BC,1*256 + BIOS.LP_PRINT_SYM
+ RST ToBIOS_18
+ RET
+ ;
+.CR_: LD C,BIOS.LP_GET_PLACE
+ RST ToBIOS_18
+ LD E,0
+ LD C,BIOS.LP_SET_PLACE
+ RST ToBIOS_18
+ RET
+ ;
+.LF_: LD C,BIOS.LP_GET_PLACE
+ RST ToBIOS_18
+ LD A,#1F
+ CP D
+ JR NZ,.LF2
+ PUSH DE
+ PUSH HL
+ LD DE,#0020
+ LD BC,1*256 + BIOS.LP_SCROLL_UD
+ RST ToBIOS_18
+ ;
+ LD DE,#1F00
+ LD C,BIOS.LP_SET_PLACE
+ RST ToBIOS_18
+ ;
+ LD A," "
+ LD BC,#50 + BIOS.LP_PRINT_SYM
+ RST ToBIOS_18
+ POP HL
+ POP DE
+ DEC D
+.LF2: INC D
+ LD C,BIOS.LP_SET_PLACE
+ RST ToBIOS_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
+MESSAGES:; 0 10 20 30 40 50 60 70 80
+.INCORR: DB "\r\nOld BIOS version.\r\n",0
+.ERRPART: DB "\r\nUnknown partition table.",0
+.FAILURE: DB "\r\nFatal error! Press RESET to restart.\r\n",0
+.ERRIBPB: DB "\r\nInvalid BOOT sector.",0
+.NO_SYS: DB "\r\nCan't open SYSTEM.DOS...",0
+.NOSHELL: DB "\r\nCan't open SYSTEM.EXE...",0
+.STARTDO: DB "\r\nStarting DSS... \r\n\n",0
+;
+SHELL_NAME: DB '\SYSTEM.EXE /P',0
+ROOT: DB 'X:\',0
+CORE_NAME: DB "SYSTEM DOS"
+.Size EQU $-CORE_NAME
+////////////////////////////////////////////////////////////////////////
+ ASSERT $<#8200, "Error!!! BIOS LOADING ONLY FIRST #200 BYTES"
+////////////////////////////////////////////////////////////////////////
-CONTINU
- LD HL,0
- LD (DISKL),HL
- LD (DISKH),HL
+CONTINUE: LD HL,0
+ LD (PARTITION_START_L),HL
+ LD (PARTITION_START_H),HL
+ ;
+ LD BC,1*256 + BIOS.GetMem
+ RST ToBIOS_18 ;GET PAGE FOR DOS
+ LD (LOAD_CORE.BANKDOS),A
+ OUT (SLOT0),A
+ ;
+ CALL GET_BPB ;READ BPB
+ LD HL,MESSAGES.ERRIBPB
+ RET C ; goto FAIL
+ CALL GETROOT
+ ;
+ LD HL,MESSAGES.NO_SYS
+ RET C ; goto FAIL
+ ; [ ] загрузка system.dos больше #4000 байтов
+ LD HL,(FSIZE1)
+ LD A,H
+ OR L
+ JR NZ,.set_size
+ LD DE,(FSIZE0)
+ LD HL,#4000
+ SBC HL,DE
+ JR NC,.set_no_size
+.set_size: LD A,#FF
+.set_no_size: LD (LOAD_CORE.BIG_CORE),A
+ OR A
+ PUSH AF
+ ; загрузка
+ EXX
+ LD HL,(FCLUSTER_H)
+ EXX
+ LD HL,(FCLUSTR_L)
+ LD DE,#C000
+ ; -bug: счётчик для .SMALL_CLUSTER, баг отрепортил Vasil Ivanov
+ ; LD A,MAX_SECTORS_PER_PAGE
+ ; LD (LOAD_CORE.BIG_CORE),A
+ ;
+ CALL LOAD_CORE
+ ; [ ] загрузка system.dos больше #4000 байтов
+ EX AF,AF'
+ POP AF
+ JR Z,.no_big_core
+ EX AF,AF'
+ JR C,.no_big_core
+ ;
+ IN A,(SLOT1)
+ LD (LOAD_CORE.BANKDOS),A
+ LD A,SUBLOAD_SIZE + 1
+ LD (LOAD_CORE.max_sectors),A
+ LD (LOAD_CORE.BIG_CORE),A ; теперь это счётчик оставшихся секторов
+ ;
+ LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster)
+ CP MAX_SECTORS_PER_PAGE + 1 ; кол-во загружаемых секторов
+ JP NC,INC_SECTOR_NUM
+ CALL READ_FROM_FAT ; next cluster in chain
+ EX DE,HL
+ EXX
+ EX DE,HL
+ EXX
+ LD DE,#C000
+ CALL NC,LOAD_CORE
+.no_big_core: ;
+RUN_CORE: DI
+ ;
+ LD A,(READ_FAT_TABLE.FAT_PAGE)
+ LD C,BIOS.FreeMem
+ RST ToBIOS_18
+ ;
+ 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
+ ;
+ ;DOS LOADED
+ ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого
+ LD A,(DRIVE+1) ; номер раздела
+ LD L,A
+ ;
+ LD A,(DRIVE) ; номер устройства
+ LD C,Dss.Version
+ RST ToDSS
+ JP C,FAIL.NULL
+ ;
+ LD HL,MESSAGES.STARTDO
+ CALL MESSAGE
+ ;
+ XOR A
+ OUT (SYS_PORT.OFF),A
+ ;
+ LD A,(DRIVE)
+ LD BC,Dss.BootDSK.Set
+ RST ToDSS
+ ;
+ LD BC,Dss.BootDSK.Get
+ RST ToDSS
+ ;
+ ADD A,"A"
+ ;
+ LD HL,ROOT
+ LD (HL),A
+ LD C,Dss.ChDir
+ RST ToDSS
+ ;
+ LD HL,SHELL_NAME
+ LD BC,Dss.Exec
+ RST ToDSS
- 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
+.NoShell: JP NC,FAIL.NULL
+ LD HL,MESSAGES.NOSHELL
+ CP DSS_Error.sys.UNEXPECTED_APP_TRMN
+ JP NZ,FAIL
+ JP FAIL.NULL
- LD HL,(FCLUSTR)
- LD DE,#C000
- CALL FLOAD
- DI
- XOR A
- OUT (SYS_PORT.OFF),A
+;
+INC_SECTOR_NUM: PUSH DE
+ CALL CLUSTER_TO_SECTOR
+ CALL GET_ABSOLUTE_SECTOR
+ LD DE,MAX_SECTORS_PER_PAGE ; количество прочитанных секторов
+ ADD IX,DE
+ JR NC,.no_inc
+ INC HL
+.no_inc: ;
+ POP DE
+ LD BC,RUN_CORE
+ PUSH BC
+ PUSH HL ; для баланса
+ PUSH HL ; для баланса
+ JP LOAD_CORE.subload
+;
- LD A,#10
- LD BC,#7FFD
- OUT (C),A
+;
+PART_TB: LD HL,(BOOT_BUFFER + BOOT_SECTOR.MBR_SIGNATURE)
+ LD DE,#AA55
+ ; CF = 0
+ SBC HL,DE
+ SCF
+ RET NZ
+ ;
+ PUSH BC
+ LD IX,BOOT_BUFFER + BOOT_SECTOR.PARTITION_TABLE
+ LD B, +(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD)
+ ;
+ ;LD HL,YEPDOS
+ ;
+.part_loop: LD A,(IX + _sMBR_PARTITION_RECORD.FS_ID)
+ ; ЕСЛИ добавится поддержка ещё нескольких типов ФС, то поменять 1fs на 2fs
+ ; 1
+ CP PartitionSysTypes.FAT16_LBA
+ JR Z,YEPDOS
+ CP PartitionSysTypes.FAT16
+ JR Z,YEPDOS
+ CP PartitionSysTypes.FAT16_32Mb
+ JR Z,YEPDOS
+ CP PartitionSysTypes.FAT12
+ JR Z,YEPDOS
+ CP PartitionSysTypes.FAT32
+ JR Z,YEPDOS
+ CP PartitionSysTypes.FAT32_LBA
+ JR Z,YEPDOS
+ ;
+ ; 2fs
+ ; EXX
+ ; LD HL,SUPPORTED_PARTITIONS
+ ; LD BC,SUPPORTED_PARTITIONS.Size
+ ; CPIR
+ ; EXX
+ ; RET Z ;JR Z,YEPDOS
+ ;
+.next: LD DE,_sMBR_PARTITION_RECORD
+ ADD IX,DE
+ DJNZ .part_loop
+ ;
+ LD HL,MESSAGES.ERRPART
+ JP FAIL
+; 2fs
+ ; SUPPORTED_PARTITIONS:
+ ; ;.Empty DB #00
+ ; .FAT12 DB #01
+ ; .FAT16_32Mb DB #04
+ ; ;.Extended DB #05
+ ; .FAT16 DB #06
+ ; ;.HPFS_NTFS DB #07
+ ; .FAT32 DB #0B
+ ; .FAT32_LBA DB #0C
+ ; .FAT16_LBA DB #0E
+ ; ;.Win_Ext_LBA DB #0F
+ ; ;.Linux_swap DB #82
+ ; ;.Linux DB #83
+ ; ;.Linux_extended DB #85
+ ; .Size EQU $-SUPPORTED_PARTITIONS
+;
- LD A,1
- LD B,#1F ;1FFD
- OUT (C),A
+;
+YEPDOS: ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого
+ LD A,#80
+ CP (IX + _sMBR_PARTITION_RECORD.isActive)
+ JR NZ,PART_TB.next
+ LD A,4 ;!HARDCODE счетчик записей партиций в MBR
+ SUB B
+ PUSH AF ; номер загрузочного раздела
+ ;
+ LD L,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 0)
+ LD H,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 1)
+ PUSH HL
+ LD (PARTITION_START_L),HL
+ LD L,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 2)
+ LD H,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 3)
+ POP IX
+ LD (PARTITION_START_H),HL
+ LD A,(DRIVE)
+ LD DE,BOOT_BUFFER
+ LD BC,1*256 + BIOS.DRV_READ
+ RST ToBIOS_18
+ ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого
+ POP AF
+ POP BC
+ LD L,A ; номер загрузочного раздела
+ LD A,C
+ ;
+ RET
+ ;
- LD A,(BANKDOS)
- OUT (SLOT0),A
+;
+GET_BPB: XOR A
+ LD HL,FatBuffer
+ LD B,_sysFatBuffer
+.loop_clear: LD (HL),A
+ INC HL
+ DJNZ .loop_clear
-;DOS LOADED
- IF UNIVERSAL_BOOT
+ LD H,A
+ LD L,A
+ ; LD (FatBuffer.FAT1_SEC_H),HL ; high word first sector FAT #1
+ ; LD (FatBuffer.RootDirFirstSector_H),HL
+ ; LD (FatBuffer.SectorsPerFAT_H),A
+ ;
+ PUSH HL
+ POP IX
+ LD DE,BOOT_BUFFER
+ LD BC,1*256 + BIOS.DRV_READ
+ LD A,(DRIVE)
+ RST ToBIOS_18
+ RET C
+ ; перекидывание части загрузчика из 0 сектора
+ LD HL,BOOT_BUFFER + (_sBOOT_SECTOR.PARTITION_TABLE - ZERO_SECTOR_OF_BPB.Size)
+ LD DE,ZERO_SECTOR_OF_BPB
+ LD BC,ZERO_SECTOR_OF_BPB.Size
+ LDIR
+ ;
+ ; -bug: пересечение буферов FAT и SYSTEM.DOS, баг отрепортил Vasil Ivanov
+ LD BC,1*256 + BIOS.GetMem
+ RST ToBIOS_18 ;GET PAGE FOR DOS
+ LD (READ_FAT_TABLE.FAT_PAGE),A
+ ;
+ ;
+ LD A,(DRIVE)
+ LD B,A
+ AND #F0
+ LD C,A
+ CP #80
+ JR NZ,.NX1
+ CALL PART_TB ;HDD
+ RET C
+ ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого
+ LD (DRIVE+1),HL
+ ;
+.NX1: ;CP #00
+ AND A
+ JR NZ,.NX2
+ ;
+ ; SET_PRM if FDD
+ PUSH BC
+ LD A,B
+ LD C,BIOS.DRV_GET_PAR
+ RST ToBIOS_18
+ LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerTrack)
+ LD L,A
+ POP AF
+ LD C,BIOS.DRV_SET_PAR
+ RST ToBIOS_18
+ ;
+.NX2: LD HL,(BOOT_BUFFER + BOOT_SECTOR.MBR_SIGNATURE)
+ LD DE,#AA55
+ ;AND A
+ SBC HL,DE
+ SCF
+ RET NZ
+ ;
+ LD A,(BOOT_BUFFER + BOOT_SECTOR.DRIVE_TYPE)
+ CP #F0
+ RET C
+ ;
+ ;LD HL,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector)
+ LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster)
+ LD (FatBuffer.SectorsPerCluster),A
+ ; calc. first sector FAT
+ LD HL,(BOOT_BUFFER + BOOT_SECTOR.RESERVED_SECTORS)
+ LD (FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1
+ ;
+ XOR A
+ LD B,A
+ LD C,A
+ EXX
+ LD H,A
+ LD L,A
+ LD D,A
+ LD E,A
+ EXX
+ ;
+ ;LD BC,0
+ LD DE,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT16)
+ LD A,E
+ OR D
+ JR NZ,.skip_high
+ ;
+ EXX
+ LD DE,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT32 + 2)
+ LD A,E
+ EXX
+ ;LD BC,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT32 + 2)
+ ;LD A,C
+ LD (FatBuffer.SectorsPerFAT_H),A
+ LD DE,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT32)
+ ;
+.skip_high: LD (FatBuffer.SectorsPerFAT_L),DE
+ LD A,(BOOT_BUFFER + BOOT_SECTOR.Number_of_FATs) ; amount FATs
+ CP 1
+ JR Z,.one_FAT
+ DEC A
+ ADD HL,DE
+ EXX
+ ADC HL,DE
+ EXX
+ ;JR NC,.no_inc_BC
+ ;INC BC
+.no_inc_BC: ;
+.one_FAT: ;
+.loop1: ADD HL,DE
+ EXX
+ ADC HL,DE
+ EXX
+ ;JR NC,.loop1_1
+ ;INC BC
+.loop1_1: DEC A
+ JR NZ,.loop1
+ ;
+ LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR
+ EXX
+ ; можно сразу тут загнать старший байт, потому-что дла FAT32 следующий расчёт - это прибавление нуля.
+ LD (FatBuffer.FirstDataSector_H),HL
+ EXX
+ ;LD (FatBuffer.FirstDataSector_H),BC
+ LD BC,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector)
+ LD A,B
+ AND A
+ ;
+ RL C
+ RLA
+ RL C
+ RLA
+ RL C
+ RLA
+ ;
+ LD C,A
+ LD B,0 ; BC - File handels in sectors
+ ;
+ EX DE,HL
+ LD HL,(BOOT_BUFFER + BOOT_SECTOR.FilesInRootDIR) ; 0 for fat32
+ LD A,H
+ OR L
+ JR Z,.skip_loop2
+ ;
+ DEC HL
+ XOR A
+.loop2: INC A
+ RET C
+ SBC HL,BC
+ JR NC,.loop2
+ ;
+.skip_loop2: EX DE,HL
+ LD C,A ; A - sectors in DIR
+ LD B,0
+ LD (FatBuffer.DirSizeInSectors),A
- LD A,(DRIVE)
- LD C,#00
- RST #10
- jp c,XFAIL
+ ADD HL,BC ; Start DATA area
+ LD (FatBuffer.FirstDataSector_L),HL
+ ; B = 0
+ ;
+ LD HL,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector)
+ LD A,(FatBuffer.SectorsPerCluster)
+ ;!TODO FATcacheSize
+ ; calc. cluster size
+ XOR 1
+ JR Z,.loop3.end
+ RRA
+.loop3: ADD HL,HL
+ RRA
+ JP NC,.loop3
+.loop3.end: ;
+ LD (FatBuffer.BytesPerCluster),HL
+ ; проверка на размер кластера больше 32 кб - не поддерживается ; !TODO
+ ; .....
+ ;
+////////////////////////////////////////////////////////////////////////
+ ;
+ LD HL,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerDrive)
+ LD BC,0
+ LD A,H
+ OR L
+ JP NZ,.HDDSMAL
+ ;
+ LD HL,(BOOT_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_L)
+ LD BC,(BOOT_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_H)
+.HDDSMAL: ;
+ PUSH BC ; Total Sectors high
+ PUSH HL ; Total Sectors low
+ XOR A
+ ;LD H,A
+ ;LD L,A
+ ;LD (FatBuffer.CacheBlock),HL
+ ; A = 0
+ LD DE,(FatBuffer.SectorsPerFAT_H)
+ LD D,A
+ LD HL,(FatBuffer.SectorsPerFAT_L)
+ ; DE:HL = SectorsPerFAT
+ ;
+ LD A,(BOOT_BUFFER + BOOT_SECTOR.Number_of_FATs)
+ LD B,A
+ DEC A
+ JR Z,.loop_mul_end
+ ; .Number_of_FATs * .SectorsPerFAT
+.loop_mul: ADD HL,HL
+ EX DE,HL
+ ADC HL,HL
+ EX DE,HL
+ DJNZ .loop_mul
+.loop_mul_end: ; .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT
+ LD B,0
+ LD A,(FatBuffer.DirSizeInSectors)
+ LD C,A
+ ADD HL,BC
+ JR NC,.no_inc_DE
+ INC DE
+.no_inc_DE: ; .RESERVED_SECTORS + .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT
+ LD BC,(BOOT_BUFFER + BOOT_SECTOR.RESERVED_SECTORS)
+ ADD HL,BC
+ JR NC,.no_inc_de
+ INC DE
+.no_inc_de: ; Total_Sectors - (.RESERVED_SECTORS + .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT)
+ AND A
+ LD B,D
+ LD C,E
+ POP DE ; Total Sectors low
+ EX DE,HL
+ SBC HL,DE
+ EX (SP),HL ; Total Sectors high
+ SBC HL,BC
+ POP DE ; Total Sectors low
+ ; HL:DE = DataSec
+ ;
+ LD A,(FatBuffer.SectorsPerCluster)
+ ; HL:DE / A => DE:BC, H=0, L - остаток
+ ;CALL DIV_by_Shifts
+ LD C,A
+ DEC A
+ JR Z,.DIV_exit
+ ;
+ AND E
+ LD B,A ; остаток
+ LD A,C
+ RRCA
+ ;
+.DIV_loop: SRL H
+ RR L
+ RR D
+ RR E
+ RRCA
+ JP NC,.DIV_loop
+ LD A,B
+.DIV_exit: LD B,D
+ LD C,E
+ EX DE,HL
+ LD H,0
+ LD L,A
+ ;
+ ; выясняем разрядность FAT
+ LD A,D
+ OR E
+ JR NZ,.its_FAT32
+ ; DE=0
+ ; LD (FatBuffer.RootDirStartCluster_L),DE
+ ; LD (FatBuffer.RootDirStartCluster_H),DE
+ LD HL,4084
+ SBC HL,BC
+ LD A,FAT_TYPE.x12
+ JR NC,.SET_VARS
+ ;
+ LD HL,65524
+ SBC HL,BC
+ LD A,FAT_TYPE.x16
+ JR NC,.SET_VARS
+ ;
+.its_FAT32: LD A,(BOOT_BUFFER + BOOT_SECTOR.MainFATnumber)
+ CP #80
+ JR C,.mirrored_FATs ;если все копии FAT используются
+ ; используется только одна копия FAT
+ LD HL,(FatBuffer.FAT1_SEC_H)
+ LD DE,(FatBuffer.SectorsPerFAT_H)
+ LD D,0
+ EXX
+ LD HL,(FatBuffer.FAT1_SEC_L)
+ LD DE,(FatBuffer.SectorsPerFAT_L)
+ AND #0F
+ JR Z,.first_FAT_active
+ LD B,A
+ ;
+.fat_calc_loop: ADD HL,DE
+ EXX
+ ADC HL,DE
+ EXX
+ DJNZ .fat_calc_loop
+ ;
+.first_FAT_active:
+ LD (FatBuffer.FAT1_SEC_L),HL
+ EXX
+ LD (FatBuffer.FAT1_SEC_H),HL
+.mirrored_FATs: ;
+ LD HL,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster)
+ LD DE,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster+2)
+ LD (FatBuffer.RootDirStartCluster_L),HL
+ LD (FatBuffer.RootDirStartCluster_H),DE
+ CALL CLUSTER_TO_SECTOR.no_prepare
+ LD (FatBuffer.RootDirFirstSector_L),IX
+ LD (FatBuffer.RootDirFirstSector_H),HL
+ LD A,FAT_TYPE.x32
+ ;
+.SET_VARS: LD (FatBuffer.FAT_TYPE),A
+ LD DE,0
+ CALL READ_FAT_TABLE
+ AND A
+ RET
+ ;
- LD A,STARTDO
- CALL DOSMESS
- LD A,(DRIVE)
- LD B,1
- LD C,Dss.BootDSK
- RST #10
+;NSECTOR:
+; in: HL':HL - CLUSTER
+; out: HL:IX - SECTOR
+CLUSTER_TO_SECTOR:
+ EXX
+ PUSH HL
+ EXX
+ POP DE
+ ; DE:HL - cluster
+ ;
+.no_prepare: PUSH BC
+ LD BC,-2
+ ADD HL,BC
+ JR C,.no_dec_de
+ DEC DE
+.no_dec_de: ; cluster = cluster - 2
+ ;
+ LD A,(FatBuffer.SectorsPerCluster)
+ XOR 1
+ JR Z,.skip
+ ;
+ RRA
+.loop: ADD HL,HL
+ RL E
+ RL D
+ ;
+ RRA
+ JR NC,.loop
+ ;
+.skip: EX DE,HL
+ PUSH DE
+ POP IX
+ LD DE,(FatBuffer.FirstDataSector_L)
+ ADD IX,DE
+ LD DE,(FatBuffer.FirstDataSector_H)
+ ADC HL,DE
+ ;
+ POP BC
+ RET
+ ;
- 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
+; поиск system.dos
+GETROOT: LD HL,(FatBuffer.RootDirStartCluster_L)
+ PUSH HL
+ LD HL,(FatBuffer.RootDirStartCluster_H)
+ PUSH HL
+ LD A,(FatBuffer.FAT_TYPE)
+ CP FAT_TYPE.x32
+ LD A,(FatBuffer.DirSizeInSectors)
+ JR NZ,.load_and_search
+ ;
+ LD A,(FatBuffer.SectorsPerCluster);!FIXIT прочтёт только первый кластер каталога на FAT32
+.load_and_search:
+ LD HL,(FatBuffer.RootDirFirstSector_H)
+ LD IX,(FatBuffer.RootDirFirstSector_L)
+ ;LD BC,(PARTITION_START_L)
+ ;LD DE,(PARTITION_START_H)
+ ; [x] 28/04/2024. Bug with incorrect reading root dir. Reported by Roman "Romychs" Boykov.
+ ;ADD IX,BC
+ ;ADC HL,DE
+ ;
+.NEXT_CLUSTER: CALL GET_ABSOLUTE_SECTOR
+ CALL .NEXT_SECTOR
+ ;
+ POP HL
+ EXX
+ POP HL
+ RET C
+ RET NZ
+ CALL READ_FROM_FAT
+ RET C
+ EX DE,HL
+ PUSH HL
+ EXX
+ EX DE,HL
+ PUSH HL
+ EXX
+ ; in: HL':HL - CLUSTER
+ ; out: HL:IX - SECTOR
+ CALL CLUSTER_TO_SECTOR
+ LD A,(FatBuffer.SectorsPerCluster)
+ JR .NEXT_CLUSTER
+ ;
+ ;
+.NEXT_SECTOR: PUSH AF
+ ; [x] 28/04/2024. Bug with incorrect reading root dir. Reported by Roman "Romychs" Boykov.
+ ;ADD IX,BC
+ ;ADC HL,DE
+ ;
+ PUSH IX
+ PUSH HL
+ LD BC,1*256 + BIOS.DRV_READ
+ LD DE,DIR_BUFFER
+ LD A,(DRIVE)
+ RST ToBIOS_18
+ CALL SEARCH
+ POP HL
+ POP IX
+ POP BC
+ RET C
+ RET NZ
+ LD A,B
+ ; next sector
+ LD BC,1
+ ; [x] 28/04/2024. Bug with incorrect reading root dir. Reported by Roman "Romychs" Boykov.
+ ADD IX,BC
+ JR NC,.no_inc_HL
+ INC HL
+.no_inc_HL: ;
+ DEC A
+ JR NZ,.NEXT_SECTOR
+ RET
+ ;
+; ; ;
- LD A,STARTDO
- CALL DOSMESS
+; вход: HL:IX - относительный сектор
+; выход: HL:IX - абсолютный сектор
+GET_ABSOLUTE_SECTOR:
+ LD DE,(PARTITION_START_L)
+ ADD IX,DE
+ LD DE,(PARTITION_START_H)
+ ADC HL,DE
+ RET
+;
- 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
+SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1
+ LD IX, DIR_BUFFER - FAT_DIRECTORY_RECORD
+.SKIPNAM: LD DE,FAT_DIRECTORY_RECORD
+.SKIPNAM_DE: ADD IX,DE
+ DEC C
+ RET Z
+ ;
+ LD A,(IX+FAT_DIRECTORY_RECORD.NAME)
+ OR A
+ SCF
+ RET Z
+ ;
+ CP #E5
+ JR Z,.SKIPNAM_DE
+ ;
+ LD A,(IX+FAT_DIRECTORY_RECORD.ATTRIBUT)
+ AND FAT_ATTR.DIRECTORY
+ JR NZ,.SKIPNAM_DE
+ ;
+ LD DE,CORE_NAME
+ PUSH IX
+ POP HL
+ LD B,CORE_NAME.Size
+ ;
+.loop: LD A,(DE)
+ CP (HL)
+ JR NZ,.SKIPNAM
+ INC HL
+ INC DE
+ DJNZ .loop
+ ;
+ PUSH IX
+ POP HL
+ LD DE,HANDBUF
+ LD BC,FAT_DIRECTORY_RECORD
+ LDIR
+ ; ZF = 1, CF = 0, A != 0
+ AND A ; на выходе ZF = CF = 0
+ RET
; HL - CLUSTER
; DE - ADDRESS
+; !TODO сделать тут определение размера SYSTEM.DOS
+; [ ] и возможность загрузить больше 1 страницы
+LOAD_CORE: LD (READMEM),DE
+.loop: PUSH HL
+ EXX
+ PUSH HL
+ EXX
+ ;
+ CALL CLUSTER_TO_SECTOR
+ ;
+ ;LD A,(FatBuffer.FAT_TYPE)
+ ; CP FAT_TYPE.x32
+ ; JR NZ,.skip_it
+ ;
+ ;LD DE,(PARTITION_START_L)
+ ;ADD IX,DE
+ ;LD DE,(PARTITION_START_H)
+ ;ADC HL,DE
+ CALL GET_ABSOLUTE_SECTOR
+;.skip_it: ;
+ LD DE,(READMEM)
+ LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster)
+.max_sectors+1: CP MAX_SECTORS_PER_PAGE
+ JR C,.SMALL_CLUSTER
+ ;
+.subload: LD A,(.max_sectors)
+ LD B,A
+ LD C,BIOS.DRV_READ_LONG
+ LD A,(LOAD_CORE.BANKDOS)
+ EX AF,AF'
+ LD A,(DRIVE)
+ RST ToBIOS_18
-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
+ EXX
+ POP HL
+ EXX
+ POP HL
+ RET
+ ;
+.SMALL_CLUSTER: LD B,A
+ LD C,BIOS.DRV_READ_LONG
+.BANKDOS+1: LD A,0
+ EX AF,AF'
+ LD A,(DRIVE)
+ RST ToBIOS_18
+ ;
+ LD HL,(READMEM)
+ LD DE,(FatBuffer.BytesPerCluster)
+ ADD HL,DE
+ LD (READMEM),HL
+ EXX
+ POP HL
+ EXX
+ POP HL
+ CCF
+ RET NC
+ ; [ ] загрузка system.dos больше #4000 байтов
+.BIG_CORE+1: LD A,0
+ DEC A
+ LD (.BIG_CORE),A
+ RET Z
+ ;
+ CALL READ_FROM_FAT
+ ;CALL R_F_FAT
+ RET C
+ EXX
+ EX DE,HL
+ EXX
+ EX DE,HL
+ JP .loop
+ ;
-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
+;
+; HL:DE / A => DE:BC, H=0, L - остаток
+; DIV_by_Shifts:
+; LD C,A
+; DEC A
+; JR Z,.DIV_exit
+; ;
+; AND E
+; LD B,A ; остаток
+; LD A,C
+; RRCA
+; ;
+; .DIV_loop: SRL H
+; RR L
+; RR D
+; RR E
+; RRCA
+; JP NC,.DIV_loop
+; LD A,B
+; .DIV_exit: LD B,D
+; LD C,E
+; EX DE,HL
+; LD H,0
+; LD L,A
+; RET
-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
-;-----------------
+//// //// //// //// //// //// //// //// ////
+ //// //// //// //// //// //// //// //// ////
+ DISPLAY "SECTORS 1..3 DATA ENDS:\t",/H,$,". Size: ",/D,$-ORG_ADDRESS," b. Free: ",/D,512*3-($-ORG_ADDRESS)," b."
+ZERO_SECTOR_OF_BPB:
+.physical EQU $$$
+//// //// //// //// //// //// //// //// ////
+ //// //// //// //// //// //// //// //// ////
-; HL - CLUSTER
-; DE - (CLUSTER)
+;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT
+; in: HL - Cache block
+; out: C:HL - logical number
+; B = 0
+GET_SECTOR_OF_FAT:
+ LD A,(FatBuffer.FAT_TYPE)
+ LD B,FAT_CACHE.Degree_32 ;!FIXIT сделать через переменную
+ XOR FAT_TYPE.x32
+ JR Z,.next
+ LD B,FAT_CACHE.Degree ;!FIXIT сделать через переменную
+ XOR A
+.next: LD C,A
+ ;
+.loop: ADD HL,HL ;x2
+ ADC A,C
+ DJNZ .loop
+ ;
+ LD C,A
+ RET
+ ;
-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
+;вход: HL - номер кластера
+;выход: HL - адрес нужной ячейки в странице FATPAGE
+; CF - чётный/нечётный адрес кластера
+GET_FAT12_CELL: LD D,H
+ LD E,L
+ SRL H
+ RR L ; сдвиг вправо через CF
+ PUSH AF ; сохр. флаг
+ ADD HL,DE ; CLUSTER * 1.5
+ ;
+ IF FAT_CACHE.Size_12 < #1800
+ ;!FIXIT оптимизировать
+ LD A,H
+ LD B,H
+ ;
+ AND #1F
+ ;AND FAT_CACHE.Size_Mask_16
+ ;
+ LD H,A
+ LD A,B
+ ;
+ RLCA
+ RLCA
+ RLCA
+ ;DUP FAT_CACHE.Degree_16
+ ; RRCA
+ ;EDUP
+ AND #07
+ ;AND FAT_CACHE.Part_Mask_16
+ ;
+ ; [ ] поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался
+ LD DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
+ CP E
+ LD E,A
+ ;
+ CALL NZ,READ_FAT_TABLE ; прочитать в кеш 16 секторов FAT-а
+ ENDIF
+ ;
+ LD DE,FATPAGE.cache
+ ADD HL,DE
+ POP AF
+ RET
+ ;
+;вход: HL - номер кластера
+;выход: HL - адрес нужной ячейки в странице FATPAGE
+GET_FAT16_CELL: LD A,H
+ LD B,H
+ AND FAT_CACHE.Size_Mask_16
+ LD H,A
+ LD A,B
+ ; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES)
+ DUP FAT_CACHE.Degree_16
+ RRCA
+ EDUP
+ ;AND #0F
+ AND FAT_CACHE.Part_Mask_16
+ ;
+ ADD HL,HL ; HL - FAT OFFSET (FROM CASH)
+ LD DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
+ CP E
+ LD E,A
+ ;
+ CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT
+ LD DE,FATPAGE.cache ; начало кеша FAT-а
+ ADD HL,DE ; на ячейку FAT
+ RET
+ ;
+;
+;RE_FAT:
+;RX01
+; Прочитать в кеш ХХ секторов FAT-а
+; DE - NEW FAT BLOCK
+READ_FAT_TABLE: PUSH HL
+ ;
+ EX DE,HL
+ LD (FatBuffer.CacheBlock),HL
+ ;
+ CALL GET_SECTOR_OF_FAT
+ ;
+ ; BC:HL - номер лог.сектора
+ LD DE,(FatBuffer.FAT1_SEC_L)
+ ADD HL,DE
+ ;
+ ; EX DE,HL
+ ; LD XH,D
+ ; LD XL,E
+ PUSH HL
+ POP IX
+ ;
+ LD HL,(FatBuffer.FAT1_SEC_H)
+.no_inc: ADC HL,BC
+ ; HL:IX - SECTOR FAT FOR READING
+ ;
+ ;LD DE,(PARTITION_START_L)
+ ;ADD IX,DE
+ ;LD DE,(PARTITION_START_H)
+ ;ADC HL,DE
+ CALL GET_ABSOLUTE_SECTOR
+ ;
+ LD DE,FAT_SECTORS_BUFFER
+ ;
+ IN A,(SLOT3)
+ PUSH AF
+.FAT_PAGE+1: LD A,0
+ OUT (SLOT3),A
+ ;
+ LD A,(FatBuffer.FAT_TYPE)
+ XOR FAT_TYPE.x32
+ LD BC,FAT_CACHE.Sectors_16*256 + BIOS.DRV_READ
+ JR NZ,.next
+ LD B,FAT_CACHE.Sectors_32
+.next: LD A,(DRIVE)
+ RST ToBIOS_18
+ ;
+ POP AF
+ OUT (SLOT3),A
+ POP HL
+ RET
+
+;вход: HL':HL - номер кластера
+;выход: HL - адрес нужной ячейки в странице FATPAGE
+GET_FAT32_CELL: ; двигаем влево HL':H
+ LD A,H
+ EXX
+ LD C,A
+ LD A,H
+ AND FAT_CACHE.Size_Mask_32 ; #0F
+ LD H,A
+ LD A,C
+ ;
+ LD B,FAT_CACHE.Degree ; 4 сдвига
+.loop_block: RLCA ; << H
+ RL L ; << L'
+ RL H ; << H'
+ DJNZ .loop_block
+ EXX
+ ; В итоге тут в HL' номер блока FAT
+ ;
+ ; HL - FAT32 OFFSET (FROM CASH)
+ LD A,H
+ AND FAT_CACHE.Size_Mask_32 ; #0F
+ LD H,A
+ ADD HL,HL
+ ADD HL,HL
+ PUSH HL
+ AND A
+ ;
+ EXX
+ EX DE,HL
+ LD HL,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
+ SBC HL,DE
+ CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT
+ POP HL
+ LD DE,FATPAGE.cache ; начало кеша FAT-а
+ ADD HL,DE ; на ячейку FAT
+ RET
+ ;
+;------------------------------------------------------------------------------------------------
+; Прочитать из кеша FAT-а номер след. кластера
+; вход: hl - номер кластера (младшее слово)
+; hl' - номер кластера (старшее слово. только для FAT32)
+; выход: hl - номер кластера (младшее слово)
+; hl' - номер кластера (старшее слово)
+; de - номер след. кластера (младшее слово)
+; de' - номер след. кластера (старшее слово)
+; если DE':DE = 0, то кластер HL':HL свободен
+; CF - конец цепочки
+;------------------------------------------------------------------------------------------------
+READ_FROM_FAT: PUSH HL
+ ;
+ IN A,(SLOT3)
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
+ LD A,(READ_FAT_TABLE.FAT_PAGE)
+ OUT (SLOT3),A
+ ;
+ LD A,(FatBuffer.FAT_TYPE)
+ CP FAT_TYPE.x16
+ JR C,.FAT12
+ JR NZ,.FAT32
+ ; fat16, просто читать след. номер
+.FAT16: CALL GET_FAT16_CELL
+ LD E,(HL) ; прочитать номер кластера
+ INC HL
+ LD D,(HL)
+ ;
+ LD HL,SERVICE_SECTORS.FAT16
+.exit: POP AF
+ OUT (SLOT3),A
+ ; обнуляем CF и устанавливаем код ошибки = DssErr.sys.NO_ERROR
+ XOR A
+ ; проверка на служ. кластеры
+ SBC HL,DE
+ POP HL
+ EXX
+ LD H,A
+ LD L,A
+ LD D,A
+ LD E,A
+ EXX
+ RET
+ ;
+ ;
+.FAT12: CALL GET_FAT12_CELL
+ LD E,(HL)
+ INC HL
+ LD D,(HL)
+ LD HL,SERVICE_SECTORS.FAT12
+ JR NC,.Correct_2
+.Correct_1: LD A,E
+ AND #F0
+ DUP 4 ; вправо на 4 битa
+ RR D
+ RRA
+ EDUP
+ LD E,A
+ JR .exit
+ ;
+.Correct_2: LD A,D
+ AND #0F
+ LD D,A
+ JR .exit
+ ;
+.FAT32: EXX
+ PUSH HL
+ EXX
+ ;
+ CALL GET_FAT32_CELL
+ ; прочитать младшее слово номера кластера
+ LD E,(HL)
+ INC HL
+ LD D,(HL)
+ INC HL
+ ; прочитать старшее слово номера кластера
+ LD A,(HL)
+ INC HL
+ EX AF,AF'
+ LD A,(HL)
+ EXX
+ AND #0F
+ LD D,A
+ EX AF,AF'
+ LD E,A
+ EXX
+ ; обнуляем CF и устанавливаем код ошибки = DssErr.sys.NO_ERROR
+ XOR A
+ ; проверка на служ. кластеры младшего слова кластера
+ LD HL,SERVICE_SECTORS.FAT32.Low
+ SBC HL,DE
+ ; проверка на служ. кластеры старшего слова кластера
+ EXX
+ LD HL,SERVICE_SECTORS.FAT32.High
+ SBC HL,DE
+ POP HL
+ EXX
+ POP BC
+ LD A,B
+ OUT (SLOT3),A
+ POP HL
+ LD A,0
+ RET
+; ; ;
-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"
+//// //// //// //// //// //// //// //// ////
+ //// //// //// //// //// //// //// //// ////
+ ASSERT ($-ZERO_SECTOR_OF_BPB) <= LOADER_IN_BPB.MAX_SIZE, "---< CRITICAL ERROR! Loader is too big >----"
+ DISPLAY "SECTORS 0 DATA ENDS:\t\t",/H,$,". Size: ",/D,$-ZERO_SECTOR_OF_BPB," b. Free: ",/D,LOADER_IN_BPB.MAX_SIZE-($-ZERO_SECTOR_OF_BPB)," b."
+ZERO_SECTOR_OF_BPB_END:
+ZERO_SECTOR_OF_BPB.Size EQU ZERO_SECTOR_OF_BPB_END - ZERO_SECTOR_OF_BPB
+//// //// //// //// //// //// //// //// ////
+ //// //// //// //// //// //// //// //// ////
+;
+;
+////////////////////////////////////////////////////////////////////////
; Area for boot sector [512Bytes]
-BOOT _sBOOT_SEC = $
+;BOOT _sBOOT_SECTOR_PARAMS = $
+BOOT_BUFFER EQU $
+DIR_BUFFER EQU BOOT_BUFFER+512
+;
+;FAT_SECTORS_BUFFER EQU DIR_BUFFER+512
+;VALUE EQU 3*512+FAT_SECTORS_BUFFER
+FAT_SECTORS_BUFFER EQU #C000
+VALUE EQU DIR_BUFFER+512
-; 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
+FatBuffer _sysFatBuffer = VALUE
-DIR EQU BOOT+512
-FAT EQU DIR+512
+HANDBUF EQU VALUE + _sysFatBuffer
+FCLUSTER_H EQU HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H
+FCLUSTR_L EQU HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L
+FSIZE0 EQU HANDBUF + FAT_DIRECTORY_RECORD.F_SIZE
+FSIZE1 EQU HANDBUF + FAT_DIRECTORY_RECORD.F_SIZE + 2
+PARTITION_START_H EQU FSIZE1+2
+PARTITION_START_L EQU PARTITION_START_H+2
+READMEM EQU PARTITION_START_L+2
+;BIG_CORE EQU READMEM+2
+;FAT_PAGE EQU READMEM+2
-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
+ DISPLAY "BOOT_BUFFER ",/H,BOOT_BUFFER
+ DISPLAY "DIR_BUFFER ",/H,DIR_BUFFER
+ DISPLAY "FatBuffer ",/H,FatBuffer
ENT
-;START DI
-; LD (SPZ+1),SP
-; LD SP,#BFFF
-; LD C,#FE
-; CALL #3D13
-;SPZ LD SP,#0000
-; EI
-; RET
-
- OUTEND
+ ENDMODULE
+ OUTEND
;[]-----------------------------------------------------------[]
diff --git a/BOOT/boot.asm b/BOOT/boot.asm
new file mode 100644
index 0000000..78c107b
--- /dev/null
+++ b/BOOT/boot.asm
@@ -0,0 +1,989 @@
+////////////////////////////////////////////////////////////////////////
+; CHANGELOG
+; [x] - загрузка с любого primary active раздела
+; [x] - поддержка загрузки с FAT32 раздела
+; [x] - загрузка с RAM диска
+; [x] - bug fixes and optimizations)))
+////////////////////////////////////////////////////////////////////////
+
+; Программа записи на FDD/HDD boot-загрузчика и файлов системы.
+;
+; Загружает сист. файлы из корня диска, с которого была
+; загружена система.
+
+; Фитчи программы:
+; В отличие от оригинального boot-инсталлятора, эта может
+; переписывать уже установленный boot-загрузчик.
+; Файлы системы (system.dos, system.exe) могут иметь
+; любые размеры.
+; При загрузке компьютера с дискеты, запрашивается новая
+; дискета для создания из нее загрузочной.
+;
+;
+ STRUCT _sysFatBuffer
+;.DRIVE: BYTE #FF
+.FAT_TYPE: BYTE #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; fat32
+.CacheBlock: WORD #0000
+;.CacheUpdated: BYTE #00
+;.SectorsPerBank: BYTE #00
+.RootDirStartCluster_L: WORD #0000
+.RootDirStartCluster_H: WORD #0000 ; fat32
+.FAT1_SEC_L: WORD #0000 ; MSD_FAT_SEC first sector FAT (FAT_FRM)
+.FAT1_SEC_H: WORD #0000 ; fat32
+;.FAT2_SEC_L: WORD #0000
+;.FAT2_SEC_H: WORD #0000 ; fat32
+;.Number_Of_FATs BYTE #02
+.SectorsPerFAT_L WORD #0000
+.SectorsPerFAT_H BYTE #00
+.RootDirFirstSector_L: WORD #0000 ; MSD_CAT_SEC first sector DIR
+.RootDirFirstSector_H: WORD #0000 ; MSD_CAT_SEC first sector DIR
+.DirSizeInSectors: BYTE #00 ; DIR_SEC_SIZE
+.FirstDataSector_L: WORD #0000 ; MSD_DAT_SEC low
+.FirstDataSector_H: WORD #0000 ; MSD_DAT_SEC high
+.BytesPerCluster: WORD #0000 ; CLUSTER_LEN
+;.END_CHAIN_CLUSTER_L: WORD #FFFF
+;.END_CHAIN_CLUSTER_H: WORD #0FFF
+;.MaxClusterLow: WORD #0000 ; макс. число кластеров (без служ.)
+;.MaxClusterHigh: WORD #0000 ; макс. число кластеров (без служ.)
+;.BytesPerSector: WORD #0000
+.SectorsPerCluster: BYTE #00
+;.FSINFO_Sector: WORD #01
+;.BPB_SERIAL_NUMBER: DWORD #00000000
+;.BPB_LABEL: BLOCK 11,' ' ; 11 для FAT, 31 для CDFS
+;.UPD_FSINFO: BYTE 0
+;.FREE_CLUSTERS_COUNT_L: WORD #FFFF
+;.FREE_CLUSTERS_COUNT_H: WORD #FFFF
+;.FilesPerSector: BYTE #00 ; число файловых записей в секторе
+;.ClustersPerBank: BYTE #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ)
+;.READ_PG: BYTE #00 ;!TODO не используются некоторые значения, но задумка неплохая)))
+;.S_X_H: DWORD #0000 ; количество секторов на цилиндре
+ ENDS
+ includelua 'Shared_includes/lua/Functions.lua'
+ include 'shared_includes/constants/sp2000.inc'
+ include 'shared_includes/constants/bios_equ.inc'
+ include 'shared_includes/constants/dss_equ.inc'
+ include 'shared_includes/macroses/accelerator.z80'
+ include 'shared_includes/macroses/macros.z80'
+ include 'shared_includes/structures/FileSystem.inc'
+ ;include 'DSS/structures.inc'
+ include '../DSS/defines.inc'
+
+ LUA PASS1
+ local date, month, year = Get_date_RU(sj.get_define("__DATE__"))
+ BuildDate = "'" .. date .. "." .. month .. "." .. year .. "'"
+ sj.insert_define("SYS_BUILD_DATE", BuildDate)
+ ENDLUA
+ LUA ALLPASS
+ sj.insert_define("SYS_BUILD_DATE", BuildDate)
+ ENDLUA
+
+ DEFINE EXEinfoMACRO 0
+ DEFINE App_EXE_Version 1
+ MACRO _mEXEinfo
+ IF EXEinfoMACRO
+ BLOCK 10,' ' ; Выравнивание для красивого отображения в HEX
+ BYTE ' Bootloader '
+ BYTE ' installer '
+ BYTE ' for DSS. '
+ BYTE ' Vasil Ivanov, '
+ BYTE ' Anatoliy '
+ BYTE ' Belyanskiy. '
+ BYTE ' Sprinter Team, '
+ BYTE ' 2025 '
+ ENDIF
+ ENDM
+
+
+; версия программы
+major_version equ 3 ; ст. номер версии
+minor_version equ 0 ; мл. номер
+;;
+SECTORS_OF_LOADER EQU 4 ; секторов загрузчика
+.IN_BPB EQU 1
+.AFTER_BPB EQU 3
+
+org_addr EQU #8000 + CLP_Buffer
+code_addr EQU BEGIN
+program_start EQU BEGIN
+stack_point EQU #BFFE
+Loader_length EQU 0
+
+;
+page_buffer equ #C000 ; буфер файлов
+;;
+
+ include 'Shared_Includes/constants/EXE_Header.z80'
+
+ ORG org_addr
+BEGIN: ;di
+ in a,(SLOT3)
+ ld (port),a ; сохр. порт
+ push ix
+ call save_path ; сохр. тек. диск и путь
+ ld c,Dss.Version ; узнать версию ДОС
+ RST ToDSS
+ ex de,hl ; hl=тек. версия
+ ld de,#0146 ; 1.70.810 d=версия, e=модификация, bc - номер сборки. de = #0146, bc = 810 dos ver 1.70.810
+ and a
+ sbc hl,de
+ ;[x] 17.12.2023 загрузка с активного раздела, а не с первого
+ ;jr nc,version_ok
+ jr z,.check_build ; если номер версии 1.70
+ jr nc,version_ok ; если номер версии больше 1.70
+ ;
+.old_ver: pop hl
+ ld a,11 ; индекс строки "Error: Need DSS version 1.70..."
+ call print_string
+ ld a,DSS_Error.sys.COMMON_ERROR
+ jp exit
+ ;[x] 17.12.2023 загрузка с активного раздела, а не с первого
+.check_build: ld hl,810 ; 1.70.810 d=версия, e=модификация, bc - номер сборки. de = #0146, bc = 810 dos ver 1.70.810
+ sbc hl,bc
+ jr nc,BEGIN.old_ver
+ ;
+version_ok: pop hl ; ком-строка
+ ; выделить параметр ком-строки
+ call get_drive_letter
+ push af
+ xor a ; индекс строки титла
+ call print_string
+ pop af
+ jp c,help ; нет параметров
+ ld (disk),a ; заданный номер диска
+ ; узнать номер boot-диска системы
+ ld bc,Dss.BootDSK.Get
+ RST ToDSS
+ ld (boot_disk),a ; диск (A=0,B=1,..)
+ ; проверить на совпадение дисков
+same_fdd: ld hl,disk
+ cp (hl)
+ jr nz,.next
+ ld hl,read_sys_files.swap_flag
+.flag+1: ld (hl),0 ; уст. флаг
+ ;
+ ; Чтение в банки файлов системы
+ ;
+.next: ld a,(boot_disk) ; диск загрузки ОС
+ ld hl,root_path ; "X:\" корень диска
+ add a,'A'
+ ld (hl),a
+ ld c,Dss.ChDir ; смена каталога
+ RST ToDSS
+ ;--------------------------------------------
+ ; Чтение файла system.exe
+ ;--------------------------------------------
+read_sys_files: ;
+.noFiles+1: ld a,0
+ or a
+ jr nz,.write_boot
+ ;
+ ld hl,name2 ; имя файла
+ call read_file ; вся работа по загрузке файла в страницы
+ ;jr nc,read_file1_ok
+ ; освоб. блок памяти
+;read_file_err: ld a,(FILE1_PARAMS.id_blck) ; идентиф. блока памяти
+; ld c,Dss.FreeMem
+; RST ToDSS
+ ;ld a,DSS_Error.sys.DISK_FULL ; код ошибки
+ jp c,exit
+ ; сохр. раб. ячейки файла system.exe
+.read_file1_ok: ld hl,FILE1_PARAMS ; откуда
+ ld de,FILE2_PARAMS ; куда
+ ld bc,FILE2_PARAMS.dataSize
+ ldir
+ ;--------------------------------------------
+ ; Чтение файла system.dos
+ ;--------------------------------------------
+ ld hl,name1 ; имя файла
+ call read_file ; вся работа по загрузке файла в страницы
+ ;jr c,read_file_err
+ ;ld a,DSS_Error.sys.DISK_FULL; код ошибки
+ jp c,exit
+ ;jr nc,read_file2_ok
+ ; освоб. блок памяти system.exe
+; file_err1: ld a,(FILE2_PARAMS.id_blck); идентиф. блока памяти
+; ld c,Dss.FreeMem
+; RST ToDSS
+ ;jr read_file_err ; освоб. блок памяти system.dos
+.swap_flag+1: ld a,1
+ or a
+ jr nz,.no_confirm
+ ld a,(boot_disk) ; сист. диск
+ cp 2
+ jr nc,.no_confirm ; не дисководы
+ ; запросить целевой диск
+ ld a,(disk) ; заданный номер диска
+ add a,'A'
+ ld (messages.lett2),a
+ ld a,5 ; индекс строки "Insert destination disk..."
+ call print_string
+ ld bc,Dss.K_CLEAR + Dss.WaitKey*256; ждем нажатия клавиши
+ RST ToDSS
+ ;
+.no_confirm: ; Уст. целевой диск/путь
+ ld a,(disk) ; целевой диск
+ ld hl,root_path ; "X:\" строка пути
+ add a,'A'
+ ld (hl),a
+ ld c,Dss.ChDir ; смена тек. каталога
+ RST ToDSS
+ ;--------------------------------------------
+ ld a,3 ; индекс строки "Writing system files..."
+ call print_string
+ ; Запись файла system.dos
+ ld hl,name1 ; имя файла
+ call write_file
+ jr c,write_error
+.ok_write1: ; освободить память
+ ; ld a,(FILE1_PARAMS.id_blck) ; блок system.dos
+ ; ld c,Dss.FreeMem
+ ; RST ToDSS
+ ;
+ ; загр. раб. ячейки
+ ld hl,FILE2_PARAMS ; откуда
+ ld de,FILE1_PARAMS ; куда
+ ld bc,FILE1_PARAMS.dataSize
+ ldir
+ ; Запись файла system.exe
+ ld hl,name2 ; имя файла
+ call write_file
+ ; освободить память
+ ; push af
+ ; ld a,(FILE1_PARAMS.id_blck) ; блок system.exe
+ ; ld c,Dss.FreeMem
+ ; RST ToDSS
+ ; pop af
+ ;
+ jr c,write_error
+ ;jr c,exit ; ошибка
+ ;
+ ; Записать boot-загрузчик
+.write_boot: ld a,2 ; индекс строки "Installing boot loader..."
+ call print_string
+ call write_boot_loader
+ jr c,write_error ; ошибка работы с девайсом
+ ;
+ ld a,(disk) ; заданный номер диска
+ add a,'A'
+ ld (messages.lett1),a
+ ld a,1 ; индекс строки "System installed on disk "
+ call print_string
+ ;
+ ld a,(read_sys_files.swap_flag)
+ or a
+ jr nz,.not_fdd
+ ; запросить системный диск
+ ld a,(boot_disk) ; сист. диск
+ cp 2
+ jr nc,.not_fdd ; не дисководы
+ add a,'A'
+ ld (messages.lett3),a
+ ld a,6 ; индекс строки "Insert system disk..."
+ call print_string
+ ld bc,Dss.K_CLEAR + Dss.WaitKey*256; ждем нажатия клавиши
+ RST ToDSS
+.not_fdd: xor a ; код "Ok"
+ ;
+exit: push af
+ call restore_path ; восст. тек. диск и путь
+port+1: ld a,-1 ; сохр. порт
+ out (SLOT3),a
+ pop af
+ ld c,Dss.Exit ; выход в ДОС
+ ld b,a
+ RST ToDSS
+ jr $
+ ;
+help: ld a,8 ; индекс строки "Invalid drive specification"
+ call print_string
+ ld a,4 ; индекс строки хэлпа
+err_mes: call print_string
+ ld a,DSS_Error.sys.COMMON_ERROR
+ jr exit
+
+write_error: ld a,7 ; индекс строки "Can't install boot on this disk"
+ jr err_mes
+
+
+
+
+root_path: db 'X:\',0 ; путь
+
+name1: db "SYSTEM.DOS",0
+name2: db "SYSTEM.EXE",0
+
+
+
+;-------------------------------------------------
+; Записать boot-загрузчик на FDD/HDD
+; вход: нет
+; выход: CF - ошибка работы с девайсом
+;-------------------------------------------------
+write_boot_loader:
+ ld a,(disk) ; заданный номер диска
+ ld c,Dss.DRV.Open ; open device
+ rst ToDSS.DRV
+ ret c
+ ld hl,close_device ; точка выхода
+ push hl
+ ld a,(disk) ; заданный номер диска
+ ld hl,0 ; ст. разряд лог. сектора
+ ld ix,0 ; мл. разряд
+ ld de,buffer ; куда
+ ld bc,1*256 + Dss.DRV.Read ; прочитать 1 сектор (boot)
+ rst ToDSS.DRV
+ ret c ; ошибка чтения
+ ld a,(buffer + _sBOOT_SECTOR_PARAMS.DRIVE_TYPE)
+ cp #F0 ; 1.44Mb
+ ret c ; незнакомый формат
+ jr z,write_to_floppy
+ cp #F9 ; 720kB
+ jr z,write_to_floppy
+ cp #FA ; RAM disk
+ jr z,write_to_ram_disk
+ cp #F8 ; винт
+ jp z,write_to_hard_disk
+ scf ; незнакомый формат
+ ret
+
+; закрыть девайс
+close_device: push af ; сохр. флаг
+ ld a,(disk) ; заданный номер диска
+ ld c,Dss.DRV.Close ; close device
+ rst ToDSS.DRV
+ pop af
+ ret
+
+
+;-------------------------------------------------
+; Запись boot-загрузчика на дискету
+;
+; вход: данные из buffer
+; выход: CF - при ошибке записи
+;-------------------------------------------------
+write_to_floppy:
+ ld a,(buffer + BOOT_SECTOR.Number_of_FATs) ; число копий FAT-ов
+ or a
+ scf
+ ret z ; ошибка
+ dec a ; --число копий
+ jr z,overwrite_floppy ; загрузчик уже записан, перезаписать его
+ ; настроить ячейки boot-сектора
+ ld (buffer + BOOT_SECTOR.Number_of_FATs),a ; число копий FAT-ов
+ ld hl,(buffer + BOOT_SECTOR.RESERVED_SECTORS) ; зарезерв. секторов
+ ld bc,(buffer + BOOT_SECTOR.SectorsPerFAT16) ; секторов на FAT
+ add hl,bc
+ ld (buffer + BOOT_SECTOR.RESERVED_SECTORS),hl ; зарезерв. секторов
+ dec hl
+ ld de,SECTORS_OF_LOADER.AFTER_BPB
+ and a
+ sbc hl,de
+ ret c
+overwrite_floppy:
+ CALL SETUP_ZERO_SECTOR
+ ;; перекидывание части загрузчика в 0 сектор
+ ;LD HL,DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.physical
+ ;LD DE,buffer + (_sBOOT_SECTOR.PARTITION_TABLE - DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.Size)
+ ;LD BC,DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.Size
+ ;LDIR
+ ;;
+ ; записать boot-сектор назад
+ ld a,(disk) ; заданный номер диска
+ ld hl,0 ; ст. разряд лог. сектора
+ ld ix,0 ; мл. разряд
+ ld de,buffer ; откуда
+ ld bc,1*256 + Dss.DRV.Write ; записать 1 сектор
+ rst ToDSS.DRV
+ ret c ; ошибка записи
+ ; записать загрузчик
+ ld a,(disk) ; заданный номер диска
+ ld hl,0 ; ст. разряд лог. сектора
+ ld ix,1 ; мл. разряд
+ ld de,code_loader ; откуда (код загрузчика)
+ ld bc,SECTORS_OF_LOADER.AFTER_BPB*256+Dss.DRV.Write; записать 3 сектора (размер загр.)
+ rst ToDSS.DRV
+ ret
+
+
+;-------------------------------------------------
+; Запись boot-загрузчика на драйв
+;
+; вход: нет
+; выход: CF-ошибка записи
+;-------------------------------------------------
+write_to_ram_disk:
+ CALL write_no_BPB
+ RET C
+ ; buffer = sector 0
+ ;
+ JR write_to_BPB
+
+write_to_hard_disk:
+ ;[x] 17.12.2023 загрузка с активного раздела, а не с первого
+ CALL write_no_BPB
+ RET C
+ ; buffer = sector 0
+ ;
+ ; проверка на РАМ-диск (разделы на рамдиске пока не поддерживаются)
+ LD A,B
+ CP #80-1 ;!HARDCODE HDD number
+ JR C,write_to_BPB
+ ;
+ PUSH BC
+ CALL Read_MBR
+ RET NZ
+ POP BC
+ PUSH BC
+ ; set active in buffer
+ INC C
+ LD HL,buffer + _sBOOT_SECTOR.PARTITION_TABLE.Record_4
+ LD DE,_sMBR_PARTITION_RECORD ; размер одной записи MBR
+ LD B,_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD; MBR: Number of entries in the partition table
+.loop: XOR A
+ LD (HL),A
+ ;
+ LD A,C
+ CP B
+ JR NZ,.next
+ ;
+ LD A,#80
+ LD (HL),A
+ PUSH HL
+ INC HL
+ INC HL
+ INC HL
+ INC HL
+ LD A,(HL)
+ POP HL
+ CP PartitionSysTypes.FAT12
+ JR Z,.next
+ CP PartitionSysTypes.FAT16_32Mb
+ JR Z,.next
+ CP PartitionSysTypes.FAT16
+ JR Z,.next
+ CP PartitionSysTypes.FAT16_LBA
+ JR Z,.next
+ CP PartitionSysTypes.FAT32
+ JR Z,.next
+ CP PartitionSysTypes.FAT32_LBA
+ JR Z,.next
+ ; NOT SUPPORTED FS
+ POP BC
+ SCF
+ RET
+ ;
+.next: AND A
+ SBC HL,DE
+ DJNZ .loop
+ ;
+ JR write_to_BPB.no_push
+write_to_BPB: PUSH BC
+.no_push: CALL SETUP_ZERO_SECTOR
+ ;; перекидывание части загрузчика в 0 сектор
+ ;LD HL,DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.physical
+ ;LD DE,buffer + (_sBOOT_SECTOR.PARTITION_TABLE - DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.Size)
+ ;LD BC,DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.Size
+ ;LDIR
+ ;; защита от бакланизма (загрузка с этого диска на PC приведет к зависанию. JMP $)
+ ;LD HL,#FEEB ; opcode jmp $
+ ;LD (buffer),HL
+ ; запись в 0 сектор куска загрузчика
+ pop af ; заданный номер диска
+ ld hl,0 ; ст. разряд лог. сектора
+ ld ix,0 ; мл. разряд
+ ld de,buffer ; откуда (код загрузчика)
+ ld bc,1*256 + BIOS.DRV_WRITE ; записать 1 сектор
+ RST ToBIOS
+ RET
+ ;
+
+;
+write_no_BPB: ld a,(disk) ; номер заданного диска
+ ld de,Dss.DRV.GenIOCTL.Enter
+ ld bc,Dss.DRV.GenIOCTL.GetParams
+ rst ToDSS.DRV
+ ex af,af'
+ ;[x] 17.12.2023 загрузка с активного раздела, а не с первого
+ ld b,a
+ inc c
+ scf
+ ret z
+ dec c
+ CP #80 ;!HARDCODE тип драйва - HDD
+ JR NC,.skip_FAT_check
+ PUSH BC
+ ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR
+ ; A - PHISICAL DRIVE NUMBER
+ ; [x] 02/02/2024 проверка на влезаемость загрузчика (чтоб не попортить фат)
+ CALL Read_MBR
+ RET NZ
+ POP BC
+ LD HL,(buffer + _sBOOT_SECTOR_PARAMS.RESERVED_SECTORS)
+ ; минимальное расстояние на драйве от нулевого сектора до фата (длина загрузчика + 1)
+ LD DE,SECTORS_OF_LOADER.AFTER_BPB + 1
+ AND A
+ SBC HL,DE
+ RET C
+ ;
+.skip_FAT_check:;
+ push bc
+ ld a,b
+ ld hl,0 ; ст. разряд лог. сектора
+ ld ix,1 ; мл. разряд
+ ld de,code_loader ; откуда (код загрузчика)
+ ld bc,SECTORS_OF_LOADER.AFTER_BPB*256+BIOS.DRV_WRITE; записать 3 сектора (размер загр.)
+ rst ToBIOS
+ ;[x] 17.12.2023 загрузка с активного раздела, а не с первого
+ pop bc
+ ;
+ ret
+
+
+; in: a - drive
+; out CF = 1.
+; ZF = 1 - OK,
+; ZF = 0 - error
+Read_MBR: LD HL,0
+ LD IX,0
+ LD DE,buffer
+ LD BC,1*256 + BIOS.DRV_READ
+ RST ToBIOS
+ LD HL,(buffer + _sBOOT_SECTOR.MBR_SIGNATURE)
+ LD DE,#AA55
+ AND A
+ SBC HL,DE
+ SCF
+ RET
+
+
+SETUP_ZERO_SECTOR:
+ ; перекидывание части загрузчика в 0 сектор
+ LD HL,DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.physical
+ LD DE,buffer + (_sBOOT_SECTOR.PARTITION_TABLE - DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.Size)
+ LD BC,DSS_Boot_Loader.ZERO_SECTOR_OF_BPB.Size
+ LDIR
+ ; защита от бакланизма (загрузка с этого диска на PC приведет к зависанию. JMP $)
+ LD HL,#FEEB ; opcode jmp $
+ LD (buffer),HL
+ RET
+;-------------------------------------------------
+; Выделить заданный диск из ком-строки
+;
+; вход: hl=буфер строки
+; выход: a=номер диска
+; CF-при ошибке
+;-------------------------------------------------
+get_drive_letter:
+ ; зачистка буфера
+ xor a
+ ld (buffer+1),a
+ ;
+ inc hl ; буфер строки
+ ld de,buffer ; буфер для выдел. параметра
+ ld c,Dss.GSwitch ; выделить параметр ком. строки
+ RST ToDSS
+ ;
+ ;rra
+ rl b ; признак конца параметров
+ ;
+ ld de,buffer
+ ld a,(de)
+ inc de
+ ld c,a ; сохр. 'a'
+ ld a,(de)
+ cp ':'
+ jr nz,.get_drive_err ; диск не задан
+ inc de
+ ld a,(de)
+ or a
+ jr nz,.get_drive_err ; неправильные параметры
+ ;
+ rr b ; признак конца параметров
+ jr c,.checkChar
+ ;
+ push bc
+ ld de,buffer ; буфер для выдел. параметра
+ ld c,Dss.GSwitch ; выделить параметр ком. строки
+ RST ToDSS
+ pop bc
+ jr nc,.get_drive_err ; неправильные параметры
+ ;
+ ld de,buffer ; буфер для выдел. параметра
+ ld a,(de)
+ cp "0"
+ ret c ; неправильные параметры
+ cp "4"
+ jr nc,.get_drive_err ; неправильные параметры
+ ;
+ ld b,a
+ inc de
+ ld a,(de)
+ or a
+ jr nz,.get_drive_err ; неправильные параметры
+ ;
+ ld a,b
+ ;0 - standart
+ ;1 - silent
+ ;2 - no_files
+ ;3 - no_files+silent
+ sub "0"
+ jr z,.checkChar
+ rra
+ ld (read_sys_files.noFiles),a
+ ld (same_fdd.flag),a
+ rla
+ and 1
+ ld (print_string.silentMode),a
+ ; проверяем букву
+.checkChar: ld a,c ; восст. 'a'
+ and %1101'1111
+ cp 'A'
+ ret c ; ошибка
+ cp 'Z'+1
+ jr nc,.get_drive_err
+ sub 'A'
+ ret
+ ;
+.get_drive_err: scf ; ошибка
+ ret
+;----------------------------------------------------
+; сохр. тек. системный диск и путь
+;----------------------------------------------------
+save_path: ld c,Dss.CurDisk ; узнать диск
+ RST ToDSS
+ ld (sys_disk),a
+ ld hl,sys_path
+ ld c,Dss.CurDir ; узнать путь
+ RST ToDSS
+ ret
+
+
+;----------------------------------------------------
+; восст. тек. системный диск и путь
+;----------------------------------------------------
+restore_path: ld a,(sys_disk)
+ ld c,Dss.ChDisk ; смена диска
+ RST ToDSS
+ ld hl,sys_path
+ ld c,Dss.ChDir ; смена пути
+ RST ToDSS
+ ret
+;
+
+;
+disk: db 0 ; номер заданного диска
+boot_disk: db 0 ; номер boot-диска системы
+
+; раб. ячейки тек. файла
+;
+; чтение: system.exe, далее system.dos
+; запись: system.dos, далее system.exe
+FILE1_PARAMS:
+.handle: db -1 ; дескриптор файла
+.id_blck: db -1 ; идентиф. выдел. блока памяти
+ ;
+.sizeLow: dw 0 ; мл.разряд размера файла
+.sizeHigh: dw 0 ; ст.разряд
+.dataSize EQU $-FILE1_PARAMS
+
+; сохр. данные system.exe
+FILE2_PARAMS:
+.handle: db -1 ; дескриптор файла
+.id_blck: db -1 ; идентиф. выдел. блока памяти
+ ;
+.sizeLow: dw 0 ; мл.разряд размера файла
+.sizeHigh: dw 0 ; ст.разряд
+.dataSize EQU $-FILE2_PARAMS
+
+ ASSERT FILE1_PARAMS.dataSize = FILE2_PARAMS.dataSize, "Erorr! FILE1_PARAMS != FILE2_PARAMS"
+;
+;
+;
+;
+;
+; сообщения
+messages: db 0
+ db "\r\nBoot and System files Installer v" ;0
+ db major_version + '0','.'
+ db (minor_version / 10) + '0',(minor_version % 10) + '0','.'
+ db "\r\nBuild date ",SYS_BUILD_DATE
+ ;db "\r\nCopyright (c) 2006 Vasil Ivanov."
+ db "\r\nCopyright (c) Sprinter Team."
+ db "\r\n\n",0
+ ;
+ db "System successfully installed on disk " ;1
+.lett1: db "X:\r\n\n",0
+ ;
+ db "Installing boot loader...\r\n\n",0 ;2
+ db "Writing system files...\r\n\n",0 ;3
+ ;
+ db "Syntax: SYS X:\r\n" ;4
+ db " where X: - drive letter (A..Z)\r\n\n",0
+ ;
+ db "Insert destination disk in drive " ;5
+.lett2: db "X:\r\n"
+ db "and strike any key when ready ...\r\n\n",0
+ ;
+ db "Insert system disk in drive " ;6
+.lett3: db "X:\r\n"
+ db "and strike any key when ready ...\r\n\n",0
+ ;
+ db "Can't install boot on this disk\r\n\n",0 ;7
+ db "Invalid drive specification\r\n\n",0 ;8
+ db " Error: Can't open file\r\n\n",0 ;9
+ db " Error: Can't allocate memory\r\n\n",0 ;10
+ db " Error: Need DOS version 1.70.811 or higher\r\n\n",0 ;11
+ db " Error: Reading error\r\n\n",0 ;12
+ db " Error: Can't create file\r\n\n",0 ;13
+ db " Error: Writing error\r\n\n",0 ;14
+.endmess: db 0
+
+
+
+; Вывести строку по индексу
+; вход: a=индекс строки
+print_string: call get_string ; поиск строки по ее индексу в 'a'
+.silentMode+1: ld a,0
+ or a
+ ret nz
+ ld c,Dss.PChars ; вывод строки
+ RST ToDSS
+ ret
+
+
+; поиск строки по ее индексу в 'a'
+get_string: ld hl,messages ; список мессаг для индекс. доступа
+ ld bc,messages.endmess - messages ; размер списка
+ inc a
+ ex af,af'
+ xor a
+ ex af,af'
+get_loop: ex af,af'
+ cpir
+ ret po
+ ret nz
+ ex af,af'
+ dec a
+ jr nz,get_loop
+ ret
+
+
+
+
+
+;====================================================
+; Вся работа по загрузке файла в страницы
+; вход: hl=имя файла
+; выход: CF-при ошибке
+;====================================================
+read_file: ld a,Dss.Open.R ; на чтение
+ ld c,Dss.Open ; открыть файл
+ RST ToDSS
+ jr nc,.ok ; без ошибок
+ ;
+ push af
+ ld a,9 ; индекс "Can't open file"
+ call print_string
+ pop af
+ ret
+ ;
+.ok: ld (FILE1_PARAMS.handle),a ; дескр. файла
+ ld hl,0
+ ld ix,0
+ ld bc,Dss.Move_FP.FrEnd ; указатель на конец файла
+ RST ToDSS
+ ld (FILE1_PARAMS.sizeHigh),hl ; ст.разряд размера файла
+ ld (FILE1_PARAMS.sizeLow),ix ; мл.разряд
+ call get_memory ; расч. и выдел. страницы под файл
+ jr c,.not_enough ; не хватает памяти
+ call file_to_bank ; загр. файл в страницы
+.close_file: push af
+ ld a,(FILE1_PARAMS.handle) ; дескр. файла
+ ld c,Dss.Close ; закрыть файл
+ RST ToDSS
+ pop af
+ ret
+ ;
+.not_enough: push af
+ call .close_file
+ ld a,10 ; индекс "Can't allocate memory"
+ call print_string
+ pop af
+ or a
+ scf
+ ret nz
+ ld a,DSS_Error.sys.NOT_ENOUGH_MEMORY
+ ret
+
+
+
+;----------------------------------------------------
+; По размеру файла рассчитать необходимое
+; число страниц и выделить их.
+; Выход: CF - при нехватке памяти
+;----------------------------------------------------
+get_memory: ld hl,(FILE1_PARAMS.sizeHigh) ; ст.разряд размера файла
+ ld bc,(FILE1_PARAMS.sizeLow) ; мл.разряд
+ ld de,#4000 ; делитель (размер страницы)
+ xor a
+ scf
+malloc1: rr d
+ rr e
+ jr c,malloc2
+ rr h
+ rr l
+ rr b
+ rr c
+ jr nc,malloc1
+ ld a,1
+ jr malloc1
+ ;
+malloc2: or a
+ jr z,$+3 ;!FIXIT $
+ inc bc
+ xor a
+ cp b
+ scf
+ ret nz
+ ; выделить блок памяти
+ ld b,c ; b=число страниц
+ ld c,Dss.GetMem
+ RST ToDSS
+ ld (FILE1_PARAMS.id_blck),a ; идентиф. блока
+ ret
+
+
+;----------------------------------------------------
+; Загрузить файл в страницы
+;----------------------------------------------------
+file_to_bank: ld hl,0
+ ld ix,0
+ ld a,(FILE1_PARAMS.handle) ; дескр. файла
+ ld bc,Dss.Move_FP.FrStart ; указатель на начало файла
+ RST ToDSS
+ ld a,(FILE1_PARAMS.id_blck) ; идентиф. блока памяти
+ ;ld b,0 ; лог. номер страницы в блоке
+ ld bc,0*256 + BIOS.GetMemPage; получить физ. номер страницы в блоке
+ rst ToBIOS
+ ret c
+.loop: push af
+ out (SLOT3),a
+ ld hl,page_buffer ; #C000 куда
+ ld de,#4000 ; сколько
+ ld a,(FILE1_PARAMS.handle) ; дескр. файла
+ ld c,Dss.Read ; читать файл
+ RST ToDSS
+ pop bc
+ jr c,.error
+ ; ok
+ cp -1 ; прочитано меньшее число байт ?
+ ret z ; да
+ ld a,b ; a=физич. страница
+ ld c,BIOS.GetMemPageNext ; получить номер след. физ. страницы блока
+ rst ToBIOS
+ ret c
+ cp #FF
+ jr nz,.loop ; не последняя страница
+ ret
+ ; error
+.error: ld a,12 ; индекс "Reading error"
+ call print_string
+ scf
+ ret
+
+
+;====================================================
+; Запись файла на диск
+; вход: hl=имя файла
+; выход: CF-при ошибке
+;====================================================
+write_file: ld a,FAT_ATTR.ARCHIVE ; атрибут "архивный"
+ ld c,Dss.Create ; создать файл
+ RST ToDSS
+ jr nc,.create_ok ; без ошибок
+ push af
+ ld a,13 ; индекс "Can't create file"
+ call print_string
+ pop af
+ ret
+ ;
+.create_ok: ld (FILE1_PARAMS.handle),a ; дескр. файла
+ ld hl,read_file.close_file ; закр. файл
+ push hl ; точка выхода
+ ;
+ ; чтение файла из банок и запись на диск
+ ld a,(FILE1_PARAMS.id_blck); идентиф. блока памяти
+ ;ld b,0 ; лог. номер страницы в блоке
+ ld bc,BIOS.GetMemPage ; получить физ. номер страницы в блоке
+ rst ToBIOS
+ ret c
+.loop: push af
+ out (SLOT3),a
+ ld hl,(FILE1_PARAMS.sizeLow) ; мл.разряд размера файла
+ ld de,(FILE1_PARAMS.sizeHigh) ; ст.разряд
+ ld bc,#4000
+ xor a
+ sbc hl,bc
+ ld b,a
+ ex de,hl
+ sbc hl,bc
+ ex de,hl
+ jr c,.write_end ; записать остаток
+ ld (FILE1_PARAMS.sizeLow),hl
+ ld (FILE1_PARAMS.sizeHigh),de
+ ;
+ ld hl,page_buffer ; #C000 откуда
+ ld de,#4000 ; сколько
+ ld a,(FILE1_PARAMS.handle) ; дескр. файла
+ ld c,Dss.Write ; запись файла
+ RST ToDSS
+ pop bc
+ jr c,.error
+ ; write_ok
+ ; [ ] Fixed 24/06/2024 какой-то пережиток прошлого
+ ;cp -1 ; записано меньшее число байт ?
+ ;ld a,DSS_Error.sys.DISK_FULL
+ ;scf
+ ;jr nz,.error ; да, на диске нет места
+ ;
+ ld a,b ; a=физич. страница
+ ld c,BIOS.GetMemPageNext ; получить номер след. физ. страницы блока
+ rst ToBIOS
+ ret c
+ cp #FF
+ jr nz,.loop ; не последняя страница
+ ret
+ ;
+.write_end: pop af ; баланс стека
+ ld de,(FILE1_PARAMS.sizeLow) ; сколько
+ ld a,e
+ or d
+ ret z ; 0 байтов
+ ld hl,page_buffer ; #C000 откуда
+ ld a,(FILE1_PARAMS.handle) ; дескр. файла
+ ld c,Dss.Write ; запись файла
+ RST ToDSS
+ ret nc
+ ;
+.error: push af
+ ld a,14 ; индекс "Writing error"
+ call print_string
+ pop af
+ ret
+
+
+
+; ДОС-загрузчик
+code_loader: include 'dssboot.asm' ; универсальный загрузчик для старого и нового доса
+code_loader.size EQU $-code_loader
+ ASSERT SECTORS_OF_LOADER*512 >= (code_loader.size), "incorrect value of the SECTORS_OF_LOADER variable"
+
+
+ DISPLAY " dssboot size: ", /D,code_loader.size, " bytes. Sectors: ",/D,(code_loader.size/512 + (code_loader.size mod 512)/(code_loader.size mod 512))
+
+
+; 512 байт, буфер boot-сектора
+buffer equ $
+sys_disk equ buffer+512 ; диск системы
+sys_path equ sys_disk+1 ; путь системы
+
diff --git a/Console/CONSOLE.ASM b/Console/CONSOLE.ASM
deleted file mode 100644
index 374fc9e..0000000
--- a/Console/CONSOLE.ASM
+++ /dev/null
@@ -1,2276 +0,0 @@
-
-;[BEGIN]
-;
-; SYSTEM.EXE /S /P
-;
-; /P Primary command processor
-; /S Secondary command processor
-; /C Execute batch file
-
-;--------------------------------------------------------------
-;Rev. Date Name Description
-;--------------------------------------------------------------
-;R10 16-05-2023 BAO TEХT MODE AND TEXT ARE RESTORED AFTER RETURNING FROM THE APP
-;R09 ??-??-???? DNS ;????? ????
-;R08 21-02-2003 DNS FIX BUG IN BAT-PARSER, IT SPLIT STRINGS
-; WHEN LINE BEGAN AT #xx00 OFFSET
-;R07 14-12-2002 DNS PARSING BATCH LINE
-;R06 12-12-2002 DNS ADD %0, %1, %2 ...
-;R05 11-12-2002 DNS IMPLEMENTED %VAR%
-;R04 11-12-2002 DNS ADD 'EVALSTRING' ROUTINE
-;R03 11-12-2002 DNS NEW VERSION
-;R02 19-11-2002 DNS CORRECT SOME ERROR MESSAGES
-;R01 19-11-2002 DNS ADD ENVIRONMENT %VARIABLE% IN ECHO
-;
- OUTPUT './Build/system.exe'
-
- ORG #8100-512
- include 'shared_includes/constants/bios_equ.inc'
- include 'shared_includes/constants/dss_equ.inc'
-
-CR EQU 13
-LF EQU 10
- 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
-
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0
-
-; DEFS 490,0
-
-; LD SP,#BFFF
-START CALL INIT
- CALL GET_CMD
- EI
- LD A,(RUNMODE)
- AND #80 ;TEST PRIMARY
- JP NZ,FPRIMAR
- LD A,(RUNMODE)
- AND #20 ;TEST SECONDARY
- JP NZ,FSECOND
- LD A,(RUNMODE)
- AND #10 ;TEST BATCH FILE
- JP NZ,FBATCHS
- LD A,(RUNMODE)
- AND #40 ;TEST PROCESS
- JP NZ,FBATCH
- JP QUIT
-
-FSECOND CALL VERS
- JP CONSOLE
-
-FBATCHS
- LD HL,CMDLINE
- CALL BATCH
- JP QUIT
-
-FBATCH
- CALL CMDMODE
- JP QUIT
-
-FPRIMAR LD C,Dss.CTRLKey
- RST #10
- LD A,B
- AND #C0
- JP NZ,CONSOLE
- LD HL,BATNAME
- CALL BATCH
- JP CONSOLE
-
-;R07
-MAKE_BATCH_PRM_ARRAY
- DEC HL
-B_SKIP_SPACE
- INC HL
- LD A,(HL)
- OR A
- RET Z
- CP " "
- JR Z,B_SKIP_SPACE
- CP 9
- JR Z,B_SKIP_SPACE
- EX DE,HL
- LD (HL),E
- INC HL
- LD (HL),D
- INC HL
- EX DE,HL
-B_FIND_SPACE
- INC HL
- LD A,(HL)
- CP "!"
- JR NC,B_FIND_SPACE
- LD (HL),0
- OR A
- RET Z
- DJNZ B_SKIP_SPACE
- RET
-
-
-BATCH
- PUSH HL
- LD DE,PRMLINE
-BCHL1 LD A,(HL)
- LDI
- OR A
- JR NZ,BCHL1
- LD HL,PRMLINE
- LD DE,BAT_PRM_ARRAY
- LD B,10
- CALL MAKE_BATCH_PRM_ARRAY
- JR NZ,B_ALL_P
- LD HL,NULL
- EX DE,HL
-B_CLR_P LD (HL),E
- INC HL
- LD (HL),D
- INC HL
- DJNZ B_CLR_P
- EX DE,HL
-B_ALL_P POP HL
-;R07
- XOR A
- LD C,Dss.Open
- RST #10
- ;R10
- CALL Restore_Screen
- ;R10
- RET C
- LD (BAT_FM),A
- CALL NEWLINE
- XOR A
- RET
-
-
-
-Restore_Screen:
- PUSH AF
- LD C,Dss.GetVMod
- RST ToDSS
- AND #80
- JR Z,.exit
- LD BC,1 * 256 + Dss.SetVMod
- LD A,Dss.SetVMod.txt80x32
- RST ToDSS
-.exit: POP AF
- RET
-
-
-
-NEWLINE LD DE,CMDLINE
-ADDBAT PUSH DE
- CALL READBAT
- POP DE
- OR A
- JR NZ,BATLINE
- EX DE,HL
- LD DE,CMDLINE
- AND A
- SBC HL,DE
- RET Z
- LD A,L
- LD (CMDLINE-1),A
- CALL CMDMODE
- LD C,Dss.Close
- LD A,(BAT_FM)
- RST #10
- RET
-
-BATLINE LD HL,BATBUFF
-NBLINE CALL MOVWORD
- JP C,ADDBAT
- LD A,B
- LD (BAT_LEN),A
- PUSH HL
- EX DE,HL
- LD DE,CMDLINE
- AND A
- SBC HL,DE
- LD A,L
- LD (CMDLINE-1),A
- CALL CMDMODE
- LD DE,CMDLINE
- POP HL
- JP NBLINE
-
-MOVWORD LD A,(BAT_LEN)
- LD B,A
-M00WORD LD A,(HL)
- LD (DE),A
- CP #20
- JR C,M01WORD
- INC HL
- INC DE
- DJNZ M00WORD
- SCF
- RET
-
-M01WORD LD A,(HL)
- CP #20
- RET NC
- INC HL
- DJNZ M01WORD
- ;R08
- PUSH DE
- CALL READBAT
- POP DE
- LD HL,BATBUFF
- LD A,(BAT_LEN)
- LD B,A
- OR A
- JR NZ,M01WORD
- SCF
- ;R08
- RET
-
-READBAT LD HL,BATBUFF
- LD DE,128
- LD C,Dss.Read
- LD A,(BAT_FM)
- RST #10
- LD A,E
- LD (BAT_LEN),A
- RET
-
-CMDMODE XOR A
- LD (POSIT),A
- CALL EVALCMD ;R05
- LD IX,CMDLINE-2
- LD HL,CMDLINE
- LD A,(HL)
- CP "@"
- JR NZ,NOALPHA
- DEC HL
- DEC (HL)
- JR Z,NOEC
- LD C,(HL)
- INC HL
- LD B,0
- LD D,H
- LD E,L
- INC HL
- LDIR
- JR NOEC
-NOALPHA LD A,(ECHOFLG)
- OR A
- JR NZ,NOEC
- LD DE,CMDLINE
- CALL PRINT_S
- CALL CRLF
- LD A,(CMDLINE-1)
- OR A
- RET Z
- CALL CRLF
- CALL COMPBAT
- RET
-
-NOEC LD A,(CMDLINE-1)
- OR A
- RET Z
- CALL COMPBAT
- RET
-
-COMPBAT LD HL,CMDLINE
- DEC HL
- LD C,(HL)
- LD B,0
- INC HL
-COMP00B LD A,(HL)
- CP " "
- JR NZ,COMP01B
- INC HL
- DEC C
- JR NZ,COMP00B
- RET
-COMP01B LD D,H
- LD E,L
- ADD HL,BC
- LD (HL),0
- SBC HL,BC
- LD A,C
- EX AF,AF'
- LD A,#20
- CPIR
- JR NZ,COMPB05
- INC C
-COMPB05 EX AF,AF'
- SUB C
- LD C,A
- LD HL,BATLIST
- JP COMP004
-
-INIT LD A,(IX-1)
- LD (TASKX),A
- PUSH IX
- CALL CRLF
- CALL GETPATH
- POP IX
- RET
-
-CONSOLE:
- CALL CRLF
-RE_: CALL GETXY
- CALL GETPATH
-; CALL VERS
- LD HL,CMDLINE
- LD DE,CMDLINE+1
- LD (HL),0
- LD BC,#7F
- LDIR
- CALL INPUT
- CALL CRLF
- LD A,(CMDLINE-1)
- OR A
- JP Z,RE_
- CALL CRLF
- CALL COMP
- JP RE_
-
-GETXY LD C,Dss.Cursor
- RST #10
- JP LOCAT
-
-INPUT XOR A
- LD (POSIT),A
- LD (SHIFT),A
- LD (LEN_NEW),A
- LD IX,CMDLINE-2
- CALL CEDIT
- CALL RES_CUR
- RET
-
-COMP
- CALL EVALCMD ;R05
- LD HL,CMDLINE
- DEC HL
- LD C,(HL)
- LD B,0
- INC HL
-COMP00 LD A,(HL)
- CP " "
- JR NZ,COMP01
- INC HL
- DEC C
- JR NZ,COMP00
- RET
-COMP01 LD D,H
- LD E,L
- ADD HL,BC
- LD (HL),0
- SBC HL,BC
- LD A,C
- EX AF,AF'
- LD A,#20
- CPIR
- JR NZ,COMP005
- INC C
-COMP005 EX AF,AF'
- SUB C
- LD C,A
- LD HL,CMDLIST
-COMP004 PUSH BC
- PUSH DE
-COMP000 LD A,(DE)
- CP #61
- JP C,COMP001
- CP #7B
- JP NC,COMP001
- SUB #20
-COMP001 CP (HL)
- JP NZ,COMP002
- INC HL
- INC DE
- DEC C
- JP NZ,COMP000
- XOR A
- CP (HL)
- JP NZ,COMP002
- POP BC
- POP BC
- LD A,(DE)
- CP " "
- JR NZ,NOSPC
- INC DE
-NOSPC INC HL
- LD A,(HL)
- INC HL
- LD H,(HL)
- LD L,A
- JP (HL)
-
-COMP002 XOR A
- LD C,#FF
-
-.loop: CPI ;!FIXIT CPIR
- JP NZ,.loop
-
- INC HL
- INC HL
- POP DE
- POP BC
- LD A,(HL)
- OR A
- JP NZ,COMP004
- LD H,D ;CMDLINE
- LD L,E
- LD B,(HL)
- INC HL
- LD C,(HL)
- INC HL
- LD A,(HL)
- OR A
- JR NZ,RUN_EXT
- LD A,":"
- CP C
- JR NZ,RUN_EXT
- LD A,B
- CP "a"
- JR C,NOUP
- CP "{"
- JR NC,NOUP
- AND #5F
-NOUP SUB "A"
- LD C,Dss.ChDisk
- RST #10
- JP C,ERROR
- JP GETPATH
-
-SAVEHL DW 0
-
-RUN_EXT EX DE,HL
- LD (SAVEHL),HL
- LD BC,Dss.EX_Path.GET_TYPE*256 + Dss.EX_Path
- LD DE,EXTBF
- RST #10
- LD HL,(SAVEHL)
- JR C,RUN_EXE
- BIT 1,A
- JR Z,NON_EXT
- LD DE,EXTBF
- LD HL,BATBF
- LD B,3
- CALL COMPARE
- LD HL,(SAVEHL)
- JR Z,RUN_BAT
- JP RUN_EXE
-
-NON_EXT LD BC,0*256+Dss.Exec
- RST #10
- ;R10
- CALL Restore_Screen
- ;R10
- RET NC
- LD HL,(SAVEHL)
- CP 3
- JP NZ,EXEERR
- PUSH HL
- LD A,(CMDLINE-1)
- LD B,A
-EXF000 LD A,(HL)
- CP "!"
- JR C,EXF001
- INC HL
- DJNZ EXF000
-
-EXF001
- LD E,B
- LD D,0
- ADD HL,DE
- PUSH HL
- LD E,4
- ADD HL,DE
- POP DE
- EX DE,HL
- LD C,B
- LD B,0
- INC C
- LDDR
- INC HL
- LD (HL),"."
- INC HL
- LD (HL),"B"
- INC HL
- LD (HL),"A"
- INC HL
- LD (HL),"T"
-; LD HL,(SAVEHL)
- POP HL
- JP RUN_BAT
-
-RUN_EXE:
- LD BC,0*256 + Dss.Exec
- RST ToDSS
- ;R10
- CALL Restore_Screen
- ;R10
- RET NC
-EXEERR CP 5
- JP NC,ERROR
- LD DE,0 ;BAD COMMAND OR FILENAME
- JP ERR_MSG
-
-RUN_BAT CALL BATCH
- JP C,EXEERR
- RET
-
-BATLIST DB 'PAUSE' : DW CPAUSE
- DB 'REM' : DW CREM
-CMDLIST DZ 'CD' : DW CCHDIR
- DZ 'CHDIR' : DW CCHDIR
- DZ 'CLS' : DW CLS
- DZ 'DATE' : DW CDATE
- DZ 'DEL' : DW CDELET
- DZ 'DIR' : DW DIR
- DZ 'ECHO' : DW CECHO
- DZ 'ERASE' : DW CDELET
- DZ 'EXIT' : DW CEXIT
- DZ 'HELP' : DW HELP
- DZ 'MD' : DW CMKDIR
- DZ 'MKDIR' : DW CMKDIR
- DZ 'PATH' : DW CPATH
- DZ 'REN' : DW CRENAM
- DZ 'RENAME' : DW CRENAM
- DZ 'RD' : DW CRMDIR
- DZ 'RMDIR' : DW CRMDIR
- DZ 'SET' : DW CSET
- DZ 'TIME' : DW CTIME
- DZ 'VERSION' : DW VERS
- DZ 'VER' : DW VERS
- DB #00
-
-CLS LD DE,#0000
- LD HL,#2050
- LD BC,7*256+Dss.Clear
- LD A," "
- RST #10
- LD DE,#0000
- JP LOCAT
-
-CRLF LD A,#0D
- CALL PRINTX
- LD A,#0A
- JP PRINTX
-
-CDATE EX DE,HL
- LD DE,DTA
- LD C,Dss.GSwitch
- RST #10
- LD DE,DTA
- LD A,(DE)
- OR A
- JR Z,NOSETD
- CALL STR2DEC
- JR C,ILLEG
- XOR A
- CP H
- JR NZ,ILLEG
- LD A,31
- CP L
- JR C,ILLEG
- LD B,L
- PUSH BC
- CALL STR2DEC
- POP BC
- JR C,ILLEG
- XOR A
- CP H
- JR NZ,ILLEG
- LD A,12
- CP L
- JR C,ILLEG
- LD C,L
- PUSH BC
- CALL STR2DEC
- PUSH HL
- LD C,Dss.SysTime
- RST #10
- POP IX
- POP DE
- LD C,Dss.SetTime
- RST #10
-NOSETD LD C,Dss.SysTime
- RST #10
- PUSH IX
- PUSH DE
- LD A,D
- LD HL,PRM1
- CALL PUTB
- LD A,"-"
- LD (HL),A
- INC HL
- POP DE
- LD A,E
- CALL PUTB
- LD A,"-"
- LD (HL),A
- INC HL
- PUSH HL
- POP IX
- POP HL
- CALL PDIGIT
- LD DE,DATEMSG
- JP MESSAGE
-
-ILLEG LD DE,ILLGMSG
- CALL MESSAGE
- RET
-
-CTIME EX DE,HL
- LD DE,DTA
- LD C,Dss.GSwitch
- RST #10
- LD DE,DTA
- LD A,(DE)
- OR A
- JR Z,NOSETT
- CALL STR2DEC
- JR C,ILLEG
- XOR A
- CP H
- JR NZ,ILLEG
- LD A,23
- CP L
- JR C,ILLEG
- LD B,L
- PUSH BC
- CALL STR2DEC
- POP BC
- JR C,ILLEG
- XOR A
- CP H
- JR NZ,ILLEG
- LD A,59
- CP L
- JR C,ILLEG
- LD C,L
- PUSH BC
- CALL STR2DEC
- POP BC
- JR C,ILLEG
- XOR A
- CP H
- JR NZ,ILLEG
- LD A,59
- CP L
- JR C,ILLEG
- PUSH BC
- LD A,L
- PUSH AF
- LD C,Dss.SysTime
- RST #10
- POP BC
- POP HL
- LD C,Dss.SetTime
- RST #10
-NOSETT LD C,Dss.SysTime
- RST #10
- PUSH BC
- PUSH HL
- LD A,H
- LD HL,PRM1
- CALL PUTB
- LD A,":"
- LD (HL),A
- INC HL
- POP DE
- LD A,E
- CALL PUTB
- LD A,":"
- LD (HL),A
- INC HL
- POP AF
- CALL PUTB
- XOR A
- LD (HL),A
- LD DE,TIMEMSG
- JP MESSAGE
-
-CPAUSE LD DE,PAUSMSG
- CALL MESSAGE
- LD C,Dss.WaitKey
- RST #10
- RET
-
-
- ;R09
-PATHSTR DB "PATH=",0
-
-CPATH LD A,(DE)
- OR A
- JP Z,PRNEPATH
- INC DE
- CP 9
- JR Z,CPATH
- CP "!"
- JR C,CPATH
- DEC DE
- EX DE,HL
- DEC HL
- LD (HL),"="
- DEC HL
- LD (HL),"H"
- DEC HL
- LD (HL),"T"
- DEC HL
- LD (HL),"A"
- DEC HL
- LD (HL),"P"
- LD BC,2*256+Dss.Environ
- RST #10
- CALL C,ERROR
- RET
-PRNEPATH
- LD DE,DTA
- LD HL,PATHSTR
- LD BC,1*256+Dss.Environ
- RST #10
- JP C,ERROR
- LD HL,PATHSTR
- LD C,Dss.PChars
- RST #10
- LD HL,DTA
- LD C,Dss.PChars
- RST #10
- CALL CRLF
- RET
- ;R09
-
-
-CSET LD A,(DE)
- OR A
- JP Z,PRNENVIR
- INC DE ;R08
- CP 9 ;R08
- JR Z,CSET ;R08
- CP "!" ;R08
- JR C,CSET ;R08
- DEC DE ;R08
- EX DE,HL
- LD BC,2*256+Dss.Environ
- RST #10
- CALL C,ERROR
- RET
-
-PRNENVIR
- LD HL,DTA
- LD BC,0*256+Dss.Environ
- RST #10
- LD HL,DTA
-PRNENVX LD C,Dss.PChars
- RST #10
- LD A,CR
- LD C,Dss.PutChar
- RST #10
- LD A,LF
- LD C,Dss.PutChar
- RST #10
- LD A,(HL)
- OR A
- JR NZ,PRNENVX
- RET
-
-
-CECHO EX DE,HL
- LD A,(HL)
- OR A
- JR Z,ECHO_F
- EX DE,HL
- PUSH DE
- LD B,3
- LD HL,ECHOON
- CALL COMPARE
- POP DE
- JR Z,ECHO_FS
- PUSH DE
- LD B,4
- LD HL,ECHOOFF
- CALL COMPARE
- POP HL
- JR Z,ECHO_FR
-
-;R03 REMOVE R01
-
- LD C,Dss.PChars
- RST #10
- JP CRLF
-
-ECHO_F LD A,(ECHOFLG)
- OR A
- LD DE,ON__MSG
- JR Z,ECHON
- LD DE,OFF_MSG
-ECHON CALL FMESAGE
- LD DE,PRM1
- CALL PUTPRM
- LD DE,ECHOMSG
- CALL MESSAGE
- RET
-
-ECHO_FS XOR A
- LD (ECHOFLG),A
- RET
-
-ECHO_FR LD A,#FF
- LD (ECHOFLG),A
- RET
-
-;R04
-
-EVALCMD
- XOR A
- LD HL,CMDLINE-1
- LD C,(HL)
- LD B,A
- INC HL
- ADD HL,BC
- LD (HL),A
- SBC HL,BC
- LD DE,TMPLINE
- CALL EVALSTR
- LD HL,TMPLINE
- LD DE,CMDLINE
- LD BC,#00FF
-MOVLBAK LD A,(HL)
- LDI
- INC B
- OR A
- JR NZ,MOVLBAK
- DEC B
- LD A,B
- LD (CMDLINE-1),A
- AND A
- RET
-
-; HL - STRING WITH %VAR%
-
-EVALSTR
-;R04 LD DE,DTA
-VARLOOP
- LD A,(HL)
- CP "%"
- JR Z,TVARIABLE
-VARL1 LDI
- OR A
- JR NZ,VARLOOP
- LD BC,0
- LD (TVAR_PNT),BC
-;R04 LD HL,DTA
-;R04
- RET
-
-IZERO DB "ZERO",0
-IONE DB "ONE",0
-ITWO DB "TWO",0
-ITHREE DB "THREE",0
-IFOUR DB "FOUR",0
-IFIVE DB "FIVE",0
-ISIX DB "SIX",0
-ISEVEN DB "SEVEN",0
-IEIGHT DB "EIGHT",0
-ININE DB "NINE",0
-
-;R06
-BAT_PRM_ARRAY
- DW IZERO,IONE,ITWO,ITHREE,IFOUR,IFIVE,ISIX,ISEVEN,IEIGHT,ININE
- DW 0,0,0,0,0,0,0,0,0,0
-;R06
-NULL DB 0 ;R07
-
-;R01
-TVAR_PNT
- DW 0
-
-TVARIABLE
- LD BC,(TVAR_PNT)
- LD A,B
- OR C
- LD A,"%"
- LD (TVAR_PNT),DE
- JR NZ,TVAR1 ;R06
- INC HL ;R06
- LD A,(HL) ;R06
- CP "9"+1 ;R06
- JR C,TVAR0 ;R06
-TVAR2 LD A,"%" ;R06 > "9"
- DEC HL ;R06
- JP VARL1 ;R06
-TVAR0 CP "0" ;R06
- JR C,TVAR2 ;R06 < "0"
-; BATCH PARAM %0, %1, %2 ...
- INC HL ;R06
- PUSH HL
- LD (TVAR_PNT),BC
- SUB "0"
- ADD A,A
- LD C,A
- LD HL,BAT_PRM_ARRAY
- ADD HL,BC
- LD A,(HL)
- INC HL
- LD H,(HL)
- LD L,A
- OR H
- JR Z,NOBTP ;NO BATCH PARM
-MVBTP LD A,(HL)
- LDI
- OR A
- JR NZ,MVBTP
- DEC DE
-NOBTP POP HL
- JP VARLOOP ;R06
-;R06
-
-TVAR1 PUSH HL
- LD H,D
- LD L,E
- DEC HL
- AND A
- SBC HL,BC
- JR Z,TNOVAR
- LD A,"="
- LD (DE),A
- INC DE
- XOR A
- LD (DE),A
- LD D,B
- LD E,C
- LD H,B
- LD L,C
- INC HL
- LD BC,1*256+Dss.Environ
- RST #10
-TNOVAR POP HL
- INC HL
- LD BC,0
- LD (TVAR_PNT),BC
- JP VARLOOP
-;R01
-
-COMPARE LD A,(DE)
- CP #61
- JP C,COM001
- CP #7B
- JP NC,COM001
- SUB #20
-COM001 CP (HL)
- RET NZ
- INC HL
- INC DE
- DJNZ COMPARE
- RET
-
-CREM RET
-
-CCHDIR EX DE,HL
- LD DE,DTA
- LD C,Dss.GSwitch
- RST #10
- XOR A
- LD HL,DTA
- CP (HL)
- JR NZ,YP
- LD (HL),"."
- INC HL
- LD (HL),"."
- INC HL
- LD (HL),0
- DEC HL
- DEC HL
-YP LD C,Dss.ChDir
- RST #10
- CALL C,ERROR
- CALL GETPATH
- RET
-
-CMKDIR EX DE,HL
- LD DE,DTA
- LD C,Dss.GSwitch
- RST #10
- LD HL,DTA
- LD C,Dss.MkDir
- RST #10
- CALL C,ERROR
- RET
-
-CRMDIR EX DE,HL
- LD DE,DTA
- LD C,Dss.GSwitch
- RST #10
- LD HL,DTA
- LD C,Dss.RmDir
- RST #10
- CALL C,ERROR
- RET
-
-CDELET EX DE,HL
- LD DE,DTA
- LD C,Dss.GSwitch
- RST #10
- LD HL,DTA
- LD C,Dss.Delete
- RST #10
- CALL C,ERROR
- RET
-
-CRENAM EX DE,HL
- LD DE,DTA
- LD C,Dss.GSwitch
- RST #10
- LD DE,DTA+128
- LD C,Dss.GSwitch
- RST #10
- LD HL,DTA
- LD DE,DTA+128
- LD C,Dss.Rename
- RST #10
- CALL C,ERROR
- RET
-
-ERROR LD E,A
- LD D,0
- JP ERR_MSG
-
-DIR LD HL,0
- LD (FILES),HL
- LD (S_LOW),HL
- LD (S_HIGH),HL
- EX DE,HL
- LD A,(HL)
- OR A
- JR NZ,YPS
- LD HL,ALLFS
-YPS LD DE,DTA
- LD C,Dss.GSwitch
- RST #10
- LD HL,DTA
- LD DE,DTA
- LD A,#37
- LD BC,0*256+Dss.F_First
- RST #10
- JP C,ERROR
- LD A,(PATHF)
- LD (PRM1+0),A
- LD A,":"
- LD (PRM1+1),A
- LD A,0
- LD (PRM1+2),A
- LD HL,SER_NUM
- LD DE,PRM2
- CALL PUTPRM
- CALL GETPATH
- LD HL,PATHF
- LD DE,PRM3
- CALL PUTPRM
- LD DE,DIR1MSG
- CALL MESSAGE
-; CALL CRLF
-; CALL CRLF
-DIRNEX LD HL,DTA
- LD DE,33
- ADD HL,DE
- CALL PNAME
- LD IX,DTA
- LD A,(IX+32)
- AND #10
- JP NZ,NODADD
- LD HL,(FILES)
- INC HL
- LD (FILES),HL
- LD E,(IX+30)
- LD D,(IX+31)
- LD HL,(S_HIGH)
- EXX
- LD E,(IX+28)
- LD D,(IX+29)
- LD HL,(S_LOW)
- CALL ADDXXX
- LD (S_LOW),HL
- EXX
- LD (S_HIGH),HL
-NODADD LD DE,DTA
- LD C,Dss.F_Next
- RST #10
- JR NC,DIRNEX
- CALL ORDERS
- RET
-
-ORDERS LD HL,(FILES)
- LD IX,PRM1
- CALL PDIGIT
- LD HL,(S_LOW)
- EXX
- LD HL,(S_HIGH)
- EXX
- CALL MAKE_LN
- LD HL,L32BIT_+9
- LD A,(HL)
- CP #20
- JR NZ,ALR2
- LD A,#30
- LD (HL),A
-ALR2 LD DE,SIZEBFF
- LD HL,L32BIT_;; +1
- LD A,(HL)
- LDI
- CP " "
- JR Z,NOPO1
- LD A,"."
-NOPO1 LD (DE),A
- INC DE
- LDI
- LDI
- LD A,(HL)
- LDI
- CP " "
- JR Z,NOPO2
- LD A,"."
-NOPO2 LD (DE),A
- INC DE
- LDI
- LDI
- LD A,(HL)
- LDI
- CP " "
- JR Z,NOPO3
- LD A,"."
-NOPO3 LD (DE),A
- INC DE
- LDI
- LDI
- LDI
- LD HL,SIZEBFF
- LD DE,PRM2
- CALL PUTPRM
- LD DE,DIR2MSG
- JP MESSAGE
-
-;HL':HL + DE':DE
-
-ADDXXX ADD HL,DE
- EXX
- ADC HL,DE
- EXX
- RET
-
-FILES DW 0
-
-S_LOW DW 0
-S_HIGH DW 0
-
-;12345678 123 1 234 567 890 "
-; SIZE
-
-PNAME LD BC,8
- LD DE,PRM1
- LDIR
- XOR A
- LD (DE),A
- LD DE,PRM2
- LDI
- LDI
- LDI
- LD (DE),A
- LD IX,DTA
- CALL PRNSIZE
- CALL PRNDATE
- CALL PRNTIME
- LD DE,DIR3MSG
- JP MESSAGE
-
-PRINTB LD A,(HL)
- PUSH BC
- CALL PRINTX
- POP BC
- INC HL
- DJNZ PRINTB
- RET
-;------------------
-
-PUTB LD C,#2F
-PUTB1 INC C
- SUB 10
- JP NC,PUTB1
- ADD A,10
- ADD A,#30
- PUSH AF
- LD A,C
- LD (HL),A
- INC HL
- POP AF
- LD (HL),A
- INC HL
- RET
-
-
-PRNB LD C,#2F
-PRNB1 INC C
- SUB 10
- JP NC,PRNB1
- ADD A,10
- ADD A,#30
- PUSH AF
- LD A,C
- CALL PRINTX
- POP AF
- JP PRINTX
-
-STR2DEC LD HL,0
-STRLOOP LD A,(DE)
- INC DE
- OR A
- RET Z
- CP "-"
- RET Z
- CP ":"
- RET Z
- LD B,H
- LD C,L
- ADD HL,HL
- ADD HL,HL
- ADD HL,BC
- ADD HL,HL
- CALL ATODEC
- RET C
- ADD A,L
- LD L,A
- JR NC,STRLOOP
- INC H
- JR STRLOOP
-
-ATODEC CP "0"
- RET C
- CP ":"
- CCF
- RET C
- SUB "0"
- RET
-
-PDIGIT LD DE,10000
- LD A,#C8
- LD (RET_Z),A
- CALL DIG
- LD DE,1000
- CALL DIG
- LD DE,100
- CALL DIG
- LD DE,10
- CALL DIG
- LD A,L
- ADD A,#30
-
-; !FIXIT
- LD (IX+0),A
- INC IX
- LD (IX+0),0
-; на это:
- ; LD (IX+0),A
- ; LD (IX+1),0
- RET
-
-DIG XOR A
-DIG1 INC A
- SBC HL,DE
- JR NC,DIG1
- ADD HL,DE
- DEC A
-RET_Z RET Z
- ADD A,#30
- LD (IX+0),A
- INC IX
-; LD A,0
- XOR A
- LD (RET_Z),A
- RET
-
-PRNSIZE LD A,(IX+32)
- LD HL,DIRIDD
- AND #10
- JP NZ,PRZ
- LD L,(IX+28)
- LD H,(IX+29)
- EXX
- LD L,(IX+30)
- LD H,(IX+31)
- EXX
- PUSH IX
- CALL MAKE_LN
- LD HL,L32BIT_+9
- LD A,(HL)
- CP #20
- JR NZ,ALR
- LD A,#30
- LD (HL),A
-ALR LD DE,SIZEBFF
- LD HL,L32BIT_;; +1
- LDI
- LD A," "
- LD (DE),A
- INC DE
- LDI
- LDI
- LDI
- LD (DE),A
- INC DE
- LDI
- LDI
- LDI
- LD (DE),A
- INC DE
- LDI
- LDI
- LDI
- LD HL,SIZEBFF
- POP IX
-PRZ LD DE,PRM3
- JP PUTPRM
-
-PRNDATE LD B,(IX+25)
- LD C,(IX+24)
- LD HL,SIZEBFF
- CALL DATE
- LD (HL),0
- LD HL,SIZEBFF
- LD DE,PRM4
- LD A,(HL)
- CP "0"
- JP NZ,PUTPRM
- LD (HL),#20
- JP PUTPRM
-
-PRNTIME LD B,(IX+22)
- LD C,(IX+23)
- LD HL,SIZEBFF
- CALL TIME
- LD (HL),0
- LD HL,SIZEBFF
- LD DE,PRM5
- LD A,(HL)
- CP "0"
- JP NZ,PUTPRM
- LD (HL),#20
- JP PUTPRM
-
-TIME
- SRL C
- RR B
- SRL C
- RR B
- SRL C
- RR B
- SRL B
- SRL B
- LD A,C
- CALL NUMB
- LD (HL),":"
- INC HL
- LD A,B
- JP NUMB
-
-DATE
- LD A,C
- AND #1F
- PUSH BC
- CALL NUMB
- LD (HL),"."
- INC HL
- POP BC
- LD A,C
- SRL B
- RLA
- RLA
- RLA
- RLA
- AND #0F
- CALL NUMB
- LD (HL),"."
- INC HL
- LD A,B
- ADD A,#50
- CP 100
- JP C,NUMB
-SUB100 SUB 100
- CP 100
- JP C,NUMB
- JR SUB100
-
-NUMB LD C,#2F
-NUMB1 INC C
- SUB 10
- JP NC,NUMB1
- ADD A,10
- ADD A,#30
- LD (HL),C
- INC HL
- LD (HL),A
- INC HL
- RET
-
-MAKE_LN LD IX,L32BIT_
- EXX
- LD DE,#3B9A ; 1000000000
- EXX
- LD DE,#CA00
- CALL GET_DIG
- EXX
- LD DE,#05F5 ; 100000000
- EXX
- LD DE,#E100
- CALL GET_DIG
- EXX
- LD DE,#0098 ; 10000000
- EXX
- LD DE,#9680
- CALL GET_DIG
- EXX
- LD DE,#000F ; 1000000
- EXX
- LD DE,#4240
- CALL GET_DIG
- EXX
- LD DE,#0001 ; 100000
- EXX
- LD DE,#86A0
- CALL GET_DIG
- EXX
- LD DE,#0000 ; 10000
- EXX
- LD DE,#2710
- CALL GET_DIG
- EXX
- LD DE,#0000 ; 1000
- EXX
- LD DE,#03E8
- CALL GET_DIG
- EXX
- LD DE,#0000 ; 100
- EXX
- LD DE,#0064
- CALL GET_DIG
- EXX
- LD DE,#0000 ; 10
- EXX
- LD DE,#000A
- CALL GET_DIG
- LD A,L ; 1
- ADD A,#30
- LD (IX+0),A
- INC IX
- LD HL,L32BIT_
- LD DE,#2030
-KILLZ LD A,(HL)
- CP E
- JR NZ,KILLZ2
- LD (HL),D
- INC HL
- JP KILLZ
-KILLZ2 LD HL,L32BIT_+9
- LD A,(HL)
- CP D
- RET NZ
- LD (HL),E
- RET
-
-; HL:HL - DE:DE
-
-GET_DIG XOR A
-INC_DG INC A
- SBC HL,DE
- EXX
- SBC HL,DE
- EXX
- JP NC,INC_DG
- ADD HL,DE
- EXX
- ADC HL,DE
- EXX
- DEC A
- ADD A,#30
- LD (IX+0),A
- INC IX
- RET
-
-L32BIT_ DB "0000000000"
-
-DIRIDD DB "
",0
-
-SIZEBFF DB "0 000 000 000",0,0
-
-;-------------------
-
-VERS LD C,Dss.Version
- RST #10
- PUSH BC
-
- LD A,D
- LD HL,PRM1
- CALL GETnoZERO
- LD A,"."
- LD (HL),A
- INC HL
-
- LD A,E
- CALL GETnoZERO
- LD A,"."
- LD (HL),A
- INC HL
-
- POP BC
- LD A,C
- CALL GETnoZERO
- XOR A
- LD (HL),A
-
- LD DE,VERSMSG
- JP MESSAGE
-
-GETnoZERO:
- LD B,#2F
-.loop: INC B
- SUB 10
- JR NC,.loop
- ADD A,10+"0"
- LD C,A
- LD A,"0"
- CP B
- LD A,C
- JR Z,.mdec
- LD (HL),B
- INC HL
-.mdec: LD (HL),A
- INC HL
- SCF
- RET
-
-GETyesZERO:
- LD B,#2F
-.loop: INC B
- SUB 10
- JR NC,.loop
- ADD A,10
- LD (HL),B
- INC HL
- RET Z
- ADD A,"0"
- LD (HL),A
- INC HL
- RET
-
-HELP LD DE,HELPMSG
- CALL MESSAGE
- RET
-
-CEXIT LD A,(TASKX)
- DEC A
- DEC A
- RET Z
- POP HL
-QUIT LD B,0
- LD C,Dss.Exit
- RST #10
- RET
-
-ERR_MSG INC DE
- LD HL,ERR0
- LD BC,ERR1-ERR0
- CALL LCPIR
- CALL PRINTZ
- CALL CRLF
- JP CRLF
-
-MESSAGE CALL FMESAGE
- CALL PRINTZ
- CALL GETXY
- RET
-
-FMESAGE INC DE
- LD HL,MSG0
- LD BC,MSG1-MSG0
-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
-
-ROOT DB "C:",#5C,0
-
-ALLFS DB "*.*",0
-
-SER_NUM DB "C37F-73AB",0
-
-EXTBF DS 4
-
-BATBF DB "BAT"
-
-ECHOON DB "ON",0
-ECHOOFF DB "OFF",0
-
-
-DIR1MSG EQU 0
-VERSMSG EQU 1
-DATEMSG EQU 2
-TIMEMSG EQU 3
-PAUSMSG EQU 4
-ILLGMSG EQU 5
-ECHOMSG EQU 6
-ON__MSG EQU 7
-OFF_MSG EQU 8
-DIR2MSG EQU 9
-DIR3MSG EQU 10
-HELPMSG EQU 11
-
-MSG0 DB 0
- DB "Volume in drive %1 has no label",CR,LF ; !FIXIT
- DB "Volume Serial number is %2",CR,LF
- DB "Directory of %3",CR,LF,CR,LF,0
- DB "Estex DSS: Version %1",CR,LF,0 ;R02
- DB "Current date: %1",CR,LF,0
- DB "Current time: %1",CR,LF,0
- DB "Press any key to continue . . .",CR,LF,0
- DB "Invalid parametr",CR,LF,0
- DB "Echo is %1",CR,LF,0
- DB "on",0
- DB "off",0
- DB " %1 file(s) %2 bytes",CR,LF,CR,LF,0
-; FILENAME EXT SIZE DATE TIME
- DB "%1 %2 %3 %4 %5",CR,LF,0
- DB "COMMANDS:",CR,LF,CR,LF
- DB "CD DEL HELP RD SET "
- DB " ",CR,LF
- DB "CHDIR DIR MD REN TIME "
- DB " ",CR,LF
- DB "CLS ERASE MKDIR RENAME VER "
- DB " ",CR,LF
- DB "DATE EXIT PATH RMDIR VERSION "
- DB " ",CR,LF
- DB 0
-MSG1
-
-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 ;R02
- DB "Directory exist",0
- DB "Invalid filename",0
- DB "Invalid EXE-file",0
- DB "Not supported EXE-file",0
- DB "Access denied",0
- DB "Not ready",0
- DB "Seek error",0
- DB "Sector not found",0
- DB "CRC error",0
- DB "Write protect",0
- DB "Read error",0
- DB "Write error",0
- DB "Drive failure",0
- DB "Extended error 28",0
- DB "Extended error 29",0
- DB "No free memory",0
- DB "Invalid memory block",0
- DB "Extended error 32",0
- DB "Extended error 33",0
- DB "Extended error 34",0
- DB "35",0
- DB "36",0
- DB "37",0
- DB "38",0
- DB "39",0
- DB "40",0
- DB "41",0
- DB "42",0
- DB "43",0
- DB "44",0
- DB "45",0
- DB "46",0
- DB "47",0
- DB "48",0
- DB "49",0
- DB "50"
- DB 0
-ERR1
-
-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
-
-DTA ;DEFS 256,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
-PATHF ;DEFS 256,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
-BAT_FM DB 0
-BAT_LEN DB 0
-
-ECHOFLG DB 0
-
-PATHLEN DB 0
-PATH ;DEFS 40,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0
-
-GETPATH: LD C,2
- RST #10
- LD HL,PATHF
- ADD A,"A"
- LD (HL),A
- INC HL
- LD (HL),":"
- INC HL
- LD C,30
- RST #10
-
- LD HL,PATHF
- LD DE,PATH
- LDI
- LDI
- LDI
- PUSH HL
- XOR A
- LD BC,34
- CPIR
- JP NZ,LONGP
- LD A,34
- SUB C
- LD C,A
- POP HL
- LDIR
- JR PHLEN
-
-LONGP CPIR
- LD A,"."
- LD (DE),A
- INC DE
- LD (DE),A
- INC DE
- LD (DE),A
- INC DE
- LD BC,31
- AND A
- SBC HL,BC
- LDIR
- POP HL
-PHLEN LD HL,PATH
- LD BC,40
- XOR A
- CPIR
- LD A,39
- SUB C
- LD (PATHLEN),A
- LD C,A
- INC C
- INC C
- LD A,80
- SUB C
- LD (WINDOW),A
- RET
-PRINT_B LD C,A
-PRINTBB PUSH BC
- CALL PRINTX
- POP BC
- LD A,C
- DJNZ PRINTBB
- RET
-
-TEMPXY DW 0
-
-CR_ LD C,Dss.Cursor
- RST #10
- LD E,0
- JP LOCAT
-
-LF_ LD C,Dss.Cursor
- RST #10
- LD A,D
- CP #1F
- JP Z,LFF
- INC D
- JP LOCAT
-
-LFF PUSH HL
- PUSH DE
- LD BC,#018A
- LD DE,#0020
- EI
- HALT
- DI
- RST ToBIOS
- LD DE,#1F00
- CALL LOCAT
- LD A,#20
- LD BC,#5082
- RST ToBIOS
- EI
- POP DE
- CALL LOCAT
- POP HL
- RET
-
-PRINTX CP #20
- JP NC,CHAR
- CP #0D
- JP Z,CR_
- CP #0A
- JP Z,LF_
-CHAR PUSH BC
- LD BC,#0182
- RST ToBIOS
- POP BC
- RET
-
-LOCAT LD (TEMPXY),DE
- LD C,Dss.Locate
- RST #10
- RET
-
-;PRINTX LD C,Dss.PutChar
-; RST #10
-; RET
-
-CEDIT PUSH IX
- POP HL
- INC HL
- INC HL
- LD (ETXS),HL
- XOR A
- LD (POSIT),A
- LD (SHIFT),A
-EDIT1 LD DE,(ETXS)
- CALL PRINT_S
- CALL KEY
- CP 13
- RET Z
- LD HL,EDIT1
- PUSH HL
- AND A
- LD HL,#5400
- SBC HL,DE
- JP Z,BACK
- AND A
- LD HL,#5600
- SBC HL,DE
- JP Z,FORW
- CP #08
- JP Z,DELET
- CP #20
- RET C
- EX AF,AF'
- LD A,(IX+1)
- CP (IX+0)
- CCF
- RET C
- LD A,(IX+1)
- LD E,A
- LD D,0
- LD HL,(ETXS)
- ADD HL,DE
- LD A,(POSIT)
- LD E,A
- LD A,(IX+1)
- SUB E
- JR Z,ADD_SM
- LD B,D
- LD C,A
- LD D,H
- LD E,L
- DEC HL
- LDDR
- EX DE,HL
-ADD_SM EX AF,AF'
- LD (HL),A
- LD A,(POSIT)
- INC A
- LD (POSIT),A
- LD (MAIN_X),A
- INC (IX+1)
- LD HL,(ETXE)
- INC HL
- LD (ETXE),HL
- LD HL,SHIFT
- SUB (HL)
- CP (IX-1)
- RET C
- LD A,(STEP)
- ADD A,(HL)
- LD (HL),A
-; CALL PAGE
- RET
-
-BACK LD A,(POSIT)
- OR A
- RET Z ;JP Z,BCK
- DEC A
- LD (POSIT),A
- LD (MAIN_X),A
- INC A
- LD HL,SHIFT
- SUB (HL)
- RET NZ
- LD A,(STEP)
- LD E,A
- LD A,(HL)
- SUB E
- LD (HL),A
-; CALL PAGE
- RET
-
-FORW LD A,(POSIT)
- CP (IX+1)
- RET Z ; JP Z,FRD
- INC A
- LD (POSIT),A
- LD (MAIN_X),A
- LD HL,SHIFT
- SUB (HL)
- CP (IX-1)
- RET C
- LD A,(STEP)
- ADD A,(HL)
- LD (HL),A
-; CALL PAGE
- RET
-
-DELET LD A,(POSIT)
- OR A
- RET Z ; JP Z,LINKSTR
- LD HL,(ETXS)
- LD E,A
- LD D,0
- ADD HL,DE
- LD A,(IX+1)
- SUB E
- JR Z,SUB_SM
- LD B,D
- LD C,A
- LD D,H
- LD E,L
- DEC DE
- LDIR
-SUB_SM XOR A
- DEC HL
- LD (HL),A
- LD A,(POSIT)
- DEC A
- LD (POSIT),A
- LD (MAIN_X),A
- DEC (IX+1)
- LD HL,(ETXE)
- DEC HL
- LD (ETXE),HL
- LD HL,SHIFT
- INC A
- SUB (HL)
- RET NZ
- LD A,(STEP)
- LD E,A
- LD A,(HL)
- SUB E
- LD (HL),A
-; CALL PAGE
- RET
-
-KEY ;RES 5,(IY+1)
- LD A,(SHIFT)
- LD E,A
- LD A,(POSIT)
- SUB E
- INC A
- LD HL,PATHLEN
- ADD A,(HL)
- LD (_X+1),A
- LD A,(POSIT)
- CP (IX+1)
- JP C,KEY0
- LD A,#20
- LD (_A+1),A
- JP KEY1
-KEY0 LD E,A
- LD D,0
- LD HL,(ETXS)
- ADD HL,DE
- LD A,(HL)
- LD (_A+1),A
-KEY1 CALL CURSORF
- EI
- HALT
- LD C,Dss.ScanKey
- RST #10
- JP Z,KEY1
- RET
-
-CURSORX DB #00
-
-CURSORF LD A,05
- DEC A
- LD (CURSORF+1),A
- RET NZ
- LD A,05
- LD (CURSORF+1),A
- LD DE,(TEMPXY)
-_X LD E,#00
- CALL LOCAT
- LD A,(CURSORX)
- XOR #FF
- LD (CURSORX),A
- LD A,"_"
- JR NZ,YEPCUR
-_A LD A,#20
-YEPCUR CALL PRINTX
- EI
- RET
-
-RES_CUR LD A,(CURSORX)
- OR A
- RET Z
- XOR #FF
- LD (CURSORX),A
- LD DE,(TEMPXY)
- LD A,(_X+1)
- LD E,A
- CALL LOCAT
- LD A,(_A+1)
- JP PRINTX
-
-PRINT_S PUSH DE
- CALL GETXY ;;;
- LD DE,(TEMPXY)
- LD E,0
- CALL LOCAT
- LD HL,PATH
- CALL PRINTZ
- LD A,">"
- CALL PRINTX
- POP DE
- EX DE,HL
-SH LD BC,#0000
- ADD HL,BC
- LD A,(SHIFT)
- LD C,A
- LD A,(IX+1)
- SUB C
- JP Z,EMT_STR
- LD B,A
- LD A,(IX-1)
- SUB B
- JR NC,PR_S
- LD B,(IX-1)
-PR_S PUSH BC
- LD C,#86
- RST ToBIOS
- POP BC
-EMT_STR LD A,(IX-1)
- SUB B
- EI
- RET Z
- LD B,A
- LD C,#82
- LD A,#20
- RST ToBIOS
- EI
- RET
-
-SHIFT EQU SH+1
-
-GET_CMD LD D,XH
- LD E,XL
- EX DE,HL
- LD E,(HL)
- INC HL
- LD D,0
- EX DE,HL
- ADD HL,DE
- LD (HL),0
-NEXTPRM EX DE,HL
-SKIPSP LD A,(HL)
- INC HL
- CP " "
- RET C
- JR Z,SKIPSP
- DEC HL
- CP "/"
- JR NZ,PROCESS
- LD DE,BUFFER
- LD C,Dss.GSwitch
- RST #10
- PUSH AF
- EX DE,HL ;SAVE HL IN DE
- LD HL,BUFFER
- INC HL
- CALL ISWITCH
- POP AF
- JP NC,NEXTPRM
- XOR A
- RET
-
-PROCESS LD DE,CMDLINE
- LD BC,#00FF
-NLDI LD A,(HL)
- LDI
- INC B
- CP " "
- JR NC,NLDI
- DEC B
- LD A,B
- LD (CMDLINE-1),A
- LD A,(RUNMODE)
- OR #40 ;PROCESS
- LD (RUNMODE),A
- XOR A
- RET
-
-ISWITCH LD A,(HL)
- CP "a"
- JR C,NUP
- CP "{"
- JR NC,NUP
- SUB #20
-NUP
-PR000 CP "P"
- JR NZ,PR001
- LD A,(RUNMODE)
- OR #80 ;PRIMARY CONSOLE
- LD (RUNMODE),A
- RET
-PR001 CP "S"
- JR NZ,PR002
- LD A,(RUNMODE)
- OR #20 ;SECONDARY CONSOLE
- LD (RUNMODE),A
-PR002 CP "C"
- JR NZ,PR003
- LD A,(RUNMODE)
- OR #10 ;RUN BATCH FILE
- LD (RUNMODE),A
-PR003 RET
-
-TASKX DB 0
-RUNMODE DB 0
-STEP DB 8
-MAIN_X DB 0
-
-LEN_OLD DB #00
-POSIT DB #00
-ETXS DW 0
-ETXE DW 0
-; +0 - Size buffer
-; +1 - Amount simbols
-; -1 - Scroll Window
-WINDOW DB #50
-BUFFERC DB #FF
-LEN_NEW DB #00
-CMDLINE ;DEFS #100,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
-TMPLINE DS 256
-
-BATNAME DB "system.bat",0
-
-PRMLINE DS 256
-
-BUFFER:
-
-BAT_BUFFER.size EQU 128
-BATBUFF: BLOCK BAT_BUFFER.size+1,0
-;
- OUTEND
-;
-;[End]
\ No newline at end of file
diff --git a/Console/DOS_EQU.ASM b/Console/DOS_EQU.ASM
deleted file mode 100644
index 040325b..0000000
--- a/Console/DOS_EQU.ASM
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
-VERSION EQU #00
-CHDISK EQU #01
-CURDISK EQU #02
-DSKINFO EQU #03
-G_ENTRY EQU #04
-
-BOOTDSK EQU #09
-CREATE EQU #0A
-CREAT_N EQU #0B
-ERASE EQU #0D
-DELETE EQU #0E
-MOVE EQU #0F
-RENAME EQU #10
-OPEN EQU #11
-CLOSE EQU #12
-READ EQU #13
-WRITE EQU #14
-MOVE_FP EQU #15
-ATTRIB EQU #16
-GET_D_T EQU #17
-PUT_D_T EQU #18
-F_FIRST EQU #19
-F_NEXT EQU #1A
-MKDIR EQU #1B
-RMDIR EQU #1C
-CHDIR EQU #1D
-CURDIR EQU #1E
-SYSTIME EQU #21
-SETTIME EQU #22
-
-WAITKEY EQU #30
-SCANKEY EQU #31
-ECHOKEY EQU #32
-CTRLKEY EQU #33
-EDIT EQU #34
-K_CLEAR EQU #35
-
-SETWIN EQU #38
-SETWIN1 EQU #39
-SETWIN2 EQU #3A
-SETWIN3 EQU #3B
-FREEMEM EQU #3C
-GETMEM EQU #3D
-RETMEM EQU #3E
-SETMEM EQU #3F
-
-EXEC EQU #40
-EXIT EQU #41
-WAIT EQU #42
-
-GSWITCH EQU #43
-DOSNAME EQU #44
-
-SETVMOD EQU #50
-GETVMOD EQU #51
-LOCATE EQU #52
-CURSOR EQU #53
-SELPAGE EQU #54
-SCROLL EQU #55
-CLEAR EQU #56
-RDCHAR EQU #57
-WRCHAR EQU #58
-WINCOPY EQU #59
-WINREST EQU #5A
-PUTCHAR EQU #5B
-PCHARS EQU #5C
-RES_PRN EQU #5D
-CTRLPRN EQU #5E
-PRINT EQU #5F
-*/
diff --git a/Console/Errors.TXT b/Console/Errors.TXT
deleted file mode 100644
index 45055c1..0000000
--- a/Console/Errors.TXT
+++ /dev/null
@@ -1,66 +0,0 @@
-No free file handles
-Bad Command or file name
-Access denied
-Memory allocation error
-Cannot load COMMAND, system halted
-Cannot start COMMAND, exiting
-Top level process aborted, cannot continue
-Write protect error
-Invalid unit
-Not ready
-Invalid device request
-Data error
-Invalid device request parameters
-Seek error
-Invalid media type
-Sector not found
-Printer out of paper error
-Write fault error
-Read fault error
-General failure
-Sharing violation
-Lock violation
-Invalid disk change
-FCB unavailable
-System resource exhausted
-Code page mismatch
-Out of input
-Insufficient disk space
-Too many parameters
-Required parameter missing
-Invalid switch
-Invalid keyword
-Parameter value not inallowed range
-Parameter value not allowed
-Parameter value not allowed
-Parameter format not correct
-Invalid parameter
-Invalid parameter combination
-Invalid function
-File not found
-Path not found
-Too many open files
-Access denied
-Invalid handle
-Memory control blocks destroyed
-Insufficient memory
-Invalid memory block address
-Invalid Environment
-Invalid format
-Invalid function parameter
-Invalid data
-Invalid drive specification
-Attempt to remove current directory
-Not same device
-No more files
-File exists
-Cannot make directory entry
-Fail on INT 24
-Too many redirections
-Duplicate redirection
-Invalid password
-Invalid parameter
-Network data fault
-Function not supported by network
-Required system component not installed
-
diff --git a/Console/HISTORY.TXT b/Console/HISTORY.TXT
deleted file mode 100644
index 1acb2dd..0000000
--- a/Console/HISTORY.TXT
+++ /dev/null
@@ -1,4 +0,0 @@
-21-02-2003 FIX BUG WITH LINE MERGE IN BAT-FILE
-14-12-2002 ADD BAT-PARAMETERS %1 %2
-11-12-2002 ADD BAT-VARIABLES %VAR%
-03-10-2002 FIX BUG WITH OUTPUT AT THE SCREEN IN BAT-MODE
diff --git a/Console/SYS.old b/Console/SYS.old
deleted file mode 100644
index 92cbf0e..0000000
--- a/Console/SYS.old
+++ /dev/null
@@ -1,2074 +0,0 @@
-
-;[BEGIN]
-;
-; SYSTEM.EXE /S /P
-;
-; /P Primary command processor
-; /S Secondary command processor
-; /C Execute batch file
-
-;--------------------------------------------------------------
-;Rev. Date Name Description
-;--------------------------------------------------------------
-;R05 11-12-2002 DNS IMPLEMENTED %VAR%
-;R04 11-12-2002 DNS ADD 'EVALSTRING' ROUTINE
-;R03 11-12-2002 DNS NEW VERSION
-;R02 19-11-2002 DNS CORRECT SOME ERROR MESSAGES
-;R01 19-11-2002 DNS ADD ENVIRONMENT %VARIABLE% IN ECHO
-;
-
- ORG #8100-512
- INCLUDE "dss.inc"
- INCLUDE "dos_equ.asm"
-CR EQU 13
-LF EQU 10
- 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
-
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0
-
-; DEFS 490,0
-
-; LD SP,#BFFF
-START CALL INIT
- CALL GET_CMD
- EI
- LD A,(RUNMODE)
- AND #80 ;TEST PRIMARY
- JP NZ,FPRIMAR
- LD A,(RUNMODE)
- AND #20 ;TEST SECONDARY
- JP NZ,FSECOND
- LD A,(RUNMODE)
- AND #10 ;TEST BATCH FILE
- JP NZ,FBATCHS
- LD A,(RUNMODE)
- AND #40 ;TEST PROCESS
- JP NZ,FBATCH
- JP QUIT
-
-FSECOND CALL VERS
- JP CONSOLE
-
-FBATCHS
- LD HL,CMDLINE
- CALL BATCH
- JP QUIT
-
-FBATCH
- CALL CMDMODE
- JP QUIT
-
-FPRIMAR LD C,CTRLKEY
- RST #10
- LD A,B
- AND #C0
- JP NZ,CONSOLE
- LD HL,BATNAME
- CALL BATCH
- JP CONSOLE
-
-BATCH XOR A
- LD C,OPEN
- RST #10
- RET C
- LD (BAT_FM),A
- CALL NEWLINE
- XOR A
- RET
-
-NEWLINE LD DE,CMDLINE
-ADDBAT PUSH DE
- CALL READBAT
- POP DE
- OR A
- JR NZ,BATLINE
- EX DE,HL
- LD DE,CMDLINE
- AND A
- SBC HL,DE
- RET Z
- LD A,L
- LD (CMDLINE-1),A
- CALL CMDMODE
- LD C,CLOSE
- LD A,(BAT_FM)
- RST #10
- RET
-
-BATLINE LD HL,BATBUFF
-NBLINE CALL MOVWORD
- JP C,ADDBAT
- LD A,B
- LD (BAT_LEN),A
- PUSH HL
- EX DE,HL
- LD DE,CMDLINE
- AND A
- SBC HL,DE
- LD A,L
- LD (CMDLINE-1),A
- CALL CMDMODE
- LD DE,CMDLINE
- POP HL
- JP NBLINE
-
-MOVWORD LD A,(BAT_LEN)
- LD B,A
-M00WORD LD A,(HL)
- LD (DE),A
- CP #20
- JR C,M01WORD
- INC HL
- INC DE
- DJNZ M00WORD
- SCF
- RET
-
-M01WORD LD A,(HL)
- CP #20
- RET NC
- INC HL
- DJNZ M01WORD
- RET
-
-READBAT LD HL,BATBUFF
- LD DE,128
- LD C,READ
- LD A,(BAT_FM)
- RST #10
- LD A,E
- LD (BAT_LEN),A
- RET
-
-CMDMODE XOR A
- LD (POSIT),A
- CALL EVALCMD ;R05
- LD IX,CMDLINE-2
- LD HL,CMDLINE
- LD A,(HL)
- CP "@"
- JR NZ,NOALPHA
- DEC HL
- DEC (HL)
- JR Z,NOEC
- LD C,(HL)
- INC HL
- LD B,0
- LD D,H
- LD E,L
- INC HL
- LDIR
- JR NOEC
-NOALPHA LD A,(ECHOFLG)
- OR A
- JR NZ,NOEC
- LD DE,CMDLINE
- CALL PRINT_S
- CALL CRLF
- LD A,(CMDLINE-1)
- OR A
- RET Z
- CALL CRLF
- CALL COMPBAT
- RET
-
-NOEC LD A,(CMDLINE-1)
- OR A
- RET Z
- CALL COMPBAT
- RET
-
-COMPBAT LD HL,CMDLINE
- DEC HL
- LD C,(HL)
- LD B,0
- INC HL
-COMP00B LD A,(HL)
- CP " "
- JR NZ,COMP01B
- INC HL
- DEC C
- JR NZ,COMP00B
- RET
-COMP01B LD D,H
- LD E,L
- ADD HL,BC
- LD (HL),0
- SBC HL,BC
- LD A,C
- EX AF,AF'
- LD A,#20
- CPIR
- JR NZ,COMPB05
- INC C
-COMPB05 EX AF,AF'
- SUB C
- LD C,A
- LD HL,BATLIST
- JP COMP004
-
-INIT LD A,(IX-1)
- LD (TASKX),A
- PUSH IX
- CALL CRLF
- CALL GETPATH
- POP IX
- RET
-
-CONSOLE CALL CRLF
-RE_ CALL GETXY
- CALL GETPATH
-; CALL VERS
- LD HL,CMDLINE
- LD DE,CMDLINE+1
- LD (HL),0
- LD BC,#7F
- LDIR
- CALL INPUT
- CALL CRLF
- LD A,(CMDLINE-1)
- OR A
- JP Z,RE_
- CALL CRLF
- CALL COMP
- JP RE_
-
-GETXY LD C,CURSOR
- RST #10
- JP LOCAT
-
-INPUT XOR A
- LD (POSIT),A
- LD (SHIFT),A
- LD (LEN_NEW),A
- LD IX,CMDLINE-2
- CALL CEDIT
- CALL RES_CUR
- RET
-
-COMP
- CALL EVALCMD ;R05
- LD HL,CMDLINE
- DEC HL
- LD C,(HL)
- LD B,0
- INC HL
-COMP00 LD A,(HL)
- CP " "
- JR NZ,COMP01
- INC HL
- DEC C
- JR NZ,COMP00
- RET
-COMP01 LD D,H
- LD E,L
- ADD HL,BC
- LD (HL),0
- SBC HL,BC
- LD A,C
- EX AF,AF'
- LD A,#20
- CPIR
- JR NZ,COMP005
- INC C
-COMP005 EX AF,AF'
- SUB C
- LD C,A
- LD HL,CMDLIST
-COMP004 PUSH BC
- PUSH DE
-COMP000 LD A,(DE)
- CP #61
- JP C,COMP001
- CP #7B
- JP NC,COMP001
- SUB #20
-COMP001 CP (HL)
- JP NZ,COMP002
- INC HL
- INC DE
- DEC C
- JP NZ,COMP000
- XOR A
- CP (HL)
- JP NZ,COMP002
- POP BC
- POP BC
- LD A,(DE)
- CP " "
- JR NZ,NOSPC
- INC DE
-NOSPC INC HL
- LD A,(HL)
- INC HL
- LD H,(HL)
- LD L,A
- JP (HL)
-
-COMP002 XOR A
- LD C,#FF
- CPI
- JP NZ,$-2
- INC HL
- INC HL
- POP DE
- POP BC
- LD A,(HL)
- OR A
- JP NZ,COMP004
- LD H,D ;CMDLINE
- LD L,E
- LD B,(HL)
- INC HL
- LD C,(HL)
- INC HL
- LD A,(HL)
- OR A
- JR NZ,RUN_EXT
- LD A,":"
- CP C
- JR NZ,RUN_EXT
- LD A,B
- CP "a"
- JR C,NOUP
- CP "{"
- JR NC,NOUP
- AND #5F
-NOUP SUB "A"
- LD C,CHDISK
- RST #10
- JP C,ERROR
- JP GETPATH
-
-SAVEHL DW 0
-
-RUN_EXT EX DE,HL
- LD (SAVEHL),HL
- LD BC,#0445
- LD DE,EXTBF
- RST #10
- LD HL,(SAVEHL)
- JR C,RUN_EXE
- BIT 1,A
- JR Z,NON_EXT
- LD DE,EXTBF
- LD HL,BATBF
- LD B,3
- CALL COMPARE
- LD HL,(SAVEHL)
- JR Z,RUN_BAT
- JP RUN_EXE
-
-NON_EXT LD BC,0+EXEC
- RST #10
- RET NC
- LD HL,(SAVEHL)
- CP 3
- JP NZ,EXEERR
- PUSH HL
- LD A,(CMDLINE-1)
- LD B,A
-EXF000 LD A,(HL)
- CP "!"
- JR C,EXF001
- INC HL
- DJNZ EXF000
-
-EXF001
- LD E,B
- LD D,0
- ADD HL,DE
- PUSH HL
- LD E,4
- ADD HL,DE
- POP DE
- EX DE,HL
- LD C,B
- LD B,0
- INC C
- LDDR
- INC HL
- LD (HL),"."
- INC HL
- LD (HL),"B"
- INC HL
- LD (HL),"A"
- INC HL
- LD (HL),"T"
-; LD HL,(SAVEHL)
- POP HL
- JP RUN_BAT
-
-RUN_EXE LD B,0
- LD C,EXEC
- RST #10
- RET NC
-EXEERR CP 5
- JP NC,ERROR
- LD DE,0 ;BAD COMMAND OR FILENAME
- JP ERR_MSG
-
-RUN_BAT CALL BATCH
- JP C,EXEERR
- RET
-
-BATLIST DB "PAUSE",0
- DW CPAUSE
- DB "REM",0
- DW CREM
-CMDLIST DB "CD",0
- DW CCHDIR
- DB "CHDIR",0
- DW CCHDIR
- DB "CLS",0
- DW CLS
- DB "DATE",0
- DW CDATE
- DB "DEL",0
- DW CDELET
- DB "DIR",0
- DW DIR
- DB "ECHO",0
- DW CECHO
- DB "ERASE",0
- DW CDELET
- DB "EXIT",0
- DW CEXIT
- DB "HELP",0
- DW HELP
- DB "MD",0
- DW CMKDIR
- DB "MKDIR",0
- DW CMKDIR
- DB "REN",0
- DW CRENAM
- DB "RENAME",0
- DW CRENAM
- DB "RD",0
- DW CRMDIR
- DB "RMDIR",0
- DW CRMDIR
- DB "SET",0
- DW CSET
- DB "TIME",0
- DW CTIME
- DB "VERSION",0
- DW VERS
- DB "VER",0
- DW VERS
- DB #00
-
-CLS LD DE,#0000
- LD HL,#2050
- LD BC,#0700+CLEAR
- LD A," "
- RST #10
- LD DE,#0000
- JP LOCAT
-
-CRLF LD A,#0D
- CALL PRINTX
- LD A,#0A
- JP PRINTX
-
-CDATE EX DE,HL
- LD DE,DTA
- LD C,GSWITCH
- RST #10
- LD DE,DTA
- LD A,(DE)
- OR A
- JR Z,NOSETD
- CALL STR2DEC
- JR C,ILLEG
- XOR A
- CP H
- JR NZ,ILLEG
- LD A,31
- CP L
- JR C,ILLEG
- LD B,L
- PUSH BC
- CALL STR2DEC
- POP BC
- JR C,ILLEG
- XOR A
- CP H
- JR NZ,ILLEG
- LD A,12
- CP L
- JR C,ILLEG
- LD C,L
- PUSH BC
- CALL STR2DEC
- PUSH HL
- LD C,SYSTIME
- RST #10
- POP IX
- POP DE
- LD C,SETTIME
- RST #10
-NOSETD LD C,SYSTIME
- RST #10
- PUSH IX
- PUSH DE
- LD A,D
- LD HL,PRM1
- CALL PUTB
- LD A,"-"
- LD (HL),A
- INC HL
- POP DE
- LD A,E
- CALL PUTB
- LD A,"-"
- LD (HL),A
- INC HL
- PUSH HL
- POP IX
- POP HL
- CALL PDIGIT
- LD DE,DATEMSG
- JP MESSAGE
-
-ILLEG LD DE,ILLGMSG
- CALL MESSAGE
- RET
-
-CTIME EX DE,HL
- LD DE,DTA
- LD C,GSWITCH
- RST #10
- LD DE,DTA
- LD A,(DE)
- OR A
- JR Z,NOSETT
- CALL STR2DEC
- JR C,ILLEG
- XOR A
- CP H
- JR NZ,ILLEG
- LD A,23
- CP L
- JR C,ILLEG
- LD B,L
- PUSH BC
- CALL STR2DEC
- POP BC
- JR C,ILLEG
- XOR A
- CP H
- JR NZ,ILLEG
- LD A,59
- CP L
- JR C,ILLEG
- LD C,L
- PUSH BC
- CALL STR2DEC
- POP BC
- JR C,ILLEG
- XOR A
- CP H
- JR NZ,ILLEG
- LD A,59
- CP L
- JR C,ILLEG
- PUSH BC
- LD A,L
- PUSH AF
- LD C,SYSTIME
- RST #10
- POP BC
- POP HL
- LD C,SETTIME
- RST #10
-NOSETT LD C,SYSTIME
- RST #10
- PUSH BC
- PUSH HL
- LD A,H
- LD HL,PRM1
- CALL PUTB
- LD A,":"
- LD (HL),A
- INC HL
- POP DE
- LD A,E
- CALL PUTB
- LD A,":"
- LD (HL),A
- INC HL
- POP AF
- CALL PUTB
- XOR A
- LD (HL),A
- LD DE,TIMEMSG
- JP MESSAGE
-
-CPAUSE LD DE,PAUSMSG
- CALL MESSAGE
- LD C,WAITKEY
- RST #10
- RET
-
-
-CSET LD A,(DE)
- OR A
- JP Z,PRNENVIR
- EX DE,HL
- LD BC,#0200+DSS_ENVIRON
- RST #10
- CALL C,ERROR
- RET
-
-PRNENVIR
- LD HL,DTA
- LD BC,#0000+DSS_ENVIRON
- RST #10
- LD HL,DTA
-PRNENVX LD C,DSS_PCHARS
- RST #10
- LD A,CR
- LD C,DSS_PUTCHAR
- RST #10
- LD A,LF
- LD C,DSS_PUTCHAR
- RST #10
- LD A,(HL)
- OR A
- JR NZ,PRNENVX
- RET
-
-
-CECHO EX DE,HL
- LD A,(HL)
- OR A
- JR Z,ECHO_F
- EX DE,HL
- PUSH DE
- LD B,3
- LD HL,ECHOON
- CALL COMPARE
- POP DE
- JR Z,ECHO_FS
- PUSH DE
- LD B,4
- LD HL,ECHOOFF
- CALL COMPARE
- POP HL
- JR Z,ECHO_FR
-
-;R03 REMOVE R01
-
- LD C,PCHARS
- RST #10
- JP CRLF
-
-ECHO_F LD A,(ECHOFLG)
- OR A
- LD DE,ON__MSG
- JR Z,ECHON
- LD DE,OFF_MSG
-ECHON CALL FMESAGE
- LD DE,PRM1
- CALL PUTPRM
- LD DE,ECHOMSG
- CALL MESSAGE
- RET
-
-ECHO_FS XOR A
- LD (ECHOFLG),A
- RET
-
-ECHO_FR LD A,#FF
- LD (ECHOFLG),A
- RET
-
-;R04
-
-EVALCMD
- XOR A
- LD HL,CMDLINE-1
- LD C,(HL)
- LD B,A
- INC HL
- ADD HL,BC
- LD (HL),A
- SBC HL,BC
- LD DE,TMPLINE
- CALL EVALSTR
- LD HL,TMPLINE
- LD DE,CMDLINE
- LD BC,#00FF
-MOVLBAK LD A,(HL)
- LDI
- INC B
- OR A
- JR NZ,MOVLBAK
- DEC B
- LD A,B
- LD (CMDLINE-1),A
- AND A
- RET
-
-; HL - STRING WITH %VAR%
-
-EVALSTR
-;R04 LD DE,DTA
-VARLOOP
- LD A,(HL)
- CP "%"
- JR Z,TVARIABLE
-VARL1 LDI
- OR A
- JR NZ,VARLOOP
- LD BC,0
- LD (TVAR_PNT),BC
-;R04 LD HL,DTA
-;R04
- RET
-
-
-;R01
-TVAR_PNT
- DW 0
-
-TVARIABLE
- LD BC,(TVAR_PNT)
- LD A,B
- OR C
- LD A,"%"
- LD (TVAR_PNT),DE
- JR Z,VARL1
- PUSH HL
- LD H,D
- LD L,E
- DEC HL
- AND A
- SBC HL,BC
- JR Z,TNOVAR
- LD A,"="
- LD (DE),A
- INC DE
- XOR A
- LD (DE),A
- LD D,B
- LD E,C
- LD H,B
- LD L,C
- INC HL
- LD BC,#0100+DSS_ENVIRON
- RST #10
-TNOVAR POP HL
- INC HL
- LD BC,0
- LD (TVAR_PNT),BC
- JP VARLOOP
-;R01
-
-COMPARE LD A,(DE)
- CP #61
- JP C,COM001
- CP #7B
- JP NC,COM001
- SUB #20
-COM001 CP (HL)
- RET NZ
- INC HL
- INC DE
- DJNZ COMPARE
- RET
-
-CREM RET
-
-CCHDIR EX DE,HL
- LD DE,DTA
- LD C,GSWITCH
- RST #10
- XOR A
- LD HL,DTA
- CP (HL)
- JR NZ,YP
- LD (HL),"."
- INC HL
- LD (HL),"."
- INC HL
- LD (HL),0
- DEC HL
- DEC HL
-YP LD C,CHDIR
- RST #10
- CALL C,ERROR
- CALL GETPATH
- RET
-
-CMKDIR EX DE,HL
- LD DE,DTA
- LD C,GSWITCH
- RST #10
- LD HL,DTA
- LD C,MKDIR
- RST #10
- CALL C,ERROR
- RET
-
-CRMDIR EX DE,HL
- LD DE,DTA
- LD C,GSWITCH
- RST #10
- LD HL,DTA
- LD C,RMDIR
- RST #10
- CALL C,ERROR
- RET
-
-CDELET EX DE,HL
- LD DE,DTA
- LD C,GSWITCH
- RST #10
- LD HL,DTA
- LD C,DELETE
- RST #10
- CALL C,ERROR
- RET
-
-CRENAM EX DE,HL
- LD DE,DTA
- LD C,GSWITCH
- RST #10
- LD DE,DTA+128
- LD C,GSWITCH
- RST #10
- LD HL,DTA
- LD DE,DTA+128
- LD C,RENAME
- RST #10
- CALL C,ERROR
- RET
-
-ERROR LD E,A
- LD D,0
- JP ERR_MSG
-
-DIR LD HL,0
- LD (FILES),HL
- LD (S_LOW),HL
- LD (S_HIGH),HL
- EX DE,HL
- LD A,(HL)
- OR A
- JR NZ,YPS
- LD HL,ALLFS
-YPS LD DE,DTA
- LD C,GSWITCH
- RST #10
- LD HL,DTA
- LD DE,DTA
- LD A,#37
- LD BC,#0000+F_FIRST
- RST #10
- JP C,ERROR
- LD A,(PATHF)
- LD (PRM1+0),A
- LD A,":"
- LD (PRM1+1),A
- LD A,0
- LD (PRM1+2),A
- LD HL,SER_NUM
- LD DE,PRM2
- CALL PUTPRM
- CALL GETPATH
- LD HL,PATHF
- LD DE,PRM3
- CALL PUTPRM
- LD DE,DIR1MSG
- CALL MESSAGE
-; CALL CRLF
-; CALL CRLF
-DIRNEX LD HL,DTA
- LD DE,33
- ADD HL,DE
- CALL PNAME
- LD IX,DTA
- LD A,(IX+32)
- AND #10
- JP NZ,NODADD
- LD HL,(FILES)
- INC HL
- LD (FILES),HL
- LD E,(IX+30)
- LD D,(IX+31)
- LD HL,(S_HIGH)
- EXX
- LD E,(IX+28)
- LD D,(IX+29)
- LD HL,(S_LOW)
- CALL ADDXXX
- LD (S_LOW),HL
- EXX
- LD (S_HIGH),HL
-NODADD LD DE,DTA
- LD C,F_NEXT
- RST #10
- JR NC,DIRNEX
- CALL ORDERS
- RET
-
-ORDERS LD HL,(FILES)
- LD IX,PRM1
- CALL PDIGIT
- LD HL,(S_LOW)
- EXX
- LD HL,(S_HIGH)
- EXX
- CALL MAKE_LN
- LD HL,L32BIT_+9
- LD A,(HL)
- CP #20
- JR NZ,ALR2
- LD A,#30
- LD (HL),A
-ALR2 LD DE,SIZEBFF
- LD HL,L32BIT_;; +1
- LD A,(HL)
- LDI
- CP " "
- JR Z,NOPO1
- LD A,"."
-NOPO1 LD (DE),A
- INC DE
- LDI
- LDI
- LD A,(HL)
- LDI
- CP " "
- JR Z,NOPO2
- LD A,"."
-NOPO2 LD (DE),A
- INC DE
- LDI
- LDI
- LD A,(HL)
- LDI
- CP " "
- JR Z,NOPO3
- LD A,"."
-NOPO3 LD (DE),A
- INC DE
- LDI
- LDI
- LDI
- LD HL,SIZEBFF
- LD DE,PRM2
- CALL PUTPRM
- LD DE,DIR2MSG
- JP MESSAGE
-
-;HL':HL + DE':DE
-
-ADDXXX ADD HL,DE
- EXX
- ADC HL,DE
- EXX
- RET
-
-FILES DW 0
-
-S_LOW DW 0
-S_HIGH DW 0
-
-;12345678 123 1 234 567 890 "
-; SIZE
-
-PNAME LD BC,8
- LD DE,PRM1
- LDIR
- XOR A
- LD (DE),A
- LD DE,PRM2
- LDI
- LDI
- LDI
- LD (DE),A
- LD IX,DTA
- CALL PRNSIZE
- CALL PRNDATE
- CALL PRNTIME
- LD DE,DIR3MSG
- JP MESSAGE
-
-PRINTB LD A,(HL)
- PUSH BC
- CALL PRINTX
- POP BC
- INC HL
- DJNZ PRINTB
- RET
-;------------------
-
-PUTB LD C,#2F
-PUTB1 INC C
- SUB 10
- JP NC,PUTB1
- ADD A,10
- ADD A,#30
- PUSH AF
- LD A,C
- LD (HL),A
- INC HL
- POP AF
- LD (HL),A
- INC HL
- RET
-
-
-PRNB LD C,#2F
-PRNB1 INC C
- SUB 10
- JP NC,PRNB1
- ADD A,10
- ADD A,#30
- PUSH AF
- LD A,C
- CALL PRINTX
- POP AF
- JP PRINTX
-
-STR2DEC LD HL,0
-STRLOOP LD A,(DE)
- INC DE
- OR A
- RET Z
- CP "-"
- RET Z
- CP ":"
- RET Z
- LD B,H
- LD C,L
- ADD HL,HL
- ADD HL,HL
- ADD HL,BC
- ADD HL,HL
- CALL ATODEC
- RET C
- ADD A,L
- LD L,A
- JR NC,STRLOOP
- INC H
- JR STRLOOP
-
-ATODEC CP "0"
- RET C
- CP ":"
- CCF
- RET C
- SUB "0"
- RET
-
-PDIGIT LD DE,10000
- LD A,#C8
- LD (RET_Z),A
- CALL DIG
- LD DE,1000
- CALL DIG
- LD DE,100
- CALL DIG
- LD DE,10
- CALL DIG
- LD A,L
- ADD A,#30
- LD (IX+0),A
- INC IX
- LD (IX+0),0
- RET
-
-DIG XOR A
-DIG1 INC A
- SBC HL,DE
- JR NC,DIG1
- ADD HL,DE
- DEC A
-RET_Z RET Z
- ADD A,#30
- LD (IX+0),A
- INC IX
- LD A,0
- LD (RET_Z),A
- RET
-
-PRNSIZE LD A,(IX+32)
- LD HL,DIRIDD
- AND #10
- JP NZ,PRZ
- LD L,(IX+28)
- LD H,(IX+29)
- EXX
- LD L,(IX+30)
- LD H,(IX+31)
- EXX
- PUSH IX
- CALL MAKE_LN
- LD HL,L32BIT_+9
- LD A,(HL)
- CP #20
- JR NZ,ALR
- LD A,#30
- LD (HL),A
-ALR LD DE,SIZEBFF
- LD HL,L32BIT_;; +1
- LDI
- LD A," "
- LD (DE),A
- INC DE
- LDI
- LDI
- LDI
- LD (DE),A
- INC DE
- LDI
- LDI
- LDI
- LD (DE),A
- INC DE
- LDI
- LDI
- LDI
- LD HL,SIZEBFF
- POP IX
-PRZ LD DE,PRM3
- JP PUTPRM
-
-PRNDATE LD B,(IX+25)
- LD C,(IX+24)
- LD HL,SIZEBFF
- CALL DATE
- LD (HL),0
- LD HL,SIZEBFF
- LD DE,PRM4
- LD A,(HL)
- CP "0"
- JP NZ,PUTPRM
- LD (HL),#20
- JP PUTPRM
-
-PRNTIME LD B,(IX+22)
- LD C,(IX+23)
- LD HL,SIZEBFF
- CALL TIME
- LD (HL),0
- LD HL,SIZEBFF
- LD DE,PRM5
- LD A,(HL)
- CP "0"
- JP NZ,PUTPRM
- LD (HL),#20
- JP PUTPRM
-
-TIME
- SRL C
- RR B
- SRL C
- RR B
- SRL C
- RR B
- SRL B
- SRL B
- LD A,C
- CALL NUMB
- LD (HL),":"
- INC HL
- LD A,B
- JP NUMB
-
-DATE
- LD A,C
- AND #1F
- PUSH BC
- CALL NUMB
- LD (HL),"."
- INC HL
- POP BC
- LD A,C
- SRL B
- RLA
- RLA
- RLA
- RLA
- AND #0F
- CALL NUMB
- LD (HL),"."
- INC HL
- LD A,B
- ADD A,#50
- CP 100
- JP C,NUMB
-SUB100 SUB 100
- CP 100
- JP C,NUMB
- JR SUB100
-
-NUMB LD C,#2F
-NUMB1 INC C
- SUB 10
- JP NC,NUMB1
- ADD A,10
- ADD A,#30
- LD (HL),C
- INC HL
- LD (HL),A
- INC HL
- RET
-
-MAKE_LN LD IX,L32BIT_
- EXX
- LD DE,#3B9A ; 1000000000
- EXX
- LD DE,#CA00
- CALL GET_DIG
- EXX
- LD DE,#05F5 ; 100000000
- EXX
- LD DE,#E100
- CALL GET_DIG
- EXX
- LD DE,#0098 ; 10000000
- EXX
- LD DE,#9680
- CALL GET_DIG
- EXX
- LD DE,#000F ; 1000000
- EXX
- LD DE,#4240
- CALL GET_DIG
- EXX
- LD DE,#0001 ; 100000
- EXX
- LD DE,#86A0
- CALL GET_DIG
- EXX
- LD DE,#0000 ; 10000
- EXX
- LD DE,#2710
- CALL GET_DIG
- EXX
- LD DE,#0000 ; 1000
- EXX
- LD DE,#03E8
- CALL GET_DIG
- EXX
- LD DE,#0000 ; 100
- EXX
- LD DE,#0064
- CALL GET_DIG
- EXX
- LD DE,#0000 ; 10
- EXX
- LD DE,#000A
- CALL GET_DIG
- LD A,L ; 1
- ADD A,#30
- LD (IX+0),A
- INC IX
- LD HL,L32BIT_
- LD DE,#2030
-KILLZ LD A,(HL)
- CP E
- JR NZ,KILLZ2
- LD (HL),D
- INC HL
- JP KILLZ
-KILLZ2 LD HL,L32BIT_+9
- LD A,(HL)
- CP D
- RET NZ
- LD (HL),E
- RET
-
-; HL:HL - DE:DE
-
-GET_DIG XOR A
-INC_DG INC A
- SBC HL,DE
- EXX
- SBC HL,DE
- EXX
- JP NC,INC_DG
- ADD HL,DE
- EXX
- ADC HL,DE
- EXX
- DEC A
- ADD A,#30
- LD (IX+0),A
- INC IX
- RET
-
-L32BIT_ DB "0000000000"
-
-DIRIDD DB " ",0
-
-SIZEBFF DB "0 000 000 000",0,0
-
-;-------------------
-
-VERS LD C,VERSION
- RST #10
- LD A,D
- LD HL,PRM1
- CALL GETDC
- LD A,"."
- LD (HL),A
- INC HL
- LD A,E
- CALL GETDD
- XOR A
- LD (HL),A
- LD DE,VERSMSG
- JP MESSAGE
-
-GETDC LD B,#2F
-GETDA INC B
- SUB 10
- JR NC,GETDA
- ADD A,10+"0"
- LD C,A
- LD A,"0"
- CP B
- LD A,C
- JR Z,MDEC
- LD (HL),B
- INC HL
-MDEC LD (HL),A
- INC HL
- RET
-
-GETDD LD B,#2F
-GETDB INC B
- SUB 10
- JR NC,GETDB
- ADD A,10
- LD (HL),B
- INC HL
- RET Z
- ADD A,"0"
- LD (HL),A
- INC HL
- RET
-
-HELP LD DE,HELPMSG
- CALL MESSAGE
- RET
-
-CEXIT LD A,(TASKX)
- DEC A
- DEC A
- RET Z
- POP HL
-QUIT LD B,0
- LD C,EXIT
- RST #10
- RET
-
-ERR_MSG INC DE
- LD HL,ERR0
- LD BC,ERR1-ERR0
- CALL LCPIR
- CALL PRINTZ
- CALL CRLF
- JP CRLF
-
-MESSAGE CALL FMESAGE
- CALL PRINTZ
- CALL GETXY
- RET
-
-FMESAGE INC DE
- LD HL,MSG0
- LD BC,MSG1-MSG0
-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,PCHARS
- RST #10
- POP HL
- JR PRINTZ
-PRINTZ2 LD C,PUTCHAR
- RST #10
- JP PRINTZ
-
-ROOT DB "C:",#5C,0
-
-ALLFS DB "*.*",0
-
-SER_NUM DB "C37F-73AB",0
-
-EXTBF DS 4
-
-BATBF DB "BAT"
-
-ECHOON DB "ON",0
-ECHOOFF DB "OFF",0
-
-
-DIR1MSG EQU 0
-VERSMSG EQU 1
-DATEMSG EQU 2
-TIMEMSG EQU 3
-PAUSMSG EQU 4
-ILLGMSG EQU 5
-ECHOMSG EQU 6
-ON__MSG EQU 7
-OFF_MSG EQU 8
-DIR2MSG EQU 9
-DIR3MSG EQU 10
-HELPMSG EQU 11
-
-MSG0 DB 0
- DB "Volume in drive %1 has no label",CR,LF
- DB "Volume Serial number is %2",CR,LF
- DB "Directory of %3",CR,LF,CR,LF,0
- DB "Estex DSS: Version %1",CR,LF,0 ;R02
- DB "Current date: %1",CR,LF,0
- DB "Current time: %1",CR,LF,0
- DB "Press any key to continue . . .",CR,LF,0
- DB "Invalid parametr",CR,LF,0
- DB "Echo is %1",CR,LF,0
- DB "on",0
- DB "off",0
- DB " %1 file(s) %2 bytes",CR,LF,CR,LF,0
-; FILENAME EXT SIZE DATE TIME
- DB "%1 %2 %3 %4 %5",CR,LF,0
- DB "COMMANDS:",CR,LF,CR,LF
- DB "CD DEL HELP REN TIME "
- DB " ",CR,LF
- DB "CHDIR DIR MD RENAME VER "
- DB " ",CR,LF
- DB "CLS ERASE MKDIR RMDIR VERSION "
- DB " ",CR,LF
- DB "DATE EXIT RD SET "
- DB " ",CR,LF
- DB 0
-MSG1
-
-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 ;R02
- DB "Directory exist",0
- DB "Invalid filename",0
- DB "Invalid EXE-file",0
- DB "Not supported EXE-file",0
- DB "Access denied",0
- DB "Not ready",0
- DB "Seek error",0
- DB "Sector not found",0
- DB "CRC error",0
- DB "Write protect",0
- DB "Read error",0
- DB "Write error",0
- DB "Drive failure",0
- DB "Extended error 28",0
- DB "Extended error 29",0
- DB "No free memory",0
- DB "Invalid memory block",0
- DB "Extended error 32",0
- DB "Extended error 33",0
- DB "Extended error 34",0
- DB "35",0
- DB "36",0
- DB "37",0
- DB "38",0
- DB "39",0
- DB "40",0
- DB "41",0
- DB "42",0
- DB "43",0
- DB "44",0
- DB "45",0
- DB "46",0
- DB "47",0
- DB "48",0
- DB "49",0
- DB "50"
- DB 0
-ERR1
-
-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
-
-DTA ;DEFS 256,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
-PATHF ;DEFS 256,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
-BAT_FM DB 0
-BAT_LEN DB 0
-
-ECHOFLG DB 0
-
-PATHLEN DB 0
-PATH ;DEFS 40,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0
-
-GETPATH LD C,2
- RST #10
- LD HL,PATHF
- ADD A,"A"
- LD (HL),A
- INC HL
- LD (HL),":"
- INC HL
- LD C,30
- RST #10
- LD HL,PATHF
- LD DE,PATH
- LDI
- LDI
- LDI
- PUSH HL
- XOR A
- LD BC,34
- CPIR
- JP NZ,LONGP
- LD A,34
- SUB C
- LD C,A
- POP HL
- LDIR
- JR PHLEN
-
-LONGP CPIR
- LD A,"."
- LD (DE),A
- INC DE
- LD (DE),A
- INC DE
- LD (DE),A
- INC DE
- LD BC,31
- AND A
- SBC HL,BC
- LDIR
- POP HL
-PHLEN LD HL,PATH
- LD BC,40
- XOR A
- CPIR
- LD A,39
- SUB C
- LD (PATHLEN),A
- LD C,A
- INC C
- INC C
- LD A,80
- SUB C
- LD (WINDOW),A
- RET
-PRINT_B LD C,A
-PRINTBB PUSH BC
- CALL PRINTX
- POP BC
- LD A,C
- DJNZ PRINTBB
- RET
-
-TEMPXY DW 0
-
-CR_ LD C,CURSOR
- RST #10
- LD E,0
- JP LOCAT
-
-LF_ LD C,CURSOR
- RST #10
- LD A,D
- CP #1F
- JP Z,LFF
- INC D
- JP LOCAT
-
-LFF PUSH HL
- PUSH DE
- LD BC,#018A
- LD DE,#0020
- EI
- HALT
- DI
- RST ToBIOS
- LD DE,#1F00
- CALL LOCAT
- LD A,#20
- LD BC,#5082
- RST ToBIOS
- EI
- POP DE
- CALL LOCAT
- POP HL
- RET
-
-PRINTX CP #20
- JP NC,CHAR
- CP #0D
- JP Z,CR_
- CP #0A
- JP Z,LF_
-CHAR PUSH BC
- LD BC,#0182
- RST ToBIOS
- POP BC
- RET
-
-LOCAT LD (TEMPXY),DE
- LD C,LOCATE
- RST #10
- RET
-
-;PRINTX LD C,PUTCHAR
-; RST #10
-; RET
-
-CEDIT PUSH IX
- POP HL
- INC HL
- INC HL
- LD (ETXS),HL
- XOR A
- LD (POSIT),A
- LD (SHIFT),A
-EDIT1 LD DE,(ETXS)
- CALL PRINT_S
- CALL KEY
- CP 13
- RET Z
- LD HL,EDIT1
- PUSH HL
- AND A
- LD HL,#5400
- SBC HL,DE
- JP Z,BACK
- AND A
- LD HL,#5600
- SBC HL,DE
- JP Z,FORW
- CP #08
- JP Z,DELET
- CP #20
- RET C
- EX AF,AF'
- LD A,(IX+1)
- CP (IX+0)
- CCF
- RET C
- LD A,(IX+1)
- LD E,A
- LD D,0
- LD HL,(ETXS)
- ADD HL,DE
- LD A,(POSIT)
- LD E,A
- LD A,(IX+1)
- SUB E
- JR Z,ADD_SM
- LD B,D
- LD C,A
- LD D,H
- LD E,L
- DEC HL
- LDDR
- EX DE,HL
-ADD_SM EX AF,AF'
- LD (HL),A
- LD A,(POSIT)
- INC A
- LD (POSIT),A
- LD (MAIN_X),A
- INC (IX+1)
- LD HL,(ETXE)
- INC HL
- LD (ETXE),HL
- LD HL,SHIFT
- SUB (HL)
- CP (IX-1)
- RET C
- LD A,(STEP)
- ADD A,(HL)
- LD (HL),A
-; CALL PAGE
- RET
-
-BACK LD A,(POSIT)
- OR A
- RET Z ;JP Z,BCK
- DEC A
- LD (POSIT),A
- LD (MAIN_X),A
- INC A
- LD HL,SHIFT
- SUB (HL)
- RET NZ
- LD A,(STEP)
- LD E,A
- LD A,(HL)
- SUB E
- LD (HL),A
-; CALL PAGE
- RET
-
-FORW LD A,(POSIT)
- CP (IX+1)
- RET Z ; JP Z,FRD
- INC A
- LD (POSIT),A
- LD (MAIN_X),A
- LD HL,SHIFT
- SUB (HL)
- CP (IX-1)
- RET C
- LD A,(STEP)
- ADD A,(HL)
- LD (HL),A
-; CALL PAGE
- RET
-
-DELET LD A,(POSIT)
- OR A
- RET Z ; JP Z,LINKSTR
- LD HL,(ETXS)
- LD E,A
- LD D,0
- ADD HL,DE
- LD A,(IX+1)
- SUB E
- JR Z,SUB_SM
- LD B,D
- LD C,A
- LD D,H
- LD E,L
- DEC DE
- LDIR
-SUB_SM XOR A
- DEC HL
- LD (HL),A
- LD A,(POSIT)
- DEC A
- LD (POSIT),A
- LD (MAIN_X),A
- DEC (IX+1)
- LD HL,(ETXE)
- DEC HL
- LD (ETXE),HL
- LD HL,SHIFT
- INC A
- SUB (HL)
- RET NZ
- LD A,(STEP)
- LD E,A
- LD A,(HL)
- SUB E
- LD (HL),A
-; CALL PAGE
- RET
-
-KEY ;RES 5,(IY+1)
- LD A,(SHIFT)
- LD E,A
- LD A,(POSIT)
- SUB E
- INC A
- LD HL,PATHLEN
- ADD A,(HL)
- LD (_X+1),A
- LD A,(POSIT)
- CP (IX+1)
- JP C,KEY0
- LD A,#20
- LD (_A+1),A
- JP KEY1
-KEY0 LD E,A
- LD D,0
- LD HL,(ETXS)
- ADD HL,DE
- LD A,(HL)
- LD (_A+1),A
-KEY1 CALL CURSORF
- EI
- HALT
- LD C,SCANKEY
- RST #10
- JP Z,KEY1
- RET
-
-CURSORX DB #00
-
-CURSORF LD A,05
- DEC A
- LD (CURSORF+1),A
- RET NZ
- LD A,05
- LD (CURSORF+1),A
- LD DE,(TEMPXY)
-_X LD E,#00
- CALL LOCAT
- LD A,(CURSORX)
- XOR #FF
- LD (CURSORX),A
- LD A,"_"
- JR NZ,YEPCUR
-_A LD A,#20
-YEPCUR CALL PRINTX
- EI
- RET
-
-RES_CUR LD A,(CURSORX)
- OR A
- RET Z
- XOR #FF
- LD (CURSORX),A
- LD DE,(TEMPXY)
- LD A,(_X+1)
- LD E,A
- CALL LOCAT
- LD A,(_A+1)
- JP PRINTX
-
-PRINT_S PUSH DE
- CALL GETXY ;;;
- LD DE,(TEMPXY)
- LD E,0
- CALL LOCAT
- LD HL,PATH
- CALL PRINTZ
- LD A,">"
- CALL PRINTX
- POP DE
- EX DE,HL
-SH LD BC,#0000
- ADD HL,BC
- LD A,(SHIFT)
- LD C,A
- LD A,(IX+1)
- SUB C
- JP Z,EMT_STR
- LD B,A
- LD A,(IX-1)
- SUB B
- JR NC,PR_S
- LD B,(IX-1)
-PR_S PUSH BC
- LD C,#86
- RST ToBIOS
- POP BC
-EMT_STR LD A,(IX-1)
- SUB B
- EI
- RET Z
- LD B,A
- LD C,#82
- LD A,#20
- RST ToBIOS
- EI
- RET
-
-SHIFT EQU SH+1
-
-GET_CMD LD D,XH
- LD E,XL
- EX DE,HL
- LD E,(HL)
- INC HL
- LD D,0
- EX DE,HL
- ADD HL,DE
- LD (HL),0
-NEXTPRM EX DE,HL
-SKIPSP LD A,(HL)
- INC HL
- CP " "
- RET C
- JR Z,SKIPSP
- DEC HL
- CP "/"
- JR NZ,PROCESS
- LD DE,BUFFER
- LD C,GSWITCH
- RST #10
- PUSH AF
- EX DE,HL ;SAVE HL IN DE
- LD HL,BUFFER
- INC HL
- CALL ISWITCH
- POP AF
- JP NC,NEXTPRM
- XOR A
- RET
-
-PROCESS LD DE,CMDLINE
- LD BC,#00FF
-NLDI LD A,(HL)
- LDI
- INC B
- CP " "
- JR NC,NLDI
- DEC B
- LD A,B
- LD (CMDLINE-1),A
- LD A,(RUNMODE)
- OR #40 ;PROCESS
- LD (RUNMODE),A
- XOR A
- RET
-
-ISWITCH LD A,(HL)
- CP "a"
- JR C,NUP
- CP "{"
- JR NC,NUP
- SUB #20
-NUP
-PR000 CP "P"
- JR NZ,PR001
- LD A,(RUNMODE)
- OR #80 ;PRIMARY CONSOLE
- LD (RUNMODE),A
- RET
-PR001 CP "S"
- JR NZ,PR002
- LD A,(RUNMODE)
- OR #20 ;SECONDARY CONSOLE
- LD (RUNMODE),A
-PR002 CP "C"
- JR NZ,PR003
- LD A,(RUNMODE)
- OR #10 ;RUN BATCH FILE
- LD (RUNMODE),A
-PR003 RET
-
-TASKX DB 0
-RUNMODE DB 0
-STEP DB 8
-MAIN_X DB 0
-
-LEN_OLD DB #00
-POSIT DB #00
-ETXS DW 0
-ETXE DW 0
-; +0 - Size buffer
-; +1 - Amount simbols
-; -1 - Scroll Window
-WINDOW DB #50
-BUFFERC DB #FF
-LEN_NEW DB #00
-CMDLINE ;DEFS #100,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
-TMPLINE DS 256
-
-BATNAME DB "system.bat",0
-
-BUFFER
-BATBUFF ;DEFS 129,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0
diff --git a/DSS/API.asm b/DSS/API.asm
new file mode 100644
index 0000000..d24b0a1
--- /dev/null
+++ b/DSS/API.asm
@@ -0,0 +1,211 @@
+
+;[BEGIN]
+;//MODULE: DOS_X
+;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
+;//UPDATE: 24-10-1999 DNS Restore module
+;---------------------------------------------------------------
+;Rev Date Name Description
+;---------------------------------------------------------------
+;R011 17-04-2023 BAO Временный костыль для недопускания переполнения буфера пути каталога
+;R010 15-04-2023 BAO FIXED BUG WITH CHANGE DISK WITHOUT CHANGE PATH
+;R009 13-04-2023 BAO FIX BUG WITH PARSING DIRECTORY BUFFER
+;R13 06-04-2023 BAO Функцию SETBOOT можно вызвать только раз (если завершится корректно)
+;R12 03-04-2023 BAO Добавлена функция рескана драйвов LD C,8 : RST #10
+;R008 15-04-2003 DNS SAVE AND RESTORE CUR-PATH MACROS
+;R11 15-04-2003 DNS ROUTINE FOR STORE CURDISK AND CURDIR
+;R10 03-04-2003 DNS IMPROVED FN. VERSION
+;R09 27-03-2003 DNS PASTED SET/GET BOOT FN.
+;R007 06-02-2003 DNS FIX BUG IN MASK ROUTINE, IT ALLOW NAMES WHICH BEGAN FROM "." ".NAM"
+;R006 29-01-2003 DNS FIX BUG WITH SET FILE DATE AND TIME
+;R005 26-11-2002 DNS FIX ERROR IN CHDIR, DON'T ALLOWED "." FOR ROOT
+;R004 19-11-2002 DNS DON'T ALLOW DIR & LABEL ATTR FOR FILES
+;R003 19-11-2002 DNS ADD RESET OF VOLUME LABEL ATTRIBUT
+;R002 19-11-2002 DNS FIX GET/SET ATTRIBUTES
+;R101 07-11-2002 DNS FIX BUG WITH SCROLLUP FN. (A=0)
+;R102 07-11-2002 DNS CORRECT FN. WINCOPY & WINREST, ADD "DI+EI"
+;R001 16-12-1999 DNS Y2K fix
+;R06 21-11-1999 DNS FN. DISKINF SUPPORT ALL DISKS
+;R05 21-11-1999 DNS BUG FIX SIGNATURE #55AA IN BOOT SECTOR
+;R04 08-11-1999 DNS KILL OLD FUNCTIONS
+;R03 23-11-1998 DNS BUG FIX (IX+28) -> (IY+28)
+;R02 21-11-1998 DNS CHANGE FUNCTION "MAKE FAT"
+;R01 20-11-1998 DNS REPAIR FUNCTION "SAVE"
+;
+;---------------------------------------------------------------
+ ; VIDEO
+ include 'API/Clear.asm'
+ include 'API/PChars.asm'
+ include 'API/PutChar.asm'
+ include 'API/Locate.asm'
+ include 'API/Cursor.asm'
+ include 'API/RdChar.asm'
+ include 'API/WrChar.asm'
+ include 'API/WinCopy.asm'
+ include 'API/WinRest.asm'
+ include 'API/Scroll.asm'
+ include 'API/SelPage.asm'
+ include 'API/GetVMod.asm'
+ include 'API/SetVMod.asm'
+ ;
+ include 'API/Version.asm'
+ include 'API/bootDsk.asm'
+ include 'API/curDisk.asm'
+ include 'API/diskINF.asm'
+ include 'API/ScanDRV.asm'
+ include 'API/Attribute.asm'
+ include 'API/Create.asm'
+ include 'API/Delete.asm'
+ include 'API/Rename.asm'
+ include 'API/Open.asm'
+ include 'API/Close.asm'
+ include 'API/Find.asm'
+ include 'API/ChDisk.asm'
+ include 'API/CurrDir.asm'
+ include 'API/Time.asm'
+ include 'API/GetDateTime.asm'
+ include 'API/SetDateTime.asm'
+ include 'API/ChDir.asm'
+ include 'API/MkDir.asm'
+ include 'API/RmDir.asm'
+ include 'API/DosName.asm'
+ include 'API/Read.asm'
+ include 'API/Write.asm'
+ include 'API/FreeMem.asm'
+ include 'API/GetMem.asm'
+ include 'API/RetMem.asm'
+ include 'API/SetMem.asm'
+ include 'API/SetWin.asm'
+ include 'API/AppInfo.asm'
+ include 'API/Ex_Path.asm'
+ include 'API/GSwitch.asm'
+ include 'API/Environ.ASM'
+ include 'API/Lib_Sub.asm'
+ include "API/EXECUTE.ASM"
+ include "API/Print.asm"
+ include "API/Move_FP.asm"
+
+
+
+
+;R09
+ ;Дубль - CHDISK = OPENDSK
+ ;CHDISK:
+ ; PUSH AF
+ ; LD C,Dss.DRV.Open
+ ; RST ToDSS.DRV
+ ; POP BC
+ ; JP C,NDISK11
+ ; LD A,B
+ ; LD (CORE_BUFFERS.FS_Buffer.DRIVE),A
+ ; CALL RD_BPB
+ ; RET C
+ ; LD A,(LDRIVE)
+ ; AND A
+ ; RET
+ ;NDISK11:
+ ; CP DSS_Error.sys.INVALID_DRIVE
+ ; SCF
+ ; RET Z
+ ; LD A,DSS_Error.sys.NOT_READY
+ ; RET
+;
+
+
+;R04
+ ;SIZE2CL: LD DE,(B_P_C)
+ ; XOR A
+ ; SCF
+ ;S2C01: RR D
+ ; RR E
+ ; JR C,S2C02
+ ; RR H
+ ; RR L
+ ; RR B
+ ; RR C
+ ; JP NC,S2C01
+ ; LD A,1
+ ; JP S2C01
+ ;S2C02: OR A
+ ; RET Z
+ ; INC BC
+ ; RET
+ ;L_SEC_X: DW 0
+ ;H_SEC_X: DW 0
+;
+
+
+;GOD EQU 1999-1980*512
+
+;FHAND DB " "
+; DB " "
+; DB #20
+; DW 0,0,0,0,0
+; DW #0000
+; DW 5*32+19+GOD
+;SAVEC DW #0000
+;SIZEC DW #0000,#0000
+;=============================================
+;//MODULE: DOS_X
+;[END]
+
+;R11
+ ; IF SAVE_PATH_MACRO
+ ; SAVE_CUR_PATH
+ ; PUSH IX
+ ; PUSH IY
+ ; PUSH HL
+ ; PUSH DE
+ ; PUSH BC
+ ; PUSH AF
+ ;
+ ; SET_PAGE_X ENVPAGE
+ ; PUSH AF
+ ;
+ ; CALL CURRDSK
+ ; ADD A,"A"
+ ; LD HL,TMP_CURDIR_AUTO
+ ; LD (HL),A
+ ; INC HL
+ ; LD A,":"
+ ; LD (HL),A
+ ; INC HL
+ ; CALL CURRDIR_FN
+ ;
+ ; POP AF
+ ; OUT (SLOT3),A
+ ;
+ ; POP AF
+ ; POP BC
+ ; POP DE
+ ; POP HL
+ ; POP IY
+ ; POP IX
+ ; RET
+ ;
+ ; BACK_CUR_PATH:
+ ; RET NC
+ ; .force: PUSH IY
+ ; PUSH IX
+ ; PUSH HL
+ ; PUSH DE
+ ; PUSH BC
+ ; PUSH AF
+ ;
+ ; SET_PAGE_X ENVPAGE
+ ; PUSH AF
+ ;
+ ; LD HL,TMP_CURDIR_AUTO
+ ; CALL CHDIR
+ ;
+ ; POP AF
+ ; OUT (SLOT3),A
+ ;
+ ; POP AF
+ ; POP BC
+ ; POP DE
+ ; POP HL
+ ; POP IX
+ ; POP IY
+ ; RET
+ ; ENDIF
+;
\ No newline at end of file
diff --git a/DSS/API/AppInfo.asm b/DSS/API/AppInfo.asm
new file mode 100644
index 0000000..a783749
--- /dev/null
+++ b/DSS/API/AppInfo.asm
@@ -0,0 +1,101 @@
+;---------------------------------------------------------------
+;Rev Date Name Description
+;---------------------------------------------------------------
+;R10 13-04-2023 BAO FIX BUG WITH PARSING DIRECTORY BUFFER
+
+//////////////////////////////////////////////////////////////////////
+; !FIXIT тут одни затупы и дебилизм
+; Функция #47. Получение информации приложения.
+;
+; вход: HL - буфер данных
+; B - номер подфункции:
+; B=0 - получение параметров командной строки
+; B=1 - получение полного пути к каталогу программы
+; B=2 - получение полного пути и имени файла программы
+; выход: нет
+;
+; APPLICATION INFO
+;====================
+; B = 0 - GET APP_PARAM
+; B = 1 - GET APP_PATH
+; B = 2 - GET APP_FULLNAME
+//////////////////////////////////////////////////////////////////////
+;LAST_PSP_PTR: DW 0
+APPINFO: INC B
+ ;
+ DJNZ .FN1
+ ; получение параметров командной строки EX DE,HL
+ XOR A
+ LD (DE),A
+ LD HL,(.LAST_PSP_PTR)
+ LD C,(HL)
+ INC C
+ RET Z
+ INC HL
+ LDIR
+ AND A
+ RET
+
+.FN1: DJNZ .FN2
+ ; получение полного пути к каталогу программы
+ EX DE,HL
+.LAST_PSP_PTR+1:
+ LD HL,0
+ LD C,(HL)
+ INC HL
+ ADD HL,BC
+ INC HL
+ INC HL
+ PUSH HL
+ LD BC,#100 ;!HARDCODE длина коммандной строки
+ XOR A
+ CPIR
+ DEC HL ;R10 ;[x] исправлен баг с парсингом буфера каталога
+ DEC HL ;R10,5 - не тестил ;!!!!!
+ LD BC,#100 ;R10 ;[x] не было этой команды, CPDR мог не прошерстить всё ;!HARDCODE длина коммандной строки
+ LD A,'\'
+ CPDR
+ INC HL
+ INC HL
+ POP BC
+ AND A
+ SBC HL,BC
+ ;R10 ;[x] могло всё в космос улететь
+ LD A,DSS_Error.sys.COMMON_ERROR
+ JR C,.error
+ ;
+ LD A,B ;EX HL,A,BC
+ LD B,H
+ LD H,A
+ LD A,C
+ LD C,L
+ LD L,A
+ LDIR
+ XOR A
+ LD (DE),A
+ RET
+ ;
+.FN2: DJNZ .FN3
+ ; получение полного пути и имени файла
+ EX DE,HL
+ LD HL,(.LAST_PSP_PTR)
+ LD C,(HL)
+ INC HL
+ ADD HL,BC
+ INC HL
+ INC HL
+ ;
+.loop LD A,(HL)
+ LDI
+ OR A
+ JR NZ,.loop
+ ;
+ RET
+ ;
+.FN3:
+ ;
+ ; ошибка
+ LD A,DSS_Error.sys.INVALID_FUNCTION
+.error: SCF
+ RET
+;
\ No newline at end of file
diff --git a/DSS/API/Attribute.asm b/DSS/API/Attribute.asm
new file mode 100644
index 0000000..41343d6
--- /dev/null
+++ b/DSS/API/Attribute.asm
@@ -0,0 +1,94 @@
+////////////////////////////////////////////////////////////////////////
+; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00
+; A - ATTRIB
+; B - MODE
+; B = #00 GET ATTRIB
+; B = #01 SET ATTRIB
+; OUTPUT: A - ATTRIB
+////////////////////////////////////////////////////////////////////////
+ATTRIB: ;!TEST Current Dir ;[x] 15/10/23
+ LD C,A
+ ;
+ PUSH HL
+ PUSH BC
+ CALL DIR_PATH_CHECK
+ POP BC
+ POP HL
+ RET C
+ LD A,C
+ ;
+ ;
+ INC B
+ DJNZ .B_1
+ ; B = 0
+.READ: ;!TEST ;[x] 16/11/23 optimize get attribute
+ ;XOR A
+ ;
+ CALL .OPENATR ;R002
+ RET C
+ ;!TEST ;[x] 16/11/23 optimize get attribute
+ LD A,(HANDBUF + FAT_DIRECTORY_RECORD.ATTRIBUT)
+ ;LD B,(IY+_sFM.ATTRIBUT)
+ ;PUSH BC
+ ;CALL CLOSE
+ ;POP BC
+ ;RET C
+ ;LD A,B
+ ;
+ RET
+ ;
+.B_1: DJNZ .B_2
+ ;
+.WRITE_FN: AND FAT_ATTR.NoVolID ; [x] 2/12/23 фикс для volume ID
+.WRITE: PUSH AF
+ XOR A
+ ;!TEST ;[x] 16/11/23 optimize get attribute
+ LD (OPEN_FN.TMP),A
+ ;
+ CALL .OPENATR ;R002
+ ;!TEST ;[x] 16/11/23 optimize get attribute
+ CALL NC,OPEN_FN.FM
+ ;
+ POP BC
+ RET C
+ SET 7,(IY+_sFM.ACCESS_MODE)
+ ;RES 3,B ;CLEAR LABEL ATTR ;R003
+ LD (IY+_sFM.FS_REC.ATTRIBUT),B
+ PUSH BC
+ CALL CLOSE_FN
+.error: POP BC
+ RET C
+ LD A,B
+ RET
+ ;R002
+; выход: если CF = 0, то DE = record index
+;!TEST 9/11/23 record index
+.OPENATR: ;!TEST ;[x] 16/11/23 optimize get attribute
+ ;LD (OPEN.TMP),A ; раб. ячейка (здесь атрибут записи)
+ ;
+ CALL SetPath_GetName ; тест на допуст. имя и настр. на диск
+ RET C
+ ; [ ] 26/06/2024
+ CALL CHECK_64kb_CLUSTER
+ RET C
+ ;
+ CALL MASK
+ RET C
+ LD A,FAT_ATTR.NoVolID
+ ;!TEST ;[x] 16/11/23 optimize get attribute
+ JP SEARCH.Custom
+ ;CALL SEARCH.Custom
+ ;RET C ; запись не найдена
+ ;JP OPEN.FM ; на поиск своб. дескриптора
+ ;
+ ;
+ ; [ ] ; !TODO для команды LABEL в Shell
+ ; 1. проверить что в HL указана только метка в кавычках
+ ; 2. если метка без недопустимых символов, то делаем её не
+ ; только в BPB, но и на корневом разделе, иначе удаляем на корневом
+ ; 3. открываем требуемый диск через .force, чтоб сбросить кэши
+.B_2: DJNZ .error_fn
+ ;
+.error_fn: LD A,DSS_Error.sys.INVALID_FUNCTION
+ SCF
+ RET
\ No newline at end of file
diff --git a/DSS/API/ChDir.asm b/DSS/API/ChDir.asm
new file mode 100644
index 0000000..68a61d9
--- /dev/null
+++ b/DSS/API/ChDir.asm
@@ -0,0 +1,36 @@
+////////////////////////////////////////////////////////////////////////
+; Функция #1D. Смена текущего каталога.
+; Меняет текущий каталог и текущий диск, если он указан в файловой
+; спецификации. Если путь начинается с "\" - это означает путь от
+; корневого каталога, иначе от текущего.
+;
+; вход: HL - указатель на имя каталога
+; выход: нет
+;
+; INPUT: HL - "C:\DIR\DIR\DIR_NAME[\]",0
+////////////////////////////////////////////////////////////////////////
+CHDIR_FN:
+ ;!TEST Current Dir ;[x] 15/10/23
+ ;
+ PUSH HL
+ CALL DIR_PATH_CHECK
+ POP HL
+ RET C
+ CALL CHDIR
+ ; если удачно, то копируем WorkDirectory в CurrentDirectory
+ JP NC,DIR_PATH_CHANGE.FullCurrent
+ ; если неудачно, то возвращаемся туда откуда пришли
+ PUSH AF
+ LD HL,CORE_BUFFERS.CurrentDirectory
+ CALL CHDIR
+ POP AF
+ RET
+ ;
+CHDIR: CALL SetPath_GetName ; тест на допуст. имя и настр. на диск
+ RET C
+ LD HL,TMPNAME
+ LD A,(HL)
+ OR A
+ RET Z
+ JP OPENDIR
+;
\ No newline at end of file
diff --git a/DSS/API/ChDisk.asm b/DSS/API/ChDisk.asm
new file mode 100644
index 0000000..7cd2664
--- /dev/null
+++ b/DSS/API/ChDisk.asm
@@ -0,0 +1,24 @@
+////////////////////////////////////////////////////////////////////////
+;
+;
+////////////////////////////////////////////////////////////////////////
+CHDISK_FN: CALL CHDISK
+ RET C
+ PUSH AF
+ CALL DIR_PATH_CHANGE.FullCurrent
+ POP AF
+ RET
+CHDISK: ;[x] более корректная смена диска
+ CALL OPENDSK
+ ;
+ ;R010
+ RET C
+ LD HL,CORE_BUFFERS.WorkDirectory
+ LD (HL),0
+ PUSH AF
+ CALL OPENDIR
+ POP BC
+ RET C
+ LD A,B
+ RET
+;
\ No newline at end of file
diff --git a/DSS/API/ChnDisk.asm b/DSS/API/ChnDisk.asm
new file mode 100644
index 0000000..dc099b0
--- /dev/null
+++ b/DSS/API/ChnDisk.asm
@@ -0,0 +1,24 @@
+////////////////////////////////////////////////////////////////////////
+;
+;
+////////////////////////////////////////////////////////////////////////
+CHDISK_FN: CALL CHDISK
+ RET C
+ PUSH AF
+ CALL DIR_PATH_CHANGE.FullCurrent
+ POP AF
+ RET
+CHDISK: ;[x] более корректная смена диска
+ CALL OPENDSK
+ ;
+ ;R010
+ RET C
+ LD HL,CORE_BUFFERS.WorkDirectory
+ LD (HL),0
+ PUSH AF
+ CALL OPENDIR
+ POP BC
+ RET C
+ LD A,B
+ RET
+;
\ No newline at end of file
diff --git a/DSS/API/Clear.asm b/DSS/API/Clear.asm
new file mode 100644
index 0000000..fe801f7
--- /dev/null
+++ b/DSS/API/Clear.asm
@@ -0,0 +1,20 @@
+;///////////////////////////////////////////////////////////////////////
+; Функция #56. Очистить окно.
+;
+; вход: D - строка левого верхнего угла окна
+; E - столбец левого верхнего угла окна
+; H - высота окна
+; L - ширина окна
+; A - символ заполнитель
+; B - атрибут заполнитель
+; выход: нет
+;///////////////////////////////////////////////////////////////////////
+CLEAR: LD C,A
+ LD A,B
+ LD (.shell_color),A
+ LD A,C
+ LD C,BIOS.LP_CLS_WIN2
+ JP ToBIOS
+ ;
+.shell_color: DB COLORS.CGA.INK.LGRAY
+;///////////////////////////////////////////////////////////////////////
\ No newline at end of file
diff --git a/DSS/API/Close.asm b/DSS/API/Close.asm
new file mode 100644
index 0000000..e39e794
--- /dev/null
+++ b/DSS/API/Close.asm
@@ -0,0 +1,91 @@
+; [x] fat32 ;!TEST
+////////////////////////////////////////////////////////////////////////
+;Входные значения:
+; C - #12
+; A - файловый манипулятор
+;Выходные значения:
+; A - код ошибки, если CF=1
+////////////////////////////////////////////////////////////////////////
+CLOSE_FN:
+;R008 ;
+;CLOSE: ;
+ LD (.TMP),A
+ CALL SET_FM
+ RET C
+ LD A,(TASK)
+ CP (IY+_sFM.TASK_NUM)
+ LD A,DSS_Error.sys.ACCESS_DENIED
+ SCF
+ RET NZ
+ BIT 7,(IY+_sFM.ACCESS_MODE)
+ JR Z,.NOTMODF
+ ;
+ LD E,(IY+_sFM.DIR_CLUSTER_L)
+ LD D,(IY+_sFM.DIR_CLUSTER_L+1)
+ PUSH DE
+ ; [x] fat32
+ LD E,(IY+_sFM.DIR_CLUSTER_H)
+ LD D,(IY+_sFM.DIR_CLUSTER_H+1)
+ PUSH DE
+ ;
+ ; [x] 15/11/2023 -bug with bad clusters ;!TEST
+ LD A,(IY+_sFM.DRIVE)
+ CALL OPENDSK
+ JR C,.error
+ ;
+ XOR A
+ CALL SET_FM
+ ; [x] fat32
+ POP DE
+ LD (IY+_sFM.DIR_CLUSTER_H),E
+ LD (IY+_sFM.DIR_CLUSTER_H+1),D
+ LD (IY+_sFM.FS_REC.FIRST_CLUSTER_H),E
+ LD (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1),D
+ ;
+ POP DE
+ LD (IY+_sFM.DIR_CLUSTER_L),E
+ LD (IY+_sFM.DIR_CLUSTER_L+1),D
+ ; [x] 15/11/2023 -bug with bad clusters ;!TEST
+ LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L),E
+ LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1),D
+ ;
+ CALL LOADDIR
+.TMP+1: LD A,0
+ CALL SET_FM
+ ;
+ SET_PAGE_X DIRPAGE
+ ;
+ ;!TEST 9/11/23 record index
+ ; LD HL,DIR
+ ; LD DE,FAT_DIRECTORY_RECORD
+ ; LD C,(IY+_sFM.HANDLE)
+ ; LD B,(IY+_sFM.HANDLE+1)
+ ; JR .CLOSE2
+ ; .CLOSE1:
+ ; ADD HL,DE
+ ; DEC BC
+ ; .CLOSE2:
+ ; LD A,B
+ ; OR C
+ ; JR NZ,.CLOSE1
+ LD L,(IY+_sFM.HANDLE)
+ LD H,(IY+_sFM.HANDLE+1)
+ ;
+ LD D,YH
+ LD E,YL
+ EX DE,HL
+ ;PUSH HL
+ ;SET_PAGE_X DIRPAGE
+ ;POP HL
+ LD BC,FAT_DIRECTORY_RECORD
+ LDIR
+ OUT (SLOT3),A
+ CALL SAVEDIR
+.NOTMODF:
+ LD A,(.TMP)
+ JP RES_FM
+ ;
+.error: POP DE
+ POP DE
+ RET
+;
\ No newline at end of file
diff --git a/DSS/API/Create.asm b/DSS/API/Create.asm
new file mode 100644
index 0000000..acf7260
--- /dev/null
+++ b/DSS/API/Create.asm
@@ -0,0 +1,111 @@
+////////////////////////////////////////////////////////////////////////
+; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00
+; A - File attribute
+; OUTPUT: A - FM
+////////////////////////////////////////////////////////////////////////
+CREATE: ;!TEST Current Dir ;[x] 15/10/23 ;CREATE_FN:
+ PUSH HL
+ LD C,A
+ ;
+ PUSH BC
+ CALL DIR_PATH_CHECK
+ POP BC
+ POP HL
+ RET C
+ LD A,C
+ ;
+ CALL .Prepare
+ RET C
+ CALL SEARCH.File
+ ; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024
+ ;CALL NC,DEL_FN.DELETE ;FILE EXIST RECREAT
+ CALL NC,.FILE_EXISTS_DEL ;FILE EXIST RECREAT
+ CP DSS_Error.sys.FILE_NOT_FOUND
+ JR Z,.DO
+ SCF
+ RET
+.FILE_EXISTS_DEL:
+ CALL DELETE_REC_FAT
+ LD A,DSS_Error.sys.FILE_NOT_FOUND
+ RET
+ ;
+ ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00
+ ; OUTPUT: A - FM
+.NEW: ;!TEST Current Dir ;[x] 15/10/23
+ PUSH HL
+ LD C,A
+ ;
+ PUSH BC
+ CALL DIR_PATH_CHECK
+ POP BC
+ POP HL
+ RET C
+ LD A,C
+ ;
+ CALL .Prepare
+ RET C
+ CALL SEARCH.File
+ ; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024
+ ; LD A,DSS_Error.sys.FILE_EXISTS
+ ; CCF
+ ; RET C
+ JR NC,.FILE_EXISTS
+ CP DSS_Error.sys.FILE_NOT_FOUND
+ SCF
+ RET NZ
+ ;
+ ;
+ ;no_file_found
+.DO: ; FAT_DIRECTORY_RECORD.NAME + .EXT
+ LD HL,MASKARE
+ LD DE,HANDBUF
+ LD BC,11
+ LDIR
+ EX DE,HL
+.TMP+1: LD A,0
+ ; FAT_DIRECTORY_RECORD.ATTRIBUT
+ LD (HL),A
+ INC HL
+ LD BC,#0A00 ;!HARDCODE
+ ; .RESERVED_NT .. .FIRST_CLUSTER_H
+.loop1: LD (HL),C
+ INC HL
+ DJNZ .loop1
+ ; .TIME .. .DATE
+ CALL WRITE_DATE_TIME_TO_DIRECTORY_RECORD
+ ;
+ LD BC,#0600
+ ;
+.loop2: LD (HL),C
+ INC HL
+ DJNZ .loop2
+ ;
+ CALL WRT_HND
+ RET C
+ ;CALL SAVEDIR
+.PATH0+1: LD HL,0
+ XOR A
+ LD (OPEN_FN.TMP),A
+ JP OPEN_FN.FILE ;R008
+ ;
+.Prepare: ;AND #E7 ;R004 %76A00SHR = !FAT_ATTR ;!HARDCODE
+ AND FAT_ATTR.NoDIRnoVolID
+ LD (.TMP),A
+ LD (.PATH0),HL
+ CALL SetPath_GetName
+ RET C
+ ; [ ] 26/06/2024
+ CALL CHECK_64kb_CLUSTER
+ RET C
+ ;
+ ; [ ] 25/02/2025 - файл не создастся, если нет свободного манипулятора
+ CALL GET_FM
+ RET C
+ ;
+ JP MASK
+ ;
+; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024
+.FILE_EXISTS: LD A,DSS_Error.sys.FILE_EXISTS
+ CCF
+ RET
+;
\ No newline at end of file
diff --git a/DSS/API/CurrDir.asm b/DSS/API/CurrDir.asm
new file mode 100644
index 0000000..7ae85dc
--- /dev/null
+++ b/DSS/API/CurrDir.asm
@@ -0,0 +1,24 @@
+////////////////////////////////////////////////////////////////////////
+; Функция #1E. Информация о текущем каталоге.
+;
+; вход: HL - буфер в памяти 256 байт
+; выход: A - код ошибки, если CF=1
+////////////////////////////////////////////////////////////////////////
+CURRDIR: LD DE,CORE_BUFFERS.WorkDirectory
+ JR CURRDIR_FN.skip
+CURRDIR_FN:
+ LD DE,CORE_BUFFERS.CurrentDirectory
+.skip: EX DE,HL
+ LD BC,DIRECTORY_PATH_LENGTH ;[x] 15/11/2023 могло выйти за пределы буфера
+ XOR A
+.loop: CP (HL)
+ LDI
+ JP PO,.error ;[x] 15/11/2023 могло выйти за пределы буфера
+ JR NZ,.loop
+ RET
+ ;[x] 15/11/2023 могло выйти за пределы буфера
+.error: LD A,DSS_Error.sys.TOO_DEEP_DIR_DEPTH
+ SCF
+ RET
+ ;
+;
\ No newline at end of file
diff --git a/DSS/API/Cursor.asm b/DSS/API/Cursor.asm
new file mode 100644
index 0000000..69354c4
--- /dev/null
+++ b/DSS/API/Cursor.asm
@@ -0,0 +1,10 @@
+;///////////////////////////////////////////////////////////////////////
+; Функция #53. Узнать положение курсора.
+;
+; вход: нет
+; выход: D - строка курсора
+; E - колонка курсора
+;///////////////////////////////////////////////////////////////////////
+CURSOR: LD C,BIOS.LP_GET_PLACE
+ JP ToBIOS
+;///////////////////////////////////////////////////////////////////////
\ No newline at end of file
diff --git a/DSS/API/Delete.asm b/DSS/API/Delete.asm
new file mode 100644
index 0000000..e5e92f0
--- /dev/null
+++ b/DSS/API/Delete.asm
@@ -0,0 +1,34 @@
+; [x] fat32 ;!TEST
+////////////////////////////////////////////////////////////////////////
+; INPUT: HL - "c:\dir\filename.ext",#00 without simbols * ?
+////////////////////////////////////////////////////////////////////////
+DEL_FN: ;Current Dir ;[x] 15/10/23
+ PUSH HL
+ CALL DIR_PATH_CHECK
+ POP HL
+ RET C
+ ;
+ CALL SetPath_GetName ; тест на допуст. имя и настр. на диск
+ RET C
+ ; [ ] 26/06/2024
+ CALL CHECK_64kb_CLUSTER
+ RET C
+ ;
+ CALL MASK
+ RET C
+ ;
+ ;!TEST optimization
+ ;LD HL,MASKARE
+ ;LD BC,11
+ ;LD A,"?"
+ ;CPIR
+ ;LD A,DSS_Error.sys.INVALID_NAME
+ ;SCF
+ CALL CHECK_NAME
+ ;
+ RET Z
+ CALL LOADDIR
+ CALL SEARCH.File
+ RET C
+ JP DELETE_REC_FAT ; пометить запись как "удаленная"
+;
\ No newline at end of file
diff --git a/DSS/API/DosName.asm b/DSS/API/DosName.asm
new file mode 100644
index 0000000..512de5c
--- /dev/null
+++ b/DSS/API/DosName.asm
@@ -0,0 +1,22 @@
+////////////////////////////////////////////////////////////////////////
+;Входные значения:
+; C - #44
+; B = 0, преобразовать из 11 символьного формата в формат ДОС
+; HL - 11 символов имени файла
+; DE - буфер для имени в формате ДОС
+; B = 1, преобразовать из формата ДОС в 11 символьный формат
+; HL - имя файла в формате ДОС
+; DE - 11 символов имени файла
+;Выходные значения:
+; A - код ошибки, если CF=1
+////////////////////////////////////////////////////////////////////////
+DOSNAME:
+ INC B
+ DEC B
+ JP Z,GetName
+ DEC B
+ JP Z,MASK.custom
+ LD A,DSS_Error.sys.INVALID_FUNCTION
+ SCF
+ RET
+;
\ No newline at end of file
diff --git a/DSS/API/Environ.asm b/DSS/API/Environ.asm
new file mode 100644
index 0000000..4a3c1d3
--- /dev/null
+++ b/DSS/API/Environ.asm
@@ -0,0 +1,294 @@
+;[BEGIN]
+;//MODULE: ENVIRON
+;//CREATE: 10-11-2002 AUTHOR: Denis Parinov
+;---------------------------------------------------------------
+;Rev Date Name Description
+;---------------------------------------------------------------
+;R02 13-05-2023 BAO Инициализация переменной BOOTDSK при старте
+;R03 09-03-2007 VAS Функция ENV_EX теперь обрезает слишком длинную строку перед выходом
+;R01 19-11-2002 DNS CORRECT DE ADDRESS IN GETENV
+;---------------------------------------------------------------
+
+;/////////////////////////////////////////////////////////////////////
+; Функция #46. Системное окружение.
+;
+; вход: B - номер подфункции:
+; B=#FF, инициализация
+; B=0, получение системного окружения.
+; HL - буфер
+; B=1, получить переменную окружения.
+; HL - имя переменной
+; DE - буфер для значения переменной
+; B=2, установить/удалить переменную окружения
+; HL - ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ
+; В конце строки ноль.
+
+; выход: A - состояние, если CF=0
+; DE - указывает на конец буфера (только для B=1)
+; A=#FF - переменная обнаружена
+; A=0 - переменная не обнаружена
+; A - код ошибки, если CF=1
+;/////////////////////////////////////////////////////////////////////
+ENVIRON:
+ INC B
+ JR Z,INITENV ; B=#FF
+ DEC B
+ JR Z,READENV ; B=0. получить сист. окружение
+ DEC B
+ JP Z,GETENV ; B=1. получить перем. окружения
+ DEC B
+ JP Z,SETENV ; B=2. установить/удалить перем. окружения
+ LD A,DSS_Error.sys.INVALID_FUNCTION
+ SCF
+ RET
+
+;-------------------------------------------------
+; Инициализация буфера переменных окружения
+;-------------------------------------------------
+INITENV:
+ SET_PAGE_X ENVPAGE
+ PUSH AF
+ ;
+ ;R02
+ LD A,(BOOTDSK.NUM)
+ ADD A,'A'
+ LD (DEFAULT_ENV.boot_disk),A
+ ;
+ LD DE,ENVIRONMENT ; начало буфера переменных окружения
+ XOR A
+ LD (DE),A
+ INC DE
+ LD HL,DEFAULT_ENV
+ LD BC,DEF_ENV_SIZE
+ LDIR
+ LD (DE),A
+ EX DE,HL
+ LD DE,ENVIRONMENT
+ AND A
+ SBC HL,DE
+ LD (ENVSIZE),HL
+ ;
+ POP AF
+ OUT (SLOT3),A
+ AND A
+ RET
+
+;-------------------------------------------------
+; Получить сист. окружение
+;-------------------------------------------------
+READENV:
+ PUSH HL
+
+ SET_PAGE_X ENVPAGE
+
+ LD H,A
+ LD C,SLOT3
+ IN L,(C)
+ EXX
+
+ LD HL,ENVIRONMENT
+ INC HL
+ POP DE
+ LD BC,(ENVSIZE)
+ EXX
+;
+.loop: OUT (C),L
+ EXX
+ LD A,(HL)
+ EXX
+ OUT (C),H
+ EXX
+ LD (DE),A
+ INC HL
+ INC DE
+ DEC BC
+ LD A,B
+ OR C
+ EXX
+ JR NZ,.loop
+ //XOR A
+ ;A=0
+ RET
+
+;-------------------------------------------------
+; Получить переменную окружения
+;-------------------------------------------------
+GETENV: PUSH DE
+ CALL ENV_EX ; скопир. строку перем. окруж. в буферы
+
+ SET_PAGE_X ENVPAGE
+ EX AF,AF'
+
+ CALL F_ENV ; RET: DE - VAR VALUE; HL - VAR ADDRESS; BC - ENVIRONMENT SIZE
+ POP DE
+ LD A,0
+ LD (DE),A
+ JR NC,.exit
+.loop: LD A,(HL)
+ LDI
+ OR A
+ JR NZ,.loop
+ DEC DE ;R01
+ LD A,#FF
+
+.exit: EX AF,AF'
+ OUT (SLOT3),A
+ EX AF,AF'
+ AND A
+ RET
+
+;-------------------------------------------------
+; Установить/Удалить переменную окружения
+;
+; вход: hl=имя перем. и значение, раздел. символом "="
+;-------------------------------------------------
+SETENV: CALL ENV_EX ; скопир. строку перем. окруж. в буферы
+
+ SET_PAGE_X ENVPAGE
+ PUSH AF
+
+ CALL F_ENV ; RET: DE - VAR VALUE; HL - VAR ADDRESS; BC - ENVIRONMENT SIZE
+ JR NC,PENV
+ XOR A
+ CPIR
+ LD A,B
+ OR C
+ JR Z,PENV
+ LDIR
+PENV LD A,(ENVVALUE)
+ OR A
+ JR Z,CLR_ENV
+ LD HL,ENVNAME
+F_EVN2 LD A,(HL)
+ LDI
+ CP "="
+ JR NZ,F_EVN2
+ LD HL,ENVVALUE
+F_EVN3 LD A,(HL)
+ LDI
+ OR A
+ JR NZ,F_EVN3
+CLR_ENV XOR A
+ LD (DE),A
+ LD HL,ENVIRONMENT
+ EX DE,HL
+ SBC HL,DE
+ LD (ENVSIZE),HL
+;
+ POP AF
+ OUT (SLOT3),A
+ AND A
+ RET
+
+
+; RET:
+; DE - VAR VALUE
+; HL - VAR ADDRESS
+; BC - ENVIRONMENT SIZE
+F_ENV LD HL,ENVIRONMENT
+ LD BC,(ENVSIZE)
+ PUSH HL
+F_EVN0 POP DE
+ LD DE,ENVNAME
+ XOR A
+ CPIR
+ PUSH HL
+F_EVN1 LD A,(HL)
+ OR A
+ JR Z,END_OF_ENV
+ LD A,(DE)
+ CP (HL)
+ INC HL
+ INC DE
+ DEC BC
+ JR NZ,F_EVN0
+ CP "="
+ JR NZ,F_EVN1
+ SCF
+END_OF_ENV
+ POP DE
+ RET
+
+;-----------------------------------------------------------
+; Скопировать строку переменной окружения в буферы
+; (имя и значение в разные буферы)
+; вход: hl=имя перем. и значение, раздел. символом "="
+;-----------------------------------------------------------
+ENV_EX: LD B,ENVIRONMENT_STRING_LENGTH ; 255 макс. длина строки (имя+знач.)
+ LD DE,ENVNAME ; куда
+ENV_E0: XOR A
+ LD (DE),A
+ LD (ENVVALUE),A
+ ; скопир. в "ENVNAME" имя переменной
+ENV_E1: LD A,(HL)
+ INC HL
+ CP "="
+ JR Z,EQUAL_SG
+ OR A
+ JR Z,ENV_E3
+ CALL UPPER
+ LD (DE),A
+ INC DE
+ DJNZ ENV_E1
+ ;R03
+ ; слишком длинная строка
+ ld a,b
+ ld (de),a ; обрезать слишком длинную строку
+ inc de
+ ;
+ SCF
+ RET
+ ; значение не задано
+ENV_E3: LD A,"="
+ LD (DE),A
+ INC DE
+ XOR A
+ LD (DE),A
+ INC DE
+ RET
+ ; значение задано
+EQUAL_SG: LD (DE),A ; сохр. "="
+ INC DE
+ XOR A
+ LD (DE),A ; в конец имени перем.
+ ; скопир. в "ENVVALUE" значение переменной (строку путей)
+ LD DE,ENVVALUE ; 512 байт, буфер
+ LD (DE),A
+ LD C,#FF ; чтобы "ldi" не портила "b"
+ENV_E2 LD A,(HL)
+ LDI
+ OR A
+ RET Z ; конец строки знач. переменной
+ DJNZ ENV_E2
+ ;R03
+ ; слишком длинная строка
+ ld a,b
+ ld (de),a ; обрезать слишком длинную строку
+ inc de
+ ;
+ SCF
+ RET
+
+ENVNAME EQU CORE_BUFFERS.EXEBUFF ;DS 32
+ENVVALUE EQU CORE_BUFFERS.BUFFER //#3800 ; BUFFER ;DS 128
+
+ENVSIZE DW DEF_ENV_SIZE ;E_END-ENVIRONMENT ;160
+
+ENVIRONMENT EQU ENVADDR
+
+DEFAULT_ENV: DB 'BOOTDSK=' ;R02
+.boot_disk: DB 'X:',0 ;R02
+; DB 'SYSTEM=C:\system.exe',0
+; DB 'PATH=\SYSTEM\;\COMMAND\;',0
+DEF_ENV_SIZE EQU $-DEFAULT_ENV ;R02
+
+
+; DB 'SYSTEM=C:\system.exe',0
+; DB 'PATH=\SYSTEM\;\COMMAND\;',0
+; DB 0
+; DB 'SYSTEM=C:\system.exe',0
+; DB 'PATH=C:\;\FN\;',0
+; DB 'OS=ESTEX',0
+; DB 'VAR1=000',0
+; DB 'OSNAME=ESTEX 2002',0
+; DB 0
\ No newline at end of file
diff --git a/DSS/API/Ex_Path.asm b/DSS/API/Ex_Path.asm
new file mode 100644
index 0000000..aab7a8b
--- /dev/null
+++ b/DSS/API/Ex_Path.asm
@@ -0,0 +1,240 @@
+//////////////////////////////////////////////////////////////////////
+; Функция #45. Разбор командной строки.
+;
+; вход: HL - указатель командной строки
+; DE - указатель на буфер пользователя
+; B - номер подфункции:
+; 0 - Разобрать строку
+; 1 - Выделить имя диска
+; 2 - Выделить директорию
+; 3 - Выделить имя файла
+; 4 - Выделить расширение файла
+; 5 - Выделить имя диска, путь к файлу, имя файла и расш. файла
+; 6 - Зарезервировано ;!TODO преобразовать относительный путь в полный ; [ ]
+; 7 - Выделить параметр командной строки
+; 8 - Преобразовать из 11 символьного формата в формат ДОС
+; 9 - Преобразовать из формата ДОС в 11 символьный формат
+; выход: нет
+//////////////////////////////////////////////////////////////////////
+GLOB_PR EQU 7 ;%10000000
+DRIV_PR EQU 3 ;%00001000
+PATH_PR EQU 2 ;%00000100
+EXTN_PR EQU 1 ;%00000010
+NAM_PR EQU 0 ;%00000001
+
+EX_PATH: EXX
+ LD HL,NM_PATH_A ;BUILT-IN BUFFER FOR PATH ;!!!!! используется общий буфер
+ LD (NM_PATH),HL
+ LD HL,NM_NAME_A
+ LD (NM_NAME),HL
+ LD HL,NM_EXTN_A
+ LD (NM_EXTN),HL
+ LD HL,NM_DRIVE_A
+ LD (NM_DRIVE),HL
+ EXX
+ INC B
+ DEC B
+ JR Z,.FULL ;0 ; разобрать строку
+ DEC B
+ JR Z,.GET_DRIVE ;1 ; выделить имя диска
+ DEC B
+ JR Z,.GET_PATH ;2 ; выделить директорию
+ DEC B
+ JR Z,.GET_NAME ;3 ; выделить имя файла
+ DEC B
+ JR Z,.GET_TYPE ;4 ; выделить расширение файла
+ DEC B
+ JR Z,.GET_ALL_EX ;5 ; выделить диск, путь, файл и расш.
+ DEC B
+ JR Z,.EX_RESR ;6 ; зарезервировано
+ DEC B
+ JP Z,GSWITCH ;7 ; выделить параметр ком-строки
+ DEC B
+ JP Z,GetName ;8 ; преобр. имя 11 -> 8.3 формат
+ DEC B
+ JP Z,MASK.custom ;9 ; преобр. имя 8.3 -> 11 формат
+.EX_RESR: LD A,DSS_Error.sys.INVALID_FUNCTION
+ SCF
+ RET
+ ; Выделить имя диска
+.GET_DRIVE: LD (NM_DRIVE),DE
+ CALL .FULL
+ RET C
+ LD DE,(NM_DRIVE)
+ LD A,(DE)
+ DEC A
+ CP #FF
+ RET Z
+ CP "A"-1
+ JR C,.GD_error
+ CP "Z"
+ JR NC,.GD_error
+ SUB "A"-1
+ RET
+ ;
+.GD_error: LD A,DSS_Error.sys.INVALID_DRIVE
+ SCF
+ RET
+
+ ; Выделить директорию
+.GET_PATH: LD (NM_PATH),DE
+ JR .FULL
+
+ ; Выделить имя файла
+.GET_NAME: LD (NM_NAME),DE
+ JR .FULL
+
+ ; Выделить расширение файла
+.GET_TYPE: LD (NM_EXTN),DE
+ JR .FULL
+ ; Выделить диск, путь, файл и расш.
+.GET_ALL_EX: EX DE,HL
+ LD C,(HL)
+ INC HL
+ LD B,(HL)
+ INC HL
+ LD (NM_DRIVE),BC
+ LD C,(HL)
+ INC HL
+ LD B,(HL)
+ INC HL
+ LD (NM_PATH),BC
+ LD C,(HL)
+ INC HL
+ LD B,(HL)
+ INC HL
+ LD (NM_NAME),BC
+ LD C,(HL)
+ INC HL
+ LD B,(HL)
+ LD (NM_EXTN),BC
+ EX DE,HL
+ ;JR EX_FULL
+ ; Разобрать строку
+.FULL: EX AF,AF'
+ EXX
+ XOR A
+ LD HL,(NM_PATH)
+ LD (HL),A
+ LD HL,(NM_NAME) ; адрес буфера под имя файла
+ LD (HL),A
+ LD HL,(NM_EXTN)
+ LD (HL),A
+ LD HL,(NM_DRIVE)
+ LD (HL),A
+ EXX
+ EX AF,AF'
+.PAT0: LD DE,TMPBUF
+ LD BC,#0D01 ;!HARDCODE счетчики
+.PAT1: LD A,(HL)
+ CALL UPPER ; a..z -> A..Z
+ LD (DE),A
+ INC HL
+ INC DE
+ INC C ; ++счетчик
+ CP '\'
+ JR Z,.PATH_YEP
+ CP ":"
+ JR Z,.DRIVE_YEP
+ CP "!"
+ JR C,.NAME_YEP
+ CP "?"
+ JR Z,.GLOBP1
+ CP "*"
+ JR Z,.GLOBP1
+.PAT2: DJNZ .PAT1
+ LD A,DSS_Error.sys.INVALID_NAME
+ SCF
+ RET
+ ;
+.GLOBP1: EX AF,AF'
+ SET GLOB_PR,A
+ EX AF,AF'
+ JR .PAT2
+ ;
+.NAME_YEP: LD A,2
+ CP C
+ JR Z,.NOFNAME
+ PUSH HL
+ LD HL,TMPBUF
+ LD DE,(NM_NAME) ; адрес буфера под имя файла
+ LD B,0
+ DEC C
+ DEC C
+ LD A,C
+ LDIR
+ LD C,A
+ XOR A
+ LD (DE),A
+ LD HL,(NM_NAME)
+ LD A,"."
+ CPIR
+ JR NZ,.NOEXTN
+ LD C,3
+ LD DE,(NM_EXTN)
+.EXTSK0: LD A,(HL)
+ OR A
+ JR NZ,.EXTSK1
+ LD A,' '
+ DEC HL
+.EXTSK1: LD (DE),A
+ INC HL
+ INC DE
+ DEC C
+ JR NZ,.EXTSK0
+ XOR A
+ LD (DE),A
+ EX AF,AF'
+ SET EXTN_PR,A ; указано расш. файла
+ EX AF,AF'
+.NOEXTN: EX AF,AF'
+ SET NAM_PR,A ; указано имя файла
+ EX AF,AF'
+ POP HL
+.NOFNAME: EX AF,AF'
+ AND A
+ RET
+ ;
+.DRIVE_YEP: XOR A
+ LD (DE),A
+ PUSH HL
+ LD HL,TMPBUF
+ LD DE,(NM_DRIVE)
+ LD B,0
+ LDIR
+ POP HL
+ EX AF,AF'
+ SET DRIV_PR,A ; указано имя диска
+ EX AF,AF'
+ JP .PAT0
+ ;
+.PATH_YEP: XOR A
+ LD (DE),A
+ PUSH HL
+ PUSH BC
+ LD HL,(NM_PATH)
+ LD BC,#00FF ; !FIXIT глубина буфера не зависит от CurrentDirectory.DEPTH
+ CPIR
+ DEC HL
+ EX DE,HL
+ LD HL,TMPBUF ; 12 пробелов
+ POP BC
+ LD B,0
+ LDIR
+ POP HL
+ EX AF,AF'
+ SET PATH_PR,A
+ EX AF,AF'
+ JP .PAT0
+;!TODO перенести/заменить на общий
+TMPBUF: DB " ",#00 ; 12 пробелов
+NM_DRIVE: DW NM_DRIVE_A
+NM_NAME: DW NM_NAME_A
+NM_EXTN: DW NM_EXTN_A
+NM_PATH: DW NM_PATH_A
+NM_DRIVE_A: BLOCK 9,0
+NM_NAME_A: DB " ",#00 ; 12 пробелов
+NM_EXTN_A: DB " ",0
+NM_PATH_A EQU CORE_BUFFERS.BUFFER ;DS 256 ;!!!!! shared buffer
+
+
diff --git a/DSS/API/Execute.ASM b/DSS/API/Execute.ASM
new file mode 100644
index 0000000..b830d56
--- /dev/null
+++ b/DSS/API/Execute.ASM
@@ -0,0 +1,791 @@
+
+;[BEGIN]
+;//MODULE: EXECUTE
+;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
+;//UPDATE: 24-10-1999 DNS Restore module
+;-------------------------------------------------------------------------------------------------------------------------
+;Rev Date Name Description
+;-------------------------------------------------------------------------------------------------------------------------
+;R12 20-07-2023 BAO При завершении приложения "аварийно" в возвращаемое приложение передаётся код ошибки и флаг CF=1
+;R11 17-04-2023 BAO OPTIMIZED BUFFERS, FREED UP 768 BYTES FOR CODE
+;R09 -- 14-04-2003 DNS NOW EXEC DON'T FOLLOW TO PROGRAM'S DIR
+;R08 05-12-2002 DNS FIX BUG WITH INCREMENT TASK ID AND OPEN *.EXE ERROR
+;R07 05-12-2002 DNS FIX FOR EXECUTING IN CURRENT DIR WITHOUT PATH
+;R06 02-12-2002 DNS FIX BUG WITH NULL-TERMINATED STRING
+;R05 02-12-2002 DNS ADD APP_PATH TO THE PROGRAM PREFIX
+;R04 26-11-2002 DNS TRY TO FIX EXEC WITH PATH
+;R03 19-11-2002 DNS CHECK SUBFN. FOR FN. EXEC
+;R02 24-05-1999 DNS FIX CREATE PSP AND
+; MOVE EXEC STACK
+; 14-05-1999 DNS DECREASE HEADER SIZE FOR EXE-FILE
+;-------------------------------------------------------------------------------------------------------------------------
+RELATIVE_DIR EQU 0
+ABSOLUTE_DIR EQU 1
+
+ MACRO _mINCTASK
+ LD HL,TASK ;R08
+ INC (HL) ;R08
+ ENDM
+;
+ MACRO _mDECTASK
+ LD HL,TASK ;R08
+ DEC (HL) ;R08
+ ENDM
+;-------------------------------------------------------------------------------------------------------------------------
+
+;;;
+;TMP_CURDIR_AUTO EQU #FB00
+; не нужно если SAVE_PATH_MACRO = 1
+; TMP_CURDIR EQU #FD00
+
+
+;///////////////////////////////////////////////////////////////////////
+; Функция #40. Выполнить файл.
+;
+; вход: HL - указатель на имя файла
+; B=0 - загрузить и выполнить программу с коротким именем (без полного пути до программы)
+; B=1 - загрузить и выполнить программу с полным путём до программы
+; выход: A - код завершения, если CF=0
+; код ошибки, если CF=1
+;---------------------------------------------------------------------
+; Загрузить и выполнить программу.
+; функ. #40, B=0.
+;
+; 1) Открывает exe-файл на чтение;
+; 2) Считывает в рабочую область префикс exe-файла;
+; 3) Выделяет блок памяти, требуемый для загрузки всего файла или первичного
+; загрузчика, если его размер не равен нулю;
+; 4) Сохраняет стек;
+; 5) Подключает страницы из выделенного блока;
+; 6) Строит префикс запуска программы и устанавливает на него регистр IX;
+; 7) Считывает файл по адресу указанному в смещении 16 (Адрес расположения
+; кода в памяти);
+; 8) Закрывает exe-файл, если это не первичный загрузчик;
+; 9) Устанавливает стек равным значению из смещения 20 (Адрес расп. стека);
+; 10) Передает управление по адресу указанному в смещении 18 (Адрес запуска);
+;
+; Префикс запуска файла:
+;
+; -03 1 db ? ; Дескриптор файла, если exe-файл с первичным загрузчиком
+; -02 1 db ? ; Идентификатор блока памяти
+; -01 1 db ? ; Уровень текущей программы
+; +00 1 db ? ; Длина ком-строки
+; +01 127 ds ? ; Параметры ком-строки, заканчивается нулем
+;///////////////////////////////////////////////////////////////////////
+EXEC: LD (CMDLINE),HL
+ INC B ;R03
+ DEC B ;R03
+ JR Z,.VAR_1 ;R03
+ DEC B ;R03
+ JR Z,.VAR_2 ;R03
+ LD A,DSS_Error.sys.INVALID_FUNCTION ;R03
+ SCF ;R03
+ RET ;R03
+ ;
+.VAR_1: ;LD (CMDLINE),HL
+ CALL CHECKPATH ;CHECK FOR '\' - SHORT/FULL NAME
+ ;LD HL,(CMDLINE)
+ JR C,EXEC0_SHORT
+.VAR_2: CALL EXEC_1
+ LD A,DSS_Error.sys.FILE_NOT_FOUND
+ SCF
+ RET ; File not found - exit
+
+ ; при выходе с ошибкой, в регистре А - код ошибки
+EXEC_1: ;LD (CMDLINE),HL
+ LD HL,(CMDLINE)
+ LD A,FAT_ATTR.READ_ONLY
+ LD (OPEN_FN.TMP),A
+ CALL SetPath_GetName
+ RET C
+ ; LD HL,TMPNAME
+ ; LD DE,MASKARE
+ CALL MASK
+ RET C
+ CALL TST_EXT
+ RET C
+ _mINCTASK ;R08
+ CALL OPEN_FN.FILE
+ JR C,.Error
+ POP HL ; убираем лишний адрес_возврата_в_вызвавшую_процедуру
+ JP EXEC02 ;R07 CONTINUE EXECUTING PROGRAM
+.Error: _mDECTASK ;R08
+ AND A
+ RET
+ ;JR NC,.noError
+ ;_mDECTASK ;R08
+ ;AND A
+ ;RET
+ ;
+;.noError:
+ ;POP HL ; убираем лишний адрес_возврата_в_вызвавшую_процедуру
+ ;JP EXEC02 ;R07 CONTINUE EXECUTING PROGRAM
+ ;
+ ;SHORT NAME
+ ;TRY TO FIND IN CURRENT DIRECTORY
+EXEC0_SHORT: ; если убрать, то будет как в linux - короткое имя запускает EXE только из прописанных директорий,
+ ; а если нужно запустить файл из текущей директории, то так: ".\run.exe"
+ CALL EXEC_1
+ RET C
+ ;
+ ;FILE NOT FOUND, SEARCHING IN PATH
+ ; GET PATH AND ETC.
+ LD HL,ENVPATH
+ LD DE,ENVPAGE.ENVTEMP
+ LD B,high Dss.Environ.Get
+ CALL ENVIRON
+ LD HL,(CMDLINE)
+ LD DE,CORE_BUFFERS.EXEBUFF
+COPYEXN: LD A,(HL)
+ LDI
+ OR A
+ JR NZ,COPYEXN
+
+ CALL FINDPATH
+ ;[x] 1/10/2023
+ LD A,DSS_Error.sys.FILE_NOT_FOUND
+ RET C
+ ;
+ LD HL,(CMDLINE)
+ JR EXEC.VAR_2
+ ;
+EXEC02: LD (EXE_FM),A
+ LD HL,CORE_BUFFERS.EXEBUFF
+ LD DE,_sEXE_HEADER.UnUsedPoint ; #0080 ;!#0200(512) ;R02
+ LD A,(EXE_FM)
+ CALL READ
+ JP C,ERREXE
+ LD IX,CORE_BUFFERS.EXEBUFF
+ LD HL,(CORE_BUFFERS.EXEBUFF.EXE_EXT)
+ LD DE,'E'+'X'*256
+ ;AND A - не нужно, если бы был CF=1, то чуть выше мы бы ушли на JP C,ERREXE
+ SBC HL,DE
+ LD A,DSS_Error.sys.INVALID_EXE
+ SCF
+ JP NZ,ERREXE
+ ;
+ LD A,MINIMUM_EXE_VERSION
+ CP (IX + _sEXE_HEADER.VERSION)
+ LD A,DSS_Error.sys.UNKNOWN_EXE
+ JP C,ERREXE
+ ;
+ LD DE,(CORE_BUFFERS.EXEBUFF.LOADER)
+ LD A,E
+ OR D
+ JP NZ,PRELOAD
+ ; A=0
+ LD H,A
+ LD L,A
+ LD XL,A
+ LD XH,A
+ ;
+ LD B,high Dss.Move_FP.FrEnd
+ LD A,(EXE_FM)
+ CALL MOVE_FP
+ LD DE,(CORE_BUFFERS.EXEBUFF.LD_ADDR)
+ LD A,D
+ AND #3F
+ LD D,A
+ ADD IX,DE
+ ;!TEST
+ JR NC,.no_inc_hl
+ INC HL
+ ;LD DE,#0000
+ ;ADC HL,DE
+ ;
+.no_inc_hl: LD A,XH
+ SLA A
+ RL L
+ RL H
+ SLA A
+ RL L
+ RL H
+ OR XL
+ JR Z,.NOINK
+ INC HL
+.NOINK: LD A,H
+ OR A
+ JP NZ,ERREXE0
+ LD B,L
+
+ LD HL,.RET_1
+ LD (_ret),HL
+ JP _TST_PROC
+ ;
+; Запуск без загрузчика
+.RET_1: LD DE,(CORE_BUFFERS.EXEBUFF.LD_ADDR)
+ XOR A
+ LD H,A
+ LD L,A
+ SBC HL,DE
+ EX DE,HL ; de=число чит. байт
+ LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) ; буфер
+ LD A,(EXE_FM) ; дескр. файла
+ CALL READ ; чтение из файла
+ LD A,(EXE_FM) ; дескр. файла
+ CALL CLOSE_FN ; закрыть файл
+ ;
+ JP _TST_PROC_2
+ ;
+RETFAR: LD B,DSS_Error.sys.UNEXPECTED_APP_TRMN
+ JP LEAVE ; завершить программу (процесс)
+
+;-------------------------------------------------
+; Если расш. файла не задано, задать "exe".
+; Если расш. файла задано, сравнить его с "exe".
+;-------------------------------------------------
+TST_EXT: LD HL,EXE_EXT ; "EXE"
+ LD DE,MASKARE+8
+ LD B,3
+ LD A,(DE)
+ CP ' '
+ JR NZ,.loop ; задано расш.
+ LDI
+ LDI
+ LDI
+ XOR A
+ RET
+ ; сравнить расш. с "EXE"
+.loop: LD A,(DE)
+ CP (HL)
+ SCF
+ RET NZ ; не совпадает
+ INC HL
+ INC DE
+ DJNZ .loop
+ XOR A ; Ok
+ RET
+ ;
+ERREXE0: LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY
+ERREXE: PUSH AF
+ LD A,(EXE_FM)
+ CALL CLOSE_FN
+ _mDECTASK
+ POP AF
+ RET
+ ;!TODO сравнить с EXEC02
+PRELOAD: EX DE,HL
+ LD DE,(CORE_BUFFERS.EXEBUFF.LD_ADDR)
+ LD A,D
+ AND #3F
+ LD D,A
+ ADD HL,DE
+ XOR A
+ SLA H
+ RLA
+ SLA H
+ RLA
+ LD B,A
+ LD A,H
+ OR L
+ JR Z,NOINK2
+ INC B
+NOINK2: LD HL,_RET_2
+ LD (_ret),HL
+ JR _TST_PROC
+ ;
+; Запуск с загрузчиком
+_RET_2: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) ; буфер
+ LD DE,(CORE_BUFFERS.EXEBUFF.LOADER) ; число чит. байт
+ LD A,(EXE_FM) ; дескр. файла
+ CALL READ ; чтение из файла
+ JP _TST_PROC_2
+;-------------------------------------------------------------------;[ ]
+_TST_PROC: CALL GETMEM
+ JP C,ERREXE0
+ LD (EXE_MEM),A
+ EXX
+ POP DE ;снимаем со стека адрес возврата
+ LD HL,#0000
+ ADD HL,SP
+ LD SP,(EXSTACK)
+ ; ! Далее стек в нулевой странице! BIOS и не DSS-MAIN не вызывать
+ PUSH HL ; +2 EXSTACK size for 1 task
+ PUSH DE ; +2
+ ;
+ IN A,(SLOT3)
+ LD D,A
+ IN A,(SLOT2)
+ LD E,A
+ IN A,(SLOT1)
+ PUSH DE ; +2
+ PUSH AF ; +2
+ LD (EXSTACK),SP
+ LD SP,HL
+ ; ;
+ EXX
+ ;
+ ;!TEST 27/03/2024
+ LD DE,RAMMAP+3
+ LD A,(EXE_MEM)
+ LD BC,4*256 + BIOS.GetMemPage
+.mem_loop: PUSH AF
+ PUSH BC
+ DEC B
+ RST ToBIOS
+ LD (DE),A
+ DEC DE
+ POP BC
+ POP AF
+ DJNZ .mem_loop
+ ;
+ ; LD DE,RAMMAP
+ ; ;
+ ; LD A,(EXE_MEM)
+ ; LD BC,0*256 + BIOS.GetMemPage
+ ; RST ToBIOS
+ ; LD (DE),A
+ ; INC DE
+ ; ;
+ ; LD A,(EXE_MEM)
+ ; LD BC,1*256 + BIOS.GetMemPage
+ ; RST ToBIOS
+ ; LD (DE),A
+ ; INC DE
+ ; ;
+ ; LD A,(EXE_MEM)
+ ; LD BC,2*256 + BIOS.GetMemPage
+ ; RST ToBIOS
+ ; LD (DE),A
+ ; INC DE
+ ; ;
+ ; LD A,(EXE_MEM)
+ ; LD BC,3*256 + BIOS.GetMemPage
+ ; RST ToBIOS
+ ; LD (DE),A
+ ;
+ ;
+ LD HL,(CMDLINE)
+ LD DE,CORE_BUFFERS.BUFFER+1
+ CALL SCOPYS
+ LD A,#80 ;!HARDCODE cmd line size
+ SUB B
+ LD (CORE_BUFFERS.BUFFER),A
+ ;
+ LD SP,CORE_BUFFERS.EXEBUFF + _sEXE_HEADER ;R02
+ ; ! Далее стек в нулевой странице! BIOS и не DSS-MAIN не вызывать
+ LD A,SHARED_PAGE
+ OUT (SLOT1),A
+ OUT (SLOT2),A
+ OUT (SLOT3),A
+ LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR)
+ LD DE,RAMMAP
+ LD A,H
+ AND #C0
+ ;!TEST
+ CP #80
+ JR Z,FR8000
+ JR NC,FRC000
+ ;
+FR4000: LD A,(DE)
+ OUT (SLOT1),A
+ INC DE
+FR8000: LD A,(DE)
+ OUT (SLOT2),A
+ INC DE
+FRC000: LD A,(DE)
+ OUT (SLOT3),A
+ CALL M_PSP
+ ;
+ LD HL,(CORE_BUFFERS.EXEBUFF.OFFCOD2)
+ LD IX,(CORE_BUFFERS.EXEBUFF.OFFCOD1)
+ LD B,high Dss.Move_FP.FrStart
+ LD A,(EXE_FM)
+ CALL MOVE_FP
+ ;
+ LD SP,#403F ;R02 ;!HARDCODE STACK before start EXE. Устанавливается когда воткнуты SHARED_PAGE
+_ret+1: JP 0 ;EXEC02.RET1 или _RET_2
+
+_TST_PROC_2: LD SP,(CORE_BUFFERS.EXEBUFF.SP_REG)
+ LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR)
+ LD DE,#0080 ;!HARDCODE CLP_Buffer
+ XOR A
+ SBC HL,DE
+ EX DE,HL
+ LD XH,D
+ LD XL,E
+ LD HL,(CORE_BUFFERS.EXEBUFF.PC_REG)
+ LD DE,RETFAR ; адрес п/п "неожиданное завершение процесса"
+ PUSH DE
+ PUSH HL
+ ;!TEST Current Dir ;[x] 15/10/23
+ PUSH IX
+ LD HL,CORE_BUFFERS.CurrentPath
+ LD A,(CORE_BUFFERS.EXEBUFF.VERSION)
+ ;
+ OR A
+ JR NZ,.set_path
+ CALL DIR_PATH_CHANGE.FullCurrent
+ LD HL,CORE_BUFFERS.CurrentPath
+.set_path: CALL CHDIR_FN
+ POP IX
+ ;
+ RET
+;-----------------------------------------------------------------------
+; ! вызывается когда стек в нулевой странице!
+M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR)
+ DEC H
+ LD D,H
+ LD E,L
+ INC DE
+ LD BC,#00FF ;!HARDCODE
+ LD (HL),B
+ LDIR
+ EX DE,HL
+ DEC H
+ LD DE,#0080
+ ADD HL,DE
+ EX DE,HL
+ LD XH,D
+ LD XL,E
+ LD HL,CORE_BUFFERS.BUFFER
+ LD C,(HL)
+ INC C
+ LDIR
+ EX DE,HL ;R06
+ LD (HL),B
+ LD A,(TASK)
+ LD (IX-1),A
+ LD A,(EXE_MEM)
+ LD (IX-2),A
+ LD A,(EXE_FM)
+ LD (IX-3),A
+ ;R05
+ INC HL
+ LD (HL),B
+ INC HL
+ ;!FIXIT тут восстанавливать правильный каталог
+ CALL CURDISK
+ ADD A,'A'
+ LD (HL),A
+ INC HL
+ LD A,':'
+ LD (HL),A
+ INC HL
+ PUSH HL
+ CALL CURRDIR
+ ;
+ POP HL
+ XOR A
+ LD BC,#0100 ;!FIXIT нет привязки к CurrentDirectory.DEPTH
+ CPIR ;!FIXIT нет проверки на выход по BC=0
+ DEC HL
+ DEC HL
+ LD A,'\' ;
+ CP (HL)
+ INC HL
+ JR Z,.YP_ESLA
+ LD (HL),A
+ INC HL
+.YP_ESLA: EX DE,HL
+ LD HL,TMPNAME
+.loop: LD A,(HL)
+ LDI
+ CP ' '+1
+ JR NC,.loop
+ DEC DE
+ XOR A
+ LD (DE),A
+ LD (APPINFO.LAST_PSP_PTR),IX
+ ;
+ RET
+ ;
+SCOPYS: LD BC,#80*256 + ' '+1 ;!HARDCODE cmd line size
+.loop: LD A,(HL)
+ CP C
+ JR C,.copy
+ INC HL
+ DJNZ .loop
+ XOR A
+ LD (DE),A
+ LD B,#80
+ RET
+ ;
+.copy: LD BC,#80*256 + ' ' ;!HARDCODE cmd line size
+.loop2: LD A,(HL)
+ LD (DE),A
+ INC HL
+ INC DE
+ CP C
+ RET C
+ DJNZ .loop2
+ RET
+;---------------------------------------------------------------------
+ENVPATH: DB "PATH=",0
+EXE_EXT: DB "EXE"
+TASK: DB #01 ; уровень текущей программы
+;
+RAMMAP: DB #00,#00,#00,#00
+ErrorLevel: DB #00 ; код завершения программы (процесса)
+EXE_FM: DB #00 ; дескр. файла
+EXE_MEM: DB #00 ; идентификатор блока памяти
+CMDLINE: DW #0000
+EXSTACK: DW CORE_BUFFERS.XSTACK.Spoint ; адрес стека
+;/////////////////////////////////////////////////////////////////////
+
+
+
+;/////////////////////////////////////////////////////////////////////
+; Функция #41. Завершить программу (процесс).
+;
+; вход: B - код завершения
+; выход: A - код ошибки, если CF=1
+;
+; Выход из EXE-файла:
+;
+; 1) Освобождаются все блоки памяти которые выделялись данному приложению.
+; 2) Закрываются все файлы открытые приложением
+; 3) Восстанавливаются страницы которые были подключены до запуска EXE-файла.
+; 4) Вспоминается стек.
+; 5) В регистр A помещается код возврата и выполняется RET.
+;
+;/////////////////////////////////////////////////////////////////////
+LEAVE: LD A,R
+ PUSH AF ; INT ON/OFF
+ DI
+ ;
+ LD A,B
+ LD (ErrorLevel),A
+ CALL FREE_PROCESS_MEMORY
+ ;[x] 10/12/23 close EXE FMs
+ CALL FREE_PROCESS_FMs
+ ;
+ _mDECTASK
+ ;
+ POP DE ; INT ON/OFF
+ LD SP,(EXSTACK)
+ ; тут стек в нулевой странице!
+ POP AF ; -2 EXSTACK size for 1 task
+ POP HL ; -2
+ OUT (SLOT1),A
+ LD A,L
+ OUT (SLOT2),A
+ LD A,H
+ OUT (SLOT3),A
+ ;
+ LD A,E ; INT ON/OFF
+ POP DE ; -2
+ POP HL ; -2
+ LD (EXSTACK),SP
+ LD SP,HL
+ ;
+ ;!TEST
+ AND %0000'0100 ; PO/PE flag
+ JR Z,.no_ei
+ EI
+.no_ei: ;
+ EX DE,HL
+ LD A,(ErrorLevel)
+ ;R12
+ CP DSS_Error.sys.UNEXPECTED_APP_TRMN
+ JR Z,.error_exit
+ CP DSS_Error.sys.USER_ABORT
+ JR NZ,.norm_exit
+.error_exit: SCF
+ JP (HL)
+ ;
+.norm_exit: AND A
+ JP (HL)
+;/////////////////////////////////////////////////////////////////////
+
+;/////////////////////////////////////////////////////////////////////
+; Функция #42. Получить код завершения программы.
+;
+; вход: нет
+; выход: A - код завершения
+;/////////////////////////////////////////////////////////////////////
+GET_ERR: LD A,(ErrorLevel)
+ AND A
+ RET
+;/////////////////////////////////////////////////////////////////////
+
+;-----------------------------------------------------------------------
+FREE_PROCESS_MEMORY:
+ ;LD HL,MEMTAB
+ LD HL,CORE_BUFFERS.MemoryTable ; массив списка выдел. страниц
+ LD BC,256 ;!HARDCODE размер блока страниц ОЗУ
+.loop: LD A,(TASK)
+ CPIR
+ RET NZ
+ PUSH HL
+ PUSH BC
+ DEC HL
+ AND A
+ ;LD DE,MEMTAB
+ LD DE,CORE_BUFFERS.MemoryTable ; массив списка выдел. страниц
+ SBC HL,DE
+ LD A,L
+ CALL RETMEM ; освоб. блок памяти
+ POP BC
+ POP HL
+ JP .loop
+;-----------------------------------------------------------------------
+
+
+;-----------------------------------------------------------------------
+FREE_PROCESS_FMs:
+ LD IY,CORE_BUFFERS.FM_BUF - CORE_BUFFERS.FM_BUF.Size
+ LD DE,CORE_BUFFERS.FM_BUF.Size
+ LD B,FMCOUNT+1
+ LD A,(TASK)
+.loop: ADD IY,DE
+ CP (IY+_sFM.TASK_NUM)
+ JR NZ,.next
+ ; close fm
+ PUSH AF
+ XOR A
+ OR (IY+_sFM.TASK_NUM)
+ JR Z,.skip
+ PUSH IY
+ PUSH DE
+ LD A,FMCOUNT+1
+ SUB B
+ PUSH BC
+ CALL CLOSE_FN
+ POP BC
+ POP DE
+ POP IY
+.skip: POP AF
+ ;
+.next: DJNZ .loop
+ RET
+ ;
+;-----------------------------------------------------------------------
+
+
+;-----------------------------------------------------------------------
+CHECKPATH: ; !TODO сделать проверку на количество циклов
+ LD A,(HL)
+ INC HL
+ CP '\'
+ RET Z
+ ; CP '/' ;ALT SLASH
+ ; RET Z
+ CP " "+1
+ JR NC,CHECKPATH
+ RET
+;-----------------------------------------------------------------------
+
+
+;-----------------------------------------------------------------------
+FINDPATH:
+ SET_PAGE_X ENVPAGE
+ PUSH AF
+ ;!TEST
+ ;CALL CURRDSK_FN
+ ;ADD A,"A"
+ ;LD HL,TMP_CURDIR
+ ;LD (HL),A
+ ;INC HL
+ ;LD A,":"
+ ;LD (HL),A
+ ;INC HL
+ ;CALL CURRDIR_FN
+ ;
+ CALL .MAKE_PATH_ARRAY
+ LD HL,ENVPAGE.PATH_PNT_ARRAY
+.NEXTPATHI:
+ LD E,(HL)
+ INC HL
+ LD D,(HL)
+ INC HL
+ BIT ABSOLUTE_DIR,(HL)
+ INC HL
+ PUSH HL
+ PUSH BC
+ EX DE,HL
+ CALL Z,.GOTO_CURDIR
+ CALL NZ,CHDIR
+ JR C,.BADPATH
+ LD HL,CORE_BUFFERS.EXEBUFF
+ CALL MASK.name
+ JR C,.BADPATH
+ CALL TST_EXT
+ JR C,.BADPATH
+ CALL SEARCH.File
+.BADPATH:
+ POP BC
+ POP HL
+ JR NC,.PATHFOUND
+ DJNZ .NEXTPATHI
+ SCF
+.PATHFOUND:
+ POP BC
+ LD A,B
+ OUT (SLOT3),A
+ LD A,DSS_Error.sys.PATH_NOT_FOUND
+ RET
+.GOTO_CURDIR:
+ PUSH AF
+ PUSH HL
+ LD HL,CORE_BUFFERS.CurrentDirectory
+ CALL CHDIR
+ POP HL
+ POP AF
+ RET
+.MAKE_PATH_ARRAY:
+ LD HL,ENVPAGE.PATH_PNT_ARRAY-1 ;R04 -1
+ LD DE,ENVPAGE.ENVTEMP-1
+ LD B,#00
+.NEXTAR:
+ LD (HL),C ;R04
+ INC HL ;R04
+ XOR A
+ LD (DE),A
+ LD C,A
+ INC DE
+ LD (HL),E
+ INC HL
+ LD (HL),D
+ INC HL
+;R04 LD (HL),C
+;R04 INC HL
+ INC B
+.NEXTRT:
+ LD A,(DE)
+ CP '\'
+ JR NZ,.NEXTCH
+.NEXTDR:
+ SET ABSOLUTE_DIR,C
+.NEXTRL:
+ ;SET RELATIVE_DIR,C ;!TODO ????
+.NEXTCH:
+ LD A,(DE)
+ CP ";"
+ JR Z,.NEXTAR
+ INC DE
+; CP "."
+; JR Z,NEXTRL
+ CP ":"
+ JR Z,.NEXTRT
+ OR A
+ JR NZ,.NEXTCH
+ LD (HL),C ;R04
+ INC HL ;R04
+ LD (HL),A
+ INC HL
+ LD (HL),A
+ RET
+;-----------------------------------------------------------------------
+
+
+;R11 \\\\\\\\\\\\\\\\\\\\\\\\\\\\
+;;
+; EXEBUFF:
+; DB "EXE"
+; DB #00
+; OFFCOD1 DW #0000
+; OFFCOD2 DW #0000
+; LOADER DW #0000
+; DW #0000
+; DW #0000
+; DW #0000
+; LD_ADDR DW #0000
+; PC_REG DW #0000
+; SP_REG DW #0000
+; BLOCK 512-($-EXEBUFF),0
+; ;(!!!HERE STACK FOR EXEC!!!)
+; BLOCK 255,0
+; XSTACK DB #00
+;R11 ////////////////////////////
+;
\ No newline at end of file
diff --git a/DSS/API/Find.asm b/DSS/API/Find.asm
new file mode 100644
index 0000000..50ba524
--- /dev/null
+++ b/DSS/API/Find.asm
@@ -0,0 +1,121 @@
+////////////////////////////////////////////////////////////////////////
+;Входные значения:
+; C - #19
+; HL - указатель на файловую спецификацию
+; DE - рабочий буфер 44 байта, если B=0, иначе 256 байт
+; A - атрибуты, используемые при поиске
+; B = #00 - имя найденного файла в формате 11 байт "FilenameExt"
+; B = #01 - имя найденного файла в формате DOS "filename.ext",0
+; поиск без ограничение на размер каталога:
+; !TODO B = #02 - имя найденного файла в формате DOS + LFN
+; !TODO B = #80 - имя найденного файла в формате 11 байт "FilenameExt"
+; !TODO B = #81 - имя найденного файла в формате DOS "filename.ext",0
+;Выходные значения:
+; A - код ошибки, если CF=1
+////////////////////////////////////////////////////////////////////////
+F_FIRST_FN: CALL F_FIRST.INIT_VARS
+ PUSH HL
+ ;!TEST Current Dir ;[x] 15/10/23
+ CALL DIR_PATH_CHECK
+ POP HL
+ RET C
+ ;
+ JR F_FIRST.begin
+ ;
+F_FIRST: CALL .INIT_VARS
+.begin: CALL SetPath_GetName
+ ;CALL LOADDIR
+ RET C
+ CALL MASK
+ RET C
+ LD A,(.SEARCH_ATTRIBUT)
+ CALL SEARCH.Custom
+ RET C
+ LD HL,MASKARE
+.DTABUF+1: LD DE,0
+ LD BC,FAT_DIRECTORY_RECORD.ATTRIBUT ; копируем .NAME и .EXT
+ LDIR
+.SEARCH_ATTRIBUT+1:
+ LD A,0 ; DSS_FCB_MAIN.SEARCH_ATTRIBUT
+ LD (DE),A
+.FIND_S: INC DE
+ ;!TODO лучше тут использовать как в record index для перебора каталога > #4000 bytes
+ LD BC,FAT_DIRECTORY_RECORD
+ ADD IX,BC
+ LD (F_NEXT.CURHND),IX
+ LD HL,HANDBUF + FAT_DIRECTORY_RECORD.RESERVED_NT
+ LD BC,HANDBUF.SIZE - FAT_DIRECTORY_RECORD.RESERVED_NT
+ LDIR
+ LD A,(HANDBUF + FAT_DIRECTORY_RECORD.ATTRIBUT)
+ LD (DE),A
+ INC DE
+ LD HL,HANDBUF
+.FNDMODE+1: LD A,0
+ OR A
+ JR NZ,.FIND_M2
+ LD BC,11 ;!HARDCODE
+ LDIR
+.exit: LD A,F_NEXT.NO_NEXT.NO
+ LD (F_NEXT.NO_NEXT),A
+ XOR A
+ RET
+.FIND_M2: ;!TODO LFN
+ ;CP 2
+ ;CALL NC,GetName_LFN
+ ;CALL C,GetName
+ ;
+ CALL GetName
+ JR .exit
+ ;
+.INIT_VARS: LD (.SEARCH_ATTRIBUT),A
+ LD (.DTABUF),DE
+ LD A,B
+ LD (.FNDMODE),A
+ RET
+////////////////////////////////////////////////////////////////////////
+;
+;
+////////////////////////////////////////////////////////////////////////
+F_NEXT:
+.NO_NEXT.YES EQU 0
+.NO_NEXT.NO EQU #FF
+.NO_NEXT+1:
+ LD A,0
+ OR A
+ LD A,DSS_Error.sys.INVALID_ACCESS
+ SCF
+ RET Z
+ LD (F_FIRST.DTABUF),DE
+ EX DE,HL
+ LD DE,MASKARE
+ LD BC,11 ;!HARDCODE
+ LDIR
+
+ XOR A ; F_NEXT.NO_NEXT.YES
+ LD (F_NEXT.NO_NEXT),A
+
+ LD A,(HL)
+ PUSH HL
+ CALL .NSEARCH
+ POP DE
+ RET C
+ JP F_FIRST.FIND_S
+.NSEARCH:
+ EX AF,AF'
+ SET_PAGE_X DIRPAGE
+ ;PUSH AF
+ EX AF,AF'
+ CPL
+ LD C,A
+ ;!TEST 9/11/23 record index
+ ; EXX
+ ; LD DE,0
+ ; EXX
+ ;
+.CURHND+2:
+ LD IX,0
+ LD A,XH
+ OR XL
+ JP Z,SEARCH.error_too_many_files
+ JP SEARCH.loop
+;
\ No newline at end of file
diff --git a/DSS/API/FreeMem.asm b/DSS/API/FreeMem.asm
new file mode 100644
index 0000000..0b8bf33
--- /dev/null
+++ b/DSS/API/FreeMem.asm
@@ -0,0 +1,10 @@
+//////////////////////////////////////////////////////////////////////
+; Функция #3C. Информация о памяти.
+;
+; вход: нет
+; выход: HL - общее кол-во страниц
+; BC - кол-во своб. страниц
+//////////////////////////////////////////////////////////////////////
+FREEMEM: LD C,BIOS.GetMemSize
+ JP ToBIOS
+;
\ No newline at end of file
diff --git a/DSS/API/GSwitch.asm b/DSS/API/GSwitch.asm
new file mode 100644
index 0000000..0d5ce7b
--- /dev/null
+++ b/DSS/API/GSwitch.asm
@@ -0,0 +1,31 @@
+//////////////////////////////////////////////////////////////////////
+; Функция #43. Выделить параметр командной строки.
+;
+; вход: HL - указатель командной строки
+; DE - буфер для выдел. параметра
+; выход: HL - указатель на след. параметр ком-строки
+; CF=0 - конец строки не достигнут (есть другие параметры)
+; CF=1 - конец строки (в буфер перенесён последний параметр или ноль)
+;
+;ENTRY: HL - COMMAND LINE
+; DE - SWITCH BUFFER
+;EXIT: BUFFER
+//////////////////////////////////////////////////////////////////////
+GSWITCH: XOR A
+ LD (DE),A
+.loop1: LD A,(HL)
+ INC HL
+ CP " "
+ RET C
+ JR Z,.loop1
+.loop2: LD (DE),A
+ LD A,(HL)
+ INC HL
+ INC DE
+ CP " "+1
+ JR NC,.loop2
+ CP " "
+ LD A,0
+ LD (DE),A
+ RET
+;
\ No newline at end of file
diff --git a/DSS/API/GetDateTime.asm b/DSS/API/GetDateTime.asm
new file mode 100644
index 0000000..6cdec69
--- /dev/null
+++ b/DSS/API/GetDateTime.asm
@@ -0,0 +1,24 @@
+////////////////////////////////////////////////////////////////////////
+; Функция #17. Информация о дате и времени файла.
+;
+; вход: A - дескриптор файла
+; выход: D - день
+; E - месяц
+; IX - год
+; H - час
+; L - минуты
+; B - секунды
+; A - код ошибки, если CF=1
+////////////////////////////////////////////////////////////////////////
+GET_D_T:
+ CALL SET_FM
+ RET C
+ ; время/дату из структуры дескр.
+ LD E,(IY+_sFM.FS_REC.TIME) ; время
+ LD D,(IY+_sFM.FS_REC.TIME+1) ;
+ LD C,(IY+_sFM.FS_REC.DATE) ; дата
+ LD B,(IY+_sFM.FS_REC.DATE+1) ;
+ CALL RMKTIME ; раскодировать время/дату
+ AND A
+ RET
+;
\ No newline at end of file
diff --git a/DSS/API/GetMem.asm b/DSS/API/GetMem.asm
new file mode 100644
index 0000000..42e5ff3
--- /dev/null
+++ b/DSS/API/GetMem.asm
@@ -0,0 +1,19 @@
+//////////////////////////////////////////////////////////////////////
+; Функция #3D. Выделение блока памяти.
+;
+; вход: B - размер блока в страницах по 16kB
+; выход: A - идентификатор блока памяти, если CF=0
+; A - код ошибки, если CF=1
+//////////////////////////////////////////////////////////////////////
+GETMEM: LD C,BIOS.GetMem
+ RST ToBIOS
+ LD E,A
+ LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY
+ RET C
+ LD D,#00
+ LD HL,CORE_BUFFERS.MemoryTable ; массив списка выдел. страниц
+ ADD HL,DE
+ LD A,(TASK) ; уровень текущей программы
+ LD (HL),A
+ LD A,E
+ RET
\ No newline at end of file
diff --git a/DSS/API/GetVMod.asm b/DSS/API/GetVMod.asm
new file mode 100644
index 0000000..db35484
--- /dev/null
+++ b/DSS/API/GetVMod.asm
@@ -0,0 +1,14 @@
+;///////////////////////////////////////////////////////////////////////
+; Функция #51. Получить текущий режим экрана.
+;
+; вход: нет
+; выход: A - текущий режим экрана
+; B - страница экрана 0/1
+;///////////////////////////////////////////////////////////////////////
+GETVMOD:
+ IN A,(SCREEN_SWITCH)
+ LD B,A
+ LD A,(VMODE)
+ AND A
+ RET
+;///////////////////////////////////////////////////////////////////////
\ No newline at end of file
diff --git a/DSS/API/Lib_Sub.asm b/DSS/API/Lib_Sub.asm
new file mode 100644
index 0000000..48bb066
--- /dev/null
+++ b/DSS/API/Lib_Sub.asm
@@ -0,0 +1,14 @@
+;[ ] 11/02/2024 - Функция с пополняемыми подфункциями)))
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; B = 1 Вызов функции SETUP_CURSORS для восстановления системных шрифтов DSS ;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+LIB_SUB:
+ DJNZ .B_2
+ ; func B = 1
+ JP SETUP_CURSORS
+ ;
+.B_2: ; func B > 1 or 0
+ SCF
+ RET
+ ;
+;
\ No newline at end of file
diff --git a/DSS/API/Locate.asm b/DSS/API/Locate.asm
new file mode 100644
index 0000000..b0c96a2
--- /dev/null
+++ b/DSS/API/Locate.asm
@@ -0,0 +1,10 @@
+;///////////////////////////////////////////////////////////////////////
+; Функция #52. Установить положение курсора.
+;
+; вход: D - строка курсора
+; E - колонка курсора
+; выход: нет
+;///////////////////////////////////////////////////////////////////////
+LOCATE: LD C,BIOS.LP_SET_PLACE
+ JP ToBIOS
+;///////////////////////////////////////////////////////////////////////
\ No newline at end of file
diff --git a/DSS/API/MkDir.asm b/DSS/API/MkDir.asm
new file mode 100644
index 0000000..6bf4046
--- /dev/null
+++ b/DSS/API/MkDir.asm
@@ -0,0 +1,197 @@
+; [x] fat32 ;!TEST
+////////////////////////////////////////////////////////////////////////
+; Функция #1B. Создание каталога.
+;
+; вход: HL - указатель на имя каталога
+; выход: A - код ошибки, если CF=1
+;
+; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0
+////////////////////////////////////////////////////////////////////////
+MKDIR:
+;error
+.DIR_EXISTS: LD A,DSS_Error.sys.DIR_EXISTS
+ CCF
+ RET
+ ;
+; Entry point ;!TEST Current Dir ;[x] 15/10/23
+.B: PUSH HL
+ CALL DIR_PATH_CHECK
+ POP HL
+ RET C
+ CALL .START
+ PUSH AF
+ LD HL,CORE_BUFFERS.CurrentDirectory
+ CALL CHDIR
+ POP AF
+ RET
+ ;
+.START: CALL SetPath_GetName ; тест на допуст. имя и настр. на диск
+ RET C
+ ; [ ] 26/06/2024
+ CALL CHECK_64kb_CLUSTER
+ RET C
+ ;
+ CALL MASK
+ RET C
+ ;!TEST optimization ранее SetPath_GetName уже загрузил директорию
+ ;CALL LOADDIR ; прочитать список каталога
+ ;
+ CALL SEARCH.Dir ; поиск записи каталога в списке диска
+ ; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024
+ ; LD A,DSS_Error.sys.DIR_EXISTS
+ ; CCF
+ ; RET C ; каталог найден
+ JR NC,.DIR_EXISTS
+ CP DSS_Error.sys.FILE_NOT_FOUND
+ SCF
+ RET NZ
+ ;
+ CALL G_CLUST
+ RET C
+ ; fat32
+ PUSH HL ; младший номер сектора
+ EXX
+ PUSH HL ; старший номер сектора
+ EXX
+ ;
+ XOR A ; уменьшить
+ CALL SET_NEW_FREE_CLUSTERS ; [ ] free clusters for FSInfo
+ ;
+ CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера
+ CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск
+ LD HL,MASKARE
+ LD DE,HANDBUF
+ LD BC,11
+ LDIR
+ EX DE,HL
+ LD A,FAT_ATTR.DIRECTORY ; атрибут записи каталога
+ ; FAT_DIRECTORY_RECORD.ATTRIBUT
+ LD (HL),A
+ INC HL
+ LD BC,#0800 ; b=счетчик
+ ;
+.loop1: LD (HL),C
+ INC HL
+ DJNZ .loop1
+ ; FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H
+ ; fat32 запись старшего номера кластера .FIRST_CLUSTER_H
+ POP DE
+ PUSH DE ; старший номер сектора
+ LD (HL),E
+ INC HL
+ LD (HL),D
+ INC HL
+ ;
+ CALL WRITE_DATE_TIME_TO_DIRECTORY_RECORD
+ ; запись младшего номера кластера .FIRST_CLUSTER_L
+ POP BC ; старший номер сектора
+ POP DE ; младший номер сектора
+ PUSH DE
+ PUSH BC
+ ; FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L
+ LD (HL),E
+ INC HL
+ LD (HL),D
+ INC HL
+ ; FAT_DIRECTORY_RECORD.F_SIZE
+ LD BC,#0400 ; b=счетчик
+.loop2: LD (HL),C
+ INC HL
+ DJNZ .loop2
+ ;
+ CALL WRT_HND ; скопир. новую запись в список диска (каталога)
+ ;CALL SAVEDIR ; и сбросить кеш каталога на диск
+ ;
+ ; создаём служебные каталоги "." и ".." в созданном каталоге
+ ; КАТАЛОГ "."
+ LD HL,CORE_BUFFERS.SECTOR_BUFFER ; буфер
+ LD (HL),"." ; запись тек. каталога
+ LD BC,10*256 + ' ' ; !HARDCODE b=счетчик, c=пробел
+ ;
+.loop3: INC HL
+ LD (HL),C
+ DJNZ .loop3
+ ; скопировать байты 11..31 FAT_DIRECTORY_RECORD
+ INC HL
+ LD DE,HANDBUF+FAT_DIRECTORY_RECORD.ATTRIBUT ; ячейка атрибутов файла
+ EX DE,HL
+ LD BC,21 ; !HARDCODE
+ LDIR
+ ; КАТАЛОГ ".."
+ EX DE,HL
+ LD (HL),"." ; запись родит. каталога
+ INC HL
+ LD (HL),"."
+ LD BC,9*256 + ' ' ; b=счетчик, c=пробел
+.loop4: INC HL
+ LD (HL),C
+ DJNZ .loop4
+ ;
+ INC HL
+ SET_PAGE_X DIRPAGE
+ PUSH AF
+ ;
+ LD DE,DIRPAGE.buffer + FAT_DIRECTORY_RECORD.ATTRIBUT ; атрибуты записи
+ ;
+ LD A,(DIRPAGE.buffer)
+ CP "."
+ JR Z,.copy_dir_record
+ ;
+ ;LD IX,HANDBUF
+ XOR A
+ LD (HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L),A
+ LD (HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1),A
+ LD (HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H),A
+ LD (HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1),A
+ LD DE,HANDBUF + FAT_DIRECTORY_RECORD.ATTRIBUT ; ячейка атрибутов файла
+.copy_dir_record:
+ EX DE,HL
+ LD BC,HANDBUF.SIZE - FAT_DIRECTORY_RECORD.ATTRIBUT ; 21
+ LDIR
+ POP AF
+ OUT (SLOT3),A
+ ;
+ EX DE,HL
+ LD D,H
+ LD E,L
+ INC DE
+ LD (HL),0
+ LD BC,512-65 ;!HARDCODE ;!FIXIT ; [ ] sector size
+ LDIR
+ ;
+ POP HL ; старший номер сектора
+ EXX
+ POP HL ; младший номер сектора
+ CALL CLUSTER_TO_SECTOR
+ LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster) ; секторов на кластер
+.MKD12: PUSH AF
+ PUSH HL ; ст. разряд
+ PUSH IX ; номер лог. сектора
+ ;
+ CALL WRITE_SECTOR
+ ; !FIXIT нет проверки на ошибку
+ ;
+ LD HL,CORE_BUFFERS.SECTOR_BUFFER
+ ; [x] optimization
+ LD A,(HL)
+ OR A
+ JR Z,.skip_clean
+ ;
+ LD DE,CORE_BUFFERS.SECTOR_BUFFER+1
+ LD BC,511 ;!HARDCODE ;!FIXIT ; [ ] sector size
+ LD (HL),0
+ LDIR
+.skip_clean: ;
+ POP IX
+ POP HL
+ INC IX
+ LD A,XH
+ OR XL
+ JR NZ,.MKD11
+ INC HL
+.MKD11 POP AF
+ DEC A
+ JR NZ,.MKD12
+ AND A
+ RET
+;
\ No newline at end of file
diff --git a/DSS/API/Move_FP.asm b/DSS/API/Move_FP.asm
new file mode 100644
index 0000000..829277e
--- /dev/null
+++ b/DSS/API/Move_FP.asm
@@ -0,0 +1,41 @@
+; HL:IX - OFFSET POINTER
+; A - FILE MANIPULATOR
+MOVE_FP: CALL SET_FM
+ RET C
+ INC B
+ DJNZ .B_1
+ ;from Start File
+ ; B=0
+.F_start: LD C,B
+ LD D,B
+ LD E,B
+ JP .DO
+ ;
+.B_1: DJNZ .B_2
+ ;from Current Position
+.F_current: LD C,(IY+_sFM.F_POSITION)
+ LD B,(IY+_sFM.F_POSITION+1)
+ LD E,(IY+_sFM.F_POSITION+2)
+ LD D,(IY+_sFM.F_POSITION+3)
+.DO: ADD IX,BC
+ ADC HL,DE
+ LD D,XH
+ LD E,XL
+ LD (IY+_sFM.F_POSITION),E
+ LD (IY+_sFM.F_POSITION+1),D
+ LD (IY+_sFM.F_POSITION+2),L
+ LD (IY+_sFM.F_POSITION+3),H
+ XOR A
+ RET
+ ;
+.B_2: DJNZ .error
+ ;from End File
+.B_end: LD C,(IY + _sFM.FS_REC.F_SIZE)
+ LD B,(IY + _sFM.FS_REC.F_SIZE+1)
+ LD E,(IY + _sFM.FS_REC.F_SIZE+2)
+ LD D,(IY + _sFM.FS_REC.F_SIZE+3)
+ JP .DO
+ ; B > 2
+.error: LD A,DSS_Error.sys.INVALID_FUNCTION
+ SCF
+ RET
diff --git a/DSS/API/Open.asm b/DSS/API/Open.asm
new file mode 100644
index 0000000..02bac41
--- /dev/null
+++ b/DSS/API/Open.asm
@@ -0,0 +1,91 @@
+; [x] fat32 ;!TEST
+////////////////////////////////////////////////////////////////////////
+; Функция #11. Открытие файла.
+;
+; вход: HL - указатель на имя файла
+; A - режим доступа:
+; A=0 чтение/запись
+; A=1 чтение
+; A=2 запись
+; ;!TODO A=3 запись без лишних сохранений кэша FAT
+; ;!TODO A=4 записать кэш FAT
+; выход: CF=0, A - дескриптор файла.
+; CF=1, A - код ошибки.
+////////////////////////////////////////////////////////////////////////
+OPEN_FN: ;!TEST Current Dir ;[x] 15/10/23
+ ;AND #7F ; ACCESS_MODE bit7 - для внутреннего использования))) ;!TODO
+ LD (.TMP),A
+ PUSH HL
+ CALL DIR_PATH_CHECK.forceCheck
+ POP HL
+ RET C
+ ;!FIXIT сделать как в mkdir или rmdir?
+;R008 ;
+;.start: ;
+ CALL SetPath_GetName
+ RET C
+ CALL MASK
+ RET C
+.FILE: CALL SEARCH.File ; enter point from EXEC, CREATE
+ RET C
+;R002 ;!TEST 9/11/23 record index
+.FM: PUSH DE ; сохраняем указатель на запись в каталоге FS (получен из SEARCH)
+ ;
+ CALL GET_FM ; enter point from ATTRIB
+ RET C
+ LD A,C
+ EX AF,AF'
+ ;!TEST 9/11/23 record index указатель на запись в каталоге FS
+ POP DE
+ ; EXX
+ LD (IY+_sFM.HANDLE),E
+ LD (IY+_sFM.HANDLE+1),D
+ ; EXX
+ ;
+ LD D,YH
+ LD E,YL
+ LD HL,HANDBUF
+ LD BC,HANDBUF.SIZE
+ LDIR
+.TMP+1: LD A,0
+ LD (IY+_sFM.ACCESS_MODE),A
+ LD A,(TASK)
+ LD (IY+_sFM.TASK_NUM),A
+ ;!FIXIT оптимизнуть тут зануление
+ XOR A
+ LD (IY+_sFM.OptimizedClusters),A
+ LD (IY+_sFM.KnownCluster_L),A
+ LD (IY+_sFM.KnownCluster_L+1),A
+ LD (IY+_sFM.KnownOffset_L),A
+ LD (IY+_sFM.KnownOffset_L+1),A
+ ; fat32
+ LD (IY+_sFM.KnownCluster_H),A
+ LD (IY+_sFM.KnownCluster_H+1),A
+ LD (IY+_sFM.KnownOffset_H),A
+ LD (IY+_sFM.KnownOffset_H+1),A
+ ;
+ LD (IY+_sFM.F_POSITION),A
+ LD (IY+_sFM.F_POSITION+1),A
+ LD (IY+_sFM.F_POSITION+2),A
+ LD (IY+_sFM.F_POSITION+3),A
+ LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
+ LD (IY+_sFM.DRIVE),A
+ ; fat32
+ LD HL,CORE_BUFFERS.FM_BUF+_sFM.FS_REC.FIRST_CLUSTER_H
+ LD E,(HL)
+ INC HL
+ LD D,(HL)
+ LD (IY+_sFM.DIR_CLUSTER_H),E
+ LD (IY+_sFM.DIR_CLUSTER_H+1),D
+ ;
+ LD HL,CORE_BUFFERS.FM_BUF+_sFM.FS_REC.FIRST_CLUSTER_L ; work directory FM
+ LD E,(HL)
+ INC HL
+ LD D,(HL)
+ LD (IY+_sFM.DIR_CLUSTER_L),E
+ LD (IY+_sFM.DIR_CLUSTER_L+1),D
+ ;
+ EX AF,AF'
+ AND A
+ RET
+;
\ No newline at end of file
diff --git a/DSS/API/PChars.asm b/DSS/API/PChars.asm
new file mode 100644
index 0000000..a9c3bbe
--- /dev/null
+++ b/DSS/API/PChars.asm
@@ -0,0 +1,30 @@
+;///////////////////////////////////////////////////////////////////////
+; Функция #5C. Вывод строки на экран.
+;
+; вход: HL - указатель на строку символов
+; выход: HL - указатель на следующую строку символов
+; PRINT NULL-TERMINATED CHARS STRING
+;///////////////////////////////////////////////////////////////////////
+; PCHARS: LD A,(HL)
+; INC HL
+; OR A
+; RET Z
+; CALL PUTCHAR
+; JP PCHARS
+;///////////////////////////////////////////////////////////////////////
+PCHARS: XOR A ; no attr-mode
+ LD A,(CLEAR.shell_color)
+ LD B,A
+ EX AF,AF'
+ XOR A ; no XY-mode
+ LD C,BIOS.LP_PR_LINE_DIR
+ LD IY,0 ; YH = YL = B
+ JP ToBIOS
+;///////////////////////////////////////////////////////////////////////
+; A - атрибуты выводимого символа если CF'
+; CF - XY-mode
+; DE - место символа в окне, если CF=1
+; HL - адрес с выводимой строкой
+; B - цвет консоли (используется при скролле и очистке окна)
+; IY - два спец.символа для выхода с CF=1. Должны быть равны B, если не нужны
+; CF' - выводить символ с атрибутами
\ No newline at end of file
diff --git a/DSS/API/Print.asm b/DSS/API/Print.asm
new file mode 100644
index 0000000..c8585f7
--- /dev/null
+++ b/DSS/API/Print.asm
@@ -0,0 +1,74 @@
+;///////////////////////////////////////////////////////////////////////
+; Функция #5F. Вывод символа на принтер без ожидания.
+;
+; Интерпретация байта состояния принтера:
+; 0..2 - не используются, обычно уст. в "1"
+; 3 - ошибка принтера - есть/нет (1/0)
+; 4 - принтер подключен/не подключен (1/0)
+; 5 - бумаги нет/есть (1/0)
+; 6 - принтер готов/выводит очередной символ (1/0)
+; 7 - принтер свободен/занят (1/0)
+;
+; вход: A - символ
+; выход: B - символ
+; CF - ошибка, A=байт состояния (биты 7..3)
+;///////////////////////////////////////////////////////////////////////
+Z84_SP:
+.LPT_A EQU Z84.SIO.Ch_B.Ctrl
+.LPT_B EQU Z84.PIO.Port_A.Data
+.LPT1_C EQU Z84.PIO.Port_A.Command
+.LPT2_D EQU Z84.PIO.Port_B.Data
+.LPT2_C EQU Z84.PIO.Port_B.Command
+;
+PRINT: AND A
+ LD B,A ; сохраняем символ
+ ;
+ LD A,R
+ DI
+ PUSH AF
+ ; reg 0
+ XOR A
+ OUT (Z84_SP.LPT_A),A
+ LD A,%0001'0000 ; Reset EXT/STATUS interrupts
+ OUT (Z84_SP.LPT_A),A
+ XOR A
+ OUT (Z84_SP.LPT_A),A
+ IN A,(Z84_SP.LPT_A) ; IN (1Bh): bit 5 - busy, Bit 3 - Ack
+ LD C,A
+ BIT 5,A ; IN (19h): bit 5 - Paper Enable, Bit 3 - Select
+ JR NZ,.LPTBUSY
+ AND %11011000
+ JR Z,.LPTBUSY
+ LD A,B ; восстанавливаем символ
+ OUT (Z84_SP.LPT_B),A
+ POP AF
+ RET PO
+ EI
+ RET
+ ;
+.LPTBUSY: POP AF
+ LD A,C
+ SCF
+ RET PO
+ EI
+ RET
+; ; ;
+
+; B - SYMBOL
+; CF = 1 - PRINTER BUSY
+PRINT_INIT: DI
+ LD A,#CF
+ ; port #1F только чеpез LD BC,1F : Out (BC),reg (в альтере идёт перехват этого порта проца, если он в команде явно указан)
+ LD BC,Z84_SP.LPT2_C
+ OUT (C),A
+ ;[x] 29/9/23
+ ;LD A,#63
+ LD A,63
+ ;
+ OUT (C),A
+ LD A,#C0 ; Bit 7 - Select (1), Bit 6 - Auto_Line_Feed (1)
+ OUT (Z84_SP.LPT2_D),A
+ LD A,#0F ; Init printer port for Out
+ OUT (Z84_SP.LPT1_C),A
+ RET
+;///////////////////////////////////////////////////////////////////////
\ No newline at end of file
diff --git a/DSS/API/PutChar.asm b/DSS/API/PutChar.asm
new file mode 100644
index 0000000..49e9f79
--- /dev/null
+++ b/DSS/API/PutChar.asm
@@ -0,0 +1,127 @@
+;///////////////////////////////////////////////////////////////////////
+; Функция #5B. Вывод символа на экран в тек. позиции.
+;
+; вход: A - символ
+; выход: нет
+;///////////////////////////////////////////////////////////////////////
+; PUTCHAR: ;CALL .NO_SCROLL
+; CP #0E
+; JR C,.control_characters
+; ;
+; LD BC,1*256 + BIOS.LP_PRINT_SYM
+; ;[x] CR+LF+SCROLL
+; RST ToBIOS
+; ;
+; ; проверка на переход курсора в самое начало (X:Y == 0:0)
+; CALL CURSOR
+; LD A,D
+; OR E
+; RET NZ
+; ;
+; .LFF: PUSH HL
+; LD BC,1*256 + BIOS.LP_SCROLL_UD
+; LD DE,#0020
+; RST ToBIOS
+; LD DE,#1F00
+; CALL LOCATE
+; LD A,' '
+; LD BC,#50*256 + BIOS.LP_PRINT_SYM
+; RST ToBIOS
+; LD DE,#1F00
+; CALL LOCATE
+; POP HL
+; RET
+; .TB_: CALL CURSOR
+; IF TABisSPACES
+; LD B,E
+; LD A,E
+; AND #F8
+; ADD A,8
+; SUB B
+; LD B,A
+; LD A,' '
+; LD C,BIOS.LP_PRINT_SYM
+; JP ToBIOS
+; ELSE
+; LD A,E
+; ADD A,8
+; AND #78 ;????? глянуть, что будет если координаты курсора в конце строки почти
+; LD E,A
+; JP LOCATE
+; ENDIF
+; .BK_: CALL CURSOR
+; XOR A
+; CP E
+; RET Z
+; DEC E
+; JP LOCATE
+; ;
+; .LF_: CALL CURSOR
+; LD A,D
+; CP #1F
+; JR NC,.LFF
+; INC D
+; IFN EnoughtOnly_LF
+; JP LOCATE
+; ELSE
+; CALL LOCATE
+; ; !!!! НЕ разрывать LF_ и CR_ !!!!
+; ENDIF
+; .CR_: CALL CURSOR
+; LD E,0
+; JP LOCATE
+; ;
+; .control_characters:
+; CP "\r"
+; JR Z,.CR_
+; CP "\n"
+; JR Z,.LF_
+; CP "\t" ; tab
+; JR Z,.TB_
+; CP "\b" ; backspace
+; JR Z,.BK_
+; CP "\a" ; [x] Beep in PChars/PUTCHAR
+; RET NZ
+; ; [x] Beep in PChars/PUTCHAR
+; .BELL: LD DE,1200
+; PUSH HL
+; LD HL,4
+; CALL BEEP
+; POP HL
+; RET
+; ;
+; ; [x] -bug with Vasil's version of cursor
+; .NO_SCROLL: CP #0E
+; JR C,.control_characters
+; LD BC,1*256 + BIOS.LP_PRINT_SYM
+; JP ToBIOS
+;///////////////////////////////////////////////////////////////////////
+
+
+
+;///////////////////////////////////////////////////////////////////////
+PUTCHAR: PUSH HL
+ ;
+ LD L,A
+ XOR A ; no attr-mode
+ LD H,A
+ PUSH HL ; кладём на стек печатаемый символ
+ LD L,A
+ ADD HL,SP
+ ;
+ LD A,(CLEAR.shell_color)
+ LD B,A
+ EX AF,AF'
+ XOR A ; no XY-mode
+ LD C,BIOS.LP_PR_LINE_DIR
+ LD IY,0 ; YH = YL = B
+ RST ToBIOS
+ POP HL ; восстанавливаем стек
+ ;
+ POP HL
+ RET
+
+; .NO_SCROLL:
+
+; .CHAR: DZ "X"
+;///////////////////////////////////////////////////////////////////////
\ No newline at end of file
diff --git a/DSS/API/RdChar.asm b/DSS/API/RdChar.asm
new file mode 100644
index 0000000..5619238
--- /dev/null
+++ b/DSS/API/RdChar.asm
@@ -0,0 +1,15 @@
+;///////////////////////////////////////////////////////////////////////
+; Функция #57. Прочитать символ с экрана.
+;
+; вход: D - строка
+; E - колонка
+; выход: A - символ
+; B - атрибут
+;///////////////////////////////////////////////////////////////////////
+RDCHAR: XOR A
+ LD C,BIOS.WIN_GET_SYM
+ RST ToBIOS
+ LD A,L
+ LD B,H
+ RET
+;///////////////////////////////////////////////////////////////////////
\ No newline at end of file
diff --git a/DSS/API/Read.asm b/DSS/API/Read.asm
new file mode 100644
index 0000000..f3b537b
--- /dev/null
+++ b/DSS/API/Read.asm
@@ -0,0 +1,173 @@
+; HL - BUFFER ADDRESS
+; DE - BLOCK SIZE
+; A - FM
+READ: LD (.R_POINT),HL
+ LD (.S_POINT),HL
+ CALL SET_FM
+ RET C
+ CALL .TEST_SIZE
+ ;
+ LD A,D
+ OR E
+ JP Z,.NOREAD
+ ;
+ PUSH DE
+ LD A,(IY+_sFM.DRIVE)
+ CALL OPENDSK
+ JP C,.ERR_1
+ CALL GET_OFFSET_IN_SECTORS
+ ;
+ JP NZ,.ROV1
+.ROV4: POP BC
+ PUSH BC
+ SRL B
+ JR Z,.ROV2
+ ; чтение сразу в буфер пользователя
+ LD (.SECTORH),HL
+ LD (.SECTORL),DE
+.R_POINT+2: LD IX,0
+ CALL BLOCK_READ
+ JP C,.ERR_1
+ LD DE,(.R_POINT)
+.PointerOnBuffer+1:
+ LD HL,0 // LD HL,(READMEM)
+ AND A
+ SBC HL,DE
+ LD C,H
+ LD B,0
+ ADD HL,DE
+ LD (.R_POINT),HL
+ SRL C
+.SECTORL+1: LD HL,0 // LD HL,(SECTORL)
+ ADD HL,BC
+ EX DE,HL
+.SECTORH+1: LD HL,0 // LD HL,(SECTORH)
+ LD C,B
+ ADC HL,BC
+.ROV2: POP BC
+ LD A,B
+ AND #01
+ LD B,A
+ OR C
+ JP Z,.ROV6
+ ; чтение через буфер DSS, если размер данных < 512
+ PUSH BC
+ LD IX,CORE_BUFFERS.BUFFER+#C000
+ LD B,1
+ IN A,(SLOT3)
+ PUSH AF
+ IN A,(SLOT0)
+ OUT (SLOT3),A
+ CALL BLOCK_READ
+ POP BC
+ LD C,SLOT3
+ OUT (C),B
+ JP C,.ERR_1
+ LD HL,CORE_BUFFERS.BUFFER
+ LD DE,(.R_POINT)
+ POP BC
+ LDIR
+ LD (.R_POINT),DE
+.ROV6: LD HL,(.R_POINT)
+.S_POINT+1: LD DE,0
+ ;EX DE,HL
+ AND A
+ SBC HL,DE
+ PUSH HL
+ EX DE,HL
+ LD XH,D
+ LD XL,E
+ LD HL,0
+ CALL MOVE_FP.F_current
+ POP DE
+.NOREAD: ;
+.COD+1: LD A,0
+ OR A
+ RET
+ ;
+.ROV1: PUSH BC
+ PUSH HL
+ PUSH DE
+ LD IX,CORE_BUFFERS.BUFFER+#C000
+ LD B,1
+ IN A,(SLOT3)
+ PUSH AF
+ IN A,(SLOT0)
+ OUT (SLOT3),A
+ CALL BLOCK_READ
+ POP BC
+ LD C,SLOT3
+ OUT (C),B
+ POP HL
+ JP C,.ERR_3
+ ; inc HL:DE
+ LD BC,1
+ ADD HL,BC
+ EX DE,HL
+ POP HL
+ LD C,B
+ ADC HL,BC
+ ;
+ EXX
+ POP DE
+ LD HL,512 ;!HARDCODE ;!FIXIT ; [ ] sector size
+ AND A
+ SBC HL,DE
+ LD B,H
+ LD C,L
+ POP HL
+ AND A
+ SBC HL,BC
+ JR NC,.ROV3
+ ADD HL,BC
+ LD B,H
+ LD C,L
+ LD HL,0 ;!TODO можно тут упростить дальнейшую ветку?
+.ROV3: PUSH HL
+ LD HL,CORE_BUFFERS.BUFFER
+ ADD HL,DE
+ LD DE,(.R_POINT)
+ LDIR
+ LD (.R_POINT),DE
+ EXX
+ JP .ROV4
+ ;
+.ERR_3: POP HL
+ POP HL
+.ERR_1: POP BC
+ ;SCF
+ RET
+ ;
+.TEST_SIZE: XOR A
+ LD (READ.COD),A
+ LD L,(IY+_sFM.F_POSITION) ;FP LOW
+ LD H,(IY+_sFM.F_POSITION+1)
+ ADD HL,DE
+ ;
+ EXX
+ ;LD DE,0 ;!TEST
+ LD L,(IY+_sFM.F_POSITION+2) ;FP HIGH
+ LD H,(IY+_sFM.F_POSITION+3)
+ ;!TEST
+ JR NC,.no_inc_hl
+ INC HL
+ ;ADC HL,DE
+ ;
+.no_inc_hl: EXX ;HL':HL - NEW FP
+ ;
+ LD C,(IY+_sFM.FS_REC.F_SIZE)
+ LD B,(IY+_sFM.FS_REC.F_SIZE+1) ;SIZE LOW
+ AND A
+ SBC HL,BC
+ EXX
+ LD C,(IY+_sFM.FS_REC.F_SIZE+2) ;SIZE HIGH
+ LD B,(IY+_sFM.FS_REC.F_SIZE+3)
+ SBC HL,BC
+ EXX
+ RET C ;OK READ ALL
+ EX DE,HL
+ SBC HL,DE ;VERY BIG
+ EX DE,HL
+ LD A,#FF
+ LD (READ.COD),A
+ RET
\ No newline at end of file
diff --git a/DSS/API/Rename.asm b/DSS/API/Rename.asm
new file mode 100644
index 0000000..928356c
--- /dev/null
+++ b/DSS/API/Rename.asm
@@ -0,0 +1,85 @@
+////////////////////////////////////////////////////////////////////////
+; Функция #10. Переименование файла.
+; Глобальные символы * и ? в именах файлов не допускаются.
+;
+; вход: HL - указатель на старое имя файла
+; DE - указатель на новое имя файла
+; выход: A - код ошибки, если CF=1
+;
+; INPUT: HL - "old_name.ext",#00 without simbols * ?
+; DE - "new_name.ext",#00 without simbols * ?
+////////////////////////////////////////////////////////////////////////
+RENAME: ;!TEST Current Dir ;[x] 15/10/23
+ PUSH HL
+ PUSH DE
+ CALL DIR_PATH_CHECK.forceCheck
+ POP DE
+ POP HL
+ RET C
+ ;
+ ; !TODO воткнуть тут SetPath_GetName, чтоб можно было удалять по относительным путям?
+ ;
+ ; [ ] 26/06/2024
+ PUSH HL
+ CALL CHECK_64kb_CLUSTER
+ POP HL
+ RET C
+
+ ;
+ PUSH DE
+ CALL MASK.name
+ POP DE
+ RET C
+ ;!TEST optimization
+ ;LD HL,MASKARE
+ ;LD BC,11
+ ;LD A,"?"
+ ;CPIR
+ ;LD A,DSS_Error.sys.INVALID_NAME
+ ;SCF
+ CALL CHECK_NAME
+ ;
+ RET Z
+ PUSH DE
+ CALL LOADDIR ; прочитать список каталога
+ ;LD A,#33
+ LD A,FAT_ATTR.NoSYSnoVolID
+ CALL SEARCH.Custom ; поиск записи в списке диска
+ POP HL
+ RET C
+ ;LD DE,MASKARE
+ CALL MASK.name
+ RET C
+ ;!TEST optimization
+ ;LD HL,MASKARE
+ ;LD BC,11
+ ;LD A,"?"
+ ;CPIR
+ ;LD A,DSS_Error.sys.INVALID_NAME
+ ;SCF
+ CALL CHECK_NAME
+ ;
+ RET Z
+ PUSH IX
+ LD A,FAT_ATTR.NoSYSnoVolID
+ CALL SEARCH.Custom ; поиск записи в списке диска
+ POP IX
+ LD A,DSS_Error.sys.FILE_EXISTS
+ CCF
+ RET C
+
+ SET_PAGE_X DIRPAGE
+ EX AF,AF'
+ ;
+ LD HL,MASKARE
+ LD D,XH
+ LD E,XL
+ LD BC,11
+ LDIR
+ ;
+ CALL DELETE_LFN_RECORDS ; [ ] удаление записи LFN
+ ;
+ EX AF,AF'
+ OUT (SLOT3),A
+ JP SAVEDIR
+; ; ;
\ No newline at end of file
diff --git a/DSS/API/RetMem.asm b/DSS/API/RetMem.asm
new file mode 100644
index 0000000..4258bf2
--- /dev/null
+++ b/DSS/API/RetMem.asm
@@ -0,0 +1,29 @@
+//////////////////////////////////////////////////////////////////////
+; Функция #3E. Освобождение блока памяти.
+;
+; вход: A - идентификатор блока памяти
+; выход: A - код ошибки, если CF=1
+//////////////////////////////////////////////////////////////////////
+RETMEM: LD E,A
+ LD D,#00
+ ;LD HL,MEMTAB ; массив списка выдел. страниц
+ LD HL,CORE_BUFFERS.MemoryTable ; массив списка выдел. страниц
+ ADD HL,DE
+ LD A,(TASK) ; уровень текущей программы
+ CP (HL)
+ LD A,DSS_Error.sys.INVALID_MEMORY_HND
+ SCF
+ RET NZ
+ ;PUSH DE
+ LD A,E
+ LD C,BIOS.FreeMem
+ RST ToBIOS
+ ;POP DE
+ LD A,DSS_Error.sys.INVALID_MEMORY_HND
+ RET C
+ ;LD HL,MEMTAB
+ LD HL,CORE_BUFFERS.MemoryTable
+ ADD HL,DE
+ XOR A
+ LD (HL),A
+ RET
\ No newline at end of file
diff --git a/DSS/API/RmDir.asm b/DSS/API/RmDir.asm
new file mode 100644
index 0000000..906f904
--- /dev/null
+++ b/DSS/API/RmDir.asm
@@ -0,0 +1,125 @@
+; [x] fat32 ;!TEST
+////////////////////////////////////////////////////////////////////////
+; Функция #1C. Удаление каталога.
+; Можно удалить только пустой каталог.
+;
+; вход: HL - указатель на имя каталога
+; выход: A - код ошибки, если CF=1
+;
+; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0
+////////////////////////////////////////////////////////////////////////
+RMDIR: ;!TEST Current Dir ;[x] 15/10/23
+ PUSH HL
+ CALL DIR_PATH_CHECK
+ POP HL
+ RET C
+ CALL .START
+ PUSH AF
+ LD HL,CORE_BUFFERS.CurrentDirectory
+ CALL CHDIR
+ CALL DIR_PATH_CHANGE.Current
+ POP AF
+ RET
+ ;
+.START: CALL SetPath_GetName
+ RET C
+ ; [ ] 26/06/2024
+ CALL CHECK_64kb_CLUSTER
+ RET C
+ ;
+ CALL MASK
+ RET C
+ ;!TEST optimization
+ ;LD HL,MASKARE
+ ;LD BC,11
+ ;LD A,"?"
+ ;CPIR
+ ;LD A,DSS_Error.sys.INVALID_NAME
+ ;SCF
+ CALL CHECK_NAME
+ ;
+ RET Z
+ CALL LOADDIR
+ CALL SEARCH.Dir
+ RET C
+ ; fat32
+ LD HL,(HANDBUF+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H)
+ EXX
+ LD HL,(HANDBUF+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L)
+ PUSH IX ;!TODO record index. возможно, что может сломаться, если больше страницы
+ ;
+ ;!TODO Процедура полного вычитывания каталога (все кластеры). Можно задействовать в других местах
+.read_dir_big_loop:
+ PUSH HL
+ EXX
+ PUSH HL
+ EXX
+ CALL CLUSTER_TO_SECTOR
+ LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster)
+ LD B,A
+ ; начинаем вычитывать содержимое каталога посекторно
+.read_dir_loop: ;PUSH AF
+ PUSH BC
+ PUSH HL
+ PUSH IX
+ CALL READ_SECTOR
+ ; !FIXIT нет проверки на ошибку
+ ;
+ ;!HARDCODE sector size. 16 * 32 = 512; 32 - размер записи, 512 - размер считанного сектора
+ LD B,16
+ LD HL,CORE_BUFFERS.SECTOR_BUFFER
+.check_dir_loop:;
+ LD A,(HL)
+ OR A
+ JP Z,.dir_empty
+ CP "."
+ JR Z,.next_record
+ CP #E5 ;!HARDCODE байт удаления файла
+ JR Z,.next_record
+ LD DE,FAT_DIRECTORY_RECORD.ATTRIBUT ; смещ. до байта атрибутов
+ ADD HL,DE
+ LD A,(HL)
+ SBC HL,DE
+ AND FAT_ATTR.VOLUME_ID
+ SCF
+ JP Z,.error ;DIR NOT EMPTY
+.next_record: LD DE,FAT_DIRECTORY_RECORD
+ ADD HL,DE
+ DJNZ .check_dir_loop
+ ;
+ POP IX
+ POP HL
+ INC IX
+ LD A,XH
+ OR XL
+ JR NZ,.no_inc_hl
+ INC HL
+.no_inc_hl: POP BC
+ DJNZ .read_dir_loop
+ ; fat32
+ EXX
+ POP HL ; номер кластера
+ EXX
+ POP HL ; номер кластера
+ CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера
+ EX DE,HL ; hl=номер след. кластера
+ EXX
+ EX DE,HL ; hl=номер след. кластера
+ EXX
+ JR NC,.read_dir_big_loop ; не конец цепочки
+ ;
+.delete: POP IX
+ JP DELETE_REC_FAT ; пометить запись как "удаленная"
+ ;
+.dir_empty: ; CF = 0
+.error: ; CF = 1
+ POP HL
+ POP HL
+ POP HL
+ POP HL
+ POP HL
+ JR NC,.delete
+ POP HL
+ LD A,DSS_Error.sys.DIR_NOT_EMPTY
+ RET
+;
\ No newline at end of file
diff --git a/DSS/API/ScanDRV.asm b/DSS/API/ScanDRV.asm
new file mode 100644
index 0000000..fc4b8b2
--- /dev/null
+++ b/DSS/API/ScanDRV.asm
@@ -0,0 +1,62 @@
+;R12
+;///////////////////////////////////////////////////////////////////////
+; Функция #08 (DSS_RESCAN). Пересканировать девайсы системы.
+;
+; вход: нет
+; выход: A - номер последнего лог. диска в системе
+;///////////////////////////////////////////////////////////////////////
+; INCLUDE 'ScanDRV.asm'
+;!TODO код дико костыльный и будет переделан вместе с процедурой INITDVC
+SCANDRV:
+; 1. запоминаем состояние прерываний
+; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
+ LD A,R
+ DI
+ PUSH AF
+; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
+; 2. узнаём букву бут-диска
+; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
+ LD A,(BOOTDSK.NUM)
+ ;CALL BOOTDSK.GET
+; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
+; 3. вызываем рескан
+; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
+ ; A = Boot disk
+ LD B,A
+ LD A,Dss.DRV.RescanDRV
+ LD C,Dss.DRV.RescanDRV
+ RST ToDSS.DRV
+ ; проверка на ошибку boot disk lost
+ LD HL,.BOOT_DSK_LOST
+ LD E, +(80-.BOOT_DSK_LOST.size)/2 ; coord X
+ LD BC,.BOOT_DSK_LOST.size
+ JP C,KERNEL_PANIC
+ ;
+ LD (LDRIVE),A
+; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
+; 4. на всякий случай перечитываем дирректорию
+; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
+ LD A,(CORE_BUFFERS.CurrentPath)
+ SUB 'A'
+ CALL OPENDSK.open
+ JR NC,.disk_norm
+ LD A,(BOOTDSK.NUM)
+ CALL OPENDSK.open
+ ;
+.disk_norm: LD HL,CORE_BUFFERS.CurrentDirectory
+ CALL CHDIR
+ JR NC,.exit
+ LD HL,CORE_BUFFERS.CurrentDirectory
+ LD (HL),0
+; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
+; 5. выход
+; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
+.exit: POP AF
+ RET PO
+ EI
+ RET
+
+.BOOT_DSK_LOST: DZ "Boot drive lost o_O"
+.BOOT_DSK_LOST.size EQU $-.BOOT_DSK_LOST
+; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
+;///////////////////////////////////////////////////////////////////////
diff --git a/DSS/API/Scroll.asm b/DSS/API/Scroll.asm
new file mode 100644
index 0000000..dd7793d
--- /dev/null
+++ b/DSS/API/Scroll.asm
@@ -0,0 +1,105 @@
+;///////////////////////////////////////////////////////////////////////
+; Функция #55. Скроллинг экрана.
+;
+; вход: D - строка левого верхнего угла окна
+; E - колонка левого верхнего угла окна
+; H - высота окна
+; L - ширина окна
+; B = 1 - прокрутка вверх
+; B = 2 - прокрутка вниз
+; A = 0 - очищать строку
+; выход: нет
+;///////////////////////////////////////////////////////////////////////
+SCROLL: DJNZ .SCR_DW ;!TODO заменить на BIOS.LP_SCROLL_UD и посмотреть, что шустрее
+ ;[x] 04/04/23
+ ;LD B,A
+ ;LD C,H
+ ;PUSH BC
+ PUSH AF
+ ;
+ PUSH DE
+ PUSH HL
+ LD XH,D
+ LD XL,E
+ INC D
+ DEC H
+ LD C,BIOS.WIN_MOVE
+ ;[x] 29/9/23
+ LD A,R
+ PUSH AF
+ ;
+ XOR A
+ DI ;[x] 29/9/23
+ RST ToBIOS
+ ;[x] 29/9/23
+ POP AF
+ JP PO,.skip_EI
+ EI
+.skip_EI:
+ POP HL
+ POP DE
+ ;[x] 04/04/23
+ ;POP BC
+ POP AF
+ ;XOR A
+ ;CP B
+ AND A
+ ;
+ RET NZ
+ LD A,D
+ ADD A,H
+ DEC A ;R101
+ LD D,A
+.print: PUSH DE ;R101
+ CALL LOCATE
+ LD A,' '
+ LD B,L
+ LD C,BIOS.LP_PRINT_SYM
+ RST ToBIOS
+ POP DE ;R101
+ JP LOCATE ;R101
+ ;AND A
+ ;RET
+.SCR_DW:
+ DJNZ .SCR_ERR
+ ;[x] 04/04/23
+ ;LD B,A
+ ;LD C,H
+ ;PUSH BC
+ PUSH AF
+ ;
+ PUSH DE
+ PUSH HL
+ LD XH,D
+ LD XL,E
+ INC XH
+ DEC H
+ LD C,BIOS.WIN_MOVE
+ ;[x] 29/9/23
+ LD A,R
+ PUSH AF
+ ;
+ XOR A
+ DI ;[x] 29/9/23
+ RST ToBIOS
+ ; [x] 29/9/23
+ POP AF
+ JP PO,.skip2_EI:
+ EI
+.skip2_EI:
+ POP HL
+ POP DE
+ ;[x] 29/9/23
+ ;POP BC
+ POP AF
+ ;XOR A
+ ;CP B
+ AND A
+ ;
+ RET NZ
+ JP SCROLL.print
+.SCR_ERR:
+ LD A,DSS_Error.sys.INVALID_FUNCTION
+ SCF
+ RET
+;///////////////////////////////////////////////////////////////////////
\ No newline at end of file
diff --git a/DSS/API/SelPage.asm b/DSS/API/SelPage.asm
new file mode 100644
index 0000000..acb30ac
--- /dev/null
+++ b/DSS/API/SelPage.asm
@@ -0,0 +1,20 @@
+;///////////////////////////////////////////////////////////////////////
+; Функция #54. Выбрать активную страницу экрана.
+;
+; вход: B - страница экрана 0/1
+; выход: A - код ошибки, если CF=1
+;///////////////////////////////////////////////////////////////////////
+SELPAGE:
+ LD A,(VMODE)
+ ;BIT 7,A
+ CP %1000'0000
+ JR NC,.SEL2
+ PUSH BC
+ LD C,A
+ CALL SETVMOD.TEXT_M
+ POP BC
+.SEL2: LD A,B
+ AND #01
+ OUT (SCREEN_SWITCH),A
+ RET
+;///////////////////////////////////////////////////////////////////////
\ No newline at end of file
diff --git a/DSS/API/SetDateTime.asm b/DSS/API/SetDateTime.asm
new file mode 100644
index 0000000..ee36795
--- /dev/null
+++ b/DSS/API/SetDateTime.asm
@@ -0,0 +1,32 @@
+////////////////////////////////////////////////////////////////////////
+; Функция #18. Изменение даты и времени файла.
+;
+; вход: A - дескриптор файла
+; D - день
+; E - месяц
+; IX - год
+; H - час
+; L - минуты
+; B - секунды
+; выход: A - код ошибки, если CF=1
+////////////////////////////////////////////////////////////////////////
+
+;!FIXIT надо? CHECK_64kb_CLUSTER
+PUT_D_T: PUSH AF
+ CALL MK_TIME ; закодировать время/дату
+ POP AF ; дескриптор
+ PUSH DE
+ PUSH BC
+ CALL SET_FM
+ POP BC
+ POP DE
+ RET C
+ ; [ ] VFAT
+ LD (IY + _sFM.FS_REC.TIME),E
+ LD (IY + _sFM.FS_REC.TIME+1),D
+ LD (IY + _sFM.FS_REC.DATE),C
+ LD (IY + _sFM.FS_REC.DATE+1),B
+ SET 7,(IY + _sFM.ACCESS_MODE) ;R006 ; уст. признак изменения файла
+ AND A
+ RET
+;
\ No newline at end of file
diff --git a/DSS/API/SetMem.asm b/DSS/API/SetMem.asm
new file mode 100644
index 0000000..92beb2f
--- /dev/null
+++ b/DSS/API/SetMem.asm
@@ -0,0 +1,73 @@
+//////////////////////////////////////////////////////////////////////
+; Функция #3F. Изменение блока памяти.
+;
+; вход: A - идентификатор блока памяти
+; B - новый размер блока
+; выход: A - код ошибки, если CF=1
+//////////////////////////////////////////////////////////////////////
+SETMEM: LD E,A
+ LD D,#00
+ ;LD HL,MEMTAB
+ LD HL,CORE_BUFFERS.MemoryTable ; массив списка выдел. страниц
+ ADD HL,DE
+ LD A,(TASK)
+ CP (HL)
+ LD A,DSS_Error.sys.INVALID_MEMORY_HND
+ SCF
+ RET NZ
+ LD D,B
+ PUSH DE
+ LD A,E
+ CALL .SIZEBLK
+ POP DE
+ LD A,DSS_Error.sys.INVALID_MEMORY_HND
+ RET C
+ LD A,B
+ CP D
+ RET Z
+ JR C,.INCMEM
+ ; DECMEM
+ LD B,D
+ LD A,E
+ LD C,BIOS.DivMemBlocks
+ RST ToBIOS
+ LD A,B
+ LD C,BIOS.FreeMem
+ RST ToBIOS
+ XOR A
+ RET
+ ; Добавить страниц памяти к блоку
+.INCMEM:
+ LD A,D
+ SUB B
+ LD B,A
+ LD C,E
+ PUSH BC
+ LD C,BIOS.GetMem
+ RST ToBIOS
+ POP BC
+ LD B,A
+ LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY
+ RET C
+ LD A,C
+ LD C,BIOS.MergeMemBlocks
+ RST ToBIOS
+ XOR A
+ RET
+ ;
+.SIZEBLK:
+ LD B,#FF
+ LD C,A
+.loop: INC B
+ PUSH BC
+ LD A,C
+ LD C,BIOS.GetMemPage
+ RST ToBIOS
+ POP BC
+ JR NC,.loop
+ OR A
+ SCF
+ RET Z
+ XOR A
+ RET
+;
\ No newline at end of file
diff --git a/DSS/API/SetVMod.asm b/DSS/API/SetVMod.asm
new file mode 100644
index 0000000..da58ae6
--- /dev/null
+++ b/DSS/API/SetVMod.asm
@@ -0,0 +1,256 @@
+;///////////////////////////////////////////////////////////////////////
+; Функция #50. Выбор режима экрана.
+;
+; вход: A - режим экрана
+; #02 - текстовый 40x32x16 цветов
+; #03 - текстовый 80x32x16 цветов
+; #81 - графический 320x256x256 цветов
+; #82 - графический 640x256x16 цветов
+; B - страница экрана 0/1
+; выход: A - код ошибки, если CF=1
+;///////////////////////////////////////////////////////////////////////
+SETVMOD: CP %1000'0000
+ LD C,A
+ JR NC,.GRAPH
+.TEXT_M: LD IX,BACKTXT
+ PUSH IX
+ EX AF,AF'
+ LD A,(VMODE)
+ LD (BACKTXT.VMODE),A
+ EX AF,AF'
+ OR A
+ JR Z,.NOMODE
+ DEC A
+ JR Z,.NOMODE
+ DEC A
+ LD HL,TAB_40x32
+ JR Z,.SET_TXT_MODE
+ DEC A
+ LD HL,TAB_80x32
+ JR Z,.SET_TXT_MODE
+.NOMODE: POP IX
+ LD A,DSS_Error.sys.INVALID_VIDEO_MODE
+ SCF
+ RET
+
+; Установка граф. режимов
+.GRAPH: CALL SAVETXT
+ AND #7F
+ JR Z,.G320_16c ; !TODO заменить на существующий режим
+ DEC A
+ JR Z,.G320_256c
+ DEC A
+ JR Z,.G640_16c
+ ;DEC A
+ ;JP Z,.G640_256c ; !TODO заменить на существующий режим
+.G320_16c: LD A,DSS_Error.sys.INVALID_VIDEO_MODE
+ SCF
+ RET
+ ;
+.SET_TXT_MODE: PUSH BC
+ LD A,B
+ RLCA
+ RLCA
+ RLCA
+ RLCA
+ OR B
+ AND #11
+ XOR #10
+ LD E,A
+.SETMODE_END: CALL SETMODE
+ POP BC
+ LD A,C
+ LD (VMODE),A
+ LD A,B
+ AND #01
+ OUT (SCREEN_SWITCH),A
+ LD A,(VMODE)
+ LD C,Dss.Mouse.SetVideoMode
+ RST ToDSS.Mouse
+ SAFE_PORTY
+ XOR A
+ RET
+ ;
+.G320_256c: PUSH BC
+ LD HL,TAB_320x256_0
+ LD E,#11
+ CALL SETMODE
+ LD HL,TAB_320x256_1
+ LD E,#00
+ JP .SETMODE_END
+ ;
+.G640_16c: PUSH BC
+ LD HL,TAB_640x256_0
+ LD E,#11
+ CALL SETMODE
+ LD HL,TAB_640x256_1
+ LD E,#00
+ JP .SETMODE_END
+ ;
+VMODE: DB #03
+
+;-----------------------------------------------------------------------
+; Открыть окно
+; вход: hl=описатель окна
+; e=флаги окна
+;
+;02h - TEXT 40 x 32 (16 colors)
+;03h - TEXT 80 x 32 (16 colors)
+;80h - GRAF 320 x 256 (16 colors) ;!TODO занять другим
+;81h - GRAF 320 x 256 (256 colors)
+;82h - GRAF 640 x 256 (16 colors)
+;83h - GRAF 640 x 256 (256 colors) ;!TODO занять другим
+;-----------------------------------------------------------------------
+SETMODE: PUSH DE
+ LD DE,SYS_PAGE.SHARED_BUFFER_32b ; грязный хак. кидает данные в буфер служебной страницы биоса.
+ LD BC,ScreenDescriptorTable.Size ; БИОС при использовании IX предполагает, что он указывает
+ IN A,(SLOT3) ; на адрес ниже #C000 и вставляет в третью банку страницу #FE
+ EX AF,AF'
+ LD A,SYS_PAGE
+ OUT (SLOT3),A
+ LDIR
+ EX AF,AF'
+ OUT (SLOT3),A
+.skip_EI: POP DE
+ LD IX,SYS_PAGE.SHARED_BUFFER_32b ; грязный хак.
+ LD C,BIOS.WIN_OPEN
+ RST ToBIOS
+ SAFE_PORTY
+ XOR A
+ RET
+
+;IX+0 ;HORIZONTAL
+;IX+1 ;VERTICAL
+;IX+2 ;X - COORD
+;IX+3 ;Y - COORD
+;IX+4 ;MODE
+;IX+5 ;EXT MODE
+;IX+6 ;VIDEO RAM X OFFSET (SIGNPLACES)
+;IX+7 ;VIDEO RAM Y OFFSET (SIGNPLACES)
+
+;
+;.......................................................................
+;+0 X размер окна в знакоместах
+;+1 Y размер окна в знакоместах
+;+2 X полож. окна на экране
+;+3 Y полож. окна на экране
+;+4 режим знакоместа
+;+5 доп. режим знакоместа (bit0=1 спек. адресация экрана)
+;+6 X полож. в поле графики (в знакоместах)
+;+7 Y полож. в поле графики (в знакоместах)
+ScreenDescriptorTable EQU $
+
+; 80x32. текстовое, знакоместо 16x8, #0B - номер знакоген.
+TAB_80x32 DB 40,32,0,0,%0001'1011,0,0,0 ;1
+
+; 40x32. текстовое, знакоместо 8x8, #0B - номер знакоген.
+TAB_40x32 DB 40,32,0,0,%0011'1011,0,0,0 ;2
+
+; 640x256. графическое, 0-й экран
+TAB_640x256_0 DB 40,32,0,0,%0000'0000,0,0,0 ;3
+
+; 320x256. графическое, 0-й экран
+TAB_320x256_0 DB 40,32,0,0,%0010'0000,0,0,0 ;4
+
+; 640x256. графическое, 1-й экран
+TAB_640x256_1 DB 40,32,0,0,%0100'0000,0,40,0 ;5
+
+; 320x256. графическое, 1-й экран
+TAB_320x256_1 DB 40,32,0,0,%0110'0000,0,40,0 ;6
+ScreenDescriptorTable.Size EQU ($ - ScreenDescriptorTable)/6
+;.......................................................................
+;
+/*
+PIC_320X256_1:
+ DB 40,32,0,0,32,0,8,0
+ DB 0, 0,0,0, 0,0,0,0
+*/
+
+;-----------------------------------------------------------------------
+; Сохранить экран текст. режима.
+; Для буфера экрана исп. 2-я банка расширения ДОС.
+SAVETXT: PUSH AF
+ LD A,(VMODE)
+ CP %1000'0000
+ JR NC,.NOSAVET
+ SUB #02
+ JR C,.NOSAVET
+ ;
+ PUSH BC
+ PUSH DE
+ PUSH HL
+ PUSH IX
+ ;
+ PUSH AF
+ LD C,BIOS.LP_GET_PLACE
+ RST ToBIOS
+ LD (BACKTXT.CURS),DE
+ POP AF
+ LD IX,#C000
+ LD HL,#2050
+ OR A
+ JR NZ,.SVTEXT1
+ LD L,#28
+.SVTEXT1: LD (BACKTXT.WinMax),HL
+ LD DE,#0000
+ LD A,(BANKTBL+TXTPAGE)
+ LD B,A
+
+ LD C,BIOS.WIN_COPY
+ ;[x] 29/9/23
+ LD A,R
+ PUSH AF
+ ;
+ XOR A
+ DI
+ RST ToBIOS
+ ;[x] 29/9/23
+ POP AF
+ JP PO,.skip_EI
+ EI
+.skip_EI: ;
+ POP IX
+ POP HL
+ POP DE
+ POP BC
+.NOSAVET: POP AF
+ RET
+;-----------------------------------------------------------------------
+
+BACKTXT: PUSH AF
+.VMODE+1: LD A,#00
+ ;BIT 7,A
+ CP %1000'0000
+ JR C,.NOBACKT
+ ;
+ PUSH BC
+ PUSH DE
+ PUSH HL
+ PUSH IX
+ LD IX,#C000
+.WinMax+1: LD HL,#2050
+ LD DE,#0000
+ LD A,(BANKTBL+TXTPAGE)
+ LD B,A
+ LD C,BIOS.WIN_RESTORE
+ ;[x] 29/9/23
+ LD A,R
+ PUSH AF
+ ;
+ XOR A
+ DI
+ RST ToBIOS
+ ;[x] 29/9/23
+ POP AF
+ JP PO,.no_ei
+ EI
+.no_ei: ;
+.CURS+1: LD DE,#0000
+ CALL LOCATE
+ POP IX
+ POP HL
+ POP DE
+ POP BC
+.NOBACKT: POP AF
+ RET
+;///////////////////////////////////////////////////////////////////////
\ No newline at end of file
diff --git a/DSS/API/SetWin.asm b/DSS/API/SetWin.asm
new file mode 100644
index 0000000..c71c2a6
--- /dev/null
+++ b/DSS/API/SetWin.asm
@@ -0,0 +1,96 @@
+//////////////////////////////////////////////////////////////////////
+; Функция #38. Подключение страницы памяти.
+;
+; вход: A - идентиф. блока памяти
+; B - номер страницы в блоке (0,1,2,..)
+; H - биты 6 и 7 задают номер окна, в которое будет подкл. страница
+; выход: A - номер страницы, если CF=0
+; A - код ошибки, если CF=1
+; if B = 0FFh, then logical page number got from DE
+//////////////////////////////////////////////////////////////////////
+SETWIN: LD C,A
+ LD A,H
+ AND %1100'0000
+ JR NZ,.no_error
+ OR %0100'0000
+.no_error: RRCA
+ OR %100'0010
+ LD H,A ;SLOT number
+ LD A,C
+.ALL: LD C,BIOS.GetMemPage
+ EX DE,HL
+ RST ToBIOS
+ EX DE,HL
+ RET C
+ LD C,H ;SLOT number
+ IN B,(C)
+ OUT (C),A
+ LD A,B
+ RET
+; SETWIN: BIT 7,H ; if #8000 or high?
+; JR Z,SETWIN1 ; no, go to open in SLOT1
+; BIT 6,H ; if #C000 or high?
+; JR Z,SETWIN2 ; no, go to open in SLOT2
+; JR SETWIN3 ; yes, go to open in SLOT3
+//////////////////////////////////////////////////////////////////////
+; Функция #39. Подключение страницы памяти в первое окно.
+;
+; вход: A - идентиф. блока памяти
+; B - номер страницы в блоке (0,1,2,..)
+; выход: A - номер страницы, если CF=0
+; A - код ошибки, если CF=1
+//////////////////////////////////////////////////////////////////////
+SETWIN1: LD H,SLOT1
+ JR SETWIN.ALL
+
+; SETWIN1: LD C,BIOS.GetMemPage
+; EX DE,HL
+; RST ToBIOS
+; EX DE,HL
+; RET C
+; LD C,SLOT1
+; IN B,(C)
+; OUT (C),A
+; LD A,B
+; RET
+
+//////////////////////////////////////////////////////////////////////
+; Функция #3A. Подключение страницы памяти во второе окно.
+;
+; вход: A - идентиф. блока памяти
+; B - номер страницы в блоке (0,1,2,..)
+; выход: A - номер страницы, если CF=0
+; A - код ошибки, если CF=1
+//////////////////////////////////////////////////////////////////////
+SETWIN2: LD H,SLOT2
+ JR SETWIN.ALL
+; SETWIN2 LD C,BIOS.GetMemPage
+; EX DE,HL
+; RST ToBIOS
+; EX DE,HL
+; RET C
+; LD C,SLOT2
+; IN B,(C)
+; OUT (C),A
+; LD A,B
+; RET
+//////////////////////////////////////////////////////////////////////
+; Функция #3B. Подключение страницы памяти в третье окно.
+;
+; вход: A - идентиф. блока памяти
+; B - номер страницы в блоке (0,1,2,..)
+; выход: A - номер страницы, если CF=0
+; A - код ошибки, если CF=1
+//////////////////////////////////////////////////////////////////////
+SETWIN3: LD H,SLOT3
+ JR SETWIN.ALL
+; SETWIN3: LD C,BIOS.GetMemPage
+; EX DE,HL
+; RST ToBIOS
+; EX DE,HL
+; RET C
+; LD C,SLOT3
+; IN B,(C)
+; OUT (C),A
+; LD A,B
+; RET
\ No newline at end of file
diff --git a/DSS/API/Time.asm b/DSS/API/Time.asm
new file mode 100644
index 0000000..65fc5dd
--- /dev/null
+++ b/DSS/API/Time.asm
@@ -0,0 +1,200 @@
+////////////////////////////////////////////////////////////////////////
+; Функция #21. Текущая дата и время.
+;
+; вход: нет
+; выход: D - день
+; E - месяц
+; IX - год
+; H - час
+; L - минуты
+; B - секунды
+; C - день недели
+////////////////////////////////////////////////////////////////////////
+SYSTIME:
+ LD C,BIOS.CMOS_TEST
+ RST ToBIOS
+ JP C,.NOCMOS
+ ;
+ LD D,CMOS.Register.date
+ CALL RCMOS
+ PUSH AF
+ LD D,CMOS.Register.month
+ CALL RCMOS
+ POP DE
+ LD E,A
+ PUSH DE
+ LD D,CMOS.Register.hours
+ CALL RCMOS
+ PUSH AF
+ LD D,CMOS.Register.minutes
+ CALL RCMOS
+ POP DE
+ LD E,A
+ PUSH DE
+ LD D,CMOS.Register.seconds
+ CALL RCMOS
+ PUSH AF
+ LD D,CMOS.Register.dayOfWeek
+ LD C,BIOS.CMOS_RD
+ RST ToBIOS
+ POP DE
+ LD E,A
+ PUSH DE
+ LD D,CMOS.Register.year
+ CALL RCMOS ;READ AND CONVERT TO DECIMAL
+ PUSH AF
+ LD D,CMOS.Register.century
+ LD C,BIOS.CMOS_RD
+ RST ToBIOS
+ LD XH,A
+
+ POP AF
+ CP 80 ;R001, TEST DECIMAL FIX
+ PUSH AF
+ JR C,.XXIAGE
+ LD A,#19
+ CP XH
+ JR Z,.GOODAGE
+ JR .BADAGE
+.XXIAGE:
+ LD A,#20
+ CP XH
+ JR Z,.GOODAGE
+.BADAGE:
+ PUSH AF
+ LD D,CMOS.Register.century
+ LD C,BIOS.CMOS_WR
+ RST ToBIOS
+ POP AF
+ LD XH,A
+.GOODAGE:
+ POP AF
+ LD XL,A
+ LD A,XH
+ CALL BCD2HEX
+ LD L,A
+ LD H,0
+ LD C,L
+ LD B,H
+ LD XH,B
+ ADD HL,HL
+ ADD HL,HL
+ ADD HL,BC
+ ADD HL,HL ;*10
+ LD B,H
+ LD C,L
+ ADD HL,HL
+ ADD HL,HL
+ ADD HL,BC
+ ADD HL,HL ;*10(100)
+ EX DE,HL
+ ADD IX,DE
+ POP BC
+ POP HL
+ POP DE
+ AND A
+ RET
+.NOCMOS:
+.NC_DAY+1:
+ LD DE,DAY*256+MONTH ;DAY/MONTH
+.NC_HOUR+1:
+ LD HL,0 ;HOUR/MINUTE
+.NC_SEC+1:
+ LD BC,1 ;SECOND/WEEKDAY
+.NC_YEAR+2:
+ LD IX,YEAR ;YEAR
+ AND A
+ RET
+;
+
+////////////////////////////////////////////////////////////////////////
+; Функция #22. Установить текущую дату и время.
+;
+; вход: D - день
+; E - месяц
+; IX - год
+; H - час
+; L - минуты
+; B - секунды
+; выход: A - код ошибки, если CF=1
+////////////////////////////////////////////////////////////////////////
+SETTIME:
+ PUSH IX
+ PUSH BC
+ PUSH HL
+ PUSH DE
+ ;
+ ; [x] 25/01/2024
+ CALL CalcDayOfWeek
+ PUSH HL
+ ;
+ LD C,BIOS.CMOS_TEST
+ RST ToBIOS
+ JR C,.NOCMOS2
+ ;
+ ; [x] 25/01/2024
+ POP AF
+ LD D,CMOS.Register.dayOfWeek
+ LD C,BIOS.CMOS_WR
+ RST ToBIOS
+ ;
+ POP AF
+ PUSH AF
+ LD D,CMOS.Register.date
+ CALL WCMOS
+ POP BC
+ LD A,C
+ LD D,CMOS.Register.month
+ CALL WCMOS
+ POP AF
+ PUSH AF
+ LD D,CMOS.Register.hours
+ CALL WCMOS
+ POP BC
+ LD A,C
+ LD D,CMOS.Register.minutes
+ CALL WCMOS
+ POP AF
+ ;PUSH AF ; [ ] баг с установкой дня недели из регистра C. Нашел Hard
+ LD D,CMOS.Register.seconds
+ CALL WCMOS
+ ; [x] баг с установкой дня недели из регистра C. Нашел Hard
+ ;POP BC
+ ;LD A,C
+ ;LD D,CMOS.Register.dayOfWeek
+ ;LD C,BIOS.CMOS_WR
+ ;RST ToBIOS
+ ;
+ POP HL
+ XOR A
+ LD DE,100
+.YR: INC A
+ SBC HL,DE
+ JR NC,.YR
+ ADD HL,DE
+ DEC A
+ PUSH HL
+ LD D,CMOS.Register.century
+ CALL WCMOS
+ POP BC
+ LD A,C
+ LD D,CMOS.Register.year
+ CALL WCMOS
+ AND A
+ RET
+; !FIXIT новый биос выставляет время, если с ним что-то не так.
+.NOCMOS2:
+ POP AF
+ POP DE
+ POP HL
+ POP BC
+ POP IX
+ LD C,A
+ ;
+ LD (SYSTIME.NC_DAY),DE ;DAY/MONTH
+ LD (SYSTIME.NC_HOUR),HL ;HOUR/MINUTE
+ LD (SYSTIME.NC_SEC),BC ;SECOND/WEEKDAY
+ LD (SYSTIME.NC_YEAR),IX ;YEAR
+ AND A
+ RET
+;
\ No newline at end of file
diff --git a/DSS/API/Version.asm b/DSS/API/Version.asm
new file mode 100644
index 0000000..561de06
--- /dev/null
+++ b/DSS/API/Version.asm
@@ -0,0 +1,19 @@
+;/////////////////////////////////////////////////////////////////////
+; Функция #00. Версия ДОС.
+; Возвращает номер версии дисковой системы.
+; вход: нет
+; выход: DE = номер версии/модификации
+; BC = номер билда (0..999)
+;/////////////////////////////////////////////////////////////////////
+VERSION:
+ ;XOR A
+ ;LD H,A ;!TODO пихать сюда OSINFO
+ ;LD L,A
+ LD HL,0
+ LD DE,VERS*256+MODF
+ LD BC,BUILD
+ RET
+
+//;R10
+//OSINFO:
+//OSINFO_SIG: DB "OSINFOSTRUCTURE",0
\ No newline at end of file
diff --git a/DSS/API/WinCopy.asm b/DSS/API/WinCopy.asm
new file mode 100644
index 0000000..dd59a68
--- /dev/null
+++ b/DSS/API/WinCopy.asm
@@ -0,0 +1,23 @@
+;///////////////////////////////////////////////////////////////////////
+; Функция #59. Сохранить окно экрана.
+;
+; вход: D - строка
+; E - колонка левого верхнего угла окна
+; H - высота окна
+; L - ширина окна
+; B - страница буфера, если IX >= #C000
+; IX - адрес буфера
+; выход: нет
+;///////////////////////////////////////////////////////////////////////
+WINCOPY: AND A
+ LD A,R ;R102
+ PUSH AF ;R102
+ XOR A
+ LD C,BIOS.WIN_COPY
+ DI ;R102
+ RST ToBIOS
+ POP AF ;R102
+ RET PO ;R102
+ EI ;R102
+ RET
+;///////////////////////////////////////////////////////////////////////
\ No newline at end of file
diff --git a/DSS/API/WinRest.asm b/DSS/API/WinRest.asm
new file mode 100644
index 0000000..325dc97
--- /dev/null
+++ b/DSS/API/WinRest.asm
@@ -0,0 +1,23 @@
+;///////////////////////////////////////////////////////////////////////
+; Функция #5A. Восстановить окно экрана.
+;
+; вход: D - строка
+; E - колонка левого верхнего угла окна
+; H - высота окна
+; L - ширина окна
+; B - страница буфера, если IX >= #C000
+; IX - адрес буфера
+; выход: нет
+;///////////////////////////////////////////////////////////////////////
+WINREST: AND A
+ LD A,R ;R102
+ PUSH AF ;R102
+ XOR A
+ DI ;R102
+ LD C,BIOS.WIN_RESTORE
+ RST ToBIOS
+ POP AF ;R102
+ RET PO ;R102
+ EI ;R102
+ RET
+;///////////////////////////////////////////////////////////////////////
\ No newline at end of file
diff --git a/DSS/API/WrChar.asm b/DSS/API/WrChar.asm
new file mode 100644
index 0000000..63d71f9
--- /dev/null
+++ b/DSS/API/WrChar.asm
@@ -0,0 +1,25 @@
+;///////////////////////////////////////////////////////////////////////
+; Функция #58. Вывести символ на экран.
+; Управляющие символы выводятся как обычные символы.
+;
+; вход: D - строка
+; E - колонка
+; A - символ
+; B - атрибут
+; выход: нет
+;!FIXIT slow как без WIN_GET_SYM тут обойтись?
+;///////////////////////////////////////////////////////////////////////
+WRCHAR: ;LD C,A
+ ;PUSH BC
+ ;PUSH DE
+ ;XOR A
+ ;LD C,BIOS.WIN_GET_SYM
+ ;RST ToBIOS
+ ;POP DE
+ ;POP HL
+ LD L,A
+ LD H,B
+ XOR A
+ LD BC,BIOS.WIN_PUT_SYM.NoChangeZG
+ JP ToBIOS
+;///////////////////////////////////////////////////////////////////////
\ No newline at end of file
diff --git a/DSS/API/Write.asm b/DSS/API/Write.asm
new file mode 100644
index 0000000..90474ae
--- /dev/null
+++ b/DSS/API/Write.asm
@@ -0,0 +1,197 @@
+WRITE.ERR3:
+ POP HL
+WRITE.ERR2:
+ POP HL
+WRITE.ERR1:
+ POP BC
+ ;SCF
+ RET
+WRITE.RD_ONLY:
+ POP DE
+ LD A,DSS_Error.sys.READONLY
+ SCF
+ RET
+
+; HL - ADDRESS
+; DE - SIZE
+; A - FM
+WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] избыточные вызовы WRITE_FAT_TABLE
+ CALL .Start
+ PUSH AF
+ LD A,(CORE_BUFFERS.FS_Buffer.CacheUpdated)
+ OR A
+ CALL NZ,WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск
+ POP AF
+ RET
+ ;
+.Start: LD (.R_POINT),HL
+ LD (.S_POINT),HL
+ PUSH DE
+ CALL SET_FM
+ JR C,.ERR1
+ LD A,(IY+_sFM.ACCESS_MODE)
+ AND Dss.Open.R
+ JR NZ,.RD_ONLY
+ SET 7,(IY + _sFM.ACCESS_MODE)
+ SET 5,(IY + _sFM.FS_REC.ATTRIBUT)
+ LD A,(IY + _sFM.DRIVE)
+ CALL OPENDSK
+ JR C,.ERR1
+ ; [ ] 26/06/2024
+ CALL CHECK_64kb_CLUSTER
+ RET C
+ ;
+ CALL GET_OFFSET_IN_SECTORS
+ ;
+ JP NZ,.WOV1
+ ;
+.WOV4: POP BC
+ PUSH BC
+ SRL B
+ JR Z,.WOV2
+ PUSH HL
+ PUSH DE
+ PUSH BC
+.R_POINT+2: LD IX,0
+ CALL BLOCK_WRITE
+ POP BC
+ JR C,.ERR3
+ LD C,B
+ LD HL,(.R_POINT)
+ LD DE,#0200 ;!HARDCODE sector size
+.WOV5: ADD HL,DE
+ DJNZ .WOV5
+ ; B=0
+ LD (.R_POINT),HL ;!FIXIT это значение уже расcчитывается перед выходом в BLOCK_WRITE?
+ ;LD B,0
+ POP HL
+ ADD HL,BC
+ EX DE,HL
+ POP HL
+ LD C,B
+ ADC HL,BC
+.WOV2: POP BC
+ LD A,B
+ AND #01
+ LD B,A
+ OR C
+ JR Z,.WOV6
+ PUSH HL
+ PUSH DE
+ PUSH BC
+ LD IX,CORE_BUFFERS.BUFFER+#C000
+ LD B,1
+ IN A,(SLOT3)
+ PUSH AF
+ IN A,(SLOT0)
+ OUT (SLOT3),A
+ CALL BLOCK_READ
+ POP BC
+ LD C,SLOT3
+ OUT (C),B
+ LD DE,CORE_BUFFERS.BUFFER
+ LD HL,(.R_POINT)
+ POP BC
+ JP C,.ERR2
+ LDIR
+ LD (.R_POINT),HL
+ POP DE
+ POP HL
+ LD IX,CORE_BUFFERS.BUFFER+#C000
+ LD B,1
+ IN A,(SLOT3)
+ PUSH AF
+ IN A,(SLOT0)
+ OUT (SLOT3),A
+ CALL BLOCK_WRITE
+ POP BC
+ LD C,SLOT3
+ OUT (C),B
+ RET C
+.WOV6: LD HL,(.R_POINT)
+.S_POINT+1: LD DE,0
+ ; CF=0
+ ;AND A
+ SBC HL,DE
+ PUSH HL
+ EX DE,HL
+ LD XH,D
+ LD XL,E
+ LD HL,0
+ CALL MOVE_FP.F_current
+ CALL MOVE_CP
+ POP DE
+ RET NC ; Если размер файла на диске НЕ стал больше, чем был
+ ; Если размер файла на диске стал больше, чем был
+ LD L,(IY + _sFM.F_POSITION+0)
+ LD H,(IY + _sFM.F_POSITION+1)
+ LD C,(IY + _sFM.F_POSITION+2)
+ LD B,(IY + _sFM.F_POSITION+3)
+ LD (IY + _sFM.FS_REC.F_SIZE+0),L
+ LD (IY + _sFM.FS_REC.F_SIZE+1),H
+ LD (IY + _sFM.FS_REC.F_SIZE+2),C
+ LD (IY + _sFM.FS_REC.F_SIZE+3),B
+ AND A
+ RET
+ ;
+.WOV1: PUSH BC
+ PUSH HL
+ PUSH DE
+ LD IX,CORE_BUFFERS.BUFFER+#C000
+ LD B,1
+ IN A,(SLOT3)
+ PUSH AF
+ IN A,(SLOT0)
+ OUT (SLOT3),A
+ CALL BLOCK_READ
+ POP BC
+ LD C,SLOT3
+ OUT (C),B
+ POP DE
+ POP HL
+ EXX
+ POP DE
+ JP C,.ERR1
+ LD HL,512 ;!HARDCODE ;!FIXIT ; [ ] sector size
+ AND A
+ SBC HL,DE
+ LD B,H
+ LD C,L
+ POP HL
+ AND A
+ SBC HL,BC
+ JR NC,.WOV3
+ ADD HL,BC
+ LD B,H
+ LD C,L
+ LD HL,0
+.WOV3: PUSH HL
+ LD HL,CORE_BUFFERS.BUFFER
+ ADD HL,DE
+ LD DE,(.R_POINT)
+ EX DE,HL
+ LDIR
+ LD (.R_POINT),HL
+ EXX
+ PUSH HL
+ PUSH DE
+ LD IX,CORE_BUFFERS.BUFFER+#C000
+ LD B,1
+ IN A,(SLOT3)
+ PUSH AF
+ IN A,(SLOT0)
+ OUT (SLOT3),A
+ CALL BLOCK_WRITE
+ POP BC
+ LD C,SLOT3
+ OUT (C),B
+ POP HL
+ JP C,.ERR2
+ LD BC,1
+ ADD HL,BC
+ EX DE,HL
+ POP HL
+ LD C,B
+ ADC HL,BC
+ JP .WOV4
+;
\ No newline at end of file
diff --git a/DSS/API/bootDsk.asm b/DSS/API/bootDsk.asm
new file mode 100644
index 0000000..0361015
--- /dev/null
+++ b/DSS/API/bootDsk.asm
@@ -0,0 +1,73 @@
+;/////////////////////////////////////////////////////////////////////
+; Функция #09. Номер системного диска.
+; Возвращает номер диска, c которого загружена система.
+;
+; При B = 0 (GET)
+; выход: A - номер системного диска (0=A,1=B,..)
+; При B = 1 (SET - исп. boot-загрузчик системы, после чего функция недоступна)
+; вход: H - номер устройства, L - номер раздела на устройстве
+; выход:
+;/////////////////////////////////////////////////////////////////////
+BOOTDSK:
+ INC B
+ DEC B
+ JR Z,.GET
+ DEC B
+.chg: JR Z,.SET ;R13 меняется на JR С,SETBOOT после первого удачного исполнения SETBOOT
+ LD A,DSS_Error.sys.INVALID_FUNCTION
+ SCF
+ RET
+.GET: ;GET BOOT DISK
+.NUM+1: LD A,0 ;R09
+ AND A
+ RET
+ ; Сообщить DSS с какого диска загружается система.
+ ; Исп. загрузчик системы для иниц. ячейки "boot_disk".
+
+.SET: LD B,H ;SET BOOT DISK
+ LD C,0
+ ;[x] 17.12.2023 загрузка с активного раздела, а не с первого
+ LD (.part),HL
+ ;
+.loop: PUSH BC
+ LD A,C
+ LD DE,Dss.DRV.GenIOCTL.Enter
+ LD BC,Dss.DRV.GenIOCTL.GetParams
+ RST ToDSS.DRV
+ ;[x] 17.12.2023 загрузка с активного раздела, а не с первого
+ LD A,C ; номер партиции в MBR диска
+ ;
+ POP BC
+ JR C,.NoSupport
+ EX AF,AF' ;PHISICAL DRIVE NUMBER
+ CP B
+ JR NZ,.NoSupport
+ ;[x] 17.12.2023 загрузка с активного раздела, а не с первого
+ EX AF,AF' ; номер партиции в MBR диска
+.part+1: LD HL,0
+ CP L
+ JR NZ,.NoSupport
+ ;
+ ;R13
+ LD A,#38 ; opcode for JR C,addr
+ LD (BOOTDSK.chg),A
+ ;R13
+ LD A,C
+ LD (BOOTDSK.NUM),A
+ AND A
+ RET
+.NoSupport:
+ INC C
+ LD A,(LDRIVE)
+ CP C
+ JR NZ,.loop
+ SCF
+ RET
+; Номер последнего диска в системе
+LDRIVE: DB DSS_MAX_DRIVES_AMOUNT
+ IF COMPILE_UNUSED_CODE
+TDRIVE: DB #00
+TCLUST: DW #0000
+TCOUNT: DW #0000
+ ENDIF
+;
\ No newline at end of file
diff --git a/DSS/API/curDisk.asm b/DSS/API/curDisk.asm
new file mode 100644
index 0000000..70d838e
--- /dev/null
+++ b/DSS/API/curDisk.asm
@@ -0,0 +1,22 @@
+;/////////////////////////////////////////////////////////////////////
+; Функция #02. Номер текущего диска.
+;
+; вход: нет
+; выход: A - номер диска (0=A,1=B,..)
+; C - номер последнего диска в системе
+;/////////////////////////////////////////////////////////////////////
+CURDISK_FN:
+ LD A,(LDRIVE)
+ LD C,A
+ LD A,(CORE_BUFFERS.CurrentPath)
+ SUB 'A'
+ RET NC
+ LD A,DSS_Error.sys.INVALID_DRIVE
+ RET
+CURDISK:
+ LD A,(LDRIVE)
+ LD C,A
+ LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
+ AND A
+ RET
+;
\ No newline at end of file
diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm
new file mode 100644
index 0000000..d0655a5
--- /dev/null
+++ b/DSS/API/diskINF.asm
@@ -0,0 +1,259 @@
+;/////////////////////////////////////////////////////////////////////
+; [ ] новая подфункция с битом 7 в рег. А
+; Возвращает информацию об общем и свободном пространстве дискового
+; устройства.
+;
+; вход: A - номер диска (0=A,1=B .. 25=Z. #FF-текущий)
+; При A bit7 = 1:
+; A and #7F - номер диска
+; HL - буфер (256 байтов) для расширенных данных:
+; B != 0 - считать свободное место
+; ;
+; размер поля - 1 байт
+; Файловая система
+; ;
+; размер поля - 1 байт
+; Серийный номер диска
+; ;
+; размер поля - 1 байт
+; Метка диска
+; ;
+; размер поля - 1 байт
+; физический номер диска, номер раздела
+; ;
+; размер поля - 1 байт
+; зарезервировано
+; ;
+; выход: CF=0:
+; A - размер кластера в секторах
+; HL':HL - общее кол-во кластеров
+; DE':DE - свободных кластеров
+; BC - размер сектора в байтах
+; CF=1:
+; A - код ошибки, если CF=1
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Метка диска проверяется сначала в корневом каталоге и если там ;
+; нет, то берётся метка из BPB ;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;/////////////////////////////////////////////////////////////////////
+DISKINF: LD C,B
+ LD B,1
+ ;
+ CP #80
+ JP C,.CustomDisk
+ CP #FF
+ JR Z,.CurrentDisk
+ ; more info
+ LD B,C
+ AND %0111'1111
+ PUSH HL
+ PUSH AF
+ CALL .CustomDisk
+ POP IX
+ JR C,.error
+ ;
+ EX (SP),HL
+ PUSH DE
+ PUSH AF
+ PUSH BC
+ ;;;;
+ ;
+ EX DE,HL
+ LD HL,FAT_STRING ;!HARDCODE FAT FS
+ LD C,5 ;!HARDCODE _sBOOT_SECTOR_PARAMS.ID_FAT.length
+ CALL .mCOPY_LOOP
+ ; 12, 16 or 32
+ LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE)
+ CP FAT_TYPE.x16
+ JR C,.next_prm
+ ;
+ PUSH DE
+ DEC DE
+ LD A,'6'
+ JR Z,.put_char
+ ; fat 32
+ DEC DE
+ LD A,'3'
+.put_char: LD (DE),A
+ POP DE
+ ;
+.next_prm: LD HL,CORE_BUFFERS.FS_Buffer.BPB_SERIAL_NUMBER
+ LD C,4 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER
+ CALL .mCOPY_LOOP
+ ;
+ ; fat32
+ EXX
+ PUSH DE
+ PUSH HL
+ EXX
+ ;LD HL,CORE_BUFFERS.FS_Buffer.BPB_LABEL
+ PUSH IX
+ CALL GET_LABEL
+ LD C,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL
+ CALL .mCOPY_LOOP
+ POP AF
+ PUSH DE
+ ;LD A,XH
+ LD DE,Dss.DRV.GenIOCTL.Enter
+ LD BC,Dss.DRV.GenIOCTL.GetParams
+ RST ToDSS.DRV
+ POP DE
+ ; fat32
+ EXX
+ POP HL
+ POP DE
+ EXX
+ JR C,.error_drv
+ LD A,2 ;!HARDCODE длина поля №4 2 байта: физ номер диска, номер раздела диска
+ LD (DE),A
+ INC DE
+ EX AF,AF'
+ LD (DE),A ;физ номер диска
+ INC DE
+ LD A,C
+ LD (DE),A ;номер раздела диска
+ INC DE
+ ;
+.error_drv: EX AF,AF'
+ XOR A
+ LD (DE),A
+ ;;;;
+ POP BC
+ POP AF
+ POP DE
+ EX AF,AF'
+ JR C,.error
+ EX AF,AF'
+.error: POP HL
+ RET
+ ;
+.CurrentDisk: LD A,(CORE_BUFFERS.CurrentPath)
+ SUB 'A'
+ LD HL,CORE_BUFFERS.FS_Buffer.DRIVE
+ CP (HL)
+ JR Z,.CheckFreeSpace
+ ;
+.CustomDisk: PUSH BC
+ CALL CHDISK ;R06
+ POP BC
+ RET C
+ ;
+.CheckFreeSpace:; если GetFreeSpace не вызывается
+ XOR A
+ OR B
+ LD BC,(CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_L)
+ EXX
+ LD BC,(CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_H)
+ EXX
+ CALL NZ,GetFreeSpace
+ ;
+ ;.FRESP2:
+ ; A = 0 if B != 0 before .GetFreeSpace
+ ;
+ LD H,B
+ LD L,C
+ LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_L),HL
+ EX DE,HL
+ EXX
+ LD H,B
+ LD L,C
+ LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_H),HL
+ EX DE,HL
+ EXX
+ LD HL,(CORE_BUFFERS.FS_Buffer.MaxClusterLow)
+ DEC HL
+ ; fat 32
+ EXX
+ LD HL,(CORE_BUFFERS.FS_Buffer.MaxClusterHigh)
+ JR NC,.skip_dec_hl
+ DEC HL
+.skip_dec_hl: EXX
+ LD BC,(CORE_BUFFERS.FS_Buffer.BytesPerSector)
+ LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster)
+ AND A
+ RET
+ ;
+ ; [ ] 22/11/23 подфункция с доп.инфой
+.mCOPY_LOOP: LD B,0
+ EX DE,HL
+ LD (HL),C
+ EX DE,HL
+ INC DE
+ LDIR
+ RET
+ ;
+;
+GetFreeSpace: LD A,1
+ LD (CORE_BUFFERS.FS_Buffer.UPD_FSINFO),A
+ LD HL,2 ; fat32 номер кластера от которого считать
+ XOR A
+ ; fat32
+ EXX
+ LD H,A
+ LD L,A
+ LD B,A
+ LD C,A
+ EXX
+ LD B,A
+ LD C,A
+.loop_free_space:;!FIXIT
+ PUSH BC
+ EXX
+ PUSH BC
+ EXX
+ CALL READ_FROM_FAT
+ EXX
+ POP BC
+ EXX
+ POP BC
+ CP DSS_Error.sys.DISK_FULL
+ RET Z
+ ; fat 32
+ EXX
+ LD A,E
+ OR D
+ EXX
+ OR E
+ OR D
+ JR NZ,.skip
+ ;
+ INC BC
+ LD A,B
+ OR C
+ JR NZ,.skip
+ EXX
+ INC BC
+ EXX
+ ;
+.skip: INC HL
+ LD A,L
+ OR H
+ JR NZ,.loop_free_space
+ EXX
+ INC HL
+ EXX
+ JP .loop_free_space
+ ;
+FAT_STRING: DB 'FAT12'
+;
+; DE - буфер
+GET_LABEL: PUSH DE
+ LD HL,.LABEL_MASK ; "\*.*" имя метки
+ LD A,FAT_ATTR.VOLUME_ID ; атрибут метки тома
+ LD B,high Dss.F_First.FATname
+ CALL F_FIRST
+ POP DE
+.from_BPB: LD HL,CORE_BUFFERS.FS_Buffer.BPB_LABEL
+ RET C
+ ; [ ] 07/03/2025 костыль для атрибута 0. Настоял Савелий))
+ LD HL,BUFFER_FIND.REC_Attr
+ ADD HL,DE
+ LD A,(HL)
+ OR A
+ SCF
+ JR Z,.from_BPB
+ ;
+ LD HL,BUFFER_FIND.REC_Name
+ ADD HL,DE
+ RET
+.LABEL_MASK: DB '\*.*',0
\ No newline at end of file
diff --git a/DSS/CHANGES.LOG b/DSS/CHANGES.LOG
index d577f99..4ac6f67 100644
--- a/DSS/CHANGES.LOG
+++ b/DSS/CHANGES.LOG
@@ -1,12 +1,50 @@
-;Изменения после версии 1.70
-Важное:
+!FIXIT
+[ ] D:\>copy dss\system.dos c:\system.dos (bp 812d, 8136)
+ Can't open source file
+[ ] E:\BIN\MENU>c:\dss
+ что-то про заполненность директории
+[ ] C:\????? или ?????
+ исполняется как команда
+
+-----------------------------------------------------------------------------------------------------------------------------------------------
+!TODO
+Важное:
+[ ] перед началом работы любой процедуры записи/чтения драйва устанавливать флаг, чтоб не было повторного вызова (из прерывания, например)
+[ ] блокировка файлов в файловых манипуляторах (чтоб не открывать на запись уже открытый на запись файл, например)
Среднее:
+[x] перед ресканом драйвов проверять открытые хэндлы и если буква диска меняется, то менять драйв в хэндле
+[?] начать работать с функциями REMOVABLE и MEDIA CHECK rst #18. Возвращать значение #FF, если порядок букв изменился
Вообще не важное:
-исправить выход из функции #41 при возможном увеличении номера таски на 1 при 255
+[ ] исправить выход из функции #41 при возможном увеличении номера таски на 1 при 255
+-----------------------------------------------------------------------------------------------------------------------------------------------
+DSS 1.71.35
+Изменения после версии 1.70.2
+- дос и биос могут устанавливать зачем-то режим txt 40x32 и нормально в нём выводить текст
+- LOADDIR:fix мусор в странице каталога, если каталог меньше страницы
+- DiskINF: костыль для атрибута 0. Настоял Савелий)). Если в корне раньше метки диска попадался файл с атрибутом 0, то функция возвращала его имя как метку диска
+- процедура запуска EXE могла залезть не в ту папку перед передачей управления запускаемому приложению с версией EXE = 0 в заголовке
+- ATAPI устройство всегда получает букву, даже без носителя
+- Обрабатывается ошибка "смена носителя"
+- файл не создастся, если нет свободного манипулятора
+- поменял квадратик курсора в консоли для режима OVR (который после нажатия на Ins)
+- Мелкие правки, рюшечки, багфиксы неупомянутые в этом списке по причине амнезии и халатности
-; TEST
+
+DSS 1.70.2
+ Изменения после версии 1.70
+CORE:
+ [+] при чтении/записи файла не происходит "холостое" перечитывание FAT от начала файла
+ [+] перечитывание BPB теперь делается не на каждый чих, а когда надо (и бага при загрузке с диска "B:" нет :-P )
+ [+] изменена работа с RAM DISK, теперь он может быть загрузочным
+ [+] исправлены баги в функциях: WINCOPY, WINREST, SCROLL, SETVMOD, SELPAGE
+SHELL:
+ [+] исправлен баг с "C:\>CD E:\"
+ [+] исправлены баги с обработкой буферов командной строки
+UNSORTED:
+ [+] исправлен баг с переключением на другой диск из некорневой директории, когда на новом диске оказывался в несуществующей директории
+ [+] мелкие и не очень оптимизации
;Изменения после версии 1.60
10.02.2003 - Добавлена визуализация курсора в функции ECHOKEY.
diff --git a/DSS/DOS-MAIN.ASM b/DSS/DOS-MAIN.ASM
deleted file mode 100644
index 55badef..0000000
--- a/DSS/DOS-MAIN.ASM
+++ /dev/null
@@ -1,572 +0,0 @@
-
-;[BEGIN]
-;//MODULE: DOS-MAIN AUTHOR: Denis Parinov
-;//CREATE: A LONG TIME AGO :)
-;---------------------------------------------------------------
-;Rev Date Name Description
-;---------------------------------------------------------------
-;[ ] путь текущего каталога в DIR выводится с глюком если он длинее 256 байтов
-;[ ] путь в приглашении консоли выводится с глюком если путь длинее 256 байтов
-;[ ] ;!FIXIT какой-то баг при котором если нет диска и на него полезть, то всё ломается
-;R11 17-04-2023 BAO OPTIMIZED BUFFERS, FREED UP 768 BYTES FOR CODE
-;R10 14-04-2023 BAO Аварийный зависон с выводом сообщения при старте системы, если нет свободной памяти
-;R09 08-04-2023 BAO Сокращение размера таблицы API до 96 функций (0 - #5F). (Опционально при компиляции)
-;R08 15-04-2003 DNS RENAMED FN. OPEN AND CLOSE
-;R07 31-03-2003 DNS NEW DEPLOYING ROUTINE
-;R06 31-03-2003 DNS RELAYOUTING MEMORY
-;R05 27-03-2003 DNS CHANGE DRV. INIT. METHOD
-;R04 27-03-2003 DNS DRIVERS MOVE TO SPECIAL PAGE
-;R03 14-03-2003 DNS CODE OPTIMIZATION
-;R02 19-11-2002 DNS ADD ENVIRONMENT INITIALIZATION
-;R01 14-11-2002 DNS CUT AND MOVE BPB-STRUCT
-;---------------------------------------------------------------
-; OUTPUT './Build/system.dos'
-
-; MODULE MAIN
-//SPRINTER EQU 2000
-
- includelua 'Shared_includes/lua/Functions.lua'
- INCLUDE 'defines.inc'
- include 'shared_includes/constants/sp2000.inc'
- include 'shared_includes/constants/bios_equ.inc'
- include 'shared_includes/constants/dss_equ.inc'
- include 'shared_includes/structures/FileSystem.inc'
- include 'shared_includes/macroses/accelerator.z80'
- include 'shared_includes/macroses/macros.z80'
- include 'Structures.inc'
- INCLUDE 'VERSION.INC'
- INCLUDE 'DSS_MACROSES.Z80'
-
-;PAGEDRV EQU #00
-
-; DIRPAGE EQU 0
-; FATPAGE EQU 1
-; TXTPAGE EQU 2
-; ENVPAGE EQU 2
-; DRVPAGE EQU 3
-; ENVPAGE EQU 3
-; DRVPAGE EQU 4
-
-; TXTADDR EQU #C000
-; ENVADDR EQU #E400
-
-; DIR EQU #C000
-; FAT EQU #C000
-
-
-;
-; = -- = -- = -- = -- = = -- = -- = = -- = -- = = -- = -- = -- = -- = --;
- ORG 0
-;
-;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
-; <[CLOSE TASK]> ;
-RST_0x00: JP LEAVE ;
-;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
-;
-
-;
-;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
-; <[BIOS API]> ;
- _mInfoBLOCK 8-$,#FF ;
-RST_0x08: PUSH AF ;
- LD A,SYS_PORT.PAGE8;
- OUT (SYS_PORT.ON),A ;
- POP AF ;
- RET ;
-;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
-;
-
-;
-;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
-; <[DSS API]> ;
- _mInfoBLOCK #10-$,#FF ;
-RST_0x10: JP RST_10 ;
-;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
-;
-
-;
-;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
-; <[DRIVE API]> ;
- _mInfoBLOCK #18-$,#FF ;
-;A0018 JP INTDISK ;
-RST_0x18: PUSH AF ;
- PUSH BC ;
-DRV_PG_NUMBER+2: ;
- LD BC,0*256+SLOT0 ;
- JP PORTAL.outMAIN ;
-;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
-;
-
-;
-;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
-; <[NOT USED]> ;
- _mInfoBLOCK #20-$,#FF ;
-RST_0x20: JP RST_20 ;
-;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
-;
-
-;
-RST_20:
-RST_28:
-NOPS: LD A,DSS_Error.sys.INVALID_FUNCTION
- SCF
- RET
-;
-
-;
-;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
-; <[NOT USED]> ;
- _mInfoBLOCK #28-$,#FF ;
-RST_0x28: JP RST_28 ;
-;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
-;
-
-;
-;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
-; <[MOUSE API]> ;
- _mInfoBLOCK #30-$,#FF ;
-RST_0x30: JP INTMOUS ;
-;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
-;
-
-;
-;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
-; <[MAIN INT]> ;
- _mInfoBLOCK #38-$,#FF ;
-RST_38: ;
- JP RST_0x38 ; Этот джамп нужен, чтоб софты могли легко менять обработчик на свой. Костыльно.
-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
-
-; Первый старт системы, после инициализации адрес в таблице меняется на 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
\ No newline at end of file
diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM
deleted file mode 100644
index aabd6cd..0000000
--- a/DSS/DOS5.ASM
+++ /dev/null
@@ -1,1748 +0,0 @@
-
-;[BEGIN]
-;//MODULE: DOS5
-;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
-;//UPDATE: 24-10-1999 DNS Restore module
-;-------------------------------------------------------------
-;Rev Date Name Description
-;-------------------------------------------------------------
-;R11 17-04-2023 BAO Временный костыль для недопускания переполнения буфера пути каталога
-;R10 15-04-2023 BAO FIXED BUG WITH CHANGE DISK WITHOUT CHANGE PATH ;!FIXIT пока в виде заплатки полунеработающей
-;R09 13-04-2023 BAO FIX BUG WITH PARSING DIRECTORY BUFFER
-;R08 15-04-2003 DNS SAVE AND RESTORE CURёPATH MACROS
-;R07 06-02-2003 DNS FIX BUG IN MASK ROUTINE, IT ALLOW NAMES WHICH BEGAN
-; FROM "." ".NAM"
-;R06 29-01-2003 DNS FIX BUG WITH SET FILE DATE AND TIME
-;R05 26-11-2002 DNS FIX ERROR IN CHDIR, DON'T ALLOWED "." FOR ROOT
-;R04 19-11-2002 DNS DON'T ALLOW DIR & LABEL ATTR FOR FILES
-;R03 19-11-2002 DNS ADD RESET OF VOLUME LABEL ATTRIBUT
-;R02 19-11-2002 DNS FIX GET/SET ATTRIBUTES
-;R01 16-12-1999 DNS Y2K fix
-;-------------------------------------------------------------
-
-
-
-
-
-; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00
-; A - ATTRIB
-; B - MODE
-; B = 0 GET ATTRIB
-; B = 1 SET ATTRIB
-; OUTPUT: A - ATTRIB
-ATTRIB
- _mSavePath
- INC B
- DEC B
- JP Z,RATTRIB
- DEC B
- JP Z,WATTRIB
- LD A,DSS_Error.sys.INVALID_FUNCTION
- SCF
- RET
-
-RATTRIB XOR A
- CALL OPENATR ;R02
- RET C
- LD B,(IY+_sFM.ATTRIBUT)
- PUSH BC
- CALL CLOSE
- POP BC
- RET C
- LD A,B
- AND A
- RET
-
-WATTRIB PUSH AF
- XOR A
- CALL OPENATR ;R02
- POP BC
- RET C
- SET 7,(IY+_sFM.ACCESS_MODE)
- RES 3,B ;CLEAR LABEL ATTR ;R03
- LD (IY+_sFM.ATTRIBUT),B
- PUSH BC
- CALL CLOSE
- POP BC
- RET C
- LD A,B
- AND A
- RET
-
-; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00
-; OUTPUT: A - FM
-
-CREATE
- _mSavePath
- AND #E7 ;R04
- LD (ACCESS),A
- LD (PATH0),HL
- CALL GETWORD
- RET C
- LD HL,TMPNAME
- LD DE,MASKARE
- CALL MASK
- RET C
- CALL SEARCH
- JR C,CREAT ;NO FILE, CREAT NEW.
- CALL DELFILE ;FILE EXIST RECREAT
- JR CREAT
-
-; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00
-; OUTPUT: A - FM
-
-CREAT_N
- _mSavePath
- AND #E7 ;R04 %76A00SHR
- LD (ACCESS),A
- LD (PATH0),HL
- CALL GETWORD
- RET C
- LD HL,TMPNAME
- LD DE,MASKARE
- CALL MASK
- RET C
- CALL SEARCH
- LD A,7
- CCF
- RET C
-CREAT LD HL,MASKARE
- LD DE,HANDBUF
- LD BC,11
- LDIR
- EX DE,HL
- LD A,(ACCESS)
- LD (HL),A
- INC HL
- LD BC,#0A00
-FIHND LD (HL),C
- INC HL
- DJNZ FIHND
- PUSH HL
- CALL SYSTIME
- CALL MK_TIME
- POP HL
- LD (HL),E
- INC HL
- LD (HL),D
- INC HL
- LD (HL),C
- INC HL
- LD (HL),B
- INC HL
- LD BC,#0600
-FIHND1 LD (HL),C
- INC HL
- DJNZ FIHND1
- CALL WRT_HND
- CALL SAVEDIR
- LD HL,(PATH0)
- XOR A
- JP OPEN ;R08
-
-; INPUT: HL - "filename.ext",#00 without simbols * ?
-DELETE LD DE,MASKARE
- CALL MASK
- RET C
- LD HL,MASKARE
- LD BC,11
- LD A,"?"
- CPIR
- LD A,DSS_Error.sys.INVALID_NAME
- SCF
- RET Z
- CALL LOADDIR
- CALL SEARCH
- RET C
-DELFILE LD A,DIRPAGE
- CALL BANK
- PUSH AF
- LD (IX+_sFM.NAME),#E5
- LD E,(IX+_sFM.ST_CLUSTER)
- LD D,(IX+_sFM.ST_CLUSTER+1)
- POP AF
- OUT (SLOT3),A
- LD A,E
- OR D
- JR Z,SMALDEL
-DEL01 EX DE,HL
- CALL R_F_FAT
- PUSH DE
- PUSH AF
- LD DE,#0000
- CALL W_T_FAT
- POP AF
- POP DE
- JP NC,DEL01
- CALL WR_FAT
-SMALDEL CALL SAVEDIR
- AND A
- RET
-
-; INPUT: HL - "old_name.ext",#00 without simbols * ?
-; DE - "new_name.ext",#00 without simbols * ?
-
-RENAME PUSH DE
- LD DE,MASKARE
- CALL MASK
- POP DE
- RET C
- LD HL,MASKARE
- LD BC,11
- LD A,"?"
- CPIR
- LD A,DSS_Error.sys.INVALID_NAME
- SCF
- RET Z
- PUSH DE
- CALL LOADDIR
- LD A,#33
- CALL ASEARCH
- POP HL
- RET C
- LD DE,MASKARE
- CALL MASK
- RET C
- LD HL,MASKARE
- LD BC,11
- LD A,"?"
- CPIR
- LD A,DSS_Error.sys.INVALID_NAME
- SCF
- RET Z
- PUSH IX
- LD A,#33
- CALL ASEARCH
- POP IX
- LD A,DSS_Error.sys.FILE_EXISTS
- CCF
- RET C
- LD A,DIRPAGE
- CALL BANK
- LD HL,MASKARE
- LD D,XH
- LD E,XL
- LD BC,11
- LDIR
- OUT (SLOT3),A
- CALL SAVEDIR
- AND A
- RET
-
-;R02
-OPENATR LD (ACCESS),A
- CALL GETWORD
- RET C
- LD HL,TMPNAME
- LD DE,MASKARE
- CALL MASK
- RET C
- LD A,#37 ;%00AD0SHR
- CALL ASEARCH
- JR NC,OPENAT
- RET
-;R02
-
-OPEN_FN:
- _mSavePath
-OPEN ;R08
- LD (ACCESS),A
- CALL GETWORD
- RET C
- LD HL,TMPNAME
- LD DE,MASKARE
- CALL MASK
- RET C
-OPENEXE CALL SEARCH
- RET C
-OPENAT ;R02
- CALL GET_FM
- RET C
- LD A,C
- EX AF,AF'
- EXX
- LD (IY+_sFM.HANDLE),E
- LD (IY+_sFM.HANDLE+1),D
- EXX
- LD D,YH
- LD E,YL
- LD HL,HANDBUF
- LD BC,HANDBUF.SIZE
- LDIR
- LD A,(ACCESS)
- LD (IY+_sFM.ACCESS_MODE),A
- LD A,(TASK)
- LD (IY+_sFM.TASK_NUM),A
- XOR A
- LD (IY+_sFM.F_POSITION),A
- LD (IY+_sFM.F_POSITION+1),A
- LD (IY+_sFM.F_POSITION+2),A
- LD (IY+_sFM.F_POSITION+3),A
- LD A,(FatBuffer.DRIVE)
- LD (IY+_sFM.DRIVE),A
- LD HL,FM_BUF+_sFM.ST_CLUSTER
- LD E,(HL)
- INC HL
- LD D,(HL)
- LD (IY+_sFM.DIR_CLUSTER),E
- LD (IY+_sFM.DIR_CLUSTER+1),D
- EX AF,AF'
- AND A
- RET
-
-CLOSE_FN
- _mSavePath
-CLOSE: ;R08
- LD (ACCESS),A
- CALL SET_FM
- RET C
- LD A,(TASK)
- CP (IY+_sFM.TASK_NUM)
- LD A,DSS_Error.sys.ACCESS_DENIED
- SCF
- RET NZ
- BIT 7,(IY+_sFM.ACCESS_MODE)
- JR Z,NOTMODF
- LD D,(IY+_sFM.DIR_CLUSTER)
- LD E,(IY+_sFM.DIR_CLUSTER+1)
- PUSH DE
- XOR A
- CALL SET_FM
- POP DE
- LD (IY+_sFM.DIR_CLUSTER),D
- LD (IY+_sFM.DIR_CLUSTER+1),E
- CALL LOADDIR
- LD A,(ACCESS)
- CALL SET_FM
- LD HL,DIR
- LD DE,#0020
- LD C,(IY+_sFM.HANDLE)
- LD B,(IY+_sFM.HANDLE+1)
- JR CLOSE2
-CLOSE1 ADD HL,DE
- DEC BC
-CLOSE2 LD A,B
- OR C
- JR NZ,CLOSE1
- LD D,YH
- LD E,YL
- EX DE,HL
- PUSH HL
- LD A,DIRPAGE
- CALL BANK
- POP HL
- LD BC,#0020
- LDIR
- OUT (SLOT3),A
- CALL SAVEDIR
-NOTMODF LD A,(ACCESS)
- CALL RES_FM
- RET
-
-PATH0: DW #0000
-
-ACCESS: DB #00
-
-HANDBUF: BLOCK HANDBUF.SIZE,0
-
-
-
-WRT_HND LD A,DIRPAGE
- CALL BANK
- PUSH AF
- LD IX,DIR
- EXX
- LD DE,0
- EXX
-WRT_HN1 LD A,(IX+00)
- OR A
- JR Z,WRT_HN2
- CP #E5
- JR Z,WRT_HN2
- LD BC,#0020
- ADD IX,BC
- JR NC,WRT_HN1
- POP AF
- OUT (SLOT3),A
- LD A,DSS_Error.sys.ROOT_OVERFLOW
- SCF
- RET
-
-WRT_HN2 LD D,XH
- LD E,XL
- LD HL,HANDBUF
- LD BC,HANDBUF.SIZE
- LDIR
- POP AF
- OUT (SLOT3),A
- LD HL,DIR
- LD BC,(DIRSIZE)
- DEC BC
- ADD HL,BC
- AND A
- SBC HL,DE
- RET NC
- LD HL,(DIRSIZE)
- LD BC,(FatBuffer.B_P_C)
- ADD HL,BC
- LD (DIRSIZE),HL
- AND A
- RET
-
-DOSNAME INC B
- DEC B
- JP Z,GETNAME
- DEC B
- JP Z,MASK
- LD A,DSS_Error.sys.INVALID_FUNCTION
- SCF
- RET
-
-; HL - 11 bytes filename "FILENAMEEXT"
-; DE - DOS filename "FILENAME.EXT",0
-GETNAME LD BC,#08FF
-GETN1 LD A,(HL)
- CP " "
- JR NZ,GETN3
-GETN2 INC HL
- DJNZ GETN2
- JR GETN4
-GETN3 LDI
- DJNZ GETN1
-GETN4 LD A,(HL)
- CP " "
- LD A,"."
- JR NZ,GETN5
- LD A,#00
-GETN5 LD (DE),A
- INC DE
- RET Z
- LD B,#03
-GETN6 LD A,(HL)
- CP " "
- RET Z
- LDI
- XOR A
- LD (DE),A
- DJNZ GETN6
- RET
-
-DTABUF DW #0000
-CURHND DW #0000
-NO_NEXT DB #00
-FNDMODE DB #00
-
-F_FIRST LD (ACCESS),A
- LD (DTABUF),DE
- LD A,B
- LD (FNDMODE),A
- PUSH HL
- CALL LOADDIR
- POP HL
- CALL GETWORD
- RET C
- LD HL,TMPNAME
- LD DE,MASKARE
- CALL MASK
- RET C
- LD A,(ACCESS)
- CALL ASEARCH
- RET C
- LD HL,MASKARE
- LD DE,(DTABUF)
- LD BC,11
- LDIR
- LD A,(ACCESS)
- LD (DE),A
- INC DE
-FIND_S LD BC,#0020
- ADD IX,BC
- LD (CURHND),IX
- LD HL,HANDBUF+12
- LD BC,HANDBUF.SIZE-12 ;????? метку вместо числа?
- LDIR
- LD A,(HANDBUF+11)
- LD (DE),A
- INC DE
- LD HL,HANDBUF
- LD A,(FNDMODE)
- OR A
- JR NZ,FIND_M2
- LD BC,11
- LDIR
- LD A,#FF
- LD (NO_NEXT),A
- XOR A
- RET
-FIND_M2 CALL GETNAME
- LD A,#FF
- LD (NO_NEXT),A
- XOR A
- RET
-
-F_NEXT LD A,(NO_NEXT)
- OR A
- LD A,DSS_Error.sys.INVALID_ACCESS
- SCF
- RET Z
- LD (DTABUF),DE
- LD DE,MASKARE
- LD HL,(DTABUF)
- LD BC,11
- LDIR
- LD A,(HL)
- PUSH HL
- CALL NSEARCH
- POP DE
- EX AF,AF'
- XOR A
- LD (NO_NEXT),A
- EX AF,AF'
- RET C
- INC DE
- JP FIND_S
-
-NSEARCH EX AF,AF'
- LD A,DIRPAGE
- CALL BANK
- PUSH AF
- EX AF,AF'
- CPL
- LD C,A
- LD IX,(CURHND)
- EXX
- LD DE,0
- EXX
- JP SEARCH1
-
-DSEARCH LD A,#10
- CALL ASEARCH
- RET NC
- LD A,4
- RET
-
-SEARCH LD A,#23 ;%00100011
-ASEARCH EX AF,AF' ; 76ADLSHR
- LD A,DIRPAGE
- CALL BANK
- PUSH AF
- EX AF,AF'
- CPL
- LD C,A
- LD IX,DIR
- EXX
- LD DE,0
- EXX
-SEARCH1 LD A,(IX+00)
- OR A
- JR Z,SEARCH4
- CP #E5
- JR Z,SEARCH3
- LD A,(IX+11)
- AND C
- JR NZ,SEARCH3
- LD HL,MASKARE
- LD D,XH
- LD E,XL
- LD B,11
- EX DE,HL
-SEARCH2 LD A,(DE)
- CP '?'
- JR Z,SEARCH5
- CP (HL)
- JR NZ,SEARCH3
-SEARCH5 INC HL
- INC DE
- DJNZ SEARCH2
- LD D,XH
- LD E,XL
- LD HL,HANDBUF
- EX DE,HL
- LD BC,HANDBUF.SIZE
- LDIR
- POP AF
- OUT (SLOT3),A
- AND A
- RET
-
-SEARCH3 EXX
- INC DE
- EXX
- LD DE,#0020
- ADD IX,DE
- JR NC,SEARCH1
-SEARCH4 POP AF
- OUT (SLOT3),A
- LD A,DSS_Error.sys.FILE_NOT_FOUND
- SCF
- RET
-
-GETWORD:
- LD DE,TMPNAME
- LD BC,#0DFF
-.loop: LD A,(HL)
- INC HL
- CP '\'
- JR Z,.DIR_NAME
- CP ':'
- JR Z,.DRV_NAME
- LD (DE),A
- INC DE
- CP '!'
- CCF
- RET NC
- DJNZ .loop
- LD A,DSS_Error.sys.INVALID_NAME
- SCF
- RET
-
-.DIR_NAME:
- LD A,#00
- LD (DE),A
- PUSH HL
- LD HL,TMPNAME
- CALL OPENDIR
- POP HL
- JR NC,GETWORD
- RET
-
-.DRV_NAME:
- LD A,(TMPNAME)
- CP 'a'
- JR C,.next
- CP '{'
- JR NC,.next
- SUB #20
-.next: SUB 'A'
- PUSH HL
- CALL OPENDSK
- POP HL
- JP NC,GETWORD
- RET
-
-TMPNAME: DB ' ',#00 ; 12 пробелов и 0
-
-;
-CHNDISK:
- ;R10
- ; CALL OPENDSK
- ; RET C
- ; LD HL,DIRSPEC+1
- ; LD (HL),0
- ; PUSH AF
- ; CALL OPENDIR
- ; POP BC
- ; RET C
- ; LD A,B
- ; RET
- ;R10
-OPENDSK:
- PUSH AF
- LD C,1
- RST #18
- POP BC
- JP C,.error
- LD A,B
- LD (FatBuffer.DRIVE),A
- CALL RD_BPB
- RET C
- LD A,(LDRIVE)
- AND A
- RET
-.error: CP DSS_Error.sys.INVALID_DRIVE
- SCF
- RET Z
- LD A,DSS_Error.sys.NOT_READY
- RET
-;
-
-OPENDIR XOR A
- CALL SET_FM
- LD A,(HL)
- OR A
- JP NZ,SUBDIR
-REROOT1 LD DE,0
- LD (IY+_sFM.ST_CLUSTER),E
- LD (IY+_sFM.ST_CLUSTER+1),D
- CALL LOADDIR
- LD HL,DIRSPEC
- LD (HL),'\'
- INC HL
- LD (HL),#00
- AND A
- RET
-
-SUBDIR CP "."
- JR NZ,SUBDIR2
- LD A,(IY+_sFM.ST_CLUSTER) ;R05
- OR (IY+_sFM.ST_CLUSTER+1) ;R05
- JR NZ,SUDI1 ;R05
- INC HL ;R05
- LD A,(HL) ;R05
- OR A ;R05
- DEC HL ;R05
- JR Z,REROOT1 ;R05
-SUDI1 EXX
- LD HL,MASKARE
- LD DE,MASKARE+1
- LD BC,10
- LD (HL),#20
- LDIR
- EXX
- LD DE,MASKARE
-SUBDIR0 LDI
- LD A,(HL)
- OR A
- JR NZ,SUBDIR0
- JR SUBDIR3
-
-SUBDIR2 LD DE,MASKARE
- CALL MASK
- RET C
-SUBDIR3 CALL FINDDIR
- RET C
- LD (IY+_sFM.ST_CLUSTER),E
- LD (IY+_sFM.ST_CLUSTER+1),D
- LD DE,#4000
- LD (IY+_sFM.F_SIZE),E
- LD (IY+_sFM.F_SIZE+1),D
- CALL LOADDIR
- AND A
- RET
-
-
-; FIND "MASKAREA" IN DIRECTORY
-FINDDIR LD A,DIRPAGE
- CALL BANK
- PUSH AF
- LD IX,DIR
-.F_01: LD A,(IX+00)
- OR A
- JR Z,.error
- CP #E5
- JR Z,.F_03
- LD A,(IX+11)
- AND #10
- JR Z,.F_03
- LD HL,MASKARE
- LD D,XH
- LD E,XL
- EX DE,HL
- LD B,11
-.loop: LD A,(DE)
- CP "?"
- JR Z,.F_05
- CP (HL)
- JR NZ,.F_03
-.F_05: INC HL
- INC DE
- DJNZ .loop
- LD A,(IX+0)
- CP "."
- JP NZ,ADDSPEC
- LD A,(IX+1)
- CP "."
- JP NZ,IT_DIR
- LD HL,DIRSPEC
- LD D,H
- LD E,L
- INC HL
- LD BC,DIRSPEC.DEPTH
- XOR A
- CPIR ;!FIXIT нет проверки на завершение по BC=0
- DEC HL ;R09 ;[x] исправлен баг с парсингом буфера каталога
- DEC HL
- LD BC,DIRSPEC.DEPTH
- LD A,'\'
- CPDR
- INC HL
- AND A
- EX DE,HL
- SBC HL,DE
- EX DE,HL
-; JR NZ,ROTZ
- JR NZ,MM3
- JR MM2_5
-; INC HL
-; ROTZ LD (HL),0
-; JP IT_DIR
-; IT_DIR LD E,(IX+_sFM.ST_CLUSTER)
-; LD D,(IX+_sFM.ST_CLUSTER+1)
-; POP AF
-; OUT (SLOT3),A
-; AND A
-; RET
-.F_03: LD BC,#0020
- ADD IX,BC
- JR NC,.F_01
-.error: POP AF
- OUT (SLOT3),A
- LD A,DSS_Error.sys.PATH_NOT_FOUND
- SCF
- RET
-
-ADDSPEC LD E,XL
- LD D,XH
- LD HL,DIRSPEC+1
- LD BC,DIRSPEC.DEPTH
- XOR A
- CPIR ;!FIXIT нет проверки на завершение по BC=0
- DEC HL
- DEC HL
- LD A,'\' ; #5C
- CP (HL)
- INC HL
- JR Z,ADDSPE0
- LD (HL),A
- INC HL
-ADDSPE0:
- ;R11
- LD A,B
- AND A
- JR NZ,MM1
- LD A,C
- CP 8
- JR C,FINDDIR.error
- ;R11
- LD BC,#0820
-MM1 LD A,(DE)
- INC DE
- CP C
- JR Z,MM2
- LD (HL),A ;!FIXIT вот тут может вылезать за пределы буфера при длинном пути и грохать код и данные. R11 времено лечит костылём
- INC HL
-MM2 DJNZ MM1
- LD A,(DE)
- INC DE
- CP C
- JR Z,MM3
- LD (HL),"."
- INC HL
- LD (HL),A
- INC HL
- LD A,(DE)
- INC DE
- CP C
- JR Z,MM3
- LD (HL),A
- INC HL
- LD A,(DE)
- CP C
- JR Z,MM3
- LD (HL),A
-
-MM2_5: INC HL
-MM3: LD (HL),0
-; JP IT_DIR
-IT_DIR: LD E,(IX+_sFM.ST_CLUSTER)
- LD D,(IX+_sFM.ST_CLUSTER+1)
- POP AF
- OUT (SLOT3),A
- AND A
- RET
-
-
-CURRDIR: EX DE,HL
- LD HL,DIRSPEC
-CURDIR1 LD A,(HL)
- OR A
- LDI
- JR NZ,CURDIR1
- RET
-
-LOADDIR:
- XOR A
- LD HL,0
- LD IX,0
- LD B,0
- CALL MOVE_FP
- LD A,DIRPAGE
- CALL BANK
- PUSH AF
- LD HL,#C000
- LD DE,#C001
- LD BC,#3FFF
- LD (HL),L
- LDIR
- LD A,(FatBuffer.DRIVE)
- LD (IY+_sFM.DRIVE),A
- LD D,(IY+_sFM.ST_CLUSTER)
- LD E,(IY+_sFM.ST_CLUSTER+1)
- LD A,D
- OR E
- JP Z,LROTDIR
- LD HL,DIR
- LD DE,#4000
- XOR A
- CALL READ
- LD (DIRSIZE),DE
- POP AF
- OUT (SLOT3),A
- AND A
- RET
-
-LROTDIR LD HL,(FatBuffer.DIR_FRH)
- LD IX,(FatBuffer.DIR_FRL)
- LD A,(FatBuffer.DIR_S_S)
- LD B,32
- SUB B
- JR NC,RTD1
- ADD A,B
- LD B,A
-RTD1 LD A,(FatBuffer.DRIVE)
- LD C,5
- LD DE,DIR
- RST #18
- POP AF
- OUT (SLOT3),A
- AND A
- RET
-
-SAVEDIR XOR A
- LD HL,0
- LD IX,0
- LD B,0
- CALL MOVE_FP
- LD A,DIRPAGE
- CALL BANK
- PUSH AF
- LD A,(FatBuffer.DRIVE)
- LD (IY+_sFM.DRIVE),A
- LD D,(IY+_sFM.ST_CLUSTER)
- LD E,(IY+_sFM.ST_CLUSTER+1)
- LD A,D
- OR E
- JP Z,SROTDIR
- LD HL,DIR
- LD DE,(DIRSIZE)
- XOR A
- CALL WRITE
- POP AF
- OUT (SLOT3),A
- AND A
- RET
-
-SROTDIR LD HL,(FatBuffer.DIR_FRH)
- LD IX,(FatBuffer.DIR_FRL)
- LD A,(FatBuffer.DIR_S_S)
- LD B,32
- SUB B
- JR NC,RTD1S
- ADD A,B
- LD B,A
-RTD1S LD A,(FatBuffer.DRIVE)
- LD C,6
- LD DE,DIR
- RST #18
- POP AF
- OUT (SLOT3),A
- AND A
- RET
-
-DIRSIZE DW 0
-
-;!FIXIT Переделать просто на структуру, чтоб получать номера страниц без этого гемора
-BANK: LD C,A
- LD B,0
- LD HL,BANKTBL
- ADD HL,BC
- IN A,(SLOT3)
- LD C,SLOT3
- OUTI
- RET
-
-BANKTBL:
- BLOCK USING_MEMPAGES+1,#FF
-
-;G_HAND1 POP IX
-; POP HL
-; POP DE
-; RET
-
-;GHANDLE PUSH DE
-; PUSH HL
-; PUSH IX
-; CALL TESTDSK
-; JP C,G_HAND1
-; CALL LOADDIR
-; POP DE
-; LD HL,DIR
-; LD BC,#0020
-;G_HAND2 LD A,D
-; OR E
-; JP Z,G_HAND3
-; ADD HL,BC
-; DEC DE
-; JP G_HAND2
-;G_HAND3 EXX
-; POP DE
-; EXX
-;G_HAND4 EX DE,HL
-; LD A,DIRPAGE
-; CALL BANK
-; EX DE,HL
-; LD DE,HANDTA
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; EXX
-; OUT (SLOT3),A
-; LD HL,HANDTA
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; LDI
-; EXX
-; POP BC
-; DEC BC
-; LD A,B
-; OR C
-; RET Z
-; PUSH BC
-; JP G_HAND4
-
-;HANDTA DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-; DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
-MASKARE
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
-; HL - MASK "file*.t??"
-; DE - 11 bytes filename
-; RET: C=2 FILE WITHOUT EXTENTION
-; C=1 FILE WITH EXTENTION
-
-MASK PUSH HL
- PUSH DE
- LD H,D
- LD L,E
- INC DE
- LD (HL),#20
- LD BC,10
- LDIR
- POP DE
- POP HL
- LD A,(HL)
- CP '.' ;R07
- SCF ;R07
- JR Z,MASKB ;R07
- CP '!'
-MASKB LD A,DSS_Error.sys.INVALID_NAME
- RET C
- LD BC,#0902
-MASK1 LD A,(HL)
- CP '!'
- CCF
- RET NC
- CP '"'
- JR Z,MASK7
- CP '*'
- JR Z,MASK3
- CP '+'
- JR Z,MASK7
- CP ','
- JR Z,MASK7
- CP '.'
- JR Z,MASK5
- CP '/'
- JR Z,MASK7
- CP ':'
- JR Z,MASK7
- CP ';'
- JR Z,MASK7
- CP '<'
- JR Z,MASK7
- CP '='
- JR Z,MASK7
- CP '>'
- JR Z,MASK7
- CP '['
- JR Z,MASK7
- CP '\'
- JR Z,MASK7
- CP ']'
- JR Z,MASK7
- CP '|'
- JR Z,MASK7
-; CP 'a' ;?????
-; JR C,MASK2
-; CP '{'
-; JR NC,MASK2
-; SUB #20
- CALL UPPER
-MASK2 LD (DE),A
- INC HL
- INC DE
- DJNZ MASK1
-MASK7 LD A,DSS_Error.sys.INVALID_NAME
- SCF
- RET
-
-MASK3 LD A,'?'
- INC HL
- DJNZ MASK6
- LD A,DSS_Error.sys.INVALID_NAME
- SCF
- RET
-
-MASK6 LD (DE),A
- INC DE
- DJNZ MASK6
- LD B,1
- JR MASK1
-
-MASK5 LD A,' '
- INC HL
- DJNZ MASK4
- LD B,4
- DEC C
- JP NZ,MASK1
- LD A,DSS_Error.sys.INVALID_NAME
- SCF
- RET
-
-MASK4 LD (DE),A
- INC DE
- DJNZ MASK4
- LD B,4
- DEC C
- JP NZ,MASK1
- LD A,DSS_Error.sys.INVALID_NAME
- SCF
- RET
-
-UPPER CP 'a'
- RET C
- CP '{'
- JR NC,MDUPPER
- SUB #20
-NOUPPER RET
-
-MDUPPER CP 'а' ; русская буква а, код #A0
- JR C,NOUPPER
- CP 'п' ; русская буква п, код #B0
- JR NC,BGUPPER
- SUB #20
- RET
-
-BGUPPER CP 'р' ; русская буква р, код #E0
- JR C,NOUPPER
- CP 'Ё' ; русская буква Ё, код #F0
- JR NC,HGUPPER
- SUB #50
- RET
-
-HGUPPER CP 'ё' ; русская буква ё, код #F1
- RET NZ
- DEC A
- RET
-
-SYSTIME LD C,#F5
- RST ToBIOS
- JP C,NOCMOS
- LD D,7 ;DAY
- CALL RCMOS
- PUSH AF
- LD D,8 ;MONTH
- CALL RCMOS
- POP DE
- LD E,A
- PUSH DE
- LD D,4 ;HOUR
- CALL RCMOS
- PUSH AF
- LD D,2 ;MINUTE
- CALL RCMOS
- POP DE
- LD E,A
- PUSH DE
- LD D,0 ;SECOND
- CALL RCMOS
- PUSH AF
- LD D,6 ;WEEK DAY
- LD C,#F6
- RST ToBIOS
- POP DE
- LD E,A
- PUSH DE
- LD D,9 ;YEAR
- CALL RCMOS ;READ AND CONVERT TO DECIMAL
- PUSH AF
- LD D,#32 ;CENTURY
- LD C,#F6
- RST ToBIOS
- LD XH,A
-
- POP AF
- CP 80 ;R01, TEST DECIMAL FIX
- PUSH AF
- JR C,XXIAGE
- LD A,#19
- CP XH
- JR Z,GOODAGE
- JR BADAGE
-
-XXIAGE LD A,#20
- CP XH
- JR Z,GOODAGE
-BADAGE PUSH AF
- LD D,#32 ;CENTURY
- LD C,#F7
- RST ToBIOS
- POP AF
- LD XH,A
-GOODAGE POP AF
- LD XL,A
- LD A,XH
- CALL BCD2HEX
- LD L,A
- LD H,0
- LD C,L
- LD B,H
- LD XH,B
- ADD HL,HL
- ADD HL,HL
- ADD HL,BC
- ADD HL,HL ;*10
- LD B,H
- LD C,L
- ADD HL,HL
- ADD HL,HL
- ADD HL,BC
- ADD HL,HL ;*10(100)
- EX DE,HL
- ADD IX,DE
- POP BC
- POP HL
- POP DE
- AND A
- RET
-
-RCMOS LD C,#F6
- RST ToBIOS
-; INPUT : A - BCD
-; OUTPUT: A - HEX
-BCD2HEX
- LD E,A
- RRCA
- RRCA
- RRCA
- RRCA
- AND #0F
- LD D,A
- ADD A,A
- ADD A,A
- ADD A,D
- ADD A,A
- LD D,A
- LD A,E
- AND #0F
- ADD A,D
- RET
-
-NOCMOS LD DE,(NC_DAY) ;DAY/MONTH
- LD HL,(NC_HOUR) ;HOUR/MINUTE
- LD BC,(NC_SEC) ;SECOND/WEEKDAY
- LD IX,(NC_YEAR) ;YEAR
- AND A
- RET
-
-; !FIXIT новый биос выставляет время, если с ним что-то не так.
-NOCMOS2 LD C,0
- LD (NC_DAY),DE ;DAY/MONTH
- LD (NC_HOUR),HL ;HOUR/MINUTE
- LD (NC_SEC),BC ;SECOND/WEEKDAY
- LD (NC_YEAR),IX ;YEAR
- AND A
- RET
-
-SETTIME PUSH IX
- PUSH BC
- PUSH HL
- PUSH DE
- LD C,#F5
- RST ToBIOS
- JP C,NOCMOS2
- POP AF
- PUSH AF
- LD D,7 ;DAY
- CALL WCMOS
- POP BC
- LD A,C
- LD D,8 ;MONTH
- CALL WCMOS
- POP AF
- PUSH AF
- LD D,4 ;HOUR
- CALL WCMOS
- POP BC
- LD A,C
- LD D,2 ;MINUTE
- CALL WCMOS
- POP AF
- PUSH AF
- LD D,0 ;SECOND
- CALL WCMOS
- POP BC
- LD A,C
- LD D,6 ;WEEK DAY
- LD C,#F7
- RST ToBIOS
-
- POP HL
- XOR A
- LD DE,100
-YR INC A
- SBC HL,DE
- JR NC,YR
- ADD HL,DE
- DEC A
- PUSH HL
- LD D,#32 ;CENTURY
- CALL WCMOS
- POP BC
- LD A,C
- LD D,9 ;YEAR
- CALL WCMOS
- AND A
- RET
-
-
-WCMOS CALL HEX2BCD
- LD C,#F7
- RST ToBIOS
- RET
-
-; INPUT : A - HEX
-; OUTPUT: A - BCD
-HEX2BCD
- LD BC,#0AFF
-H2B INC C
- SUB B
- JR NC,H2B
- ADD A,B
- LD B,A
- LD A,C
- RLCA
- RLCA
- RLCA
- RLCA
- AND #F0
- OR B
- RET
-
-NC_DAY DW DAY*256+MONTH ;DAY/MONTH
-NC_HOUR DW #0000 ;HOUR/MINUTE
-NC_SEC DW #0001 ;SECOND/WEEKDAY
-NC_YEAR DW YEAR ;YEAR
-
-
-GET_D_T
- CALL SET_FM
- RET C
- LD E,(IY+_sFM.TIME)
- LD D,(IY+_sFM.TIME+1)
- LD C,(IY+_sFM.DATE)
- LD B,(IY+_sFM.DATE+1)
- CALL RMKTIME
- AND A
- RET
-
-PUT_D_T PUSH AF
- CALL MK_TIME
- POP AF
- PUSH DE
- PUSH BC
- CALL SET_FM
- POP BC
- POP DE
- RET C
- LD (IY+_sFM.TIME),E
- LD (IY+_sFM.TIME+1),D
- LD (IY+_sFM.DATE),C
- LD (IY+_sFM.DATE+1),B
- SET 7,(IY+_sFM.ACCESS_MODE) ;R06
- AND A
- RET
-
-;INPUT: D - DAY; E - MONTH
-; H - HOUR; L - MINUTE
-; B - SECOND (0...59)
-; IX- YEAR (0...65535)
-;OUTPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2
-; BC - yyyyyyymmmmddddd y - year, m - month, d - day
-; (1980-2108)
-
-MK_TIME LD A,L
- RLCA
- RLCA
- SLA A
- RL H
- SLA A
- RL H
- SLA A
- RL H
- SRL B
- OR B
- LD L,A
-
- LD BC,#F844 ;(-1980)
- ADD IX,BC
- LD A,E
- RLCA
- RLCA
- RLCA
- RLCA
- AND #F0
- LD B,XL
- SLA A
- RL B
- OR D
- LD C,A
- EX DE,HL
- AND A
- RET
-
-;INPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2
-; BC - yyyyyyymmmmddddd y - year, m - month, d - day
-; (1980-2108)
-;OUTPUT: D - DAY; E - MONTH
-; H - HOUR; L - MINUTE
-; B - SECOND (0...59)
-; IX- YEAR (0...65535)
-
-RMKTIME EX DE,HL
- LD A,C
- AND #1F
- LD D,A
- SRL B
- RR C
- LD A,C
- RRCA
- RRCA
- RRCA
- RRCA
- AND #0F
- LD E,A
- LD C,B
- LD B,0
- LD IX,1980
- ADD IX,BC
- LD A,L
- AND #1F
- ADD A,A
- LD B,A
- SRL H
- RR L
- SRL H
- RR L
- SRL H
- RR L
- SRL L
- SRL L
- AND A
- RET
-
-; INPUT: HL - "C:\DIR\DIR\DIR_NAME[\]",0
-CHDIR: CALL GETWORD
- RET C
- LD HL,TMPNAME
- LD A,(HL)
- OR A
- CALL NZ,OPENDIR
- RET
-
-
-; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0
-
-MKDIR:
- _mSavePath
- CALL GETWORD
- RET C
- LD HL,TMPNAME
- LD DE,MASKARE
- CALL MASK
- RET C
- CALL LOADDIR
- CALL DSEARCH
- LD A,15
- CCF
- RET C
- CALL G_CLUST
- RET C
- PUSH HL
- LD DE,(FatBuffer.ENDCLUS)
- CALL W_T_FAT
- CALL WR_FAT
- LD HL,MASKARE
- LD DE,HANDBUF
- LD BC,11
- LDIR
- EX DE,HL
- LD A,#10
- LD (HL),A
- INC HL
- LD BC,#0A00
-FIHND0 LD (HL),C
- INC HL
- DJNZ FIHND0
- PUSH HL
- CALL SYSTIME
- CALL MK_TIME
- POP HL
- LD (HL),E
- INC HL
- LD (HL),D
- INC HL
- LD (HL),C
- INC HL
- LD (HL),B
- INC HL
- POP DE
- PUSH DE
- LD (HL),E
- INC HL
- LD (HL),D
- INC HL
- LD BC,#0400
-FIHND2 LD (HL),C
- INC HL
- DJNZ FIHND2
- CALL WRT_HND
- CALL SAVEDIR
- LD HL,SECBUF
- LD (HL),"."
- LD B,10
-MKD02 INC HL
- LD A,' '
- LD (HL),A
- DJNZ MKD02
- INC HL
- LD DE,HANDBUF+11
- EX DE,HL
- LD BC,21
- LDIR
- EX DE,HL
- LD (HL),"."
- INC HL
- LD (HL),"."
- LD B,9
-MKD03 INC HL
- LD A,#20
- LD (HL),A
- DJNZ MKD03
- INC HL
- PUSH HL
- LD A,DIRPAGE
- CALL BANK
- POP HL
- PUSH AF
- LD A,(DIR)
- CP "."
- LD DE,DIR+11
- JP Z,MKD04
- LD IX,HANDBUF
- XOR A
- LD (IX+_sFM.ST_CLUSTER),A
- LD (IX+_sFM.ST_CLUSTER+1),A
- LD DE,HANDBUF+11
-MKD04 EX DE,HL
- LD BC,HANDBUF.SIZE-11
- LDIR
- POP AF
- OUT (SLOT3),A
- EX DE,HL
- LD D,H
- LD E,L
- INC DE
- LD (HL),0
- LD BC,512-65
- LDIR
- POP HL
- CALL NSECTOR
- LD A,(BootSector.S_P_C)
-MKD12 PUSH AF
- PUSH HL
- PUSH IX
- IN A,(SLOT3)
- PUSH AF
- IN A,(SLOT0)
- OUT (SLOT3),A
-;
- LD DE,SECBUF+#C000
- LD B,1
- LD A,(FatBuffer.DRIVE)
- LD C,6
- RST #18
-;
- POP AF
- OUT (SLOT3),A
-
- LD HL,SECBUF
- LD DE,SECBUF+1
- LD BC,511
- LD (HL),0
- LDIR
- POP IX
- POP HL
- INC IX
- LD A,XH
- OR XL
- JR NZ,MKD11
- INC HL
-MKD11 POP AF
- DEC A
- JR NZ,MKD12
- AND A
- RET
-
-; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0
-RMDIR: _mSavePath
- CALL GETWORD
- RET C
- LD HL,TMPNAME
- LD DE,MASKARE
- CALL MASK
- RET C
- LD HL,MASKARE
- LD BC,11
- LD A,"?"
- CPIR
- LD A,DSS_Error.sys.INVALID_NAME
- SCF
- RET Z
- CALL LOADDIR
- CALL DSEARCH
- RET C
- LD HL,(HANDBUF+_sFM.ST_CLUSTER)
- PUSH IX
-RMD17 PUSH HL
- CALL NSECTOR
- LD A,(BootSector.S_P_C)
-RMD12 PUSH AF
- PUSH HL
- PUSH IX
- IN A,(SLOT3)
- PUSH AF
- IN A,(SLOT0)
- OUT (SLOT3),A
-
- LD DE,SECBUF+#C000
- LD BC,#0105
- LD A,(FatBuffer.DRIVE)
- RST #18
-
- POP AF
- OUT (SLOT3),A
-
- LD B,16
- LD HL,SECBUF
-RMD10 LD A,(HL)
- OR A
- JP Z,RMD15 ;DIR EMPTY
- CP "."
- JR Z,RMD14
- CP #E5
- JR Z,RMD14
- LD DE,11
- ADD HL,DE
- LD A,(HL)
- SBC HL,DE
- BIT 3,A
- JP Z,RMD16 ;DIR NOT EMPTY
-RMD14 LD DE,#0020
- ADD HL,DE
- DJNZ RMD10
- POP IX
- POP HL
- INC IX
- LD A,XH
- OR XL
- JR NZ,RMD11
- INC HL
-RMD11 POP AF
- DEC A
- JR NZ,RMD12
- POP HL
- CALL R_F_FAT
- EX DE,HL
- JR NC,RMD17
-RMD18 POP IX
- JP DELFILE
-
-RMD15 POP IX
- POP HL
- POP AF
- POP HL
- JR RMD18
-
-RMD16 POP IX
- POP HL
- POP AF
- POP HL
- POP IX
- LD A,DSS_Error.sys.DIR_NOT_EMPTY
- SCF
- RET
-
-;//MODULE: DOS5
-;[END]
-
diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM
deleted file mode 100644
index 601f442..0000000
--- a/DSS/DOS_FM.ASM
+++ /dev/null
@@ -1,831 +0,0 @@
-
-;[BEGIN]
-;//MODULE: DOS_FM
-;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
-;//UPDATE: 24-10-1999 DNS Restore module
-;---------------------------------------------------------------
-;Rev Date Name Description
-;---------------------------------------------------------------
-;R01 16-11-1999 DNS ERROR READING FAT CHAIN
-;---------------------------------------------------------------
-
-;FMS DB FMCOUNT
-
-;ACCESS MODE:
-; 00 - READ/WRITE
-; 01 - READ
-; 02 - WRITE
-;FM_BUF:
-;File Manipulator (FM)
- ; BYTE '. ' ;+00 NAME
- ; BYTE ' ' ;+08 EXT
- ; BYTE #10 ;+11 ATTRIBUT
- ; BYTE 0 ;+12 RESERVED; !TODO следующий кластер для чтения
- ; BYTE 0 ;+13 RESERVED; !TODO следующий кластер для записи
- ; BLOCK 8,0 ;+14 RESERVED
- ; WORD #0000 ;+22 TIME
- ; WORD #0000 ;+24 DATE
- ; WORD #0000 ;+26 START CLUSTER
- ; DWORD #0000 ;+28 SIZE FILE
- ; DWORD #0000 ;+32 FILE POSITION (FP)
- ; WORD #0000 ;+36 DIRECTORY CLUSTER
- ; WORD #0000 ;+38 HANDLE NUMBER
- ; BYTE #00 ;+40 DRIVE OR CURRENT
- ; BYTE #00 ;+41 ACCESS MODE
- ; BYTE #00 ;+42 TASK
- ; BYTE #00 ;+43 EMPTY
-/*
-;!TEST
-FM_BUF: _sFM
-.Size EQU _sFM
- BLOCK (FMCOUNT-1)*FM_BUF.Size, 0
-*/
-
- MACRO _mFM_FIND
- CP FMCOUNT+1
- JR NC,ABS_FM
- PUSH DE
-
- LD IY,FM_BUF
- LD DE,FM_BUF.Size
- AND A
- JR Z,.endLoop
-.loop: ADD IY,DE
- DEC A
- JR NZ,.loop
-.endLoop:
- POP DE
- ; A=0
- OR (IY) ;+00 NAME
- ENDM
-
-SET_FM:
- _mFM_FIND
-
- LD A,0 ;!FIXIT номер ошибки
- RET NZ
-ABS_FM LD A,DSS_Error.sys.INVALID_HANDLE
- SCF
- RET
-
-RES_FM:
- _mFM_FIND
-
- LD A,5
- EXX
- SCF
- RET Z
- XOR A
- LD (IY+0),A
- RET
-
-GET_FM: LD B,FMCOUNT
- LD C,#FF
- LD IY,FM_BUF-FM_BUF.Size
- LD DE,FM_BUF.Size
-.loop: ADD IY,DE
- INC C
- LD A,(IY+0)
- OR A
- RET Z
- DJNZ .loop
- LD A,DSS_Error.sys.NO_HANDLES
- SCF
- RET
-
-; HL:IX - OFFSET POINTER
-; A - FILE MANIPULATOR
-MOVE_FP CALL SET_FM
- RET C
- INC B
- DEC B
- JR Z,.F_start
- DEC B
- JR Z,.F_current
- DEC B
- JR Z,.B_end
- LD A,DSS_Error.sys.INVALID_FUNCTION
- SCF
- RET
-
-;from Start File
-.F_start:
- ; B=0
- LD C,B
- LD D,B
- LD E,B
- JR MOVE_F1
-
-;from End File
-.B_end: LD C,(IY+28)
- LD B,(IY+29)
- LD E,(IY+30)
- LD D,(IY+31)
- JR MOVE_F1
-
-;from Current Position
-.F_current:
- LD C,(IY+32)
- LD B,(IY+33)
- LD E,(IY+34)
- LD D,(IY+35)
-MOVE_F1 ADD IX,BC
- ADC HL,DE
- LD D,XH
- LD E,XL
- LD (IY+32),E
- LD (IY+33),D
- LD (IY+34),L
- LD (IY+35),H
- XOR A
- RET
-
-;FP COMPARE
-; CY - FILE POINTER > SIZE
-; NC - FILE POINTER < SIZE
-
-MOVE_CP LD L,(IY+28)
- LD H,(IY+29)
- LD E,(IY+32)
- LD D,(IY+33)
- AND A
- SBC HL,DE
- LD L,(IY+30)
- LD H,(IY+31)
- LD E,(IY+34)
- LD D,(IY+35)
- SBC HL,DE
- RET
-
-;--------------------
-
-ECL2 POP BC
- POP DE
- AND A
- RET
-
-BLOKRD0 POP BC
- POP DE
- SCF
- RET
-
-;READ SECTORS OF FILE
-;HL:DE - FP (in sectors)
-; B - Amount sectors
-BLOK_RD PUSH BC
- LD (READMEM),IX
- LD A,(BootSector.S_P_C) ;SECTORS PER CLUSTER
- LD C,A
- LD B,0
- CALL DIV32
- LD B,XH
- LD C,XL
- PUSH HL ;RESIDUE
- LD L,(IY+26) ;START CLUSTER
- LD H,(IY+27)
- LD A,H
- OR L
- JR NZ,BLOKRD2
- JR ECL2 ;R01 JR BLOKRD0
-BLOKRD1 PUSH BC
- CALL R_F_FAT
- POP BC
- JR C,ECL2 ;R01
- EX DE,HL
- DEC BC
-BLOKRD2 LD A,B
- OR C
- JR NZ,BLOKRD1
- POP DE
- POP BC
- LD A,(BootSector.S_P_C)
- SUB E
- LD C,A ;\
- CP B ; \
- JR C,BLOKRD3 ;SIZE > RESIDUE CLUSTER ; \
- LD C,B ;SIZE < CLUSTER ;->-|--> ; !TODO разобраться
-BLOKRD3 LD A,B ; /
- SUB C ; /
- LD B,A ;/
- PUSH HL
- PUSH BC
- PUSH DE
- CALL NSECTOR
- POP DE
- ADD IX,DE
- JR NC,BLOKRD4
- INC HL
-BLOKRD4 LD DE,(READMEM)
- LD A,(FatBuffer.DRIVE)
- LD B,C
- LD C,5
- RST #18
- JP C,BLOKRD0
- POP BC
- LD HL,(READMEM)
- LD DE,(BootSector.B_P_S)
-BLOKRD5 ADD HL,DE
- DEC C
- JR NZ,BLOKRD5
- LD (READMEM),HL
- POP DE
- LD A,B
- OR A
- RET Z
-BLOKRD6 LD HL,BootSector.S_P_C
- LD A,B
- SUB (HL)
- LD B,A
- LD C,(HL)
- JR NC,BLOKRD7
- LD B,0
- ADD A,(HL) ;0 AND CF
- LD C,A
- OR A ;CLEAR CF
- RET Z
-BLOKRD7 EX DE,HL
- PUSH BC
- CALL R_F_FAT
- POP BC
- JP C,ECL1 ;R01?
- EX DE,HL
- PUSH HL
- PUSH BC
- CALL NSECTOR
- LD DE,(READMEM)
- LD A,(FatBuffer.DRIVE)
- LD B,C
- LD C,5
- RST #18
- JP C,BLOKRD0
- POP BC
- LD HL,(READMEM)
- LD DE,(BootSector.B_P_S)
-BLOKRD8 ADD HL,DE
- DEC C
- JR NZ,BLOKRD8
- LD (READMEM),HL
- POP DE
- JR BLOKRD6
-
-ECL1 AND A
- RET
-
-;--------------------
-
-BLOKWRC POP BC
-BLOKWR0 POP BC
- POP DE
- SCF
- RET
-
-;WRITE SECTORS OF FILE
-;HL:DE - FP (in sectors)
-; B - Amount sectors
-
-BLOK_WR PUSH BC
- LD (READMEM),IX
- LD A,(BootSector.S_P_C) ;SECTORS PER CLUSTER
- LD C,A
- LD B,0
- CALL DIV32
- LD B,XH
- LD C,XL
- PUSH HL ;RESIDUE
- LD L,(IY+26) ;START CLUSTER
- LD H,(IY+27)
- LD A,H
- OR L
- JR NZ,BLOKWR2
- PUSH BC
- CALL G_CLUST
- JR C,BLOKWRC
- LD (IY+26),L
- LD (IY+27),H
- LD DE,(FatBuffer.ENDCLUS)
- CALL W_T_FAT
- PUSH HL
- CALL WR_FAT
- POP HL
- POP BC
- JR BLOKWR2
-BLOKWR1 PUSH BC
- CALL R_F_FAT
- JR NC,BLOKWRB
- PUSH HL
- CALL INC_FAT
- POP HL
- JR C,BLOKWRC
- CALL R_F_FAT
-BLOKWRB POP BC
- EX DE,HL
- DEC BC
-BLOKWR2 LD A,B
- OR C
- JR NZ,BLOKWR1
- POP DE
- POP BC
- LD A,(BootSector.S_P_C)
- SUB E
- LD C,A
- CP B
- JR C,BLOKWR3 ;SIZE > RESIDUE CLUSTER
- LD C,B ;SIZE < CLUSTER
-BLOKWR3 LD A,B
- SUB C
- LD B,A
- PUSH HL
- PUSH BC
- PUSH DE
- CALL NSECTOR
- POP DE
- ADD IX,DE
- JR NC,BLOKWR4
- INC HL
-BLOKWR4 LD DE,(READMEM)
- LD A,(FatBuffer.DRIVE)
- LD B,C
- LD C,6
- RST #18
- JP C,BLOKWR0
- POP BC
- LD HL,(READMEM)
- LD DE,(BootSector.B_P_S)
-BLOKWR5 ADD HL,DE
- DEC C
- JR NZ,BLOKWR5
- LD (READMEM),HL
- POP DE
- LD A,B
- OR A
- RET Z
-BLOKWR6 LD HL,BootSector.S_P_C
- LD A,B
- SUB (HL)
- LD B,A
- LD C,(HL)
- JR NC,BLOKWR7
- LD B,0
- ADD A,(HL) ;0 AND CF
- LD C,A
- OR A ;CLEAR CF
- RET Z
-BLOKWR7 EX DE,HL
- PUSH BC
- CALL R_F_FAT
- JR NC,BLOKWR9
- PUSH HL
- CALL INC_FAT
- POP HL
- JR C,BLOKWRA
- CALL R_F_FAT
-BLOKWR9 POP BC
- EX DE,HL
- PUSH HL
- PUSH BC
- CALL NSECTOR
- LD DE,(READMEM)
- LD A,(FatBuffer.DRIVE)
- LD B,C
- LD C,6
- RST #18
- JP C,BLOKWR0
- POP BC
- LD HL,(READMEM)
- LD DE,(BootSector.B_P_S)
-BLOKWR8 ADD HL,DE
- DEC C
- JR NZ,BLOKWR8
- LD (READMEM),HL
- POP DE
- JR BLOKWR6
-
-BLOKWRA POP BC
- LD A,DSS_Error.sys.DISK_FULL
- SCF
- RET
-
-TSTSIZE XOR A
- LD (READCOD),A
- LD L,(IY+32) ;FP LOW
- LD H,(IY+33)
- ADD HL,DE
- EXX
- LD DE,0
- LD L,(IY+34) ;FP HIGH
- LD H,(IY+35)
- ADC HL,DE
- EXX ;HL':HL - NEW FP
- LD C,(IY+28)
- LD B,(IY+29) ;SIZE LOW
- AND A
- SBC HL,BC
- EXX
- LD C,(IY+30) ;SIZE HIGH
- LD B,(IY+31)
- SBC HL,BC
- EXX
- RET C ;OK READ ALL
- EX DE,HL
- SBC HL,DE ;VERY BIG
- EX DE,HL
- LD A,#FF
- LD (READCOD),A
- RET
-
-; HL - ADDRESS
-; DE - SIZE
-; A - FM
-
-READ LD (R_POINT),HL
- LD (S_POINT),HL
- CALL SET_FM
- RET C
- CALL TSTSIZE
- LD A,D
- OR E
- JP Z,NOREAD
- PUSH DE
- LD A,(IY+_sFM.DRIVE)
- CALL OPENDSK
- JP C,RPERR1
- LD C,(IY+_sFM.F_POSITION)
- LD E,(IY+_sFM.F_POSITION+1)
- LD A,E
- AND #01
- LD B,A
- LD D,(IY+_sFM.F_POSITION+2)
- LD L,(IY+_sFM.F_POSITION+3)
- LD H,0
- OR A
- RR L
- RR D
- RR E ;HL:DE FP (in sectors)
- ; BC FP residue (in bytes)
- LD A,B
- OR C
- JP NZ,ROV1
-ROV4 POP BC
- PUSH BC
- SRL B
- JR Z,ROV2
- LD (SECTORH),HL
- LD (SECTORL),DE
- LD IX,(R_POINT)
- CALL BLOK_RD
- JP C,RPERR1
- LD DE,(R_POINT)
-READMEM+1: LD HL,0 // LD HL,(READMEM)
- AND A
- SBC HL,DE
- LD C,H
- LD B,0
- ADD HL,DE
- LD (R_POINT),HL
- SRL C
-SECTORL+1: LD HL,0 // LD HL,(SECTORL)
- ADD HL,BC
- EX DE,HL
-SECTORH+1: LD HL,0 // LD HL,(SECTORH)
- LD C,B
- ADC HL,BC
-ROV2 POP BC
- LD A,B
- AND #01
- LD B,A
- OR C
- JP Z,ROV6
- PUSH BC
- LD IX,BUFFER+#C000
- LD B,1
- IN A,(SLOT3)
- PUSH AF
- IN A,(SLOT0)
- OUT (SLOT3),A
- CALL BLOK_RD
- POP BC
- LD C,SLOT3
- OUT (C),B
- JP C,RPERR1
- LD HL,BUFFER
- LD DE,(R_POINT)
- POP BC
- LDIR
- LD (R_POINT),DE
-
-ROV6:
-S_POINT+1: LD HL,0 // LD HL,(S_POINT)
- LD DE,(R_POINT)
- EX DE,HL
- AND A
- SBC HL,DE
- PUSH HL
- EX DE,HL
- LD XH,D
- LD XL,E
- LD HL,0
- CALL MOVE_FP.F_current
- POP DE
-NOREAD:
-READCOD+1: LD A,0 // LD A,(READCOD)
- OR A
- RET
-
-ROV1 PUSH BC
- PUSH HL
- PUSH DE
- LD IX,BUFFER+#C000
- LD B,1
- IN A,(SLOT3)
- PUSH AF
- IN A,(SLOT0)
- OUT (SLOT3),A
- CALL BLOK_RD
- POP BC
- LD C,SLOT3
- OUT (C),B
- POP HL
- JP C,RPERR3
- LD BC,1
- ADD HL,BC
- EX DE,HL
- POP HL
- LD C,B
- ADC HL,BC
- EXX
- POP DE
- LD HL,512
- AND A
- SBC HL,DE
- LD B,H
- LD C,L
- POP HL
- AND A
- SBC HL,BC
- JR NC,ROV3
- ADD HL,BC
- LD B,H
- LD C,L
- LD HL,0
-ROV3 PUSH HL
- LD HL,BUFFER
- ADD HL,DE
- LD DE,(R_POINT)
- LDIR
- LD (R_POINT),DE
- EXX
- JP ROV4
-
-RPERR3 POP HL
-RPERR2 POP HL
-RPERR1 POP BC
- SCF
- RET
-
-PWERR3 POP HL
-PWERR2 POP HL
-PWERR1 POP BC
- SCF
- RET
-
-RD_ONLY POP DE
- LD A,DSS_Error.sys.READONLY
- SCF
- RET
-
-; HL - ADDRESS
-; DE - SIZE
-; A - FM
-
-WRITE LD (R_POINT),HL
- LD (S_POINT),HL
- PUSH DE
- CALL SET_FM
- JP C,PWERR1
- LD A,(IY+_sFM.ACCESS_MODE)
- AND #01
- JR NZ,RD_ONLY
- SET 7,(IY+_sFM.ACCESS_MODE)
- SET 5,(IY+_sFM.ATTRIBUT)
- LD A,(IY+_sFM.DRIVE)
- CALL OPENDSK
- JP C,PWERR1
- LD C,(IY+32)
- LD A,(IY+33)
- LD E,A
- AND #01
- LD B,A
- LD D,(IY+34)
- LD L,(IY+35)
- LD H,0
- OR A
- RR L
- RR D
- RR E ;HL:DE FP (in sectors)
- ; BC FP residue (in bytes)
- LD A,B
- OR C
- JP NZ,WOV1
-WOV4 POP BC
- PUSH BC
- SRL B
- JR Z,WOV2
- PUSH HL
- PUSH DE
- PUSH BC
-R_POINT+2: LD IX,0 // LD IX,(R_POINT)
-
- CALL BLOK_WR
- POP BC
- JP C,PWERR3
- LD C,B
- LD HL,(R_POINT)
- LD DE,#0200
-WOV5 ADD HL,DE
- DJNZ WOV5
- LD (R_POINT),HL
- LD B,0
- POP HL
- ADD HL,BC
- EX DE,HL
- POP HL
- LD C,B
- ADC HL,BC
-WOV2 POP BC
- LD A,B
- AND #01
- LD B,A
- OR C
- JP Z,WOV6
- PUSH HL
- PUSH DE
- PUSH BC
- LD IX,BUFFER+#C000
- LD B,1
- IN A,(SLOT3)
- PUSH AF
- IN A,(SLOT0)
- OUT (SLOT3),A
- CALL BLOK_RD
- POP BC
- LD C,SLOT3
- OUT (C),B
- LD DE,BUFFER
- LD HL,(R_POINT)
- POP BC
- JP C,PWERR2
- LDIR
- LD (R_POINT),HL
- POP DE
- POP HL
- LD IX,BUFFER+#C000
- LD B,1
- IN A,(SLOT3)
- PUSH AF
- IN A,(SLOT0)
- OUT (SLOT3),A
- CALL BLOK_WR
- POP BC
- LD C,SLOT3
- OUT (C),B
- RET C
-WOV6 LD DE,(S_POINT)
- LD HL,(R_POINT)
- AND A
- SBC HL,DE
- PUSH HL
- EX DE,HL
- LD XH,D
- LD XL,E
- LD HL,0
- CALL MOVE_FP.F_current
- CALL MOVE_CP
- POP DE
- RET NC
- LD L,(IY+32)
- LD H,(IY+33)
- LD C,(IY+34)
- LD B,(IY+35)
- LD (IY+28),L
- LD (IY+29),H
- LD (IY+30),C
- LD (IY+31),B
- AND A
- RET
-
-WOV1 PUSH BC
- PUSH HL
- PUSH DE
- LD IX,BUFFER+#C000
- LD B,1
- IN A,(SLOT3)
- PUSH AF
- IN A,(SLOT0)
- OUT (SLOT3),A
- CALL BLOK_RD
- POP BC
- LD C,SLOT3
- OUT (C),B
- POP DE
- POP HL
- EXX
- POP DE
- JP C,PWERR1
- LD HL,512
- AND A
- SBC HL,DE
- LD B,H
- LD C,L
- POP HL
- AND A
- SBC HL,BC
- JR NC,WOV3
- ADD HL,BC
- LD B,H
- LD C,L
- LD HL,0
-WOV3 PUSH HL
- LD HL,BUFFER
- ADD HL,DE
- LD DE,(R_POINT)
- EX DE,HL
- LDIR
- LD (R_POINT),HL
- EXX
- PUSH HL
- PUSH DE
- LD IX,BUFFER+#C000
- LD B,1
- IN A,(SLOT3)
- PUSH AF
- IN A,(SLOT0)
- OUT (SLOT3),A
- CALL BLOK_WR
- POP BC
- LD C,SLOT3
- OUT (C),B
- POP HL
- JP C,PWERR2
- LD BC,1
- ADD HL,BC
- EX DE,HL
- POP HL
- LD C,B
- ADC HL,BC
- JP WOV4
-
-
-; HL - CLUSTER
-; HL:IX - SECTOR
-NSECTOR DEC HL
- DEC HL
- EX DE,HL
- LD A,(BootSector.S_P_C)
- LD B,A
- LD HL,0
- LD IX,0
-ADD_DE1 ADD IX,DE
- JR NC,ADD_DE2
- INC HL
-ADD_DE2 DJNZ ADD_DE1
- LD DE,(FatBuffer.DAT_FRM)
- ADD IX,DE
- LD DE,#0000
- ADC HL,DE
- RET
-
-; HL:DE / BC => DE:IX HL-OSTATOK
-DIV32 LD XH,D
- LD XL,E
- EX DE,HL
- LD HL,0
- LD A,#20
-DIV001 ADD IX,IX
- EX DE,HL
- ADC HL,HL
- EX DE,HL
- ADC HL,HL
- SBC HL,BC
- JR NC,DIV002
- ADD HL,BC
- DEC A
- JR NZ,DIV001
- RET
-DIV002 INC IX
- DEC A
- JR NZ,DIV001
- RET
-
-//READCOD DB #00
-
-//READMEM DW #0000
-
-//SECTORH DW 0
-//SECTORL DW 0
-
-//R_POINT DW 0
-//S_POINT DW 0
-
-;//MODULE: DOS_FM
-;[END]
-
diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm
new file mode 100644
index 0000000..4346cb6
--- /dev/null
+++ b/DSS/DOS_Proc.asm
@@ -0,0 +1,615 @@
+;[BEGIN]
+;//MODULE: DOS_X
+;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
+;//UPDATE: 24-10-1999 DNS Restore module
+;---------------------------------------------------------------
+;Rev Date Name Description
+;---------------------------------------------------------------
+;R13 06-04-2023 BAO Функцию SETBOOT можно вызвать только раз (если завершится корректно)
+;R12 03-04-2023 BAO Добавлена функция рескана драйвов LD C,8 : RST #10
+;R11 15-04-2003 DNS ROUTINE FOR STORE CURDISK AND CURDIR
+;R10 03-04-2003 DNS IMPROVED FN. VERSION
+;R09 27-03-2003 DNS PASTED SET/GET BOOT FN.
+;R08 14-11-2002 DNS IMPROVE BPB-FUNCTION
+;R07 17-12-1999 DNS BUG FIX SIGNATURE #55AA AT 510 OFFSET
+;R06 21-11-1999 DNS FN. DISKINF SUPPORT ALL DISKS
+;R05 21-11-1999 DNS BUG FIX SIGNATURE #55AA IN BOOT SECTOR
+;R04 08-11-1999 DNS KILL OLD FUNCTIONS
+;R03 23-11-1998 DNS BUG FIX (IX+28) -> (IY+28)
+;R02 21-11-1998 DNS CHANGE FUNCTION "MAKE FAT"
+;R01 20-11-1998 DNS REPAIR FUNCTION "SAVE"
+;---------------------------------------------------------------
+
+;----------------------------------------------------------------------;
+; HL - 11 bytes filename "FILENAMEEXT"
+; DE - DOS filename "FILENAME.EXT",0
+; GetName:
+; LD BC,#08FF
+; .GETN1: LD A,(HL)
+; CP " "
+; JR NZ,.GETN3
+; .GETN2: INC HL
+; DJNZ .GETN2
+; JR .GETN4
+; .GETN3: LDI
+; DJNZ .GETN1
+; ;
+; .GETN4: LD A,(HL)
+; CP " "
+; LD A,"."
+; JR NZ,.GETN5
+; LD A,#00
+; .GETN5: LD (DE),A
+; INC DE
+; RET Z
+; LD B,#03
+; .GETN6: LD A,(HL)
+; CP " "
+; RET Z
+; LDI
+; XOR A
+; LD (DE),A
+; DJNZ .GETN6
+; RET
+;---------------;---------------;---------------
+;!TODO LFN
+GetName: LD BC,#08FF ;!HARDCODE длина имени + счётчик
+ LD A,' '
+.loop: CP (HL)
+ JR Z,.skip
+ LDI
+ DJNZ .loop
+ JP .extension
+ ;
+.skip: LD C,B
+ LD B,0
+ ; CF=0
+ ADC HL,BC
+.extension: CP (HL)
+ LD A,"."
+ JR NZ,.copy_ext
+ XOR A
+.copy_ext: LD (DE),A
+ INC DE
+ RET Z ;no copy extension
+ ; copy extension
+ LD BC,#03FF ;!HARDCODE длина расширения + счётчик
+ LD A,' '
+.loop2: CP (HL)
+ JR Z,.exit
+ LDI
+ DJNZ .loop2
+.exit: XOR A
+ LD (DE),A
+ RET
+;----------------------------------------------------------------------;
+
+
+;----------------------------------------------------------------------;
+; old GETWORD
+; Тест на допустимое имя и настроиться на диск.
+; вход: hl=строка имени
+; выход: (TMPNAME)
+SetPath_GetName:
+ ; !TEST
+ INC HL
+ LD A,(HL)
+ DEC HL
+ CP ':'
+ JR NZ,.dir_loop
+
+ LD A,(HL)
+ CP 'a'
+ JR C,.next
+ CP 'z'+1
+ JR NC,.next
+ SUB %0010'0000
+.next: SUB 'A'
+ INC HL
+ INC HL
+ PUSH HL
+ CALL CHDISK
+ ;CALL OPENDSK
+ POP HL
+ RET C
+ LD A,(HL)
+ OR A
+ JR Z,.done
+ CP ' ' ;
+ JR Z,.done
+ CP '\' ;
+ SCF
+ LD A,DSS_Error.sys.PATH_NOT_FOUND
+ RET NZ
+ INC HL
+ ;
+.dir_loop: LD DE,TMPNAME
+ LD BC,#0DFF
+.loop: LD A,(HL)
+ INC HL
+ CP '\' ;
+ JR Z,.DIR_NAME
+ ; AND A
+ ; JR Z,.DIR_NAME
+ ;CP ':'
+ ;JR Z,.DRV_NAME
+ LD (DE),A
+ INC DE
+ CP ' '+1
+ CCF
+ RET NC
+ DJNZ .loop
+ LD A,DSS_Error.sys.INVALID_NAME
+ SCF
+ RET
+ ;
+.done: XOR A
+ LD (TMPNAME),A
+ RET
+ ;
+.DIR_NAME: XOR A
+ LD (DE),A
+ PUSH HL
+ LD HL,TMPNAME
+ CALL OPENDIR
+ POP HL
+ RET C
+ JR .dir_loop
+; .DRV_NAME:
+; LD A,(TMPNAME)
+; CP 'a'
+; JR C,.next
+; CP '{'
+; JR NC,.next
+; SUB #20
+; .next: SUB 'A'
+; PUSH HL
+; ;!TEST CHDISK OPENDSK
+; ;CALL OPENDSK
+; CALL CHDISK
+; ;
+; POP HL
+; RET C
+; JR .loop
+;
+
+
+; Буфер имени 8.3 формата
+TMPNAME: DZ ' ' ; 12 пробелов и 0 ;!FIXIT к буферам
+;----------------------------------------------------------------------;
+
+
+
+;----------------------------------------------------------------------;
+; IN: A - drive number
+OPENDSK: ;!TEST DRV.Open обход R10
+ LD B,A
+ LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
+ CP B
+ JR NZ,.open
+ PUSH BC
+ LD C,Dss.DRV.MediaCheck
+ RST ToDSS.DRV
+ POP BC
+ JR Z,.exit
+ JR C,.error
+ JR .skip_open ;!FIXIT когда DRV.MediaCheck и DRV.Open будут отличаться
+ ;
+.open: LD A,B
+ ;
+.force: PUSH AF
+ LD C,Dss.DRV.Open
+ RST ToDSS.DRV
+ POP BC
+ JP C,.error
+ ;[x] 29/02/2024 fix "open drive error"
+.skip_open: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
+ LD D,A
+ PUSH DE
+ ;
+ LD A,B
+ LD (CORE_BUFFERS.FS_Buffer.DRIVE),A
+ ;
+ CALL RD_BPB
+ ;[x] 29/02/2024 fix "open drive error"
+ POP DE
+ JR C,.error_bpb
+ ; RET C
+ ;
+.exit: LD A,(LDRIVE)
+ AND A
+ RET
+ ; !FIXIT костыль для Flex Navigator ; [ ] media change
+.error: CALL .error_convert
+ LD A,C
+ SCF
+ RET
+ ;
+.error_convert: CP DSS_Error.drv.INVALID_DRIVE
+ LD C,DSS_Error.sys.INVALID_DRIVE
+ RET Z
+ ;
+ CP DSS_Error.drv.ATAPI.UnitAttention
+ LD C,DSS_Error.sys.MEDIA_CHANGED
+ RET Z
+ ;
+ CP DSS_Error.drv.UNKNOWN_FORMAT
+ LD C,DSS_Error.sys.UNKNOWN_FORMAT
+ RET Z
+ ;
+ LD C,DSS_Error.sys.NOT_READY
+ RET
+ ;
+;[x] 29/02/2024 fix "open drive error"; 20/06/2024 fixed
+.error_bpb: PUSH AF ; сохраняем номер ошибки
+ LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
+ CP D
+ JR Z,.next_check
+ ;
+ LD A,D
+ CP #FF
+ SCF
+ JR Z,.set_panic
+ ;
+ LD (CORE_BUFFERS.FS_Buffer.DRIVE),A
+ CALL OPENDSK.force
+ JR NC,.err_exit
+ ;
+ LD A,(BOOTDSK.NUM)
+ LD (CORE_BUFFERS.FS_Buffer.DRIVE),A
+ CALL OPENDSK.force
+ ;
+.err_exit: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
+ ADD 'A'
+ LD (CORE_BUFFERS.CurrentPath),A
+ POP AF
+ RET
+ ;
+.next_check: LD A,(BOOTDSK.NUM)
+ CP D
+ SCF
+.reBPB: CALL NZ,OPENDSK.force
+ ; проверка на ошибку
+.set_panic: LD HL,.NOT_READY
+ LD E, +(80-.NOT_READY.size)/2 ; coord X
+ LD BC,.NOT_READY.size
+ JR NC,.err_exit
+ JP KERNEL_PANIC
+ ;
+.errorCycle: DB 0
+.NOT_READY: DZ "Boot drive error..."
+.NOT_READY.size EQU $-.NOT_READY
+;----------------------------------------------------------------------;
+
+
+;----------------------------------------------------------------------;
+; Преобразовать имя 8.3 -> 11 формат
+; вход: hl = 8.3 имя
+; de = буфер имени 11 симв. формата
+; при ошибке CF - недоп. имя
+;
+; HL - MASK "file*.t??"
+; DE - 11 bytes filename
+; RET: C=2 FILE WITHOUT EXTENTION
+; C=1 FILE WITH EXTENTION
+MASK: LD HL,TMPNAME
+.name: LD DE,MASKARE
+.custom: PUSH HL
+ PUSH DE
+ LD H,D
+ LD L,E
+ INC DE
+ LD (HL),' '
+ LD BC,10 ;!HARDCODE = size (FileName + Extension - 1)
+ LDIR
+ POP DE
+ POP HL
+ LD A,(HL)
+ CP '.' ;R007
+ SCF ;R007
+ JR Z,.MASKB ;R007
+ CP ' '+1
+.MASKB: LD A,DSS_Error.sys.INVALID_NAME
+ RET C
+ LD BC,#0902 ; B - счетчик
+.MASK1: LD A,(HL)
+ CP ' '+1
+ CCF
+ RET NC
+ ;
+ CP '*'
+ JR Z,.MASK3
+ CP '.'
+ JR Z,.MASK5
+ CP '"'
+ JR Z,.MASK_ERR
+ CP '+'
+ JR Z,.MASK_ERR
+ CP ','
+ JR Z,.MASK_ERR
+ CP '/'
+ JR Z,.MASK_ERR
+ CP ':'
+ JR Z,.MASK_ERR
+ CP ';'
+ JR Z,.MASK_ERR
+ CP '<'
+ JR Z,.MASK_ERR
+ CP '='
+ JR Z,.MASK_ERR
+ CP '>'
+ JR Z,.MASK_ERR
+ CP '['
+ JR Z,.MASK_ERR
+ CP '\'
+ JR Z,.MASK_ERR
+ CP ']'
+ JR Z,.MASK_ERR
+ CP '|'
+ JR Z,.MASK_ERR
+ CALL UPPER ; a..z -> A..Z
+.MASK2: LD (DE),A
+ INC HL
+ INC DE
+ DJNZ .MASK1
+.MASK_ERR:
+ LD A,DSS_Error.sys.INVALID_NAME
+ SCF
+ RET
+ ;
+.MASK3: LD A,'?'
+ INC HL
+ DJNZ .MASK6
+ JR .MASK_ERR
+ ;
+.MASK6: LD (DE),A
+ INC DE
+ DJNZ .MASK6
+ LD B,1
+ JR .MASK1
+ ;
+.MASK5: LD A,' '
+ INC HL
+ DJNZ .MASK4
+ LD B,4
+ DEC C
+ JR NZ,.MASK1
+ JR .MASK_ERR
+ ;
+.MASK4: LD (DE),A
+ INC DE
+ DJNZ .MASK4
+ LD B,4
+ DEC C
+ JR NZ,.MASK1
+ JR .MASK_ERR
+;----------------------------------------------------------------------;
+
+
+
+;----------------------------------------------------------------------;
+;!TEST Current Dir ;[x] 15/10/23
+DIR_PATH_CHANGE:
+.FullCurrent: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
+ ADD 'A'
+ LD (CORE_BUFFERS.CurrentPath),A
+ ;
+.Current: LD HL,CORE_BUFFERS.CurrentDirectory
+ JP CURRDIR
+ ;
+.FullWork: LD A,(CORE_BUFFERS.CurrentPath)
+ SUB 'A'
+ LD (CORE_BUFFERS.FS_Buffer.DRIVE),A
+ ;
+.Work: LD HL,CORE_BUFFERS.WorkDirectory
+ JP CURRDIR_FN
+;
+DIR_PATH_CHECK: LD A,(HL)
+ CP '\'
+ JR NZ,.notRootDir
+ ;
+ CALL .checkDrive
+ RET Z
+ LD A,(CORE_BUFFERS.CurrentPath)
+ SUB 'A'
+ JP OPENDSK
+ ;
+.notRootDir: INC HL
+ LD A,(HL)
+ CP ':'
+ RET Z
+ ;
+.forceCheck: ;LD HL,CurrentDirectory+1
+ LD BC,CORE_BUFFERS.CurrentDirectory.DEPTH-1
+ CALL .checkDrive
+ JR Z,.checkDir
+ ;
+ LD HL,CORE_BUFFERS.CurrentPath
+ LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
+ ADD 'A'
+ CP (HL)
+ JR NZ,.gotoPath
+ ;
+.checkDir: LD HL,CORE_BUFFERS.CurrentDirectory+1
+ LD DE,CORE_BUFFERS.WorkDirectory+1
+ ; счётчик
+ LD A,B
+ LD B,C
+ EX AF,AF'
+ ;
+.loop: LD A,(DE)
+ AND A
+ JR Z,.end
+ CP (HL)
+ INC HL
+ INC DE
+ JR NZ,.gotoPath
+ DJNZ .loop
+ EX AF,AF'
+ SUB 1
+ RET C
+ EX AF,AF'
+ DJNZ .loop
+ ;
+.gotoPath: LD C,B
+ EX AF,AF'
+ LD B,A
+ CALL FINDDIR.CHECK_SLASH
+ LD A,DSS_Error.sys.PATH_NOT_FOUND
+ RET C
+ LD HL,CORE_BUFFERS.CurrentPath
+ JP SetPath_GetName
+ ;
+.end: CP (HL)
+ RET Z
+ JR .gotoPath
+ ;
+.checkDrive: LD HL,CORE_BUFFERS.CurrentPath
+ LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
+ ADD 'A'
+ CP (HL)
+ RET
+;----------------------------------------------------------------------;
+
+
+;----------------------------------------------------------------------;
+CHECK_NAME:
+ LD HL,MASKARE
+.custom: LD BC,11 ;!HARDCODE
+ LD A,"?"
+ CPIR
+ LD A,DSS_Error.sys.INVALID_NAME
+ SCF
+ RET
+;----------------------------------------------------------------------;
+
+
+;----------------------------------------------------------------------;
+;FMS DB FMCOUNT
+
+;ACCESS MODE:
+; 00 - READ/WRITE
+; 01 - READ
+; 02 - WRITE
+;FM_BUF:
+;File Manipulator (FM)
+ ; BYTE '. ' ;+00 NAME
+ ; BYTE ' ' ;+08 EXT
+ ; BYTE #10 ;+11 ATTRIBUT
+ ; BYTE 0 ;+12 RESERVED; !TODO следующий кластер для чтения
+ ; BYTE 0 ;+13 RESERVED; !TODO следующий кластер для записи
+ ; BLOCK 8,0 ;+14 RESERVED
+ ; WORD #0000 ;+22 TIME
+ ; WORD #0000 ;+24 DATE
+ ; WORD #0000 ;+26 START CLUSTER
+ ; DWORD #0000 ;+28 SIZE FILE
+ ; DWORD #0000 ;+32 FILE POSITION (FP)
+ ; WORD #0000 ;+36 DIRECTORY CLUSTER
+ ; WORD #0000 ;+38 HANDLE NUMBER
+ ; BYTE #00 ;+40 DRIVE OR CURRENT
+ ; BYTE #00 ;+41 ACCESS MODE
+ ; BYTE #00 ;+42 TASK
+ ; BYTE #00 ;+43 EMPTY
+/*
+;!TEST
+FM_BUF: _sFM
+.Size EQU _sFM
+ BLOCK (FMCOUNT-1)*FM_BUF.Size, 0
+*/
+////////////////////////////////////////////////////////////////////////
+
+; на выходе без ошибок IY указывает на файловый манипулятор
+FM_FIND: CP FMCOUNT+1
+ JR NC,.error
+ ;
+ PUSH DE
+ LD IY,CORE_BUFFERS.FM_BUF
+ LD DE,CORE_BUFFERS.FM_BUF.Size
+ AND A
+ JR Z,.endLoop
+.loop: ADD IY,DE
+ DEC A
+ JR NZ,.loop
+.endLoop: POP DE
+ ; A=0
+ OR (IY) ;+00 NAME
+ RET
+ ;
+.error: XOR A
+ LD A,DSS_Error.sys.INVALID_HANDLE
+ RET
+
+SET_FM: CALL FM_FIND
+ ; error
+ ;LD A,DSS_Error.sys.INVALID_HANDLE
+ ; CF = 1
+ SCF
+ RET Z
+ ; no error
+ XOR A ;LD A,DSS_Error.sys.NO_ERROR
+ ; CF = 0
+ RET
+
+
+RES_FM: CALL FM_FIND
+ ; error
+ ; LD A,DSS_Error.sys.INVALID_HANDLE
+ SCF
+ RET Z
+ ; no error
+ XOR A
+ LD (IY + _sFM.FS_REC.NAME),A
+ RET
+;
+;!TODO CHECK LOCKING
+GET_FM: LD B,FMCOUNT
+ LD C,#FF
+ LD IY,CORE_BUFFERS.FM_BUF - CORE_BUFFERS.FM_BUF.Size
+ LD DE,CORE_BUFFERS.FM_BUF.Size
+.loop: ADD IY,DE
+ INC C
+ LD A,(IY + _sFM.FS_REC.NAME)
+ OR A
+ RET Z
+ DJNZ .loop
+ LD A,DSS_Error.sys.NO_HANDLES
+ SCF
+ RET
+
+;FP COMPARE
+; CY - FILE POINTER > SIZE
+; NC - FILE POINTER < SIZE
+MOVE_CP:
+ LD L,(IY + _sFM.FS_REC.F_SIZE)
+ LD H,(IY + _sFM.FS_REC.F_SIZE+1)
+ LD E,(IY + _sFM.F_POSITION)
+ LD D,(IY + _sFM.F_POSITION+1)
+ AND A
+ SBC HL,DE
+ LD L,(IY + _sFM.FS_REC.F_SIZE+2)
+ LD H,(IY + _sFM.FS_REC.F_SIZE+3)
+ LD E,(IY + _sFM.F_POSITION+2)
+ LD D,(IY + _sFM.F_POSITION+3)
+ SBC HL,DE
+ RET
+;
+;----------------------------------------------------------------------;
+; [x] fat32 ; [ ] CDFS
+; !TODO перенести потом в FS module
+RD_BPB: CALL READ_BPB
+ RET C
+ ;
+ LD DE,#AA55 ; сигнатура ;R05
+ LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07
+ ;
+ AND A
+ SBC HL,DE
+ JP Z,FAT_BPB
+ ;
+ ; CDFS check
+ ;
+ ;
+.UnknownBPB: LD A,DSS_Error.sys.UNKNOWN_FORMAT
+ SCF
+ RET
+;----------------------------------------------------------------------;
\ No newline at end of file
diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM
deleted file mode 100644
index 6d2fe5d..0000000
--- a/DSS/DOS_X.ASM
+++ /dev/null
@@ -1,547 +0,0 @@
-
-;[BEGIN]
-;//MODULE: DOS_X
-;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
-;//UPDATE: 24-10-1999 DNS Restore module
-;---------------------------------------------------------------
-;Rev Date Name Description
-;---------------------------------------------------------------
-;R13 06-04-2023 BAO Функцию SETBOOT можно вызвать только раз (если завершится корректно)
-;R12 03-04-2023 BAO Добавлена функция рескана драйвов LD C,8 : RST #10
-;R11 15-04-2003 DNS ROUTINE FOR STORE CURDISK AND CURDIR ;!FIXIT работает криво
-;R10 03-04-2003 DNS IMPROVED FN. VERSION
-;R09 27-03-2003 DNS PASTED SET/GET BOOT FN.
-;R08 14-11-2002 DNS IMPROVE BPB-FUNCTION
-;R07 17-12-1999 DNS BUG FIX SIGNATURE #55AA AT 510 OFFSET
-;R06 21-11-1999 DNS FN. DISKINF SUPPORT ALL DISKS
-;R05 21-11-1999 DNS BUG FIX SIGNATURE #55AA IN BOOT SECTOR
-;R04 08-11-1999 DNS KILL OLD FUNCTIONS
-;R03 23-11-1998 DNS BUG FIX (IX+28) -> (IY+28)
-;R02 21-11-1998 DNS CHANGE FUNCTION "MAKE FAT"
-;R01 20-11-1998 DNS REPAIR FUNCTION "SAVE"
-;---------------------------------------------------------------
-
-; RGADR EQU #89 ;VIDEO CONTROL REGISTER
-; SLOT0 EQU #82 ;WIN #0000-#3FFF
-; SLOT1 EQU #A2 ;WIN #4000-#7FFF
-; SLOT2 EQU #C2 ;WIN #8000-#BFFF
-; SLOT3 EQU #E2 ;WIN #C000-#FFFF
-
-; SYSPAGE EQU #FE
-
-;Commands for restart #10
-//NOPS: LD A,DSS_Error.sys.INVALID_FUNCTION
-// SCF
-// RET
-
-VERSION:
- LD DE,VERS*256+MODF
- XOR A
- LD H,A ;!TODO пихать сюда OSINFO
- LD L,A
- LD BC,BUILD
- RET
-
-//;R10
-//OSINFO:
-//OSINFO_SIG: DB "OSINFOSTRUCTURE",0
-
-
-;R09
-BOOTDRV: DB #FF
-
-BOOTDSK:
- INC B
- DEC B
- JR Z,GETBOOT
- DEC B
-.chg: JR Z,SETBOOT ;R13 меняется на JR С,SETBOOT после первого удачного исполнения SETBOOT
- LD A,DSS_Error.sys.INVALID_FUNCTION
- SCF
- RET
-
-;GET BOOT DISK
-
-GETBOOT LD A,(BOOTDRV)
- AND A
- RET
-
-;SET BOOT DISK
-SETBOOT:
- LD B,A
- LD C,0
-.loop: PUSH BC
- LD A,C
- LD BC,#0008
- LD DE,#55AA
- RST #18
- POP BC
- JR C,.NoSupport
- EX AF,AF' ;PHISICAL DRIVE NUMBER
- CP B
- JR NZ,.NoSupport
- ;R13
- LD A,#38 ; opcode for JR C,addr
- LD (BOOTDSK.chg),A
- ;R13
- LD A,C
- LD (BOOTDRV),A
- AND A
- RET
-.NoSupport:
- INC C
- LD A,(LDRIVE)
- CP C
- JR NZ,.loop
- SCF
- RET
-;R09
-
-;!!!!! Дубль - CHNDISK = OPENDSK
-/*
-CHNDISK:
- PUSH AF
- LD C,1
- RST #18
- POP BC
- JP C,NDISK11
- LD A,B
- LD (FatBuffer.DRIVE),A
- CALL RD_BPB
- RET C
- LD A,(LDRIVE)
- AND A
- RET
-NDISK11:
- CP DSS_Error.sys.INVALID_DRIVE
- SCF
- RET Z
- LD A,DSS_Error.sys.NOT_READY
- RET
-*/
-
-
-CURRDSK: LD A,(FatBuffer.DRIVE)
- AND A
- RET
-
-DISKINF: INC A
- JR Z,CURRDS ;R06
- DEC A ;R06
- CALL CHNDISK ;R06
- RET C ;R06
-CURRDS: LD HL,2
- LD BC,0
-FRESP: PUSH BC
- CALL R_F_FAT
- POP BC
- CP 10
- JR Z,FRESP2
-
- LD A,E
- OR D
- JR NZ,SKIC
- INC BC
-SKIC: INC HL
- JP FRESP
-
-FRESP2: LD D,B
- LD E,C
- LD HL,(MAX_CLU)
- DEC HL
- LD BC,(BootSector.B_P_S)
- LD A,(BootSector.S_P_C)
- AND A
- RET
-
-LDRIVE: DB #02
-TDRIVE: DB #00
-TCLUST: DW #0000
-TCOUNT: DW #0000
-
-;R04SIZE2CL LD DE,(B_P_C)
-;R04 XOR A
-;R04 SCF
-;R04S2C01 RR D
-;R04 RR E
-;R04 JR C,S2C02
-;R04 RR H
-;R04 RR L
-;R04 RR B
-;R04 RR C
-;R04 JP NC,S2C01
-;R04 LD A,1
-;R04 JP S2C01
-;R04S2C02 OR A
-;R04 RET Z
-;R04 INC BC
-;R04 RET
-
-;R04L_SEC_X DW 0
-;R04H_SEC_X DW 0
-
-; !FIXIT чёт не используется
-TESTDSK LD A,(FatBuffer.DRIVE)
- LD C,3
- RST #18
- OR A
- RET Z
-RD_BPB LD C,SLOT3
- IN B,(C)
- PUSH BC
-
-;!!!!! лучше оставить как в оригинале, потому что вызов этой функции
-; может в дальнейшем понадобиться, и пускай она сама достаёт переменную DRIVE
- ; ex af,af' ;1451
- ; in a,(SLOT0) ;1452
- ; out (SLOT3),a ;1454
- ; ld de,SECBUF+#C000 ;1456
- ; ex af,af' ;1459
- IN A,(SLOT0)
- OUT (SLOT3),A
-;R08 LD DE,BOOT+#C000
- LD DE,SECBUF+#C000 ;R08
- LD A,(FatBuffer.DRIVE)
-;!!!!! ------------------------------
-
- LD C,4
- RST #18
- POP BC
- OUT (C),B
- JP C,RDERR1
- PUSH IY
- LD DE,#AA55 ;R05
-;R08 LD HL,(BOOT+510) ;R07
- LD HL,(SECBUF+510) ;R08
- AND A ;R05
- SBC HL,DE ;R05
- JP NZ,ERR_BPB ;R05
-;R08
- LD HL,SECBUF ;R08
- LD DE,BootSector ;R08
- LD BC,_sBOOT_SEC ;R08 size
- LDIR
-;R08
-
- LD IY,BootSector
- LD A,(IY+_sBOOT_SEC.ID_FORM)
- CP #F0
- JP C,ERR_BPB
- LD HL,0 ; calc. first sector FAT
- LD E,(IY+_sBOOT_SEC.RESERVE) ;Reserve sec
- LD D,(IY+_sBOOT_SEC.RESERVE+1)
- ADD HL,DE
-; LD E,(IY+#1C) ;Hidden sec
-; LD D,(IY+#1D)
-; ADD HL,DE
-; LD (FatBuffer.FAT_FRM),HL ; first sector FAT
- LD (FatBuffer.FAT1_XX),HL ; first sector FAT #1
- LD (FatBuffer.FAT2_XX),HL
-
- LD E,(IY+_sBOOT_SEC.S_P_F) ; sectors in FAT
- LD D,(IY+_sBOOT_SEC.S_P_F+1)
- LD A,(BootSector.FAT_NUM) ; amount FATs
- CP 1
- JR Z,C_DATA1
- DEC A
- ADD HL,DE
- LD (FatBuffer.FAT2_XX),HL
-C_DATA1 ADD HL,DE
- DEC A
- JR NZ,C_DATA1
- LD (FatBuffer.DIR_FRM),HL ; first sector DIR
-
- LD C,(IY+#0B) ; Size sectors
- LD B,(IY+#0C)
- RL C
- RL B
- RL C
- RL B
- RL C
- RL B
- LD C,B
- LD B,0 ; BC - File handels in sectors
- LD A,C
- LD (FatBuffer.F_P_S),A
- LD E,(IY+_sBOOT_SEC.F_P_DIR) ; Number file handel
- LD D,(IY+_sBOOT_SEC.F_P_DIR+1)
- EX DE,HL
- DEC HL
- XOR A
-NEXTAD2
- INC A
- JP Z,ERR_BPB
- SBC HL,BC
- JR NC,NEXTAD2
- EX DE,HL
- LD C,A ; A - sectors in DIR
- LD B,0
- LD (FatBuffer.DIR_S_S),A
- ADD HL,BC ; Start DATA area
- LD (FatBuffer.DAT_FRM),HL
- ;LD HL,0
- LD H,B ; тут в B ноль должен быть
- LD L,B
- LD C,(IY+#0B) ; Size sector
- LD B,(IY+#0C)
- LD A,(BootSector.S_P_C)
-NEXTAD3
- ADD HL,BC ; calc. cluster size
- DEC A
- JR NZ,NEXTAD3
- LD (FatBuffer.CLU_LEN),HL
- EX DE,HL
- LD HL,#3FFF
- XOR A
-NEXTAD4
- INC A
- JP Z,ERR_BPB
- SBC HL,DE
- JR NC,NEXTAD4
- LD (FatBuffer.C_P_B),A ; A - Clusters per bank (16k)
-
- LD HL,BootSector.ID_FAT
- LD DE,FatBuffer.MSG
- LD B,3
-R_BPBL1
- LD A,(DE)
- CP (HL)
- JP NZ,IBMDOS_
- INC HL
- INC DE
- DJNZ R_BPBL1
-FID LD A,(HL)
- INC HL
- CP #20
- JR Z,FID
- CP "1"
- JP NZ,ERR_BPB
- LD A,(HL)
- CP "6" ; FAT16
- LD HL,#FFFF
- JR Z,BPB_FAT
- CP "2" ; FAT12
- JP NZ,ERR_BPB
- LD HL,#0FFF
-BPB_FAT
- LD (FatBuffer.FAT_TYP),A
- LD (FatBuffer.ENDCLUS),HL
- LD HL,0
- LD C,(IY+_sBOOT_SEC.S_P_T) ; Sector per track
- LD B,(IY+_sBOOT_SEC.S_P_T+1)
- LD A,(BootSector.HEADS)
-BPB_L1: ; calc. sector per cylinder
- ADD HL,BC
- DEC A
- JR NZ,BPB_L1
- LD (FatBuffer.S_X_H),HL
-
- LD DE,(FatBuffer.DAT_FRM)
-; LD E,(IY+#1C) ;Hidden sec
-; LD D,(IY+#1D)
-; AND A
-; SBC HL,DE
-; EX DE,HL
- LD L,(IY+_sBOOT_SEC.S_P_D)
- LD H,(IY+_sBOOT_SEC.S_P_D+1)
- LD A,H
- OR L
- JP NZ,HDDSMAL
- LD L,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS)
- LD H,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+1)
- LD C,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+2)
- LD B,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+3)
- AND A
- SBC HL,DE
- JP NC,HDDBIG
- DEC BC
- JP HDDBIG
-HDDSMAL:
-; AND A ;тут CF полюбас сброшен должен быть
- SBC HL,DE
- LD BC,0
-HDDBIG LD A,(BootSector.S_P_C)
- SCF
-S4C01 RRA
- JR C,S4C02
- RR B
- RR C
- RR H
- RR L
- JP S4C01
-S4C02 INC HL
- LD (MAX_CLU),HL
- POP IY
-; LD DE,FAT
-; LD HL,0
-; LD IX,(FAT_FRM)
-; LD B,3
-; LD A,(DRIVE)
-; LD C,5
-; RST #18
-; JP C,RDERR1
- LD HL,0
- LD (FATCASH),HL
- LD A,FATPAGE
- CALL BANK
- PUSH AF
- XOR A
- CALL RE_FAT
- POP AF
- OUT (SLOT3),A
- CALL R_CLUST
- XOR A
- RET
-
-IBMDOS_ LD A,(IY+_sBOOT_SEC.ID_FORM)
- CP #F0
- JR C,ERR_BPB
-;????? надо ли изменить?
-// OR 2
-// CP #FA ; ID ram-диска
- CP #F8 ; а если не F8?
-;?????
- LD A,'6'
- LD HL,#FFFF
- JP Z,BPB_FAT
-
- LD A,'2'
- LD HL,#0FFF
- JP BPB_FAT
-
-ERR_BPB:
- POP IY
- LD A,DSS_Error.sys.UNKNOWN_FORMAT
- SCF
- RET
-RDERR1: LD A,DSS_Error.sys.NOT_READY
- SCF
- RET
-
-;
-FatBuffer:
-.MSG: DB 'FAT'
-.READ_PG: DB #00
-.BLOCK: DB #00
-.DIR_CLU: DW #0000
-.DRIVE: DB #01
-.FAT_FRM:
-.FAT1_XX: DW #0000 ; MSD_FAT_SEC first sector FAT
-.FAT2_XX: DW #0000
-.DIR_FRH: DW #0000 ; MSD_CAT_SEC first sector DIR
-.DIR_FRL:
-.DIR_FRM: DW #0000 ; MSD_CAT_SEC first sector DIR
-.F_P_S: DB #00 ; число файловых записей в секторе
-.DIR_S_S: DB #00 ; DIR_SEC_SIZE
-.DAT_FRM: DW #0000 ; MSD_DAT_SEC
-.CLU_LEN:
-.B_P_C: DW #0000 ; CLUSTER_LEN
-.C_P_B: DB #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) ; ????? это используется?
-.FAT_TYP: DB #00 ; TYPE FAT (#32 - 12bit, #36 - 16bit)
-.S_X_H: DW #0000 ; количество секторов на цилиндре ; ????? это используется?
-.ENDCLUS: DW #FFFF
-;
-
-;
-DIRSPEC: DB '\'
- BLOCK DIRSPEC.DEPTH,0 ;????? Было 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]
-
diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM
index a74a1ed..f8ea974 100644
--- a/DSS/DRV-MAIN.ASM
+++ b/DSS/DRV-MAIN.ASM
@@ -6,232 +6,361 @@
;---------------------------------------------------------------
;R00 2003-03-19 DNS Initial version
;---------------------------------------------------------------
-// INCLUDE "hardware.inc"
-// INCLUDE "bios.inc"
-
; ORG #0000
- MODULE DRV ; !FIXIT обойтись без модуля
;PAGEDRV EQU 0
+
+;===============;
+ ;!FIXIT в процедуре которая будет отвечать за переход из этой страницы обратно в MAIN для вызова функций
+ ; ДСС и, возможно, повторному заходу в эту страницу через RST #18 из других страниц (которых пока нет)
+ ; сделать нечто подобное с программным стеком страниц. Эта процедура их сохраняет, примерно такая же
+ ; должна восстанавливать.
+; PUSH HL
+;.SP+1: LD HL,DRV_PAGE.RSTx18_RET_PAGES
+; LD (HL),A
+; DEC L ; Не HL, а L - чтоб закольцевать область
+; LD (.SP),HL
+; POP HL
+;===============;
+
;!TODO
-;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
-; <[NOT USED]> ;
-A0000: JP RST_00 ;
-;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
-;
+////////////////////////////////////////////////////////////////////////
+; <[NOT USED]>
+A0000: JP RST_00
+////////////////////////////////////////////////////////////////////////
+
;
RST_00:
- LD A,DSS_Error.drv.INVALID_COMMAND
+ LD A,BIOS.Error.InvalidSubFunction
SCF
RET
;
-;
-;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
-; <[BIOS API]> ;
- BLOCK 8-$,#FF ;
-A0008: PUSH AF ;
- LD A,SYS_PORT.PAGE8;
- OUT (SYS_PORT.ON),A ;
- POP AF ;
- RET ;
-;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
-;
+////////////////////////////////////////////////////////////////////////
+; <[BIOS API]>
+ BLOCK 8-$,#C7 ; #C7 - "RST 0" opcode
+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 ;
-;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
-;
+////////////////////////////////////////////////////////////////////////
+; <[DSS API]>
+ BLOCK #10-$,#C7 ; #C7 - "RST 0" opcode
+A0010: ;JP DRV_PAGE.RST_10
+ DI : HALT
+////////////////////////////////////////////////////////////////////////
+
+
+////////////////////////////////////////////////////////////////////////
+; <[DRIVE API]>
+ BLOCK #18-$,#C7 ; #C7 - "RST 0" opcode
+;A0018 JP INTDISK
+A0018: ;PUSH AF
+ ;PUSH BC
+ SCF
+ RET
+DRV_PAGE.MAIN_PAGE_NUMBER+2:
+ LD BC,0*256 + SLOT0 ; !FIXIT сюда не должны вставляться номера выделенных страниц?
+ ;JP PORTAL.outDRV
+////////////////////////////////////////////////////////////////////////
-;
-;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
-; <[DRIVE API]> ;
- BLOCK #18-$,#FF ;
-;A0018 JP INTDISK ;
-A0018: PUSH AF ;
- PUSH BC ;
-MAIN_PG_NUMBER+2: ;
- LD BC,0*256+SLOT0 ; !FIXIT сюда не должны вставляться номера выделенных страниц?
- JP PORTAL.outDRV ;
-;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
-;
;!TODO
-;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
-; <[NOT USED]> ;
- BLOCK #20-$,#FF ;
-A0020: JP RST_20 ;
-;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
-;
+////////////////////////////////////////////////////////////////////////
+; <[NOT USED]>
+ BLOCK #20-$,#C7 ; #C7 - "RST 0" opcode
+A0020: JP DRV_PAGE.RST_20
+////////////////////////////////////////////////////////////////////////
+
;
-RST_20:
- LD A,DSS_Error.drv.INVALID_COMMAND
+DRV_PAGE.RST_20:
+ LD A,BIOS.Error.InvalidSubFunction
SCF
RET
;
;!TODO
-;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
-; <[NOT USED]> ;
- BLOCK #28-$,#FF ;
-A0028: JP RST_28 ;
-;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
-;
+////////////////////////////////////////////////////////////////////////
+; <[NOT USED]>
+ BLOCK #28-$,#C7 ; #C7 - "RST 0" opcode
+A0028: JP DRV_PAGE.RST_28
+////////////////////////////////////////////////////////////////////////
+
;
-RST_28:
- LD A,DSS_Error.drv.INVALID_COMMAND
+DRV_PAGE.RST_28:
+ LD A,BIOS.Error.InvalidSubFunction
SCF
RET
;
-;!TODO
-;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
-; <[NOT USED]> ;
- BLOCK #30-$,#FF ;
-A0030: JP RST_30 ;
-;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
-;
+////////////////////////////////////////////////////////////////////////
+ BLOCK #30-$,#C7 ; #C7 - "RST 0" opcode
+RST_30: JP MOUSE_DRV.API
+.RET: OUT (SLOT0),A
+ JP MOUSE_HANDLER
+////////////////////////////////////////////////////////////////////////
-;
-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 ;
+ BLOCK #38-$,#C7 ;
+/*
+ ;!TEST SIO INT
+ ; reg 0 - error reset
+ IF KEYBOARD_INT_ENABLED && MOUSE_INT_ENABLED == 0
+ PUSH AF
+ ; reg 0 - error reset
+ LD A,%0011'0000
+ OUT (Z84.SIO.Ch_A.Ctrl),A
+ ; reg 0 - return from int
+ LD A,%0011'1000
+ OUT (Z84.SIO.Ch_A.Ctrl),A
+ POP AF
+ ELSEIF MOUSE_INT_ENABLED && KEYBOARD_INT_ENABLED == 0
+ PUSH AF
+ ; reg 0 - error reset
+ LD A,%0011'0000
+ OUT (Z84.SIO.Ch_B.Ctrl),A
+ ; reg 0 - return from int
+ LD A,%0011'1000
+ OUT (Z84.SIO.Ch_B.Ctrl),A
+ POP AF
+ ELSEIF MOUSE_INT_ENABLED && KEYBOARD_INT_ENABLED
+ PUSH AF
+ ; reg 0 - error reset
+ LD A,%0011'0000
+ OUT (Z84.SIO.Ch_A.Ctrl),A
+ OUT (Z84.SIO.Ch_B.Ctrl),A
+ ; reg 0 - return from int
+ LD A,%0011'1000
+ OUT (Z84.SIO.Ch_A.Ctrl),A
+ OUT (Z84.SIO.Ch_B.Ctrl),A
+ POP AF
+ ENDIF
EI ;
RETI ;
-;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
-;
+*/
+RST_38_DRV: JP .Portal
+ BLOCK RST_38_IM1.Portal - $,0
+.Portal: PUSH AF
+ LD A,(DRV_PAGE.MAIN_PAGE_NUMBER)
+ OUT (SLOT0),A
+ POP AF
+ EI
+ RETI
+////////////////////////////////////////////////////////////////////////
+
;
-KEYSCAN: RET ;!FIXIT
+DRV_PAGE.KEYSCAN: RET ;!FIXIT
;
-;
-;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
+
+////////////////////////////////////////////////////////////////////////
; <[ NMI ]> ;
-NMI: RETN ;
- BLOCK #66-$,#FF ;
-A0066: JP NMI ;
-;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
-;
+DRV_PAGE.NMI: RETN ;
+ BLOCK #66-$,#C7;
+A0066: JP DRV_PAGE.NMI ;
+////////////////////////////////////////////////////////////////////////
+
;-------------------------------;
-;ADRST10 EQU #00 ;!!!!!
+;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
+; DRV_PAGE.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
-
-*/
+ BLOCK PORTAL.RSTx18_SWITCH_ADDRESS-$-(PORTAL.out_DRV.switch - PORTAL.out_DRV),#C7
+PORTAL.out_DRV: PUSH BC
+.RETBANK+2: LD BC,SLOT0 + 0*256; ;!!!!! ReScnDRV использует это значение
+.switch: OUT (C),B
+ ASSERT $!=84,'-> Portal error!';
+ ;Entry point from DSS main page
+ LD (.RETBANK),A
+ POP BC
+ POP AF
+.ADCALL+1: CALL DISPATCH ; патчится на INTDISK
+ JR NC,PORTAL.out_DRV
+ OR DSS_Error.DRV_MASK
+ SCF
+ JP PORTAL.out_DRV
+////////////////////////////////////////////////////////////////////////
-;!FIXIT чёт не то тут
-;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
- LD B,#00; ;
- OUT (C),A ;
-;--- ;
- POP BC ;
- RET ;
-PORTAL.outDRV: ;
- RET ;
-;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
-;
-;
-DISPATCH
- CALL INITDVC
+////////////////////////////////////////////////////////////////////////
+MOUSE_HANDLER: POP AF
+ CALL MOUSE_DRV.API
+ PUSH AF
+.CorePage EQU $$$ + 1
+ LD A,#FF
+ JP RST_30.RET
+////////////////////////////////////////////////////////////////////////
+
+
+
+
+DRV_PAGE.LDRIVE: DB #00
+
+DISPATCH:
LD HL,INTDISK
- LD (ADCALL),HL
- LD A,(LDRIVE)
+ LD (PORTAL.out_DRV.ADCALL),HL
+INITDVC_RET_DRIVE:
+ CALL INITDVC
+ LD A,(DRV_PAGE.LDRIVE)
AND A
RET
+
+ INCLUDE 'dss/Drivers/media/shared.asm'
+ INCLUDE 'dss/Drivers/media/ata_atapi-drv.asm'
+ INCLUDE 'dss/Drivers/media/fdd-drv.asm'
+ INCLUDE 'dss/Drivers/media/ram_disk-drv.asm'
+ INCLUDE "dss/Drivers/input/MOUSE.ASM"
+/////////////////////////// [ DRIVE TABLES ] \\\\\\\\\\\\\\\\\\\\\\\\\\\;
+;
+;--------------------------[shared.asm table]--------------------------;
+DEVICE EQU $
+.TBL_Entry EQU 3
+.Size EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry
+.End EQU DEVICE.Size + 1 ; для стоп-байта #FF
+;----------------------------------------------------------------------;
;
-LDRIVE DB #00
+;
+;--------------------------[shared.asm table]--------------------------;
+;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
+;+01 LONG SECTOR OFFSET
+;+05 LONG SIZE IN SECTORS
+;+09 BYTE PARTITION RECORD NUMBER (in drive MBR)
+;+10 WORD Sector Size
+;+12 BYTE Removable Media Byte flags
+;+13_15 FREE
+;
+LOGDRV EQU DEVICE + DEVICE.End
+.TBL_Entry EQU 16
+.Size EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry
+;!TODO сделать структурой
+.PHISICAL_DRV_NUMBER EQU 0
+.SECTOR_OFFSET EQU 1
+.SIZE_IN_SECTORS EQU 5
+.PARTITION_RECORD_NUM EQU 9
+.SECTOR_SIZE EQU 10 ; word
+.MediaParameters EQU 12 ; bit0=1 removable, bit1=1 drive changed, bit7..2 reserved
+.Reserved_1 EQU 13
+.Reserved_2 EQU 14
+.Reserved_3 EQU 15
+; ВХОД: L - логический номер в таблице
+; ВЫХОД: IY - начало записи
+; ПОРТИТ: HL, IY. HL<-->DE
+; MACRO LOGDRV_ENTRY_FIND tbl_addr
+; LD H,0
+; ADD HL,HL
+; ADD HL,HL
+; ADD HL,HL
+; ADD HL,HL
+; ;LD B,H
+; ;LD C,L
+; EX DE,HL
+; LD IY,tbl_addr
+; ADD IY,DE
+; ENDM
+;----------------------------------------------------------------------;
+;
- INCLUDE 'disk_x.asm'
- INCLUDE 'ide_drv0.asm'
- INCLUDE 'fdd_drv0.asm'
- ;INCLUDE 'ram_drv0.asm'
- INCLUDE 'ram_drv1.asm'
+;
+;-----------------------[ram_disk-drv.asm table]-----------------------;
+; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID
+; Log Number: DB RAM_Drive_Log_Number, RAM_Drive_ID ;(BIOS 0-15), (Block ID for BIOS)
+RAMDTBL EQU LOGDRV + LOGDRV.Size
+.TBL_Entry EQU 2
+.Size EQU .TBL_Entry * MAX_RAMDRIVES
+; RAMDTBL: DUP MAX_RAMDRIVES * RAMDTBL.TBL_Entry
+; DB #FF
+; EDUP
+; .Size EQU $-RAMDTBL
+;----------------------------------------------------------------------;
+;
+////////////////////////////////////////////////////////////////////////;
- DB 0
-
- ENDMODULE
+
+///////////////////////// [ DRIVE TABLES COPY] \\\\\\\\\\\\\\\\\\\\\\\\\;
+ MODULE OLD_TABLES
+;
+;--------------------------[shared.asm table]--------------------------;
+DEVICE EQU @RAMDTBL + @RAMDTBL.Size
+.TBL_Entry EQU @DEVICE.TBL_Entry
+.Size: EQU @DEVICE.Size
+.End EQU @DEVICE.End
+;----------------------------------------------------------------------;
+;
+
+;
+;--------------------------[shared.asm table]--------------------------;
+;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
+;+01 LONG SECTOR OFFSET
+;+05 LONG SIZE IN SECTORS
+;+09 FREE
+;+15
+LOGDRV EQU DEVICE + DEVICE.End
+.TBL_Entry EQU @LOGDRV.TBL_Entry
+.Size EQU @LOGDRV.Size
+;----------------------------------------------------------------------;
+;
+
+;
+;-----------------------[ram_disk-drv.asm table]-----------------------;
+; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID
+; Log Number: DB RAM_Drive_Log_Number, RAM_Drive_ID ;(BIOS 0-15), (Block ID for BIOS)
+RAMDTBL EQU LOGDRV + LOGDRV.Size
+.TBL_Entry EQU @RAMDTBL.TBL_Entry
+.Size EQU @RAMDTBL.Size
+; RAMDTBL: DUP MAX_RAMDRIVES * RAMDTBL.TBL_Entry
+; DB #FF
+; EDUP
+; .Size EQU $-RAMDTBL
+;----------------------------------------------------------------------;
+;
+ ENDMODULE
+////////////////////////////////////////////////////////////////////////;
+ ;DISPLAY "DEVICE start: ", /H, DEVICE
+ ;DISPLAY "Old DEVICE start: ", /H, OLD_TABLES.DEVICE
+ ;DISPLAY "LOGDRV start: ", /H, LOGDRV
+ ;DISPLAY "Old LOGDRV start: ", /H, OLD_TABLES.LOGDRV
+ ;DISPLAY "RAMDTBL start: ", /H, RAMDTBL
+ ;DISPLAY "Old RAMDTBL start: ", /H, OLD_TABLES.RAMDTBL
+
+;
+;DRV_TEMP_BUFFER:
+
+;---------[256 bytes stack for return pages of RST #18 callers]--------;
+; #3F00 - #3FFF
+DRV_PAGE.RSTx18_RET_PAGES EQU #3FFF
+;----------------------------------------------------------------------;
+; ASSERT ((#4000-DRV_TEMP_BUFFER-256) > (DEVICE.Size + LOGDRV.Size + RAMDTBL.Size)), "No space for DRV_TEMP_BUFFER in DRV-MAIN page"
+; ENDMODULE
; OUTEND
-;[END]
+;[END]
\ No newline at end of file
diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM
new file mode 100644
index 0000000..3c84133
--- /dev/null
+++ b/DSS/DSS-MAIN.ASM
@@ -0,0 +1,735 @@
+
+;[BEGIN]
+;//MODULE: DOS-MAIN AUTHOR: Denis Parinov
+;//CREATE: A LONG TIME AGO :)
+;---------------------------------------------------------------
+;Rev Date Name Description
+;---------------------------------------------------------------
+;[ ] увеличить длину PATH и строки BAT
+;[ ] путь текущего каталога в DIR выводится с глюком если он длинее 256 байтов
+;[ ] путь в приглашении консоли выводится с глюком если путь длинее 256 байтов
+;[ ] ;!FIXIT какой-то баг при котором если нет диска и на него полезть, то всё ломается
+;R12 24-07-2023 BAO Check minimum BIOS version on boot
+;R11 17-04-2023 BAO OPTIMIZED BUFFERS, FREED UP 768 BYTES FOR CODE
+;R10 14-04-2023 BAO Аварийный зависон с выводом сообщения при старте системы, если нет свободной памяти
+;R09 08-04-2023 BAO Сокращение размера таблицы API до 96 функций (0 - #5F). (Опционально при компиляции)
+;R08 15-04-2003 DNS RENAMED FN. OPEN AND CLOSE
+;R07 31-03-2003 DNS NEW DEPLOYING ROUTINE
+;R06 31-03-2003 DNS RELAYOUTING MEMORY
+;R05 27-03-2003 DNS CHANGE DRV. INIT. METHOD
+;R04 27-03-2003 DNS DRIVERS MOVE TO SPECIAL PAGE
+;R03 14-03-2003 DNS CODE OPTIMIZATION
+;R02 19-11-2002 DNS ADD ENVIRONMENT INITIALIZATION
+;R01 14-11-2002 DNS CUT AND MOVE BPB-STRUCT
+;---------------------------------------------------------------
+; OUTPUT './Build/system.dos'
+
+; MODULE MAIN
+//SPRINTER EQU 2000
+
+ includelua 'Shared_includes/lua/Functions.lua'
+ include 'shared_includes/structures/FileSystem.inc'
+ include 'shared_includes/constants/sp2000.inc'
+ INCLUDE 'defines.inc'
+ include 'Structures.inc'
+ include 'shared_includes/constants/standart_colors.inc'
+ include 'shared_includes/constants/bios_equ.inc'
+ include 'shared_includes/constants/dss_equ.inc'
+ include 'shared_includes/macroses/accelerator.z80'
+ include 'shared_includes/macroses/macros.z80'
+ INCLUDE 'VERSION.INC'
+ INCLUDE 'DSS_MACROSES.Z80'
+
+;PAGEDRV EQU #00
+
+; DIRPAGE EQU 0
+; FATPAGE EQU 1
+; TXTPAGE EQU 2
+; ENVPAGE EQU 2
+; DRVPAGE EQU 3
+; ENVPAGE EQU 3
+; DRVPAGE EQU 4
+
+; TXTADDR EQU #C000
+; ENVADDR EQU #E400
+
+; DIR EQU #C000
+; FAT EQU #C000
+
+
+;
+; = -- = -- = -- = -- = = -- = -- = = -- = -- = = -- = -- = -- = -- = --;
+ ORG 0
+;
+;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
+; <[CLOSE TASK]> ;
+RST_0x00: JP RETFAR ; ;EXECUTE.ASM R12
+;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
+;
+
+;
+;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
+; <[BIOS API]> ;
+ _mInfoBLOCK 8-$,#FF ;
+RST_0x08: PUSH AF ;
+ LD A,SYS_PORT.BIOS ;
+ OUT (SYS_PORT.ON),A ;
+ POP AF ;
+ RET ;
+;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
+;
+
+;
+;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
+; <[DSS API]> ;
+ _mInfoBLOCK #10-$,#FF ;
+RST_0x10: JP RST_10 ;
+;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
+;
+
+;
+;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
+; <[DRIVE API]> ;
+ _mInfoBLOCK #18-$,#FF ;
+;A0018 JP INTDISK ;
+RST_0x18: PUSH AF ;
+ PUSH BC ;
+DRV_PG_NUMBER+2: ;
+ LD BC,0*256+SLOT0 ;
+ JP PORTAL.out_MAIN ;
+;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
+;
+
+;
+;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
+; <[NOT USED]> ;
+ _mInfoBLOCK #20-$,#FF ;
+RST_0x20: JP RST_20 ;
+;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
+;
+
+;
+RST_20:
+RST_28:
+NOPS: LD A,DSS_Error.sys.INVALID_FUNCTION
+ SCF
+ RET
+;
+
+;
+;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
+; <[NOT USED]> ;
+ _mInfoBLOCK #28-$,#FF ;
+RST_0x28: JP RST_28 ;
+;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
+;
+
+;
+;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
+; <[MOUSE API]> ;
+ _mInfoBLOCK #30-$,#FF ;
+RST_0x30: PUSH AF
+.drv_page+1: LD A,#FF
+ OUT (SLOT0),A
+ POP AF
+ RET
+;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
+;
+
+////////////////////////////////////////////////////////////////////////
+; <[MAIN INT]>
+ _mInfoBLOCK #38-$,#FF
+ ;для того, чтоб софты могли менять обработчик на свой.
+RST_38_IM1: JP .Handler
+.Handler: CALL INTx38_Handler
+ EI
+ RETI
+ ;
+.Portal: PUSH AF
+ LD A,(RST_0x30.drv_page)
+ OUT (SLOT0),A
+ ;POP AF
+ PUSH HL
+ LD HL,(RST_38_IM1+1)
+ XOR A
+ CP H
+ JR NZ,.error
+ LD A,low .Handler
+ CP L
+ JR NZ,.error
+ POP HL
+ POP AF
+ CALL INTx38_Handler
+ JR .Portal
+ ;
+.error: POP HL
+ POP AF
+ JR .Portal
+ ;
+////////////////////////////////////////////////////////////////////////
+
+
+////////////////////////////////////////////////////////////////////////
+;
+;NMI: RETN
+;
+
+;
+;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
+; <[ NMI ]> ;
+ _mInfoBLOCK #66-$,#FF ;
+NMI_0x66: RETN ;JP NMI ;
+;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
+;
+////////////////////////////////////////////////////////////////////////
+
+;
+RST_10: PUSH HL
+ LD L,C
+ IF SHORT_RSTx10_TABLE
+ ;[ ] R09
+ LD H,A
+ LD A,+(DSS_API_TABLE.low_short)
+ SUB C
+ JR C,.error
+ LD A,H
+ ;[ ] R09
+ ENDIF
+
+ LD H,high DSS_API_TABLE
+ LD C,(HL)
+ INC H
+ LD H,(HL)
+ LD L,C
+ EX (SP),HL
+ RET
+
+ IF SHORT_RSTx10_TABLE
+ ;[ ] R09
+.error: POP HL
+ JR NOPS
+ ;[ ] R09
+ ENDIF
+;
+
+;
+;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
+; <[DRIVE PAGE SWITCH]> ;
+ _mInfoBLOCK #80-$,0 ;
+;ENTER: ;
+PORTAL.out_MAIN: ;
+ IN A,(C) ;
+ OUT (C),B ;
+ ASSERT $!=84,'-> Portal error!';
+ POP BC ;
+ RET ;
+;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ';
+;
+
+
+;R01
+; Area for boot sector BootSector.
+;BootSector _sBOOT_SECTOR_PARAMS ,{ "DSS_","0"+VERS,".",MODF/10+"0",MODF-(MODF/10)*10+"0" }
+; end boot sector
+;R01
+
+; = -- = -- = -- = -- = = -- = -- = = -- = -- = = -- = -- = -- = -- = --;
+;
+
+;
+CLEAR_BUFFER_AND_INIT_PROC:
+ ;------[CLEAR BUFFERS]------;
+ ;R07 ;R11
+ XOR A
+ LD HL,CLEAR_ZONE.start
+ LD DE,CLEAR_ZONE.start+1
+ LD BC,CLEAR_ZONE.size-1
+ LD (HL),A
+ LDIR
+ LD HL,':'*256 + 'X'
+ LD (CORE_BUFFERS.CurrentPath),HL
+ LD A,'\' ;
+ LD (CORE_BUFFERS.CurrentDirectory),A
+ LD (CORE_BUFFERS.WorkDirectory),A
+ ;
+ LD A,#FF
+ LD (CORE_BUFFERS.FS_Buffer.DRIVE),A
+ ;
+ ;R07 ;R11
+ ;R11
+ LD HL,CORE_BUFFERS.FM_BUF
+ LD (HL),'.'
+ ;R11
+ ;---------------------------;
+ ;R02
+ ;LD B,#FF ;INIT ENVIRONMENT
+ CALL INITENV
+; IFN CLASSIC_CURSOR
+ CALL SETUP_CURSORS
+; ENDIF
+ ;R02
+ JP VERSION
+
+
+
+INTx38_Handler: PUSH AF
+ EX AF,AF'
+ PUSH AF
+ PUSH BC
+ PUSH DE
+ PUSH HL
+ EXX
+ PUSH BC
+ PUSH DE
+ PUSH HL
+ PUSH IX
+ PUSH IY
+ CALL KEYSCAN
+ LD C,Dss.Mouse.GetPackets
+ RST ToDSS.Mouse
+ ;CALL M_INT
+; IFN CLASSIC_CURSOR
+ CALL cursor_interrupt; вектор обслуж. курсора ;!!!!! VASIL
+; ENDIF
+ POP IY
+ POP IX
+ POP HL
+ POP DE
+ POP BC
+ EXX
+ POP HL
+ POP DE
+ POP BC
+ POP AF
+ EX AF,AF'
+ POP AF
+ RET
+;R03
+;R07Allocate memory
+; LD BC,#03C2
+; RST ToBIOS
+; LD HL,BANKTBL
+; LD C,A
+; LD B,#FF
+;VERINIT INC B
+; PUSH BC
+; PUSH HL
+; LD A,C
+; LD C,#C4
+; RST ToBIOS
+; POP HL
+; POP BC
+; LD (HL),A
+; INC HL
+; JR NC,VERINIT
+;R07;R03
+;R07 JP INIT2 ;R03
+; DS $/256+1*256-$,0 c:\bin\menu
+
+;----------------------------------------------------------------------;
+;MEMTAB: BLOCK 256,0
+;----------------------------------------------------------------------;
+
+ _mInfoALIGN 256,0
+;------------------------------------------------------------------------------------------------------------------------;
+GO_ZERO EQU #0000
+;FUNCTION ADDRESS ARRAY
+DSS_API_TABLE: ;DS 512 ;,0
+;...............................................[LOW ADDRESS ]:
+; 0 1 2 3 4 5 6 7 8 9 DEC HEX
+ DB low F_START, low CHDISK_FN, low CURDISK_FN,low DISKINF, low NOPS, low NOPS, low NOPS, low NOPS, low SCANDRV, low BOOTDSK ; 0 00..09
+ DB low CREATE, low CREATE.NEW, low NOPS, low NOPS, low DEL_FN, low NOPS, low RENAME, low OPEN_FN, low CLOSE_FN, low READ ; 1 0A..13
+ DB low WRITE, low MOVE_FP, low ATTRIB, low GET_D_T, low PUT_D_T, low F_FIRST_FN,low F_NEXT, low MKDIR.B, low RMDIR, low CHDIR_FN ; 2 14..1D
+ DB low CURRDIR_FN,low NOPS, low NOPS, low SYSTIME, low SETTIME, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 3 1E..27
+ DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low WAITKEY, low SCANKEY ; 4 28..31
+ DB low ECHOKEY, low CTRLKEY, low NOPS, low K_CLEAR, low K_SETUP, low TESTKEY, low SETWIN, low SETWIN1, low SETWIN2, low SETWIN3 ; 5 32..3B
+ DB low FREEMEM, low GETMEM, low RETMEM, low SETMEM, low EXEC, low LEAVE, low GET_ERR, low GSWITCH, low DOSNAME, low EX_PATH ; 6 3C..45
+ DB low ENVIRON, low APPINFO, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 7 46..4F
+ DB low SETVMOD, low GETVMOD, low LOCATE, low CURSOR, low SELPAGE, low SCROLL, low CLEAR, low RDCHAR, low WRCHAR, low WINCOPY ; 8 50..59
+ DB low WINREST, low PUTCHAR, low PCHARS, low LIB_SUB, low NOPS, low PRINT ; 9 5A..5F
+
+;[ ] R09
+.low_short EQU $ - DSS_API_TABLE
+ IFN SHORT_RSTx10_TABLE
+ ;
+ DB low NOPS, low NOPS, low NOPS, low NOPS ; 9 60..63
+ DB low NOPS, low NOPS, low NOPS, low NOPS, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO ; 10 64..6D
+ DUP 13
+ DB low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO, low GO_ZERO ; 110-239 6E-EF
+ EDUP
+ DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; 24 F0..F9
+ DB low NOPS, low NOPS, low NOPS, low NOPS, low NOPS, low NOPS ; END ; 25 FA..FF
+ ;
+ ELSE ;!TODO free space
+
+ _mInfoBLOCK DSS_API_TABLE+#100 - $,0
+ ;[ ] R09
+ ENDIF
+;...............................................[HIGH ADDRESS]:
+ DB high F_START, high CHDISK_FN, high CURDISK_FN,high DISKINF,high NOPS, high NOPS, high NOPS, high NOPS, high SCANDRV, high BOOTDSK
+ DB high CREATE, high CREATE.NEW,high NOPS, high NOPS, high DEL_FN, high NOPS, high RENAME, high OPEN_FN,high CLOSE_FN,high READ
+ DB high WRITE, high MOVE_FP, high ATTRIB, high GET_D_T,high PUT_D_T,high F_FIRST_FN,high F_NEXT, high MKDIR.B,high RMDIR, high CHDIR_FN
+ DB high CURRDIR_FN,high NOPS, high NOPS, high SYSTIME,high SETTIME,high NOPS, high NOPS, high NOPS, high NOPS, high NOPS
+ DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high WAITKEY, high SCANKEY
+ DB high ECHOKEY, high CTRLKEY, high NOPS, high K_CLEAR,high K_SETUP,high TESTKEY, high SETWIN, high SETWIN1,high SETWIN2, high SETWIN3
+ DB high FREEMEM, high GETMEM, high RETMEM, high SETMEM, high EXEC, high LEAVE, high GET_ERR,high GSWITCH,high DOSNAME, high EX_PATH
+ DB high ENVIRON, high APPINFO, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS
+ DB high SETVMOD, high GETVMOD, high LOCATE, high CURSOR, high SELPAGE,high SCROLL, high CLEAR, high RDCHAR, high WRCHAR, high WINCOPY
+ DB high WINREST, high PUTCHAR, high PCHARS, high LIB_SUB,high NOPS, high PRINT
+
+;[ ] R09
+.high_short EQU $ - DSS_API_TABLE - .low_short
+ IFN SHORT_RSTx10_TABLE
+ ;
+ DB high NOPS, high NOPS, high NOPS, high NOPS
+ DB high NOPS, high NOPS, high NOPS, high NOPS, high GO_ZERO,high GO_ZERO, high GO_ZERO,high GO_ZERO,high GO_ZERO, high GO_ZERO
+ DUP 13
+ DB high GO_ZERO, high GO_ZERO, high GO_ZERO, high GO_ZERO,high GO_ZERO,high GO_ZERO, high GO_ZERO,high GO_ZERO,high GO_ZERO, high GO_ZERO
+ EDUP
+ DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS
+ DB high NOPS, high NOPS, high NOPS, high NOPS, high NOPS, high NOPS ; END
+ ;
+ ELSE
+ ;!TODO free space
+ ;_mInfoBLOCK DSS_API_TABLE+#200 - $,0
+ ;[ ] R09
+ ENDIF
+; DB low WINREST, low PUTCHAR, low PCHARS, low NOPS, low NOPS, low PRINT, low NOPS, low NOPS, low NOPS, low NOPS ; 9 5A..63
+; DB high WINREST,high PUTCHAR,high PCHARS, high NOPS, high NOPS, high PRINT, high NOPS, high NOPS, high NOPS, high NOPS
+;---------------------------------------------------------------------------------------------------------------------------------------------------------------;
+;[INCLUDE]
+ ;!TODO заменить по-максимому всё в KEYINTER.ASM на вызовы биоса
+ INCLUDE "KEYINTER.ASM"
+ INCLUDE "API.ASM"
+ INCLUDE "DOS_Proc.asm"
+ INCLUDE "FS_Module.asm"
+ INCLUDE "Procedures.asm"
+ ;INCLUDE "drivers/drv_to_sys_errors.asm" ; !TODO
+
+; [ ] 26/06/2024& read only 64kb cluster ; !TODO cluster 64kb
+CHECK_64kb_CLUSTER:
+ LD HL,(CORE_BUFFERS.FS_Buffer.BytesPerCluster)
+ ; CF=0
+ ADC HL,HL
+ LD A,DSS_Error.sys.WRITE_PROTECT
+ RET NZ
+ CCF
+ RET
+ ;
+
+
+;!FIXIT к буферам
+; Массив лог. номеров банок расширения DSS
+BANKTBL: BLOCK USING_MEMPAGES+1,#FF ; +1 для COREPAGE
+HANDBUF: BLOCK HANDBUF.SIZE,0
+;
+; ; FAT_DIRECTORY_RECORD ; !HARDCODE
+MASKARE: BLOCK 8,0 ; имя файла
+ BLOCK 3,0 ; расш.
+ BLOCK 21,0 ; 11+21=32
+;
+ DISPLAY "DOS-MAIN end address: ",/H,$-1
+;
+
+;!TODO к буферам!
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+/*
+; 259
+CurrentPath: DB 'X'
+ DB ':'
+CurrentDirectory: DB '\'
+.DEPTH: EQU DIRECTORY_PATH_LENGTH
+ BLOCK CurrentDirectory.DEPTH,0 ; не .DEPTH-1 чтоб был 0 в конце
+;
+; 257
+WorkDirectory: DB '\'
+.DEPTH: EQU DIRECTORY_PATH_LENGTH
+ BLOCK WorkDirectory.DEPTH,0 ; не .DEPTH-1 чтоб был 0 в конце
+
+; 516
+*/
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+;
+;> > > > > > > > > > > > > > > > BUFFERS < < < < < < < < < < < < < < < <
+;
+;
+CLEAR_ZONE.start EQU $
+
+ MODULE CORE_BUFFERS
+BUFFERSplace _sBuffers=$
+FM_BUF _sFM = BUFFERSplace.FileManipulator
+.Size EQU _sFM
+.FullSize EQU FMCOUNT*FM_BUF.Size
+FS_Buffer _sFS_Buffer = BUFFERSplace.FS_Buffer
+EXEBUFF _sEXE_HEADER = BUFFERSplace.EXE_Header
+XSTACK _sStack = BUFFERSplace.Stack
+.Spoint EQU XSTACK + _sStack
+BUFFER EQU BUFFERSplace.Buffer
+SECTOR_BUFFER EQU BUFFER ;!TODO отделить SECTOR_BUFFER от BUFFER
+MemoryTable EQU BUFFERSplace.MemoryTable
+CurrentPath EQU BUFFERSplace.CurrentPath
+CurrentDirectory EQU BUFFERSplace.CurrentDirectory
+.DEPTH EQU DIRECTORY_PATH_LENGTH
+WorkDirectory EQU BUFFERSplace.WorkDirectory
+.DEPTH EQU DIRECTORY_PATH_LENGTH
+ ENDMODULE
+;
+; CurrentPath EQU CORE_BUFFERS.BUFFERSplace + _sBuffers
+; CurrentDirectory EQU CurrentPath + 2
+; .DEPTH: EQU DIRECTORY_PATH_LENGTH
+; ;
+; WorkDirectory EQU CurrentDirectory + 1 + CurrentDirectory.DEPTH
+; .DEPTH: EQU DIRECTORY_PATH_LENGTH
+;
+CLEAR_ZONE.size EQU _sBuffers
+
+
+ ASSERT (CLEAR_ZONE.start + _sBuffers)<#4000, "Warning!!! OUT OF SLOT0"
+
+ DISPLAY "--- --- --- --- --- --- --- ---"
+ DISPLAY "CLEAR_ZONE.start ", /H, CLEAR_ZONE.start
+ DISPLAY "CLEAR_ZONE.Size ", /H, CLEAR_ZONE.size
+ DISPLAY "--- --- --- --- --- --- --- ---"
+ DISPLAY "Consist: "
+ DISPLAY " FM_BUF ", /H, CORE_BUFFERS.FM_BUF
+ DISPLAY " FM_BUF.Size: ", /H, CORE_BUFFERS.FM_BUF.Size
+ DISPLAY " FM_BUF.FullSize ", /H, CORE_BUFFERS.FM_BUF.FullSize
+ DISPLAY " FS_Buffer ", /H, CORE_BUFFERS.FS_Buffer
+ DISPLAY " FS_Buffer.Size ", /H, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.FS_Buffer
+ DISPLAY " EXEBUFF ", /H, CORE_BUFFERS.EXEBUFF
+ DISPLAY " Size ", /H, CORE_BUFFERS.XSTACK - CORE_BUFFERS.EXEBUFF
+ DISPLAY " XSTACK ", /H, CORE_BUFFERS.XSTACK
+ DISPLAY " Size ", /H, CORE_BUFFERS.BUFFER - CORE_BUFFERS.XSTACK
+ DISPLAY " BUFFER ", /H, CORE_BUFFERS.BUFFER
+ DISPLAY " Size ", /H, CORE_BUFFERS.MemoryTable - CORE_BUFFERS.BUFFER
+ DISPLAY " MemoryTable ", /H, CORE_BUFFERS.MemoryTable
+ DISPLAY " Size ", /H, _sBuffers - (CORE_BUFFERS.MemoryTable - CORE_BUFFERS.BUFFERSplace)
+ DISPLAY "--- --- --- --- --- --- --- ---"
+ DISPLAY "CLEAR_ZONE.End ", /H, CLEAR_ZONE.start + CLEAR_ZONE.size
+ DISPLAY "--- --- --- --- --- --- --- ---"
+
+ EXPORT CORE_BUFFERS.BUFFERSplace
+ EXPORT CORE_BUFFERS.FM_BUF
+ EXPORT CORE_BUFFERS.FS_Buffer
+ EXPORT CORE_BUFFERS.EXEBUFF
+ EXPORT CORE_BUFFERS.XSTACK
+ EXPORT CORE_BUFFERS.BUFFER
+ EXPORT CORE_BUFFERS.SECTOR_BUFFER
+ EXPORT CORE_BUFFERS.MemoryTable
+ EXPORT CORE_BUFFERS.CurrentDirectory
+ EXPORT CORE_BUFFERS.WorkDirectory
+/*
+;R11 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
+FM_BUF _sFM=$
+.Size EQU _sFM
+.FullSize EQU FMCOUNT*FM_BUF.Size
+
+;????? а не грузится ли полностью сектор в 512 байтов при загрузке хэдера?
+EXEBUFF _sEXE_HEADER=$+FM_BUF.FullSize
+; EXEBUFF:
+; DB "EXE"
+; DB #00
+; OFFCOD1 DW #0000
+; OFFCOD2 DW #0000
+; LOADER DW #0000
+; DW #0000
+; DW #0000
+; DW #0000
+; LD_ADDR DW #0000
+; PC_REG DW #0000
+; SP_REG DW #0000
+; BLOCK 512-($-EXEBUFF),0
+
+;(!!!HERE STACK FOR EXEC!!!)
+; BLOCK 255,0
+;XSTACK DB #00
+XSTACK EQU EXEBUFF+_sEXE_HEADER+255
+
+BUFFER EQU XSTACK+1
+SECTOR_BUFFER EQU BUFFER
+;R11 ////////////////////////////////
+*/
+
+;
+;> > > > > > > > > > > > > > > > BUFFERS < < < < < < < < < < < < < < < <
+;
+
+
+;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+; затрётся после инициализации
+;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+
+
+; Первый старт системы, после инициализации адрес в таблице меняется на VERSION
+F_START: DI
+ ;[x] 17.12.2023 загрузка с активного раздела, а не с первого
+ ;LD (.saveDRV),A
+ LD H,A
+ LD (.saveDRV),HL ; H - номер устройства, L - номер раздела на устройстве
+ ;
+
+ ;R12
+ LD HL,0 ; писать в никуда
+ LD C,BIOS.FN_VERSION
+ RST ToBIOS
+ JR C,.err_oldBIOS
+ EX DE,HL
+ LD DE,MINIMUM_BIOS_VERSION
+ SBC HL,DE
+ JR C,.err_oldBIOS
+ ; LD A,(.saveDRV+1)
+ ; CP 2 ;проверка на загрузку с дискеты, если с дискеты, то можно проигнорить запуск на BIOS ниже 2.55
+ ; JR NC,.err_oldBIOS
+ ; LD HL,#C9AF ; XOR A : RET opcodes
+ ; LD (DRV_CONTENT + INITDVC.if_old),HL
+ ;
+
+.good: CALL DEPLOY ;R07 ;эта процедура затрётся после исполнения
+ RET C ;R10
+ CALL KEYBOARD_INIT
+ CALL PRINT_INIT
+ LD C,Dss.Mouse.Init
+ RST ToDSS.Mouse
+ LD A,(VMODE)
+ LD C,Dss.Mouse.SetVideoMode
+ RST ToDSS.Mouse
+ ;CALL INITDVC ;R05
+ ;R05
+ LD C,Dss.DRV.Init
+ RST ToDSS.DRV
+ LD (LDRIVE),A
+ ;R05
+.saveDRV+1:
+ ;[x] 17.12.2023 загрузка с активного раздела, а не с первого
+ LD HL,0 ; H - номер устройства, L - номер раздела на устройстве
+ ;LD A,H
+ ;LD A,0
+ ;
+ ;LD B,1
+ CALL BOOTDSK.SET
+ RET C
+ ;
+ EI
+ ;Set new address fn. VERSION
+ LD HL,DSS_API_TABLE
+ LD (HL),low VERSION ;R03
+ INC H
+ LD (HL),high VERSION ;R03
+ JP CLEAR_BUFFER_AND_INIT_PROC
+ ;
+ ;R12
+.err_oldBIOS:
+ IN A,(SLOT0)
+ OUT (SLOT3),A
+ LD HL,.err_oldBIOS_message + SLOT3.MEM_ADDR
+ ;LD C,Dss.PChars
+ ;RST ToDSS
+ CALL PCHARS
+ SCF
+ RET
+.err_oldBIOS_message:
+ DB "\r\nWARNING! This version of DSS requires BIOS v"
+ DB STR_MINIMUM_BIOS_VERSION
+ DZ " or later to boot from IDE."
+ ;
+
+DEPLOY: ;Allocate memory
+ LD BC,USING_MEMPAGES*256 + BIOS.GetMem
+ RST ToBIOS
+ RET C ;R10
+ LD C,A
+
+ IN A,(SLOT3)
+ PUSH AF
+ IN A,(SLOT0)
+ LD (DRV_CONTENT + DRV_PAGE.MAIN_PAGE_NUMBER),A ;!TEST
+ OUT (SLOT3),A
+
+ LD A,C
+ LD HL,BANKTBL + #C000
+ LD C,BIOS.GetMemBlkPages
+ RST ToBIOS
+ ; должна идти после GetMemBlkPages, чтоб вместо
+ ; закрывашки #FF поставить страницу COREPAGE
+ LD HL,BANKTBL + COREPAGE
+ IN A,(SLOT0)
+ LD (HL),A
+ ; для API драйвера мышки
+ LD (MOUSE_HANDLER.CorePage),A
+ LD A,(BANKTBL + DRVPAGE)
+ LD (RST_0x30.drv_page),A
+
+ POP AF
+ OUT (SLOT3),A
+
+ SET_PAGE_X DRVPAGE
+
+ PUSH AF
+ LD HL,DRV_CONTENT
+ LD DE,#C000
+ LD BC,DRV_CONTENT.SIZE
+ LDIR
+ IN A,(SLOT3)
+ LD (DRV_PG_NUMBER),A
+ POP AF
+ OUT (SLOT3),A
+ AND A ;R10
+ RET
+
+ IF ENVVALUE != CORE_BUFFERS.BUFFER
+ ASSERT "Warning! ENVVALUE != BUFFER"
+ //BLOCK 1000,0
+ ENDIF
+
+;--- --- --- --- [Build version] --- --- --- ---;
+; C_OSTYPE
+;--- --- --- --- --- --- --- --- --- --- --- ---;
+
+ DISPLAY "FAT MODULE SIZE: ",/A,FAT_MODULE_SIZE
+ DISPLAY "DEPLOY end address: ",/H,$
+;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||;
+ DISPLAY "Space for DRV-MAIN: ",/A,#4000-$," bytes."
+DRV_CONTENT:
+ DISP 0
+ INCLUDE 'DRV-MAIN.ASM'
+ ENT
+DRV_CONTENT.SIZE EQU $-DRV_CONTENT
+
+BIN_END_ADDRESS EQU $
+
+ DISPLAY "END ADDRESS: ",/H,BIN_END_ADDRESS
+ DISPLAY "Memory leacks when > ",/H, #4000+SUBLOAD_SIZE*512
+ ASSERT $ < (#4001+SUBLOAD_SIZE*512),'-> Memory leack!!!';
+ ASSERT DRV_CONTENT.SIZE < #4001,'-> Drivers code size > #4000!!!';
+;[END]
+
+;
+
+
+; DTA DB " "
+; DB " "
+; DB #20
+; DW 0,0,0,0,0
+; DW 0
+; DW 0
+; CLUSTER DW 0
+; SIZE DW 0,0
+; ASCIIZ DB "FILENAME.EXT",#00
+
+
+;R06
+;R06 BUFFER
+;R06 SECTOR_BUFFER DB ". ",#10
+;R06 DW 0,0,0,0,0
+;R06 DW #0000
+;R06 DW #0000
+;R06 DW #0000
+;R06 DW #0000,0000
+;R06 DB ".. ",#10
+;R06 DW 0,0,0,0,0
+;R06 DW #0000
+;R06 DW #0000
+;R06 DW #0000
+;R06 DW #0000,0000
+;R06 DS 512-64 ;,0
\ No newline at end of file
diff --git a/DSS/DSS_MACROSES.Z80 b/DSS/DSS_MACROSES.Z80
index 8a85c11..776efd5 100644
--- a/DSS/DSS_MACROSES.Z80
+++ b/DSS/DSS_MACROSES.Z80
@@ -1,20 +1,142 @@
;
- MACRO _mSavePath
-; PUSH HL
-; LD HL,BACK_CUR_PATH
-; EX (SP),HL
-; CALL SAVE_CUR_PATH
- ENDM
+; MACRO BUFFER_KEYINTER
+; _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
+; ;
+; ENDM
;
+
;
- MACRO _mRestorePath
-; CALL BACK_CUR_PATH
+; MACRO TABLE_XLAT_T
+; _mInfoALIGN 256,0
+; ; 0 1 2 3 4 5 6 7 8 9 A B C D E F
+; XLAT_T: DB #00,#43,#00,#3F,#3D,#3B,#3C,#46,#00,#44,#42,#40,#3E,#0F,#00,#00 ;00
+; DB #00,#37,#29,#00,#36,#10,#02,#00,#00,#00,#2A,#1E,#1D,#11,#03,#00 ;10
+; DB #00,#2C,#2B,#1F,#12,#05,#04,#00,#00,#38,#2D,#20,#14,#13,#06,#00 ;20
+; DB #00,#2F,#2E,#22,#21,#15,#07,#00,#00,#00,#30,#23,#16,#08,#09,#00 ;30
+; DB #00,#31,#24,#17,#18,#0B,#0A,#00,#00,#32,#33,#25,#26,#19,#0C,#00 ;40
+; DB #00,#00,#27,#00,#1A,#0D,#00,#00,#1C,#34,#28,#1B,#00,#35,#00,#00 ;50
+; DB #00,#00,#00,#00,#00,#00,#0E,#00,#00,#51,#00,#54,#57,#00,#00,#00 ;60
+; DB #50,#4F,#52,#55,#56,#58,#01,#49,#45,#4D,#53,#4C,#4B,#59,#48,#00 ;70
+; DB #00,#00,#00,#41,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 ;80
+; ENDM
+;
+
+;
+; ВХОД: L - логический номер в таблице
+; ВЫХОД: IY - начало записи
+; ПОРТИТ: HL, DE, IY.
+ MACRO LOGDRV_ENTRY_FIND tbl_addr
+ LD H,0
+ ADD HL,HL
+ ADD HL,HL
+ ADD HL,HL
+ ADD HL,HL
+ EX DE,HL
+ LD IY,tbl_addr
+ ADD IY,DE
ENDM
;
;
- MACRO _mRestorStackAfterRestorePath
-; POP HL ;CLEAR STACK "BACK_CUR_PATH"
+ MACRO _CALC_DEVICE_ENTRY tbl_addr
+ CP DSS_MAX_DRIVES_AMOUNT+1
+ JR C,.norm
+ ; Error!
+ LD A,DSS_MAX_DRIVES_AMOUNT
+.norm: LD C,A
+ ADD A,A
+ ADD A,C
+ LD C,A
+ LD B,0
+ LD HL,tbl_addr
+ ADD HL,BC
+ ENDM
+;
+
+;
+ MACRO SET_PAGE_X new_page
+ LD A,(BANKTBL+new_page)
+ LD B,A
+ LD C,SLOT3
+ IN A,(SLOT3)
+ OUT (C),B
ENDM
;
@@ -69,4 +191,30 @@
MACRO C_OSRELEASE
DB "Estex DSS",0
ENDM
+;
+
+////////////////////////////////////////////////////////////////////////
+;
+; MACRO _mSavePath force
+; IF SAVE_PATH_MACRO
+; PUSH HL
+; IF force==1
+; LD HL,BACK_CUR_PATH.force
+; ELSE
+; LD HL,BACK_CUR_PATH
+; ENDIF
+; EX (SP),HL
+; CALL SAVE_CUR_PATH
+; ENDIF
+; ENDM
+; MACRO _mRestorePath
+; IF SAVE_PATH_MACRO
+; CALL BACK_CUR_PATH.force
+; ENDIF
+; ENDM
+; MACRO _mRestorStackAfterRestorePath
+; IF SAVE_PATH_MACRO
+; POP HL ;CLEAR STACK "BACK_CUR_PATH"
+; ENDIF
+; ENDM
;
\ No newline at end of file
diff --git a/DSS/ENVIRON.ASM b/DSS/ENVIRON.ASM
deleted file mode 100644
index c9e8a52..0000000
--- a/DSS/ENVIRON.ASM
+++ /dev/null
@@ -1,241 +0,0 @@
-;[BEGIN]
-;//MODULE: ENVIRON
-;//CREATE: 10-11-2002 AUTHOR: Denis Parinov
-;---------------------------------------------------------------
-;Rev Date Name Description
-;---------------------------------------------------------------
-;R01 19-11-2002 DNS CORRECT DE ADDRESS IN GETENV
-;---------------------------------------------------------------
-
-; LD HL,MYVAR
-; CALL SETENV
-; LD HL,MYVAR2
-; LD DE,MYBUF
-; CALL GETENV
-
-
-ENVIRON:
- INC B
- JR Z,INITENV ;B=FF
- DEC B
- JR Z,READENV ;B=0
- DEC B
- JP Z,GETENV ;B=1
- DEC B
- JP Z,SETENV ;B=2
- LD A,DSS_Error.sys.INVALID_FUNCTION
- SCF
- RET
-
-INITENV LD A,ENVPAGE
- CALL BANK
- PUSH AF
- LD DE,ENVIRONMENT
- XOR A
- LD (DE),A
- INC DE
- LD HL,DEFAULT_ENV
- LD BC,DEF_ENV_SIZE
- LDIR
- LD (DE),A
- EX DE,HL
- LD DE,ENVIRONMENT
- AND A
- SBC HL,DE
- LD (ENVSIZE),HL
- POP AF
- OUT (SLOT3),A
- AND A
- RET
-
-READENV:
- PUSH HL
- LD A,ENVPAGE
- CALL BANK
- LD H,A
- LD C,SLOT3
- IN L,(C)
- EXX
- LD HL,ENVIRONMENT
- INC HL
- POP DE
- LD BC,(ENVSIZE)
- EXX
-;
-.loop: OUT (C),L
- EXX
- LD A,(HL)
- EXX
- OUT (C),H
- EXX
- LD (DE),A
- INC HL
- INC DE
- DEC BC
- LD A,B
- OR C
- EXX
- JR NZ,.loop
- XOR A
- RET
-
-GETENV
- PUSH DE
- CALL ENV_EX
-
- LD A,ENVPAGE
- CALL BANK
- EX AF,AF'
-
- CALL F_ENV
- POP DE
- LD A,0
- LD (DE),A
- JR NC,GE_1
-GE_0 LD A,(HL)
- LDI
- OR A
- JR NZ,GE_0
- DEC DE ;R01
- LD A,#FF
-
-GE_1 EX AF,AF'
- OUT (SLOT3),A
- EX AF,AF'
- AND A
- RET
-
-SETENV: CALL ENV_EX
-;
- LD A,ENVPAGE
- CALL BANK
- PUSH AF
-;
- CALL F_ENV
- JR NC,PENV
- XOR A
- CPIR
- LD A,B
- OR C
- JR Z,PENV
- LDIR
-; DEC DE
-PENV LD A,(ENVVALUE)
- OR A
- JR Z,CLR_ENV
- LD HL,ENVNAME
-F_EVN2 LD A,(HL)
- LDI
- CP "="
- JR NZ,F_EVN2
- LD HL,ENVVALUE
-F_EVN3 LD A,(HL)
- LDI
- OR A
- JR NZ,F_EVN3
-CLR_ENV XOR A
- LD (DE),A
- LD HL,ENVIRONMENT
- EX DE,HL
- SBC HL,DE
- LD (ENVSIZE),HL
-;
- POP AF
- OUT (SLOT3),A
- AND A
- RET
-
-
-; RET:
-; DE - VAR VALUE
-; HL - VAR ADDRESS
-; BC - ENVIRONMENT SIZE
-F_ENV LD HL,ENVIRONMENT
- LD BC,(ENVSIZE)
- PUSH HL
-F_EVN0 POP DE
- LD DE,ENVNAME
- XOR A
- CPIR
- PUSH HL
-F_EVN1 LD A,(HL)
- OR A
- JR Z,END_OF_ENV
- LD A,(DE)
- CP (HL)
- INC HL
- INC DE
- DEC BC
- JR NZ,F_EVN0
- CP "="
- JR NZ,F_EVN1
- SCF
-END_OF_ENV
- POP DE
- RET
-
-ENV_EX LD B,32
- LD DE,ENVNAME
-ENV_E0 XOR A
- LD (DE),A
- LD (ENVVALUE),A
-ENV_E1 LD A,(HL)
- INC HL
- CP "="
- JR Z,EQUAL_SG
- OR A
- JR Z,ENV_E3
- CALL UPPER
- LD (DE),A
- INC DE
- DJNZ ENV_E1
- SCF
- RET
-
-ENV_E3 LD A,"="
- LD (DE),A
- INC DE
- XOR A
- LD (DE),A
- INC DE
- RET
-
-EQUAL_SG:
- LD (DE),A
- INC DE
- XOR A
- LD (DE),A
- LD DE,ENVVALUE
- LD (DE),A
- LD C,#FF
-ENV_E2 LD A,(HL)
- LDI
- OR A
- RET Z
- DJNZ ENV_E2
- SCF
- RET
-
-ENVNAME EQU EXEBUFF ;DS 32
-ENVVALUE EQU BUFFER //#3800 ; BUFFER ;DS 128
-
-ENVSIZE DW 1 ;E_END-ENVIRONMENT ;160
-
-ENVIRONMENT EQU ENVADDR
-
-DEFAULT_ENV
-; DB "SYSTEM=C:\\system.exe",0
-; DB "PATH=\\SYSTEM\\;\\COMMAND\\;",0
- DB 0 ; "",0
-DEF_ENV_SIZE EQU $-DEFAULT_ENV
-
-; DB 0
-; DB "SYSTEM=C:\system.exe",0
-; DB "PATH=C:\;\FN\;",0
-; DB "OS=ESTEX",0
-; DB "VAR1=000",0
-; DB "OSNAME=ESTEX 2002",0
-; DB 0
-;E_END
-
-;[END]
diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM
deleted file mode 100644
index 996aa35..0000000
--- a/DSS/EXECUTE.ASM
+++ /dev/null
@@ -1,1228 +0,0 @@
-
-;[BEGIN]
-;//MODULE: EXECUTE
-;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
-;//UPDATE: 24-10-1999 DNS Restore module
-;---------------------------------------------------------------
-;Rev Date Name Description
-;---------------------------------------------------------------
-;R11 17-04-2023 BAO OPTIMIZED BUFFERS, FREED UP 768 BYTES FOR CODE
-;R10 13-04-2023 BAO FIX BUG WITH PARSING DIRECTORY BUFFER
-;R09 14-04-2003 DNS NOW EXEC DON'T FOLLOW TO PROGRAM'S DIR
-;R08 05-12-2002 DNS FIX BUG WITH INCREMENT TASK ID AND OPEN *.EXE ERROR
-;R07 05-12-2002 DNS FIX FOR EXECUTING IN CURRENT DIR WITHOUT PATH
-;R06 02-12-2002 DNS FIX BUG WITH NULL-TERMINATED STRING
-;R05 02-12-2002 DNS ADD APP_PATH TO THE PROGRAM PREFIX
-;R04 26-11-2002 DNS TRY TO FIX EXEC WITH PATH
-;R03 19-11-2002 DNS CHECK SUBFN. FOR FN. EXEC
-;R02 24-05-1999 DNS FIX CREATE PSP AND
-; MOVE EXEC STACK
-;R01 14-05-1999 DNS DECREASE HEADER SIZE FOR EXE-FILE
-;---------------------------------------------------------------
-
-;
-; APPLICATION INFO
-;====================
-;
-; B = 0 - GET APP_PARAM
-; B = 1 - GET APP_PATH
-; B = 2 - GET APP_FULLNAME
-LAST_PSP_PTR DW 0
-
-APPINFO INC B
-APPINF0 DJNZ APPINF1
- EX DE,HL
- XOR A
- LD (DE),A
- LD HL,(LAST_PSP_PTR)
- LD C,(HL)
- INC C
- RET Z
- INC HL
- LDIR
- AND A
- RET
-
-APPINF1:
- DJNZ APPINF2
- EX DE,HL
- LD HL,(LAST_PSP_PTR)
- LD C,(HL)
- INC HL
- ADD HL,BC
- INC HL
- INC HL
- PUSH HL
- LD BC,#100
- XOR A
- CPIR
- DEC HL ;R10 ;[x] исправлен баг с парсингом буфера каталога
- DEC HL ;R10,5 - не тестил ;!!!!!
- LD BC,#100 ;R10 ;[x] не было этой команды, CPDR мог не прошерстить всё
- LD A,'\'
- CPDR
- INC HL
- INC HL
- POP BC
- AND A
- SBC HL,BC
- LD A,B ;EX HL,A,BC
- LD B,H
- LD H,A
- LD A,C
- LD C,L
- LD L,A
- LDIR
- XOR A
- LD (DE),A
- RET
-
-APPINF2:
- DJNZ APPINF3
- EX DE,HL
- LD HL,(LAST_PSP_PTR)
- LD C,(HL)
- INC HL
- ADD HL,BC
- INC HL
- INC HL
-APINF2 LD A,(HL)
- LDI
- OR A
- JR NZ,APINF2
- RET
-
-APPINF3 LD A,DSS_Error.sys.INVALID_FUNCTION
- SCF
- RET
-
-
-;=================== function 45H ===================
-
-; HL - Input command line
-
-GLOB_PR EQU 7 ;%10000000
-DRIV_PR EQU 3 ;%00001000
-PATH_PR EQU 2 ;%00000100
-EXTN_PR EQU 1 ;%00000010
-NAM_PR EQU 0 ;%00000001
-
-EX_PATH EXX
- LD HL,NM_PATH_A ;BUILT-IN BUFFER FOR PATH
- LD (NM_PATH),HL
- LD HL,NM_NAME_A
- LD (NM_NAME),HL
- LD HL,NM_EXTN_A
- LD (NM_EXTN),HL
- LD HL,NM_DRIVE_A
- LD (NM_DRIVE),HL
- EXX
- INC B
- DEC B
- JR Z,EX_GET_ALL ;0
- DEC B
- JR Z,EX_GET_DRIVE ;1
- DEC B
- JR Z,EX_GET_PATH ;2
- DEC B
- JR Z,EX_GET_NAME ;3
- DEC B
- JR Z,EX_GET_TYPE ;4
- DEC B
- JR Z,EX_GET_ALL_EX ;5
- DEC B
- JR Z,EX_RESR ;6
- DEC B
- JP Z,GSWITCH ;7
- DEC B
- JP Z,GETNAME ;8
- DEC B
- JP Z,MASK ;9
-EX_RESR LD A,DSS_Error.sys.INVALID_FUNCTION
- SCF
- RET
-
-EX_GET_DRIVE
- LD (NM_DRIVE),DE
- CALL EX_FULL
- RET C
- LD DE,(NM_DRIVE)
- LD A,(DE)
- DEC A
- CP #FF
- RET Z
- CP "A"-1
- JR C,ERGD001
- CP "Z"
- JR NC,ERGD001
- SUB "A"-1
- RET
-ERGD001 LD A,DSS_Error.sys.INVALID_DRIVE
- SCF
- RET
-
-EX_GET_PATH
- LD (NM_PATH),DE
- JR EX_FULL
-
-EX_GET_NAME
- LD (NM_NAME),DE
- JR EX_FULL
-
-EX_GET_TYPE
- LD (NM_EXTN),DE
- JR EX_FULL
-
-EX_GET_ALL
- JR EX_FULL
-
-EX_GET_ALL_EX
- EX DE,HL
- LD C,(HL)
- INC HL
- LD B,(HL)
- INC HL
- LD (NM_DRIVE),BC
- LD C,(HL)
- INC HL
- LD B,(HL)
- INC HL
- LD (NM_PATH),BC
- LD C,(HL)
- INC HL
- LD B,(HL)
- INC HL
- LD (NM_NAME),BC
- LD C,(HL)
- INC HL
- LD B,(HL)
- LD (NM_EXTN),BC
- EX DE,HL
- JR EX_FULL
-
-EX_FULL EX AF,AF'
- EXX
- XOR A
- LD HL,(NM_PATH)
- LD (HL),A
- LD HL,(NM_NAME)
- LD (HL),A
- LD HL,(NM_EXTN)
- LD (HL),A
- LD HL,(NM_DRIVE)
- LD (HL),A
- EXX
- EX AF,AF'
-EX_PAT0 LD DE,TMPBUF
- LD BC,#0D01
-EX_PAT1 LD A,(HL)
- CALL UPPER
- LD (DE),A
- INC HL
- INC DE
- INC C
- CP #5C ; \
- JR Z,PATH_YEP
- CP ":"
- JR Z,DRIVE_YEP
- CP #21
- JR C,NAME_YEP
- CP "?"
- JR Z,GLOBP1
- CP "*"
- JR Z,GLOBP1
-EX_PAT2 DJNZ EX_PAT1
- LD A,DSS_Error.sys.INVALID_NAME
- SCF
- RET
-
-GLOBP1 EX AF,AF'
- SET GLOB_PR,A
- EX AF,AF'
- JR EX_PAT2
-
-NAME_YEP
- LD A,2
- CP C
- JR Z,NOFNAME
- PUSH HL
- LD HL,TMPBUF
- LD DE,(NM_NAME)
- LD B,0
- DEC C
- DEC C
- LD A,C
- LDIR
- LD C,A
- XOR A
- LD (DE),A
- LD HL,(NM_NAME)
- LD A,"."
- CPIR
- JR NZ,NOEXTN
- LD C,3
- LD DE,(NM_EXTN)
-EXTSK0 LD A,(HL)
- OR A
- JR NZ,EXTSK1
- LD A,#20
- DEC HL
-EXTSK1 LD (DE),A
- INC HL
- INC DE
- DEC C
- JR NZ,EXTSK0
- XOR A
- LD (DE),A
- EX AF,AF'
- SET EXTN_PR,A
- EX AF,AF'
-NOEXTN EX AF,AF'
- SET NAM_PR,A
- EX AF,AF'
- POP HL
-NOFNAME
- EX AF,AF'
- AND A
- RET
-
-DRIVE_YEP
- XOR A
- LD (DE),A
- PUSH HL
- LD HL,TMPBUF
- LD DE,(NM_DRIVE)
- LD B,0
- LDIR
- POP HL
- EX AF,AF'
- SET DRIV_PR,A
- EX AF,AF'
- JP EX_PAT0
-
-PATH_YEP
- XOR A
- LD (DE),A
- PUSH HL
- PUSH BC
- LD HL,(NM_PATH)
- LD BC,#00FF ; !FIXIT глубина буфера не зависит от DIRSPEC.DEPTH
- CPIR
- DEC HL
- EX DE,HL
- LD HL,TMPBUF
- POP BC
- LD B,0
- LDIR
- POP HL
- EX AF,AF'
- SET PATH_PR,A
- EX AF,AF'
- JP EX_PAT0
-
-TMPBUF DB " ",#00
-
-NM_DRIVE DW NM_DRIVE_A
-NM_NAME DW NM_NAME_A
-NM_EXTN DW NM_EXTN_A
-NM_PATH DW NM_PATH_A
-
-
-NM_DRIVE_A DB 0,0,0,0,0,0,0,0,0
-
-NM_NAME_A DB " ",#00
-
-NM_EXTN_A DB " ",0
-
-NM_PATH_A EQU BUFFER ;DS 256
-
-;===================== function 45h end ================
-
-
-;ENTRY: HL - COMMAND LINE
-; DE - SWITCH BUFFER
-;EXIT: BUFFER
-GSWITCH XOR A
- LD (DE),A
-GSWIT1 LD A,(HL)
- INC HL
- CP " "
- RET C
- JR Z,GSWIT1
-GSWIT2 LD (DE),A
- LD A,(HL)
- INC HL
- INC DE
- CP "!"
- JR NC,GSWIT2
- CP " "
- LD A,0
- LD (DE),A
- RET
-
-;RET: HL - ALL MEMORY
-; BC - FREE MEMORY
-FREEMEM LD C,#C0
- RST ToBIOS
- RET
-
-; B - SIZE BLOCK
-; RET: A - ID MEMORY BLOCK
-
-GETMEM LD C,#C2
- RST ToBIOS
- LD E,A
- LD A,30
- RET C
- LD D,#00
- LD HL,MEMTAB
- ADD HL,DE
- LD A,(TASK)
- LD (HL),A
- LD A,E
- AND A
- RET
-
-; A - ID BLOCK
-RETMEM LD E,A
- LD D,#00
- LD HL,MEMTAB
- ADD HL,DE
- LD A,(TASK)
- CP (HL)
- LD A,DSS_Error.sys.INVALID_MEMORY_HND
- SCF
- RET NZ
- PUSH DE
- LD A,E
- LD C,#C3
- RST ToBIOS
- POP DE
- LD A,DSS_Error.sys.INVALID_MEMORY_HND
- RET C
- LD HL,MEMTAB
- ADD HL,DE
- LD (HL),#00
- XOR A
- RET
-
-; A - ID BLOCK
-; B - NEW SIZE
-SETMEM LD E,A
- LD D,#00
- LD HL,MEMTAB
- ADD HL,DE
- LD A,(TASK)
- CP (HL)
- LD A,DSS_Error.sys.INVALID_MEMORY_HND
- SCF
- RET NZ
- LD D,B
- PUSH DE
- LD A,E
- CALL SIZEBLK
- POP DE
- LD A,DSS_Error.sys.INVALID_MEMORY_HND
- RET C
- LD A,B
- CP D
- RET Z
- JR C,INCMEM
-DECMEM LD B,D
- LD A,E
- LD C,#9D
- RST ToBIOS
- LD A,B
- LD C,#C3
- RST ToBIOS
- XOR A
- RET
-
-INCMEM LD A,D
- SUB B
- LD B,A
- LD C,E
- PUSH BC
- LD C,#C2
- RST ToBIOS
- POP BC
- LD B,A
- LD A,30
- RET C
- LD A,C
- LD C,#9E
- RST ToBIOS
- XOR A
- RET
-
-SIZEBLK LD B,#FF
- LD C,A
-BLK001 INC B
- PUSH BC
- LD A,C
- LD C,#C4
- RST ToBIOS
- POP BC
- JR NC,BLK001
- OR A
- SCF
- RET Z
- XOR A
- RET
-
-LEAVMEM LD HL,MEMTAB
- LD BC,256
-LEVMEM LD A,(TASK)
- CPIR
- RET NZ
- PUSH HL
- PUSH BC
- DEC HL
- AND A
- LD DE,MEMTAB
- SBC HL,DE
- LD A,L
- CALL RETMEM
- POP BC
- POP HL
- JR LEVMEM
-
-; B - LOGICAL PAGE
-; A - ID BLOCK
-; HL - BIT 15&14 WINDOW
-; RET: A - PAGE (WIN)
-; if B = 0FFh, then logical page number got from DE
-SETWIN BIT 7,H ;if 08000h or high?
- JR Z,SETWIN1 ;no, go to open in SLOT1
- BIT 6,H ;if 0C000h or high?
- JR Z,SETWIN2 ;no, go to open in SLOT2
- JR SETWIN3 ;yes, go to open in SLOT3
-
-; B - LOGICAL PAGE
-; A - ID BLOCK
-; RET: A - PAGE (WIN)
-SETWIN1 LD C,#C4
- EX DE,HL
- RST ToBIOS
- EX DE,HL
- RET C
- LD C,SLOT1
- IN B,(C)
- OUT (C),A
- LD A,B
- RET
-
-SETWIN2 LD C,#C4
- EX DE,HL
- RST ToBIOS
- EX DE,HL
- RET C
- LD C,SLOT2
- IN B,(C)
- OUT (C),A
- LD A,B
- RET
-
-SETWIN3 LD C,#C4
- EX DE,HL
- RST ToBIOS
- EX DE,HL
- RET C
- LD C,SLOT3
- IN B,(C)
- OUT (C),A
- LD A,B
- RET
-
-EXEC:
- _mSavePath
- INC B ;R03
- DEC B ;R03
- JP Z,EXEC0 ;R03
- DEC B ;R03
- JP Z,EXEC1 ;R03
- LD A,DSS_Error.sys.INVALID_FUNCTION ;R03
- SCF ;R03
- RET ;R03
-
-CHECKPATH: ; !TODO сделать проверку на количество циклов
- LD A,(HL)
- INC HL
- CP '\'
- RET Z
- CP '/' ;ALT SLASH
- RET Z
- CP '!'
- JR NC,CHECKPATH
- RET
-
-RELATIVE_DIR EQU 0
-ABSOLUTE_DIR EQU 1
-
-FINDPATH
- 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
-
- CALL MAKE_PATH_ARRAY
- LD HL,PATH_PNT_ARRAY
-NEXTPATHI
- LD E,(HL)
- INC HL
- LD D,(HL)
- INC HL
- BIT ABSOLUTE_DIR,(HL)
- INC HL
- PUSH HL
- PUSH BC
- EX DE,HL
- CALL Z,GOTO_CURDIR
-;
-;DBUG CALL DPRINT
-;
- CALL CHDIR
- JR C,BADPATH
- LD HL,EXEBUFF
- LD DE,MASKARE
- CALL MASK
- JR C,BADPATH
- CALL TST_EXT
- JR C,BADPATH
- CALL SEARCH
-BADPATH
- POP BC
- POP HL
- JR NC,PATHFOUND
- DJNZ NEXTPATHI
- SCF
-PATHFOUND
- POP BC
- LD A,B
- OUT (SLOT3),A
-; LD A,DSS_Error.sys.PATH_NOT_FOUND ;????? нужен ли тут код ошибки?
- RET
-
-GOTO_CURDIR
- PUSH HL
- LD HL,TMP_CURDIR
-;
-;DBUG CALL DPRINT
-;
- CALL CHDIR
- POP HL
- RET
-
-MAKE_PATH_ARRAY
- LD HL,PATH_PNT_ARRAY-1 ;R04 -1
- LD DE,ENVTEMP-1
- LD B,#00
-NEXTAR LD (HL),C ;R04
- INC HL ;R04
- XOR A
- LD (DE),A
- LD C,A
- INC DE
- LD (HL),E
- INC HL
- LD (HL),D
- INC HL
-;R04 LD (HL),C
-;R04 INC HL
- INC B
-NEXTRT LD A,(DE)
- CP #5C ;\
- JR NZ,NEXTCH
-NEXTDR SET ABSOLUTE_DIR,C
-NEXTRL ;SET RELATIVE_DIR,C
-NEXTCH LD A,(DE)
- CP ";"
- JR Z,NEXTAR
- INC DE
-; CP "."
-; JR Z,NEXTRL
- CP ":"
- JR Z,NEXTRT
- OR A
- JR NZ,NEXTCH
- LD (HL),C ;R04
- INC HL ;R04
- LD (HL),A
- INC HL
- LD (HL),A
- RET
-
-ENVPATH DB "PATH=",0
-
-;;; DEBUG ;;;
-
-;DPRINT
-; PUSH HL
-; CALL PCHARS
-; LD HL,C1310
-; CALL PCHARS
-; POP HL
-; RET
-;
-;C1310 DB 13,10,0
-
-;;;
-; !TODO СДЕЛАТЬ СТРУКТУРОЙ
-PATH_PNT_ARRAY EQU #FC80
-TMP_CURDIR EQU #FD00
-ENVTEMP EQU #FE00
-
-INCTASK LD HL,TASK ;R08
- INC (HL) ;R08
- RET ;R08
-
-DECTASK LD HL,TASK ;R08
- DEC (HL) ;R08
- RET ;R08
-
-EXEC0:
- LD (CMDLINE),HL
- CALL CHECKPATH ;CHECK FOR '\' - SHORT/FULL NAME
- LD HL,(CMDLINE)
- JR C,EXEC0_SHORT
-
-EXEC1:
- LD (CMDLINE),HL
- LD A,#01
- LD (ACCESS),A
- CALL GETWORD
- RET C
- LD HL,TMPNAME
- LD DE,MASKARE
- CALL MASK
- RET C
- CALL TST_EXT
- LD A,3
- RET C
- CALL INCTASK ;R08
-;R08 LD HL,TASK
-;R08 INC (HL)
- CALL OPENEXE
- JP NC,EXEC02 ;R07 CONTINUE EXECUTING PROGRAM
- CALL DECTASK ;R08
- RET ;RET C!
-
-;R07
-; !FIXIT EXEC0_SHORT - копия EXEC1 до CALL DECTASK
-EXEC0_SHORT:
-;SHORT NAME
-; TRY TO FIND IN CURRENT DIRECTORY
-;
-; LD (CMDLINE),HL
- LD A,#01
- LD (ACCESS),A
- CALL GETWORD
- RET C
- LD HL,TMPNAME
- LD DE,MASKARE
- CALL MASK
- RET C
- CALL TST_EXT
- LD A,3
- RET C
- CALL INCTASK
-;R08 LD HL,TASK
-;R08 INC (HL)
- CALL OPENEXE
- JR NC,EXEC02 ;R07 CONTINUE EXECUTING PROGRAM
- CALL DECTASK ;R08
-;R07
-
-;FILE NO FOUND, SEARCHING IN PATH
-
-; GET PATH AND ETC.
-
- LD HL,ENVPATH
- LD DE,ENVTEMP
- LD B,1
- CALL ENVIRON
-
- LD HL,(CMDLINE)
- LD DE,EXEBUFF
-COPYEXN LD A,(HL)
- LDI
- OR A
- JR NZ,COPYEXN
-
- CALL FINDPATH
- LD HL,(CMDLINE)
- JR EXEC1
-
-;EXEC00
-
-EXEC02 LD (EXE_FM),A
- LD HL,EXEBUFF
- LD DE,#0080 ;!#0200(512) ;R02
- LD A,(EXE_FM)
- CALL READ
- JP C,ERREXE
- LD IX,EXEBUFF
- LD HL,(EXEBUFF)
- LD DE,'E'+'X'*256
- AND A
- SBC HL,DE
- LD A,DSS_Error.sys.INVALID_EXE
- SCF
- JP NZ,ERREXE
- LD A,(IX+3)
- OR A
- LD A,DSS_Error.sys.UNKNOWN_EXE
- SCF
- JP NZ,ERREXE
-; LD HL,TASK
-; INC (HL)
-;
-; HERE TO DO: BACK TO CURRDIR
-;
-;R09
- _mRestorStackAfterRestorePath
-;R09
-;
- LD DE,(EXEBUFF.LOADER)
- LD A,E
- OR D
- JP NZ,PRELOAD
- LD HL,#0000
- LD IX,#0000
- LD B,#02
- LD A,(EXE_FM)
- CALL MOVE_FP
- LD DE,(EXEBUFF.LD_ADDR)
- LD A,D
- AND #3F
- LD D,A
- ADD IX,DE
- LD DE,#0000
- ADC HL,DE
- LD A,XH
- SLA A
- RL L
- RL H
- SLA A
- RL L
- RL H
- OR XL
- JR Z,NOINK
- INC HL
-NOINK LD A,H
- OR A
- JP NZ,ERREXE0
- LD B,L
- CALL GETMEM
- JP C,ERREXE0
- LD (EXE_MEM),A
- EXX
- POP DE
- LD HL,#0000
- ADD HL,SP
- LD SP,(EXSTACK)
- PUSH HL
- PUSH DE
- IN A,(SLOT3)
- LD D,A
- IN A,(SLOT2)
- LD E,A
- IN A,(SLOT1)
- PUSH DE
- PUSH AF
- LD (EXSTACK),SP
- LD SP,HL
- EXX
-
-;!FIXIT.НЕ.СОХРАНЯЕТ.DE.перед.вызовом.BIOS..............................;
- LD DE,RAMMAP
- LD BC,#00C4
- LD A,(EXE_MEM)
- RST ToBIOS
- LD (DE),A
- INC DE
- LD BC,#01C4
- LD A,(EXE_MEM)
- RST ToBIOS
- LD (DE),A
- INC DE
- LD BC,#02C4
- LD A,(EXE_MEM)
- RST ToBIOS
- LD (DE),A
- INC DE
- LD BC,#03C4
- LD A,(EXE_MEM)
- RST ToBIOS
- LD (DE),A
-;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^;
- LD HL,(CMDLINE)
- LD DE,SECBUF+1
- CALL SCOPYS
- LD A,#80
- SUB B
- LD (SECBUF),A
- LD SP,EXEBUFF+510 ;R02
- LD A,#FF
- OUT (SLOT1),A
- OUT (SLOT2),A
- OUT (SLOT3),A
- LD HL,(EXEBUFF.LD_ADDR)
- LD DE,RAMMAP
- LD A,H
- AND #C0
- CP #40
- JR Z,FR4000
- CP #80
- JR Z,FR8000
- CP #C0
- JR Z,FRC000
-FR4000 LD A,(DE)
- OUT (SLOT1),A
- INC DE
-FR8000 LD A,(DE)
- OUT (SLOT2),A
- INC DE
-FRC000 LD A,(DE)
- OUT (SLOT3),A
- CALL M_PSP
- LD HL,(EXEBUFF.OFFCOD2)
- LD IX,(EXEBUFF.OFFCOD1)
- LD B,#00
- LD A,(EXE_FM)
- CALL MOVE_FP
- ;R02
- LD SP,#403F ;R02
- ;R02
- LD DE,(EXEBUFF.LD_ADDR)
- LD HL,#0000
- AND A
- SBC HL,DE
- EX DE,HL
- LD HL,(EXEBUFF.LD_ADDR)
- LD A,(EXE_FM)
- CALL READ
- LD A,(EXE_FM)
- CALL CLOSE
-;R09
- _mRestorePath
-;R09
- LD SP,(EXEBUFF.SP_REG)
- LD HL,(EXEBUFF.LD_ADDR)
- LD DE,#0080
- AND A
- SBC HL,DE
- EX DE,HL
- LD XH,D
- LD XL,E
- LD HL,(EXEBUFF.PC_REG)
- LD DE,RETFAR
- PUSH DE
- PUSH HL
- RET
-RETFAR JP LEAVE
-
-TST_EXT LD HL,EXE_EXT
- LD DE,MASKARE+8
- LD B,3
- LD A,(DE)
- CP #20
- JR NZ,TSTE1
- LDI
- LDI
- LDI
- XOR A
- RET
-TSTE1 LD A,(DE)
- CP (HL)
- SCF
- RET NZ
- INC HL
- INC DE
- DJNZ TSTE1
- XOR A
- RET
-
-ERREXE0 LD A,30
-ERREXE PUSH AF
- LD A,(EXE_FM)
- CALL CLOSE
- LD HL,TASK
- DEC (HL)
- POP AF
- RET
-
-PRELOAD EX DE,HL
- LD DE,(EXEBUFF.LD_ADDR)
- LD A,D
- AND #3F
- LD D,A
- ADC HL,DE
- XOR A
- SLA H
- RLA
- SLA H
- RLA
- LD B,A
- LD A,H
- OR L
- JR Z,NOINK2
- INC B
-NOINK2 CALL GETMEM
- JP C,ERREXE0
- LD (EXE_MEM),A
- EXX
- POP DE
- LD HL,#0000
- ADD HL,SP
- LD SP,(EXSTACK)
- PUSH HL
- PUSH DE
- IN A,(SLOT3)
- LD D,A
- IN A,(SLOT2)
- LD E,A
- IN A,(SLOT1)
- PUSH DE
- PUSH AF
- LD (EXSTACK),SP
- LD SP,HL
- EXX
- LD DE,RAMMAP
- LD BC,#00C4
- LD A,(EXE_MEM)
- RST ToBIOS
- LD (DE),A
- INC DE
- LD BC,#01C4
- LD A,(EXE_MEM)
- RST ToBIOS
- LD (DE),A
- INC DE
- LD BC,#02C4
- LD A,(EXE_MEM)
- RST ToBIOS
- LD (DE),A
- INC DE
- LD BC,#03C4
- LD A,(EXE_MEM)
- RST ToBIOS
- LD (DE),A
- LD HL,(CMDLINE)
- LD DE,SECBUF+1
- CALL SCOPYS
- LD A,#80
- SUB B
- LD (SECBUF),A
- LD SP,EXEBUFF+510
- LD A,#FF
- OUT (SLOT1),A
- OUT (SLOT2),A
- OUT (SLOT3),A
- LD HL,(EXEBUFF.LD_ADDR)
- LD DE,RAMMAP
- LD A,H
- AND #C0
- CP #40
- JR Z,FR4000H
- CP #80
- JR Z,FR8000H
- CP #C0
- JR Z,FRC000H
-FR4000H LD A,(DE)
- OUT (SLOT1),A
- INC DE
-FR8000H LD A,(DE)
- OUT (SLOT2),A
- INC DE
-FRC000H LD A,(DE)
- OUT (SLOT3),A
- CALL M_PSP
- LD HL,(EXEBUFF.OFFCOD2)
- LD IX,(EXEBUFF.OFFCOD1)
- LD B,#00
- LD A,(EXE_FM)
- CALL MOVE_FP
- ;R02
- LD SP,#403F ;R02
- ;R02
- LD HL,(EXEBUFF.LD_ADDR)
- LD DE,(EXEBUFF.LOADER)
- LD A,(EXE_FM)
- CALL READ
-;R09
- _mRestorePath
-;R09
- LD SP,(EXEBUFF.SP_REG)
- LD HL,(EXEBUFF.LD_ADDR)
- LD DE,#0080
- AND A
- SBC HL,DE
- EX DE,HL
- LD XH,D
- LD XL,E
- LD HL,(EXEBUFF.PC_REG)
- LD DE,RETFAR
- PUSH DE
- PUSH HL
- RET
-
-LEAVE: LD A,B
- LD (ERLEVEL),A
- CALL LEAVMEM
- LD HL,TASK
- DEC (HL)
- LD SP,(EXSTACK)
- POP AF
- POP HL
- OUT (SLOT1),A
- LD A,L
- OUT (SLOT2),A
- LD A,H
- OUT (SLOT3),A
- POP DE
- POP HL
- LD (EXSTACK),SP
- LD SP,HL
- EX DE,HL
- LD A,(ERLEVEL)
- AND A
- JP (HL)
-
-WAIT LD A,(ERLEVEL)
- AND A
- RET
-
-M_PSP LD HL,(EXEBUFF.LD_ADDR)
- DEC H
- LD D,H
- LD E,L
- INC DE
- LD BC,#00FF
- LD (HL),B
- LDIR
- EX DE,HL
- DEC H
- LD DE,#0080
- ADD HL,DE
- EX DE,HL
- LD XH,D
- LD XL,E
- LD HL,SECBUF
- LD C,(HL)
- INC C
- LDIR
- EX DE,HL ;R06
- LD (HL),B
- LD A,(TASK)
- LD (IX-1),A
- LD A,(EXE_MEM)
- LD (IX-2),A
- LD A,(EXE_FM)
- LD (IX-3),A
-;R05
- INC HL
- LD (HL),B
- INC HL
- CALL CURRDSK
- ADD A,'A'
- LD (HL),A
- INC HL
- LD A,':'
- LD (HL),A
- INC HL
- PUSH HL
- CALL CURRDIR
- POP HL
- XOR A
- LD BC,#0100 ;!FIXIT нет привязки к DIRSPEC.DEPTH
- CPIR ;!FIXIT нет проверки на выход по BC=0
- DEC HL
- DEC HL
- LD A,'\'
- CP (HL)
- INC HL
- JR Z,YP_ESLA
- LD (HL),A
- INC HL
-YP_ESLA EX DE,HL
- LD HL,TMPNAME
-ENMLP1 LD A,(HL)
- LDI
- CP '!'
- JR NC,ENMLP1
- DEC DE
- XOR A
- LD (DE),A
- LD (LAST_PSP_PTR),IX
-;R05
- RET
-
-SCOPYS: LD BC,#80*256 + '!'
-SCOP0 LD A,(HL)
- CP C
- JR C,SCOP1
- INC HL
- DJNZ SCOP0
- XOR A
- LD (DE),A
- LD B,#80
- RET
-SCOP1 LD BC,#8020
-SCOP2 LD A,(HL)
- LD (DE),A
- INC HL
- INC DE
- CP C
- RET C
- DJNZ SCOP2
- RET
-
-
-EXE_EXT DB "E","X","E"
-
-TASK DB #01
-
-RAMMAP DB #00,#00,#00,#00
-
-ERLEVEL DB #00
-
-EXE_FM DB #00
-EXE_MEM DB #00
-
-CMDLINE DW #0000
-
-EXSTACK DW XSTACK
-
-;R11 \\\\\\\\\\\\\\\\\\\\\\\\\\\\
-;;
-; EXEBUFF:
-; DB "EXE"
-; DB #00
-; OFFCOD1 DW #0000
-; OFFCOD2 DW #0000
-; LOADER DW #0000
-; DW #0000
-; DW #0000
-; DW #0000
-; LD_ADDR DW #0000
-; PC_REG DW #0000
-; SP_REG DW #0000
-; BLOCK 512-($-EXEBUFF),0
-; ;(!!!HERE STACK FOR EXEC!!!)
-; BLOCK 255,0
-; XSTACK DB #00
-;R11 ////////////////////////////
-
-;//MODULE: EXECUTE
-;[END]
-
diff --git a/DSS/FAT_X.ASM b/DSS/FAT_X.ASM
deleted file mode 100644
index 2aa6516..0000000
--- a/DSS/FAT_X.ASM
+++ /dev/null
@@ -1,473 +0,0 @@
-
-;[BEGIN]
-;//MODULE: FAT_X
-;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
-;//UPDATE: 24-10-1999 DNS Restore module
-;---------------------------------------------------------------
-;Rev Date Name Description
-;---------------------------------------------------------------
-;R01 10-02-1999 DNS UPGRADE FAT CASH
-;---------------------------------------------------------------
-
-R_CLUST LD HL,#0001
- LD (G_CLUST.num),HL
- RET
-
-G_CLUST:
-.num+1: LD HL,#0001
-G_CLUS1: INC HL
- CALL R_F_FAT
- CP 10
- SCF
- RET Z
- LD A,D
- OR E
- JR NZ,G_CLUS1
- LD (G_CLUST.num),HL
- XOR A
- RET
-
-; HL - CLUSTER
-
-INC_FAT PUSH HL
- CALL G_CLUST
- POP DE
- RET C
- PUSH HL
- PUSH HL
- EX DE,HL
-INC_FA2 CALL R_F_FAT
- EX DE,HL
- JR NC,INC_FA2
- EX DE,HL
- POP DE
- CALL W_T_FAT
- POP HL
- LD DE,(FatBuffer.ENDCLUS)
- CALL W_T_FAT
- CALL WR_FAT
- AND A
- RET
-
-;R01
-
-; HL - CLUSTER
-; DE - (CLUSTER)
-
-R_F_FAT EX DE,HL
- LD HL,(MAX_CLU)
- AND A
- SBC HL,DE
- EX DE,HL
- LD A,10
- RET C
- EXX
- LD A,FATPAGE
- CALL BANK
- EXX
- PUSH HL
- PUSH AF
- LD A,(FatBuffer.FAT_TYP)
- CP "2"
- JP Z,R_F_F12
-R_F_F16 LD A,H
- LD B,A
- AND #0F
- LD H,A
- LD A,B
- RRCA
- RRCA
- RRCA
- RRCA
- AND #0F ; A - BLOCK FAT (1 BLOCK = 8192 BYTES)
- ADD HL,HL ; HL - FAT OFFSET (FROM CASH)
- LD BC,(FATCASH) ; C - BLOCK FAT IN CASH
- CP C
- CALL NZ,RE_FAT ; A <> C - READ NEW BLOCK FAT
- LD DE,FAT
- ADD HL,DE
- LD E,(HL)
- INC HL
- LD D,(HL)
- POP AF
- OUT (SLOT3),A
- LD HL,#FFEF
- XOR A ;DssErr.sys.NO_ERROR
- SBC HL,DE
- POP HL
- ;LD A,DssErr.sys.NO_ERROR
- RET
-
-;R01; HL - CLUSTER
-;R01; DE - (CLUSTER)
-;R01
-;R01R_F_FAT EX DE,HL
-;R01 LD HL,(MAX_CLU)
-;R01 AND A
-;R01 SBC HL,DE
-;R01 EX DE,HL
-;R01 LD A,10
-;R01 RET C
-;R01 PUSH HL
-;R01 LD A,(FAT_TYP)
-;R01 CP "2"
-;R01 JP Z,R_F_F12
-;R01R_F_F16 LD DE,768 ; DE - CLUSTERS IN CASH
-;R01 XOR A
-;R01R_F_00H INC A ; HL - CLUSTER
-;R01 SBC HL,DE
-;R01 JP NC,R_F_00H
-;R01 ADD HL,DE
-;R01 ADD HL,HL ; HL - FAT OFFSET (FROM CASH)
-;R01 DEC A
-;R01 LD BC,(FATCASH) ; A - ELEMENT OF CASH
-;R01 CP C
-;R01 CALL NZ,RE_FAT
-;R01 LD DE,FAT
-;R01 ADD HL,DE
-;R01 LD E,(HL)
-;R01 INC HL
-;R01 LD D,(HL)
-;R01 LD HL,#FFEF
-;R01 AND A
-;R01 SBC HL,DE
-;R01 POP HL
-;R01 LD A,0
-;R01 RET
-;R01
-;R01R_F_F12 LD D,H
-;R01 LD E,L
-;R01 ADD HL,HL
-;R01 ADD HL,DE
-;R01 RR H
-;R01 RR L
-;R01 PUSH AF
-;R01 EX DE,HL
-;R01 LD HL,(B_P_S)
-;R01 LD B,H
-;R01 LD C,L
-;R01 ADD HL,HL
-;R01 ADD HL,BC
-;R01 EX DE,HL
-;R01 XOR A ; DE - SIZE SECTOR * 3
-;R01R_F_00 INC A ; HL - FAT OFFSET
-;R01 SBC HL,DE
-;R01 JP NC,R_F_00
-;R01 ADD HL,DE
-;R01 DEC A
-
-R_F_F12 LD D,H
- LD E,L
- ADD HL,HL
- ADD HL,DE
- RR H
- RR L ;CLUSTER * 1.5
- PUSH AF
- LD A,H
- LD B,A
- AND #1F
- LD H,A
- LD A,B
- RLCA
- RLCA
- RLCA
- AND #07
- LD BC,(FATCASH)
- CP C
- CALL NZ,RE_FAT
- LD DE,FAT
- ADD HL,DE
- POP AF
- LD E,(HL)
- INC HL
- LD D,(HL)
- JR C,R_F_F01
- LD A,D
- AND #0F
- LD D,A
- JR R_F_F02
-
-R_F_F01 LD A,E
- AND #F0
- LD E,A
- RR D
- RR E
- RR D
- RR E
- RR D
- RR E
- RR D
- RR E
-R_F_F02 POP AF
- OUT (SLOT3),A
- LD HL,#0FEF
- XOR A ; обнуляем CF и устанавливаем код ошибки = нулю
- SBC HL,DE
- POP HL
- RET
-
-; HL - CLUSTER
-; DE - (CLUSTER)
-
-W_T_FAT PUSH DE
- EX DE,HL
- LD HL,(MAX_CLU)
- AND A
- SBC HL,DE
- EX DE,HL
- POP DE
- LD A,10
- RET C
- EXX
- LD A,FATPAGE
- CALL BANK
- EXX
- PUSH HL
- PUSH AF
- LD A,1
- LD (FATCASH+1),A
- LD A,(FatBuffer.FAT_TYP)
- CP "2"
- JP Z,W_T_F12
-W_T_F16 PUSH DE
- LD A,H
- LD B,A
- AND #0F
- LD H,A
- LD A,B
- RRCA
- RRCA
- RRCA
- RRCA
- AND #0F ; A - BLOCK FAT (1 BLOCK = 8192 BYTES)
- ADD HL,HL ; HL - FAT OFFSET (FROM CASH)
- LD BC,(FATCASH) ; C - BLOCK FAT IN CASH
- CP C
- CALL NZ,RE_FAT ; A <> C - READ NEW BLOCK FAT
- LD DE,FAT
- ADD HL,DE
- POP DE
- LD (HL),E
- INC HL
- LD (HL),D
- POP AF
- POP HL
- OUT (SLOT3),A
- XOR A
- RET
-
-W_T_F12 PUSH DE
- LD D,H
- LD E,L
- ADD HL,HL
- ADD HL,DE
- RR H
- RR L ;CLUSTER * 1.5
- PUSH AF
- LD A,H
- LD B,A
- AND #1F
- LD H,A
- LD A,B
- RLCA
- RLCA
- RLCA
- AND #07
- LD BC,(FATCASH)
- CP C
- CALL NZ,RE_FAT
- LD DE,FAT
- ADD HL,DE
- POP AF
- POP DE
- JP C,W_T_F01
- LD (HL),E
- INC HL
- LD A,(HL)
- AND #F0
- OR D
- LD (HL),A
- POP AF
- POP HL
- OUT (SLOT3),A
- AND A
- RET
-
-W_T_F01 SLA E
- RL D
- RL E
- RL D
- RL E
- RL D
- RL E
- RL D
- LD A,(HL)
- AND #0F
- OR E
- LD (HL),A
- INC HL
- LD (HL),D
- POP AF
- POP HL
- OUT (SLOT3),A
- AND A
- RET
-
-;R01
-; A - NEW FAT BLOCK
-
-RE_FAT PUSH HL
- PUSH AF
- LD A,(FATCASH+1)
- OR A
- CALL NZ,WR_FAT_
- POP AF
- LD L,A
- LD H,0
- LD (FATCASH),HL
- ADD HL,HL
- ADD HL,HL
- ADD HL,HL
- ADD HL,HL ;FAT BLOCK * 16 = SECTOR OF FAT
- LD DE,(FatBuffer.FAT_FRM)
- ADD HL,DE
- EX DE,HL
- LD IX,0
- ADD IX,DE
- LD HL,0 ;HL:IX - SECTOR FAT FOR READING
- LD DE,FAT ; DE - FAT ADDRESS
- LD A,(FatBuffer.DRIVE)
- ; LD B,16
- ; LD C,5
- LD BC,16*256 + 5 ;рег B: 16 * 512 = 8192 (CASH SIZE)
- RST #18
- POP HL
- RET
-
-WR_FAT EXX
- LD A,FATPAGE
- CALL BANK
- EXX
- PUSH AF
- CALL WR_FAT_
- POP AF
- OUT (SLOT3),A
- RET
-
-WR_FAT_ LD HL,(FATCASH)
- LD H,0
- LD (FATCASH),HL
- ADD HL,HL
- ADD HL,HL
- ADD HL,HL
- ADD HL,HL ;FAT BLOCK * 16 = SECTOR OF FAT
-
- PUSH HL
- LD B,H
- LD C,L ;BC - BLOCK OF FAT
- LD DE,16
- ADD HL,DE ;+ SIZE CASH (16 SECTORS)
-
- LD DE,(BootSector.S_P_F)
- LD A,16
- AND A
- SBC HL,DE
- JR C,WALLFAT
- EX DE,HL
- LD HL,16
-; AND A ;тут точно CF не взведён
- SBC HL,DE
- JP C,FATERR
- LD A,L
-WALLFAT LD H,B
- LD L,C
- LD DE,(FatBuffer.FAT_FRM)
- ADD HL,DE
- EX DE,HL
- LD IX,0
- ADD IX,DE
- LD HL,0 ;HL:IX - SECTOR OF FAT FOR SAVE
- LD DE,FAT
- LD B,A
- LD C,6
- LD A,(FatBuffer.DRIVE)
- PUSH BC
- RST #18
- POP BC
- POP HL
- LD DE,(FatBuffer.FAT2_XX)
- ADD HL,DE
- EX DE,HL
- LD IX,0
- ADD IX,DE
- LD DE,FAT
- LD HL,0
- LD A,(FatBuffer.DRIVE)
- LD C,6
- RST #18
- RET
-;R01
-
-;R01WR_FAT LD HL,(FATCASH)
-;R01 LD H,0
-;R01 LD (FATCASH),HL
-;R01 LD E,L
-;R01 LD D,H
-;R01 ADD HL,HL
-;R01 ADD HL,DE
-;R01 PUSH HL
-;R01 LD B,H
-;R01 LD C,L
-;R01 INC HL
-;R01 INC HL
-;R01 INC HL
-;R01 LD DE,(S_P_F)
-;R01 LD A,3
-;R01 AND A
-;R01 SBC HL,DE
-;R01 JP C,WR_FAT1
-;R01 EX DE,HL
-;R01 LD HL,3
-;R01 AND A
-;R01 SBC HL,DE
-;R01 JP C,FATERR
-;R01 LD A,L
-;R01WR_FAT1 LD H,B
-;R01 LD L,C
-;R01 LD DE,(FAT_FRM)
-;R01 ADD HL,DE
-;R01 EX DE,HL
-;R01 LD IX,0
-;R01 ADD IX,DE
-;R01 LD DE,FAT
-;R01 LD HL,0
-;R01 LD B,A
-;R01 LD C,6
-;R01 LD A,(DRIVE)
-;R01 PUSH BC
-;R01 RST #18
-;R01 POP BC
-;R01 POP HL
-;R01 LD DE,(FAT2_XX)
-;R01 ADD HL,DE
-;R01 EX DE,HL
-;R01 LD IX,0
-;R01 ADD IX,DE
-;R01 LD DE,FAT
-;R01 LD HL,0
-;R01 LD A,(DRIVE)
-;R01 LD C,6
-;R01 RST #18
-;R01 RET
-
-FATERR: POP HL
-; SCF
- RET
-
-FATCASH DW #0000
-MAX_CLU DW #0FF0
-
-;//MODULE: FAT_X
-;[END]
-
-
diff --git a/DSS/FDD_DRV0.ASM b/DSS/FDD_DRV0.ASM
deleted file mode 100644
index 7bebc15..0000000
--- a/DSS/FDD_DRV0.ASM
+++ /dev/null
@@ -1,366 +0,0 @@
-
-; Disk Driver Specification ver. 2.00
-;[]===========================================================[]
-;Procedure : Initialization
-;
-;Function : Initialization device(s)
-;
-;Input : C = 00h
-; IX - Environment
-;Output : A = Amount drive support
-; HL = Size driver
-;[]===========================================================[]
-;[]===========================================================[]
-;Procedure : Open
-;
-;Function : Open disk
-;
-;Input : C = 01h
-; A - Drive
-;Output : None
-;
-;[]===========================================================[]
-;[]===========================================================[]
-;Procedure : Close
-;
-;Function : Close disk
-;
-;Input : C = 02h
-; A - Drive
-;Output : None
-;
-;[]===========================================================[]
-;[]===========================================================[]
-;Procedure : Media check
-;
-;Function : Checking change line
-;
-;Input : C = 03h
-; A - Drive
-;Output : A = 00h disk no changed
-; A = 0FFh disk changed
-;
-;[]===========================================================[]
-;[]===========================================================[]
-;Procedure : Get BPB
-;
-;Function : Get Block Parameters BIOS
-;
-;Input : C = 04h
-; DE - Address
-;Output : None
-;
-;[]===========================================================[]
-;[]===========================================================[]
-;Procedure : Input
-;
-;Function : Input from disk
-;
-;Input : C = 05h
-; HL:IX - Logical Block (sector)
-; DE - Address
-; B - Sector count
-;Output : None
-;
-;[]===========================================================[]
-;[]===========================================================[]
-;Procedure : Output
-;
-;Function : Output to disk
-;
-;Input : C = 06h
-; HL:IX - Logical Block (sector)
-; DE - Address
-; B - Sector count
-;Output : None
-;
-;[]===========================================================[]
-;[]===========================================================[]
-;Procedure : Removable
-;
-;Function : Checking change line
-;
-;Input : C = 07h
-; A - Drive
-;Output : A = 00h Removable
-; A = FFh Nonremovable
-;
-;[]===========================================================[]
-;[]===========================================================[]
-;Procedure : Generic IOCTL
-;
-;Function : Generic Input Output Control
-;
-;Input : C = 08h
-; B - Subcommand
-; DE = 55AAh Magic Number
-; Subcommand
-;----------------------
-; 00h - Get Device Parameters
-; 01h - Read track
-; 02h - Test track
-; 80h - Set Device Parameters
-; 81h - Write track
-; 82h - Format track
-;Output :
-;
-;[]===========================================================[]
-;
-; Errors:
-; 0 (00h) - NO ERRORS
-; 1 (01h) - BAD COMMAND
-; 2 (02h) - BAD DRIVE NUMBER
-; 3 (03h) - UNKNOW FORMAT
-; 4 (04h) - NOT READY
-; 5 (05h) - SEEK ERROR
-; 6 (06h) - SECTOR NOT FOUND
-; 7 (07h) - CRC ERROR
-; 8 (08h) - WRITE PROTECT
-; 9 (09h) - READ ERROR
-; 10 (0Ah) - WRITE ERROR
-; 11 (0Bh) - FAILURE
-; 12 (0Ch) - BUSY (DEVICE OPENED)
-; 13 (0Dh) - RESERVED
-
-R_COM EQU #0F ;Command/Status
-R_TRK EQU #3F ;Track
-R_SEC EQU #5F ;Sector
-R_DAT EQU #7F ;Data
-R_DSK EQU #FF ;Drive Control
-
-COM_B EQU #1B
-
-FDDRIVE:
- INC C
- DEC C
- JP Z,.INIT ;#00
- DEC C
- JP Z,.RESE ;#01
- DEC C
- JP Z,.STAT ;#02
- DEC C
- JP Z,.CHEK ;#03
- DEC C
- JP Z,.GBPB ;#04
- DEC C
- JP Z,.READD ;#05
- DEC C
- JP Z,.WRITED ;#06
- DEC C
- JP Z,.REMOV_F ;#07
- DEC C
- JP Z,.IOCTL_F ;#08
- DEC C
- JP Z,.RESRV_F ;#09
-.RESRV_F:
- LD A,DSS_Error.drv.INVALID_COMMAND
- SCF
- RET
-
-;Commands for restart #18
-.INIT: LD A,2 ;количество FDD в компе ;!FIXIT а если отключу в БИОС?
- 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
-
-;==============================================
-
-
-
diff --git a/DSS/FS/CDFS.ASM b/DSS/FS/CDFS.ASM
new file mode 100644
index 0000000..bd1cc34
--- /dev/null
+++ b/DSS/FS/CDFS.ASM
@@ -0,0 +1,13 @@
+; INITDISK - инициализация буквы диска - перенести кусок в RD_BPB
+; LOADDIR - загрузка с CDFS директории и адаптация под FAT
+;
+/*
+Сделать проверку на фат:
+CHECK_ROOT_CLUSTER
+
+
+-= RST ToDSS.FS =-
+RD_BPB - shared_fs.asm - брать сигнатуру #AA55 или из CDFS.RD_BPB и далее уже RST_FS
+LOADDIR
+
+*/
\ No newline at end of file
diff --git a/DSS/FS/FAT.asm b/DSS/FS/FAT.asm
new file mode 100644
index 0000000..cba5fe8
--- /dev/null
+++ b/DSS/FS/FAT.asm
@@ -0,0 +1,2780 @@
+;[BEGIN]
+;//MODULE: FAT
+;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
+;//UPDATE: 24-10-1999 DNS Restore module
+;---------------------------------------------------------------
+;Rev Date Name Description
+;---------------------------------------------------------------
+;R08 14-11-2002 DNS IMPROVE BPB-FUNCTION
+;R07 17-12-1999 DNS BUG FIX SIGNATURE #55AA AT 510 OFFSET
+;RY01 16-11-1999 DNS ERROR READING FAT CHAIN
+;RX01 10-02-1999 DNS UPGRADE FAT CASH
+;---------------------------------------------------------------
+; [ ] RST_FS
+;----------------------------------------------------------------------;
+FAT_MODULE_START EQU $
+
+
+SET_FSInfo: LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE)
+ CP FAT_TYPE.x32
+ RET NZ
+ ;
+ LD A,(CORE_BUFFERS.FS_Buffer.UPD_FSINFO)
+ OR A
+ RET Z
+ ;
+ ; Делаем FSInfo сектор
+ ; чистим сектор
+ LD HL,CORE_BUFFERS.SECTOR_BUFFER
+ LD DE,CORE_BUFFERS.SECTOR_BUFFER+1
+ LD (HL),0
+ LD BC,512 - 1 ;!HARDCODE размер сектора
+ LDIR
+ ; LEAD_SIGNATURE
+ LD HL,#5252
+ LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.LEAD_SIGNATURE),HL
+ LD HL,#4161
+ LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.LEAD_SIGNATURE + 2),HL
+ ; DATA_SIGNATURE
+ LD HL,#7272
+ LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.DATA_SIGNATURE),HL
+ LD HL,#6141
+ LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.DATA_SIGNATURE + 2),HL
+ ; SECTOR_SIGNATURE
+ LD HL,#AA55
+ LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.SECTOR_SIGNATURE),HL
+ ; FREE_CLUSTERS_COUNT
+ LD HL,(CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_L)
+ LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT),HL
+ LD HL,(CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_H)
+ LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT+2),HL
+ ; FIRST_FREE_CLUSTER
+ LD HL,(G_CLUST.low)
+ LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER),HL
+ LD HL,(G_CLUST.high)
+ LD (CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2),HL
+ ; Пишем его на винт
+ XOR A
+ LD (CORE_BUFFERS.FS_Buffer.UPD_FSINFO),A
+ JR WRITE_FSinfo
+; ;
+; Прочитать BPB в SECTOR_BUFFER
+READ_BPB: LD C,Dss.DRV.GetBPB
+ JR RW_SECTOR
+; Записать FSinfo из SECTOR_BUFFER
+WRITE_FSinfo: LD IX,(CORE_BUFFERS.FS_Buffer.FSINFO_Sector)
+ LD HL,0
+ ;JR WRITE_SECTOR
+; Записать сектор из SECTOR_BUFFER
+; Вход: HL:IX = Logical Block (sector)
+WRITE_SECTOR: LD BC,1*256 + Dss.DRV.Write
+ JR RW_SECTOR
+; Прочитать FSinfo в SECTOR_BUFFER
+READ_FSinfo: LD IX,(CORE_BUFFERS.FS_Buffer.FSINFO_Sector)
+ LD HL,0
+; Прочитать сектор в SECTOR_BUFFER
+; Вход: HL:IX = Logical Block (sector)
+READ_SECTOR: LD BC,1*256 + Dss.DRV.Read
+ ;
+RW_SECTOR: IN A,(SLOT3)
+ PUSH AF
+ IN A,(SLOT0)
+ OUT (SLOT3),A
+ ;
+ LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
+ LD DE,CORE_BUFFERS.SECTOR_BUFFER+#C000
+ RST ToDSS.DRV
+ EX AF,AF'
+ ;
+ POP AF
+ OUT (SLOT3),A
+ EX AF,AF'
+ RET
+;
+
+; [ ] удаление записи LFN
+;
+; вход: IX = текущая запись в странице с каталогом FAT для которой
+; надо удалить записи LFS
+DELETE_LFN_RECORDS:
+ PUSH IX
+ LD A,XH
+ AND #C0
+ SUB 1
+ LD C,A
+ ; В регистре C маска для определения выхода за пределы страницы
+ ;
+.find_LFN: LD DE, -(FAT_DIRECTORY_RECORD)
+ LD A,FAT_ATTR.LFS_Entry
+ ;
+.loop: ADD IX,DE
+ LD A,XH
+ CP C
+ JR Z,.beyond_boundaries
+ ;
+ LD A,FAT_ATTR.LFS_Entry
+ CP (IX+FAT_DIRECTORY_RECORD.ATTRIBUT)
+ JR NZ,.exit
+ LD (IX+FAT_DIRECTORY_RECORD.NAME),#E5
+ JR .loop
+ ;
+.exit: AND A
+.beyond_boundaries: ; !TODO подгрузка другой части каталога. пока заглушка
+ POP IX
+ RET
+;----------------------------------------------------------------------;
+
+
+; Поиск записи каталога в списке каталога
+;
+; вход: a = атрибут записи
+; выход: de = индекс записи в списке каталога
+; (HANDBUF) = file's direcory record
+; CF - каталог не найден
+SEARCH:
+.Dir: ;LD A,FAT_ATTR.DIRECTORY
+ LD A,FAT_ATTR.HiddenSysDir
+ CALL .Custom
+ RET NC
+ CP DSS_Error.sys.PATH_NOT_FOUND + 1
+ RET C
+ ;
+ SCF
+ LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR
+ RET
+ ;
+.File: LD A,FAT_ATTR.NoDIRnoVolID
+.Custom: EX AF,AF' ; A = 76ADLSHR
+ SET_PAGE_X DIRPAGE
+ ;PUSH AF
+ EX AF,AF'
+ ;
+ CPL
+ LD C,A
+ LD IX,DIRPAGE.buffer
+ ;!TEST 9/11/23 record index
+ ; оптимизация для индекса записи в списке каталога.
+ ; Понадобится вернуть для перебора каталога > #4000 байт
+ ; EXX
+ ; LD DE,0
+ ; EXX
+ ;
+.loop: LD A,(IX+FAT_DIRECTORY_RECORD.NAME)
+ OR A
+ JR Z,.error_file_not_found
+ CP #E5 ;!HARDCODE #E5 - запись в директории свободна, так как файл/директория были удалены
+ JR Z,.next_record
+ LD A,(IX+FAT_DIRECTORY_RECORD.ATTRIBUT)
+ LD D,A
+ AND C
+ JR NZ,.next_record
+ ;
+ LD A,C
+ INC A
+ JR NZ,.found_attr
+ ; A=0
+ OR D
+ JR NZ,.next_record
+ ;
+.found_attr: LD HL,MASKARE
+ LD D,XH
+ LD E,XL
+ LD B,11
+ EX DE,HL
+.loop_compare: LD A,(DE)
+ CP '?'
+ JR Z,.next_char
+ CP (HL)
+ JR NZ,.next_record
+ ;
+.next_char: INC HL
+ INC DE
+ DJNZ .loop_compare
+ ;
+ LD D,XH
+ LD E,XL
+ ;!TEST 9/11/23 record index
+ ; EXX
+ ; PUSH DE
+ ; EXX
+ PUSH IX
+ ;
+ LD HL,HANDBUF
+ EX DE,HL
+ LD BC,HANDBUF.SIZE
+ LDIR
+ ;!TEST 9/11/23 record index
+ POP DE
+ ;
+ EX AF,AF'
+ OUT (SLOT3),A
+ EX AF,AF'
+ AND A
+ RET
+ ;
+.next_record: LD DE,FAT_DIRECTORY_RECORD
+ ;!TEST 9/11/23 record index
+ ; EXX
+ ; INC DE
+ ; EXX
+ ;
+ ADD IX,DE
+ JR NC,.loop
+.error_too_many_files:
+ EX AF,AF'
+ OUT (SLOT3),A
+ LD A,DSS_Error.sys.TOO_MANY_FILES_IN_DIR
+ SCF
+ RET
+ ;
+.error_file_not_found:
+ EX AF,AF'
+ OUT (SLOT3),A
+ LD A,DSS_Error.sys.FILE_NOT_FOUND
+ SCF
+ RET
+;----------------------------------------------------------------------;
+
+;
+;!TODO ?
+;GHANDLE:
+; PUSH DE
+; PUSH HL
+; PUSH IX
+; CALL TESTDSK
+; JP C,G_HAND1
+; CALL LOADDIR
+; POP DE
+; LD HL,DIR
+; LD BC,FAT_DIRECTORY_RECORD
+;G_HAND2:
+; LD A,D
+; OR E
+; JP Z,G_HAND3
+; ADD HL,BC
+; DEC DE
+; JP G_HAND2
+;G_HAND3:
+; EXX
+; POP DE
+; EXX
+;G_HAND4:
+; EX DE,HL
+; LD A,DIRPAGE
+; CALL BANK
+; EX DE,HL
+; LD DE,HANDTA
+;
+; DUP 32
+; LDI
+; EDUP
+;
+; EXX
+; OUT (SLOT3),A
+; LD HL,HANDTA
+;
+; DUP 32
+; LDI
+; EDUP
+;
+; EXX
+; POP BC
+; DEC BC
+; LD A,B
+; OR C
+; RET Z
+; PUSH BC
+; JP G_HAND4
+;G_HAND1 POP IX
+; POP HL
+; POP DE
+; RET
+;HANDTA BLOCK 32,0
+;
+
+;----------------------------------------------------------------------;
+; FIND "MASKAREA" IN DIRECTORY
+; [x] fat32 ;!TEST
+; выход: IY:DE - cluster number
+FINDDIR:
+ SET_PAGE_X DIRPAGE
+ ;
+ PUSH AF
+ LD IX,DIRPAGE.buffer
+.big_loop:
+ LD A,(IX + FAT_DIRECTORY_RECORD.NAME)
+ OR A
+ JR Z,.error
+ CP #E5
+ JR Z,.next_step
+ LD A,(IX + FAT_DIRECTORY_RECORD.ATTRIBUT)
+ AND FAT_ATTR.DIRECTORY
+ JR Z,.next_step
+ LD HL,MASKARE
+ LD D,XH
+ LD E,XL
+ EX DE,HL
+ LD B,11 ;!HARDCODE
+.loop: LD A,(DE)
+ CP "?"
+ JR Z,.compared
+ CP (HL)
+ JR NZ,.next_step
+.compared:
+ INC HL
+ INC DE
+ DJNZ .loop
+ ;
+ LD A,(IX + FAT_DIRECTORY_RECORD.NAME)
+ CP "."
+ JP NZ,.ADDSPEC
+ LD A,(IX + FAT_DIRECTORY_RECORD.NAME + 1)
+ CP "."
+ JP NZ,.IT_DIR
+ LD HL,CORE_BUFFERS.WorkDirectory
+ LD D,H
+ LD E,L
+ INC HL
+ LD BC,CORE_BUFFERS.WorkDirectory.DEPTH
+ XOR A
+ CPIR
+ JP PO,.error ;[x] 20/11/23 проверка на выход за границы
+ DEC HL ;R009
+ DEC HL
+ LD BC,CORE_BUFFERS.WorkDirectory.DEPTH
+ LD A,'\'
+ CPDR
+ INC HL
+ EX DE,HL
+ ; CF = 0
+ SBC HL,DE
+ EX DE,HL
+ JR NZ,.MM3
+ INC HL
+.MM3: LD (HL),0
+ JP .IT_DIR
+ ;
+.next_step:
+ LD BC,FAT_DIRECTORY_RECORD
+ ADD IX,BC
+ JR NC,.big_loop
+ ;
+.error: POP AF
+ OUT (SLOT3),A
+ LD A,DSS_Error.sys.PATH_NOT_FOUND
+ SCF
+ RET
+ ;
+.ADDSPEC:
+ LD HL,CORE_BUFFERS.WorkDirectory+1
+ LD BC,CORE_BUFFERS.WorkDirectory.DEPTH-1
+ CALL .CHECK_SLASH
+ JR C,.error
+ ;R011
+ LD A,B
+ AND A
+ JR NZ,.nxt
+ LD A,C
+ CP 8+1+3 ;!HARDCODE имя каталога + точка + расширение
+ JR C,.error
+.nxt: ;
+ LD E,XL
+ LD D,XH
+ ; [x] оптимизация по размеру
+ EX DE,HL
+ CALL GetName
+ EX DE,HL
+ ;
+
+; LD BC,256*8 + ' ' ;!HARDCODE
+; .MM1: LD A,(DE)
+; INC DE
+; CP C
+; JR Z,.MM2
+; LD (HL),A
+; INC HL
+; .MM2 DJNZ .MM1 ;x42-40 50-55
+; LD A,(DE)
+; INC DE
+; CP C
+; JR Z,.MM3
+; LD (HL),"."
+; INC HL
+; LD (HL),A
+; INC HL
+; LD A,(DE)
+; INC DE
+; CP C
+; JR Z,.MM3
+; LD (HL),A
+; INC HL
+; LD A,(DE)
+; CP C
+; JR Z,.MM3
+; LD (HL),A
+; .MM2_5: INC HL
+; .MM3: LD (HL),0
+; ; JP IT_DIR
+ ;
+.IT_DIR:; fat32
+ LD E,(IX + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H)
+ LD D,(IX + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1)
+ LD YH,D
+ LD YL,E
+ LD E,(IX + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L)
+ LD D,(IX + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1)
+ POP AF
+ OUT (SLOT3),A
+ AND A
+ RET
+ ;
+.CHECK_SLASH:
+ XOR A
+ CPIR
+ ;[x] 20/11/23 проверка на выход за границы
+ SCF
+ RET PO
+ ;
+ DEC HL
+ DEC HL
+ LD A,'\' ; #5C
+ CP (HL)
+ INC HL
+ RET Z
+ LD (HL),A
+ INC HL
+ XOR A ; сброс CF заодно
+ LD (HL),A
+ RET
+;----------------------------------------------------------------------;
+
+CHECK_ROOT_CLUSTER:
+ EX DE,HL
+ LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L) ;R005
+ LD A,L
+ OR H
+ LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H)
+ OR L
+ OR H
+ EX DE,HL
+ RET
+
+;----------------------------------------------------------------------;
+; вход: HL - имя директории
+; [x] fat32 ;!TEST
+
+OPENDIR: LD IY,CORE_BUFFERS.FM_BUF
+ LD A,(HL)
+ OR A
+ JR NZ,.SUBDIR
+ ;
+.REROOT: LD DE,0 ; !FIXIT ; [ ] CDFS - брать первый кластер из переменной
+ LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),DE
+ LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),DE
+ CALL LOADDIR
+ ; CF=0
+ LD HL,CORE_BUFFERS.WorkDirectory
+ LD (HL),'\'
+ INC HL
+ LD (HL),#00
+ ;AND A
+ RET
+ ;
+.SUBDIR: CP "."
+ JR NZ,.SUBDIR2
+ ; fat32
+ CALL CHECK_ROOT_CLUSTER
+ JR NZ,.no_root ;R005
+ ; "cd ." or "cd .."
+ ;R005
+ INC HL
+ LD A,(HL)
+ OR A
+ DEC HL
+ JR Z,.REROOT
+ ;
+.no_root: EXX
+ LD HL,MASKARE
+ LD DE,MASKARE+1
+ LD BC,10 ;!HARDCODE
+ LD (HL),' '
+ LDIR
+ EXX
+ LD DE,MASKARE
+.loop: LDI
+ LD A,(HL)
+ OR A
+ JR NZ,.loop
+ JR .SUBDIR3
+ ;
+.SUBDIR2: CALL MASK.name
+ RET C
+ ; fat32
+.SUBDIR3: CALL FINDDIR
+ RET C
+ EX DE,HL
+ LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL ; fat32
+ LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),IY ; fat32
+ LD HL,#4000 ;!HARDCODE
+ LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),HL
+;-------------; EX DE,HL
+; JP LOADDIR
+
+; Прочитать список каталога
+; [x] fat32 ;!TEST
+LOADDIR: ;!TODO optimize
+ CALL LOAD_SAVE_DIR_PREPARE
+ PUSH AF
+ EX AF,AF'
+ JR NZ,.read_dir
+ LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE)
+ CP FAT_TYPE.x32
+ JR NZ,.LoadRootDir
+ ; fat32
+ LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_L)
+ LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL
+ LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_H)
+ LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL
+
+ ;LD HL,(CORE_BUFFERS.FS_Buffer.BytesPerCluster) ; !FIXIT вычитывать полностью каталог
+ LD HL,#4000 ; размер директории ;!HARDCODE
+ LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),HL
+ ;
+.read_dir: LD HL,DIRPAGE.buffer ; куда
+ LD DE,#4000 ; сколько
+ XOR A ; дескриптор
+ CALL READ ; чтение из файла
+ LD (SAVEDIR.DIRSIZE),DE ; число прочит. байтов
+ POP AF
+ OUT (SLOT3),A
+ RET
+ ;
+.LoadRootDir: LD HL,(CORE_BUFFERS.FS_Buffer.RootDirFirstSector_H) ;!TODO возможно, хватит LD HL,0
+ LD IX,(CORE_BUFFERS.FS_Buffer.RootDirFirstSector_L) ; номер лог. сектора
+ LD A,(CORE_BUFFERS.FS_Buffer.DirSizeInSectors)
+ LD B,32 ; !HARDCODE sector size 512. 16384/(sector 512). размер root-каталога
+ CP B
+ JR NC,.RTD1
+ LD B,A ; число секторов
+.RTD1: PUSH AF ; 21/04/2025 fix мусор в странице каталога, если каталог меньше страницы
+ LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ; номер диска
+ LD DE,DIRPAGE.buffer ; буфер
+ LD C,Dss.DRV.Read ; чтение секторов
+ RST ToDSS.DRV
+ ; !FIXIT нет проверки на ошибку
+ ; 21/04/2025 fix мусор в странице каталога, если каталог меньше страницы
+ POP AF
+ JR NC,.exit
+ XOR A
+ LD (DE),A
+ ;
+.exit: POP AF
+ OUT (SLOT3),A
+ RET
+;----------------------------------------------------------------------;
+
+
+;!TODO FAT procedures
+;----------------------------------------------------------------------;
+
+LOAD_SAVE_DIR_PREPARE:
+ ;!TODO optimize
+ XOR A ; FILE MANIPULATOR = 0
+ LD H,A
+ LD L,A
+ LD IX,0
+ LD B,A ; от начала файла
+ CALL MOVE_FP
+ ;
+ SET_PAGE_X DIRPAGE
+ AND A
+ EX AF,AF'
+ ;
+ LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
+ LD (IY+_sFM.DRIVE),A
+ ;!FIXIT переделать на работу без IY
+ LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L)
+ OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1)
+ OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H)
+ OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1)
+ ;
+ EX AF,AF'
+ RET
+
+;----------------------------------------------------------------------;
+
+; скопировать запись в список диска (каталога) de ix iy
+; и сбросить кеш каталога на диск
+; вход: (HANDBUF) - запись каталога
+WRT_HND:
+ SET_PAGE_X DIRPAGE
+ EX AF,AF'
+ LD HL,DIRPAGE.buffer
+ ;!TEST 9/11/23 record index
+ ; EXX
+ ; LD DE,0
+ ; EXX
+ ;
+ LD BC,FAT_DIRECTORY_RECORD
+.loop: ;LD A,(IX+00)
+ LD A,(HL)
+ OR A
+ JR Z,.WRT_HN2
+ CP #E5
+ JR Z,.WRT_HN2
+ ;ADD IX,BC
+ ADD HL,BC
+ JR NC,.loop ;!FIXIT количество записей каталога = страница
+ ;
+ EX AF,AF'
+ OUT (SLOT3),A
+ LD A,DSS_Error.sys.ROOT_OVERFLOW
+ SCF
+ RET
+ ;
+.WRT_HN2: ;LD D,XH
+ ;LD E,XL
+ EX DE,HL
+ LD HL,HANDBUF
+ LD BC,HANDBUF.SIZE
+ LDIR
+ EX AF,AF'
+ OUT (SLOT3),A
+ LD HL,DIRPAGE.buffer
+ LD BC,(SAVEDIR.DIRSIZE)
+ DEC BC
+ ADD HL,BC
+ AND A
+ SBC HL,DE
+ JR NC,SAVEDIR
+ LD HL,(SAVEDIR.DIRSIZE)
+ LD BC,(CORE_BUFFERS.FS_Buffer.BytesPerCluster)
+ ADD HL,BC
+ LD (SAVEDIR.DIRSIZE),HL
+ AND A
+ ;JP SAVEDIR
+;----------------------------------------------------------------------;
+; Сбросить кеш каталога на диск.
+; вход: iy=структура дескриптора
+; [x] fat32 ;!TEST
+SAVEDIR: ;!TODO optimize
+ CALL LOAD_SAVE_DIR_PREPARE
+ PUSH AF
+ EX AF,AF'
+ JR NZ,.save_dir
+ ;
+ LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE)
+ CP FAT_TYPE.x32
+ JR NZ,.SaveRootDir
+ ; fat32
+ LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_L)
+ LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL
+ LD HL,(CORE_BUFFERS.FS_Buffer.RootDirStartCluster_H)
+ LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL
+ ;
+.save_dir: LD HL,DIRPAGE.buffer
+ ; размер списка каталога size_cash_directory
+ ;!FIXIT если она нужна, то проверить на баги (например, размер дирректории меньше при открытии и больше после правок)
+ ; когда будет чтение кусками каталога в кэш, тут ещё счётчик прикрутить
+.DIRSIZE+1: LD DE,0
+ XOR A
+ CALL WRITE
+ POP AF
+ OUT (SLOT3),A
+ RET
+ ;
+.SaveRootDir: LD HL,(CORE_BUFFERS.FS_Buffer.RootDirFirstSector_H) ;!TODO возможно, хватит LD HL,0
+ LD IX,(CORE_BUFFERS.FS_Buffer.RootDirFirstSector_L)
+ LD A,(CORE_BUFFERS.FS_Buffer.DirSizeInSectors)
+ LD B,32 ;!HARDCODE sector size 512, Root Dir max size in sectors
+ SUB B
+ JR NC,.RTD1S
+ ADD A,B
+ LD B,A
+.RTD1S: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
+ LD DE,DIRPAGE.buffer
+ LD C,Dss.DRV.Write
+ RST ToDSS.DRV
+ POP AF
+ OUT (SLOT3),A
+ RET
+;----------------------------------------------------------------------;
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+; [x] fat32
+; RD_BPB: CALL READ_BPB
+; RET C
+; ;
+; LD DE,#AA55 ; сигнатура ;R05
+; LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07
+; ;[ ] CDFS
+; ;R05
+; AND A
+; SBC HL,DE
+; JP NZ,DOS_X_Error.UnknownBPB
+ ;
+ ; ;R08 ; [x] fat32
+ ; LD HL,CORE_BUFFERS.SECTOR_BUFFER
+ ; LD DE,CORE_BUFFERS.BootSector
+ ; LD BC,_sBOOT_SECTOR_PARAMS_FAT32 ; size
+ ; LDIR
+ ;
+FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE)
+ CP #F0
+ JP C,RD_BPB.UnknownBPB
+ ;
+ XOR A
+ LD (.UsesVarsFAT32),A
+ ;
+ LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BytesPerSector)
+ LD (CORE_BUFFERS.FS_Buffer.BytesPerSector),HL
+ LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerCluster)
+ LD (CORE_BUFFERS.FS_Buffer.SectorsPerCluster),A
+ ; calc. first sector FAT
+ LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RESERVED_SECTORS)
+ LD (CORE_BUFFERS.FS_Buffer.FAT1_SEC_L),HL ; low word first sector FAT #1
+ LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_L),HL ; low word first sector FAT #2
+ ;[ ] fat32
+ XOR A
+ LD B,A
+ LD C,A
+ LD (CORE_BUFFERS.FS_Buffer.FAT1_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32
+ LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32
+ LD (CORE_BUFFERS.FS_Buffer.RootDirFirstSector_H),BC
+ LD (CORE_BUFFERS.FS_Buffer.SectorsPerFAT_H),A ; [ ] fat32
+ ;LD (CORE_BUFFERS.FS_Buffer.END_CHAIN_CLUSTER_H),BC ; [ ] fat32 reset variables
+ ;
+ ;
+ EXX
+ LD H,A
+ LD L,A
+ LD D,A
+ LD E,A
+ EXX
+ LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT16)
+ LD A,E
+ OR D
+ JR NZ,.skip_high
+ ;
+ LD (.UsesVarsFAT32),A
+ EXX
+ LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT32 + 2)
+ LD A,E
+ EXX
+ ;
+ LD (CORE_BUFFERS.FS_Buffer.SectorsPerFAT_H),A
+ LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT32)
+ ;
+.skip_high: LD (CORE_BUFFERS.FS_Buffer.SectorsPerFAT_L),DE
+ LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.Number_of_FATs) ; amount FATs
+ LD (CORE_BUFFERS.FS_Buffer.Number_Of_FATs),A
+ CP 1
+ JR Z,.one_FAT
+ JP C,RD_BPB.UnknownBPB
+ DEC A
+ ADD HL,DE
+ LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_L),HL
+ EXX
+ ADC HL,DE
+ LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_H),HL
+ EXX
+ ;JR NC,.no_inc_BC
+ ;INC BC
+.no_inc_BC:;LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_H),BC
+.one_FAT: ;
+.loop1: ADD HL,DE
+ ;JR NC,.loop1_1
+ ;INC BC
+ EXX
+ ADC HL,DE
+ EXX
+.loop1_1: DEC A
+ JR NZ,.loop1
+ ;
+ LD (CORE_BUFFERS.FS_Buffer.RootDirFirstSector_L),HL ; first sector DIR
+ EXX
+ ; можно сразу тут загнать старший байт, потому-что дла FAT32 следующий расчёт - это прибавление нуля.
+ LD (CORE_BUFFERS.FS_Buffer.FirstDataSector_H),HL
+ EXX
+ ;
+ LD BC,(CORE_BUFFERS.FS_Buffer.BytesPerSector)
+ LD A,B
+ AND A
+ ;
+ RL C
+ RLA
+ RL C
+ RLA
+ RL C
+ RLA
+ ;
+ LD C,A
+ LD B,0 ; BC - File handels per sector
+ ;;;;
+ IF COMPILE_UNUSED_CODE
+ LD (CORE_BUFFERS.FS_Buffer.FilesPerSector),A
+ ENDIF
+ ;
+ EX DE,HL
+ LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FilesInRootDIR) ; 0 for fat32
+ ; fat32
+ LD A,H
+ OR L
+ ;JR Z,.skip_loop2
+ JR NZ,.filesRoot
+ ;
+ INC A
+ LD (.UsesVarsFAT32),A
+ DEC A
+ JR .skip_loop2
+ ;
+.filesRoot: DEC HL
+ XOR A
+ ;NEXTAD2
+.loop2: INC A
+ JP Z,RD_BPB.UnknownBPB
+ SBC HL,BC
+ JR NC,.loop2
+ ;
+.skip_loop2: EX DE,HL
+ LD C,A ; A - sectors in DIR
+ LD B,0
+ LD (CORE_BUFFERS.FS_Buffer.DirSizeInSectors),A
+
+ ADD HL,BC ; Start DATA area
+ LD (CORE_BUFFERS.FS_Buffer.FirstDataSector_L),HL
+ ; B = 0
+ ;
+ LD HL,(CORE_BUFFERS.FS_Buffer.BytesPerSector)
+ LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster)
+ ;!TODO FATcacheSize
+ ; calc. cluster size
+ XOR 1
+ JR Z,.loop3.end
+ RRA
+.loop3: ADD HL,HL
+ RRA
+ JP NC,.loop3
+.loop3.end: ;
+ LD (CORE_BUFFERS.FS_Buffer.BytesPerCluster),HL
+ ;LD DE,#8001 ; проверка на размер кластера больше 32 кб - не поддерживается ; !TODO
+ ;AND A
+ ;SBC HL,DE
+ ;JP NC,DOS_X_Error.UnknownBPB ; [ ] fixed bug, thanks to @Romychs (Roman Boykov)
+////////////////////////////////////////////////////////////////////////
+;!TODO не используется значения вычисляемые и сохраняемые в FS_Buffer
+; EX DE,HL
+; LD HL,#3FFF ;!HARDCODE ;!TODO FATcacheSize
+; XOR A
+; ;NEXTAD4 ;!FIXIT оптимизировать когда понадобится
+;.loop4: INC A
+; JP Z,DOS_X_Error.UnknownBPB
+; SBC HL,DE
+; JR NC,.loop4
+; LD (CORE_BUFFERS.FS_Buffer.ClustersPerBank),A ; A - Clusters per bank (16k)
+;
+; LD HL,0
+; LD BC,(CORE_BUFFERS.SECTOR_BUFFER + _sBOOT_SECTOR_PARAMS.SectorsPerTrack) ; Sector per track
+; LD A,(CORE_BUFFERS.SECTOR_BUFFER + _sBOOT_SECTOR_PARAMS.HEADS)
+;.BPB_L1: ; calc. sector per cylinder
+; ADD HL,BC
+; DEC A
+; JR NZ,.BPB_L1
+; LD (CORE_BUFFERS.FS_Buffer.S_X_H),HL
+////////////////////////////////////////////////////////////////////////
+ ; [ ] fat32
+ LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerDrive)
+ LD A,H
+ OR L
+ LD DE,(CORE_BUFFERS.FS_Buffer.FirstDataSector_L)
+ JP NZ,.HDDSMAL
+ ;
+ EXX
+ LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_H)
+ PUSH HL ; Total Sectors high
+ LD DE,(CORE_BUFFERS.FS_Buffer.FirstDataSector_H)
+ EXX
+ LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_L)
+ PUSH HL ; Total Sectors low
+ AND A
+ SBC HL,DE
+ EXX
+ SBC HL,DE
+ PUSH HL
+ EXX
+ POP BC
+ ;JP NC,.HDDBIG
+ ;DEC BC
+ JP .HDDBIG
+ ;
+.HDDSMAL: ; CF = 0
+ LD BC,0
+ PUSH BC ; Total Sectors high
+ PUSH HL ; Total Sectors low
+ SBC HL,DE
+ ;
+.HDDBIG: CALL SectorToCluster
+ ;
+.loop7_exit: INC HL
+ LD (CORE_BUFFERS.FS_Buffer.MaxClusterLow),HL
+ LD A,L
+ OR H
+ JR NZ,.no_inc_bc
+ INC BC
+.no_inc_bc: LD (CORE_BUFFERS.FS_Buffer.MaxClusterHigh),BC
+ ;
+ XOR A
+ LD H,A
+ LD L,A
+ LD (CORE_BUFFERS.FS_Buffer.CacheBlock),HL
+ LD (CORE_BUFFERS.FS_Buffer.CacheUpdated),A
+ ; A = 0
+ LD HL,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_H)
+ LD H,A
+ EX DE,HL
+ LD HL,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_L)
+ ; DE:HL = SectorsPerFAT
+ ;
+ LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.Number_of_FATs)
+ LD B,A
+ DEC A
+ JR Z,.loop_mul_end
+ ; .Number_of_FATs * .SectorsPerFAT
+.loop_mul: ADD HL,HL
+ EX DE,HL
+ ADC HL,HL
+ EX DE,HL
+ DJNZ .loop_mul
+.loop_mul_end: ; .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT
+ LD B,0
+ LD A,(CORE_BUFFERS.FS_Buffer.DirSizeInSectors)
+ LD C,A
+ ADD HL,BC
+ JR NC,.no_inc_DE
+ INC DE
+.no_inc_DE: ; .RESERVED_SECTORS + .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT
+ LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RESERVED_SECTORS)
+ ADD HL,BC
+ JR NC,.no_inc_de
+ INC DE
+.no_inc_de: ; Total_Sectors - (.RESERVED_SECTORS + .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT)
+ AND A
+ LD B,D
+ LD C,E
+ POP DE ; Total Sectors low
+ EX DE,HL
+ SBC HL,DE
+ EX (SP),HL ; Total Sectors high
+ SBC HL,BC
+ POP DE ; Total Sectors low
+ ; HL:DE = DataSec
+ ;
+ LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster)
+ ; HL:DE / A => DE:BC, H=0, L - остаток
+ CALL DIV_by_Shifts
+ ; выясняем разрядность FAT
+ LD A,D
+ OR E
+ JR NZ,.its_FAT32
+ ;
+ LD HL,4084
+ SBC HL,BC
+ JR NC,.its_FAT12
+ ;
+ LD HL,65524
+ SBC HL,BC
+ JR C,.its_FAT32
+ ;
+ ; It's FAT16
+ LD A,(.UsesVarsFAT32)
+ AND A
+ JP NZ,RD_BPB.UnknownBPB
+ ;
+ LD HL,#FFFF
+ LD A,FAT_TYPE.x16
+.set_vars: EXX
+ LD HL,0
+ LD (CORE_BUFFERS.FS_Buffer.END_CHAIN_CLUSTER_H),HL
+ LD (CORE_BUFFERS.FS_Buffer.RootDirStartCluster_L),HL
+ LD (CORE_BUFFERS.FS_Buffer.RootDirStartCluster_H),HL
+ LD HL,CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT.LABEL
+ EXX
+ LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT.SERIAL_NUMBER)
+ LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT.SERIAL_NUMBER+2)
+ JR .SET_VARS
+ ;
+.its_FAT12: LD A,(.UsesVarsFAT32)
+ AND A
+ JP NZ,RD_BPB.UnknownBPB
+ ;
+ LD HL,#0FFF
+ LD A,FAT_TYPE.x12
+ JR .set_vars
+ ;
+.its_FAT32: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.MainFATnumber)
+ CP #80
+ JR C,.mirrored_FATs ;если все копии FAT используются
+ ; используется только одна копия FAT
+ LD HL,(CORE_BUFFERS.FS_Buffer.FAT1_SEC_H)
+ LD DE,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_H)
+ LD D,0
+ EXX
+ LD HL,(CORE_BUFFERS.FS_Buffer.FAT1_SEC_L)
+ LD DE,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_L)
+ AND #0F
+ JR Z,.first_FAT_active
+ LD B,A
+ ;
+.fat_calc_loop: ADD HL,DE
+ EXX
+ ADC HL,DE
+ EXX
+ DJNZ .fat_calc_loop
+ ;
+.first_FAT_active:
+ LD (CORE_BUFFERS.FS_Buffer.FAT1_SEC_L),HL
+ LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_L),HL
+ EXX
+ LD (CORE_BUFFERS.FS_Buffer.FAT1_SEC_H),HL
+ LD (CORE_BUFFERS.FS_Buffer.FAT2_SEC_H),HL
+ ;
+.mirrored_FATs: LD HL,CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.LABEL
+ ;
+ EXX
+ LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster)
+ LD (CORE_BUFFERS.FS_Buffer.RootDirStartCluster_L),HL
+ LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster+2)
+ LD (CORE_BUFFERS.FS_Buffer.RootDirStartCluster_H),DE
+ ;
+ CALL CLUSTER_TO_SECTOR.no_prepare
+ LD (CORE_BUFFERS.FS_Buffer.RootDirFirstSector_L),IX
+ LD (CORE_BUFFERS.FS_Buffer.RootDirFirstSector_H),HL
+ ;
+ LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FSINFO_Sector)
+ LD (CORE_BUFFERS.FS_Buffer.FSINFO_Sector),HL
+ ;
+ LD A,FAT_TYPE.x32
+ LD HL,#0FFF
+ LD (CORE_BUFFERS.FS_Buffer.END_CHAIN_CLUSTER_H),HL
+ LD H,L
+ LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.SERIAL_NUMBER)
+ LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.SERIAL_NUMBER+2)
+ ;
+.SET_VARS: LD (CORE_BUFFERS.FS_Buffer.FAT_TYPE),A
+ LD (CORE_BUFFERS.FS_Buffer.END_CHAIN_CLUSTER_L),HL
+ LD (CORE_BUFFERS.FS_Buffer.BPB_SERIAL_NUMBER),DE
+ LD (CORE_BUFFERS.FS_Buffer.BPB_SERIAL_NUMBER+2),BC
+ EXX
+ LD DE,CORE_BUFFERS.FS_Buffer.BPB_LABEL
+ LD BC,11 ;!HARDCODE
+ LDIR
+ ;
+ SET_PAGE_X FATPAGE
+ PUSH AF
+ LD DE,0
+ CALL READ_FAT_TABLE
+ POP AF
+ OUT (SLOT3),A
+ ;
+ ; Установить начальный кластер для чтения
+ LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE)
+ CP FAT_TYPE.x32
+ JR Z,.set_FSinfo
+ ;
+ LD HL,#0001
+ LD (G_CLUST.low),HL
+ DEC L
+ LD (G_CLUST.high),HL
+ ;
+ DEC HL
+ LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_L),HL
+ LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_H),HL
+ XOR A
+ RET
+ ;
+.set_FSinfo: CALL READ_FSinfo
+ ; !FIXIT проверка на ошибку
+ ;
+ ; проверка одной из сотни сраных сигнатур
+ LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.DATA_SIGNATURE)
+ LD DE,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.DATA_SIGNATURE + 2)
+ LD BC,#7272
+ SBC HL,BC
+ JR NZ,.error
+ EX DE,HL
+ LD DE,#6141
+ SBC HL,DE
+ JR NZ,.error
+ ; FREE_CLUSTERS_COUNT
+ LD BC,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT)
+ LD DE,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT+2)
+ ; CF = 0
+ CALL .check_cluster
+ JR NC,.skip_FFFF
+ ;
+ LD B,#FF
+ LD C,B
+ LD D,B
+ LD E,B
+ ;
+.skip_FFFF: LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_L),BC
+ LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_H),DE
+ ;
+ ; FIRST_FREE_CLUSTER
+ LD BC,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER)
+ LD DE,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2)
+ ; CF = 0
+ CALL .check_cluster
+ JR C,.error
+ ;
+ LD (G_CLUST.high),DE
+ LD (G_CLUST.low),BC
+ XOR A
+.error: LD (CORE_BUFFERS.FS_Buffer.UPD_FSINFO),A
+ RET Z
+ ;!TODO FREE_CLUSTERS_COUNT
+ ;LD HL,#FFFF
+ ;LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_L),HL
+ ;LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_H),HL
+ ;
+ XOR A
+ LD H,A
+ LD L,2
+ LD (G_CLUST.low),HL
+ LD L,H
+ LD (G_CLUST.high),HL
+ RET
+ ;
+ ;!TODO MaxCluster - максимально допустимый или на 1 больше максимально допустимого?
+.check_cluster: LD HL,(CORE_BUFFERS.FS_Buffer.MaxClusterLow)
+ SBC HL,BC
+ LD HL,(CORE_BUFFERS.FS_Buffer.MaxClusterHigh)
+ SBC HL,DE
+ RET
+ ;
+.UsesVarsFAT32: DB 0
+;;;;;;;;
+
+; --> BC:HL - Sector
+; <-- BC:HL - Cluster
+SectorToCluster:
+ LD A,B
+ AND #0F
+ LD B,A
+ LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster)
+ SCF
+.loop: RRA
+ RET C
+ RR B
+ RR C
+ RR H
+ RR L
+ JP .loop
+;
+
+; DOS_X_Error:
+; .UnknownBPB: LD A,DSS_Error.sys.UNKNOWN_FORMAT
+; SCF
+; RET
+ ;
+; .Not_ready: LD A,DSS_Error.sys.NOT_READY
+; ; CF = 1
+; RET
+;
+;
+;!TODO к буферам!
+/*
+FS_Buffer:
+;.MSG: DB 'FAT'
+.DRIVE: DB #FF
+.FAT_TYPE: DB #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; [x] fat32
+.CacheBlock: DW #00
+.CacheUpdated: DB #00
+;.SectorsPerBank: DB #00
+.RootDirStartCluster_L: DW #0000
+.RootDirStartCluster_H: DW #0000 ; [ ] fat32
+.FAT1_SEC_L: DW #0000 ; MSD_FAT_SEC first sector FAT (FAT_FRM)
+.FAT1_SEC_H: DW #0000 ; [ ] fat32
+.FAT2_SEC_L: DW #0000
+.FAT2_SEC_H: DW #0000 ; [ ] fat32
+.SectorsPerFAT_L DW #0000
+.SectorsPerFAT_H DB #00
+.RootDirFirstSector_L: DW #0000 ; MSD_CAT_SEC first sector DIR
+.RootDirFirstSector_H: DW #0000 ; MSD_CAT_SEC first sector DIR ; !TODO ограничение в 32 Гига ;!FIXIT не используется
+.DirSizeInSectors: DB #00 ; DIR_SEC_SIZE
+.FirstDataSector_L: DW #0000 ; MSD_DAT_SEC low
+.FirstDataSector_H: DW #0000 ; MSD_DAT_SEC high ; [ ] fat32 было ограничение в 32 Гига
+.BytesPerCluster: DW #0000 ; CLUSTER_LEN
+.END_CHAIN_CLUSTER_L: DW #FFFF
+.END_CHAIN_CLUSTER_H: DW #0FFF ; [ ] fat3
+.MaxClusterLow: DW #0000 ; макс. число кластеров (без служ.)
+.MaxClusterHigh: DW #0000 ; макс. число кластеров (без служ.)
+;
+.BytesPerSector DW #0000
+.SectorsPerCluster DB #00
+.BPB_SERIAL_NUMBER DW 0,0
+.BPB_LABEL BLOCK 11,' ' ; 11 для FAT, 31 для CDFS
+ IF COMPILE_UNUSED_CODE
+.FilesPerSector: DB #00 ; число файловых записей в секторе
+.ClustersPerBank: DB #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) ; ????? это используется?
+ ENDIF
+;.READ_PG: DB #00 ;!TODO не используются некоторые значения, но задумка неплохая)))
+;.S_X_H: DW #0000 ; количество секторов на цилиндре ; ????? это используется?
+;
+*/
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+
+;███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████;
+; FAT_X 12-16-32
+;███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████;
+
+; Удаляет запись в каталоге и освобождает занятую цепочку кластеров
+; Вход: IX - указатель на удаляемую запись в DIRPAGE
+;!TODO record index. возможно, что может сломаться, если больше страницы
+DELETE_REC_FAT: SET_PAGE_X DIRPAGE
+ EX AF,AF'
+ CALL DELETE_LFN_RECORDS ; [x] удаление записи LFN
+ LD (IX + FAT_DIRECTORY_RECORD.NAME),#E5 ; признак удаления файла
+ ; fat32
+ LD L,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H) ; № первого кластера
+ LD H,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1)
+ LD A,L
+ OR H
+ EXX
+ LD L,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) ; № первого кластера
+ LD H,(IX+FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1)
+ OR L
+ OR H
+ ;
+ EX AF,AF'
+ OUT (SLOT3),A
+ EX AF,AF'
+ JP Z,SAVEDIR ; сбросить кеш каталога на диск
+ ; если размер файла не ноль
+.loop: ;EX DE,HL ; hl=номер кластера
+ ;EXX
+ ; EX DE,HL
+ ;EXX
+ CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера
+ EXX
+ PUSH DE ; номер след. кластера
+ PUSH AF
+ LD DE,#0000 ; номер кластера
+ EXX
+ PUSH DE
+ ;
+ CALL SET_NEW_FREE_CLUSTER
+ ;
+ LD DE,#0000 ; номер кластера
+ CALL WRITE_TO_FAT.Custom ; записать в кеш FAT-а номер кластера
+ POP HL
+ EXX
+ POP AF
+ POP HL
+ ;EX DE,HL
+ EXX
+ ;EX DE,HL
+ JP NC,.loop
+ CALL WRITE_FAT_TABLE
+ JP SAVEDIR ; сбросить кеш каталога на диск
+
+; Установить первым известным кластером для поиска свободного.
+; Установится только если меньше предыдущего
+; Вход: HL':HL - cluster
+; портит DE, BC' и A
+; [x] раньше был шанс упереться в "DISK FULL" если G_CLUST указывал на кластер дальше, чем другой свободный
+; [ ] free clusters for FSInfo
+SET_NEW_FREE_CLUSTER:
+ LD A,1 ; увеличить
+ CALL SET_NEW_FREE_CLUSTERS ; [ ] free clusters for FSInfo
+ ; CF=0
+ ;
+ EX DE,HL
+ LD HL,(G_CLUST.low)
+ SBC HL,DE
+ EX DE,HL
+ ;
+ EXX
+ LD B,D
+ LD C,E
+ EX DE,HL
+ LD HL,(G_CLUST.high)
+ SBC HL,DE
+ EX DE,HL
+ LD D,B
+ LD E,C
+ EXX
+ RET C
+ ;
+ JR G_CLUST.set_new
+ ; LD (G_CLUST.low),HL
+ ; EXX
+ ; LD (G_CLUST.high),HL
+ ; EXX
+ ; XOR A
+ ; INC A
+ ; LD (CORE_BUFFERS.FS_Buffer.RESET_FSINFO),A
+ ; RET
+
+;
+; [x] fat32 ;!TEST
+; найти первый свободный кластер ;!TODO проверить перебор кластеров
+; выход: HL - младший номер свободного кластера
+; HL' - старший номер свободного кластера
+G_CLUST: ;
+.low+1: LD HL,#0001
+ EXX
+.high+1: LD HL,#0000
+ EXX
+.loop: INC HL ; номер кластера
+ LD A,L
+ OR H
+ ; [x] fat32
+ EXX
+ JR NZ,.no_inc
+ INC HL
+.no_inc: EXX
+ ;
+ CALL READ_FROM_FAT ; прочитать из кеша FAT-а номер след. кластера
+ CP DSS_Error.sys.DISK_FULL
+ SCF
+ RET Z
+ ;
+ EXX
+ LD A,D
+ OR E
+ EXX
+ OR D
+ OR E
+ JR NZ,.loop
+.set_new: ; A = 0
+ LD (G_CLUST.low),HL
+ EXX
+ LD (G_CLUST.high),HL
+ EXX
+ INC A
+ LD (CORE_BUFFERS.FS_Buffer.UPD_FSINFO),A
+ RET
+
+; Вход: A - уменьшить (0) или увеличить (!0) число свободных кластеров
+SET_NEW_FREE_CLUSTERS:
+ EX AF,AF
+ PUSH HL
+ PUSH DE
+ EXX
+ PUSH HL
+ PUSH DE
+ LD HL,(CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_H)
+ LD A,H
+ AND L
+ EXX
+ LD HL,(CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_L)
+ AND H
+ AND L
+ INC A
+ EXX
+ JR Z,.no_change
+ EXX
+ ;
+ EX AF,AF
+ OR A
+ JR Z,.dec_clusters
+ ; inc clusters
+ INC HL
+ LD A,H
+ OR L
+ JR NZ,.set_new
+ EXX
+ INC HL
+ EXX
+ ;
+.set_new: LD A,1
+ LD (CORE_BUFFERS.FS_Buffer.UPD_FSINFO),A
+ ;
+ LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_L),HL
+ EXX
+ LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_H),HL
+.no_change: POP DE
+ POP HL
+ EXX
+ POP DE
+ POP HL
+ RET
+ ;
+.dec_clusters: LD A,H
+ OR L
+ DEC HL
+ JR NZ,.set_new
+ EXX
+ DEC HL
+ EXX
+ JP .set_new
+; ;
+
+;
+; [x] fat32 ;!TEST
+; Прикрепить к последнему кластеру цепочки новый пустой кластер
+; Вход: HL':HL - номер кластера к которому прикрепить пустой
+; Выход: HL':HL - номер кластера к которому прикрепился пустой
+; DE':DE - номер пустого кластера
+INC_FAT: PUSH HL ; текущий кластер
+ EXX
+ PUSH HL ; текущий кластер
+ EXX
+ ;
+ CALL G_CLUST
+ ;
+ EXX
+ POP DE ; текущий кластер
+ EXX
+ POP DE ; текущий кластер
+ RET C
+ ; HL':HL - свободный кластер, DE':DE - текущий кластер
+ ;
+ EX DE,HL
+ EXX
+ EX DE,HL
+ EXX
+ ;
+ CALL WRITE_TO_FAT.Custom ; записать в кеш FAT-а номер кластера
+ ;!FIXIT <нет контроля ошибки>
+ ;
+ PUSH HL
+ EX DE,HL
+ EXX
+ PUSH HL
+ EX DE,HL
+ EXX
+ ;
+ CALL WRITE_TO_FAT ; записать в кеш FAT-а номер кластера
+ ;!TEST ;!TODO 2/12/23 ; [ ] баг с избыточной записью WRITE_FAT_TABLE?
+ ;CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск
+ ;
+ EXX
+ POP DE
+ EX DE,HL
+ EXX
+ POP DE
+ EX DE,HL
+ ;
+ ; [ ] free clusters for FSInfo
+ XOR A ; уменьшить
+ CALL SET_NEW_FREE_CLUSTERS ; [ ] free clusters for FSInfo
+ RET
+;RX01
+
+
+; [x] fat32 ;!TEST
+; вход: hl = младшее слово номера кластера для сравнения с FAT_Max_Cluster
+; hl' = старшее слово номера кластера для сравнения с FAT_Max_Cluster (только для fat32)
+CHECK_CLUSTER_IS_SMALLER:
+ LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE)
+ XOR FAT_TYPE.x32
+ JR NZ,.low ; Z=0 проверяем младшее слово номера кластера
+ ; проверяем старшее слово номера кластера
+ EXX
+ EX DE,HL
+ LD HL,(CORE_BUFFERS.FS_Buffer.MaxClusterHigh)
+ ; CF = 0
+ SBC HL,DE
+ EX DE,HL
+ EXX
+ LD A,DSS_Error.sys.DISK_FULL
+ RET C
+ RET NZ
+ ; проверяем младшее слово номера кластера
+.low: EX DE,HL
+ LD HL,(CORE_BUFFERS.FS_Buffer.MaxClusterLow)
+ SBC HL,DE
+ EX DE,HL
+ LD A,DSS_Error.sys.DISK_FULL
+ RET
+;
+
+;
+;[x] fat32 ;!TEST
+;------------------------------------------------------------------------------------------------
+; Прочитать из кеша FAT-а номер след. кластера
+; вход: hl - номер кластера (младшее слово)
+; hl' - номер кластера (старшее слово. только для FAT32)
+; выход: hl - номер кластера (младшее слово)
+; hl' - номер кластера (старшее слово)
+; de - номер след. кластера (младшее слово)
+; de' - номер след. кластера (старшее слово)
+; если DE':DE = 0, то кластер HL':HL свободен
+; CF - конец цепочки
+;------------------------------------------------------------------------------------------------
+READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER
+ RET C
+ ;
+ SET_PAGE_X FATPAGE
+ ;
+ PUSH HL
+ PUSH AF
+ LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE)
+ CP FAT_TYPE.x16
+ JR C,.FAT12
+ JR NZ,.FAT32
+ ; fat16, просто читать след. номер
+.FAT16: CALL GET_FAT16_CELL
+ LD E,(HL) ; прочитать номер кластера
+ INC HL
+ LD D,(HL)
+ ;
+ LD HL,SERVICE_SECTORS.FAT16
+.exit: POP AF
+ OUT (SLOT3),A
+ ; обнуляем CF и устанавливаем код ошибки = DssErr.sys.NO_ERROR
+ XOR A
+ ; проверка на служ. кластеры
+ SBC HL,DE
+ POP HL
+ ;!FIXIT fat32 перестраховка
+ EXX
+ LD H,A
+ LD L,A
+ LD D,A
+ LD E,A
+ EXX
+ RET
+ ;
+ ;
+.FAT12: CALL GET_FAT12_CELL
+ LD E,(HL)
+ INC HL
+ LD D,(HL)
+ LD HL,SERVICE_SECTORS.FAT12
+ JR NC,.Correct_2
+.Correct_1: LD A,E
+ AND #F0
+ DUP 4 ; вправо на 4 битa
+ RR D
+ RRA
+ EDUP
+ LD E,A
+ JR .exit
+ ;
+.Correct_2: LD A,D
+ AND #0F
+ LD D,A
+ JR .exit
+ ;
+.FAT32: EXX
+ PUSH HL
+ EXX
+ ;
+ CALL GET_FAT32_CELL
+ ; прочитать младшее слово номера кластера
+ LD E,(HL)
+ INC HL
+ LD D,(HL)
+ INC HL
+ ; прочитать старшее слово номера кластера
+ LD A,(HL)
+ INC HL
+ EX AF,AF'
+ LD A,(HL)
+ EXX
+ AND #0F
+ LD D,A
+ EX AF,AF'
+ LD E,A
+ EXX
+ ; обнуляем CF и устанавливаем код ошибки = DssErr.sys.NO_ERROR
+ XOR A
+ ; проверка на служ. кластеры младшего слова кластера
+ LD HL,SERVICE_SECTORS.FAT32.Low
+ SBC HL,DE
+ ; проверка на служ. кластеры старшего слова кластера
+ EXX
+ LD HL,SERVICE_SECTORS.FAT32.High
+ SBC HL,DE
+ POP HL
+ EXX
+ POP BC
+ LD A,B
+ OUT (SLOT3),A
+ POP HL
+ LD A,0
+ RET
+;
+
+; Вход: HL - Номер первой ячейки кластера в блоке фата
+; Портить только HL и A
+SET_FAT32_CACHE_BLOCK_CHANGED_REGION:
+ ;DEC HL
+ ;LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE)
+ ;CP FAT_TYPE.x16 + 1
+ ;JR C,.start
+ ;DEC HL
+ ;DEC HL
+ ;
+.start: LD A,H
+ AND #38
+ LD HL,#0108
+ JR Z,.set_region
+ ;
+.loop: SLA H
+ ;AND A
+ SUB L
+ JR NZ,.loop
+ ;
+.set_region: LD A,(CORE_BUFFERS.FS_Buffer.CacheUpdated)
+ OR H
+ LD (CORE_BUFFERS.FS_Buffer.CacheUpdated),A
+ RET
+
+;
+; [x] fat32 ;!TEST
+;
+; !TODO optimize
+; при записи в кэш значения отмечать через OR в ячейке FS_Buffer.SectorOfCacheBlock
+; бит соответствующий куску в странице кэша, который был изменён и потом скидывать на диск
+; только те куски, которые были изменены.
+; |--------------------|
+; | bit | adresses |
+; |-----|--------------|
+; | 0 | #0000..#07FF |
+; | 1 | #0800..#0FFF |
+; | 2 | #1000..#17FF |
+; | 3 | #1800..#1FFF |
+; | 4 | #2000..#27FF |
+; | 5 | #2800..#2FFF |
+; | 6 | #3000..#37FF |
+; | 7 | #3800..#3FFF |
+; |--------------------|
+;
+;------------------------------------------------------------------------------------------------
+; Записать в кеш FAT-а номер кластера
+; вход: hl = младшее слово номера кластера в который записать
+; hl' = старшее слово номера кластера в который записать (только для fat32)
+; .Custom:
+; de = младшее слово номера кластера которое вписать
+; de' = старшее слово номера кластера которое вписать (только для fat32)
+; выход: HL':HL такие же как и на входе
+; .Custom:
+; HL':HL и DE':DE такие же как и на входе
+;------------------------------------------------------------------------------------------------
+WRITE_TO_FAT: LD DE,(CORE_BUFFERS.FS_Buffer.END_CHAIN_CLUSTER_L) ; номер кластера
+ EXX
+ LD DE,(CORE_BUFFERS.FS_Buffer.END_CHAIN_CLUSTER_H) ; номер кластера
+ EXX
+.Custom: PUSH DE
+ EXX
+ PUSH DE
+ EXX
+ CALL CHECK_CLUSTER_IS_SMALLER
+ EXX
+ POP DE
+ EXX
+ POP DE
+ RET C
+ ;
+ EXX
+ SET_PAGE_X FATPAGE
+ EXX
+ PUSH HL
+ AND A
+ PUSH AF
+ PUSH DE ; младший номер кластера который вписать
+ ; [x] 2/12/23 FAT не всегда мог записаться на HDD
+ ;LD A,1
+ ;LD (CORE_BUFFERS.FS_Buffer.CacheUpdated),A
+ ;
+ LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE)
+ CP FAT_TYPE.x16
+ JR C,.FAT12
+ JR NZ,.FAT32
+ ;
+.FAT16: CALL GET_FAT16_CELL
+ POP DE ; младший номер кластера который вписать
+ LD (HL),E ; сохр. в кеше FAT-а
+ INC HL ; номер кластера
+ LD (HL),D
+.exit: ;
+ ; [ ] ускорение работы с кэшем FAT
+ CALL SET_FAT32_CACHE_BLOCK_CHANGED_REGION
+ ;
+ POP AF ; восст. порт
+ POP HL
+ OUT (SLOT3),A
+ ; [x] 2/12/23 FAT не всегда мог записаться на HDD
+ ;LD A,#FF
+ ;LD (CORE_BUFFERS.FS_Buffer.CacheUpdated),A
+ ;
+ ; CF = 0
+ RET
+ ;
+.FAT12: ;!FIXIT переделать на переменные FAT_CACHE
+ CALL GET_FAT12_CELL
+ POP DE ; младший номер кластера который вписать
+ JR C,.Correct_1 ; номер нечётный
+ LD (HL),E
+ INC HL
+ LD A,(HL)
+ AND #F0
+ OR D
+ LD (HL),A
+ JR .exit
+ ;
+.Correct_1: ; влево на 4 битa
+ PUSH DE
+ EX DE,HL
+ ADD HL,HL
+ ADD HL,HL
+ ADD HL,HL
+ ADD HL,HL
+ EX DE,HL
+ ;
+ LD A,(HL)
+ AND #0F
+ OR E
+ LD (HL),A ; сохр. в кеше FAT-а
+ INC HL ; номер кластера
+ LD (HL),D
+ POP DE
+ JR .exit
+ ;
+.FAT32: ; [x] fat32 ;!TEST
+ EXX
+ PUSH DE ; старший номер кластера который вписать
+ PUSH HL ; старшее слово номера кластера в который записать
+ EXX
+ CALL GET_FAT32_CELL
+ EXX
+ POP HL ; старшее слово номера кластера в который записать
+ POP DE
+ PUSH DE ; старший номер кластера который вписать
+ EXX
+ POP BC ; старший номер кластера который вписать
+ POP DE ; младший номер кластера который вписать
+ ; сохр. в кеше FAT-а номер кластера
+ LD (HL),E
+ INC HL
+ LD (HL),D
+ INC HL
+ LD (HL),C
+ INC HL
+ LD A,(HL)
+ AND #F0
+ OR B
+ LD (HL),A
+ JR .exit
+;;;;;;;;;
+
+
+
+; [x] fat32 ;!TEST
+;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT
+; in: HL - Cache block
+; out: C:HL - logical number
+; B = 0
+GET_SECTOR_OF_FAT:
+ LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE)
+ LD B,FAT_CACHE.Degree_32 ;!FIXIT сделать через переменную
+ XOR FAT_TYPE.x32
+ JR Z,.next
+ LD B,FAT_CACHE.Degree ;!FIXIT сделать через переменную
+ XOR A
+.next: LD C,A
+ ;
+.loop: ADD HL,HL ;x2
+ ADC A,C
+ DJNZ .loop
+ ;
+ LD C,A
+ RET
+; GET_SECTOR_OF_FAT:
+; XOR A
+; LD B,A
+; LD C,A
+; DUP FAT_CACHE.Degree ; 4
+; ADD HL,HL ;x2
+; ADC A,C
+; EDUP
+; LD C,A
+; LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE)
+; CP FAT_TYPE.x32
+; RET NZ
+; ADD HL,HL ;x2
+; RET NC
+; INC C
+; RET
+;;;;;;;;;
+
+
+; [x] fat32 ;!TEST
+;RE_FAT:
+;RX01
+; Прочитать в кеш ХХ секторов FAT-а
+; DE - NEW FAT BLOCK
+READ_FAT_TABLE: PUSH HL
+ PUSH DE
+ LD A,(CORE_BUFFERS.FS_Buffer.CacheUpdated)
+ OR A
+ CALL NZ,WRITE_FAT_TABLE.Start
+ POP DE
+ ;
+ EX DE,HL
+ LD (CORE_BUFFERS.FS_Buffer.CacheBlock),HL
+ ;
+ CALL GET_SECTOR_OF_FAT
+ ;
+ ; BC:HL - номер лог.сектора
+ LD DE,(CORE_BUFFERS.FS_Buffer.FAT1_SEC_L)
+ ADD HL,DE
+ EX DE,HL
+ LD XH,D
+ LD XL,E
+ LD HL,(CORE_BUFFERS.FS_Buffer.FAT1_SEC_H)
+ ; JR NC,.no_inc
+ ; INC HL
+.no_inc: ADC HL,BC
+ ; HL:IX - SECTOR FAT FOR READING
+ LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE)
+ XOR FAT_TYPE.x32
+ LD BC,FAT_CACHE.Sectors_16 * 256 + Dss.DRV.Read ; рег B * FAT_CACHE.Sector_Size = CASH SIZE
+ JR NZ,.next
+ LD B,FAT_CACHE.Sectors_32 ; рег B * FAT_CACHE.Sector_Size = CASH SIZE
+.next: LD DE,FATPAGE.cache ; куда ; DE - FAT ADDRESS
+ LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ; номер диска
+ RST ToDSS.DRV
+ POP HL
+ RET
+
+
+; [x] fat32 ;!TEST
+; Подключить банку кеша FAT и записать его на диск
+WRITE_FAT_TABLE:
+ SET_PAGE_X FATPAGE
+ PUSH AF
+ CALL .Start ;!TODO нет контроля ошибок
+ POP AF
+ OUT (SLOT3),A
+ RET
+ ; Запись кеша FAT-а на диск
+.Start: CALL SET_FSInfo
+ LD HL,(CORE_BUFFERS.FS_Buffer.CacheBlock)
+ ;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT
+ CALL GET_SECTOR_OF_FAT
+ ; B=0, C:HL - смещение в секторах внутри таблицы FAT на начало блока
+ LD (.pop_offset_HL),HL
+ LD DE,FAT_CACHE.Sectors_32
+ LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE)
+ CP FAT_TYPE.x32
+ JR Z,.next
+ LD DE,FAT_CACHE.Sectors_16 ; !FIXIT брать это значение из переменной везде
+ ;
+.next: ADD HL,DE ;+ SIZE CASH (16 SECTORS)
+ JR NC,.no_inc
+ INC C
+.no_inc: ; C:HL смещение в секторах внутри таблицы FAT на конец блока
+ ;
+ ; конец блока выходит за пределы таблицы?
+ LD B,E ; MAX число секторов для чтения в кэш
+ LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_H)
+ LD (.sub_A),A
+ LD DE,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_L)
+ AND A
+ LD A,C
+ SBC HL,DE
+.sub_A+1: SBC A,0
+ JR C,.WALLFAT ; СF=1: не выходит
+ OR A
+ JP NZ,.ERR
+ ;
+ EX DE,HL
+ ; DE - на сколько секторов конец блока выходит за пределы таблицы.
+ LD HL,FAT_CACHE.Sectors_16 ; !FIXIT брать это значение из переменной везде
+ ; CF = 0
+ SBC HL,DE
+ ;SBC A,0
+ JR C,.ERR ;!TODO проверить
+ LD B,L ; число секторов для чтения в кэш
+.WALLFAT: ;
+.pop_offset_HL+1:
+ LD HL,0
+ ; B = число секторов
+ LD IX,(CORE_BUFFERS.FS_Buffer.FAT1_SEC_H)
+ LD DE,(CORE_BUFFERS.FS_Buffer.FAT1_SEC_L)
+ PUSH BC
+ ; сохраняем первую копию FAT. Вход IX:DE - начало таблицы FAT
+ ; C:HL - смещение внутри таблицы
+ ; B - количество секторов
+ CALL .SAVE_FAT_XX
+ ; [x] если всего одна таблица FAT, то повторной записи не происходит 13/03/2024
+ POP BC ; B = число секторов, C = старший байт смещения в секторах
+ LD HL,(CORE_BUFFERS.FS_Buffer.FAT1_SEC_H)
+ LD DE,(CORE_BUFFERS.FS_Buffer.FAT2_SEC_H)
+ AND A
+ SBC HL,DE
+ JR NZ,.not_one_FAT
+ LD HL,(CORE_BUFFERS.FS_Buffer.FAT2_SEC_L)
+ LD DE,(CORE_BUFFERS.FS_Buffer.FAT1_SEC_L)
+ ; CF = 0
+ SBC HL,DE
+ JR Z,.only_one_FAT
+ ;
+.not_one_FAT: LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE)
+ CP FAT_TYPE.x32
+ JR NZ,.fat_num_2
+ ;
+ LD A,(CORE_BUFFERS.FS_Buffer.Number_Of_FATs)
+ CP 2
+ JR Z,.fat_num_2
+ ; сохраняем больше двух копий FAT
+ LD HL,(CORE_BUFFERS.FS_Buffer.FAT2_SEC_H)
+ LD DE,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_H)
+ LD D,0
+ EXX
+ LD HL,(CORE_BUFFERS.FS_Buffer.FAT2_SEC_L)
+ LD DE,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_L)
+ DEC A
+.many_fat_loop: EXX
+ PUSH HL
+ PUSH HL
+ POP IX
+ EXX
+ PUSH HL
+ PUSH BC
+ EX DE,HL
+ LD HL,(.pop_offset_HL)
+ CALL .SAVE_FAT_XX
+ POP BC
+ POP HL
+ ;
+ LD DE,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_L)
+ ADD HL,DE
+ EXX
+ LD DE,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_H)
+ POP HL
+ ADC HL,DE
+ EXX
+ DEC A
+ JR NZ,.many_fat_loop
+ JR .norm_exit
+ ;
+ ; сохраняем вторую копию FAT
+.fat_num_2: LD IX,(CORE_BUFFERS.FS_Buffer.FAT2_SEC_H)
+ LD DE,(CORE_BUFFERS.FS_Buffer.FAT2_SEC_L)
+ LD HL,(.pop_offset_HL)
+ CALL .SAVE_FAT_XX
+.norm_exit: AND A ;!TODO нет контроля ошибок
+.only_one_FAT: ;
+.ERR: LD A,0
+ LD (CORE_BUFFERS.FS_Buffer.CacheUpdated),A
+ RET
+ ; Вход: IX:DE - начало таблицы FAT в секторах
+ ; C:HL - смещение в таблице в секторах
+ ; B - количество секторов
+.SAVE_FAT_XX: ADD HL,DE
+ JR NC,.no_inc_C
+ INC C
+ ; номер лог. сектора
+.no_inc_C: LD D,0
+ LD E,C
+ ADD IX,DE
+ LD D,XH
+ LD E,XL
+ EX DE,HL
+ LD XH,D
+ LD XL,E
+ ; HL:IX - смещение внутри раздела на начало нужного блока FAT
+ LD A,(CORE_BUFFERS.FS_Buffer.CacheUpdated)
+ CP #FF
+ JR NZ,.SAVE_NOT_ALL_BLOCK
+ ;
+ LD DE,FATPAGE.cache ; откуда
+ LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ; номер диска
+ LD C,Dss.DRV.Write
+ JP ToDSS.DRV
+ ;
+.SAVE_NOT_ALL_BLOCK:
+ ; A = CORE_BUFFERS.FS_Buffer.CacheUpdated
+ ; HL:IX - смещение внутри раздела на начало нужного блока FAT
+ ; B = максимальное число блоков для записи
+ EXX
+ LD HL,FATPAGE.cache
+ LD DE,#0800 ;!HARDCODE размер региона в блоке КЭШа FAT (байтов)
+ EXX
+ LD C,A
+ LD A,B
+
+ LD B,8 ;!HARDCODE количество регионов в блоке КЭШа FAT
+ LD DE,4 ;!HARDCODE размер региона в блоке КЭШа FAT (секторов)
+ ; чтоб не насрать за границы FAT
+.region_loop: SUB A,E
+ JR NC,.good_blk
+ ; максимально допустимый блок для записи меньше, чем хочется
+ ADD A,E
+ LD E,A
+ ;
+.good_blk: SRL C
+ CALL C,.SAVE_FAT_CACHE_REGION
+ EXX
+ ADD HL,DE
+ EXX
+ ADD IX,DE
+ JR NC,.no_inc_HL
+ INC HL
+.no_inc_HL: DJNZ .region_loop
+ RET
+ ; HL' - Адрес в странице КЭШа
+ ; HL:IX - смещение внутри раздела на начало нужного РЕГИОНА блока FAT
+.SAVE_FAT_CACHE_REGION:
+ PUSH AF
+ PUSH DE
+ PUSH BC
+ PUSH HL
+ PUSH IX
+ ;
+ EXX
+ PUSH HL
+ PUSH HL
+ EXX
+ LD B,E ; кол-во секторов
+ POP DE ; Адрес в странице КЭШа
+ LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ; номер диска
+ LD C,Dss.DRV.Write
+ RST ToDSS.DRV
+ ; HL:IX = Sector + Sector counter
+ ; DE = Address + (Sector counter * Size sector)
+ EXX
+ POP HL ; адрес в странице КЭШа
+ LD DE,#0800 ;!HARDCODE размер региона в блоке КЭШа FAT (байтов)
+ EXX
+ ;
+ POP IX
+ POP HL
+ POP BC
+ POP DE
+ POP AF
+ RET
+;-----------------------------------------------------------------------
+;
+;[x] fat32 ;!TEST
+;вход: HL':HL - номер кластера
+;выход: HL - адрес нужной ячейки в странице FATPAGE
+GET_FAT32_CELL:
+ ; двигаем влево HL':H
+ LD A,H
+ EXX
+ LD C,A
+ LD A,H
+ AND FAT_CACHE.Size_Mask_32 ; #0F
+ LD H,A
+ LD A,C
+ ;
+ LD B,FAT_CACHE.Degree ; 4 сдвига
+.loop_block:
+ RLCA ; << H
+ RL L ; << L'
+ RL H ; << H'
+ DJNZ .loop_block
+ EXX
+ ; В итоге тут в HL' номер блока FAT
+ ;
+ ; HL - FAT32 OFFSET (FROM CASH)
+ LD A,H
+ AND FAT_CACHE.Size_Mask_32 ; #0F
+ LD H,A
+ ADD HL,HL
+ ADD HL,HL
+ PUSH HL ; [x] fat32 сохраняем на случай, если READ_FAT_TABLE испортит
+ AND A
+ ;
+ EXX
+ EX DE,HL
+ LD HL,(CORE_BUFFERS.FS_Buffer.CacheBlock) ; BC - BLOCK FAT IN CASH
+ SBC HL,DE
+ CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT
+ POP HL
+ LD DE,FATPAGE.cache ; начало кеша FAT-а
+ ADD HL,DE ; на ячейку FAT
+ RET
+;-----------------------------------------------------------------------
+;вход: HL - номер кластера
+;выход: HL - адрес нужной ячейки в странице FATPAGE
+GET_FAT16_CELL:
+ LD A,H
+ LD B,H
+ ;AND #0F
+ AND FAT_CACHE.Size_Mask_16
+ LD H,A
+ LD A,B
+ ; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES)
+ DUP FAT_CACHE.Degree_16
+ RRCA
+ EDUP
+ ;AND #0F
+ AND FAT_CACHE.Part_Mask_16
+ ;
+ ADD HL,HL ; HL - FAT OFFSET (FROM CASH)
+ ; [x] fat32 поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался
+ ; LD BC,(CORE_BUFFERS.FS_Buffer.CacheBlock) ; BC - BLOCK FAT IN CASH
+ ; CP C
+ LD DE,(CORE_BUFFERS.FS_Buffer.CacheBlock) ; BC - BLOCK FAT IN CASH
+ CP E
+ LD E,A
+ ;
+ CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT
+ LD DE,FATPAGE.cache ; начало кеша FAT-а
+ ADD HL,DE ; на ячейку FAT
+ RET
+;-----------------------------------------------------------------------
+;вход: HL - номер кластера
+;выход: HL - адрес нужной ячейки в странице FATPAGE
+; CF - чётный/нечётный адрес кластера
+GET_FAT12_CELL:
+ LD D,H
+ LD E,L
+ SRL H
+ RR L ; сдвиг вправо через CF
+ PUSH AF ; сохр. флаг
+ ADD HL,DE ; CLUSTER * 1.5
+ ;
+ IF FAT_CACHE.Size_12 < #1800
+ ;!FIXIT оптимизировать
+ LD A,H
+ LD B,H
+ ;
+ AND #1F
+ ;AND FAT_CACHE.Size_Mask_16
+ ;
+ LD H,A
+ LD A,B
+ ;
+ RLCA
+ RLCA
+ RLCA
+ ;DUP FAT_CACHE.Degree_16
+ ; RRCA
+ ;EDUP
+ AND #07
+ ;AND FAT_CACHE.Part_Mask_16
+ ;
+ ; [ ] поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался
+ ; LD BC,(CORE_BUFFERS.FS_Buffer.CacheBlock) ; BC - BLOCK FAT IN CASH
+ ; CP C
+ LD DE,(CORE_BUFFERS.FS_Buffer.CacheBlock) ; BC - BLOCK FAT IN CASH
+ CP E
+ LD E,A
+ ;
+ CALL NZ,READ_FAT_TABLE ; прочитать в кеш 16 секторов FAT-а
+ ENDIF
+ ;
+ LD DE,FATPAGE.cache
+ ADD HL,DE
+ POP AF
+ RET
+;-----------------------------------------------------------------------
+
+
+
+;[x] fat32 ;!TEST
+;CLUSTER_TO_SECTOR:
+; in: HL':HL - CLUSTER
+; out: HL:IX - SECTOR
+CLUSTER_TO_SECTOR:
+ EXX
+ PUSH HL
+ EXX
+ POP DE
+ ; DE:HL - cluster
+ ;
+.no_prepare: PUSH BC
+ LD BC,-2
+ ADD HL,BC
+ JR C,.no_dec_de
+ DEC DE
+.no_dec_de: ; cluster = cluster - 2
+ ;
+ LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster)
+ XOR 1
+ JR Z,.skip
+ ;
+ RRA
+.loop: ADD HL,HL
+ RL E
+ RL D
+ ;
+ RRA
+ JP NC,.loop
+ ;
+.skip: EX DE,HL
+ LD XL,E
+ LD XH,D
+ LD DE,(CORE_BUFFERS.FS_Buffer.FirstDataSector_L)
+ ; [x] fat32
+ ;XOR A
+ ;
+ ADD IX,DE
+ ; [x] fat32
+ LD DE,(CORE_BUFFERS.FS_Buffer.FirstDataSector_H)
+ ;LD D,A
+ ;LD E,A
+ ;
+ ADC HL,DE
+ POP BC
+ RET
+
+////////////////////////////////////////////////////////////////////////
+
+; [x] fat32 ;!TEST
+; READ SECTORS OF FILE
+; вход: HL:DE - FP (in sectors)
+; IY - FM
+; IX - buffer in RAM
+; B - количество секторов для чтения
+BLOCK_READ: LD (READ.PointerOnBuffer),IX
+ LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster) ;SECTORS PER CLUSTER
+ LD C,A
+ PUSH BC ; B - количество секторов для чтения, C - SectorsPerCluster
+ ; HL:DE / A => DE:BC, H=0, L - остаток
+ CALL DIV_by_Shifts
+ PUSH HL ; остаток DIV_by_Shifts
+ ; [x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
+ PUSH BC ; младшее слово номера кластера
+ PUSH DE ; [x] fat32 старшее слово номера кластера
+ ;
+ ; EXX
+ ; LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_H) ; START CLUSTER High
+ ; LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_H+1)
+ ; LD A,L
+ ; OR H
+ ; EXX
+ ; LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ; START CLUSTER Low
+ ; LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1)
+ ; OR L
+ ; OR H
+ CALL CHECK_FIRST_CLUSTER
+ JR Z,.fast_exit_4
+ CALL GetSavedCluster
+ ;HL': HL - известный кластер файла для отсчёта
+ ;DE : BC - оставшееся смещение в файле в кластерах (D=D+1, B=B+1)
+ ;
+ PUSH DE ; [x] оставшееся смещение в файле в кластерах (старшее слово)
+ JR .enter_loop1
+ ;
+.fast_exit_5: POP DE
+.fast_exit_4: ; [x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
+ POP DE ; [x] fat32 старшее слово номера кластера
+ POP BC
+ ;
+ POP BC
+ POP DE
+ AND A
+ RET
+ ; [x] fat32
+.loop1_big: PUSH BC
+ LD BC,0
+.loop1_small: PUSH BC
+ CALL READ_FROM_FAT
+ POP BC
+ JR C,.fast_exit_5 ;RY01
+ EX DE,HL
+ EXX
+ EX DE,HL
+ EXX
+.enter_loop1: INC B
+ DEC BC ; ВС - смещение внутри файла в кластерах (младшее слово)
+ DJNZ .loop1_small
+ POP BC ; [x] оставшееся смещение в файле в кластерах (старшее слово)
+ INC B
+ DEC BC
+ DJNZ .loop1_big
+ ;;;;
+ ;
+ ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
+ POP DE ; [x] fat32 старшее слово номера кластера
+ POP BC ; младшее слово номера кластера
+ CALL SaveGotCluster
+ ;
+ POP DE ; D = 0, E = остаток DIV_by_Shifts
+ POP BC ; B - количество секторов для чтения, C - SectorsPerCluster
+ ; (SP) = (RET)
+ ; работа с остатком от деления
+ LD A,C
+ SUB E
+ LD C,A
+ CP B ; (SectorsPerCluster - остаток) - количество секторов для чтения
+ JR C,.skip1 ; SIZE > RESIDUE CLUSTER
+ LD C,B ; SIZE < CLUSTER
+.skip1: LD A,B
+ SUB C
+ LD B,A
+ ;
+ EXX
+ PUSH HL ; номер кластера старшая часть
+ EXX
+ PUSH HL ; номер кластера младшая часть
+ PUSH BC ; B = количество секторов на дочитку, C = (SectorsPerCluster - остаток) либо количество секторов для чтения
+ PUSH DE ; D = 0, E = остаток DIV_by_Shifts
+ CALL CLUSTER_TO_SECTOR
+ POP DE ; D = 0, E = остаток DIV_by_Shifts
+ ADD IX,DE
+ JR NC,.skip2
+ INC HL
+.skip2: LD DE,(READ.PointerOnBuffer)
+ LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
+ LD B,C
+ LD C,Dss.DRV.Read
+ RST ToDSS.DRV
+ ;
+ JR C,.Error
+ POP BC ; B = количество секторов на дочитку, C = (SectorsPerCluster - остаток) либо количество секторов для чтения
+ LD HL,(READ.PointerOnBuffer)
+ LD DE,(CORE_BUFFERS.FS_Buffer.BytesPerSector)
+ ;!TEST
+ LD A,B
+ LD B,C
+.loop2: ADD HL,DE
+ DJNZ .loop2
+ ;
+ LD (READ.PointerOnBuffer),HL
+ POP DE ; номер кластера младшая часть
+ EXX
+ POP HL ; номер кластера старшая часть
+ EXX
+ OR A
+ RET Z ; количество секторов на дочитку = 0?
+ LD B,A
+ ;
+.loop4: LD HL,CORE_BUFFERS.FS_Buffer.SectorsPerCluster
+ 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
+ ; HL':HL - номер кластера
+ CALL READ_FROM_FAT
+ POP BC
+ JR C,.ECL1 ;RY01
+ ;
+ EXX
+ EX DE,HL
+ PUSH HL ; номер след. кластера (старшее слово)
+ EXX
+ EX DE,HL
+ PUSH HL ; номер след. кластера (младшее слово)
+ PUSH BC
+ CALL CLUSTER_TO_SECTOR
+ LD DE,(READ.PointerOnBuffer)
+ LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
+ LD B,C
+ LD C,Dss.DRV.Read
+ RST ToDSS.DRV
+ JR C,.Error
+ ;
+ POP BC
+ LD HL,(READ.PointerOnBuffer)
+ LD DE,(CORE_BUFFERS.FS_Buffer.BytesPerSector)
+.loop3: ADD HL,DE
+ DEC C
+ JR NZ,.loop3
+ LD (READ.PointerOnBuffer),HL
+ POP DE ; номер след. кластера (младшее слово)
+ EXX
+ POP HL ; номер след. кластера (старшее слово)
+ EXX
+ JP .loop4
+ ;
+.Error: POP BC
+ POP DE
+ POP HL
+ ;SCF
+ RET
+ ;
+.ECL1: AND A
+ RET
+;-----------------------------------------------------------------------
+
+; [x] fat32
+; вход: IY - FM
+; выход: HL':HL - first cluster
+; ZF = 0 если первого кластера нет
+CHECK_FIRST_CLUSTER:
+ EXX
+ LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_H) ; START CLUSTER High
+ LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_H+1)
+ LD A,L
+ OR H
+ EXX
+ LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ; START CLUSTER
+ LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1)
+ OR L
+ OR H
+ RET
+
+; [x] fat32
+; WRITE SECTORS OF FILE
+; вход: HL:DE - FP (in sectors)
+; IX - data in RAM
+; IY - FM
+; B - количество секторов для записи
+BLOCK_WRITE: LD (READ.PointerOnBuffer),IX
+ LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster) ;SECTORS PER CLUSTER
+ LD C,A
+ PUSH BC ; B - количество секторов для чтения, C - SectorsPerCluster
+ ; HL:DE / A => DE:BC, H=0, L - остаток
+ CALL DIV_by_Shifts
+ PUSH HL ; остаток DIV_by_Shifts
+ ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
+ PUSH BC ; младшее слово номера кластера
+ PUSH DE ; fat32 старшее слово номера кластера
+ ;
+ ; EXX
+ ; LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_H) ; START CLUSTER High
+ ; LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_H+1)
+ ; LD A,L
+ ; OR H
+ ; EXX
+ ; LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ; START CLUSTER
+ ; LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1)
+ ; OR L
+ ; OR H
+ CALL CHECK_FIRST_CLUSTER
+ JR NZ,.FindCluster
+ ;
+ PUSH BC ; младшее слово номера кластера
+ PUSH DE ; fat32 старшее слово номера кластера
+ ; [x] fat32
+ CALL G_CLUST
+ JP C,.Error_6
+ ;
+ LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L),L
+ LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1),H
+ ; [x] fat32
+ EXX
+ LD (IY+_sFM.FS_REC.FIRST_CLUSTER_H),L ; START CLUSTER High
+ LD (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1),H
+ EXX
+ ;
+ XOR A
+ CALL SET_NEW_FREE_CLUSTERS
+ ;
+ CALL WRITE_TO_FAT
+ ; 02/12/23 ; [ ] баг с избыточной записью WRITE_FAT_TABLE?
+ ;PUSH HL
+ ;CALL WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск
+ ;POP HL
+ ;
+ POP DE ; младшее слово номера кластера
+ POP BC ; fat32 старшее слово номера кластера
+ ;
+ INC B
+ INC D ; fat32
+ PUSH DE
+ JP .enter_loop
+ ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
+.FindCluster: CALL GetSavedCluster
+ ;HL': HL - известный кластер файла для отсчёта
+ ;DE : BC - оставшееся смещение в файле в кластерах (D=D+1, B=B+1)
+ ;
+ PUSH DE ; оставшееся смещение в файле в кластерах (старшее слово)
+ JP .enter_loop
+ ;
+ ; [x] fat32
+.loop_big: PUSH BC
+ LD BC,0
+.loop: PUSH BC
+ CALL READ_FROM_FAT
+ JR NC,.next
+ ; end of chain - get new cluster
+ CALL INC_FAT
+ JP C,.Error_6
+ ; [x] избыточное обращение 01/04/2024
+ ;CALL READ_FROM_FAT
+ ;
+.next: POP BC
+ EX DE,HL
+ EXX
+ EX DE,HL
+ EXX
+.enter_loop: INC B
+ DEC BC
+ DJNZ .loop
+ POP BC ; оставшееся смещение в файле в кластерах (старшее слово)
+ INC B
+ DEC BC
+ DJNZ .loop_big
+ ;;;;
+ ;
+ ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
+ POP DE
+ POP BC
+ CALL SaveGotCluster
+ ;
+ POP DE ; D = 0, E = остаток DIV_by_Shifts
+ POP BC ; B - количество секторов для чтения, C - SectorsPerCluster
+ ; (SP) = (RET)
+ ;
+ LD A,C
+ SUB E
+ LD C,A
+ CP B ; (SectorsPerCluster - остаток) - количество секторов для чтения
+ JR C,.skip1 ;SIZE > RESIDUE CLUSTER
+ LD C,B ;SIZE < CLUSTER
+.skip1: LD A,B
+ SUB C
+ LD B,A
+ ;
+ EXX
+ PUSH HL ; номер кластера старшая часть
+ EXX
+ PUSH HL ; номер кластера младшая часть
+ PUSH BC ; B = количество секторов на дочитку, C = (SectorsPerCluster - остаток) либо количество секторов для чтения
+ PUSH DE ; D = 0, E = остаток DIV_by_Shifts
+ CALL CLUSTER_TO_SECTOR
+ POP DE ; D = 0, E = остаток DIV_by_Shifts
+ ADD IX,DE
+ JR NC,.skip2
+ INC HL
+ ; DOUBLE 1
+.skip2: LD DE,(READ.PointerOnBuffer)
+ LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
+ LD B,C
+ LD C,Dss.DRV.Write
+ RST ToDSS.DRV
+ ;
+ LD A,DSS_Error.sys.WRITE_ERROR
+ JR C,.Error_3
+ POP BC
+ LD HL,(READ.PointerOnBuffer)
+ LD DE,(CORE_BUFFERS.FS_Buffer.BytesPerSector)
+ ;
+ LD A,B
+ LD B,C
+.loop2: ADD HL,DE
+ DJNZ .loop2
+ ;
+ LD (READ.PointerOnBuffer),HL
+ POP DE ; номер кластера младшая часть
+ EXX
+ POP HL ; номер кластера старшая часть
+ EXX
+ ;
+ OR A
+ RET Z ; количество секторов на дочитку = 0?
+ LD B,A
+ ;
+.big_loop: LD HL,CORE_BUFFERS.FS_Buffer.SectorsPerCluster
+ LD A,B
+ SUB (HL)
+ LD B,A
+ LD C,(HL)
+ JR NC,.WR7
+ LD B,0
+ ADD A,(HL) ;0 AND CF
+ LD C,A
+ OR A ;CLEAR CF
+ RET Z
+ ;
+.WR7: EX DE,HL
+ PUSH BC
+ ; HL':HL - номер кластера
+ CALL READ_FROM_FAT
+ JR NC,.WR9
+ CALL INC_FAT
+ JR C,.ErrorFull
+ ; [x] избыточное обращение 01/04/2024
+ ;CALL READ_FROM_FAT
+ ;
+.WR9: POP BC
+ EXX
+ EX DE,HL
+ PUSH HL ; номер след. кластера (старшее слово)
+ EXX
+ EX DE,HL
+ PUSH HL ; номер след. кластера (младшее слово)
+ PUSH BC
+ CALL CLUSTER_TO_SECTOR
+ ; DOUBLE 1
+ LD DE,(READ.PointerOnBuffer)
+ LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
+ LD B,C
+ LD C,Dss.DRV.Write
+ RST ToDSS.DRV
+ ;
+ LD A,DSS_Error.sys.WRITE_ERROR
+ JR C,.Error_3
+ POP BC
+ LD HL,(READ.PointerOnBuffer)
+ LD DE,(CORE_BUFFERS.FS_Buffer.BytesPerSector)
+.loop3: ADD HL,DE
+ DEC C
+ JR NZ,.loop3
+ LD (READ.PointerOnBuffer),HL
+ POP DE ; номер след. кластера (младшее слово)
+ EXX
+ POP HL ; номер след. кластера (старшее слово)
+ EXX
+ JP .big_loop
+ ;
+.Error_6: POP BC
+ POP BC
+ POP BC
+.Error_3: POP BC ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
+ POP BC
+ POP DE
+ ;SCF
+ RET
+ ;
+.ErrorFull: POP BC
+ LD A,DSS_Error.sys.DISK_FULL
+ ;SCF
+ RET
+
+;
+;[x] fat32
+;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
+; Вход: DE - смещение в файле в кластерах (старшее слово)
+; BC - смещение в файле в кластерах (младшее слово)
+; HL - первый кластер файла (младшее слово)
+; HL' - первый кластер файла (старшее слово)
+; Выход: HL - известный кластер файла для отсчёта (младшее слово)
+; HL' - известный кластер файла для отсчёта (старшее слово)
+; DE - оставшееся смещение в файле в кластерах (старшее слово, D=D+1)
+; BC - оставшееся смещение в файле в кластерах (младшее слово, B=B+1)
+; не портит HL, HL' и DE:BC если оптимизация не сработала
+GetSavedCluster:
+ XOR A
+ CP (IY+_sFM.OptimizedClusters)
+ JR Z,.noOptimization_0
+ ;
+ PUSH DE
+ PUSH HL ; первый кластер файла (младшее слово)
+ ; смещение в файле в кластерах
+ EX DE,HL
+ LD E,(IY+_sFM.KnownOffset_H)
+ LD D,(IY+_sFM.KnownOffset_H+1)
+ ; проверка старшего слова
+ AND A
+ SBC HL,DE
+ JR C,.noOptimization_2
+ ;
+ PUSH BC
+ EX DE,HL
+ LD H,B
+ LD L,C
+ LD C,(IY+_sFM.KnownOffset_L)
+ LD B,(IY+_sFM.KnownOffset_L+1)
+ ; проверка младшего слова
+ SBC HL,BC
+ LD BC,0
+ EX DE,HL
+ SBC HL,BC
+ JR C,.noOptimization_3
+ EX DE,HL
+ LD B,H
+ LD C,L
+ ; DE:BC новое смещение от известного кластера файла (в кластерах)
+ ;
+ LD L,(IY+_sFM.KnownCluster_L)
+ LD H,(IY+_sFM.KnownCluster_L+1)
+ EXX
+ LD L,(IY+_sFM.KnownCluster_H)
+ LD H,(IY+_sFM.KnownCluster_H+1)
+ EXX
+ ; баланс стека
+ POP AF
+ POP AF
+ POP AF
+ ; для цикла DJNZ
+ INC B
+ INC D
+ RET
+ ;
+.noOptimization_3:
+ POP BC
+.noOptimization_2:
+ POP HL
+.noOptimization_1:
+ POP DE
+.noOptimization_0:
+ INC B
+ INC D
+ RET
+
+;[x] fat32
+;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
+SaveGotCluster: LD A,C
+ OR B
+ OR E
+ OR D
+ RET Z
+ ;
+ LD (IY+_sFM.KnownOffset_L),C
+ LD (IY+_sFM.KnownOffset_L+1),B
+ LD (IY+_sFM.KnownOffset_H),E
+ LD (IY+_sFM.KnownOffset_H+1),D
+ ;
+ LD (IY+_sFM.KnownCluster_L),L
+ LD (IY+_sFM.KnownCluster_L+1),H
+ EXX
+ LD (IY+_sFM.KnownCluster_H),L
+ LD (IY+_sFM.KnownCluster_H+1),H
+ EXX
+ ;
+ LD A,1
+ LD (IY+_sFM.OptimizedClusters),A
+ RET
+////////////////////////////////////////////////////////////////////////
+
+;----------------------------------------------------------------------;
+; Вход: HL - адрес куда писать
+; Выход: HL - адрес следующий после записаного
+WRITE_DATE_TIME_TO_DIRECTORY_RECORD:
+ ; [ ] VFAT date
+ PUSH HL
+ CALL SYSTIME ; узнать тек. дату и время
+ CALL MK_TIME ; закодировать время/дату
+ POP HL
+ ; FAT_DIRECTORY_RECORD.TIME
+ LD (HL),E ; de=время
+ INC HL
+ LD (HL),D
+ INC HL
+ ; FAT_DIRECTORY_RECORD.DATE
+ LD (HL),C ; день
+ INC HL
+ LD (HL),B ; месяц
+ INC HL
+ RET
+;----------------------------------------------------------------------;
+
+
+;----------------------------------------------------------------------;
+;Расчёт смещения в секторах ;!HARDCODE sector size
+GET_OFFSET_IN_SECTORS:
+ LD H,0 ;!HARDCODE max file size = 8 gb
+ LD E,(IY+_sFM.F_POSITION+1)
+ LD D,(IY+_sFM.F_POSITION+2)
+ LD L,(IY+_sFM.F_POSITION+3)
+ LD A,E
+ AND #01
+ LD B,A
+ LD C,(IY+_sFM.F_POSITION)
+ RR L
+ RR D
+ RR E
+ ;HL:DE FP (in sectors)
+ ;BC FP residue (in bytes)
+ ;
+ OR C
+ RET
+;----------------------------------------------------------------------;
+
+FAT_MODULE_SIZE EQU $-FAT_MODULE_START
+;//MODULE: FAT
+;[END]
\ No newline at end of file
diff --git a/DSS/FS_Module.asm b/DSS/FS_Module.asm
new file mode 100644
index 0000000..da9d44a
--- /dev/null
+++ b/DSS/FS_Module.asm
@@ -0,0 +1,8 @@
+ INCLUDE "FS/FAT.ASM"
+ INCLUDE "FS/CDFS.ASM"
+
+/*
+
+READ_BPB ; Прочитать BPB в SECTOR_BUFFER
+
+*/
\ No newline at end of file
diff --git a/DSS/IDE_DRV0.ASM b/DSS/IDE_DRV0.ASM
deleted file mode 100644
index e9c791f..0000000
--- a/DSS/IDE_DRV0.ASM
+++ /dev/null
@@ -1,706 +0,0 @@
-;---------------------------------------------------------------
-;Rev Date Name Description
-;---------------------------------------------------------------
-;R02 06-08-2001 DNS Secondary IDE
-;R01 06-08-2001 DNS Fixed BUG with partitions on Second hard disk
-;---------------------------------------------------------------
-;
-; Disk Driver Specification ver. 2.20
-;[]===========================================================[]
-;Procedure : Initialization
-;
-;Function : Initialization device(s)
-;
-;Input : C = 00h
-; IX - Environment
-;Output : A = Amount drive support
-; HL = Size driver
-;[]===========================================================[]
-;[]===========================================================[]
-;Procedure : Open
-;
-;Function : Open disk
-;
-;Input : C = 01h
-; A - Drive
-;Output : None
-;
-;[]===========================================================[]
-;[]===========================================================[]
-;Procedure : Close
-;
-;Function : Close disk
-;
-;Input : C = 02h
-; A - Drive
-;Output : None
-;
-;[]===========================================================[]
-;[]===========================================================[]
-;Procedure : Media check
-;
-;Function : Checking change line
-;
-;Input : C = 03h
-; A - Drive
-;Output : A = 00h disk no changed
-; A = 0FFh disk changed
-;
-;[]===========================================================[]
-;[]===========================================================[]
-;Procedure : Get BPB
-;
-;Function : Get Block Parameters BIOS
-;
-;Input : C = 04h
-; DE - Address
-;Output : None
-;
-;[]===========================================================[]
-;[]===========================================================[]
-;Procedure : Input
-;
-;Function : Input from disk
-;
-;Input : C = 05h
-; HL:IX - Logical Block (sector)
-; DE - Address
-; B - Sector count
-;Output : None
-;
-;[]===========================================================[]
-;[]===========================================================[]
-;Procedure : Output
-;
-;Function : Output to disk
-;
-;Input : C = 06h
-; HL:IX - Logical Block (sector)
-; DE - Address
-; B - Sector count
-;Output : None
-;
-;[]===========================================================[]
-;[]===========================================================[]
-;Procedure : Removable
-;
-;Function : Checking change line
-;
-;Input : C = 07h
-; A - Drive
-;Output : A = 00h Removable
-; A = FFh Nonremovable
-;
-;[]===========================================================[]
-;[]===========================================================[]
-;Procedure : Generic IOCTL
-;
-;Function : Generic Input Output Control
-;
-;Input : C = 08h
-; B - Subcommand
-; DE = 55AAh Magic Number
-; Subcommand
-;----------------------
-; 00h - Get Device Parameters
-; 01h - Read track
-; 02h - Test track
-; 80h - Set Device Parameters
-; 81h - Write track
-; 82h - Format track
-;Output :
-;
-;[]===========================================================[]
-;[]===========================================================[]
-;Procedure : Read Long
-;
-;Function : Reading sectors from disk
-;
-;Input : C = 0Ah
-; HL:IX - Logical Block (sector)
-; DE - Address
-; B - Sector count
-; A'- Page
-;Output : A'- Next Page
-; HL:IX - Next Logical Block (sector)
-; DE - Next Address
-;
-;[]===========================================================[]
-;[]===========================================================[]
-;Procedure : Write Long
-;
-;Function : Writing sectors to disk
-;
-;Input : C = 0Bh
-; HL:IX - Logical Block (sector)
-; DE - Address
-; B - Sector count
-; A'- Page
-;Output : A'- Next Page
-; HL:IX - Next Logical Block (sector)
-; DE - Next Address
-;
-;[]===========================================================[]
-;
-; Errors:
-; 0 (00h) - NO ERRORS
-; 1 (01h) - BAD COMMAND
-; 2 (02h) - BAD DRIVE NUMBER
-; 3 (03h) - UNKNOW FORMAT
-; 4 (04h) - NOT READY
-; 5 (05h) - SEEK ERROR
-; 6 (06h) - SECTOR NOT FOUND
-; 7 (07h) - CRC ERROR
-; 8 (08h) - WRITE PROTECT
-; 9 (09h) - READ ERROR
-; 10 (0Ah) - WRITE ERROR
-; 11 (0Bh) - FAILURE
-; 12 (0Ch) - BUSY (DEVICE OPENED)
-; 13 (0Dh) - RESERVED
-
-LD_DSK EQU 16
-
-IDE0 EQU #0C1C0
-IDE1 EQU #0C1C8
-PART EQU #C000
-
-HDDRIVE INC C
- DEC C
- JP Z,INIT_H ;#00
- DEC C
- JP Z,RESE_H ;#01
- DEC C
- JP Z,STAT_H ;#02
- DEC C
- JP Z,CHEK_H ;#03
- DEC C
- JP Z,GBPB_H ;#04
- DEC C
- JP Z,READH ;#05
- DEC C
- JP Z,WRITEH ;#06
- DEC C
- JP Z,REMOV_H ;#07
- DEC C
- JP Z,IOCTL_H ;#08
- DEC C
- JP Z,RESR_H ;#09
- DEC C
- JP Z,LREADH ;#0A
- DEC C
- JP Z,LWRITEH ;#0B
-RESR_H LD A,DSS_Error.drv.INVALID_COMMAND
- SCF
- RET
-
-;Commands for restart #18
-INIT_H PUSH IY
- LD HL,LOGDRV
- LD (OFFSECT),HL
- LD IX,DEVICE_CFG
- LD C,#5F
- RST ToBIOS
- XOR A
- LD B,(IX+2) ;HDD
- CP B
- JR Z,NO_HARDS
- LD C,#80
-NX_DVCI PUSH BC
- LD A,C
- LD (DRV),A
- CALL PARTIT
- POP BC
- INC C
- DJNZ NX_DVCI
-;R02
-;R02 LD A,#80
-;R02 LD (DRV),A
-;R02 LD C,SLOT3
-;R02 IN B,(C)
-;R02 LD A,SYSPAGE
-;R02 OUT (C),A
-;R02 LD HL,IDE0
-;R02 CALL YEP_DRV
-;R02 OUT (C),B
-;R02 CALL NZ,PARTIT
-;R02
-;R02 LD A,#81
-;R02 LD (DRV),A
-;R02 LD C,SLOT3
-;R02 IN B,(C)
-;R02 LD A,SYSPAGE
-;R02 OUT (C),A
-;R02 LD HL,IDE1
-;R02 CALL YEP_DRV
-;R02 OUT (C),B
-;R02 CALL NZ,PARTIT
-NO_HARDS
- POP IY
- LD HL,(OFFSECT)
- LD DE,LOGDRV
- XOR A
- SBC HL,DE
- RET Z
- LD DE,LD_DSK
-DRVCLC INC A
- SBC HL,DE
- JR NZ,DRVCLC
- AND A
- RET
-
-DEVICE_CFG EQU #4000
-; DB 0 ;LEN
-; DB 0 ;FDD COUNT
-; DB 0 ;HDD COUNT
-; DB 0 ;CDROM COUNT
-; DS 28 ;RESERVED
-
-YEP_DRV LD A,#FF
-; CP (HL)
-; RET NZ
- INC HL
- CP (HL)
- RET NZ
- INC HL
- CP (HL)
- RET NZ
- INC HL
- CP (HL)
- RET NZ
- INC HL
- CP (HL)
- RET NZ
- INC HL
- CP (HL)
- RET
-
-;+00 ;SECTORS PER TRACK
-;+01 ;TRACKS PER CYLLINDER
-;+02 ;RESERVED
-;+03 ;HDD/DRIVE/LBA
-;+04 ;SECTOR PER CYLINDER LOW
-;+05 ;SECTOR PER CYLINDER HIGH
-;+06 ;RESERVED
-;+07 ;RESERVED
-
-DRVHD_H EQU 0
-SC_PT_H EQU 1
-HEADS_H EQU 2
-CYL_L_H EQU 3
-CYL_H_H EQU 4
-SPCLL_H EQU 5
-SPCLH_H EQU 6
-
-
-;IDE0 DB #FF ;DRIVE/HEAD REGISTER ;00
-; DB #FF ;SECTORS PER TRACK ;01
-; DB #FF ;HEADS ;02
-; DB #FF ;CYLINDERS LOW ;03
-; DB #FF ;CYLINDERS HIGH ;04
-; DB #FF ;SECTOR PER CYLINDER LOW ;05
-; DB #FF ;SECTOR PER CYLINDER HIGH ;06
-; DB #FF ;RESERVED ;07
-
-;IDE1 DB #FF ;DRIVE/HEAD REGISTER ;00
-; DB #FF ;SECTORS PER TRACK ;01
-; DB #FF ;HEADS ;02
-; DB #FF ;CYLINDERS LOW ;03
-; DB #FF ;CYLINDERS HIGH ;04
-; DB #FF ;SECTOR PER CYLINDER LOW ;05
-; DB #FF ;SECTOR PER CYLINDER HIGH ;06
-; DB #FF ;RESERVED ;07
-
-LOGDRV DS 12*LD_DSK
-;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
-;+01 LONG SECTOR OFFSET
-;+05 LONG SIZE IN SECTORS
-;+09 FREE
-;+15
-
-SELHDD PUSH DE
- PUSH BC
- PUSH HL
- LD L,A
- LD H,0
- ADD HL,HL
- ADD HL,HL
- ADD HL,HL
- ADD HL,HL
- EX DE,HL
- LD IY,LOGDRV
- ADD IY,DE
- LD C,(IY+1)
- LD B,(IY+2)
- LD E,(IY+3)
- LD D,(IY+4)
- POP HL
- ADD IX,BC
- ADC HL,DE
- LD A,(IY+0) ;DRIVE NUMBER
- POP BC
- POP DE
- RET
-
-; 00 - GET DEVICE PARAMETERS
-; 01 - READ TRACK
-; 02 - TEST TRACK
-; 80 - SET DEVICE PARAMETERS
-; 81 - WRITE TRACK
-; 82 - FORMAT TRACK
-
-
-IOCTL_H BIT 7,B
- JR NZ,O_CTL_H
- INC B
- DEC B
- JP Z,HGETPRM
- DEC B
- JP Z,HRDTRAC
- DEC B
- JP Z,HCHTRAC
- LD A,DSS_Error.drv.INVALID_COMMAND
- SCF
- RET
-
-O_CTL_H RES 7,B
- INC B
- DEC B
- JP Z,HSETPRM
- DEC B
- JP Z,HWRTRAC
- DEC B
- JP Z,HFRTRAC
- LD A,DSS_Error.drv.INVALID_COMMAND
- SCF
- RET
-
-HRDTRAC LD A,DSS_Error.drv.GENERAL_FAILURE
- SCF
- RET
-
-HCHTRAC LD B,L
- CALL CHECKH
- RET
-
-HSETPRM AND A
- RET
-
-HWRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE
- SCF
- RET
-
-HFRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE
- SCF
- RET
-
-; HL:DE - SECTORS ON LOGICAL DISK
-; HL' - CYLINDERS ON PHISICAL DISK
-; DE' - HEADS ON PHISICAL DISK
-; BC' - SECTORS PER TRACK ON PHISICAL DISK
-; A' - PHISICAL DRIVE NUMBER
-; A - DRIVE/HEAD REGISTER PHISICAL DISK
-; D0...D3 - "0" RESERVED (MAY BE OTHER)
-; D4 - DEVICE MASTER/SLAVE
-; D5 - "1" RESERVED
-; D6 - ADDRESSING MODE LBA/CHS
-; D7 - "1" RESERVED
-
-HGETPRM EX DE,HL
- LD BC,#55AA
- AND A
- SBC HL,BC
- LD L,A
- LD A,DSS_Error.drv.GENERAL_FAILURE
- SCF
- RET NZ
- PUSH IY
- LD H,0
- ADD HL,HL
- ADD HL,HL
- ADD HL,HL
- ADD HL,HL
- LD B,H
- LD C,L
- LD IY,LOGDRV ;!FIXIT нахрена тут индексный?
- ADD IY,BC
- LD E,(IY+5)
- LD D,(IY+6)
- LD L,(IY+7)
- LD H,(IY+8)
-
- LD A,(IY+0)
- LD C,A
- LD IY,IDE0 ;!FIXIT IDE CHANELS тут всего 2 канала работают
- AND #0F
- JR Z,GELH1
- LD IY,IDE1
-GELH1 IN A,(SLOT3)
- PUSH AF
- LD A,SYS_PAGE
- OUT (SLOT3),A
-
- LD A,(IY+DRVHD_H) ;HDD/DRV
- EXX
- LD L,(IY+CYL_L_H) ;CYLINDER LOW
- LD H,(IY+CYL_H_H) ;CYLINDER HIGH
- LD E,(IY+HEADS_H) ;HEADS
- LD D,0
- LD C,(IY+SC_PT_H) ;SECTORS
- LD B,0
- EXX
- EX AF,AF'
- POP AF
- OUT (SLOT3),A
- LD A,C
- EX AF,AF'
- POP IY
- AND A
- RET
-
-REMOV_H LD A,1
- AND A
- RET
-
-RESE_H XOR A
- RET
-
-STAT_H XOR A
- RET
-
-CHEK_H LD A,#FF
- AND A
- RET
-
-;HL:IX - SECTOR
-; DE - ADDRESS
-
-GBPB_H PUSH IY
- PUSH DE
- LD L,A
- LD H,0
- ADD HL,HL
- ADD HL,HL
- ADD HL,HL
- ADD HL,HL
- LD B,H
- LD C,L
- LD IY,LOGDRV
- ADD IY,BC
- LD E,(IY+1)
- LD D,(IY+2)
- LD L,(IY+3)
- LD H,(IY+4)
- LD XL,E
- LD XH,D
- LD A,(IY+0)
- POP DE
- POP IY
- LD BC,#0155
- RST ToBIOS
- RET
-
-;HL:IX - SECTOR
-; DE - ADDRESS
-; B - COUNTER
-; A'- PAGE
-;READ SECTOR
-LREADH PUSH IY
- CALL SELHDD
- LD C,#52 ; A - HDD NUMBER +128
- RST ToBIOS
- POP IY
- RET
-
-;HL:IX - SECTOR
-; DE - ADDRESS
-; B - COUNTER
-; A'- PAGE
-;WRITE SECTOR
-LWRITEH PUSH IY
- CALL SELHDD
- LD C,#53 ; A - HDD NUMBER +128
- RST ToBIOS
- POP IY
- RET
-
-;HL:IX - SECTOR
-; DE - ADDRESS
-; B - COUNTER
-;WRITE SECTOR
-WRITEH PUSH IY
- CALL SELHDD
- LD C,#56 ; A - HDD NUMBER +128
- RST ToBIOS
- POP IY
- RET
-
-;HL:IX - SECTOR
-; DE - ADDRESS
-; B - COUNTER
-;READ SECTOR
-READH PUSH IY
- CALL SELHDD
- LD C,#55 ; A - HDD NUMBER +128
- RST ToBIOS
- POP IY
- RET
-
-;HL:IX - SECTOR
-; DE - ADDRESS
-; B - COUNTER
-;CHECK SECTOR
-CHECKH PUSH IY
- CALL SELHDD
- LD C,#54 ; A - HDD NUMBER +128
- RST ToBIOS
- POP IY
- RET
-
-;-----------------
-EASYDOS
-MEDIDOS
-HIGHDOS LD E,(IY+08)
- LD D,(IY+09)
- LD L,(IY+10)
- LD H,(IY+11)
- LD IX,(CURSECL)
- ADD IX,DE
- LD DE,(CURSECH)
- ADC HL,DE
- LD D,XH
- LD E,XL
- LD IX,(OFFSECT)
- LD (IX+1),E ;BPB SECTOR
- LD (IX+2),D
- LD (IX+3),L
- LD (IX+4),H
-; LD DE,(CURSECL)
-; LD HL,(CURSECH)
-; LD (IX+1),E ;START DISK
-; LD (IX+2),D
-; LD (IX+3),L
-; LD (IX+4),H
- LD E,(IY+12)
- LD D,(IY+13)
- LD L,(IY+14)
- LD H,(IY+15)
- LD (IX+5),E ;SIZE DISK
- LD (IX+6),D
- LD (IX+7),L
- LD (IX+8),H
- LD A,(DRV)
- LD (IX+0),A
- LD DE,LD_DSK ; DSKITEM
- ADD IX,DE
- LD (OFFSECT),IX
-NXTPART LD DE,#10
- ADD IY,DE
- POP BC
- DJNZ DOSAGA
- AND A
- RET
-
-PARTIT IN A,(SLOT3)
- PUSH AF
- LD A,#FF
- OUT (SLOT3),A
- CALL PARTIT1
- POP AF
- OUT (SLOT3),A
- RET
-
-PARTIT1 LD IX,0
- LD DE,0
- LD (EXTDOSL),DE ;R01
- LD (EXTDOSH),IX ;R01
-PARTIT2 LD (CURSECL),DE
- LD (CURSECH),IX
- CALL LOADSEC
- LD HL,(PART+510)
- LD DE,#AA55
- AND A
- SBC HL,DE
- JR NZ,NODEFIN
- LD IY,PART+#01BE
- LD B,4
-DOSAGA PUSH BC
- LD A,(IY+4)
- CP 5
- JR NZ,NOEXTDS
-SUBLEV PUSH IY
- LD DE,(CURSECL)
- LD IX,(CURSECH)
- PUSH DE
- PUSH IX
- CALL EXTDOS
- POP IX
- POP DE
- LD (CURSECL),DE
- LD (CURSECH),IX
- CALL LOADSEC
- POP IY
- JP NXTPART
-NOEXTDS CP #0F
- JP Z,SUBLEV
- CP #0E
- JP Z,HIGHDOS
- CP 6
- JP Z,HIGHDOS
- CP 4
- JP Z,MEDIDOS
- CP 1
- JP Z,EASYDOS
- POP BC
- OR A
- RET Z
-NODEFIN SCF
- RET
-
-EXTDOS
- LD HL,(EXTDOSL)
- LD DE,(EXTDOSH)
- LD A,L
- OR H
- OR E
- OR D
- LD E,(IY+08)
- LD D,(IY+09)
- LD L,(IY+10)
- LD H,(IY+11)
- JP NZ,EXTDOS2
- LD (EXTDOSL),DE
- LD (EXTDOSH),HL
- LD IX,(EXTDOSH)
- JP PARTIT2
-
-EXTDOS2 LD IX,(EXTDOSL)
- ADD IX,DE
- PUSH IX
- LD DE,(EXTDOSH)
- ADC HL,DE
- PUSH HL
- POP IX
- POP DE
- JP PARTIT2
-
-LOADSEC PUSH IY
- LD IX,(CURSECL)
- LD HL,(CURSECH)
- LD DE,PART
- LD BC,#0155
- LD A,(DRV)
- RST ToBIOS
- POP IY
- RET
-
-DRV DB #00 ;PHISICAL DRIVE NUMBER
-
-CURSECL DW #0000 ;CURRENT SECTOR LOADED
-CURSECH DW #0000
-
-EXTDOSL DW #0000 ;CURRENT PARTITION TABLE
-EXTDOSH DW #0000
-
-OFFSECT DW LOGDRV ;POINTER ON CURRENT DISK RECORD
-
-;=======================================================
\ No newline at end of file
diff --git a/DSS/INTMOUSE.ASM b/DSS/INTMOUSE.ASM
deleted file mode 100644
index c2d0432..0000000
--- a/DSS/INTMOUSE.ASM
+++ /dev/null
@@ -1,920 +0,0 @@
-
-;[BEGIN]
-;//MODULE: INTMOUSE
-;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
-;//UPDATE: 24-10-1999 DNS Restore module
-
-CMOUSE EQU #1B ; !FIXIT на sp2000.inc
-DMOUSE EQU #1A ; !FIXIT на sp2000.inc
-
-; MOUSE SOFTWARE SPECIFICATION
-;---------------------------------------------
-; COMMAND 00h (INITIALIZATION)
-;
-; RETURN: NC - MOUSE PRESENT
-; C - MOUSE ABSENT
-;---------------------------------------------
-; COMMAND 01h (SHOW MOUSE CURSOR)
-;
-; RETURN: NC - DONE
-; C - MOUSE ON SCREEN
-;---------------------------------------------
-; COMMAND 02h (HIDE MOUSE CURSOR)
-;
-; RETURN: NC - DONE
-; C - NONE MOUSE
-;---------------------------------------------
-; COMMAND 03h (READ MOUSE STATE)
-;
-; RETURN: HL - X COORD
-; DE - Y COORD
-; A - BUTTONS D2-D0 (MIDDLE,RIGHT,LEFT)
-;---------------------------------------------
-; COMMAND 04h (GOTO MOUSE CURSOR)
-;
-; INPUT: HL - X COORD
-; DE - Y COORD
-;---------------------------------------------
-; COMMAND 05h (RESERVED)
-;---------------------------------------------
-; COMMAND 06h (RESERVED)
-;---------------------------------------------
-; COMMAND 07h (SET VERT. BOUNDS)
-;
-; INPUT: HL - Y MIN
-; DE - Y MAX
-;---------------------------------------------
-; COMMAND 08h (SET HORZ. BOUNDS)
-;
-; INPUT: HL - X MIN
-; DE - X MAX
-;---------------------------------------------
-; COMMAND 09h (LOAD CURSOR)
-;
-; INPUT: IX - CURSOR IMAGE
-; H - HEIGHT CURSOR
-; L - WIDTH CURSOR
-; D - Y HOT SPOT
-; E - X HOT SPOT
-; B = 0
-;---------------------------------------------
-; COMMAND 0Ah (SET CURSOR IN TEXT MODES)
-;
-; INPUT: H - AND SIMBOL MASK
-; L - XOR SIMBOL MASK
-; D - AND ATTRIBUT MASK
-; E - XOR ATTRIBUT MASK
-; B = 0
-;---------------------------------------------
-; COMMAND 0Bh (RETURN CURSOR)
-;
-; INPUT: IX - CURSOR IMAGE BUFFER
-; OUTPUT: H - HEIGHT CURSOR
-; L - WIDTH CURSOR
-; D - Y HOT SPOT
-; E - X HOT SPOT
-;---------------------------------------------
-; COMMAND 0Ch (RESERVED)
-;---------------------------------------------
-; COMMAND 0Dh (RESERVED)
-;---------------------------------------------
-; COMMAND 0Eh (GET SENSETIVE)
-; OUTPUT: H - VERTICAL SENSETIVE
-; L - HORIZONTAL SENSETIVE
-;---------------------------------------------
-; COMMAND 0Fh (SET SENSETIVE)
-; INPUT: H - VERTICAL SENSETIVE
-; L - HORIZONTAL SENSETIVE
-;---------------------------------------------
-; COMMAND 80h (MOUSE HARDWARE INTERRUPT)
-;---------------------------------------------
-; COMMAND 81h (CHANGE VIDEO MODE)
-; INPUT: A - MODE
-;---------------------------------------------
-; COMMAND 82h (RESERVED)
-;---------------------------------------------
-; COMMAND 83h (MOUSE REFRESH)
-;---------------------------------------------
-; ERRORS: 0 - NO ERROR
-; 1 - COMMAND NOT PRESENT
-; 2 - DEVICE ABSENT
-; 3 - CURSOR ON (UZHE)
-; 4 - CURSOR OFF (UZHE)
-; 5 - CURSOR IMAGE VERY BIG
-
-INTMOUS BIT 7,C
- JP NZ,EMOUSE
- INC C
- DEC C
- JP Z,MS_INIT
- DEC C
- JP Z,MS_SHOW
- DEC C
- JP Z,MS_HIDD
- DEC C
- JP Z,MS_READ
- DEC C
- JP Z,MS_GOTO
- DEC C
- JP Z,MS_RESR
- DEC C
- JP Z,MS_RESR
- DEC C
- JP Z,MS_VERT
- DEC C
- JP Z,MS_HORZ
- DEC C
- JP Z,MS_CURS
- DEC C
- JP Z,MS_MASK
- DEC C
- JP Z,MS_BCUR
- DEC C
- JP Z,MS_RESR
- DEC C
- JP Z,MS_RESR
- DEC C
- JP Z,MS_GSEN
- DEC C
- JP Z,MS_SENT
-MS_RESR LD A,DSS_Error.mouse.INVALID_COMMAND
- SCF
- RET
-
-EMOUSE RES 7,C
- INC C
- DEC C
- JP Z,M_INT
- DEC C
- JP Z,M_MODE
- DEC C
- JR Z,M_RESR
- DEC C
- JP Z,M_REFR
-M_RESR LD A,DSS_Error.mouse.INVALID_COMMAND
- SCF
- RET
-
-MS_INIT DI
- LD A,85
- OUT (#10),A
- LD A,45
- OUT (#10),A
- XOR A ;LD A,0
- OUT (CMOUSE),A
- INC A ;LD A,1
- OUT (CMOUSE),A
- DEC A ;LD A,0
- OUT (CMOUSE),A
- LD A,3
- OUT (CMOUSE),A
- LD A,#41
- OUT (CMOUSE),A
- LD A,4
- OUT (CMOUSE),A
- LD A,#47
- OUT (CMOUSE),A
- LD A,5
- OUT (CMOUSE),A
- LD A,#E0
- OUT (CMOUSE),A
- EI
- XOR A
- RET
-
-MS_SHOW PUSH IX
- PUSH HL
- PUSH DE
- EX AF,AF'
- PUSH AF
- LD HL,(PIX_X)
- LD DE,(PIX_Y)
- DI
- CALL MOUSE
- XOR A
- LD (REFRESH+1),A
- EI
- POP AF
- EX AF,AF'
- POP DE
- POP HL
- POP IX
- XOR A
- RET
-
-MS_HIDD PUSH IX
- PUSH HL
- PUSH DE
- EX AF,AF'
- PUSH AF
- DI
- LD A,1
- LD (REFRESH+1),A
- CALL RESTORE
- EI
- POP AF
- EX AF,AF'
- POP DE
- POP HL
- POP IX
- XOR A
- RET
-
-MS_READ LD HL,(PIX_X)
- LD DE,(PIX_Y)
- LD A,(MB)
- AND A
- RET
-
-MS_GOTO PUSH IX
- PUSH HL
- PUSH DE
- LD (PIX_X),HL
- LD (PIX_Y),DE
- EX AF,AF'
- PUSH AF
- DI
- CALL REFRESH
- EI
- POP AF
- EX AF,AF'
- POP DE
- POP HL
- POP IX
- XOR A
- RET
-
-MS_CURS PUSH BC
- PUSH DE
- PUSH HL
- PUSH IX
- LD A,L
- LD (M_XSIZE),A
- LD A,H
- LD (M_YSIZE),A
- LD C,E
- LD B,0
- LD (XHOT_SP),BC
- LD C,D
- LD B,0
- LD (YHOT_SP),BC
- EXX
- LD A,(M_XSIZE)
- LD C,A
- LD B,0
- LD A,(M_YSIZE)
- LD HL,0
-MSCURS1 ADD HL,BC
- DEC A
- JR NZ,MSCURS1
- PUSH HL
- LD BC,M_IMAGE.Size+1
- AND A
- SBC HL,BC
- CCF
- EXX
- POP BC
- POP HL
- LD A,5
- JR C,NOLOADM
- LD DE,M_IMAGE
- DI
- LDIR
- XOR A
-NOLOADM POP HL
- POP DE
- POP BC
- EI
- RET
-
-MS_BCUR PUSH IX
- EXX
- LD A,(M_XSIZE)
- LD C,A
- LD B,0
- LD A,(M_YSIZE)
- LD HL,0
-MSBCUR1 ADD HL,BC
- DEC A
- JR NZ,MSBCUR1
- PUSH HL
- LD BC,M_IMAGE.Size+1
- AND A
- SBC HL,BC
- CCF
- EXX
- POP BC
- POP HL
- LD A,5
- JR C,NOSAVEM
- LD DE,M_IMAGE
- EX DE,HL
- DI
- LDIR
- LD A,(M_XSIZE)
- LD L,A
- LD A,(M_YSIZE)
- LD H,A
- LD BC,(XHOT_SP)
- LD E,C
- LD BC,(YHOT_SP)
- LD D,C
- LD BC,0
- XOR A
-NOSAVEM EI
- RET
-
-MS_HORZ
- LD (MIN_X),HL
- LD (MAX_X),DE
- XOR A
- RET
-
-MS_VERT
- LD (MIN_Y),HL
- LD (MAX_Y),DE
- XOR A
- RET
-
-MS_MASK
- LD (ANDXORS),HL
- LD (ANDXORA),DE
- XOR A
- RET
-
-; H - VERTICAL SENSETIVE
-; L - HORIZONTAL SENSETIVE
-
-MS_SENT
- LD (SENSEXY),HL
- XOR A
- RET
-
-MS_GSEN
- LD HL,(SENSEXY)
- XOR A
- RET
-
-MOUSET LD (REST_XT+1),HL
- LD (REST_YT+1),DE
-;Y
- SRL D
- RR E
- SRL D
- RR E
- SRL D
- RR E
- LD D,E
-;X
- SRL H
- RR L
- SRL H
- RR L
- SRL H
- RR L
- LD E,L
-
- IN A,(PORT_Y)
- LD XH,A
- IN A,(SLOT1)
- LD XL,A
-;
- DI
-;
- LD A,#54
- OUT (SLOT1),A
-;
- LD A,D
- ADD A,A
- ADD A,A ;Y * 4
- LD L,A
- LD H,#43 ;+ #4300
-;
- IN A,(RGMOD)
- RRCA
- AND #80
- OR #01
- ADD A,E
- OUT (PORT_Y),A
- INC L
- LD A,(HL) ;SIMBOL
- LD BC,(ANDXORS)
- AND B
- XOR C
- LD (HL),A
- INC L
- LD A,(HL) ;ATTRIBUT
- LD BC,(ANDXORA)
- AND B
- XOR C
- LD (HL),A
-;
- LD A,XL
- OUT (SLOT1),A
- LD A,XH
- OUT (PORT_Y),A
- RET
-
-RESTORT
-REST_XT LD HL,#0000
-REST_YT LD DE,#0000
-;Y
- SRL D
- RR E
- SRL D
- RR E
- SRL D
- RR E
- LD D,E
-;X
- SRL H
- RR L
- SRL H
- RR L
- SRL H
- RR L
- LD E,L
-
- IN A,(PORT_Y)
- LD XH,A
- IN A,(SLOT1)
- LD XL,A
-;
- DI
-;
- LD A,#50
- OUT (SLOT1),A
-;
- LD A,D
- ADD A,A
- ADD A,A ;Y * 4
- LD L,A
- LD H,#43 ;+ #4300
-;
- IN A,(RGMOD)
- RRCA
- AND #80
- OR #01
- ADD A,E
- OUT (PORT_Y),A
- INC L
- LD A,(HL) ;SIMBOL
- LD (HL),A
- INC L
- LD A,(HL) ;ATTRIBUT
- LD (HL),A
-;
- LD A,XL
- OUT (SLOT1),A
- LD A,XH
- OUT (PORT_Y),A
- RET
-
-RESTORE:
-.sw+1: LD A,#00
- BIT 7,A
- JP Z,RESTORT
-RESTORG IN A,(SLOT3)
- LD B,A
- IN A,(PORT_Y)
- LD C,A
- PUSH BC
- LD A,#50
- OUT (SLOT3),A
-REST_X LD HL,0
-REST_Y LD DE,0
- LD A,E
- EX AF,AF'
-REST_V LD A,#00
- AND 1
- LD DE,#C000 ;screen 0
- JR Z,AA2
- LD DE,#C000+320 ;screen 1
-AA2 ADD HL,DE
-REST_A LD A,0
- LD XH,A
- EX AF,AF'
-REST_H
-RS002 LD BC,10
- OUT (PORT_Y),A
- EX AF,AF'
- LD (PUSH_HL),HL
- LD D,H
- LD E,L
- LDIR
-PUSH_HL+1: LD HL,#0000
-; POP HL
- EX AF,AF'
- INC A
- JR Z,RS003
- DEC XH
- JR NZ,RS002
-RS003 POP BC
- LD A,B
- OUT (SLOT3),A
- LD A,C
- OUT (PORT_Y),A
- XOR A
- RET
-
-;HL/DE - X/Y
-
-MOUSE LD A,(MODE_M)
- LD (RESTORE.sw),A
- BIT 7,A
- JP Z,MOUSET
-MOUSEG CP #82 ;640x256x16
- JR NZ,NOFX
- SRL H
- RR L
-NOFX LD IX,M_IMAGE
- LD A,(M_XSIZE)
- LD C,A
- LD B,0
- LD (REALXS),BC
- LD (REST_H+1),BC
- LD C,B
- LD (SKIPXF),BC
- LD A,(M_YSIZE)
- LD (REST_A+1),A
- LD C,A
- LD B,0
- LD (REALYS),BC
- LD BC,(YHOT_SP)
- LD A,E
- SUB C
- LD E,A
- JR NC,GOODY
- NEG
- LD E,A
- LD A,(M_XSIZE)
- LD C,A
- LD B,0
- LD A,(M_YSIZE)
- SUB E
-SKIPMY ADD IX,BC
- DEC E
- JR NZ,SKIPMY
- LD C,A
- LD (REALYS),BC
-GOODY LD BC,(XHOT_SP)
- AND A
- SBC HL,BC
- JR NC,GOODX
- LD B,H
- LD C,L
- LD HL,0
- AND A
- SBC HL,BC
- LD (SKIPXF),HL
- LD A,(M_XSIZE)
- SUB L
- LD L,A
- LD (REALXS),HL
- LD HL,0
-GOODX LD (REST_X+1),HL
- LD (REST_Y+1),DE
-
- PUSH HL
- IN A,(SLOT3)
- LD H,A
- IN A,(PORT_Y)
- LD L,A
- EX (SP),HL
- LD A,#5C
- OUT (SLOT3),A
- LD A,E
- EX AF,AF'
- IN A,(RGMOD)
- LD (REST_V+1),A
- AND 1
- LD DE,#C000 ;PAGE 0
- JR Z,AA1
- LD DE,#C000+320 ;PAGE 1
-AA1 ADD HL,DE
- LD D,XH
- LD E,XL
- EX DE,HL ;HL - BITMAP
- LD BC,(REALYS)
- LD XH,C
- EX AF,AF'
-MS002 LD BC,(SKIPXF)
- ADD HL,BC
- LD BC,(REALXS)
- OUT (PORT_Y),A
- EX AF,AF'
- ;USH DE
- LD (PUSH_DE+1),DE
- LDIR
-PUSH_DE LD DE,#0000
-; POP DE
- EX AF,AF'
- INC A
- JR Z,MS003
- DEC XH
- JR NZ,MS002
-MS003 POP BC
- LD A,B
- OUT (SLOT3),A
- LD A,C
- OUT (PORT_Y),A
- XOR A
- RET
-
-READ_M IN A,(CMOUSE)
- RRCA
- RET NC
- IN A,(DMOUSE)
- LD L,A
- BIT 6,A
- CCF
- RET Z
-TST_01 IN A,(CMOUSE)
- RRCA
- JP NC,TST_01
- IN A,(DMOUSE)
- LD E,A
- BIT 6,A
- CCF
- RET NZ
-TST_02 IN A,(CMOUSE)
- RRCA
- JR NC,TST_02
- IN A,(DMOUSE)
- LD D,A
- BIT 6,A
- CCF
- RET NZ
- LD A,E
- AND #3F
- LD E,A
- LD A,L
- AND #03
- RRCA
- RRCA
- OR E
- LD E,A
- LD A,D
- AND #3F
- LD D,A
- LD A,L
- AND #0C
- RRCA
- RRCA
- RRCA
- RRCA
- OR D
- LD D,A
- LD A,L
- RLCA
- RLCA
- RLCA
- RES 6,A
- JR NC,STBU
- SET 6,A
-STBU RLCA
- RLCA
- AND #03
- LD (MB),A
- CALL SENSE
- LD A,E
- LD (MX),A
- LD A,D
- LD (MY),A
- SCF
- RET
-
-MCORECT LD HL,(PIX_X)
- LD DE,(MX)
- LD D,0
- BIT 7,E
- JR NZ,DECX
- ADD HL,DE
- LD (PIX_X),HL
- EX DE,HL
- LD HL,(MAX_X)
- AND A
- SBC HL,DE
- JP NC,YCOO
- LD HL,(MAX_X)
- LD (PIX_X),HL
- JP YCOO
-DECX LD A,E
- NEG
- LD E,A
- AND A
- SBC HL,DE
- LD (PIX_X),HL
- JR C,YCOO2
- LD DE,(MIN_X)
- SBC HL,DE
- JR NC,YCOO
-YCOO2 LD HL,(MIN_X)
- LD (PIX_X),HL
-
-YCOO LD HL,(PIX_Y)
- LD DE,(MY)
- LD D,0
- BIT 7,E
- JR NZ,DECY
- ADD HL,DE
- LD (PIX_Y),HL
- EX DE,HL
-
- LD HL,(MAX_Y)
- AND A
- SBC HL,DE
- RET NC
- LD HL,(MAX_Y)
- LD (PIX_Y),HL
- RET
-
-DECY LD A,E
- NEG
- LD E,A
- AND A
- SBC HL,DE
- LD (PIX_Y),HL
- JR C,XCOO
- LD DE,(MIN_Y)
- SBC HL,DE
- RET NC
-XCOO LD HL,(MIN_Y)
- LD (PIX_Y),HL
- RET
-
-SENSE LD HL,(SENSEXY)
- LD A,L
- OR L
- RET Z
- DEC A
- RET Z
- LD A,E
- BIT 7,A
- LD B,#FF
- JR Z,SEN1
- LD B,#7F
- NEG
-SEN1 INC B
- SUB L
- JR NC,SEN1
- BIT 7,B
- JR Z,SEN2
- LD A,B
- RES 7,A
- NEG
- LD B,A
-SEN2 LD E,B
- LD A,D
- BIT 7,A
- LD B,#FF
- JR Z,SEN3
- LD B,#7F
- NEG
-SEN3 INC B
- SUB H
- JR NC,SEN3
- BIT 7,B
- JR Z,SEN4
- LD A,B
- RES 7,A
- NEG
- LD B,A
-SEN4 LD D,B
- RET
-
-M_MODE LD (MODE_M),A
- OR A
- JR Z,UNKMODE
- CP 1
- JR Z,UNKMODE
- CP 2
- JR Z,S320256
- CP 3
- JR Z,S640256
- BIT 7,A
- JR Z,UNKMODE
- RES 7,A
- CP 1
- JR Z,S320256
- CP 2
- JR Z,S640256
-UNKMODE XOR A ; ????? может тут надо .INVALID_COMMAND ?
- SCF
- RET
-
-S320256
- LD HL,0 ;MIN X
- LD DE,319 ;MAX X
- CALL MS_HORZ
- LD HL,0 ;MIN X
- LD DE,255 ;MAX X
- CALL MS_VERT
- XOR A
- RET
-
-S640256
- LD HL,0 ;MIN X
- LD DE,639 ;MAX X
- CALL MS_HORZ
- LD HL,0 ;MIN X
- LD DE,255 ;MAX X
- CALL MS_VERT
- XOR A
- RET
-
-;Mouse Interrupt
-M_INT IN A,(SLOT3)
- LD B,A
- IN A,(PORT_Y)
- LD C,A
- PUSH BC
- CALL REFRESH ;Refresh mouse
- CALL CONTROL
- POP BC
- LD A,B
- OUT (SLOT3),A
- LD A,C
- OUT (PORT_Y),A
- RET
-
-M_REFR CALL CONTROL
- AND A
- RET
-
-CONTROL CALL READ_M
- RET NC
- CALL MCORECT
- LD A,#00
- LD (REDY+1),A
- RET
-
-REFRESH LD A,#01
- OR A
- RET NZ
-REDY LD A,#00
-; OR A
-; RET NZ
- CALL RESTORE
- LD HL,(PIX_X)
- LD DE,(PIX_Y)
- CALL MOUSE
- LD A,#FF
- LD (REDY+1),A
- RET
-
-MODE_M DB #03
-
-PIX_X DW 160
-PIX_Y DW 128
-
-MX DB #00
-MY DB #00
-MB DB #00
-MB_OLD DB #00 ; !FIXIT - не нужно?
-MIN_X DW 0
-MAX_X DW 319
-MIN_Y DW 0
-MAX_Y DW 255
-SENSEXY
-SENSE_X DB 0
-SENSE_Y DB 0
-
-XHOT_SP DW 0
-YHOT_SP DW 0
-
-ANDXORS DW #FF00
-ANDXORA DW #FF77
-
-M_XSIZE DB 10
-M_YSIZE DB 14
-SKIPXF DW 0
-REALXS DW 0
-REALYS DW 0
-
-Xx EQU #00
-Ww EQU #FE
-Nn EQU #FF
-
-;MS_BMP
-M_IMAGE:
- DB Xx,Xx,Nn,Nn,Nn,Nn,Nn,Nn,Nn,Nn
- DB Xx,Ww,Xx,Nn,Nn,Nn,Nn,Nn,Nn,Nn
- DB Xx,Ww,Ww,Xx,Nn,Nn,Nn,Nn,Nn,Nn
- DB Xx,Ww,Ww,Ww,Xx,Nn,Nn,Nn,Nn,Nn
- DB Xx,Ww,Ww,Ww,Ww,Xx,Nn,Nn,Nn,Nn
- DB Xx,Ww,Ww,Ww,Ww,Ww,Xx,Nn,Nn,Nn
- DB Xx,Ww,Ww,Ww,Ww,Ww,Ww,Xx,Nn,Nn
- DB Xx,Ww,Ww,Ww,Ww,Xx,Xx,Xx,Xx,Nn
- DB Xx,Ww,Ww,Xx,Ww,Xx,Nn,Nn,Nn,Nn
- DB Xx,Ww,Xx,Xx,Ww,Ww,Xx,Nn,Nn,Nn
- DB Xx,Xx,Nn,Nn,Xx,Ww,Xx,Nn,Nn,Nn
- DB Xx,Nn,Nn,Nn,Xx,Ww,Ww,Xx,Nn,Nn
- DB Nn,Nn,Nn,Nn,Nn,Xx,Xx,Nn,Nn,Nn
- DB Nn,Nn,Nn,Nn,Nn,Nn,Nn,Nn,Nn,Nn
- BLOCK 256-($-M_IMAGE),0
-.Size EQU $-M_IMAGE
-
-;//MODULE: INTMOUSE
-;[END]
-
diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM
index 48bf466..76c73f3 100644
--- a/DSS/KEYINTER.ASM
+++ b/DSS/KEYINTER.ASM
@@ -1,63 +1,85 @@
+; MODULE KEYINTER
;[BEGIN]
-;//MODULE: KEYINTER
+;//MODULE: KEYINTER Keyboard Scan Codes: Set 2
;//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
+ _mInfoALIGN 256,0
+SBUF: BLOCK 64,0
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-HEAD DB #00
-HOST DB #00
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; _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 ;;
+.Size EQU $-XLAT_T ;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-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
+HEAD DB #00
+HOST DB #00
+;
+K_LOCK EQU $-KEYFLAG
+LANG_L EQU 7
+PAUSE_L EQU 6
+RES5_L EQU 5 ; not used ;X_SHIFT
+RES4_L EQU 4 ; not used
+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
+CTRL_SHIFT EQU 0 ; ctrl+shift = change language
+KEY_FLG 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
+;
+UnCODE EQU $-KEYFLAG
+UNCODE DW 0 ; последняя отжатая клавиша
; D15 - LShift
; D14 - RShift
@@ -68,7 +90,7 @@ SF_BUFF EQU 0
; D9 - RCTRL
; D8 - RALT
; D7 - Language Lock
-; D6 - Reserved
+; D6 - Pause Lock
; D5 - Reserved
; D4 - Reserved
; D3 - Num Lock
@@ -87,68 +109,89 @@ SF_BUFF EQU 0
; 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
+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
+SCANKEY: LD HL,HOST
+ LD A,(HEAD)
+ CP (HL)
+ RET Z
+ CALL GETSYM
+ LD A,E
+ RET
;
;
- IF CLASSIC_CURSOR ;------------------------------;
+; 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
+; ECHOKEY: ;R01
+; .CURCOUNT+1: LD A,#FF
+; INC A
+; LD (.CURCOUNT),A
+; AND #FF
+; JR NZ,.NOTUR
+; .CURSYM+1: LD A,#00
+; XOR #01
+; LD (.CURSYM),A
+
+; CALL CURSOR
+; PUSH DE
+
+; LD A," "
+; JR Z,.CURSKI
+; LD A,"_"
+; .CURSKI: CALL PUTCHAR.NO_SCROLL ;R03; [x] -bug with Vasil's version of cursor
+
+; POP DE
+; CALL LOCATE
+; ;LD A,8 ; BACKSPACE
+; ;CALL PUTCHAR
+; .NOTUR: CALL SCANKEY
+; JR Z,ECHOKEY
+; PUSH DE
+; PUSH BC
+; PUSH AF
+
+; CALL CURSOR
+; PUSH DE
+
+; LD A," "
+; CALL PUTCHAR.NO_SCROLL ;R03; [x] -bug with Vasil's version of cursor
+
+; ;LD A,8 ; BACKSPACE
+; ;CALL PUTCHAR
+; POP DE
+; POP AF
+; PUSH DE
+; ;R01 [v]
+; CALL PUTCHAR.NO_SCROLL ; [x] -bug with Vasil's version of cursor
+
+; POP DE
+; CALL LOCATE
+
+; POP BC
+; POP DE
+; LD A,E
+; AND A
+; RET
- ELSE ;------------------------------;
+; ELSE ;------------------------------;
-delay_curs: EQU 11 ; частота мигания курсора
-INS_CUR_ZG: EQU #19
-CURSOR_ZG: EQU #1A
+
+;------; !FIXIT брать значения для знакогенератора из биоса?
+delay_curs: EQU 11 ; частота мигания курсора
+INS_CUR_ZG: EQU #9B ; [x] 14/03/2025 был баг для графических экранов режима спектрума
+CURSOR_ZG: EQU #5B ; [x] 14/03/2025 был баг для графических экранов режима спектрума
NORM_ZG: EQU #1B
-
+;------;
ECHOKEY: CALL Cursor_On ; вкл. курсор, установить фокус на "Input Line"
EI
@@ -159,42 +202,58 @@ ECHOKEY: CALL Cursor_On ;
PUSH AF
CALL Cursor_Off ; выкл. курсор
POP AF
- OR A ; добавил
- CALL NZ,PUTCHAR ; вывод "a" на экран
- POP BC
+ OR A
+ ; [x] -bug with Vasil's version of cursor
+ CALL NZ,PUTCHAR;.NO_SCROLL ; добавил вывод "a" на экран
+ POP BC
POP DE
LD A,E
AND A
RET
+;
-Cursor:
-.Flag+1: LD A,0 ; флаг курсора 00-нет/01-есть
- CPL
- LD (.Flag),A
+Cursor: ;!TODO логичнее курсором моргать и шрифты менять из биоса же?
+.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_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 A,%0010'0000
+ AND B
+ LD (.char_size),A ; [ ] 24/03/2025 сохраняем тип квадратика 80/40 символов
+ ;
+ LD BC,NORM_ZG*256+BIOS.WIN_PUT_SYM ; b=знакоген., с=символ на экран
+ LD A,(Cursor.Flag)
+ OR A
+ JR Z,.put
+ LD B,INS_CUR_ZG ; блок
+ LD A,(KEYFLAG) ; флаги клавы
+ AND 1< A..Z
+UPPER: CP 'a'
+ RET C
+ CP 'z' + 1
+ JR NC,.CheckRUS
+.Dec: SUB #20
+ RET
+ ;
+.CheckRUS: CP 'а' ; русская буква а, код #A0
+ RET C
+ CP 'п'+1 ; русская буква п, код #AF + 1
+ JR C,.Dec
+ ;
+.BGUPPER: CP 'р' ; русская буква р, код #E0
+ RET C
+ CP 'Ё' ; русская буква Ё, код #F0
+ JR NC,.HGUPPER
+ SUB #50
+ RET
+ ;
+.HGUPPER: CP 'ё' ; русская буква ё, код #F1
+ RET NZ
+ DEC A
+ RET
+;----------------------------------------------------------------------;
+
+
+
+;!TODO hardware
+;----------------------------------------------------------------------;
+; Чтение регистров CMOS
+; вход: d=номер регистра
+RCMOS: LD C,BIOS.CMOS_RD
+ RST ToBIOS
+ ;JP BCD2HEX
+; INPUT : A - BCD
+; OUTPUT: A - HEX
+BCD2HEX:
+ LD E,A
+ RRCA
+ RRCA
+ RRCA
+ RRCA
+ AND #0F
+ LD D,A
+ ADD A,A
+ ADD A,A
+ ADD A,D
+ ADD A,A
+ LD D,A
+ LD A,E
+ AND #0F
+ ADD A,D
+ RET
+;----------------------------------------------------------------------;
+
+;!TODO hardware
+;----------------------------------------------------------------------;
+; Запись регистров CMOS
+; вход: d=номер регистра
+WCMOS: CALL HEX2BCD
+ LD C,BIOS.CMOS_WR
+ JP ToBIOS
+
+; INPUT : A - HEX
+; OUTPUT: A - BCD
+HEX2BCD:
+ LD BC,#0AFF
+.loop: INC C
+ SUB B
+ JR NC,.loop
+ ADD A,B
+ LD B,A
+ LD A,C
+ RLCA
+ RLCA
+ RLCA
+ RLCA
+ AND #F0
+ OR B
+ RET
+;----------------------------------------------------------------------;
+;
+
+
+;
+;----------------------------------------------------------------------;
+;BC/DE ==> BC, remainder in HL
+; не портит DE
+BC_Div_DE:
+ ld hl,0
+ ld a,b
+ ld b,16
+ ;shift the bits from BC into HL
+.div_loop:
+ sla c
+ rla
+ adc hl,hl
+ sbc hl,de
+ jr nc,.div_inc_acc
+ add hl,de
+ db $FE ;this begins the instruction `cp *`, so it eats the next byte.
+.div_inc_acc:
+ inc c
+ djnz .div_loop
+ ld b,a
+ ret
+;----------------------------------------------------------------------;
+;
+
+;----------------------------------------------------------------------;
+; HL:DE / A => DE:BC, H=0, L - остаток
+DIV_by_Shifts:
+ LD C,A
+ DEC A
+ JR Z,.exit
+ ;
+ AND E
+ LD B,A ; остаток
+ LD A,C
+ RRCA
+ ;
+.loop: SRL H
+ RR L
+ RR D
+ RR E
+ RRCA
+ JP NC,.loop
+ LD A,B
+.exit: LD B,D
+ LD C,E
+ EX DE,HL
+ LD H,0
+ LD L,A
+ RET
+;----------------------------------------------------------------------;
+
+;===============================================================================================================================
+ MACRO PRINT_LINE_KERNEL_PANIC coordY, txtString, txtStringSize, txtColor
+ LD HL,txtString
+ LD BC,txtColor*256 + txtStringSize
+ LD DE,coordY * 256 + (80 - txtStringSize)/2
+ CALL .PRINT_LINE
+ ENDM ; 12 bytes
+;
+;-----------------------[]
+; HL - сообщение
+; E - координата X на текстовом экране
+; BC - длина сообщения
+KERNEL_PANIC:
+ DI
+ ;
+ PUSH DE
+ PUSH HL
+ PUSH BC
+ ;
+ LD E,1
+ LD BC,BIOS.LP_OPEN_S.TXT_80x32_Default
+ RST ToBIOS
+ ;
+ LD HL,#2050
+ LD DE,0
+ LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN
+ RST ToBIOS
+ ;
+ LD A,1
+ OUT (SCREEN_SWITCH),A ; set scr-2
+ ;
+ PRINT_LINE_KERNEL_PANIC 13, .kernel_panic, .kernel_panic.size, +(COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INK.RED)
+ PRINT_LINE_KERNEL_PANIC 18, .press_CAD, .press_CAD.size, +(COLORS.CGA.PAPER.BLUE + COLORS.CGA.INK.WHITE)
+ ;
+ POP BC
+ POP HL
+ LD DE,#A000
+ LD A,C
+ LDIR
+ ;
+ POP DE
+ LD D,15
+ LD C,BIOS.LP_SET_PLACE
+ RST ToBIOS
+ ;
+ LD HL,#A000
+ LD DE,0*256 + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INK.WHITE
+ LD B,A
+ LD C,BIOS.LP_PRINT_LINE3
+ RST ToBIOS
+ ;
+.loop: DI
+ HALT
+ JR .loop
+ ;
+.PRINT_LINE:
+ PUSH BC
+ PUSH DE
+ LD DE,#A000
+ LD B,E
+ LD A,C
+ LDIR
+ ;
+ POP DE
+ LD C,BIOS.LP_SET_PLACE
+ RST ToBIOS
+ ;
+ POP DE
+ LD E,D
+ LD HL,#A000
+ LD D,L
+ LD B,A
+ LD C,BIOS.LP_PRINT_LINE3
+ JP ToBIOS
+ ;
+.kernel_panic: DZ "KERNEL PANIC!"
+.kernel_panic.size EQU $-.kernel_panic
+;
+.press_CAD: DZ "Press Ctrl+Alt+Del or RESET."
+.press_CAD.size EQU $-.press_CAD
+;-----------------------[]
+;===============================================================================================================================
\ No newline at end of file
diff --git a/DSS/RAM_DRV0.ASM b/DSS/RAM_DRV0.ASM
deleted file mode 100644
index bb2a79d..0000000
--- a/DSS/RAM_DRV0.ASM
+++ /dev/null
@@ -1,613 +0,0 @@
-;
-; SYSPAGE EQU #FE
-; SLOT1 EQU #A2
-; SLOT2 EQU #C2
-; SLOT3 EQU #E2
-
-; ORG #3CDB
-; Disk Driver Specification ver. 2.20
-;[]===========================================================[ 0]
-;Procedure : Initialization
-;
-;Function : Initialization device(s)
-;
-;Input : C = 00h
-; IX - Environment
-;Output : A = Amount drive support
-; HL = Size driver
-;[]===========================================================[ 0]
-
-
-;[]===========================================================[ 1]
-;Procedure : Open
-;
-;Function : Open disk
-;
-;Input : C = 01h
-; A - Drive
-;Output : None
-;
-;[]===========================================================[ 1]
-
-
-;[]===========================================================[ 2]
-;Procedure : Close
-;
-;Function : Close disk
-;
-;Input : C = 02h
-; A - Drive
-;Output : None
-;
-;[]===========================================================[ 2]
-
-
-;[]===========================================================[ 3]
-;!TODO
-;Procedure : Media check
-;
-;Function : Checking change line
-;
-;Input : C = 03h
-; A - Drive
-;Output : A = 00h disk no changed
-; A = 0FFh disk changed
-;
-;[]===========================================================[ 3]
-
-
-;[]===========================================================[ 4]
-;Procedure : Get BPB
-;
-;Function : Get Block Parameters BIOS
-;
-;Input : C = 04h
-; DE - Address
-;Output : None
-;
-;[]===========================================================[ 4]
-
-
-;[]===========================================================[ 5]
-;Procedure : Input
-;
-;Function : Input from disk
-;
-;Input : C = 05h
-; HL:IX - Logical Block (sector)
-; DE - Address
-; B - Sector count
-;Output : None
-;
-;[]===========================================================[ 5]
-
-
-;[]===========================================================[ 6]
-;Procedure : Output
-;
-;Function : Output to disk
-;
-;Input : C = 06h
-; HL:IX - Logical Block (sector)
-; DE - Address
-; B - Sector count
-;Output : None
-;
-;[]===========================================================[ 6]
-
-
-;[]===========================================================[ 7]
-;!TODO
-;Procedure : Removable
-;
-;Function : Checking change line
-;
-;Input : C = 07h
-; A - Drive
-;Output : A = 00h Removable
-; A = FFh Nonremovable
-;
-;[]===========================================================[ 7]
-
-
-;[]===========================================================[ 8]
-;Procedure : Generic IOCTL
-;
-;Function : Generic Input Output Control
-;
-;Input : C = 08h
-; B - Subcommand
-; DE = 55AAh Magic Number
-; Subcommand
-;----------------------
-; 00h - Get Device Parameters
-; 01h - Read track
-; 02h - Test track
-; 80h - Set Device Parameters
-; 81h - Write track
-; 82h - Format track
-;Output :
-;
-;[]===========================================================[ 8]
-
-
-;[]===========================================================[ 9]
-; RESERVED
-;[]===========================================================[ 9]
-
-
-;[]===========================================================[ 10]
-;!TODO
-;Procedure : Read Long
-;
-;Function : Reading sectors from disk
-;
-;Input : C = 0Ah
-; HL:IX - Logical Block (sector)
-; DE - Address
-; B - Sector count
-; A'- Page
-;Output : A'- Next Page
-; HL:IX - Next Logical Block (sector)
-; DE - Next Address
-;
-;[]===========================================================[ 10]
-
-
-;[]===========================================================[ 11]
-;!TODO
-;Procedure : Write Long
-;
-;Function : Writing sectors to disk
-;
-;Input : C = 0Bh
-; HL:IX - Logical Block (sector)
-; DE - Address
-; B - Sector count
-; A'- Page
-;Output : A'- Next Page
-; HL:IX - Next Logical Block (sector)
-; DE - Next Address
-;
-;[]===========================================================[ 11]
-;
-; Errors:
-; 0 (00h) - NO ERRORS
-; 1 (01h) - BAD COMMAND
-; 2 (02h) - BAD DRIVE NUMBER
-; 3 (03h) - UNKNOW FORMAT
-; 4 (04h) - NOT READY
-; 5 (05h) - SEEK ERROR
-; 6 (06h) - SECTOR NOT FOUND
-; 7 (07h) - CRC ERROR
-; 8 (08h) - WRITE PROTECT
-; 9 (09h) - READ ERROR
-; 10 (0Ah) - WRITE ERROR
-; 11 (0Bh) - FAILURE
-; 12 (0Ch) - BUSY (DEVICE OPENED)
-; 13 (0Dh) - RESERVED
-
-RMDRIVE:
- INC C
- DEC C
- JP Z,INIT_RD ; 0
- DEC C
- JR Z,RESE_RD ; 1
- DEC C
- JR Z,STAT_RD ; 2
- DEC C
- JR Z,CHEK_RD ; 3
- DEC C
- JR Z,GBPB_RD ; 4
- DEC C
- JR Z,READR ; 5
- DEC C
- JR Z,WRITER ; 6
- DEC C
- JR Z,REMOV_R ; 7
- DEC C
- JP Z,IOCTL_R ; 8
-
- ; DEC C
- ; JP Z,RESR_H ; 9
- ; DEC C
- ; JP Z,LREADH ; 10
- ; DEC C
- ; JP Z,LWRITEH ; 11
-.error:
- LD A,DSS_Error.drv.INVALID_COMMAND
- SCF
- RET
-
-REMOV_R:
-RESE_RD:
-STAT_RD:
- XOR A
- RET
-
-;!FIXIT сделать в SYS_PAGE для рамдисков переменные и брать оттуда значение
-CHEK_RD LD A,#FF
- AND A
- RET
-
-;DE - ADDRESS
-GBPB_RD LD IX,0
- LD HL,0
- LD B,#01
- ;JP READR
-;READ SECTORS
-; HL:IX - SECTOR
-; DE - ADDRESS
-; B - COUNT
-; A - DRIVE
-READR PUSH BC
- PUSH IX
- PUSH HL
- PUSH BC
- CALL RAMADDR
- POP BC
- LD IX,512
-RAMRLOP PUSH BC
- PUSH IX
- CALL LRDSEC
- POP IX
- POP BC
- DJNZ RAMRLOP
- POP HL
- POP IX
- POP BC
- XOR A
- CP B
- LD C,B
- LD B,A
- JR Z,DYEP256
- ADD IX,BC
- LD C,B
- ADC HL,BC
- XOR A
- RET
-
-DYEP256 INC B
- ADD IX,BC
- LD B,C
- ADC HL,BC
- XOR A
- RET
-
-
-;WRITE SECTORS
-; HL:IX - SECTOR
-; DE - ADDRESS
-; B - COUNT
-; A - DRIVE
-WRITER PUSH BC
- PUSH IX
- PUSH HL
- PUSH BC
- CALL RAMADDR
- POP BC
- LD IX,512
-RAMWLOP PUSH BC
- PUSH IX
- CALL WRDSEC
- POP IX
- POP BC
- DJNZ RAMWLOP
- POP HL
- POP IX
- POP BC
- XOR A
- CP B
- LD C,B
- LD B,A
- JR Z,WYEP256
- ADD IX,BC
- LD C,B
- ADC HL,BC
- XOR A
- RET
-
-WYEP256 INC B
- ADD IX,BC
- LD B,C
- ADC HL,BC
- XOR A
- RET
-
-
-INIT_RD:
-.SectorSize EQU 512 ;!HARDCODE
- LD HL,.SectorSize
- LD A,#80
-.loop: SRL A
- RR H
- JR NC,.loop
-
- LD (S_P_P),A
- LD BC,#0*256 + BIOS.GET_RAMD_ST ; Получение идентификатора блока, назначенного на 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
-
-; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО 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 $
-;
diff --git a/DSS/RAM_DRV1.ASM b/DSS/RAM_DRV1.ASM
deleted file mode 100644
index 8325206..0000000
--- a/DSS/RAM_DRV1.ASM
+++ /dev/null
@@ -1,477 +0,0 @@
-
-
-; SYSPAGE EQU #FE
-; SLOT1 EQU #A2
-; SLOT2 EQU #C2
-; SLOT3 EQU #E2
-
-; ORG #3CDB
-; Disk Driver Specification ver. 2.20
-;[]===========================================================[ 0]
-;Procedure : Initialization
-;
-;Function : Initialization device(s)
-;
-;Input : C = 00h
-; IX - Environment
-;Output : A = Amount drive support
-; HL = Size driver
-;[]===========================================================[ 0]
-
-
-;[]===========================================================[ 1]
-;Procedure : Open
-;
-;Function : Open disk
-;
-;Input : C = 01h
-; A - Drive
-;Output : None
-;
-;[]===========================================================[ 1]
-
-
-;[]===========================================================[ 2]
-;Procedure : Close
-;
-;Function : Close disk
-;
-;Input : C = 02h
-; A - Drive
-;Output : None
-;
-;[]===========================================================[ 2]
-
-
-;[]===========================================================[ 3]
-;!TODO
-;Procedure : Media check
-;
-;Function : Checking change line
-;
-;Input : C = 03h
-; A - Drive
-;Output : A = 00h disk no changed
-; A = 0FFh disk changed
-;
-;[]===========================================================[ 3]
-
-
-;[]===========================================================[ 4]
-;Procedure : Get BPB
-;
-;Function : Get Block Parameters BIOS
-;
-;Input : C = 04h
-; DE - Address
-;Output : None
-;
-;[]===========================================================[ 4]
-
-
-;[]===========================================================[ 5]
-;Procedure : Input
-;
-;Function : Input from disk
-;
-;Input : C = 05h
-; HL:IX - Logical Block (sector)
-; DE - Address
-; B - Sector count
-;Output : None
-;
-;[]===========================================================[ 5]
-
-
-;[]===========================================================[ 6]
-;Procedure : Output
-;
-;Function : Output to disk
-;
-;Input : C = 06h
-; HL:IX - Logical Block (sector)
-; DE - Address
-; B - Sector count
-;Output : None
-;
-;[]===========================================================[ 6]
-
-
-;[]===========================================================[ 7]
-;!TODO
-;Procedure : Removable
-;
-;Function : Checking change line
-;
-;Input : C = 07h
-; A - Drive
-;Output : A = 00h Removable
-; A = FFh Nonremovable
-;
-;[]===========================================================[ 7]
-
-
-;[]===========================================================[ 8]
-;Procedure : Generic IOCTL
-;
-;Function : Generic Input Output Control
-;
-;Input : C = 08h
-; B - Subcommand
-; DE = 55AAh Magic Number
-; Subcommand
-;----------------------
-; 00h - Get Device Parameters
-; 01h - Read track
-; 02h - Test track
-; 80h - Set Device Parameters
-; 81h - Write track
-; 82h - Format track
-;Output :
-;
-;[]===========================================================[ 8]
-
-
-;[]===========================================================[ 9]
-; RESERVED
-;[]===========================================================[ 9]
-
-
-;[]===========================================================[ 10]
-;!TODO
-;Procedure : Read Long
-;
-;Function : Reading sectors from disk
-;
-;Input : C = 0Ah
-; HL:IX - Logical Block (sector)
-; DE - Address
-; B - Sector count
-; A'- Page
-;Output : A'- Next Page
-; HL:IX - Next Logical Block (sector)
-; DE - Next Address
-;
-;[]===========================================================[ 10]
-
-
-;[]===========================================================[ 11]
-;!TODO
-;Procedure : Write Long
-;
-;Function : Writing sectors to disk
-;
-;Input : C = 0Bh
-; HL:IX - Logical Block (sector)
-; DE - Address
-; B - Sector count
-; A'- Page
-;Output : A'- Next Page
-; HL:IX - Next Logical Block (sector)
-; DE - Next Address
-;
-;[]===========================================================[ 11]
-;
-; Errors:
-; 0 (00h) - NO ERRORS
-; 1 (01h) - BAD COMMAND
-; 2 (02h) - BAD DRIVE NUMBER
-; 3 (03h) - UNKNOW FORMAT
-; 4 (04h) - NOT READY
-; 5 (05h) - SEEK ERROR
-; 6 (06h) - SECTOR NOT FOUND
-; 7 (07h) - CRC ERROR
-; 8 (08h) - WRITE PROTECT
-; 9 (09h) - READ ERROR
-; 10 (0Ah) - WRITE ERROR
-; 11 (0Bh) - FAILURE
-; 12 (0Ch) - BUSY (DEVICE OPENED)
-; 13 (0Dh) - RESERVED
-
-
-; MACRO _mGET_RAMDRV_NUM
-; PUSH BC
-; LD BC,RAMDTBL
-; SLA A
-; ADD A,C
-; LD C,A
-; LD A,0
-; ADC A,B
-; LD B,A
-; INC BC
-; LD A,(BC)
-; OR #60
-; POP BC
-; ENDM
-
- MACRO _mGET_RAMDRV_NUM
- LD BC,RAMDTBL
- SLA A
- ADD A,C
- LD C,A
- LD A,0
- ADC A,B
- LD B,A
- INC BC
- LD A,(BC)
- OR #60 ;!HARDCODE сделать номера разных устройств через метки
- ENDM
-
-
-; parser
-RMDRIVE:
- INC C
- DEC C
- JP Z,INIT_RD ; 0
- DEC C
- JR Z,RESET_RD ; 1
- DEC C
- JR Z,STATUS_RD ; 2
- DEC C
- JR Z,CHEK_RD ; 3
- DEC C
- JR Z,GBPB_RD ; 4
- DEC C
- JR Z,READ_RD ; 5
- DEC C
- JR Z,WRITE_RD ; 6
- DEC C
- JR Z,REMOV_RD ; 7
- DEC C
- JP Z,IOCTL_RD ; 8
- DEC C
- JP Z,.error ; 9 RESR_H
- DEC C
- JP Z,LREAD_RD ; 10
- DEC C
- JP Z,LWRITE_RD ; 11
-.error:
- LD A,DSS_Error.drv.INVALID_COMMAND
- SCF
- RET
-
-REMOV_RD:
-RESET_RD:
-STATUS_RD:
- XOR A
- RET
-
-;!FIXIT сделать в SYS_PAGE для рамдисков переменные и брать оттуда значение
-CHEK_RD LD A,#FF
- AND A
- RET
-
-;DE - ADDRESS
-GBPB_RD LD IX,0
- LD HL,0
- LD B,#01
- ;JP READ_RD
-;READ SECTORS
-; HL:IX - SECTOR
-; DE - ADDRESS
-; B - COUNT
-; A - DRIVE
-READ_RD:
- PUSH BC
- _mGET_RAMDRV_NUM
- POP BC
- LD C,BIOS.DRV_READ
- JP ToBIOS
- ; RST ToBIOS
- ; XOR A
- ; RET
-LREAD_RD:
- PUSH BC
- _mGET_RAMDRV_NUM
- POP BC
- LD C,BIOS.DRV_READ_LONG
- JP ToBIOS
- ; RST ToBIOS
- ; XOR A
- ; RET
-
-;WRITE SECTORS
-; HL:IX - SECTOR
-; DE - ADDRESS
-; B - COUNT
-; A - DRIVE
-WRITE_RD:
- PUSH BC
- _mGET_RAMDRV_NUM
- POP BC
- LD C,BIOS.DRV_WRITE
- JP ToBIOS
- ; RST ToBIOS
- ; XOR A
- ; RET
-
-LWRITE_RD:
- PUSH BC
- _mGET_RAMDRV_NUM
- POP BC
- LD C,BIOS.DRV_WRITE_LONG
- JP ToBIOS
- ; RST ToBIOS
- ; XOR A
- ; RET
-
-;S_P_P DB #00
-INIT_RD:
-; .SectorSize EQU 512 ;!HARDCODE
-; LD HL,.SectorSize
-; LD A,#80
-; .loop: SRL A
-; RR H
-; JR NC,.loop
-; LD (S_P_P),A
-
- LD BC,#0*256 + BIOS.GET_RAMD_ST ; Получение идентификатора блока, назначенного на 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
-
-; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО 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 $
-;
\ No newline at end of file
diff --git a/DSS/Structures.inc b/DSS/Structures.inc
index 06e9c0f..fdabc66 100644
--- a/DSS/Structures.inc
+++ b/DSS/Structures.inc
@@ -1,45 +1,67 @@
;
- STRUCT _sStack ; 256 bytes
-buffer BLOCK 255,0
-SPoint BYTE 0
+ STRUCT _sStack ; 256 bytes
+.buffer BLOCK 256,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
+ STRUCT _sEXE_HEADER ; 512 bytes
+.EXE_EXT TEXT 3,{"EX","E"} ; 0-2 EXE Сигнатура
+.VERSION BYTE 0 ; 3 Version of EXE file
+.OFFCOD1 WORD 00 ; 4-5 С какого смещения в файле будет грузиться код в
+.OFFCOD2 WORD 00 ; 6-7 память по адресу (Code_addr) Low addr, High addr.
+.LOADER WORD 00 ; 8-9 Размер первичного загрузчика или 0
+.RESERVED BLOCK 6,0 ; 10-15 Reserved
+.LD_ADDR WORD 00 ; 16-17 Адрес расположения кода в памяти (#4100-#FFFF)
+.PC_REG WORD 00 ; 18-19 Адрес в памяти с которого запустится код (Reg. PC)
+.SP_REG WORD 00 ; 20-21 Адрес стека (Reg. SP)
+.UnUsedPoint BYTE 0 ; 22
+; в .RESERVED2 нельзя прописать BLOCK 512-.UnUsedPoint,0; поэтому хардкод
+.RESERVED2 BLOCK 512-23,0 ; 23-512 Можно использовать под текст для выпендрёжа или не использовать
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
+;[ ] fat32
+ STRUCT _sFM ; 54 bytes
+ ; from FAT
+; .NAME: TEXT 8,{". "," "} ;+ #00 +00 NAME
+; .EXT: TEXT 3,{" "," "} ;+ #08 +08 EXT
+; .ATTRIBUT: BYTE #10 ;+ #0B +11 ATTRIBUT
+; .RESERVED_NT: BYTE #00 ;+ #0C +12 RESERVED
+; .RESERVED_FAT32: BYTE #00 ;+ #0D +13 RESERVED
+; .CREATE_TIME_FAT32: WORD #0000 ;+ #0E +14 RESERVED
+; .CREATE_DATE_FAT32: WORD #0000 ;+ #10 +16 RESERVED
+; .RESERVED_FAT32_1: WORD #0000 ;+ #12 +18 RESERVED
+; .FIRST_CLUSTER_H: WORD #0000 ;+ #14 +20 RESERVED
+; .TIME: WORD #0000 ;+ #16 +22 TIME
+; .DATE: WORD #0000 ;+ #18 +24 DATE
+; .FIRST_CLUSTER_L: WORD #0000 ;+ #1A +26 START CLUSTER ; [ ] fat32
+; .F_SIZE: DWORD #00000000 ;+ #1C +28 SIZE FILE
+.FS_REC FAT_DIRECTORY_RECORD
+ ; from Core
+.F_POSITION DWORD #00000000 ;+ #20 +32 FILE POSITION (FP)
+.DIR_CLUSTER_L WORD #0000 ;+ #24 +36 DIRECTORY CLUSTER LOW
+.DIR_CLUSTER_H WORD #0000 ;+ #24 +38 DIRECTORY CLUSTER HIGH ; [x] fat32
+.HANDLE WORD #0000 ;+ #28 +40 HANDLE NUMBER
+.DRIVE BYTE #00 ;+ #2A +42 DRIVE OR CURRENT
+.ACCESS_MODE BYTE #00 ;+ #2B +43 ACCESS MODE
+.TASK_NUM BYTE #00 ;+ #2C +44 TASK
+.OptimizedClusters BYTE #00 ;+ #2D +45
+.KnownCluster_L WORD #0000 ;+ #2E +46 Младшее слово номера кластера для которого известно относительное смещение внутри файла
+.KnownCluster_H WORD #0000 ;+ #30 +48 Старшее слово номера кластера для которого известно относительное смещение внутри файла
+.KnownOffset_L WORD #0000 ;+ #32 +50 Младшее слово смещения (в кластерах) относительно начала файла для сохраненного номера кластера.
+.KnownOffset_H WORD #0000 ;+ #34 +52 Старшее слово смещения (в кластерах) относительно начала файла для сохраненного номера кластера.
ENDS
+
+;ACCESS MODE: A=0 чтение/запись
+; A=1 чтение
+; A=2 запись
+; ;!TODO A=3 запись без лишних сохранений кэша FAT
+; ;!TODO A=4 записать кэш FAT
+;
+
;
; NAM EQU 0 ; LEN4 EQU 31
; EXT EQU 8 ; POS1 EQU 32
@@ -55,13 +77,58 @@ RESERVED2 BLOCK 490,0
; 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
+ STRUCT _sFS_Buffer
+.DRIVE: BYTE #FF
+.FAT_TYPE: BYTE #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; fat32
+.CacheBlock: WORD #0000
+.CacheUpdated: BYTE #00
+;.SectorsPerBank: BYTE #00
+.RootDirStartCluster_L: WORD #0000
+.RootDirStartCluster_H: WORD #0000 ; fat32
+.FAT1_SEC_L: WORD #0000 ; MSD_FAT_SEC first sector FAT (FAT_FRM)
+.FAT1_SEC_H: WORD #0000 ; fat32
+.FAT2_SEC_L: WORD #0000
+.FAT2_SEC_H: WORD #0000 ; fat32
+.Number_Of_FATs BYTE #02
+.SectorsPerFAT_L WORD #0000
+.SectorsPerFAT_H BYTE #00
+.RootDirFirstSector_L: WORD #0000 ; MSD_CAT_SEC first sector DIR
+.RootDirFirstSector_H: WORD #0000 ; MSD_CAT_SEC first sector DIR
+.DirSizeInSectors: BYTE #00 ; DIR_SEC_SIZE
+.FirstDataSector_L: WORD #0000 ; MSD_DAT_SEC low
+.FirstDataSector_H: WORD #0000 ; MSD_DAT_SEC high
+.BytesPerCluster: WORD #0000 ; CLUSTER_LEN
+.END_CHAIN_CLUSTER_L: WORD #FFFF
+.END_CHAIN_CLUSTER_H: WORD #0FFF
+.MaxClusterLow: WORD #0000 ; макс. число кластеров (без служ.)
+.MaxClusterHigh: WORD #0000 ; макс. число кластеров (без служ.)
+.BytesPerSector: WORD #0000
+.SectorsPerCluster: BYTE #00
+.FSINFO_Sector: WORD #01
+.BPB_SERIAL_NUMBER: DWORD 0
+.BPB_LABEL: BLOCK 11,' ' ; 11 для FAT, 31 для CDFS
+.UPD_FSINFO: BYTE 0
+.FREE_CLUSTERS_COUNT_L: WORD #FFFF
+.FREE_CLUSTERS_COUNT_H: WORD #FFFF
+;.FilesPerSector: BYTE #00 ; число файловых записей в секторе
+;.ClustersPerBank: BYTE #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ)
+;.READ_PG: BYTE #00 ;!TODO не используются некоторые значения, но задумка неплохая)))
+;.S_X_H: DWORD #0000 ; количество секторов на цилиндре
ENDS
;
+
+;
+ STRUCT _sBuffers
+.FileManipulator _sFM ; 44 bytes + 44 bytes * (FMCOUNT-1)
+.FM_RESERVE BLOCK _sFM * (FMCOUNT-1),0 ;
+.FS_Buffer _sFS_Buffer
+;.BootSector BLOCK 90,0 ; _sBOOT_SECTOR_PARAMS: 62 bytes FAT16, 90 bytes FAT32
+.EXE_Header _sEXE_HEADER ; 512 bytes
+.Stack _sStack ; 256 bytes
+.Buffer BLOCK 512,0 ; FOR BUFFER & SECTOR_BUFFER
+.MemoryTable BLOCK 256,0 ; 256 bytes
+.CurrentPath WORD 0
+.CurrentDirectory BLOCK DIRECTORY_PATH_LENGTH,0
+.WorkDirectory BLOCK DIRECTORY_PATH_LENGTH,0
+ ENDS
+;
\ No newline at end of file
diff --git a/DSS/VERSION.INC b/DSS/VERSION.INC
index c1bda05..eaffa57 100644
--- a/DSS/VERSION.INC
+++ b/DSS/VERSION.INC
@@ -1,10 +1,42 @@
+ IFNDEF INCREASE_BUILD
+ DEFINE INCREASE_BUILD 0
+ ELSE
+ DEFINE+ INCREASE_BUILD 1
+ ENDIF
+;------------------[ Достаём текущую дату и BUILD++ ]-----------------[]
+ LUA PASS1
+ dss_date, dss_month, dss_year = Get_date_RU(sj.get_define("__DATE__"))
+
+ if sj.get_define("INCREASE_BUILD") > "0" then
+ dss_build = increase_build("./DSS/build.txt")
+ else
+ dss_build = get_build("./DSS/build.txt")
+ end
+
+ if dss_build > 999 then
+ dss_build = 999
+ print("WARNING! Build > 999","WARNING! Build > 999","WARNING! Build > 999","WARNING! Build > 999","\aWARNING! Build > 999\a")
+ end
+ ENDLUA
+ LUA ALLPASS
+ sj.insert_label("lua_DAY", dss_date)
+ sj.insert_label("lua_MONTH", dss_month)
+ sj.insert_label("lua_YEAR", dss_year)
+ sj.insert_label("lua_BUILD", dss_build)
+ ENDLUA
+;---------------------------------------------------------------------[]
+
;
-; DSS Version
-VERS EQU 01 ;Version Number (XX.)
-MODF EQU 70 ;Modification (.xx)
-BUILD EQU 1
+; DSS full version
+; номер версии (0..9)
+VERS EQU 1
+; номер модификации (0..99)
+MODF EQU 71
+; номер билда (0..999)
+BUILD EQU lua_BUILD
;
+
; Release Types
RELEASE EQU 0
RC EQU 1
@@ -12,13 +44,13 @@ BETA EQU 2
DP EQU 3
;
-; Bulid Type
+; Build Type
OSTYPE EQU BETA
REVISION EQU 1
;
-; Default date
-DAY EQU 30
-MONTH EQU 03
-YEAR EQU 2023
+; Current date
+DAY EQU lua_DAY
+MONTH EQU lua_MONTH
+YEAR EQU lua_YEAR
;
\ No newline at end of file
diff --git a/DSS/VIDEO.ASM b/DSS/VIDEO.ASM
deleted file mode 100644
index 5e5b1ac..0000000
--- a/DSS/VIDEO.ASM
+++ /dev/null
@@ -1,682 +0,0 @@
-
-;[BEGIN]
-;//MODULE: VIDEO
-;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
-;//UPDATE: 24-10-1999 DNS Restore module
-;---------------------------------------------------------------
-;Rev Date Name Description
-;---------------------------------------------------------------
-;R02 07-11-2002 DNS CORRECT FN. WINCOPY & WINREST, ADD "DI+EI"
-;R01 07-11-2002 DNS FIX BUG WITH SCROLLUP FN. (A=0)
-;---------------------------------------------------------------
-
-; CLEAR TEXT WINDOW
-CLEAR LD C,BIOS.LP_CLS_WIN2
- RST ToBIOS
- AND A
- RET
-;
-
-; PRINT NULL-TERMINATED CHARS STRING
-; HL - STRING POINTER
-PCHARS LD A,(HL)
- INC HL
- OR A
- RET Z
- ;PUSH HL
- CALL PUTCHAR
- ;POP HL
- JP PCHARS
-
-; PRINT CHAR
-; A - CHAR
-PUTCHAR:
- CP #0D
- JP Z,CR_
- CP #0A
- JP Z,LF_
- CP #09
- JP Z,TB_
- CP #08
- JP Z,BK_
- ; CP #20
- ; JP NC,CHAR
-CHAR: LD BC,1*256 + BIOS.LP_PRINT_SYM
- RST ToBIOS
-; САЙМАН тут насильный скролл экрана если напечатал в позиции последнего символа последней строки
-; 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
-; САЙМАН
- 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 ; БИОС при использовании 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 ; САЙМАН
- BIT 5,A ; IN (19h): bit 5 - Paper Enable, Bit 3 - Select
- JR NZ,LPTBUSY
- ;and %11011000 ; САЙМАН
- ;jr z,LPTBUSY ; САЙМАН
- LD A,B
- OUT (LPT_B),A
- POP AF
- RET PO
- EI
- RET
-LPTBUSY:
- POP AF
- ;ld a,c ; САЙМАН
- SCF
- RET PO
- EI
- RET
-
-; B - SYMBOL
-; CF = 1 - PRINTER BUSY
-;!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
-
-; САЙМАН ВЫРЕЗАЛ
- 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
-; САЙМАН ВЫРЕЗАЛ
-
-;//MODULE: VIDEO
-;[END]
diff --git a/DSS/build.txt b/DSS/build.txt
new file mode 100644
index 0000000..f0b5c72
--- /dev/null
+++ b/DSS/build.txt
@@ -0,0 +1 @@
+57
\ No newline at end of file
diff --git a/DSS/defines.inc b/DSS/defines.inc
index 7978867..d5fd64f 100644
--- a/DSS/defines.inc
+++ b/DSS/defines.inc
@@ -1,36 +1,160 @@
;
- DEFINE TEST_FEATURE 1
+ DEFINE TEST_FEATURE 0
;
;
- DEFINE SHORT_RSTx10_TABLE 0 ; укороченная таблица функций rst #10. 96 функций.
+ DEFINE MINIMUM_EXE_VERSION 1
;
;
- DEFINE MAX_RAMDRIVES 16
- DEFINE NeedSafePort_Y 1
- DEFINE TABisSPACES 1
- DEFINE CLASSIC_CURSOR 0
+ DEFINE SHORT_RSTx10_TABLE 0 ; укороченная таблица функций rst #10. 96 функций.
+ DEFINE COMPILE_UNUSED_CODE 0
+;
+
+; MOUSE
+ DEFINE MOUSE_COM_BAUD 0 ; 1 - 2485, 2 - 4807, else - 1215 (default)
+ DEFINE MOUSE_INT_ENABLED 0 ; INT from SIO ch. B
+ DEFINE MOUSE_READ_PORT_TIMEOUT 5*512 ; Костыльный тайм-аут на ожидание байта от мышки. Если = 0, то лишний код не компилится
+
+; KEYBOARD
+ DEFINE KEYBOARD_INT_ENABLED 0 ; INT from SIO ch. A
+ DEFINE CHANGE_LANG_CTRL_SHIFT 1 ; [x] 0: Ctrl + Space, 1: Ctrl + Shift.
+ DEFINE BREAK_PROCESS_CODE #AC00 ; CTRL+C
+ DEFINE USE_E1_SCANCODE 0
+; DEFINE CLASSIC_CURSOR 0
+;
+
+;LD_DSK EQU 16 ; максимальное количество логических HDD дисков в системе
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ DEFINE CHANGE_FREE_CLU_AFTER_DEL 1
+
+SERVICE_SECTORS:
+.FAT12 EQU #0FEF
+.FAT16 EQU #FFEF
+.FAT32.High EQU #0FFF
+.FAT32.Low EQU #FFEF
+
+FAT_TYPE:
+.x32 EQU #32
+.x16 EQU #16
+.x12 EQU #12
+
+; define _bit (1((FAT_CACHE.Sectors-1)
+; define _shift _bit&1)) + _bit&2)) + _bit&4)) + _bit&8)) + _bit&16)) + _bit&32)) + _bit&64)) + _bit&128))
+; ;
+; FAT_CACHE:
+; .Size EQU #2000
+; .Sector_Size EQU #200
+; .Sectors EQU .Size / .Sector_Size
+; ; for FAT16
+; .bytes_record_16 EQU 2
+; .Degree_16 EQU _shift
+; .Size_Mask_16 EQU high (.Size/.bytes_record_16 - 1)
+; .Part_Mask_16 EQU ((1<<(.bytes_record_16*8)) / (.Size/2))-1
+; ; for FAT12 ;!TODO
+; .bytes_record_12 EQU 2
+; .Degree_12 EQU _shift
+; .Size_Mask_12 EQU high (.Size/.bytes_record_12 - 1)
+; .Part_Mask_12 EQU ((1<<(.bytes_record_12*8)) / (.Size/2))-1
+; DISPLAY "bytes_record_16 = ",/H,.bytes_record_16
+; DISPLAY "Degree_16 = ",/H,.Degree_16
+; DISPLAY "Size_Mask_16 = ",/H,.Size_Mask_16
+; DISPLAY "Part_Mask_16 = ",/H,.Part_Mask_16
+; DISPLAY "bytes_record_12 = ",/H,.bytes_record_12
+; DISPLAY "Degree_12 = ",/H,.Degree_12
+; DISPLAY "Size_Mask_12 = ",/H,.Size_Mask_12
+; DISPLAY "Part_Mask_12 = ",/H,.Part_Mask_12
+; undefine _bit
+; undefine _shift
+
+FAT_CACHE:
+.Sector_Size EQU #200
+.Degree EQU 4
+; for FAT32
+.Size_32 EQU #4000
+.Sectors_32 EQU .Size_32 / .Sector_Size ; #20
+.Degree_32 EQU 5
+.Size_Mask_32 EQU #0F
+.Part_Mask_32 EQU #0F
+.bytes_record_32 EQU 2
+; for FAT16
+.Size_16 EQU #2000
+.Sectors_16 EQU .Size_16 / .Sector_Size ; #10
+.Degree_16 EQU .Degree
+.Size_Mask_16 EQU #0F
+.Part_Mask_16 EQU #0F
+.bytes_record_16 EQU 2
+; for FAT12 ;!TODO
+.Size_12 EQU #2000
+;.bytes_record_12 EQU 2
+;.Degree_12 EQU _shift
+;.Size_Mask_12 EQU high (.Size/.bytes_record_12 - 1)
+;.Part_Mask_12 EQU ((1<<(.bytes_record_12*8)) / (.Size/2))-1
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ DEFINE NeedSafePort_Y 1
+; DEFINE TABisSPACES 0
+; DEFINE EnoughtOnly_LF 0
+ DEFINE NON_REMOVABLE_FDD 0
+;
+DSS_MAX_SECTOR_SIZE EQU 512
+DSS_MAX_DRIVES_AMOUNT EQU 26
+MAX_RAMDRIVES EQU 16
+MINIMUM_BIOS_VERSION EQU 3*256 + 06 ; version 2.55
+ DEFINE STR_MINIMUM_BIOS_VERSION '0' + high MINIMUM_BIOS_VERSION, '.', '0'+(low MINIMUM_BIOS_VERSION)/10, '0'+(low MINIMUM_BIOS_VERSION)-((low MINIMUM_BIOS_VERSION)/10)*10
+
;
;-------------------[MEMORY]-------------------------;
- 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
+ DEFINE PORTAL.RSTx18_SWITCH_ADDRESS #82
+; DEFINE OLD_SET_BANK 0
+
+;---------------------[ лог.номера страниц памяти ]---------------------
+ DEFINE USING_MEMPAGES 4 ; размер блока дополнительных страниц
+; кэш списка каталога
+DIRPAGE EQU 0
+.buffer EQU #C000
+FATPAGE EQU 1
+.cache EQU #C000
+TXTPAGE EQU 2
+ENVPAGE EQU TXTPAGE
+.PATH_PNT_ARRAY EQU #FC80
+.ENVTEMP EQU #FE00
+DRVPAGE EQU 3
;
+COREPAGE EQU 4 ; она отдельно и не с блоком выше.
+;-----------------------------------------------------------------------
+DIRECTORY_PATH_LENGTH EQU 256 ; '\' + 255, 0
+ENVIRONMENT_STRING_LENGTH EQU 255
-DIRSPEC.DEPTH EQU 256 ; '\' + 1..255
+TXTADDR EQU #C000
+ENVADDR EQU #E400
+;DIR EQU #C000
+;FAT_CACHE EQU #C000
-TXTADDR EQU #C000
-ENVADDR EQU #E400
-DIR EQU #C000
-FAT EQU #C000
-
-FMCOUNT EQU 10 ; Количество файловых манипуляторов
-HANDBUF.SIZE EQU 32
+FMCOUNT EQU 10 ; Количество файловых манипуляторов
+HANDBUF.SIZE EQU FAT_DIRECTORY_RECORD
;----------------------------------------------------;
;
+
+;
+;----------------------------------------------------;
+ IF MOUSE_COM_BAUD = 1
+MOUSE_BAUD:
+.multiplier_1 EQU %0100'0000 ; первый множитель = 16.
+.multiplier_2 EQU 22 ; второй множитель = 22. 875000/Мн1*Мн2=2485
+ ELSEIF MOUSE_COM_BAUD = 2
+MOUSE_BAUD:
+.multiplier_1 EQU %0000'0000 ; первый множитель = 1.
+.multiplier_2 EQU 182 ; второй множитель = 182. 875000/Мн1*Мн2=4807
+ ELSE
+MOUSE_BAUD:
+.multiplier_1 EQU %0100'0000 ; первый множитель = 16.
+.multiplier_2 EQU 45 ; второй множитель = 45. 875000/Мн1*Мн2=1215
+ ENDIF
+;----------------------------------------------------;
+;
+
+;
+;----------------------------------------------------;
+SUBLOAD_SIZE EQU 2 ; кол-во секторов которое надо подгрузить после загрузки system.dos в страницу
+;----------------------------------------------------;
diff --git a/DSS/drivers/DRV_TO_SYS_ERRORS.ASM b/DSS/drivers/DRV_TO_SYS_ERRORS.ASM
new file mode 100644
index 0000000..437136e
--- /dev/null
+++ b/DSS/drivers/DRV_TO_SYS_ERRORS.ASM
@@ -0,0 +1,76 @@
+; 19/04/2025 автоперевод номера ошибки DRV/BIOS в SYS
+DRV_ERROR_TO_SYS:
+ RET NC
+ RLA
+ JR NC,.no_correction
+ ;
+ PUSH HL
+ PUSH AF
+ ;
+ SRL A
+ CP .Size
+ LD HL,.TABLE
+ ADD A,L
+ JR NC,.no_inc
+ ;
+ INC H
+.no_inc: LD L,A
+ LD L,(HL)
+ POP AF
+ LD A,L
+ POP HL
+ RET
+ ;
+.no_correction: RRA
+ RET
+
+.TABLE: DB DSS_Error.sys.Unknown_Error ;BIOS.Error.NoErrors ; 0
+ DB DSS_Error.sys.INVALID_FUNCTION ;BIOS.Error.InvalidSubFunction ; 1
+ DB DSS_Error.sys.INVALID_DRIVE ;BIOS.Error.BadNumber ; 2
+ DB DSS_Error.sys.UNKNOWN_FORMAT ;BIOS.Error.UnknownDevice ; 3
+ DB DSS_Error.sys.NOT_READY ;BIOS.Error.NotReady ; 4
+ DB DSS_Error.sys.SEEK_ERROR ;BIOS.Error.Seek ; 5
+ DB DSS_Error.sys.SECTOR_NOT_FOUND ;BIOS.Error.SectorNotFound ; 6
+ DB DSS_Error.sys.CRC_ERROR ;BIOS.Error.CRC ; 7
+ DB DSS_Error.sys.WRITE_PROTECT ;BIOS.Error.WriteProtect ; 8
+ DB DSS_Error.sys.READ_ERROR ;BIOS.Error.Read ; 9
+ DB DSS_Error.sys.WRITE_ERROR ;BIOS.Error.Write ; 10
+ DB DSS_Error.sys.DRIVE_FAILURE ;BIOS.Error.Failure ; 11
+ DB DSS_Error.sys.BUSY_NO_MEDIA ;BIOS.Error.Busy ; 12
+ DB DSS_Error.sys.Unknown_Error ;#8D ; 13
+ DB DSS_Error.sys.Unknown_Error ;#8E ; 14
+ DB DSS_Error.sys.Unknown_Error ;#8F ; 15
+ DB DSS_Error.sys.Unknown_Error ;#90 ; 16
+ DB DSS_Error.sys.Unknown_Error ;#91 ; 17
+ DB DSS_Error.sys.Unknown_Error ;#92 ; 18
+ DB DSS_Error.sys.Unknown_Error ;#93 ; 19
+ DB DSS_Error.sys.Unknown_Error ;#94 ; 20
+ DB DSS_Error.sys.Unknown_Error ;#95 ; 21
+ DB DSS_Error.sys.Unknown_Error ;#96 ; 22
+ DB DSS_Error.sys.Unknown_Error ;#97 ; 23
+ DB DSS_Error.sys.Unknown_Error ;#98 ; 24
+ DB DSS_Error.sys.Unknown_Error ;#99 ; 25
+ DB DSS_Error.sys.Unknown_Error ;#9A ; 26
+ DB DSS_Error.sys.Unknown_Error ;#9B ; 27
+ DB DSS_Error.sys.Unknown_Error ;#9C ; 28
+ DB DSS_Error.sys.Unknown_Error ;#9D ; 29
+ DB DSS_Error.sys.Unknown_Error ;#9E ; 30
+ DB DSS_Error.sys.NOT_SUPPORTED ;BIOS.Error.NotSupported ; 31
+ DB DSS_Error.sys.Unknown_Error ;BIOS.Error.ATAPI.NoSence ; 32
+ DB DSS_Error.sys.Unknown_Error ;BIOS.Error.ATAPI.RecoveredError; 33
+ DB DSS_Error.sys.NOT_READY ;BIOS.Error.ATAPI.NotReady ; 34
+ DB DSS_Error.sys.BUSY_NO_MEDIA ;BIOS.Error.ATAPI.MediumError ; 35
+ DB DSS_Error.sys.DRIVE_FAILURE ;BIOS.Error.ATAPI.HardwareError ; 36
+ DB DSS_Error.sys.INVALID_ACCESS ;BIOS.Error.ATAPI.IllegalRequest; 37
+ DB DSS_Error.sys.MEDIA_CHANGED ;BIOS.Error.ATAPI.UnitAttention ; 38
+ DB DSS_Error.sys.ACCESS_DENIED ;BIOS.Error.ATAPI.DataProtect ; 39
+ DB DSS_Error.sys.Unknown_Error ;BIOS.Error.ATAPI; ; 40
+ DB DSS_Error.sys.Unknown_Error ;BIOS.Error.ATAPI; ; 41
+ DB DSS_Error.sys.Unknown_Error ;BIOS.Error.ATAPI; ; 42
+ DB DSS_Error.sys.NOT_READY ;BIOS.Error.ATAPI.AbortedCommand; 43
+ DB DSS_Error.sys.Unknown_Error ;BIOS.Error.ATAPI; ; 44
+ DB DSS_Error.sys.Unknown_Error ;BIOS.Error.ATAPI; ; 45
+ DB DSS_Error.sys.WRITE_ERROR ;BIOS.Error.ATAPI.Miscompare ; 46
+ DB DSS_Error.sys.Unknown_Error ;BIOS.Error.ATAPI; ; 47
+ DB DSS_Error.sys.NOT_READY ;BIOS.Error.ATAPI.TimeOut ; 48
+.Size EQU .TABLE - $
\ No newline at end of file
diff --git a/DSS/drivers/Input/MOUSE.ASM b/DSS/drivers/Input/MOUSE.ASM
new file mode 100644
index 0000000..cb915b2
--- /dev/null
+++ b/DSS/drivers/Input/MOUSE.ASM
@@ -0,0 +1,1100 @@
+ MODULE MOUSE_DRV
+;[BEGIN]
+;//MODULE: MOUSE_DRV
+;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
+;//UPDATE: 24-10-1999 DNS Restore module
+
+PORT_MOUSE.Ctrl EQU Z84.SIO.Ch_B.Ctrl
+PORT_MOUSE.Data EQU Z84.SIO.Ch_B.Data
+
+////////////////////////////////////////////////////////////////////////
+ MACRO READ_MOUSE_PACKET
+ IF MOUSE_INT_ENABLED
+ IN A,(PORT_MOUSE.Ctrl)
+ RRCA
+ RET NC
+ ELSE
+ IF MOUSE_READ_PORT_TIMEOUT != 0
+ ;[x] mouse bug
+ LD BC,MOUSE_READ_PORT_TIMEOUT
+ ;
+ ENDIF
+.READ_BYTE: IN A,(PORT_MOUSE.Ctrl)
+ RRCA
+ IF MOUSE_READ_PORT_TIMEOUT != 0
+ ;[x] mouse bug
+ JR C,.NEXT
+ DEC BC
+ LD A,B
+ OR C
+ JR NZ,.READ_BYTE
+ RET
+.NEXT: ;
+ ELSE
+ JR NC,.READ_BYTE
+ ENDIF
+ ENDIF
+ ENDM
+////////////////////////////////////////////////////////////////////////
+
+
+; 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 SENSITIVE)
+; OUTPUT: H - VERTICAL SENSITIVE
+; L - HORIZONTAL SENSITIVE
+;---------------------------------------------
+; COMMAND 0Fh (SET SENSITIVE)
+; INPUT: H - VERTICAL SENSITIVE
+; L - HORIZONTAL SENSITIVE
+;---------------------------------------------
+; 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
+
+API: BIT 7,C
+ JR NZ,EMOUSE
+ INC C
+ DEC C
+ JR Z,MS_INIT ; 0
+ DEC C
+ JR Z,MS_SHOW ; 1
+ DEC C
+ JP Z,MS_HIDD ; 2
+ DEC C
+ JP Z,MS_READ ; 3
+ DEC C
+ JP Z,MS_GOTO ; 4
+ DEC C
+ JR Z,.RESERVED ; 5
+ DEC C
+ JR Z,.RESERVED ; 6
+ DEC C
+ JP Z,MS_VERT ; 7
+ DEC C
+ JP Z,MS_HORZ ; 8
+ DEC C
+ JP Z,MS_CURS ; 9
+ DEC C
+ JP Z,MS_MASK ; 10
+ DEC C
+ JP Z,MS_BCUR ; 11
+ DEC C
+ JR Z,.RESERVED ; 12
+ DEC C
+ JR Z,.RESERVED ; 13
+ DEC C
+ JP Z,MS_GSEN ; 14
+ DEC C
+ JP Z,MS_SENT ; 15
+.RESERVED:
+ 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,.RESERVED
+ DEC C
+ JP Z,M_REFR
+.RESERVED:
+ LD A,DSS_Error.mouse.INVALID_COMMAND
+ SCF
+ RET
+
+;!TODO на биос.
+MS_INIT:
+ DI
+ ; скорость порта - второй множитель
+ LD A,#55
+ OUT (Z84.CTC.Ch_0),A
+ LD A,MOUSE_BAUD.multiplier_2
+ OUT (Z84.CTC.Ch_0),A
+ ; reg 0
+ XOR A
+ OUT (PORT_MOUSE.Ctrl),A
+ ; reg 4 - скорость порта первый множитель
+ LD A,4
+ OUT (PORT_MOUSE.Ctrl),A
+ ;LD A,+(5 | MOUSE_BAUD.multiplier_1) ; parity
+ LD A,+(4 | MOUSE_BAUD.multiplier_1) ; no parity
+ OUT (PORT_MOUSE.Ctrl),A
+ ; reg 3
+ LD A,3
+ OUT (PORT_MOUSE.Ctrl),A
+ LD A,#41
+ ;LD A,#C1
+ OUT (PORT_MOUSE.Ctrl),A
+ ; reg 5
+ LD A,5
+ OUT (PORT_MOUSE.Ctrl),A
+ LD A,%1110'0000 ; bit7 для корректного инита Sega джойстика в порту кемпстон джойстика
+ OUT (PORT_MOUSE.Ctrl),A
+ IF MOUSE_INT_ENABLED
+ ; reg 1
+ LD A,1
+ OUT (PORT_MOUSE.Ctrl),A
+ LD A,%0001'1001
+ OUT (PORT_MOUSE.Ctrl),A
+ ; reg 2
+ LD A,2
+ OUT (PORT_MOUSE.Ctrl),A
+ LD A,#FF ; вектор прерывания #FF
+ OUT (PORT_MOUSE.Ctrl),A
+ ELSE
+ ; reg 1
+ LD A,1
+ OUT (PORT_MOUSE.Ctrl),A
+ XOR A
+ OUT (PORT_MOUSE.Ctrl),A
+ ENDIF
+ ;
+ 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.hide),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.hide),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,(MOUSE_BUTTONS)
+ 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
+.loop: ADD HL,BC
+ DEC A
+ JR NZ,.loop
+ 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
+.loop: ADD HL,BC
+ DEC A
+ JR NZ,.loop
+ 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 SENSITIVE
+; L - HORIZONTAL SENSITIVE
+MS_SENT:
+ LD (SENSEXY),HL
+ XOR A
+ RET
+
+MS_GSEN:
+ LD HL,(SENSEXY)
+ XOR A
+ RET
+;----------------------------------------------------------------------;
+
+
+;----------------------------------------------------------------------;
+RESTORE:
+.sw+1: LD A,#00
+ BIT 7,A
+ JP Z,.TXT
+ ; restore gfx-mode
+ IN A,(SLOT3)
+ LD B,A
+ IN A,(PORT_Y)
+ LD C,A
+ PUSH BC
+ LD A,#50 ;!HARDCODE videopage
+ OUT (SLOT3),A
+.X+1: LD HL,0
+.Y+1: LD DE,0
+ LD A,E
+ EX AF,AF'
+.SCR+1: LD A,0
+ AND 1
+ LD DE,SLOT3.MEM_ADDR ;screen 0
+ JR Z,.adr
+ LD DE,SLOT3.MEM_ADDR+320 ;screen 1
+.adr: ADD HL,DE
+.YSize+1: LD A,0
+ LD XH,A
+ EX AF,AF'
+.loop: ;
+.Xsize+1: 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
+ EX AF,AF'
+ INC A
+ JR Z,.no_dec
+ DEC XH
+ JR NZ,.loop
+.no_dec: POP BC
+ LD A,B
+ OUT (SLOT3),A
+ LD A,C
+ OUT (PORT_Y),A
+ XOR A
+ RET
+.TXT: ; restore txt-mode
+.TXT_X+1: LD HL,#0000
+.TXT_Y+1: LD DE,#0000
+ ;
+ IN A,(PORT_Y)
+ LD XH,A
+ IN A,(SLOT3)
+ LD XL,A
+ ;
+ LD A,#50
+ ;
+ CALL GET_SYMBOL_ADDR
+ ;
+ LD (HL),A
+ INC L
+ LD A,(HL) ;ATTRIBUT
+ ;JR SET_RESTORE_EXIT
+;---------------------------------------------------------------;
+SET_RESTORE_EXIT:
+ LD (HL),A
+ ;
+ LD A,XL
+ OUT (SLOT3),A
+ LD A,XH
+ OUT (PORT_Y),A
+ RET
+;---------------------------------------------------------------;
+GET_SYMBOL_ADDR:;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
+ ;
+ DI
+ OUT (SLOT3),A
+ ;
+ LD A,D
+ ADD A,A
+ ADD A,A ;Y * 4
+ LD L,A
+ LD H,high (SLOT3.MEM_ADDR + #300) ;#300 - описатели экрана
+ ;
+ IN A,(SCREEN_SWITCH)
+ RRCA
+ AND #80
+ OR #01
+ ADD A,E
+ OUT (PORT_Y),A
+ INC L
+ LD A,(HL) ;SIMBOL
+ ;
+ RET
+;---------------------------------------------------------------;
+;----------------------------------------------------------------------;
+;HL/DE - X/Y
+MOUSE: LD A,(MODE_M)
+ LD (RESTORE.sw),A
+ BIT 7,A
+ JP NZ,.GFX
+ ;
+ ; set txt-mode
+.TXT: LD (RESTORE.TXT_X),HL
+ LD (RESTORE.TXT_Y),DE
+ ;
+ IN A,(PORT_Y)
+ LD XH,A
+ IN A,(SLOT3)
+ LD XL,A
+ ;
+ LD A,#54 ;!HARDCODE video page
+ ;
+ CALL GET_SYMBOL_ADDR
+ ;
+ LD BC,(ANDXORS)
+ AND B
+ XOR C
+ LD (HL),A
+ INC L
+ LD A,(HL) ;ATTRIBUT
+ LD BC,(ANDXORA)
+ AND B
+ XOR C
+ JR SET_RESTORE_EXIT
+ ;
+ ;set gfx-mode
+.GFX: CP Dss.SetVMod.grf640x256
+ JR NZ,.NOFIX_640
+ SRL H
+ RR L
+.NOFIX_640: LD IX,M_IMAGE
+ LD A,(M_XSIZE)
+ LD C,A
+ LD B,0
+ LD (REALXS),BC
+ LD (RESTORE.Xsize),BC
+ LD C,B
+ LD (SKIPXF),BC
+ LD A,(M_YSIZE)
+ LD (RESTORE.YSize),A
+ LD C,A
+ LD B,0
+ LD (REALYS),BC
+ LD BC,(YHOT_SP)
+ LD A,E
+ SUB C
+ LD E,A
+ JR NC,.GOOD_Y
+ 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
+.GOOD_Y: LD BC,(XHOT_SP)
+ AND A
+ SBC HL,BC
+ JR NC,.GOOD_X
+ 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
+.GOOD_X: LD (RESTORE.X),HL
+ LD (RESTORE.Y),DE
+ ;
+ PUSH HL
+ IN A,(SLOT3)
+ LD H,A
+ IN A,(PORT_Y)
+ LD L,A
+ EX (SP),HL
+ LD A,#5C ;!HARDCODE videopage
+ OUT (SLOT3),A
+ LD A,E
+ EX AF,AF'
+ IN A,(SCREEN_SWITCH)
+ LD (RESTORE.SCR),A
+ AND 1
+ LD DE,SLOT3.MEM_ADDR ;Screen 0
+ JR Z,.adr
+ LD DE,SLOT3.MEM_ADDR+320 ;Screen 1
+.adr: ADD HL,DE
+ LD D,XH
+ LD E,XL
+ EX DE,HL ;HL - BITMAP
+ LD BC,(REALYS)
+ LD XH,C
+ EX AF,AF'
+ ;
+.loop: LD BC,(SKIPXF)
+ ADD HL,BC
+ LD BC,(REALXS)
+ OUT (PORT_Y),A
+ EX AF,AF'
+ LD (.PUSH_DE),DE
+ LDIR
+.PUSH_DE+1: LD DE,#0000
+ EX AF,AF'
+ INC A
+ JR Z,.exit_loop
+ DEC XH
+ JR NZ,.loop
+ ;
+.exit_loop: POP BC
+ LD A,B
+ OUT (SLOT3),A
+ LD A,C
+ OUT (PORT_Y),A
+ XOR A
+ RET
+;----------------------------------------------------------------------;
+
+CLEAR_MOUSE_BUFFER:
+ IN A,(Z84.SIO.Ch_B.Data)
+ IN A,(Z84.SIO.Ch_B.Ctrl)
+ RRCA
+ IF MOUSE_INT_ENABLED
+ JR C,CLEAR_MOUSE_BUFFER
+ ;
+ XOR A
+ LD (READ_M.Step),A
+ RET
+ ELSE
+ RET NC
+ JR CLEAR_MOUSE_BUFFER
+ ; JR C,CLEAR_MOUSE_BUFFER
+ ; SCF
+ ; RET
+ ENDIF
+
+;----------------------------------------------------------------------;
+
+READ_M: ;[ ] 18/02/2024 проверка на переполнение буфера
+ ; reg 1
+ LD A,1
+ OUT (PORT_MOUSE.Ctrl),A
+ IN A,(PORT_MOUSE.Ctrl)
+ AND %0010'0000 ; check receiver overrun error
+ IF MOUSE_INT_ENABLED
+ JR Z,.Prepare
+ ELSE
+ JR Z,.READ_FIRST_BYTE
+ ENDIF
+ ; reg 0 - error reset
+ LD A,%0011'0000
+ OUT (Z84.SIO.Ch_B.Ctrl),A
+ ; reg 0 - return from int
+ ;LD A,%0011'1000
+ ;OUT (Z84.SIO.Ch_B.Ctrl),A
+ ;
+ JR CLEAR_MOUSE_BUFFER
+ ;
+ IF MOUSE_INT_ENABLED
+.Prepare: LD HL,.Step
+ LD A,(HL)
+ OR A
+ JR Z,.READ_FIRST_BYTE
+ DEC A
+ JR Z,.READ_SECOND_BYTE
+ DEC A
+ JR Z,.READ_THIRD_BYTE
+ XOR A
+ LD (HL),A
+ ENDIF
+.READ_FIRST_BYTE:
+ IN A,(PORT_MOUSE.Ctrl)
+ RRCA
+ RET NC
+ IN A,(PORT_MOUSE.Data)
+ IF MOUSE_INT_ENABLED
+ LD (.Reg_L),A
+ ELSE
+ LD L,A
+ ENDIF
+ AND %0100'0000
+ ;RET Z
+ JP Z,CLEAR_MOUSE_BUFFER
+ ;
+ IF MOUSE_INT_ENABLED
+ INC (HL)
+ ENDIF
+ ;
+.READ_SECOND_BYTE:
+ READ_MOUSE_PACKET
+ ;
+ IN A,(PORT_MOUSE.Data)
+ IF MOUSE_INT_ENABLED
+ LD (.Reg_E),A
+ AND %0100'0000
+ JR Z,.nxt1
+ LD (HL),0
+ JR .READ_FIRST_BYTE
+.nxt1: ;
+ INC (HL)
+ ELSE
+ LD E,A
+ AND %0100'0000
+ ;!TEST
+ ;RET NZ
+ JR Z,.READ_THIRD_BYTE
+ LD L,E
+ JR .READ_SECOND_BYTE
+ ENDIF
+ ;
+.READ_THIRD_BYTE:
+ READ_MOUSE_PACKET
+ ;
+ IN A,(PORT_MOUSE.Data)
+ IF MOUSE_INT_ENABLED
+ LD (.Reg_D),A
+ AND %0100'0000
+ JR Z,.nxt2
+ LD (HL),0
+ JR .READ_FIRST_BYTE
+.nxt2: ;
+ LD (HL),0
+ LD DE,(.Reg_E)
+ LD HL,(.Reg_L)
+ ELSE
+ LD D,A
+ AND %0100'0000
+ ;!TEST
+ ;RET NZ
+ JR Z,.packet_end
+ LD L,D
+ JR .READ_SECOND_BYTE
+.packet_end: ;
+ ENDIF
+ ;
+ ; все три байта пакета прочитаны
+ ;
+ 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 A,L
+ ; AND #30
+ ; RRCA
+ ; RRCA
+ ; RRCA
+ ; RRCA
+ ;
+ LD (MOUSE_BUTTONS),A
+ CALL SENSE
+ LD (MOUSE_COORDINATES),DE
+ ; LD A,E
+ ; LD (MX),A
+ ; LD A,D
+ ; LD (MY),A
+ SCF
+ RET
+ ;
+ IF MOUSE_INT_ENABLED
+.Reg_L: DB 0
+.Reg_E: DB 0
+.Reg_D: DB 0
+.Step: DB 0
+ ENDIF
+
+MCORECT:
+ LD HL,(PIX_X)
+ LD DE,(MOUSE_COORDINATES)
+ 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
+ JR 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,(MOUSE_COORDINATES.Y)
+ 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
+ ; [x] 15/03/2024 теперь поправки чувствительности по координатам работают корректно
+ OR L
+ RET Z
+ DEC A
+ RET Z
+ ; CP 2
+ ; CCF
+ ; JR NC,.check_Y
+ ;
+ LD A,E
+ BIT 7,A
+ LD B,#FF
+ JR Z,.loop
+ LD B,#7F
+ NEG
+.loop: INC B
+ SUB L
+ JR NC,.loop
+ BIT 7,B
+ JR Z,.next
+ LD A,B
+ RES 7,A
+ NEG
+ LD B,A
+ ;
+.next: LD E,B
+ ; [x] 15/03/2024 теперь поправки чувствительности по координатам работают корректно
+.check_Y:
+ ; LD A,H
+ ; CP 2
+ ; CCF
+ ; RET NC
+ ;
+ LD A,D
+ BIT 7,A
+ LD B,#FF
+ JR Z,.loop2
+ LD B,#7F
+ NEG
+.loop2: INC B
+ SUB H
+ JR NC,.loop2
+ BIT 7,B
+ JR Z,.skip2
+ LD A,B
+ RES 7,A
+ NEG
+ LD B,A
+.skip2: 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
+ ;!TEST SIO INT
+ IF MOUSE_INT_ENABLED
+ LD A,%0011'1000 ; return from int
+ OUT (Z84.SIO.Ch_B.Ctrl),A
+ ENDIF
+ RET
+
+M_REFR: CALL CONTROL
+ AND A
+ RET
+
+CONTROL:
+ CALL READ_M
+ RET NC
+ CALL MCORECT
+ ;LD A,#00
+ ; XOR A
+ ; LD (REDY),A
+ RET
+
+REFRESH:
+.hide+1: LD A,#01
+ OR A
+ RET NZ
+ ;
+; REDY+1: LD A,#01
+; OR A
+; RET NZ
+ ;
+ CALL RESTORE
+ LD HL,(PIX_X)
+ LD DE,(PIX_Y)
+ CALL MOUSE
+ ; LD A,#FF
+ ; LD (REDY),A
+ RET
+
+MODE_M: DB #03
+
+PIX_X: DW 160
+PIX_Y: DW 128
+
+MOUSE_COORDINATES:
+.X: DB #00
+.Y: DB #00
+MOUSE_BUTTONS: DB #00
+
+;MB_OLD DB #00
+MIN_X: DW 0
+MAX_X: DW 319
+MIN_Y: DW 0
+MAX_Y: DW 255
+SENSEXY: ; Сэн Сэкси
+.X: DB 0
+.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:
+ DH "00 00 FF FF FF FF FF FF FF FF"
+ DH "00 FE 00 FF FF FF FF FF FF FF"
+ DH "00 FE FE 00 FF FF FF FF FF FF"
+ DH "00 FE FE FE 00 FF FF FF FF FF"
+ DH "00 FE FE FE FE 00 FF FF FF FF"
+ DH "00 FE FE FE FE FE 00 FF FF FF"
+ DH "00 FE FE FE FE FE FE 00 FF FF"
+ DH "00 FE FE FE FE 00 00 00 00 FF"
+ DH "00 FE FE 00 FE 00 FF FF FF FF"
+ DH "00 FE 00 00 FE FE 00 FF FF FF"
+ DH "00 00 FF FF 00 FE 00 FF FF FF"
+ DH "00 FF FF FF 00 FE FE 00 FF FF"
+ DH "FF FF FF FF FF 00 00 FF FF FF"
+ DH "FF FF FF FF FF FF FF FF FF FF"
+ BLOCK 256-($-M_IMAGE),0
+.Size EQU $-M_IMAGE
+
+;//MODULE: MOUSE_DRV
+;[END]
+ ENDMODULE
diff --git a/DSS/drivers/media/ATAPI/CDX.ASM b/DSS/drivers/media/ATAPI/CDX.ASM
new file mode 100644
index 0000000..e0be89b
--- /dev/null
+++ b/DSS/drivers/media/ATAPI/CDX.ASM
@@ -0,0 +1,524 @@
+;[BEGIN]
+;
+; CDX.EXE [command] [-switches] [directory]
+;
+;commands:
+; OPEN
+; EJECT
+; CLOSE
+; COPY
+; LIST
+; DUMP
+; COMMAND
+; -h,? Help page
+
+ DEFINE _MAME 1
+
+
+CR EQU 13
+LF EQU 10
+
+ INCLUDE "Shared_Includes/constants/BIOS_equ.inc"
+ INCLUDE "Shared_Includes/constants/dss_equ.inc"
+ INCLUDE "Shared_Includes/constants/Sp2000.inc"
+
+
+ ORG #8100-22
+
+ DB "EXE" ;EXE ID
+ DB #00 ;EXE VERSION
+ DW #0016 ;CODE OFFSET LOW
+ DW #0000 ;CODE OFFSET HIGH
+ DW #0000 ;END-BEG ;PRIMARY LOADER
+ DW #0000 ;
+ DW #0000 ;RESERVED
+ DW #0000 ;
+ DW START ;LOAD ADDRESS
+ DW START ;START ADDRESS
+ DW #BFFF ;STACK ADDRESS
+ ;DS 490
+
+START: PUSH IX
+ ;
+ XOR A
+ ;
+ ; LD HL,BUF1
+ ; LD (HL),A
+ ; LD DE,BUF1+1
+ ; LD BC,BUFFERS_END-1
+ ; LDIR
+ ;
+ LD HL,'\' ;
+ LD (DIRSPEC),HL
+ ;
+ LD HL,BUF1
+ LD B,BUFERS_NUMBER
+.initBuffersLoop:
+ LD (HL),A
+ INC H
+ DJNZ .initBuffersLoop
+ ;
+
+ LD A,MSG_HELLO
+ CALL MESSAGE
+ ;
+ CALL INIT
+ JR NC,.next
+ ;
+ LD HL,PRM1
+ LD (HL),0
+ LD A,MSG_NO_CDROM
+ CALL MESSAGE
+ LD A,1
+ LD (STOPMODE),A
+ ;
+.next: LD C,Dss.Version
+ RST ToDSS ;GET DSS VERSION
+ EX DE,HL
+ AND A
+ LD DE,#0146 ;1.70
+ SBC HL,DE ;CHECK DSS VERSION
+ POP HL
+ ;
+ JP C,OLD_DSS
+ LD IX,BUF_PTRS
+ CALL EX_COMMAND_LINE
+
+ CALL MALLOC
+ JR C,QUIT
+
+ ;CALL FIND_CDROM
+ LD A,(STOPMODE)
+ OR A
+ CALL Z,COMMAND
+
+ CALL MDEALLOC
+QUIT: CALL CRLF
+.loop: LD BC,Dss.Exit
+ RST ToDSS
+ JP .loop
+
+OLD_DSS
+ LD A,MSG_OLD_DSS
+ CALL MESSAGE
+ JR QUIT
+
+HNDMEM DB #FF
+
+MALLOC
+ LD BC,2*256 + Dss.GetMem
+ RST ToDSS
+ JR NC,M_ALLOK
+ LD A,MSG_MEMERROR
+ CALL MESSAGE
+ SCF
+ RET
+M_ALLOK
+ LD (HNDMEM),A
+ LD BC,1*256 + Dss.SetWin3
+ RST ToDSS
+ LD HL,BANKTBL
+ LD C,BIOS.GetMemBlkPages
+ LD A,(HNDMEM)
+ JP ToBIOS
+
+MDEALLOC
+ LD A,(HNDMEM)
+ LD C,Dss.FreeMem
+ JP ToDSS
+
+; FIND_CDROM
+; LD IX,DEV_CFG
+; LD C,BIOS.DRV_LIST
+; RST ToBIOS
+; LD A,(IX+3) ;CDROM
+; OR A
+; JR Z,W_O_CD
+; LD A,(CDDRIVE)
+; INC A
+; RET NZ
+; LD A,SLAVE ;DEFAULT
+; LD (CDDRIVE),A
+; RET
+; W_O_CD LD A,MSG_NO_CDROM
+; CALL MESSAGE
+; LD A,1
+; LD (STOPMODE),A
+; SCF
+; RET
+
+;BUF_PRINT
+; LD HL,BUF_PTRS
+;BUF_PL LD E,(HL)
+; INC HL
+; LD D,(HL)
+; INC HL
+; LD A,D
+; OR E
+; RET Z
+; PUSH HL
+; EX DE,HL
+; LD C,Dss.PCHARS
+; RST ToDSS
+; CALL CRLF
+; POP HL
+; JR BUF_PL
+
+;OPEN_FILE
+; LD HL,FILENAME
+; XOR A
+; LD C,Dss.OPEN
+; RST ToDSS
+; LD (FILEHND),A
+; RET NC
+; LD HL,FILENAME
+; CALL PUTVAR
+; LD A,MSG_CANT_OPEN
+; CALL MESSAGE
+; SCF
+; RET
+
+;CLOSE_FILE
+; LD A,(FILEHND)
+; LD C,Dss.CLOSE
+; RST ToDSS
+; RET
+
+INIT: XOR A
+ LD (STOPMODE),A
+ DEC A
+ LD (CDDRIVE),A
+ ;
+ LD BC,+(#C0-1)*256 + BIOS.DRV_DETECT
+.loop: INC B
+ LD A,B
+ CP #C4
+ SCF
+ RET Z
+ PUSH BC
+ RST ToBIOS
+ POP BC
+ JR C,.loop
+ LD A,B
+ LD (CDDRIVE),A
+ RET
+ ;
+ ; LD C,BIOS.DRV_RESET
+ ; JP ToBIOS
+; RET
+
+;VARIABLES
+
+; FILENAME DS 256
+; FILEHND DB #FF
+
+STOPMODE DB #00
+
+ INCLUDE "cmdparse.asm"
+ INCLUDE "command.asm"
+ INCLUDE "cd_dos.asm"
+
+CRLF: PUSH HL
+ LD HL,MSG0.crlf
+ LD C,Dss.PChars
+ ; LD A,#0D
+ ; LD C,Dss.PutChar
+ ; RST #10
+ ; LD A,#0A
+ ; LD C,Dss.PutChar
+ RST ToDSS
+ POP HL
+ RET
+;
+
+ERROR CP MAX_DSS_ERR
+ LD E,A
+ LD D,0
+ JP C,ERR_MSG
+ LD E,D
+ JP ERR_MSG
+
+ERR_MSG PUSH DE
+ LD HL,ERRCDX
+ CALL PRINTZ
+ POP DE
+ CALL FMESAGE
+ CALL PRINTZ
+ CALL CRLF
+ JP CRLF
+
+
+FMESAGE INC DE
+ LD HL,SYS_ERRORS
+ LD BC,SYS_ERRORS.Size
+LCPIR XOR A
+ CPIR
+ RET PO
+ RET NZ
+ DEC DE
+ LD A,D
+ OR E
+ JP NZ,LCPIR
+ RET
+
+MAX_DSS_ERR EQU 33
+
+ERRCDX DB "CDX: ",0
+
+ include 'Shared_includes/constants/dss_errors.z80'
+; ERR0 DB #00
+; DB "Unknown error",0
+; DB "Invalid function",0
+; DB "Invalid drive number",0
+; DB "File not found",0
+; DB "Path not found",0
+; DB "Invalid handle",0
+; DB "Extended error 6",0
+; DB "File exist",0
+; DB "File read only",0
+; DB "Root overflow",0
+; DB "No free space",0
+; DB "Directory not empty",0
+; DB "Can't delete current directory",0
+; DB "Invalid media",0
+; DB "Unknown operation",0 ;R02
+; DB "Directory exist",0
+; DB "Invalid filename",0
+; DB "Invalid EXE-file",0
+; DB "Not supported EXE-file",0
+; DB "Access denied",0
+; DB "Not ready",0
+; DB "Seek error",0
+; DB "Sector not found",0
+; DB "CRC error",0
+; DB "Write protect",0
+; DB "Read error",0
+; DB "Write error",0
+; DB "Drive failure",0
+; DB "Extended error 28",0
+; DB "Extended error 29",0
+; DB "No free memory",0
+; DB "Invalid memory block",0
+; DB "Extended error 32",0
+; DB "Extended error 33",0
+; DB "Extended error 34",0
+; DB "35",0
+; DB "36",0
+; DB "37",0
+; DB "38",0
+; DB "39",0
+; DB "40",0
+; DB "41",0
+; DB "42",0
+; DB "43",0
+; DB "44",0
+; DB "45",0
+; DB "46",0
+; DB "47",0
+; DB "48",0
+; DB "49",0
+; DB "50"
+; DB 0
+; ERR1
+
+;FIND_MESSAGE
+ ; LD E,A
+ ; LD D,0
+ ; CALL MESAGE
+ ; RET
+MESSAGE LD E,A
+ LD D,0
+ CALL MESAGE
+ JP PRINTZ
+;
+
+MESAGE INC DE
+ LD HL,MSG0
+ LD BC,MSG1-MSG0
+LCPIR2 XOR A
+ CPIR
+ RET PO
+ RET NZ
+ DEC DE
+ LD A,D
+ OR E
+ JP NZ,LCPIR2
+ RET
+
+PRINTZ LD A,(HL)
+ INC HL
+ OR A
+ RET Z
+ CP "%"
+ JR NZ,PRINTZ2
+ LD A,(HL)
+ INC HL
+ SUB "1"
+ PUSH HL
+ LD L,A
+ LD H,0
+ ADD HL,HL
+ ADD HL,HL
+ ADD HL,HL
+ ADD HL,HL
+ LD BC,PRM1
+ ADD HL,BC
+ LD C,Dss.PChars
+ RST ToDSS
+ POP HL
+ JR PRINTZ
+PRINTZ2 LD C,Dss.PutChar
+ RST ToDSS
+ JP PRINTZ
+
+PRINT_ LD BC,1*256 + BIOS.LP_PRINT_SYM
+ JP ToBIOS
+
+PUTVAR LD DE,PRM1
+PUTPRM LD BC,15
+PUTPRMA LD A,(HL)
+ LDI
+ RET PO
+ OR A
+ JR NZ,PUTPRMA
+ RET
+
+CDDRIVE DB #FF
+
+PRM1 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+PRM2 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+PRM3 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+PRM4 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+PRM5 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+PRM6 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+PRM7 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+PRM8 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+PRM9 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+
+
+MSG_HELLO EQU 0
+MSG_TRAY_OPEN EQU 1
+MSG_TRAY_CLOSE EQU 2
+MSG_USAGE EQU 3
+MSG_UNK_DEVICE_NUMBER EQU 4
+MSG_UNK_COMMAND EQU 5
+;MSG_DISABLED EQU 6
+;MSG_ENABLED EQU 7
+MSG_DONE EQU 6 ;8
+MSG_NO_CDROM EQU 7 ;9
+MSG_IO_ERROR EQU 8 ;10
+MSG_OLD_DSS EQU 9 ;11
+MSG_COPYFILE EQU 10 ;12
+MSG_DIRHEAD EQU 11 ;13
+MSG_DIRENTRY EQU 12 ;14
+MSG_MEMERROR EQU 13 ;15
+MSG_COPYTO EQU 14 ;16
+MSG_CD_READ_ERR EQU 15 ;17
+MSG_F_WRITE_ERR EQU 16 ;18
+MSG_FAILURE EQU 17 ;19
+MSG_ERR_DEST EQU 18 ;20
+MSG_COPYABORTED EQU 19 ;21
+
+MSG0 BYTE 0
+;0
+ BYTE "CDROM eXtension utility v1.01, 2023 (c) Sprinter Team",CR,LF
+ DZ "Type CDX.EXE -? for help.",CR,LF,CR,LF
+;1
+ DZ "Opening tray..."
+;2
+ DZ "Closing tray..."
+ ; 01234567890123456789012345678901234567890123456789012345678901234567890123456789
+;3
+ BYTE ' Usage: CDX.EXE [-switches] [command] [param1] [param2]',CR,LF,CR,LF
+ BYTE 'Commands:',CR,LF
+ BYTE ' CDX.EXE OPEN - Open tray',CR,LF
+ BYTE ' CDX.EXE CLOSE - Close tray',CR,LF
+ BYTE ' CDX.EXE LIST [\cd_path\][pattern] - Show CDROM filelist',CR,LF
+ BYTE ' CDX.EXE COPY \source d:\destination\ - Copy file(s) from CDROM to another disk',CR,LF
+ BYTE ' CDX.EXE DUMP sector [offset] - Show sector dump from CDROM',CR,LF
+ BYTE CR,LF
+ BYTE 'Switches:',CR,LF
+ BYTE ' -1 CDROM installed as Primary IDE Master device',CR,LF
+ BYTE ' -2 CDROM installed as Primary IDE Slave device',CR,LF
+ BYTE ' -3 CDROM installed as Secondary IDE Master device',CR,LF
+ BYTE ' -4 CDROM installed as Secondary IDE Slave device',CR,LF
+ DZ ' -h,? Help page',CR,LF
+;4
+ DZ " Error: Unknown device number %1",CR,LF
+;5
+ DZ " Error: Unknown command: %1",CR,LF
+ ;6
+ ;DZ "Disabled"
+ ;7
+ ;DZ "Enabled"
+;6
+ DZ "Done!",CR,LF
+;7
+ DZ " Error: Can't find CDROM device %1",CR,LF
+;8
+ DZ " Error: I/O Error",CR,LF
+;9
+ DZ " Error: Need DSS version 1.70 or higher",CR,LF
+;10
+ DZ "Copying "
+;11
+ DZ "Directory of CDROM:"
+;12 FILENAME EXT SIZE DATE TIME
+ DZ "%1 %2 %3 %4 %5",CR,LF
+;13
+ DZ " Error: Memory allocation error",CR,LF
+;14
+ DZ " to "
+;15
+ DZ " Error: Reading failure",CR,LF
+;16
+ DZ " Error: Writing failure",CR,LF
+;17
+ DZ "Failure!",CR,LF
+;18
+ DZ " Error: Can't open destination file",CR,LF
+;19
+ DZ "Copying aborted",CR,LF
+;20
+.crlf: DZ CR,LF
+;21
+ BYTE 0
+MSG1
+
+BUF_PTRS
+ DW BUF1,BUF2,BUF3,BUF4,0
+
+;-------------------------------/BUFFERS\-------------------------------;
+FF_STRUCT:
+ DB "12345678"
+ DB "123"
+ DB #00
+ DW 0,0,0,0
+CDFPOSH DW 0 ;CLUSTER HIGH
+CDFTIME DW 0 ;TIME
+CDFDATE DW 0 ;DATE
+CDFPOSL DW 0 ;CLUSTER
+CDFSIZE DW 0,0 ;SIZE
+CDFATTR DB #00 ;ATTR
+CDFNAME DB "12345678123",0
+;
+BUFFERS_START EQU $
+ ;DS 256-($-FF_STRUCT)
+
+DIRSPEC: EQU FF_STRUCT+256
+ ;DB '\',0
+ ;DS 254
+BUF1 EQU DIRSPEC+256
+BUF2 EQU DIRSPEC+256+256
+BUF3 EQU DIRSPEC+256+256+256
+BUF4 EQU DIRSPEC+256+256+256+256
+ARGCBUF EQU DIRSPEC+256+256+256+256+256
+DUMPBUF EQU DIRSPEC+256+256+256+256+256+256
+BUFFERS_END EQU DUMPBUF+2048-BUFFERS_START
+;
+BUFERS_NUMBER EQU 6
+;
+ ASSERT (DUMPBUF+2048 < #C000), "NO FREE SPACE FOR BUFFERS"
+;-----------------------------------------------------------------------;
+DEV_CFG
+;[END]
diff --git a/DSS/drivers/media/ATAPI/CDX.TXT b/DSS/drivers/media/ATAPI/CDX.TXT
new file mode 100644
index 0000000..92da5ac
--- /dev/null
+++ b/DSS/drivers/media/ATAPI/CDX.TXT
@@ -0,0 +1,7 @@
+
+ CDROM eXtension utility version 1.01
+ ------------------------------------------------
+
+ It's utility came for solving the problem with support CDROM in DSS ver 1.x.
+It's allow browse and copy files that stored on your CD. Also utility has commands
+for tray control.
\ No newline at end of file
diff --git a/DSS/drivers/media/ATAPI/CMDPARSE.ASM b/DSS/drivers/media/ATAPI/CMDPARSE.ASM
new file mode 100644
index 0000000..0b23d08
--- /dev/null
+++ b/DSS/drivers/media/ATAPI/CMDPARSE.ASM
@@ -0,0 +1,89 @@
+
+; HL - exe-prefix
+; IX - pointers at work buffers
+EX_COMMAND_LINE
+ INC HL
+NEXTPR LD DE,ARGCBUF
+ LD BC,Dss.EX_Path.GSWITCH
+ RST ToDSS
+ PUSH AF
+ PUSH HL
+ LD A,(ARGCBUF)
+ OR A
+ JR Z,EOCL ;end of command line
+ CP "-"
+ JR Z,ITCKEY
+ CP "/"
+ JR Z,ITCKEY
+ LD HL,ARGCBUF
+ LD E,(IX+0)
+ LD D,(IX+1)
+ INC IX
+ INC IX
+ LD A,D
+ OR E
+ JR Z,CL_FAILURE
+; LD A,1
+; LD (NAME_FLG),A
+MOVNAME LD A,(HL)
+ LDI
+ OR A
+ JR NZ,MOVNAME
+EOCL POP HL
+ POP AF
+ JR NC,NEXTPR
+ RET
+
+CL_FAILURE
+ POP HL
+ POP AF
+ RET
+
+ITCKEY: LD A,(ARGCBUF+1)
+ CP "5"
+ JR NC,.HELP
+ CP "1"
+ JR NC,.number
+ ; ERROR
+ LD HL,ARGCBUF+1
+ CALL PUTVAR
+ LD A,MSG_UNK_DEVICE_NUMBER
+ CALL MESSAGE
+ LD A,1
+ LD (STOPMODE),A
+ JR EOCL
+ ;
+.number:;
+ SUB A,'1'
+ OR #C0
+ LD (CDDRIVE),A
+ LD C,BIOS.DRV_RESET
+ RST ToBIOS
+ JR NC,EOCL
+ ;
+ LD HL,ARGCBUF+1
+ CALL PUTVAR
+ LD A,MSG_NO_CDROM
+ CALL MESSAGE
+ LD A,1
+ LD (STOPMODE),A
+ SCF
+ JR CL_FAILURE
+ ;
+.HELP: LD A,MSG_USAGE
+ CALL MESSAGE
+ LD A,1
+ LD (STOPMODE),A
+ JR EOCL
+
+
+
+; MAS_CD:
+; ;LD A,MASTER
+; ;LD (CDDRIVE),A
+; JR EOCL
+
+; SLA_CD:
+; ;LD A,SLAVE
+; ;LD (CDDRIVE),A
+; JR EOCL
diff --git a/DSS/drivers/media/ATAPI/COMMAND.ASM b/DSS/drivers/media/ATAPI/COMMAND.ASM
new file mode 100644
index 0000000..ccd493d
--- /dev/null
+++ b/DSS/drivers/media/ATAPI/COMMAND.ASM
@@ -0,0 +1,942 @@
+
+COMMAND LD HL,BUF1
+ LD A,(HL)
+ OR A
+ RET Z
+ DEC HL
+SKIPSP INC HL
+ LD A,(HL)
+ CP 9
+ JR Z,SKIPSP
+ CP " "
+ JR Z,SKIPSP
+COMP01 LD D,H
+ LD E,L
+ XOR A
+ LD BC,255
+ CPIR
+ LD A,254
+ SUB C
+ LD C,A
+ LD HL,CMDLIST
+COMP004 PUSH BC
+ PUSH DE
+COMP000 LD A,(DE)
+ CP #61
+ JP C,COMP001
+ CP #7B
+ JP NC,COMP001
+ SUB #20
+COMP001 CP (HL)
+ JP NZ,COMP002
+ INC HL
+ INC DE
+ DEC C
+ JP NZ,COMP000
+ XOR A
+ CP (HL)
+ JP NZ,COMP002
+ POP BC
+ POP BC
+ LD A,(DE)
+ CP " "
+ JR NZ,NOSPC
+ INC DE
+NOSPC INC HL
+ LD A,(HL)
+ INC HL
+ LD H,(HL)
+ LD L,A
+ JP (HL)
+
+COMP002 XOR A
+ LD C,#FF
+ CPI
+ JP NZ,$-2
+ INC HL
+ INC HL
+ POP DE
+ POP BC
+ LD A,(HL)
+ OR A
+ JP NZ,COMP004
+ LD HL,BUF1
+ CALL PUTVAR
+ LD A,MSG_UNK_COMMAND
+ CALL MESSAGE
+ SCF
+ RET
+
+CMDLIST DB "CLOSE",0
+ DW CCLOSE
+ DB "COPY",0
+ DW CCOPY
+ DB "DUMP",0
+ DW CDUMP
+ DB "EJECT",0
+ DW COPEN
+ DB "HELP",0
+ DW CHELP
+ DB "LIST",0
+ DW CDIR
+ DB "OPEN",0
+ DW COPEN
+ DB "SECTORDUMP",0
+ DW CDUMP
+ DB 0
+
+CHELP: LD A,MSG_USAGE
+ JP MESSAGE
+
+CCLOSE: LD A,MSG_TRAY_CLOSE
+ CALL MESSAGE
+ LD A,(CDDRIVE)
+ LD BC,BIOS.DRV_EXTENDED.CD_Close
+ RST ToBIOS
+ LD A,MSG_DONE
+ JP MESSAGE
+
+COPEN: LD A,MSG_TRAY_OPEN
+ CALL MESSAGE
+ LD A,(CDDRIVE)
+ LD BC,BIOS.DRV_EXTENDED.CD_Eject
+ RST ToBIOS
+ LD A,MSG_DONE
+ JP MESSAGE
+
+
+CCOPY: CALL CHANGEDISK
+ JR NC,.CH2OK
+ JP ERROR
+.CH2OK: CALL EX_COPY_PARAM
+ LD HL,BUF2
+ LD DE,FF_STRUCT
+ LD A,FAT_ATTR.NoDIRnoVolID
+ LD B,1
+ CALL F_FIRST
+ JP C,ERROR
+.COPIER:
+ CALL MAKECOPY
+ RET C
+ LD A,(COPYMODE)
+ BIT DSTFILE,A
+ RET NZ
+;
+ LD C,Dss.ScanKey
+ RST ToDSS
+ JR Z,.NONSTOP
+ LD HL,#011B ;ESC
+ AND A
+ SBC HL,DE
+ JR NZ,.NONSTOP
+ LD A,MSG_COPYABORTED
+ CALL MESSAGE
+ SCF
+ RET
+.NONSTOP:
+ LD DE,FF_STRUCT
+ CALL F_NEXT
+ JR NC,.COPIER
+ XOR A
+ RET
+
+; IFNOTFOUND
+; CALL ERROR
+; RET
+
+;IFOK
+MAKECOPY:
+ LD A,(COPYMODE)
+ BIT SRCPATT,A
+ JR NZ,.WITH_SRC_PATT
+ BIT DSTFILE,A
+ JR NZ,.WITH_DST_FILE
+.WITH_SRC_PATT:
+ LD HL,CDFNAME
+.YCR1: LD A,(HL)
+ CP "A"
+ JR C,.NCR1
+ CP "Z"+1
+ JR NC,.NCR1
+ ADD A,#20
+ LD (HL),A
+.NCR1: OR A
+ INC HL
+ JR NZ,.YCR1
+;
+ LD HL,CDFNAME
+ LD DE,(SRC_PUT_ADR)
+.CZSL2: LD A,(HL)
+ LDI
+ OR A
+ JR NZ,.CZSL2
+;
+ LD A,(COPYMODE)
+ BIT DSTFILE,A
+ JR NZ,.WITH_DST_FILE
+;
+ LD HL,CDFNAME
+ LD DE,(DST_PUT_ADR)
+.CZSL1: LD A,(HL)
+ LDI
+ OR A
+ JR NZ,.CZSL1
+;
+.WITH_DST_FILE:
+ LD HL,BUF3
+ LD A,(CDFATTR)
+ LD C,Dss.Create
+ RST ToDSS
+ JR NC,.OFOK
+ LD A,MSG_ERR_DEST
+ CALL MESSAGE
+ SCF
+ RET
+ ;
+.OFOK: LD (FHND),A
+ LD A,MSG_COPYFILE
+ CALL MESSAGE
+ LD HL,BUF2
+ LD C,Dss.PChars
+ RST ToDSS
+ LD A,MSG_COPYTO
+ CALL MESSAGE
+ LD HL,BUF3
+ LD C,Dss.PChars
+ RST ToDSS
+ LD A," "
+ LD C,Dss.PutChar
+ RST ToDSS
+ LD IX,FF_STRUCT
+
+ LD E,(IX+LEN1)
+ LD D,(IX+LEN2)
+ LD (CL_SIZE),DE
+ LD E,(IX+LEN3)
+ LD D,(IX+LEN4)
+ LD (CH_SIZE),DE
+
+ LD E,(IX+CLU1)
+ LD D,(IX+CLU2)
+ LD (CL_OFFSET),DE
+ LD E,(IX+CLU3)
+ LD D,(IX+CLU4)
+ LD (CH_OFFSET),DE
+.CDCOPY_LOOP:
+ CALL RCDFSB ;!!!!!
+ JR C,.COPY_FAULT
+ CALL WDATAB
+ JR C,.COPY_FAULT
+ JR NZ,.CDCOPY_LOOP
+;
+ LD DE,(CDFTIME)
+ LD BC,(CDFDATE)
+ CALL RMKTIME
+ LD A,(FHND)
+ LD C,Dss.Put_D_T ;COPY DATE AND TIME
+ RST ToDSS
+;
+ LD A,(FHND)
+ LD C,Dss.Close
+ RST ToDSS
+ LD A,MSG_DONE
+ CALL MESSAGE
+ AND A
+ RET
+.COPY_FAULT:
+ LD A,(FHND)
+ LD C,Dss.Close
+ RST ToDSS
+ SCF
+ RET
+
+EX_COPY_PARAM
+ LD HL,BUF2 ;SOURCE
+ LD BC,255
+ XOR A
+ CPIR
+ DEC HL
+ EX DE,HL
+ LD HL,256
+ AND A
+ SBC HL,BC
+ LD B,H
+ LD C,L
+ EX DE,HL
+ LD A,'\' ;
+ CPDR
+ INC HL
+ INC HL
+ LD (SRC_PUT_ADR),HL
+;
+ LD HL,BUF2
+ LD BC,Dss.EX_Path.GET_ALL
+ RST ToDSS
+ AND #80
+ LD A,(COPYMODE)
+ SET SRCPATT,A
+ JR NZ,.NOPATSR
+ RES SRCPATT,A
+.NOPATSR:
+ LD (COPYMODE),A
+ LD HL,BUF3 ;DESTINATION
+ LD BC,Dss.EX_Path.GET_ALL
+ RST ToDSS
+ AND #81 ;PATTERN & FILENAME
+ CP #01 ;IF FILENAME=1 AND PATTERN=0
+ LD A,(COPYMODE)
+ SET DSTFILE,A
+ JR Z,.SINGC1
+ RES DSTFILE,A
+.SINGC1:
+ LD (COPYMODE),A
+ RET Z
+ LD HL,BUF3
+ LD BC,255
+ XOR A
+ CPIR ;MOVE TO END OF STRING
+ DEC HL ;MOVE TO ZERO-CHAR
+ DEC HL ;MOVE TO LAST CHAR
+ LD A,(HL) ;GET LAST CHAR
+ INC HL ;MOVE TO ZERO-CHAR
+ CP '\' ;IS IT BACKSLASH?
+ LD (DST_PUT_ADR),HL ;SAVE END ADDRESS
+ RET Z
+ LD A,'\' ;
+ LD (HL),A ;PUT BACKSLASH TO THE END OF STRING
+ INC HL ;MOVE TO THE NEW END OF STRING
+ LD (DST_PUT_ADR),HL ;SAVE END ADDRESS
+ LD (HL),0 ;PUT ZERO CHAR
+ RET
+
+DSTFILE EQU 0 ;SPECIFIED DESTINATION FILENAME
+SRCPATT EQU 3 ;SPECIFIED SOURCE PATTERN A??.*
+
+COPYMODE DB 0
+
+SRC_PUT_ADR DW BUF2
+DST_PUT_ADR DW BUF3
+
+CL_OFFSET DW 0
+CH_OFFSET DW 0
+CL_SIZE DW 0
+CH_SIZE DW 0
+BYTECOUNTER DW 0
+
+WDATAB: LD DE,(BYTECOUNTER)
+ LD A,D
+ OR E
+ RET Z
+ LD HL,#C000
+ LD A,(FHND)
+ LD C,Dss.Write
+ RST ToDSS
+ JR C,.WRDERR
+ XOR A
+ INC A
+ RET
+.WRDERR:
+ LD A,MSG_FAILURE
+ CALL MESSAGE
+ CALL CRLF
+ LD A,MSG_F_WRITE_ERR
+ CALL MESSAGE
+ XOR A
+ SCF
+ RET
+
+RCDFSB: LD HL,(CL_SIZE)
+ LD DE,(CH_SIZE)
+ LD A,H
+ OR L
+ OR D
+ OR E
+ LD BC,0
+ LD (BYTECOUNTER),BC
+ RET Z ;SIZE = 0
+ AND A
+ LD BC,#4000 ;BLOCKSIZE
+ SBC HL,BC
+ LD B,C
+ EX DE,HL
+ SBC HL,BC
+ EX DE,HL
+ LD BC,#4000
+ JR NC,.RC_NOCAR
+;CORRECT RESULT
+ ADD HL,BC
+ LD B,C
+ EX DE,HL
+ ADC HL,BC
+ EX DE,HL
+ LD B,H
+ LD C,L
+ LD HL,0
+ LD DE,0
+.RC_NOCAR:
+ LD (CL_SIZE),HL
+ LD (CH_SIZE),DE
+ LD (BYTECOUNTER),BC
+ ;
+ LD A,B
+ SRL B
+ SRL B
+ SRL B
+ AND #07
+ OR C
+ JR Z,.RC_EVEN_NUM
+ INC B
+.RC_EVEN_NUM:
+ LD A,B
+ LD C,B
+ LD B,0
+ ;
+ LD IX,(CL_OFFSET)
+ LD HL,(CH_OFFSET)
+ PUSH IX
+ PUSH HL
+ ADD IX,BC
+ LD C,B
+ ADC HL,BC
+ LD (CL_OFFSET),IX
+ LD (CH_OFFSET),HL
+ POP HL
+ POP IX
+ LD B,A
+ LD A,(CDDRIVE)
+ LD DE,#C000
+ LD C,BIOS.DRV_READ
+ RST ToBIOS
+ LD BC,(BYTECOUNTER)
+ RET NC
+ LD A,MSG_FAILURE
+ CALL MESSAGE
+ CALL CRLF
+ LD A,MSG_CD_READ_ERR
+ CALL MESSAGE
+ SCF
+ RET
+
+
+FHND DB #FF
+
+;----------------------
+CDIR: CALL CHANGEDISK
+ JP C,ERROR
+ LD HL,BUF2
+ LD A,(HL)
+ OR A
+ JR NZ,.NODEFD
+ LD HL,DEFDIR
+ JR .PATPRESNT
+.NODEFD:
+ LD BC,Dss.EX_Path.GET_ALL
+ RST ToDSS
+ BIT 7,A ;PATTERN
+ LD HL,BUF2
+ JR NZ,.PATPRESNT
+ ;
+ LD BC,255
+ XOR A
+ CPIR ;MOVE TO END OF STRING
+ DEC HL ;MOVE TO ZERO-CHAR
+ DEC HL ;MOVE TO LAST CHAR
+ LD A,(HL) ;GET LAST CHAR
+ INC HL ;MOVE TO ZERO-CHAR
+ CP '\' ;IS IT BACKSLASH?
+ JR Z,.WITHSL9
+ LD A,'\' ;
+ LD (HL),A ;PUT BACKSLASH TO THE END OF STRING
+ INC HL ;MOVE TO THE NEW END OF STRING
+.WITHSL9:
+ LD A,"*"
+ LD (HL),A
+ INC HL
+ LD (HL),"."
+ INC HL
+ LD (HL),A
+ INC HL
+ LD (HL),0
+ LD HL,BUF2
+.PATPRESNT
+ LD DE,FF_STRUCT
+ LD A,FAT_ATTR.NoVolID
+ LD B,0
+ CALL F_FIRST
+ JP C,ERROR
+.CDIR_HEAD:
+ LD A,MSG_DIRHEAD
+ CALL MESSAGE
+ LD HL,DIRSPEC
+ LD C,Dss.PChars
+ RST ToDSS
+ CALL CRLF
+ CALL CRLF
+.CDIR_LOOP:
+ LD HL,CDFNAME
+ CALL PNAME
+ LD DE,FF_STRUCT
+ CALL F_NEXT
+ JR NC,.CDIR_LOOP
+ RET
+
+; FF_STRUCT
+; DB "12345678"
+; DB "123"
+; DB #00
+; DW 0,0,0,0
+; CDFPOSH DW 0 ;CLUSTER HIGH
+; CDFTIME DW 0 ;TIME
+; CDFDATE DW 0 ;DATE
+; CDFPOSL DW 0 ;CLUSTER
+; CDFSIZE DW 0,0 ;SIZE
+; CDFATTR DB #00 ;ATTR
+; CDFNAME DB "12345678123",0
+; ; DS 44
+; DS 256-($-FF_STRUCT)
+
+PNAME LD BC,8
+ LD DE,PRM1
+ LDIR
+ XOR A
+ LD (DE),A
+ LD DE,PRM2
+ LDI
+ LDI
+ LDI
+ LD (DE),A
+ LD IX,FF_STRUCT
+ CALL PRNSIZE
+ CALL PRNDATE
+ CALL PRNTIME
+ LD A,MSG_DIRENTRY
+ JP MESSAGE
+
+PRNDATE LD B,(IX+25)
+ LD C,(IX+24)
+ LD HL,SIZEBFF
+ CALL DATE
+ LD (HL),0
+ LD HL,SIZEBFF
+ LD DE,PRM4
+ LD A,(HL)
+ CP "0"
+ JP NZ,PUTPRM
+ LD (HL),#20
+ JP PUTPRM
+
+PRNTIME LD B,(IX+22)
+ LD C,(IX+23)
+ LD HL,SIZEBFF
+ CALL TIME
+ LD (HL),0
+ LD HL,SIZEBFF
+ LD DE,PRM5
+ LD A,(HL)
+ CP "0"
+ JP NZ,PUTPRM
+ LD (HL),#20
+ JP PUTPRM
+
+TIME: SRL C
+ RR B
+ SRL C
+ RR B
+ SRL C
+ RR B
+ SRL B
+ SRL B
+ LD A,C
+ CALL NUMB
+ LD (HL),":"
+ INC HL
+ LD A,B
+ JP NUMB
+
+DATE: LD A,C
+ AND #1F
+ PUSH BC
+ CALL NUMB
+ LD (HL),"."
+ INC HL
+ POP BC
+ LD A,C
+ SRL B
+ RLA
+ RLA
+ RLA
+ RLA
+ AND #0F
+ CALL NUMB
+ LD (HL),"."
+ INC HL
+ LD A,B
+ ADD A,#50
+ CP 100
+ JP C,NUMB
+.SUB100:
+ SUB 100
+ CP 100
+ JP C,NUMB
+ JR .SUB100
+
+NUMB: LD C,#2F
+.NUMB1: INC C
+ SUB 10
+ JP NC,.NUMB1
+ ADD A,10
+ ADD A,#30
+ LD (HL),C
+ INC HL
+ LD (HL),A
+ INC HL
+ RET
+
+PRNSIZE LD A,(IX+32)
+ LD HL,DIRIDD
+ AND #10
+ JP NZ,.PRZ
+ LD L,(IX+28)
+ LD H,(IX+29)
+ EXX
+ LD L,(IX+30)
+ LD H,(IX+31)
+ EXX
+ PUSH IX
+ CALL MAKE_LN
+ LD HL,L32BIT_+9
+ LD A,(HL)
+ CP #20
+ JR NZ,.ALR
+ LD A,#30
+ LD (HL),A
+.ALR: LD DE,SIZEBFF
+ LD HL,L32BIT_;; +1
+ LDI
+ LD A," "
+ LD (DE),A
+ INC DE
+ LDI
+ LDI
+ LDI
+ LD (DE),A
+ INC DE
+ LDI
+ LDI
+ LDI
+ LD (DE),A
+ INC DE
+ LDI
+ LDI
+ LDI
+ LD HL,SIZEBFF
+ POP IX
+.PRZ: LD DE,PRM3
+ JP PUTPRM
+
+MAKE_LN:
+ LD IX,L32BIT_
+ EXX
+ LD DE,#3B9A ; 1000000000
+ EXX
+ LD DE,#CA00
+ CALL GET_DIG
+ EXX
+ LD DE,#05F5 ; 100000000
+ EXX
+ LD DE,#E100
+ CALL GET_DIG
+ EXX
+ LD DE,#0098 ; 10000000
+ EXX
+ LD DE,#9680
+ CALL GET_DIG
+ EXX
+ LD DE,#000F ; 1000000
+ EXX
+ LD DE,#4240
+ CALL GET_DIG
+ EXX
+ LD DE,#0001 ; 100000
+ EXX
+ LD DE,#86A0
+ CALL GET_DIG
+ EXX
+ LD DE,#0000 ; 10000
+ EXX
+ LD DE,#2710
+ CALL GET_DIG
+ EXX
+ LD DE,#0000 ; 1000
+ EXX
+ LD DE,#03E8
+ CALL GET_DIG
+ EXX
+ LD DE,#0000 ; 100
+ EXX
+ LD DE,#0064
+ CALL GET_DIG
+ EXX
+ LD DE,#0000 ; 10
+ EXX
+ LD DE,#000A
+ CALL GET_DIG
+ LD A,L ; 1
+ ADD A,#30
+ LD (IX+0),A
+ INC IX
+ LD HL,L32BIT_
+ LD DE,#2030
+ ;
+.KILLZ: LD A,(HL)
+ CP E
+ JR NZ,.KILLZ2
+ LD (HL),D
+ INC HL
+ JP .KILLZ
+.KILLZ2:
+ LD HL,L32BIT_+9
+ LD A,(HL)
+ CP D
+ RET NZ
+ LD (HL),E
+ RET
+
+; HL:HL - DE:DE
+
+GET_DIG:
+ XOR A
+.INC_DG:
+ INC A
+ SBC HL,DE
+ EXX
+ SBC HL,DE
+ EXX
+ JP NC,.INC_DG
+ ADD HL,DE
+ EXX
+ ADC HL,DE
+ EXX
+ DEC A
+ ADD A,#30
+ LD (IX+0),A
+ INC IX
+ RET
+
+L32BIT_ DB "0000000000"
+
+DIRIDD DB " ",0
+
+SIZEBFF DB "0 000 000 000",0,0
+
+DEFDIR DB #5C,"*.*",0
+
+;------------------------
+
+CDUMP: LD HL,BUF2
+ LD BC,#0000
+ CALL GETNUM
+; LD XL,C
+; LD XH,0
+; LD HL,0
+ LD A,(CDDRIVE)
+ LD DE,DUMPBUF
+ LD BC,1*256 + BIOS.DRV_READ
+ RST ToBIOS
+ JR C,.DMPERR
+ ;
+ LD HL,BUF3
+ CALL GETNUM
+ PUSH IX
+ POP BC
+ LD A,B
+ AND #07
+ LD B,A
+ LD HL,2048-#01C0
+ AND A
+ SBC HL,BC
+ JR NC,.GOODOFFS
+ LD BC,2048-#01C0
+.GOODOFFS:
+ LD HL,DUMPBUF
+ ADD HL,BC
+ ;
+ CALL DUMP
+ JP CRLF
+.DMPERR:
+ LD A,MSG_IO_ERROR
+ JP MESSAGE
+ ;
+
+GETNUM: EXX
+ LD IX,0
+ LD HL,0
+ EXX
+.GETNUM0:
+ LD A,(HL)
+ OR A
+ JR Z,.EGETN
+ INC HL
+ CP "0"
+ JR C,.GETNUM0
+ CP "9"+1
+ JR NC,.GETNUM0
+ SUB "0"
+ ;
+ EXX
+ PUSH IX ;
+ PUSH HL
+ POP DE
+ POP BC ;LD DE:BC,HL:IX
+ ;
+ ADD IX,IX
+ ADC HL,HL ;x2
+ ADD IX,IX
+ ADC HL,HL ;x4
+ ADD IX,BC
+ ADC HL,DE ;x5
+ ADD IX,IX
+ ADC HL,HL ;x10
+ ;
+ LD C,A
+ LD B,0
+ ADD IX,BC
+ LD C,B
+ ADC HL,BC
+ EXX
+ JR .GETNUM0
+.EGETN: EXX
+ ;PUSH IX
+ PUSH HL
+ EXX
+ POP HL
+ ;POP IX
+ RET
+;;;;;;;;;;;;;;;
+; LD A,(HL)
+; OR A
+; RET Z
+; INC HL
+; CP "0"
+; JR C,GETNUM
+; CP "9"+1
+; JR NC,GETNUM
+; SUB "0"
+; LD B,A
+;
+; LD A,C
+; ADD A,A
+; ADD A,A
+; ADD A,C
+; ADD A,A
+;
+; ADD A,B
+; LD C,A
+; JR GETNUM
+;;;;;;;;;;;;;;;;
+
+UPDUMP: BYTE " +00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF ",CR,LF
+ DZ " -------------------------------------------------- +----------------+"
+
+
+DUMP: PUSH HL
+ LD HL,UPDUMP
+ LD C,Dss.PChars
+ RST ToDSS
+ POP HL
+ LD BC,#1C00
+.L1: PUSH BC
+ PUSH BC
+ CALL CRLF
+ ;
+ LD DE,DUMPBUF
+ AND A
+ SBC HL,DE
+ LD A,L
+ PUSH AF
+ LD A,H
+ ADD HL,DE
+ ;
+ CALL PHEX
+ POP AF
+ CALL PHEX
+ LD A,":"
+ CALL PRNCHAR
+ LD A," "
+ CALL PRNCHAR
+ LD A," "
+ CALL PRNCHAR
+ POP BC
+ PUSH HL
+ ;
+ LD B,#08
+.L2: PUSH BC
+ LD A,(HL)
+ INC HL
+ CALL PHEX
+ LD A," "
+ CALL PRNCHAR
+ POP BC
+ INC C
+ DJNZ .L2
+ ;
+ LD A," "
+ CALL PRNCHAR
+ ;
+ LD B,#08
+.L2_00: PUSH BC
+ LD A,(HL)
+ INC HL
+ CALL PHEX
+ LD A," "
+ CALL PRNCHAR
+ POP BC
+ INC C
+ DJNZ .L2_00
+ ;
+ LD A," "
+ CALL PRNCHAR
+ ;
+ LD A,"|"
+ CALL PRNCHAR
+ POP HL
+ LD B,#10
+.LLL: LD A,(HL)
+ INC HL
+ PUSH BC
+ CALL PRINT_
+ POP BC
+ DJNZ .LLL
+ LD A,"|"
+ CALL PRNCHAR
+ ;
+ LD A,C
+ POP BC
+ LD C,A
+ DJNZ .L1
+ RET
+
+PHEX: LD E,A
+ RRCA
+ RRCA
+ RRCA
+ RRCA
+ AND #0F
+ ADD A,#30
+ CP #3A
+ JR C,.PHEX2
+ ADD A,7
+.PHEX2: CALL PRINT_
+ LD A,E
+ AND #0F
+ ADD A,#30
+ CP #3A
+ JR C,.PHEX3
+ ADD A,7
+.PHEX3: CALL PRINT_
+ RET
+
+PRNCHAR:
+ LD C,Dss.PutChar
+ JP ToDSS
+;
\ No newline at end of file
diff --git a/DSS/drivers/media/ATAPI/Cd_dos.asm b/DSS/drivers/media/ATAPI/Cd_dos.asm
new file mode 100644
index 0000000..2a16b23
--- /dev/null
+++ b/DSS/drivers/media/ATAPI/Cd_dos.asm
@@ -0,0 +1,1212 @@
+PAGE0 EQU #82 ;WIN #0000-#3FFF
+PAGE1 EQU #A2 ;WIN #4000-#7FFF
+PAGE2 EQU #C2 ;WIN #8000-#BFFF
+PAGE3 EQU #E2 ;WIN #C000-#FFFF
+
+DIR EQU #C000
+
+DIRPAGE EQU 0
+
+DAY EQU 19
+MONTH EQU 05
+YEAR EQU 2002
+
+NAM EQU 0
+EXT EQU 8
+ATR EQU 11
+
+CLU3 EQU 20
+CLU4 EQU 21
+
+TIM1 EQU 22
+TIM2 EQU 23
+DAT1 EQU 24
+DAT2 EQU 25
+CLU1 EQU 26
+CLU2 EQU 27
+LEN1 EQU 28
+LEN2 EQU 29
+LEN3 EQU 30
+LEN4 EQU 31
+POS1 EQU 32
+POS2 EQU 33
+POS3 EQU 34
+POS4 EQU 35
+DIRCLU1 EQU 36
+DIRCLU2 EQU 37
+HND1 EQU 38
+HND2 EQU 39
+FDRV EQU 40
+AMODE EQU 41
+FTASK EQU 42
+
+;ACCESS MODE:
+; 00 - READ/WRITE
+; 01 - READ
+; 02 - WRITE
+
+;File Manipulator (FM)
+FM_BUF DB ". " ;+00 NAME
+ DB " " ;+08 EXT
+ DB #10 ;+11 ATTRIBUT
+ DB 0,0,0,0,0,0,0,0,0,0 ;+12 RESERVED
+ DW #0000 ;+22 TIME
+ DW #0000 ;+24 DATE
+ DW #0000 ;+26 START CLUSTER
+ DW #0000,#0000 ;+28 SIZE FILE
+ DW #0000,#0000 ;+32 FILE POSITION (FP)
+ DW #0000 ;+36 DIRECTORY CLUSTER
+ DW #0000 ;+38 HANDLE NUMBER
+ DB #00 ;+40 DRIVE OR CURRENT
+ DB #00 ;+41 ACCESS MODE
+ DB #00 ;+42 TASK
+ DB #00 ;+43 EMPTY
+END_FM
+;End of FM
+ DS 44*2
+
+FM_SIZE EQU END_FM-FM_BUF
+
+SET_FM PUSH DE
+ INC A
+ LD IY,FM_BUF-FM_SIZE
+ LD DE,FM_SIZE
+SET_FM1 ADD IY,DE
+ DEC A
+ JR NZ,SET_FM1
+ POP DE
+ LD A,(IY+0)
+ OR A
+ LD A,0
+ RET NZ
+ LD A,5
+ SCF
+ RET
+
+; HL:IX - OFFSET POINTER
+; A - FILE MANIPULATOR
+
+MOVE_FP CALL SET_FM
+ RET C
+ INC B
+ DEC B
+ JP Z,MOVE_FA
+ DEC B
+ JP Z,MOVE_FB
+ DEC B
+ JP Z,MOVE_FC
+ LD A,1
+ SCF
+ RET
+
+;from Start File
+MOVE_FA LD BC,0
+ LD DE,0
+ JR MOVE_F1
+
+;from End File
+MOVE_FC LD C,(IY+28)
+ LD B,(IY+29)
+ LD E,(IY+30)
+ LD D,(IY+31)
+ JR MOVE_F1
+
+;from Current Position
+MOVE_FB LD C,(IY+32)
+ LD B,(IY+33)
+ LD E,(IY+34)
+ LD D,(IY+35)
+MOVE_F1 ADD IX,BC
+ ADC HL,DE
+ LD D,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
+
+CHANGEDISK
+ ;PUSH AF
+ LD A,(CDDRIVE)
+ LD C,BIOS.DRV_RESET
+ RST ToBIOS
+ ;POP BC
+ JP C,NDISK11
+ ;LD A,B
+; LD (DRIVE),A
+ CALL INITDISK
+ RET C
+; LD A,(LDRIVE)
+ AND A
+ RET
+
+NDISK11 CP 2
+ SCF
+; RET Z
+ LD A,20
+ SCF
+ RET
+
+INITDISK
+ LD A,DIRPAGE
+ CALL BANK
+ PUSH AF
+ LD B,4 ; попыток на чтение
+CD_I_LP PUSH BC
+ LD DE,DIR
+ LD A,(CDDRIVE)
+ LD HL,#0000
+ LD IX,#0010
+ LD BC,1*256 + BIOS.DRV_READ
+ RST ToBIOS
+ POP BC
+ JR NC,CD_I_OK
+ DJNZ CD_I_LP
+UNKCD POP AF
+ OUT (PAGE3),A
+ LD A,13 ;!HARDCODE sys error
+ SCF
+ RET
+
+CD_I_OK LD HL,DIR
+ LD A,(HL)
+ INC HL
+ CP #01
+ JR NZ,UNKCD
+ LD A,(HL)
+ INC HL
+ CP "C"
+ JR NZ,UNKCD
+ LD A,(HL)
+ INC HL
+ CP "D"
+ JR NZ,UNKCD
+ LD HL,DIR+#009E
+ LD DE,ROOTDIR
+ LDI
+ LDI
+ LDI
+ LDI
+ LD HL,DIR+#00A6
+ LD DE,ROOTLEN
+ LDI
+ LDI
+ LDI
+ LDI
+ POP AF
+ OUT (PAGE3),A
+; LD HL,0
+; LD (FATCASH),HL
+ XOR A
+ RET
+
+
+;----------------------------------------------
+
+OPEN LD (ACCESS),A
+ CALL GETWORD
+ RET C
+ LD HL,TMPNAME
+ LD DE,MASKARE
+ CALL MASK
+ RET C
+OPENEXE CALL SEARCH
+ RET C
+ LD A,1 ;;
+ CALL SET_FM ;; CALL GET_FM
+ RET C
+ LD A,C
+ EX AF,AF'
+ EXX
+ LD (IY+HND1),E
+ LD (IY+HND2),D
+ EXX
+ LD D,YH
+ LD E,YL
+ LD HL,HANDBUF
+ LD BC,#0020
+ LDIR
+ LD A,(ACCESS)
+ LD (IY+AMODE),A
+;; LD A,(TASK)
+ XOR A ;;
+ LD (IY+FTASK),A
+ XOR A
+ LD (IY+POS1),A
+ LD (IY+POS2),A
+ LD (IY+POS3),A
+ LD (IY+POS4),A
+;; LD A,(DRIVE)
+; XOR A ;;
+; LD (IY+FDRV),A
+ LD HL,FM_BUF+CLU1
+ LD E,(HL)
+ INC HL
+ LD D,(HL)
+ LD (IY+DIRCLU1),E
+ LD (IY+DIRCLU2),D
+
+ LD C,(IY+CLU1)
+ LD B,(IY+CLU2)
+ LD E,(IY+CLU3)
+ LD D,(IY+CLU4)
+ EX DE,HL
+ PUSH BC
+ POP IX
+ LD C,(IY+LEN1)
+ LD B,(IY+LEN2)
+ LD E,(IY+LEN3)
+ LD D,(IY+LEN4)
+ EX AF,AF'
+ AND A
+ RET
+
+;RET
+; HL:IX - SECTOR
+; DE:BC - SIZE IN BYTES
+
+;PATH0 DEFW #0000
+
+ACCESS DEFB #00
+
+HANDBUF DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+
+
+WRT_HND LD A,DIRPAGE
+ CALL BANK
+ PUSH AF
+ LD IX,DIR
+ EXX
+ LD DE,0
+ EXX
+WRT_HN1 LD A,(IX+00)
+ OR A
+ JR Z,WRT_HN2
+ CP #E5
+ JR Z,WRT_HN2
+ LD BC,#0020
+ ADD IX,BC
+ JR NC,WRT_HN1
+ POP AF
+ OUT (PAGE3),A
+ LD A,9
+ SCF
+ RET
+
+WRT_HN2 LD D,XH
+ LD E,XL
+ LD HL,HANDBUF
+ LD BC,#0020
+ LDIR
+ POP AF
+ OUT (PAGE3),A
+ LD HL,DIR
+ LD BC,(DIRSIZE)
+ DEC BC
+ ADD HL,BC
+ AND A
+ SBC HL,DE
+ RET NC
+ LD HL,(DIRSIZE)
+ LD BC,#0020
+ ADD HL,BC
+ LD (DIRSIZE),HL
+ AND A
+ RET
+
+GETNAME LD BC,#08FF
+GETN1 LD A,(HL)
+ CP " "
+ JR NZ,GETN3
+GETN2 INC HL
+ DJNZ GETN2
+ JR GETN4
+GETN3 LDI
+ DJNZ GETN1
+GETN4 LD A,(HL)
+ CP " "
+ LD A,"."
+ JR NZ,GETN5
+ LD A,#00
+GETN5 LD (DE),A
+ INC DE
+ RET Z
+ LD B,#03
+GETN6 LD A,(HL)
+ CP " "
+ RET Z
+ LDI
+ XOR A
+ LD (DE),A
+ DJNZ GETN6
+ RET
+
+DTABUF DEFW #0000
+CURHND DEFW #0000
+NO_NEXT DEFB #00
+FNDMODE DEFB #00
+
+F_FIRST LD (ACCESS),A
+ LD (DTABUF),DE
+ LD A,B
+ LD (FNDMODE),A
+ PUSH HL
+ CALL LOADDIR
+ POP HL
+ CALL GETWORD
+ RET C
+ LD HL,TMPNAME
+ LD DE,MASKARE
+ CALL MASK
+ RET C
+ LD A,(ACCESS)
+ CALL ASEARCH
+ RET C
+ LD HL,MASKARE
+ LD DE,(DTABUF)
+ LD BC,11
+ LDIR
+ LD A,(ACCESS)
+ LD (DE),A
+ INC DE
+FIND_S LD BC,#0020
+ ADD IX,BC
+ LD (CURHND),IX
+ LD HL,HANDBUF+12
+ LD BC,20
+ LDIR
+ LD A,(HANDBUF+11)
+ LD (DE),A
+ INC DE
+ LD HL,HANDBUF
+ LD A,(FNDMODE)
+ OR A
+ JR NZ,FIND_M2
+ LD BC,11
+ LDIR
+ LD A,#FF
+ LD (NO_NEXT),A
+ XOR A
+ RET
+FIND_M2 CALL GETNAME
+ LD A,#FF
+ LD (NO_NEXT),A
+ XOR A
+ RET
+
+F_NEXT LD A,(NO_NEXT)
+ OR A
+ LD A,14
+ SCF
+ RET Z
+ LD (DTABUF),DE
+ LD DE,MASKARE
+ LD HL,(DTABUF)
+ LD BC,11
+ LDIR
+ LD A,(HL)
+ PUSH HL
+ CALL NSEARCH
+ POP DE
+ EX AF,AF'
+ XOR A
+ LD (NO_NEXT),A
+ EX AF,AF'
+ RET C
+ INC DE
+ JP FIND_S
+
+NSEARCH EX AF,AF'
+ LD A,DIRPAGE
+ CALL BANK
+ PUSH AF
+ EX AF,AF'
+ CPL
+ LD C,A
+ LD IX,(CURHND)
+ EXX
+ LD DE,0
+ EXX
+ JP SEARCH1
+
+DSEARCH LD A,#10
+ CALL ASEARCH
+ RET NC
+ LD A,4
+ RET
+
+SEARCH LD A,#23
+ASEARCH EX AF,AF'
+ LD A,DIRPAGE
+ CALL BANK
+ PUSH AF
+ EX AF,AF'
+ CPL
+ LD C,A
+ LD IX,DIR
+ EXX
+ LD DE,0
+ EXX
+SEARCH1 LD A,(IX+00)
+ OR A
+ JR Z,SEARCH4
+ CP #E5
+ JR Z,SEARCH3
+ LD A,(IX+11)
+ AND C
+ JR NZ,SEARCH3
+ LD HL,MASKARE
+ LD D,XH
+ LD E,XL
+ LD B,11
+ EX DE,HL
+SEARCH2 LD A,(DE)
+ CP "?"
+ JR Z,SEARCH5
+ CP (HL)
+ JR NZ,SEARCH3
+SEARCH5 INC HL
+ INC DE
+ DJNZ SEARCH2
+ LD D,XH
+ LD E,XL
+ LD HL,HANDBUF
+ EX DE,HL
+ LD BC,#0020
+ LDIR
+ POP AF
+ OUT (PAGE3),A
+ AND A
+ RET
+
+SEARCH3 EXX
+ INC DE
+ EXX
+ LD DE,#0020
+ ADD IX,DE
+ JR NC,SEARCH1
+SEARCH4 POP AF
+ OUT (PAGE3),A
+ LD A,3
+ SCF
+ RET
+
+GETWORD LD DE,TMPNAME
+ LD BC,#0DFF
+GETWRD1 LD A,(HL)
+ INC HL
+ CP '\' ;
+ JR Z,DIRNAME
+ CP ":"
+ JR Z,DRVNAME
+ LD (DE),A
+ INC DE
+ CP #21
+ CCF
+ RET NC
+ DJNZ GETWRD1
+ LD A,16
+ SCF
+ RET
+
+DIRNAME LD A,#00
+ LD (DE),A
+ PUSH HL
+ LD HL,TMPNAME
+ CALL OPENDIR
+ POP HL
+ JP NC,GETWORD
+ RET
+
+DRVNAME LD A,(TMPNAME)
+ CP "a"
+ JR C,DRVN2
+ CP "{"
+ JR NC,DRVN2
+ SUB #20
+DRVN2 SUB "A"
+ PUSH HL
+; CALL OPENDSK
+ POP HL
+ JP NC,GETWORD
+ RET
+
+TMPNAME DB " ",#00
+
+OPENDIR XOR A
+ CALL SET_FM
+ LD A,(HL)
+ OR A
+ JP NZ,SUBDIR
+
+ LD DE,(ROOTDIR+0)
+ LD (IY+CLU1),E
+ LD (IY+CLU2),D
+ LD DE,(ROOTDIR+2)
+ LD (IY+CLU3),E
+ LD (IY+CLU4),D
+
+ LD DE,(ROOTLEN+0)
+ LD (IY+LEN1),E
+ LD (IY+LEN2),D
+ LD DE,(ROOTLEN+2)
+ LD (IY+LEN3),E
+ LD (IY+LEN4),D
+
+ CALL LOADDIR
+ LD HL,DIRSPEC
+ LD (HL),'\' ;
+ INC HL
+ LD (HL),#00
+ AND A
+ RET
+
+SUBDIR CP "."
+ JR NZ,SUBDIR2
+ EXX
+ LD HL,MASKARE
+ LD DE,MASKARE+1
+ LD BC,10
+ LD (HL),#20
+ LDIR
+ EXX
+ LD DE,MASKARE
+SUBDIR0 LDI
+ LD A,(HL)
+ OR A
+ JR NZ,SUBDIR0
+ JR SUBDIR3
+
+SUBDIR2 LD DE,MASKARE
+ CALL MASK
+ RET C
+SUBDIR3 CALL FINDDIR
+ RET C
+ LD (IY+CLU1),E
+ LD (IY+CLU2),D
+ LD (IY+CLU3),C
+ LD (IY+CLU4),B
+ EXX
+ LD (IY+LEN1),E
+ LD (IY+LEN2),D
+ LD (IY+LEN3),C
+ LD (IY+LEN4),B
+ EXX
+ CALL LOADDIR
+ AND A
+ RET
+
+
+
+FINDD03 LD BC,#0020
+ ADD IX,BC
+ JR NC,FINDD01
+FINDD04 POP AF
+ OUT (PAGE3),A
+ LD A,4
+ SCF
+ RET
+
+; FIND "MASKAREA" IN DIRECTORY
+
+FINDDIR LD A,DIRPAGE
+ CALL BANK
+ PUSH AF
+ LD IX,DIR
+FINDD01 LD A,(IX+00)
+ OR A
+ JR Z,FINDD04
+ CP #E5
+ JR Z,FINDD03
+ LD A,(IX+11)
+ AND #10
+ JR Z,FINDD03
+ LD HL,MASKARE
+ LD D,XH
+ LD E,XL
+ EX DE,HL
+ LD B,11
+FINDD02 LD A,(DE)
+ CP "?"
+ JR Z,FINDD05
+ CP (HL)
+ JR NZ,FINDD03
+FINDD05 INC HL
+ INC DE
+ DJNZ FINDD02
+ LD A,(IX+0)
+ CP "."
+ JP NZ,ADDSPEC
+ LD A,(IX+1)
+ CP "."
+ JP NZ,IT_DIR
+ LD HL,DIRSPEC
+ LD D,H
+ LD E,L
+ LD BC,#100
+ XOR A
+ CPIR
+ LD BC,#100
+ LD A,'\' ;
+ CPDR
+ INC HL
+ AND A
+ EX DE,HL
+ SBC HL,DE
+ EX DE,HL
+ JR NZ,ROTZ
+ INC HL
+ROTZ LD (HL),0
+IT_DIR LD E,(IX+CLU1)
+ LD D,(IX+CLU2)
+ LD C,(IX+CLU3)
+ LD B,(IX+CLU4)
+ EXX
+ LD E,(IX+LEN1)
+ LD D,(IX+LEN2)
+ LD C,(IX+LEN3)
+ LD B,(IX+LEN4)
+ EXX
+ POP AF
+ OUT (PAGE3),A
+ AND A
+ RET
+
+ADDSPEC LD E,XL
+ LD D,XH
+ LD HL,DIRSPEC
+ LD BC,#FF
+ XOR A
+ CPIR
+ DEC HL
+ DEC HL
+ LD A,#5C ;"\"
+ CP (HL)
+ INC HL
+ JR Z,ADDSPE0
+ LD (HL),A
+ INC HL
+ADDSPE0 LD BC,#0820
+MM1 LD A,(DE)
+ INC DE
+ CP C
+ JR Z,MM2
+ LD (HL),A
+ INC HL
+MM2 DJNZ MM1
+ LD A,(DE)
+ INC DE
+ CP C
+ JR Z,MM3
+ LD (HL),"."
+ INC HL
+ LD (HL),A
+ INC HL
+ LD A,(DE)
+ INC DE
+ CP C
+ JR Z,MM3
+ LD (HL),A
+ INC HL
+ LD A,(DE)
+ CP C
+ JR Z,MM3
+ LD (HL),A
+ INC HL
+MM3 LD (HL),0
+ JP IT_DIR
+
+CURRDIR EX DE,HL
+ LD HL,DIRSPEC
+CURDIR1 LD A,(HL)
+ OR A
+ LDI
+ JP NZ,CURDIR1
+ RET
+
+LOADDIR XOR A
+ LD HL,0
+ LD IX,0
+ LD B,0
+ CALL MOVE_FP
+ LD A,DIRPAGE
+ CALL BANK
+ PUSH AF
+ LD B,3
+LOADFFF PUSH BC
+ LD HL,#C000
+ LD DE,#C001
+ LD BC,#3FFF
+ LD (HL),L
+ LDIR
+; LD A,(DRIVE)
+; LD (IY+FDRV),A
+; LD C,(IY+LEN1)
+ LD C,(IY+LEN2)
+ LD B,(IY+LEN3)
+ LD E,(IY+LEN4)
+ LD D,0
+ SRL D
+ RR E
+ RR B
+ RR C
+ SRL D
+ RR E
+ RR B
+ RR C
+ SRL D
+ RR E
+ RR B
+ RR C
+ LD E,(IY+CLU1)
+ LD D,(IY+CLU2)
+ LD L,(IY+CLU3)
+ LD H,(IY+CLU4)
+ LD XH,D
+ LD XL,E
+ LD B,C
+ LD A,B
+ OR A
+ JR Z,ERRLEND
+ CP #08
+ JR C,NORLEND
+ LD B,8
+NORLEND
+ LD A,(CDDRIVE)
+ LD C,BIOS.DRV_READ
+ LD DE,DIR
+ RST ToBIOS
+ POP BC
+ JR NC,LOADMMM
+ DEC B
+ JP NZ,LOADFFF
+ POP AF
+ OUT (PAGE3),A
+ SCF
+ LD A,20
+ RET
+
+ERRLEND POP BC
+ POP AF
+ OUT (PAGE3),A
+ SCF
+ LD A,20
+ RET
+
+LOADMMM POP AF
+ OUT (PAGE3),A
+ CALL CORRDIR
+ AND A
+ RET
+
+CORRDIR LD A,DIRPAGE
+ CALL BANK
+ PUSH AF
+ LD HL,DIR
+ LD DE,DIR
+CORRL1 PUSH DE
+ LD C,(HL)
+ LD B,0
+ LD DE,ENTRYBF
+ LDIR
+ POP DE
+ PUSH HL
+ LD HL,FCDFLEN
+ LD C,(HL)
+ LD B,0
+ ADD HL,BC
+ INC HL
+ LD (HL),0
+ SBC HL,BC
+ PUSH DE
+ CALL MASK
+ POP HL
+ LD BC,11
+ ADD HL,BC
+ LD A,(FCDFLAG)
+ BIT 1,A ;IS IT DIR?
+; AND 2
+ LD C,#01 ;ATTRIBUT FILE
+ JR Z,CORRL0
+ LD C,#10 ;ATTRIBUT DIRECTORY
+CORRL0 BIT 0,A ;IS IT HIDDEN
+ JR Z,CORRL00
+ SET 1,C
+CORRL00
+ LD (HL),C
+ INC HL
+ XOR A
+ LD B,8
+FILLCDN LD (HL),A
+ INC HL
+ DJNZ FILLCDN
+ LD A,(FCDSEC+2)
+ LD (HL),A
+ INC HL
+ LD A,(FCDSEC+3)
+ LD (HL),A
+ INC HL
+;MKDATE
+ PUSH HL
+ LD A,(FCDYEAR)
+ LD XL,A
+ LD XH,0
+ LD DE,1900
+ ADD IX,DE
+ LD A,(FCDMOUN)
+ LD E,A
+ LD A,(FCDDAY)
+ LD D,A
+ LD A,(FCDHOUR)
+ LD H,A
+ LD A,(FCDMIN)
+ LD L,A
+ LD A,(FCDSECN)
+ LD B,A
+ CALL MK_TIME
+ POP HL
+; LD DE,#0000 ;TIME
+ LD (HL),E
+ INC HL
+ LD (HL),D
+ INC HL
+; LD DE,#0000 ;DATE
+ LD (HL),C
+ INC HL
+ LD (HL),B
+ INC HL
+
+ LD DE,(FCDSEC)
+ LD (HL),E
+ INC HL
+ LD (HL),D
+ INC HL
+ EX DE,HL
+ LD HL,FCDLEN
+ LDI
+ LDI
+ LDI
+ LDI
+ POP HL
+ BIT 7,H
+ JR Z,CORRL2
+ LD A,(HL)
+ OR A
+ JP NZ,CORRL1
+ LD L,0
+ INC H
+ JR Z,CORRL2
+ LD A,(HL)
+ OR A
+ JP NZ,CORRL1
+CORRL2 XOR A
+ LD (DE),A
+ LD DE,(ROOTDIR+0)
+ LD L,(IY+CLU1)
+ LD H,(IY+CLU2)
+ AND A
+ SBC HL,DE
+ JR NZ,CORRL6
+ LD DE,(ROOTDIR+2)
+ LD L,(IY+CLU3)
+ LD H,(IY+CLU4)
+ AND A
+ SBC HL,DE
+ JR NZ,CORRL6
+ LD HL,DIR
+ LD A,(HL)
+ CP " "
+ JR NZ,CORRL4
+ LD (HL),#E5
+ LD BC,#0020
+ ADD HL,BC
+ LD A,(HL)
+ CP " "
+ JR NZ,CORRL4
+ LD (HL),#E5
+ JR CORRL4
+CORRL6 LD HL,DIR
+ LD A,(HL)
+ CP " "
+ JR NZ,CORRL4
+ LD (HL),"."
+ LD BC,#0020
+ ADD HL,BC
+ LD A,(HL)
+ CP " "
+ JR NZ,CORRL4
+ LD (HL),"."
+ INC HL
+ LD (HL),"."
+CORRL4 POP AF
+ OUT (PAGE3),A
+ AND A
+ RET
+
+;SYSTEM ATTRIBUTES
+READONLY_ATR EQU %00000001
+HIDDEN_ATR EQU %00000010
+SYSTEM_ATR EQU %00000100
+ARCHIVE_ATR EQU %00100000
+
+ENTRYBF
+ DEFB #00 ;Entry lenght
+ DEFB #00 ;XAR in LBN
+FCDSEC DEFW #00,#00 ;Start sector (Intel)
+ DEFW #00,#00 ;Start sector (Motorola)
+FCDLEN DEFW #00,#00 ;Lenght file (Intel)
+ DEFW #00,#00 ;Lenght file (Motorola)
+FCDYEAR DEFB #00 ;Year
+FCDMOUN DEFB #00 ;Mount
+FCDDAY DEFB #00 ;Day
+FCDHOUR DEFB #00 ;Hour
+FCDMIN DEFB #00 ;Minute
+FCDSECN DEFB #00 ;Second
+ DEFB #00 ;Reserve
+FCDFLAG DEFB #00 ;Flag
+ DEFB #00 ;Interlive size
+ DEFB #00 ;Interlive skip factor
+ DEFW #0000 ;Volume Set Sequence (Intel)
+ DEFW #0000 ;Volume Set Sequence (Motorola)
+FCDFLEN DEFB #00
+DEFSA EQU $-ENTRYBF
+FCDNAME DEFS #100-DEFSA
+
+ROOTDIR DEFW 0,0
+ROOTLEN DEFW 0,0
+
+DIRSIZE DEFW 0
+
+BANK LD C,A
+ LD B,0
+ LD HL,BANKTBL
+ ADD HL,BC
+ IN A,(PAGE3)
+ LD C,PAGE3
+ OUTI
+ RET
+
+BANKTBL DEFB #FF,#FF,#FF,#FF,#FF,#FF,#FF,#FF
+ DEFB #FF,#FF,#FF,#FF,#FF,#FF,#FF,#FF
+
+;HANDTA DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+; DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+
+MASKARE
+ DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+
+; HL - MASK "file*.t??"
+; DE - 11 bytes filename
+; RET: C=2 FILE WITHOUT EXTENTION
+; C=1 FILE WITH EXTENTION
+
+MASK PUSH HL
+ PUSH DE
+ LD H,D
+ LD L,E
+ INC DE
+ LD (HL),#20
+ LD BC,10
+ LDIR
+ POP DE
+ POP HL
+ LD A,(HL)
+ CP #21
+ RET C
+ LD BC,#0902
+MASK1 LD A,(HL)
+ CP #21
+ CCF
+ RET NC
+ CP #22
+ JR Z,MASK7
+ CP "*"
+ JR Z,MASK3
+ CP "+"
+ JR Z,MASK7
+ CP ","
+ JR Z,MASK7
+ CP "."
+ JR Z,MASK5
+ CP "/"
+ JR Z,MASK7
+ CP ":"
+ JR Z,MASK7
+ CP ";"
+ JR Z,MASK7
+ CP "<"
+ JR Z,MASK7
+ CP "="
+ JR Z,MASK7
+ CP ">"
+ JR Z,MASK7
+ CP "["
+ JR Z,MASK7
+ CP '\' ;
+ JR Z,MASK7
+ CP "]"
+ JR Z,MASK7
+ CP "|"
+ JR Z,MASK7
+ CP "a"
+ JR C,MASK2
+ CP "{"
+ JR NC,MASK2
+ SUB #20
+MASK2 LD (DE),A
+ INC HL
+ INC DE
+ DJNZ MASK1
+MASK7 LD A,16
+ SCF
+ RET
+
+MASK3 LD A,"?"
+ INC HL
+ DJNZ MASK6
+ LD A,16
+ SCF
+ RET
+
+MASK6 LD (DE),A
+ INC DE
+ DJNZ MASK6
+ LD B,1
+ JR MASK1
+
+MASK5 LD A," "
+ INC HL
+ DJNZ MASK4
+ LD B,4
+ DEC C
+ JP NZ,MASK1
+ LD A,16
+ SCF
+ RET
+
+MASK4 LD (DE),A
+ INC DE
+ DJNZ MASK4
+ LD B,4
+ DEC C
+ JP NZ,MASK1
+ LD A,16
+ SCF
+ RET
+
+SYSTIME LD DE,DAY*256+MONTH ;DAY/MONTH
+ LD HL,#0000 ;HOUR/MINUTE
+ LD BC,#0001 ;SECOND/WEEKDAY
+ LD IX,YEAR ;YEAR
+ AND A
+ RET
+
+;INPUT: D - DAY; E - MONTH
+; H - HOUR; L - MINUTE
+; B - SECOND (0...59)
+; IX- YEAR (0...65535)
+;OUTPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2
+; BC - yyyyyyymmmmddddd y - year, m - month, d - day
+; (1980-2108)
+
+MK_TIME LD A,L
+ RLCA
+ RLCA
+ SLA A
+ RL H
+ SLA A
+ RL H
+ SLA A
+ RL H
+ SRL B
+ OR B
+ LD L,A
+
+ LD BC,#F844 ;(-1980)
+ ADD IX,BC
+ LD A,E
+ RLCA
+ RLCA
+ RLCA
+ RLCA
+ AND #F0
+ LD B,XL
+ SLA A
+ RL B
+ OR D
+ LD C,A
+ EX DE,HL
+ AND A
+ RET
+
+;INPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2
+; BC - yyyyyyymmmmddddd y - year, m - month, d - day
+; (1980-2108)
+;OUTPUT: D - DAY; E - MONTH
+; H - HOUR; L - MINUTE
+; B - SECOND (0...59)
+; IX- YEAR (0...65535)
+
+RMKTIME EX DE,HL
+ LD A,C
+ AND #1F
+ LD D,A
+ SRL B
+ RR C
+ LD A,C
+ RRCA
+ RRCA
+ RRCA
+ RRCA
+ AND #0F
+ LD E,A
+ LD C,B
+ LD B,0
+ LD IX,1980
+ ADD IX,BC
+ LD A,L
+ AND #1F
+ ADD A,A
+ LD B,A
+ SRL H
+ RR L
+ SRL H
+ RR L
+ SRL H
+ RR L
+ SRL L
+ SRL L
+ AND A
+ RET
+
+; INPUT: HL - "C:\DIR\DIR\DIR_NAME[\]",0
+
+CHDIR CALL GETWORD
+ RET C
+ LD HL,TMPNAME
+ LD A,(HL)
+ OR A
+ CALL NZ,OPENDIR
+ RET
+;
\ No newline at end of file
diff --git a/DSS/drivers/media/ATAPI/Hidden/CDFS0.ASM b/DSS/drivers/media/ATAPI/Hidden/CDFS0.ASM
new file mode 100644
index 0000000..fd61bdf
--- /dev/null
+++ b/DSS/drivers/media/ATAPI/Hidden/CDFS0.ASM
@@ -0,0 +1,525 @@
+
+NAM EQU 0
+EXT EQU 8
+ATR EQU 11
+
+CLU3 EQU 20
+CLU4 EQU 21
+
+TIM1 EQU 22
+TIM2 EQU 23
+DAT1 EQU 24
+DAT2 EQU 25
+CLU1 EQU 26
+CLU2 EQU 27
+LEN1 EQU 28
+LEN2 EQU 29
+LEN3 EQU 30
+LEN4 EQU 31
+POS1 EQU 32
+POS2 EQU 33
+POS3 EQU 34
+POS4 EQU 35
+DIRCLU1 EQU 36
+DIRCLU2 EQU 37
+HND1 EQU 38
+HND2 EQU 39
+FDRV EQU 40
+AMODE EQU 41
+FTASK EQU 42
+
+DIR EQU #C000
+
+DIRPAGE EQU 0
+
+;ACCESS MODE:
+; 00 - READ/WRITE
+; 01 - READ
+; 02 - WRITE
+
+;File Manipulator (FM)
+FM_BUF DEFB ". " ;+00 NAME
+ DEFB " " ;+08 EXT
+ DEFB #10 ;+11 ATTRIBUT
+ DEFB 0,0,0,0,0,0,0,0,0,0 ;+12 RESERVED
+ DEFW #0000 ;+22 TIME
+ DEFW #0000 ;+24 DATE
+ DEFW #0000 ;+26 START CLUSTER
+ DEFW #0000,#0000 ;+28 SIZE FILE
+ DEFW #0000,#0000 ;+32 FILE POSITION (FP)
+ DEFW #0000 ;+36 DIRECTORY CLUSTER
+ DEFW #0000 ;+38 HANDLE NUMBER
+ DEFB #00 ;+40 DRIVE OR CURRENT
+ DEFB #00 ;+41 ACCESS MODE
+ DEFB #00 ;+42 TASK
+ DEFB #00 ;+43 EMPTY
+END_FM
+;End of FM
+ DEFS 44*1,0
+
+FM_SIZE EQU END_FM-FM_BUF
+
+SET_FM PUSH DE
+ INC A
+ LD IY,FM_BUF-FM_SIZE
+ LD DE,FM_SIZE
+SET_FM1 ADD IY,DE
+ DEC A
+ JR NZ,SET_FM1
+ POP DE
+ LD A,(IY+0)
+ OR A
+ LD A,0
+ RET NZ
+ LD A,5
+ SCF
+ RET
+
+; HL:IX - OFFSET POINTER
+; A - FILE MANIPULATOR
+
+MOVE_FP CALL SET_FM
+ RET C
+ INC B
+ DEC B
+ JP Z,MOVE_FA
+ DEC B
+ JP Z,MOVE_FB
+ DEC B
+ JP Z,MOVE_FC
+ LD A,1
+ SCF
+ RET
+
+;from Start File
+MOVE_FA LD BC,0
+ LD DE,0
+ JR MOVE_F1
+
+;from End File
+MOVE_FC LD C,(IY+28)
+ LD B,(IY+29)
+ LD E,(IY+30)
+ LD D,(IY+31)
+ JR MOVE_F1
+
+;from Current Position
+MOVE_FB LD C,(IY+32)
+ LD B,(IY+33)
+ LD E,(IY+34)
+ LD D,(IY+35)
+MOVE_F1 ADD IX,BC
+ ADC HL,DE
+ LD D,HX
+ LD E,LX
+ LD (IY+32),E
+ LD (IY+33),D
+ LD (IY+34),L
+ LD (IY+35),H
+ XOR A
+ RET
+
+;FP COMPARE
+; CY - FILE POINTER > SIZE
+; NC - FILE POINTER < SIZE
+
+MOVE_CP LD L,(IY+28)
+ LD H,(IY+29)
+ LD E,(IY+32)
+ LD D,(IY+33)
+ AND A
+ SBC HL,DE
+ LD L,(IY+30)
+ LD H,(IY+31)
+ LD E,(IY+34)
+ LD D,(IY+35)
+ SBC HL,DE
+ RET
+
+INITDISK
+ LD B,4
+CD_I_LP PUSH BC
+ LD DE,DIR
+ LD HL,#0000
+ LD IX,#0010
+ LD BC,#0105
+; LD A,(DRIVE)
+ CALL CDCMD
+; RST #18
+ POP BC
+ JR NC,CD_I_OK
+ DJNZ CD_I_LP
+UNKCD SCF
+ RET
+
+CD_I_OK LD HL,DIR
+ LD A,(HL)
+ INC HL
+ CP #01
+ JR NZ,UNKCD
+ LD A,(HL)
+ INC HL
+ CP "C"
+ JR NZ,UNKCD
+ LD A,(HL)
+ INC HL
+ CP "D"
+ JR NZ,UNKCD
+ LD HL,DIR+#009E
+ LD DE,ROOTDIR
+ LDI
+ LDI
+ LDI
+ LDI
+ LD HL,DIR+#00A6
+ LD DE,ROOTLEN
+ LDI
+ LDI
+ LDI
+ LDI
+; POP AF
+; OUT (PAGE3),A
+; LD HL,0
+; LD (FATCASH),HL
+ XOR A
+ RET
+
+
+
+
+
+LOADDIR XOR A
+ LD A,DIRPAGE
+ CALL BANK
+ PUSH AF
+ LD B,3
+LOADFFF PUSH BC
+ LD HL,#C000
+ LD DE,#C001
+ LD BC,#3FFF
+ LD (HL),L
+ LDIR
+; LD A,(DRIVE)
+; LD (IY+FDRV),A
+;; LD C,(IY+LEN1)
+ LD C,(IY+LEN2)
+ LD B,(IY+LEN3)
+ LD E,(IY+LEN4)
+ LD D,0
+ SRL D
+ RR E
+ RR B
+ RR C
+ SRL D
+ RR E
+ RR B
+ RR C
+ SRL D
+ RR E
+ RR B
+ RR C
+ LD E,(IY+CLU1)
+ LD D,(IY+CLU2)
+ LD L,(IY+CLU3)
+ LD H,(IY+CLU4)
+ LD HX,D
+ LD LX,E
+ LD B,C
+ LD A,B
+ OR A
+ JR Z,ERRLEND
+ CP #08
+ JR C,NORLEND
+ LD B,8
+NORLEND LD A,(DRIVE)
+ LD C,5
+ LD DE,DIR
+ CALL CDCMD
+; RST #18
+ POP BC
+ JR NC,LOADMMM
+ DEC B
+ JP NZ,LOADFFF
+ POP AF
+ OUT (PAGE3),A
+ SCF
+ LD A,20
+ RET
+
+ERRLEND POP BC
+ POP AF
+ OUT (PAGE3),A
+ SCF
+ LD A,20
+ RET
+
+LOADMMM POP AF
+ OUT (PAGE3),A
+ CALL CORRDIR
+ AND A
+ RET
+
+CORRDIR LD A,DIRPAGE
+ CALL BANK
+ PUSH AF
+ LD HL,DIR
+ LD DE,DIR
+CORRL1 PUSH DE
+ LD C,(HL)
+ LD B,0
+ LD DE,ENTRYBF
+ LDIR
+ POP DE
+ PUSH HL
+ LD HL,FCDFLEN
+ LD C,(HL)
+ LD B,0
+ ADD HL,BC
+ INC HL
+ LD (HL),0
+ SBC HL,BC
+ PUSH DE
+ CALL MASK
+ POP HL
+ LD BC,11
+ ADD HL,BC
+ LD A,(FCDFLAG)
+ AND 2
+ LD A,#00 ;ATTRIBUT FILE
+ JR Z,CORRL0
+ LD A,#10 ;ATTRIBUT DIRECTORY
+CORRL0 LD (HL),A
+ INC HL
+ XOR A
+ LD B,8
+FILLCDN LD (HL),A
+ INC HL
+ DJNZ FILLCDN
+ LD A,(FCDSEC+2)
+ LD (HL),A
+ INC HL
+ LD A,(FCDSEC+3)
+ LD (HL),A
+ INC HL
+ LD DE,#0000 ;TIME
+ LD (HL),E
+ INC HL
+ LD (HL),D
+ INC HL
+ LD DE,#0000 ;DATE
+ LD (HL),E
+ INC HL
+ LD (HL),D
+ INC HL
+ LD DE,(FCDSEC)
+ LD (HL),E
+ INC HL
+ LD (HL),D
+ INC HL
+ EX DE,HL
+ LD HL,FCDLEN
+ LDI
+ LDI
+ LDI
+ LDI
+ POP HL
+ BIT 7,H
+ JR Z,CORRL2
+ LD A,(HL)
+ OR A
+ JP NZ,CORRL1
+ LD L,0
+ INC H
+ JR Z,CORRL2
+ LD A,(HL)
+ OR A
+ JP NZ,CORRL1
+CORRL2 XOR A
+ LD (DE),A
+ LD DE,(ROOTDIR+0)
+ LD L,(IY+CLU1)
+ LD H,(IY+CLU2)
+ AND A
+ SBC HL,DE
+ JR NZ,CORRL6
+ LD DE,(ROOTDIR+2)
+ LD L,(IY+CLU3)
+ LD H,(IY+CLU4)
+ AND A
+ SBC HL,DE
+ JR NZ,CORRL6
+ LD HL,DIR
+ LD A,(HL)
+ CP " "
+ JR NZ,CORRL4
+ LD (HL),#E5
+ LD BC,#0020
+ ADD HL,BC
+ LD A,(HL)
+ CP " "
+ JR NZ,CORRL4
+ LD (HL),#E5
+ JR CORRL4
+CORRL6 LD HL,DIR
+ LD A,(HL)
+ CP " "
+ JR NZ,CORRL4
+ LD (HL),"."
+ LD BC,#0020
+ ADD HL,BC
+ LD A,(HL)
+ CP " "
+ JR NZ,CORRL4
+ LD (HL),"."
+ INC HL
+ LD (HL),"."
+CORRL4 POP AF
+ OUT (PAGE3),A
+ AND A
+ RET
+
+ENTRYBF
+ DEFB #00 ;Entry lenght
+ DEFB #00 ;XAR in LBN
+FCDSEC DEFW #00,#00 ;Start sector (Intel)
+ DEFW #00,#00 ;Start sector (Motorola)
+FCDLEN DEFW #00,#00 ;Lenght file (Intel)
+ DEFW #00,#00 ;Lenght file (Motorola)
+FCDYEAR DEFB #00 ;Year
+FCDMOUN DEFB #00 ;Month
+FCDDAY DEFB #00 ;Day
+FCDHOUR DEFB #00 ;Hour
+FCDMIN DEFB #00 ;Minute
+FCDSECN DEFB #00 ;Second
+ DEFB #00 ;Reserve
+FCDFLAG DEFB #00 ;Flag
+ DEFB #00 ;Interlive size
+ DEFB #00 ;Interlive skip factor
+ DEFW #0000 ;Volume Set Sequence (Intel)
+ DEFW #0000 ;Volume Set Sequence (Motorola)
+FCDFLEN DEFB #00
+DEFSA EQU $-ENTRYBF
+FCDNAME DEFS #100-DEFSA
+
+ROOTDIR DEFW 0,0
+ROOTLEN DEFW 0,0
+
+DIRSIZE DEFW 0
+
+BANK LD C,A
+ LD B,0
+ LD HL,BANKTBL
+ ADD HL,BC
+ IN A,(PAGE3)
+ LD C,PAGE3
+ OUTI
+ RET
+
+BANKTBL DEFB #FF,#FF,#FF,#FF,#FF,#FF,#FF,#FF
+ DEFB #FF,#FF,#FF,#FF,#FF,#FF,#FF,#FF
+
+HANDTA DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+
+MASKARE
+ DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+
+; HL - MASK "file*.t??"
+; DE - 11 bytes filename
+; RET: C=2 FILE WITHOUT EXTENTION
+; C=1 FILE WITH EXTENTION
+
+MASK PUSH HL
+ PUSH DE
+ LD H,D
+ LD L,E
+ INC DE
+ LD (HL),#20
+ LD BC,10
+ LDIR
+ POP DE
+ POP HL
+ LD A,(HL)
+ CP #21
+ RET C
+ LD BC,#0902
+MASK1 LD A,(HL)
+ CP #21
+ CCF
+ RET NC
+ CP #22
+ JR Z,MASK7
+ CP "*"
+ JR Z,MASK3
+ CP "+"
+ JR Z,MASK7
+ CP ","
+ JR Z,MASK7
+ CP "."
+ JR Z,MASK5
+ CP "/"
+ JR Z,MASK7
+ CP ":"
+ JR Z,MASK7
+ CP ";"
+ JR Z,MASK7
+ CP "<"
+ JR Z,MASK7
+ CP "="
+ JR Z,MASK7
+ CP ">"
+ JR Z,MASK7
+ CP "["
+ JR Z,MASK7
+ CP '\' ;
+ JR Z,MASK7
+ CP "]"
+ JR Z,MASK7
+ CP "|"
+ JR Z,MASK7
+ CP "a"
+ JR C,MASK2
+ CP "{"
+ JR NC,MASK2
+ SUB #20
+MASK2 LD (DE),A
+ INC HL
+ INC DE
+ DJNZ MASK1
+MASK7 LD A,16
+ SCF
+ RET
+
+MASK3 LD A,"?"
+ INC HL
+ DJNZ MASK6
+ LD A,16
+ SCF
+ RET
+
+MASK6 LD (DE),A
+ INC DE
+ DJNZ MASK6
+ LD B,1
+ JR MASK1
+
+MASK5 LD A," "
+ INC HL
+ DJNZ MASK4
+ LD B,4
+ DEC C
+ JP NZ,MASK1
+ LD A,16
+ SCF
+ RET
+
+MASK4 LD (DE),A
+ INC DE
+ DJNZ MASK4
+ LD B,4
+ DEC C
+ JP NZ,MASK1
+ LD A,16
+ SCF
+ RET
diff --git a/DSS/drivers/media/ATAPI/Hidden/Cd_bios.asm b/DSS/drivers/media/ATAPI/Hidden/Cd_bios.asm
new file mode 100644
index 0000000..02deff8
--- /dev/null
+++ b/DSS/drivers/media/ATAPI/Hidden/Cd_bios.asm
@@ -0,0 +1,372 @@
+MASTER EQU 0
+SLAVE EQU 1
+;========================================================
+R170 EQU #0050 ;Data
+R171 EQU #0051 ;Error
+R172 EQU #0052 ;Direct
+R173 EQU #0053 ;Reserve
+R174 EQU #0054 ;Lenght block low
+R175 EQU #0055 ;Lenght block high
+R176 EQU #4052 ;Drive device
+R177 EQU #4053 ;Status
+
+W170 EQU #0150 ;Data
+W171 EQU #0151 ;????
+W172 EQU #0152 ;????
+W173 EQU #0153 ;Reserve
+W174 EQU #0154 ;Lenght block low
+W175 EQU #0155 ;Lenght block high
+W176 EQU #4152 ;Drive device
+W177 EQU #4153 ;Command
+
+BSY EQU 7
+DRQ EQU 3
+ERR EQU 0
+
+
+;-----------------------------------------------------------------------;
+SIZESEC: DW #0800
+
+PKTSIZE: DB 12
+;-----------------------------------------------------------------------;
+
+
+CDCMD BIT 7,C
+ JP NZ,EXTCD
+ INC C
+ DEC C
+ JP Z,RESETCD ; 0
+ DEC C
+ JP Z,RESETCD ; 1
+ DEC C
+ JP Z,NOPCDC ; 2
+ DEC C
+ JP Z,CHEK_C ; 3
+ DEC C
+ JP Z,GBPB_C ; 4 ; [ ] перенести в DSS
+ DEC C
+ JP Z,READC ; 5
+ DEC C
+ JP Z,NOPCDC ; 6
+NOPCDC LD A,1
+ SCF
+ RET
+
+EXTCD RES 7,C
+ INC C
+ DEC C
+ JP Z,NOPCDC
+ DEC C
+ JP Z,OPENC
+ DEC C
+ JP Z,CLOSC
+ JP NOPCDC
+
+
+RESETCD LD B,50
+RESECD PUSH BC
+ LD A,(CDDRIVE)
+ CALL CD_TEST
+ POP BC
+ RET NC
+ OR A
+ RET Z
+ EI
+ HALT
+ DJNZ RESECD
+ RET
+
+CHEK_C LD A,(CDDRIVE)
+ CALL CD_TEST
+ LD A,#FF
+ AND A
+ RET
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; [ ] перенести в DSS
+GBPB_C LD HL,CD_BPB
+ LD BC,#0200
+ LDIR
+ XOR A
+ RET
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+READC LD A,(CDDRIVE)
+ JP CD_READ
+
+OPENC LD A,(CDDRIVE)
+ JP CD_OPEN
+
+CLOSC LD A,(CDDRIVE)
+ JP CD_CLOS
+
+CD_TEST LD HL,CMDNOPP
+ LD DE,0
+ JP AP_COM
+
+CD_OPEN LD HL,CMDOPEN
+ LD DE,0
+ JP AP_COM
+
+CD_CLOS LD HL,CMDCLOS
+ LD DE,0
+ JP AP_COM
+
+; HL:IX - SECTOR
+; DE - ADDRESS
+; B - SECTOR COUNT
+; A - DRIVE
+CD_READ:
+ LD C,A
+ LD A,H
+ LD (SECREAD+0),A
+ LD A,L
+ LD (SECREAD+1),A
+ LD A,XH
+ LD (SECREAD+2),A
+ LD A,XL
+ LD (SECREAD+3),A
+ LD A,B
+ LD (COUNT+1),A
+ LD HL,CMDREAD
+ LD A,C
+ CALL AP_COM
+ RET
+
+; INPUT: HL - AP paket (12bytes)
+; RETURN: CF - ERROR
+; 01h - RECOVERED ERROR
+; 02h - NOT READY
+; 03h - MEDIUM ERROR
+; 04h - HARDWARE ERROR
+; 05h - ILLEGAL REQUEST
+; 06h - UNIT ATTETION
+; 07h - DATA PROTECT
+; 0Bh - ABORTED COMMAND
+; 80h - TIME OUT
+
+AP_COM ;AND #01
+ ;LD A,#A0 ;0
+ ;JR Z,APCOM1
+ ;LD A,#B0
+APCOM1 ;LD BC,W176
+ ;OUT (C),A ;SELECT DRIVE
+ EXX
+ LD DE,#8000
+ LD BC,R177
+ CALL WAITPRT
+ EXX
+ JR NC,CDREADY
+ LD BC,W177
+ LD A,#08
+ OUT (C),A
+ LD B,#80
+ DJNZ $
+ EXX
+ LD DE,#8000
+ LD BC,R177
+ CALL WAITPRT
+ EXX
+ RET C
+CDREADY XOR A
+ EXX
+ LD BC,W171
+ OUT (C),A
+ LD DE,(SIZESEC) ;SIZE BLOCK
+ LD BC,W174
+ OUT (C),E
+ LD BC,W175
+ OUT (C),D
+ LD BC,W177
+ LD A,#A0 ;ATAPI.Packet
+ OUT (C),A
+ LD DE,#8000
+ LD BC,R177
+ CALL WAITPRT
+ EXX
+ RET C
+ EXX
+ LD DE,#0908
+ LD BC,R177
+ CALL WAITPRT
+ EXX
+ BIT ERR,A
+ JR NZ,CDERROR
+ JR NC,YEP_DRQ
+ LD A,#80
+ RET
+
+YEP_DRQ LD BC,W170
+ LD A,(PKTSIZE)
+ SRL A
+OUTPKT OUTI
+ OUTI
+ DEC A
+ JR NZ,OUTPKT
+ LD B,#80
+ DJNZ $
+AP_LOOP EXX
+ LD DE,#8000
+ LD BC,R177
+ CALL WAITPRT
+ EXX
+ RET C
+ LD BC,R177
+ IN A,(C)
+ BIT ERR,A
+ JR Z,NO_ERR
+CDERROR LD BC,R171 ;ERROR
+ IN A,(C)
+ RRCA
+ RRCA
+ RRCA
+ RRCA
+ AND #0F
+ SCF
+ RET
+
+NO_ERR BIT DRQ,A
+ LD A,0
+ RET Z ;NO DATA REQUEST
+ EX DE,HL
+ LD BC,R174
+ IN E,(C)
+ LD BC,R175
+ IN D,(C) ;TRANSFER BLOCK SIZE
+ LD A,D
+ OR E
+ RET Z ;BLOCK = 0
+ LD BC,R172
+ IN A,(C)
+ AND #02
+ ;CP #02
+ JP NZ,FROM_CD
+TO_CD LD BC,R170
+WR_T_CD OUTI
+ OUTI
+ DEC DE
+ DEC DE
+ LD A,D
+ OR E
+ JR NZ,WR_T_CD
+ EX DE,HL
+ JR AP_LOOP
+
+FROM_CD LD A,H
+ OR L
+ JR Z,NULL
+ LD BC,R170
+RD_F_CD INI
+ INI
+ DEC DE
+ DEC DE
+ LD A,D
+ OR E
+ JR NZ,RD_F_CD
+ EX DE,HL
+ JR AP_LOOP
+
+NULL LD BC,R170
+RD_N_CD IN A,(C)
+ DEC B
+ IN A,(C)
+ DEC B
+ DEC DE
+ DEC DE
+ LD A,D
+ OR E
+ JR NZ,RD_N_CD
+; DE = 0 !!!
+ JR AP_LOOP
+
+; E - Second * 10
+
+PAUSE LD HL,#0000
+PAUSE1 DEC L
+ JR NZ,PAUSE1
+ DEC H
+ JR NZ,PAUSE1
+ DEC E
+ JR NZ,PAUSE1
+ RET
+
+; D - MASK
+; E - PATTERN
+; BC - PORT
+
+WAITPRT LD A,100
+ LD HL,#0000
+WAITPX EX AF,AF'
+WAITP0 IN A,(C)
+ CP #FF
+ JR Z,WAITP1
+ AND D
+ CP E
+ JR NZ,WAITP2
+ AND A
+ RET
+
+WAITP2 DEC L
+ JR NZ,WAITP0
+ DEC H
+ JR NZ,WAITP0
+ EX AF,AF'
+ DEC A
+ JR NZ,WAITPX
+ EX AF,AF'
+WAITP1 SCF
+ RET
+
+CMDNOPP DEFB #00
+ DEFB 00,00,00
+ DEFB #00
+ DEFB 00,00,00
+ DEFB 00,00,00
+ DEFB #00
+
+CMDOPEN DEFB #1B
+ DEFB #00,#00,#00
+ DEFB #02
+ DEFB #00,#00,#00,#00,#00,#00,#00
+
+CMDCLOS DEFB #1B
+ DEFB #00,#00,#00
+ DEFB #03
+ DEFB #00,#00,#00,#00,#00,#00,#00
+
+;CMDREAD DEFB #28,#00
+CMDREAD DEFB #28,#00
+SECREAD DEFB #00,#00,#00,#00
+ DEFB #00
+COUNT DEFB #00,#01
+ DEFB #00,#00,#00
+
+
+; Area for boot sector [512Bytes]
+CD_BPB DB #00,#00,#00 ; +00 JMP
+ DB " " ; +03 DOS NAME
+
+; Block Parameters BIOS
+
+ DW #0200 ; +0B BYTE PER SECTOR
+ DB 4 ; +0D SECTORS PER CLUSTER
+ DW 1 ; +0E RESERVE SECTORS
+ DB 1 ; +10 AMOUNT FATS
+ DW 512 ; +11 FILES IN DIRECTORY
+ DW 0 ; +13 ALL SECTORS ON DISK
+ DB #F8 ; +15 ID FORMAT
+ DW 1 ; +16 SIZE FAT IN SECTORS
+ DW 63 ; +18 SECTOR PER TRACK
+ DW 255 ; +1A AMOUNT SIDES
+ DW #0010 ; +1C HIDDEN SECTORS
+
+ DS 24
+
+ DB "FAT16" ; +36 FAT ID
+
+ DS 453
+; end boot sector
+;========================================================
+
+
+
diff --git a/DSS/drivers/media/ATAPI/Hidden/Cdriver.asm b/DSS/drivers/media/ATAPI/Hidden/Cdriver.asm
new file mode 100644
index 0000000..aee4820
--- /dev/null
+++ b/DSS/drivers/media/ATAPI/Hidden/Cdriver.asm
@@ -0,0 +1,356 @@
+;CD ROM DRIVE DRIVER
+;---------------------------------------------------------------
+;Rev Date Name Description
+;---------------------------------------------------------------
+; 02-08-2001 DNS Initial this module
+;---------------------------------------------------------------
+;========================================================
+R170 EQU #0050 ;Data
+R171 EQU #0051 ;Error
+R172 EQU #0052 ;Direct
+R173 EQU #0053 ;Reserve
+R174 EQU #0054 ;Lenght block low
+R175 EQU #0055 ;Lenght block high
+R176 EQU #4052 ;Drive device
+R177 EQU #4053 ;Status
+
+W170 EQU #0150 ;Data
+W171 EQU #0151 ;????
+W172 EQU #0152 ;????
+W173 EQU #0153 ;Reserve
+W174 EQU #0154 ;Lenght block low
+W175 EQU #0155 ;Lenght block high
+W176 EQU #4152 ;Drive device
+W177 EQU #4153 ;Command
+
+RAM_ATAPI_PK EQU #FEE0
+RAM_ATAPI_READ EQU #FEF0
+
+
+; BSY EQU 7
+; DRQ EQU 3
+; ERR EQU 0
+
+RESETC
+RESETCD LD B,50
+RESECD PUSH BC
+ LD A,1
+ CALL CD_TEST
+ POP BC
+ RET NC
+ EI
+ HALT
+ DJNZ RESECD
+ RET
+
+LREADC
+
+READC LD A,1
+ JP CD_READ
+
+OPENC LD A,1
+ JP CD_OPEN
+
+CLOSC LD A,1
+ JP CD_CLOS
+
+SIZESEC EQU #0800
+PKTSIZE EQU 12
+
+CD_TEST LD HL,CMDNOPP
+ LD DE,0
+ CALL AP_COM
+ RET
+
+DETECTC
+
+CD_OPEN LD HL,CMDOPEN
+ LD DE,0
+ CALL AP_COM
+ RET
+
+CD_CLOS LD HL,CMDCLOS
+ LD DE,0
+ CALL AP_COM
+ RET
+
+; HL:IX - SECTOR
+; DE - ADDRESS
+; B - SECTOR COUNT
+; A - DRIVE
+
+CD_READ LD C,A
+ EXX
+ LD C,PAGE3
+ IN A,(C)
+ PUSH AF
+ LD A,SYSPAGE
+ OUT (C),A
+ LD HL,CMDREAD
+ LD DE,RAM_ATAPI_READ
+ LD BC,PKTSIZE
+ LDIR
+ EXX
+ LD A,H
+ LD (RAM_ATAPI_READ+SECREAD+0),A ;R01
+ LD A,L
+ LD (RAM_ATAPI_READ+SECREAD+1),A ;R01
+ LD A,XH
+ LD (RAM_ATAPI_READ+SECREAD+2),A ;R01
+ LD A,XL
+ LD (RAM_ATAPI_READ+SECREAD+3),A ;R01
+ LD A,B
+ LD (RAM_ATAPI_READ+COUNT+1),A ;R01
+ POP AF
+ OUT (PAGE3),A
+;R01 LD HL,CMDREAD
+ LD HL,RAM_ATAPI_READ
+ LD A,C
+ CALL AP_COM
+ RET
+
+; INPUT: HL - AP paket (12bytes)
+; RETURN: CF - ERROR
+; 01h - RECOVERED ERROR
+; 02h - NOT READY
+; 03h - MEDIUM ERROR
+; 04h - HARDWARE ERROR
+; 05h - ILLEGAL REQUEST
+; 06h - UNIT ATTETION
+; 07h - DATA PROTECT
+; 0Bh - ABORTED COMMAND
+; 80h - TIME OUT
+
+AP_COM AND #01
+ LD A,#A0
+ JR Z,APCOM1
+ LD A,#B0
+APCOM1 LD BC,W176
+ OUT (C),A ;SELECT DRIVE
+ EXX
+ LD DE,#8000
+ LD BC,R177
+ CALL CWAITPRT
+ EXX
+ JR NC,CDREADY
+ LD BC,W177
+ LD A,#08
+ OUT (C),A
+ LD B,#00
+ DJNZ $
+ EXX
+ LD DE,#8000
+ LD BC,R177
+ CALL CWAITPRT
+ EXX
+ RET C
+CDREADY
+ LD C,PAGE3
+ IN B,(C)
+
+ PUSH DE
+ PUSH BC
+
+ LD A,SYSPAGE
+ OUT (C),A
+ LD A,B
+ LD DE,RAM_ATAPI_PK
+ LD BC,PKTSIZE
+ LDIR
+
+ POP BC
+ POP DE
+ OUT (C),B
+
+ XOR A
+ EXX
+ OUT (C),A
+ XOR A
+ LD BC,W171
+ OUT (C),A
+ LD DE,SIZESEC ;SIZE BLOCK
+ LD BC,W174
+ OUT (C),E
+ LD BC,W175
+ OUT (C),D
+ LD BC,W177
+ LD A,#A0
+ OUT (C),A
+ LD DE,#8000
+ LD BC,R177
+ CALL CWAITPRT
+ EXX
+ RET C
+ EXX
+ IF _MAME
+ LD DE,#0808
+ ELSE
+ LD DE,#0908
+ ENDIF
+ LD BC,R177
+ CALL CWAITPRT
+ EXX
+ BIT ERR,A
+ JR NZ,CDERROR
+ JR NC,YEP_DRQ
+ LD A,#80
+ RET
+
+YEP_DRQ LD C,PAGE3
+ IN B,(C)
+ PUSH BC
+ LD A,SYSPAGE
+ OUT (PAGE3),A
+ LD HL,RAM_ATAPI_PK
+ LD BC,W170
+ LD A,PKTSIZE
+ SRL A
+OUTPKT OUTI
+ OUTI
+ DEC A
+ JR NZ,OUTPKT
+ POP BC
+ OUT (C),B
+ LD B,#80
+ DJNZ $
+AP_LOOP EXX
+ LD DE,#8000
+ LD BC,R177
+ CALL CWAITPRT
+ EXX
+ RET C
+ LD BC,R177
+ IN A,(C)
+ BIT ERR,A
+ JR Z,NO_ERR
+CDERROR LD BC,R171 ;ERROR
+ IN A,(C)
+ RRCA
+ RRCA
+ RRCA
+ RRCA
+ AND #0F
+ SCF
+ RET
+
+NO_ERR BIT DRQ,A
+ LD A,0
+ RET Z ;NO DATA REQUEST
+ EX DE,HL
+ LD BC,R174
+ IN E,(C)
+ LD BC,R175
+ IN D,(C) ;TRANSFER BLOCK SIZE
+ LD A,D
+ OR E
+ RET Z ;BLOCK = 0
+ LD BC,R172
+ IN A,(C)
+ AND #02
+ CP #02
+ JP Z,FROM_CD
+TO_CD LD BC,R170
+WR_T_CD OUTI
+ OUTI
+ DEC DE
+ DEC DE
+ LD A,D
+ OR E
+ JR NZ,WR_T_CD
+ EX DE,HL
+ JR AP_LOOP
+
+FROM_CD LD A,H
+ OR L
+ JR Z,NULL
+ LD BC,R170
+RD_F_CD INI
+ INI
+ DEC DE
+ DEC DE
+ LD A,D
+ OR E
+ JR NZ,RD_F_CD
+ EX DE,HL
+ JR AP_LOOP
+
+NULL LD BC,R170
+RD_N_CD IN A,(C)
+ DEC B
+ IN A,(C)
+ DEC B
+ DEC DE
+ DEC DE
+ LD A,D
+ OR E
+ JR NZ,RD_N_CD
+; DE = 0 !!!
+ JR AP_LOOP
+
+; E - Second * 10
+
+PAUSE LD HL,#0000
+PAUSE1 DEC L
+ JR NZ,PAUSE1
+ DEC H
+ JR NZ,PAUSE1
+ DEC E
+ JR NZ,PAUSE1
+ RET
+
+; D - MASK
+; E - PATTERN
+; BC - PORT
+
+CWAITPRT
+ LD A,100
+ LD HL,#0000
+CWAITPX EX AF,AF'
+CWAITP0 IN A,(C)
+ CP #FF
+ JR Z,CWAITP1
+ AND D
+ CP E
+ JR NZ,CWAITP2
+ AND A
+ RET
+
+CWAITP2 DEC L
+ JR NZ,CWAITP0
+ DEC H
+ JR NZ,CWAITP0
+ EX AF,AF'
+ DEC A
+ JR NZ,CWAITPX
+ EX AF,AF'
+CWAITP1 SCF
+ RET
+
+CMDNOPP DEFB #00
+ DEFB 00,00,00
+ DEFB #00
+ DEFB 00,00,00
+ DEFB 00,00,00
+ DEFB #00
+
+CMDOPEN DEFB #1B
+ DEFB #00,#00,#00
+ DEFB #02
+ DEFB #00,#00,#00,#00,#00,#00,#00
+
+CMDCLOS DEFB #1B
+ DEFB #00,#00,#00
+ DEFB #03
+ DEFB #00,#00,#00,#00,#00,#00,#00
+
+CMDREAD DEFB #28,#00
+SECREAD EQU $-CMDREAD
+ DEFB #00,#00,#00,#00
+ DEFB #00
+COUNT EQU $-CMDREAD
+ DEFB #00,#01
+ DEFB #00,#00,#00
+
+;========================================================
+
+
diff --git a/Console/DSS.INC b/DSS/drivers/media/ATAPI/Hidden/DSS.INC
similarity index 100%
rename from Console/DSS.INC
rename to DSS/drivers/media/ATAPI/Hidden/DSS.INC
diff --git a/DSS/drivers/media/ATAPI/Hidden/DUMP.TXT b/DSS/drivers/media/ATAPI/Hidden/DUMP.TXT
new file mode 100644
index 0000000..e88e42d
--- /dev/null
+++ b/DSS/drivers/media/ATAPI/Hidden/DUMP.TXT
@@ -0,0 +1,6 @@
+
+00000000 00 43 44 30 30 31 01 45 4c 20 54 4f 52 49 54 4f |.CD001.EL TORITO|
+00000010 20 53 50 45 43 49 46 49 43 41 54 49 4f 4e 00 00 | SPECIFICATION..|
+00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
+*
+00000040 00 00 00 00 00 00 00 13 00 00 00 00 00 00 00 00 |................|
diff --git a/DSS/drivers/media/ReScanDRV.ASM b/DSS/drivers/media/ReScanDRV.ASM
new file mode 100644
index 0000000..ea9edcd
--- /dev/null
+++ b/DSS/drivers/media/ReScanDRV.ASM
@@ -0,0 +1,455 @@
+;!TODO код дико костыльный и будет переделан вместе с процедурой INITDVC
+ReScanDRV:
+.NUMBER_OF_SUBTABLES EQU 2 ;количество таблиц второго уровня (LOGDRV, RMDRIVE)
+; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
+; 0. запоминаем бут-диск
+; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
+ LD A,B
+ LD (.old_letter),A
+; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
+; 1. копируем в буфер таблицы DEVICE, LOGDRV, RAMDTBL
+; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
+ LD HL,DEVICE
+ LD DE,OLD_TABLES.DEVICE
+ LD BC,OLD_TABLES.DEVICE - DEVICE
+ LDIR
+ ;
+ LD A,.NUMBER_OF_SUBTABLES
+ LD (Fill_if_Exists.tbl),A
+; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
+; 2. вызываем инициализацию драйвов
+; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
+ CALL INITDVC_RET_DRIVE
+ LD (DRV_PAGE.LDRIVE),A
+; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
+; 3. сравниваем записи старых таблиц с новыми:
+; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
+ LD HL,OLD_TABLES.DEVICE
+ LD B,DSS_MAX_DRIVES_AMOUNT
+.tbl_scanNew_mainLoop:
+ PUSH BC
+ PUSH HL
+ ; получаем номер процедуры для этой буквы диска
+ LD A,(HL)
+ ;
+ CP #FF
+ JR Z,.nextN
+ ;
+ LD B,A
+ INC HL
+ LD A,(HL)
+ INC HL
+ LD H,(HL)
+ LD L,A
+ ; [ищем что за драйв]
+ EX DE,HL
+ ; FDD?
+ LD HL,FDD_DRV.API_TABLE
+ AND A
+ SBC HL,DE
+ JR Z,.nextN ; пропуск FDD драйвов
+ ; HDD?
+ LD HL,IDE_DRV.API_TABLE
+ AND A
+ SBC HL,DE
+ ; HDD! Сверка по таблице LOGDRV
+ JP Z,SCAN_TABLES.HARD_DRV
+ ; RD?
+ LD HL,RAMDSK_DRV.API_TABLE
+ AND A
+ SBC HL,DE
+ ; RAM Drive! Сверка по таблице RAMDTBL
+ JP Z,SCAN_TABLES.RAM_DRV
+ ; CD/DVD?
+ ;LD HL,CDDRIVE
+ ;AND A
+ ;SUB HL,DE
+ ; CD/DVD!
+ ; JR Z,SCAN_TABLES.CD_ROM
+
+ ; следующий виток
+.nextN: POP HL
+.nextN2:
+ INC HL
+ INC HL
+ INC HL
+ POP BC
+ DJNZ .tbl_scanNew_mainLoop
+; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
+; 4. сравниваем запись новых таблиц со старыми
+; а. если драйв только в новой:
+; а1) втыкаем его в первую свободную запись в DEVICE (или ставим после последнего драйва)
+;
+; ВХОД: IX - OLD_TABLES.DEVICE
+; HL - OLD_TABLES.DEVICE.End
+; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
+ INC HL
+ LD (OLD_TABLES_CURRENT),HL
+ EXX
+ LD HL,OLD_TABLES.LOGDRV - LOGDRV
+ LD B,DSS_MAX_DRIVES_AMOUNT
+ EXX
+ ; находим в старой DEVICE первую свободную ячейку (проверяем с конца в начало)
+ LD IX,OLD_TABLES.DEVICE + OLD_TABLES.DEVICE.Size - OLD_TABLES.DEVICE.TBL_Entry
+ LD IY,LOGDRV
+ LD DE,-OLD_TABLES.DEVICE.TBL_Entry ; двигаемся по таблице назад
+ LD B,DSS_MAX_DRIVES_AMOUNT
+ ;
+.loop1: LD A,#FF
+ CP (IX+0)
+ JR NZ,.loop2_start
+ ADD IX,DE
+ DJNZ .loop1
+.loop1_exit:
+ LD A,C ; закончили считать переменную LDRIVE
+ LD (DRV_PAGE.LDRIVE),A
+; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
+
+; 5. проверяем, не грохнулся ли бут-диск.
+; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
+.old_letter+1:
+ LD A,0
+ _CALC_DEVICE_ENTRY OLD_TABLES.DEVICE
+ LD A,(HL)
+ INC A
+ SCF
+ ;JP Z,ERROR_BOOTDRV_DIES
+ RET Z
+; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
+
+; 6. заменяем новые таблицы на модифицированные старые
+; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
+ LD HL,OLD_TABLES.DEVICE
+ LD DE,DEVICE
+ LD BC,OLD_TABLES.DEVICE - DEVICE
+ LDIR
+ ;
+; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
+
+;7. выход
+; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
+ LD A,(DRV_PAGE.LDRIVE)
+ AND A
+ RET
+; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
+
+;-----------------------[]
+.loop2_start:
+ LD C,B ; начинаем считать переменную LDRIVE
+ LD A,DSS_MAX_DRIVES_AMOUNT
+ SUB B ; сколько шагов вперёд по таблице осталось
+ LD B,A
+ ;
+.loop2: LD DE,DEVICE.TBL_Entry ; теперь двигаемся по таблице вперёд
+ ADD IX,DE
+ ; тут указатель показывает на первую свободную ячейку после блока с данными драйвов
+ PUSH IX
+ PUSH BC
+ CALL Fill_if_Exists
+ POP BC
+ POP IX
+ ; NC:
+ ; DE = адрес процедуры обработчика таблицы
+ ; A = логический номер устройства в таблице обработчика
+ ;
+ ; CF - нет больше новых записей
+ JR C,.loop1_exit
+
+ LD (IX+0),A
+ LD (IX+1),E
+ LD (IX+2),D
+ ;
+ INC C ; добавили драйв
+ ;
+ DJNZ .loop2
+ JR .loop1_exit
+;-----------------------[]
+
+;-----------------------[]
+Fill_if_Exists:
+.tbl+1: LD B,ReScanDRV.NUMBER_OF_SUBTABLES
+ DJNZ 1F
+ ; B=1, RAMDTBL
+ LD A,RAMDTBL.TBL_Entry
+ LD IY,RAMDTBL
+ CALL .RUN
+ LD DE,RAMDSK_DRV.API_TABLE
+ RET NC
+ LD A,(.tbl)
+ DEC A ;!!!!! может быть переполнение
+ LD (.tbl),A
+ RET
+ ;
+1: DJNZ 1F
+ ; B=2, LOGDRV
+ LD A,LOGDRV.TBL_Entry
+ LD IY,LOGDRV
+ CALL .RUN
+ LD DE,IDE_DRV.API_TABLE
+ RET NC
+ ; переходим на другую таблицу - RAMDTBL
+ LD A,(.tbl)
+ DEC A ;!!!!! может быть переполнение
+ LD (.tbl),A
+ LD HL,OLD_TABLES.RAMDTBL
+ LD (OLD_TABLES_CURRENT),HL
+ EXX
+ LD B,MAX_RAMDRIVES
+ EXX
+ JR Fill_if_Exists
+ ;
+1: SCF ; unknown table number
+ RET
+;
+.RUN: EXX
+ ;
+ LD D,0
+ LD E,A
+ PUSH DE
+ ;
+ LD A,#FE ; Так поиск закончится либо на номере драйва, либо по концу таблицы
+ PUSH BC
+ CALL Find_Record.loop1 ; ищет в новой таблице новую запись
+ POP BC
+ JR NC,1F
+ ;
+ POP DE
+ EXX
+ RET
+ ;
+1: PUSH IY ; сохраняем текущий адрес новой таблицы
+ ;
+ LD IY,(OLD_TABLES_CURRENT)
+ ;
+ LD A,#FF ; Так поиск закончится либо на пустой записи, либо по концу таблицы
+ LD C,D ; номер записи в таблице. D=0
+ PUSH BC
+ CALL Find_Record.loop2
+ LD A,C
+ POP BC
+ JR NC,1F
+ ;
+ POP DE
+ POP DE
+ EXX
+ RET
+ ;
+1: EX (SP),IY ; переключение со старой на новую таблицу
+ PUSH IY
+ EXX
+ ; перекидываем запись из новой в старую
+ POP HL
+ POP DE
+ POP BC
+ LDIR
+
+ LD (IY),#FF ; грохаем только что перекинутую запись из новой таблицы
+ AND A
+ RET
+OLD_TABLES_CURRENT: WORD 0
+;-----------------------[]
+
+;-----------------------[]
+; ВХОД: A - Маска для сравнения
+; DE - Длина одной записи
+; IY - Адрес данных в таблице
+; ВЫХОД: NC:
+; IY - начало подходящей записи
+; C - номер новой записи в старой таблице
+; CF - Не найдено, таблица закончилась
+Find_Record:
+.loop1: CP (IY)
+ RET NC
+ ADD IY,DE
+ INC C
+ DJNZ .loop1
+ ; таблицу прошерстили
+ SCF
+ RET
+.loop2: CP (IY)
+ RET Z
+ ADD IY,DE
+ INC C
+ DJNZ .loop2
+ ; таблицу прошерстили
+ SCF
+ RET
+;-----------------------[]
+
+;-----------------------[]
+; НЕ ГРОХАТЬ HL!
+; а. если драйв есть в новой и старой, то затираем в новой
+; таблице совпавший драйв
+; б. если драйв есть только в старой, то:
+; б1) грохаем файловые манипуляторы с его номером
+ MODULE SCAN_TABLES
+; вход: B - лог.номер драйва, DE
+RAM_DRV:
+ ; Получаем номер рамдиска в OLD_TABLES.RAMDTBL
+ LD A,B
+ LD BC,OLD_TABLES.RAMDTBL
+ CALL RAMDSK_DRV.GET_RAMDRV_NUM.skip_tbl
+ LD (.cur_drv),BC
+ AND #0F
+ LD C,A ; номер рамдиска
+ ; Ищем в новой такой же номер рамдиска
+ LD B,MAX_RAMDRIVES
+ LD DE,RAMDTBL
+.loop: LD A,(DE)
+ SUB C
+ JR Z,.found
+ INC DE
+ INC DE
+ DJNZ .loop
+ ; ЗАПИСЬ НЕ НАЙДЕНА
+ ; Достаём положение в OLD_TABLES.DEVICE
+ POP HL
+ ; Достаём шаг общего цикла для получения лог.номера драйва в KILL_FM
+ POP BC
+ PUSH BC
+ ; Грохаем ФМ и запись в OLD_TABLES.DEVICE
+ CALL KILL_FM
+ ; грохаем в старой RAMDTBL этот драйв
+ EX DE,HL
+.cur_drv+1:
+ LD HL,0
+ LD (HL),#FF
+ DEC HL
+ LD (HL),#FF
+ EX DE,HL
+ JP ReScanDRV.nextN2
+ ;
+.found: DEC A
+ ; затираем в новой таблице совпавший драйв (чтоб легче было парсить оставшееся)
+ LD (DE),A
+ DEC DE
+ LD (DE),A
+ JP ReScanDRV.nextN
+;-----[]
+HARD_DRV:
+ LD L,B
+ LOGDRV_ENTRY_FIND OLD_TABLES.LOGDRV
+ LD IX,LOGDRV
+ LD DE,LOGDRV.TBL_Entry
+ LD B,DSS_MAX_DRIVES_AMOUNT
+ ;
+.loop: LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER)
+ ;CP #FF
+ ;JR Z,.skip
+ CP (IX+LOGDRV.PHISICAL_DRV_NUMBER)
+ JR NZ,.skip
+ ;
+ LD A,(IY+LOGDRV.SECTOR_OFFSET)
+ CP (IX+LOGDRV.SECTOR_OFFSET)
+ JR NZ,.skip
+ LD A,(IY+LOGDRV.SECTOR_OFFSET+1)
+ CP (IX+LOGDRV.SECTOR_OFFSET+1)
+ JR NZ,.skip
+ LD A,(IY+LOGDRV.SECTOR_OFFSET+2)
+ CP (IX+LOGDRV.SECTOR_OFFSET+2)
+ JR NZ,.skip
+ LD A,(IY+LOGDRV.SECTOR_OFFSET+3)
+ CP (IX+LOGDRV.SECTOR_OFFSET+3)
+ JR NZ,.skip
+ LD A,(IY+LOGDRV.SIZE_IN_SECTORS)
+ CP (IX+LOGDRV.SIZE_IN_SECTORS)
+ JR NZ,.skip
+ LD A,(IY+LOGDRV.SIZE_IN_SECTORS+1)
+ CP (IX+LOGDRV.SIZE_IN_SECTORS+1)
+ JR NZ,.skip
+ LD A,(IY+LOGDRV.SIZE_IN_SECTORS+2)
+ CP (IX+LOGDRV.SIZE_IN_SECTORS+2)
+ JR NZ,.skip
+ LD A,(IY+LOGDRV.SIZE_IN_SECTORS+3)
+ CP (IX+LOGDRV.SIZE_IN_SECTORS+3)
+ JR Z,.found
+ ;
+.skip: ADD IX,DE
+ DJNZ .loop
+ ; ЗАПИСЬ НЕ НАЙДЕНА
+ ; Грохаем старую запись в OLD_TABLES.LOGDRV
+ LD A,#FF
+ LD (IY+LOGDRV.PHISICAL_DRV_NUMBER),A
+ ; Достаём положение в OLD_TABLES.DEVICE
+ POP HL
+ ; Достаём шаг общего цикла для получения лог.номера драйва в KILL_FM
+ POP BC
+ PUSH BC
+ ; Грохаем ФМ и запись в OLD_TABLES.DEVICE
+ CALL KILL_FM
+ ;
+ JP ReScanDRV.nextN2
+ ;
+.found: ; затираем в новой таблице совпавший драйв (чтоб легче было парсить оставшееся)
+ LD (IX+LOGDRV.PHISICAL_DRV_NUMBER),#FF
+ JP ReScanDRV.nextN
+ ;
+; CD_ROM:
+; JP ReScanDRV.nextN
+;-----[]
+; ВХОД: HL - текущая запись в таблице DEVICE
+; B - шаг общего цикла
+KILL_FM:;
+ LD A,DSS_MAX_DRIVES_AMOUNT
+ SUB B
+ LD C,A
+ ; втыкаем страницу ядра с таблицей файловых манипуляторов
+ PUSH BC
+ LD A,(PORTAL.out_DRV.RETBANK)
+ LD B,A
+ LD C,SLOT3
+ IN A,(SLOT3)
+ OUT (C),B
+ POP BC
+ PUSH AF
+ ; Шерстим манипуляторы на наличие в них грохнутого драйва
+ LD IY,CORE_BUFFERS.FM_BUF + #C000 ; - CORE_BUFFERS.FM_BUF.Size
+ LD B,FMCOUNT - 1 ; пропускаем служебный нулевой манипулятор
+ LD DE,CORE_BUFFERS.FM_BUF.Size
+.loop_fm:
+ ADD IY,DE
+ LD A,(IY+_sFM.DRIVE)
+ CP C
+ JR NZ,.skip
+ XOR A
+ LD (IY+_sFM.FS_REC.NAME),A ; грохаем манипулятор
+.skip: DJNZ .loop_fm
+ ;
+ POP AF
+ OUT (SLOT3),A
+ ;
+ ; грохаем в OLD_TABLES.DEVICE убитый драйв
+ LD (HL),#FF
+ ;
+ RET
+ ENDMODULE
+;-----------------------[]
+
+/*
+[DRIVE TABLES] .Size == DEVICE.Size + LOGDRV.Size + RAMDTBL.Size == 78+1 + 416 + 32 == 526
+
+; логический номер устройства + адрес обработчика.
+; Порядковый номер * 3 = буква диска + "A"
+DEVICE EQU $
+.TBL_Entry EQU 3
+.End EQU 1 + $ + DSS_MAX_DRIVES_AMOUNT * .TBL_Entry ; для стоп-байта #FF
+.Size EQU .End - $
+
+;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
+;+01 LONG SECTOR OFFSET
+;+05 LONG SIZE IN SECTORS
+;+09 LONG Volume Serial Number in HEX ; [ ] ;!TODO
+;+13 WORD FREE
+;+15 BYTE FREE
+; Логический номер раздела.
+;Номер группы = логический номер раздела HDD из DEVICE
+LOGDRV EQU DEVICE + DEVICE.Size
+.TBL_Entry EQU 16
+.Size EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry
+
+; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID
+; Log Number: DB RAM_DRIVE_NUMBER, RAM_DRIVE_ID
+RAMDTBL EQU $ + DEVICE.Size + LOGDRV.Size
+.TBL_Entry EQU 2
+.Size EQU .TBL_Entry * MAX_RAMDRIVES
+*/
\ No newline at end of file
diff --git a/DSS/DISK_X.ASM b/DSS/drivers/media/Shared.asm
similarity index 52%
rename from DSS/DISK_X.ASM
rename to DSS/drivers/media/Shared.asm
index 4593d9e..6b19888 100644
--- a/DSS/DISK_X.ASM
+++ b/DSS/drivers/media/Shared.asm
@@ -1,5 +1,15 @@
+;[BEGIN]
+;//MODULE: Shared AUTHOR: Denis Parinov
+;//CREATE: A LONG TIME AGO :)
+;---------------------------------------------------------------
+;Rev Date Name Description
+;R01 17-04-2023 BAO Добавлена процедура INITDVC_RET_DRIVE и изменена INTDISK для поддержки рескана драйвов
+;---------------------------------------------------------------
+
+
; DISK DRIVER SPECIFICATION
+; !FIXIT некорректная!
;---------------------------------------------
; COMMAND 00h (INITIALIZATION)
;
@@ -107,28 +117,89 @@
; EX (SP),HL
; RET
-DSS_MAX_DRIVES_AMOUNT EQU 26
+;-----------------------------------------------------------
+; Просканировать систему на FDD/HDD девайсы и RAM-диски
+;-----------------------------------------------------------
+INITDVC: XOR A
+ LD (DRV_PAGE.LDRIVE),A ; сбр. ячейку
+ LD HL,DEVICE
+ LD (PDEVICE),HL ; восст. ячейку
+ ; Зачистка таблиц. Необязательно, но мало ли чё будет дальше... ;[ ]
+ LD HL,DEVICE
+ LD (HL),#FF
+ LD DE,DEVICE+1
+ LD BC,DEVICE.Size + LOGDRV.Size + RAMDTBL.Size - 1
+ LDIR
+ ; FDD девайсы
+ CALL FDD_DRV.Init ; узнать число FDD-девайсов
+ LD DE,FDD_DRV.API_TABLE ; адрес обработчика тек. девайса
+ CALL MAKEDVC ; иниц. таблицу переходов
+ ; IDE девайсы
+.if_old: CALL IDE_DRV.Init ; если на старте версия BIOS не подходит, то грузиться можно только с дискеты, для этого тут замена кода на XOR A : RET
+ LD DE,IDE_DRV.API_TABLE
+ CALL MAKEDVC
+ ; RAM-диски
+ CALL RAMDSK_DRV.Init
+ LD DE,RAMDSK_DRV.API_TABLE
+ CALL MAKEDVC
+ XOR A
+ RET
+
+; Инициировать таблицу переходов девайса.
+; вход: de=адрес обработчика девайса
+; a=число девайсов (0=нет)
+MAKEDVC: LD C,A
+ LD HL,DRV_PAGE.LDRIVE ; ячейка номера посл. диска
+ ADD A,(HL)
+ LD (HL),A
+ ;!TEST ;[ ] оптимизировать было лень
+ CP DSS_MAX_DRIVES_AMOUNT+1
+ JR C,1F
+ LD (HL),DSS_MAX_DRIVES_AMOUNT
+ SUB DSS_MAX_DRIVES_AMOUNT
+ NEG
+ ADD C
+ JP 2F
+ ;
+1: LD A,C
+ OR A
+ RET Z ; нет девайсов
+2: LD C,0 ; сбр.
+ LD HL,(PDEVICE) ; тек. полож. в таблице
+.loop: LD (HL),C ; номер лог.драйва этого устройства
+ INC HL
+ LD (HL),E ; de=адрес обработчика
+ INC HL
+ LD (HL),D
+ INC HL
+ INC C ; ++номер драйва
+ DEC A
+ JR NZ,.loop
+ LD (PDEVICE),HL
+ DEC A
+ LD (HL),A
+ RET
+
+
+;-------------------------------------------------
+; RST 18h. Вектор дисковых устройств
+; вход: a=номер устройства (0-25)
+;-------------------------------------------------
INTDISK:
- CP #FF
- JR NZ,.noNeedRescan
- CP C
- JR Z,INITDVC_RET_DRIVE
-
+ ;R01
+ CP #FF
+ JR NZ,.noNeedRescan
+ CP C
+ JR Z,ReScanDRV
+ ;
.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
+ PUSH BC
+ _CALC_DEVICE_ENTRY DEVICE
LD A,(HL)
- INC A
+ CP #FF
JR Z,NODEV
- DEC A
INC HL
LD C,(HL)
INC HL
@@ -137,16 +208,16 @@ INTDISK:
POP BC
EX (SP),HL
RET
-
-NODEV POP BC
+NODEV: POP BC
POP HL
- LD A,DSS_Error.drv.INVALID_DRIVE
+ LD A,BIOS.Error.BadNumber
SCF
RET
PDEVICE DW DEVICE
-DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT*3,#FF
-.End: DB #FF
+; DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT * .TBL_Entry,#FF
+; .Size: DB #FF
+; .TBL_Entry EQU 3
FLOPPY EQU #0001
FIXED EQU #0002
@@ -175,55 +246,24 @@ NETWORK EQU #0008
; 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
+ ;R01
+; INITDVC_RET_DRIVE:
+; CALL INITDVC
+; LD A,(DRV_PAGE.LDRIVE)
+; AND A
+; RET
+ ;
+
+
+
+////////////////////////////////////////////////////////////////////////
+// NEW RESCAN //
+////////////////////////////////////////////////////////////////////////
+ INCLUDE 'ReScanDRV.ASM'
+////////////////////////////////////////////////////////////////////////
-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
@@ -245,5 +285,4 @@ MAKEDVC LD C,A
; DW HDDRIVE ; HDD I
; DB #07
; DW HDDRIVE ; HDD J
-; DB #FF
-
+; DB #FF
\ No newline at end of file
diff --git a/DSS/drivers/media/ata_atapi-drv.asm b/DSS/drivers/media/ata_atapi-drv.asm
new file mode 100644
index 0000000..31c71f1
--- /dev/null
+++ b/DSS/drivers/media/ata_atapi-drv.asm
@@ -0,0 +1,1034 @@
+;!TODO привести к общему виду в одну инструкцию, проверить корректность
+;---------------------------------------------------------------
+;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
+;[]===========================================================[0]
+;Procedure: Initialization
+;
+;Function: Initialization device(s)
+;
+;Input: C = #00
+; IX = Environment
+;
+;Output: A = Amount drive support
+;[]===========================================================[0]
+
+;[]===========================================================[1]
+;Procedure: Open
+;
+;Function: Open disk
+;
+;Input: C = #01
+; A = Drive
+;
+;Output: None
+;[]===========================================================[1]
+
+;[]===========================================================[2]
+;Procedure: Close
+;
+;Function: Close disk
+;
+;Input: C = #02
+; A = Drive
+;
+;Output: None
+;[]===========================================================[2]
+
+;[]===========================================================[3]
+;Procedure: Media check
+;
+;Function: Checking change line
+;
+;Input: C = #03
+; A = Drive
+;
+;Output: A = #00 disk no changed
+; #FF disk changed
+;[]===========================================================[3]
+
+;[]===========================================================[4]
+;Procedure: Get BPB
+;
+;Function: Get Block Parameters BIOS
+;
+;Input: C = #04
+; A = Drive
+; DE = Address
+;
+;Output: None
+;[]===========================================================[4]
+
+;[]===========================================================[5]
+;Procedure: Read
+;
+;Function: Read from disk
+;
+;Input: C = #05
+; HL:IX = Logical Block (sector)
+; DE = Address
+; B = Sector count
+; A = Drive
+;
+;Output: None
+;[]===========================================================[5]
+
+;[]===========================================================[6]
+;Procedure: Write
+;
+;Function: Write to disk
+;
+;Input: C = #06
+; HL:IX = Logical Block (sector)
+; DE = Address
+; B = Sector count
+;
+;Output: None
+;[]===========================================================[6]
+
+;[]===========================================================[7]
+;Procedure: Removable
+;
+;Function: Checking change line
+;
+;Input: C = #07
+; A = Drive
+;
+;Output: A = #00 Removable
+; A = #FF Non-removable
+;[]===========================================================[7]
+
+;[]===========================================================[8]
+;Procedure: Generic IOCTL
+;
+;Function: Generic Input Output Control
+;
+;Input: C = #08
+; B = Subcommand
+; DE = #55AA Magic Number
+; A = Drive
+;
+;Subcommands: #00 - Get Device Parameters
+; #01 - Read track
+; #02 - Test track
+; #80 - Set Device Parameters
+; #81 - Write track
+; #82 - Format track
+;Output:
+;[]===========================================================[8]
+
+;[]===========================================================[9]
+;Procedure: Read Long
+;
+;Function: Reading sectors from disk
+;
+;Input: C = #0A
+; 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
+;[]===========================================================[9]
+
+;[]===========================================================[10]
+;Procedure: Write Long
+;
+;Function: Writing sectors to disk
+;
+;Input: C = #0B
+; 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]
+
+;
+; Errors:
+; 0 (#00) - NO ERRORS
+; 1 (#01) - BAD COMMAND
+; 2 (#02) - BAD DRIVE NUMBER
+; 3 (#03) - UNKNOW FORMAT
+; 4 (#04) - NOT READY
+; 5 (#05) - SEEK ERROR
+; 6 (#06) - SECTOR NOT FOUND
+; 7 (#07) - CRC ERROR
+; 8 (#08) - WRITE PROTECT
+; 9 (#09) - READ ERROR
+; 10 (#0A) - WRITE ERROR
+; 11 (#0B) - FAILURE
+; 12 (#0C) - BUSY (DEVICE OPENED)
+; 13 (#0D) - RESERVED
+
+; IDE0 EQU #0C1C0
+; IDE1 EQU #0C1C8
+
+ MODULE IDE_DRV
+
+
+
+PARTITION_BUFFER _sBOOT_SECTOR = #C000
+ATAPI_BUFFER _sCDFS_PRIMARY_VOLUME_DESCRIPTOR = #C000
+
+API_TABLE: INC C
+ DEC C
+ JP Z,Init ; [ ] ; c=0 Initialization
+ DEC C
+ JP Z,Open ; [ ] ; c=1 open
+ DEC C
+ JP Z,Close ; [ ] ; c=2 close
+ DEC C
+ JP Z,MediaCheck ; [ ] ; c=3 media check (смена носителя)
+ DEC C
+ JP Z,GetBPB ; [ ] ; c=4 get BPB
+ DEC C
+ JP Z,Read ; [ ] ; c=5 read (чтение секторов)
+ DEC C
+ JP Z,Write ; [ ] ; c=6 write (запись секторов)
+ DEC C
+ JP Z,Removable ; [ ] ; c=7 Removable
+ DEC C
+ JP Z,GenIOCTL ; [ ] ; c=8 узнать геометрию диска Generic IOCTL
+ DEC C
+ JP Z,.Reserved ; [ ] ; c=9 Reserved
+ DEC C
+ JP Z,ReadLong ; [ ] ; c=10 Read Long
+ DEC C
+ JP Z,WriteLong ; [ ] ; c=11 Write Long
+ ;
+.Reserved: LD A,BIOS.Error.InvalidSubFunction
+ SCF
+ RET
+
+
+////////////////////////////////////////////////////////////////////////
+// Commands for restart #18 //
+////////////////////////////////////////////////////////////////////////
+
+;--------------------------------------------------------------------[v]
+; c=0 Initialization
+Init: PUSH IY
+ ;!TEST ;[ ] для rescanDRV
+ XOR A
+ LD (.count),A
+ ;
+ LD HL,LOGDRV
+ LD (LOGDRV_OFFSET),HL
+
+ LD IX,SYS_PAGE.TMP_BUFFER
+ LD C,BIOS.DRV_LIST
+ RST ToBIOS
+ ; DRV_LIST:
+ ; +0 LEN
+ ; +1 FDD COUNT
+ ; +2 ATA COUNT
+ ; +3 ATAPI COUNT
+ ; +4 RESERVED (14)
+ ;
+ IN A,(SLOT3)
+ LD C,A
+ LD A,SYS_PAGE
+ OUT (SLOT3),A
+ LD A,(IX+3) ;количество ATAPI для процедуры NX_DVCI
+ AND A
+ PUSH AF
+ XOR A
+ LD B,(IX+2) ;количество ATA для процедуры NX_DVCI
+ CP B
+ LD A,C
+ OUT (SLOT3),A
+ JR Z,.NO_HARDS
+ LD C,DRIVE_CODES.SPRINTER.ATA
+ CALL .NX_DVCI
+ ;
+
+.NO_HARDS: POP AF
+ JR Z,.skip_atapi
+ ;
+ LD B,A
+ LD C,DRIVE_CODES.SPRINTER.ATAPI
+ CALL .NX_DVCI
+ ;
+.skip_atapi: POP IY
+.count+1: LD A,0
+ ;
+ AND A
+ RET
+ ;
+.NX_DVCI: PUSH BC
+ LD A,C
+ LD (CURRENT_DRIVE.Number),A
+ LD C,BIOS.DRV_DETECT ;[ ] media change переделать логику тут и в биос? ; !FIXIT
+ RST ToBIOS
+ CALL C,.check_error
+ CALL NC,DEFINE_PARTITIONS
+.skip: POP BC
+ INC C
+ JR C,.NX_DVCI
+ DJNZ .NX_DVCI
+ RET
+ ;
+.check_error: XOR BIOS.Error.BadNumber ; так надо
+ RET NZ
+ SCF
+ RET
+
+
+;---------------------------------------------------------------------[^]
+
+;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
+;+01 LONG SECTOR OFFSET
+;+05 LONG SIZE IN SECTORS
+;+09 BYTE PARTITION RECORD NUMBER (in drive MBR)
+;+10 WORD Sector Size
+;+12 BYTE Removable Media Byte flags
+;+13_15 FREE
+;
+
+
+; A - HDD LOG NUMBER
+SelectDrive.NoSector:
+ LD HL,0
+ LD IX,0
+ ;HL:IX - SECTOR
+ ; DE - ADDRESS
+ ; B - COUNTER
+ ; A - HDD LOG NUMBER
+SelectDrive: PUSH DE
+ PUSH HL
+ ;
+ LD L,A
+ ADD 0 - DSS_MAX_DRIVES_AMOUNT - 1
+ LD A,BIOS.Error.UnknownDevice
+ JR C,.error_pop
+ ;
+ LOGDRV_ENTRY_FIND LOGDRV
+ ;
+ POP HL
+ CALL .get_data
+ JR C,.error_pop2
+ ;
+ POP DE
+ LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER)
+ RET
+ ;
+.error_pop: POP HL
+.error_pop2: POP DE
+ RET
+ ;
+.get_data: ; [ ] custom sector size
+ CALL CHECK_IDE_SECTOR_SIZE
+ LD A,BIOS.Error.UnknownDevice
+ RET C
+ ;
+ LD E,(IY+LOGDRV.SECTOR_OFFSET)
+ LD D,(IY+LOGDRV.SECTOR_OFFSET+1)
+ ADD IX,DE
+ LD E,(IY+LOGDRV.SECTOR_OFFSET+2)
+ LD D,(IY+LOGDRV.SECTOR_OFFSET+3)
+ ADC HL,DE
+ LD A,BIOS.Error.SectorNotFound
+ RET
+
+
+
+; 00 - GET DEVICE PARAMETERS
+; 01 - READ TRACK
+; 02 - TEST TRACK
+; 80 - SET DEVICE PARAMETERS
+; 81 - WRITE TRACK
+; 82 - FORMAT TRACK
+GenIOCTL: BIT 7,B
+ JR NZ,.Set
+ INC B
+ DEC B
+ JR Z,GetParams
+ DEC B
+ JR Z,.error ;ReadTrack
+ DEC B
+ JR Z,TestTRK
+ LD A,BIOS.Error.InvalidSubFunction
+ SCF
+ RET
+ ;
+.Set: RES 7,B
+ INC B
+ DEC B
+ RET Z ;SetParams
+ DEC B
+ JR Z,.error ;WriteTrack
+ DEC B
+ JR Z,.error
+ LD A,BIOS.Error.InvalidSubFunction
+ SCF
+ RET
+ ;
+.error: LD A,BIOS.Error.Failure
+ SCF
+ RET
+
+;HL:IX - SECTOR
+; DE - ADDRESS
+; B - COUNTER
+; A - HDD LOG NUMBER
+;CHECK SECTOR
+TestTRK: LD C,BIOS.DRV_VERIFY
+ JP Exec_BIOS
+
+
+; HL:DE - SECTORS ON LOGICAL DISK
+; C - PARTITION RECORD NUMBER IN DRIVE MBR. if #FF - then not supported ;[x] 17.12.2023 загрузка с активного раздела, а не с первого
+; 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:
+; bit7 - reserved "1"
+; bit6 - ADDRESSING MODE LBA/CHS
+; bit5 - reserved "1"
+; bit4 - DEVICE MASTER/SLAVE
+; bit3 - reserved "0" (MAY BE OTHER)
+; bit2 - reserved "0" (MAY BE OTHER)
+; bit1 - reserved "0" (MAY BE OTHER)
+; bit0 - Primary/Secondary Chanel
+; B - ;[ ] sector size ;!TODO
+; 00 - undefined
+; 01 - 128 bytes
+; 02 - 256 bytes
+; 04 - 512 bytes
+; 08 - 1024 bytes
+; 16 - 2048 bytes
+; 32 - 4096 bytes
+; 64 - 8192 bytes
+; 128 - 16384 bytes
+GetParams: EX DE,HL
+ LD BC,#55AA
+ AND A
+ SBC HL,BC
+ LD L,A
+ LD A,BIOS.Error.Failure
+ SCF
+ RET NZ
+ ;
+ PUSH IX
+ PUSH IY
+ ;
+ LOGDRV_ENTRY_FIND LOGDRV
+ ;
+ LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
+ PUSH IY
+ LD C,BIOS.DRV_GET_PAR
+ RST ToBIOS
+ POP IY
+ JR C,.error
+ ;
+ ; CP BIOS.Error.BadNumber
+ ; SCF
+ ; JR Z,.error
+ ; LD A,BIOS.Error.NotReady
+ ; JR .error
+ ;
+ ; [ ] media change - убрать ;!FIXIT
+.next: EX AF,AF'
+ JR NC,.NoMediaChange
+ CP BIOS.Error.ATAPI.UnitAttention
+ JR Z,.ReDEFINE
+ ;SCF
+ ;JR NZ,.NoMediaChange
+ ;
+ PUSH HL
+ PUSH DE
+ AND A
+ LD DE,#FFFF
+ LD L,(IY+LOGDRV.SIZE_IN_SECTORS+0)
+ LD H,(IY+LOGDRV.SIZE_IN_SECTORS+1)
+ SBC HL,DE
+ JR NZ,.ReDEFINE_SP
+ ;
+ LD L,(IY+LOGDRV.SIZE_IN_SECTORS+2)
+ LD H,(IY+LOGDRV.SIZE_IN_SECTORS+3)
+ SBC HL,DE
+ JR Z,.ReDEFINE_Skip
+ ;
+ ;
+.ReDEFINE: PUSH HL
+ PUSH DE
+.ReDEFINE_SP: PUSH IX
+ PUSH IY
+ PUSH BC
+ CALL ReDEFINE_PARTITIONS
+ POP BC
+ POP IY
+ POP IX
+.ReDEFINE_Skip: POP DE
+ POP HL
+ ;
+.NoMediaChange: ; перетасовка регистров с результатом от BIOS
+ EX DE,HL
+ LD C,E
+ LD E,D
+ LD D,0
+ LD A,B
+ LD B,D
+ EXX
+ ;[ ] 04/01/2025 возвращение размера сектора
+ EX AF,AF'
+ LD A,XH
+ LD E,XL
+ RL E
+ RLA
+ ;
+ ; SECTORS ON LOGICAL DISK
+ LD E,(IY+LOGDRV.SIZE_IN_SECTORS+0)
+ LD D,(IY+LOGDRV.SIZE_IN_SECTORS+1)
+ LD L,(IY+LOGDRV.SIZE_IN_SECTORS+2)
+ LD H,(IY+LOGDRV.SIZE_IN_SECTORS+3)
+ ;
+ ;[x] 17.12.2023 загрузка с активного раздела, а не с первого
+ LD C,(IY+LOGDRV.PARTITION_RECORD_NUM) ; номер партиции в MBR диска
+ ;
+ ;[ ] 04/01/2025 возвращение размера сектора
+ ; 00 - undefined
+ ; 01 - 128 bytes
+ ; 02 - 256 bytes
+ ; 04 - 512 bytes
+ ; 08 - 1024 bytes
+ ; 16 - 2048 bytes
+ ; 32 - 4096 bytes
+ ; 64 - 8192 bytes
+ ; 128 - 16384 bytes
+ ;EX AF,AF'
+ LD B,A
+ ;
+ LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
+ EX AF,AF'
+ ;
+ AND A
+.error: POP IY
+ POP IX
+ RET
+ ;
+
+
+Removable: XOR A
+ INC A
+ RET
+
+
+
+
+Close: XOR A
+ RET
+
+
+;!TODO пока Open ничего не делает кроме проверки MediaCheck
+Open: CALL MediaCheck
+ RET Z
+ RET C
+ ;!TODO ???
+ ;CALL READ_PARTITION_PARAMETERS
+ ;
+ INC A
+ RET NZ
+ LD A,BIOS.Error.ATAPI.UnitAttention
+ SCF
+ RET
+;
+
+
+;[ ] media changed - bios 5x DETECT
+MediaCheck: PUSH IY
+ CALL SelectDrive.NoSector
+ JR NC,.next_step
+ ;
+ CP BIOS.Error.UnknownDevice
+ JR NZ,.exit
+ ; A != 0
+ AND A ; сброс ZF
+ SCF
+ ; [ ] media changed
+.next_step: PUSH AF ; Сохраняем CF и код ошибки UNKNOWN_FORMAT, если CF=1
+ LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER)
+ LD C,BIOS.DRV_GET_PAR ;[ ] media change переделать логику тут и в биос? ; !FIXIT
+ PUSH IY
+ RST ToBIOS
+ POP IY
+ EX AF,AF'
+ JR NC,.next_check
+ ;
+ CP BIOS.Error.ATAPI.UnitAttention
+ JR Z,.Reinit
+ POP BC ; Баланс стека
+.exit: SCF
+ POP IY
+ RET
+ ;
+.next_check: BIT 1,(IY + LOGDRV.MediaParameters)
+ JR NZ,.Reinit
+ ;
+ POP AF ; Восстанавливаем CF и код ошибки UNKNOWN_FORMAT, если CF=1
+ POP IY
+ RET C
+ XOR A
+ RET
+ ;
+.Reinit: PUSH IY
+ CALL ReDEFINE_PARTITIONS
+ POP IY
+ POP AF ; Восстанавливаем CF и код ошибки UNKNOWN_FORMAT, если CF=1
+ CALL C,SelectDrive.get_data
+ POP IY
+ JR NC,.no_errors
+ ;
+ CP BIOS.Error.UnknownDevice
+ JR NZ,.no_errors
+ AND A ; сброс ZF
+ SCF
+ RET
+ ;
+.no_errors: LD A,#FF ;!HARDCODE drive changed
+ OR A
+ RET
+
+
+; [ ] custorm sector size
+CHECK_IDE_SECTOR_SIZE: ;RET
+ LD E,(IY+LOGDRV.SECTOR_SIZE)
+ LD D,(IY+LOGDRV.SECTOR_SIZE+1)
+ PUSH HL
+ LD HL,-DSS_MAX_SECTOR_SIZE - 1
+ ADD HL,DE
+ POP HL
+ RET
+;
+
+ReDEFINE_PARTITIONS:
+ EX AF,AF'
+ LD B,A ; HDD_INIT_TABLE.RemovableMedia
+ LD A,DSS_MAX_DRIVES_AMOUNT - 1 ; ограничитель, чтоб не детектить больше 1 раздела
+ LD (Init.count),A
+ LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER)
+ LD (CURRENT_DRIVE.Number),A
+ LD (LOGDRV_OFFSET),IY
+ ;RES 1,(IY + LOGDRV.MediaParameters) - сбрасывается в DEFINE_PARTITIONS
+ ;LD B,%0000'0011 ;!HARDCODE drive changed, removable media
+ JP DEFINE_PARTITIONS
+
+
+;HL:IX - SECTOR
+; DE - ADDRESS
+; B - COUNTER
+; A - HDD LOG NUMBER
+;READ SECTOR
+
+; DE - ADDRESS
+; A - DRIVE
+GetBPB: ; !FIXIT выбирать значения исходя из типа драйва или ещё чего-нибудь
+ LD HL,0
+ LD IX,0
+ LD B,1
+ JR Read
+
+
+;HL:IX - SECTOR
+; DE - ADDRESS
+; B - COUNTER
+; A'- PAGE
+; A - HDD LOG NUMBER
+;READ SECTOR
+ReadLong: LD C,BIOS.DRV_READ_LONG
+ JP Exec_BIOS
+
+;!FIXIT debug zip
+;HL:IX - SECTOR
+; DE - ADDRESS
+; B - COUNTER
+; A'- PAGE
+; A - HDD LOG NUMBER
+;WRITE SECTOR
+; WriteLong: LD C,BIOS.DRV_WRITE_LONG
+; JP Exec_BIOS
+WriteLong: LD C,BIOS.DRV_WRITE_LONG
+ JP Exec_BIOS
+
+;!FIXIT debug zip
+;HL:IX - SECTOR
+; DE - ADDRESS
+; B - COUNTER
+; A - HDD LOG NUMBER
+;WRITE SECTOR
+Write: LD C,BIOS.DRV_WRITE
+ JP Exec_BIOS
+; Write: LD C,BIOS.DRV_WRITE
+; .loop: PUSH HL
+; PUSH IX
+; PUSH DE
+; PUSH BC
+; PUSH AF
+; CALL Exec_BIOS
+; JR NC,.good
+; JR Z,.good
+; ;
+; POP AF
+; POP BC
+; POP DE
+; POP IX
+; POP HL
+; JR .loop
+; ;
+; .good: EXX
+; POP DE
+; POP DE
+; POP DE
+; POP DE
+; POP DE
+; EXX
+; RET
+
+
+;HL:IX - SECTOR
+; DE - ADDRESS
+; B - COUNTER
+; A - HDD LOG NUMBER
+;READ SECTOR
+Read: LD C,BIOS.DRV_READ
+ ;
+Exec_BIOS: PUSH IY
+ CALL .exec
+ POP IY
+ RET
+ ;
+.exec: CALL SelectDrive
+ RET C ;!FIXIT переделать номер ошибки с драйвера на дос
+ PUSH IY
+ RST ToBIOS
+ POP IY
+ RET NC
+ CP BIOS.Error.ATAPI.UnitAttention
+ SCF
+ RET NZ
+ SET 1,(IY + LOGDRV.MediaParameters)
+ RET
+ ;
+
+;------------------------------[ PARTIT ]------------------------------;
+; вход: B - bit0=1 removable, bit1=1 drive changed, bit7..2 reserved
+DEFINE_PARTITIONS:
+ IN A,(SLOT3)
+ PUSH AF
+ LD A,SHARED_PAGE
+ OUT (SLOT3),A
+ LD A,(Init.count) ; [ ] for ZIP disk A:
+ PUSH AF ; [ ] for ZIP disk A:
+ CALL .Start
+ ; [ ] for ZIP disk A:
+ LD A,(Init.count)
+ LD B,A
+ POP AF
+ CP B
+ CALL Z,.Check_0_BPB
+ ;
+ POP AF
+ OUT (SLOT3),A
+ RET
+ ;
+.FAT32_DOS:
+.EASYDOS:
+.MEDIDOS:
+.HIGHDOS:
+ LD E,(IY + BOOT_SECTOR.Partition.Start_LBA + 0)
+ LD D,(IY + BOOT_SECTOR.Partition.Start_LBA + 1)
+ LD L,(IY + BOOT_SECTOR.Partition.Start_LBA + 2)
+ LD H,(IY + BOOT_SECTOR.Partition.Start_LBA + 3)
+ LD IX,(CURRENT_SECTOR.Low)
+ ADD IX,DE
+ LD DE,(CURRENT_SECTOR.High)
+ ADC HL,DE
+ LD D,XH
+ LD E,XL
+ ;BPB SECTOR
+ LD IX,(LOGDRV_OFFSET)
+ LD (IX + LOGDRV.SECTOR_OFFSET + 0),E
+ LD (IX + LOGDRV.SECTOR_OFFSET + 1),D
+ LD (IX + LOGDRV.SECTOR_OFFSET + 2),L
+ LD (IX + LOGDRV.SECTOR_OFFSET + 3),H
+ LD E,(IY + BOOT_SECTOR.Partition.Size_LBA + 0)
+ LD D,(IY + BOOT_SECTOR.Partition.Size_LBA + 1)
+ LD L,(IY + BOOT_SECTOR.Partition.Size_LBA + 2)
+ LD H,(IY + BOOT_SECTOR.Partition.Size_LBA + 3)
+ ;SIZE DISK
+ LD (IX + LOGDRV.SIZE_IN_SECTORS + 0),E
+ LD (IX + LOGDRV.SIZE_IN_SECTORS + 1),D
+ LD (IX + LOGDRV.SIZE_IN_SECTORS + 2),L
+ LD (IX + LOGDRV.SIZE_IN_SECTORS + 3),H
+ ; [ ] sector size
+ CALL GetSectorSize
+ LD IX,(LOGDRV_OFFSET)
+ LD (IX + LOGDRV.SECTOR_SIZE),C
+ LD (IX + LOGDRV.SECTOR_SIZE + 1),B
+ LD A,(CURRENT_DRIVE.Removable)
+ LD (IX + LOGDRV.MediaParameters),A
+ ;[x] 17.12.2023 загрузка с активного раздела, а не с первого
+.ExtendedPartitionFlag+1:
+ LD A,0
+ OR A ; !TODO загрузка с расширенного раздела не поддерживается
+ LD A,#FF
+ JR NZ,.not_supported ; если расширенный раздел, то облом
+ ;
+ POP BC
+ PUSH BC
+ LD A,+(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; Number of entries in the partition table
+ SUB B
+.not_supported: LD (IX + LOGDRV.PARTITION_RECORD_NUM),A
+ ;
+ CALL INC_DRV_COUNT
+ RET NC
+ ;
+ CALL .set_drv_tbl
+ JP .NextPartition
+ ;
+.NotExtended: CP PartitionSysTypes.FAT16
+ JR Z,.HIGHDOS
+ CP PartitionSysTypes.FAT16_LBA
+ JP Z,.HIGHDOS
+ CP PartitionSysTypes.FAT16_32Mb
+ JP Z,.MEDIDOS
+ CP PartitionSysTypes.FAT12
+ JP Z,.EASYDOS
+ ;[ ] fat32
+ CP PartitionSysTypes.FAT32
+ JP Z,.FAT32_DOS
+ CP PartitionSysTypes.FAT32_LBA
+ JP Z,.FAT32_DOS
+ ;
+ CP PartitionSysTypes.Win_Ext_LBA
+ JP Z,.SubLevel
+ JP .NextPartition ; раздел не поддерживается
+ ;
+.set_drv_tbl: LD A,(CURRENT_DRIVE.Number)
+ LD (IX + LOGDRV.PHISICAL_DRV_NUMBER),A
+ LD DE,LOGDRV.TBL_Entry ;DSKITEM
+ ADD IX,DE
+ LD (LOGDRV_OFFSET),IX
+ RET
+ ;
+.CDFS_TST: ;JR .check_atapi ;!FIXIT CDFS
+ ;SCF
+ ;RET
+.check_atapi: LD A,(CURRENT_DRIVE.Number)
+ ;LD B,A
+ AND #F0
+ CP DRIVE_CODES.SPRINTER.ATAPI
+ SCF
+ ;RET NZ
+ PUSH AF
+ ;
+ CALL GetSectorSize
+ CALL .set_LOGDRV
+ POP AF
+ RET NZ ; результат CP DRIVE_CODES.SPRINTER.ATAPI
+ ; для правильного выхода из парсера разделов
+ LD B,1
+ PUSH BC
+ ;загрузка с активного раздела, а не с первого
+ LD A,#FF ; для пропуска .tst_zipNoMBR и записи в LOGDRV.PARTITION_RECORD_NUM
+ LD (CURRENT_SECTOR.Low),A
+ JP .not_supported
+ ;
+.set_LOGDRV: ;BPB SECTOR ;!TODO если CD-ROM, то другой номер сектора
+ LD IX,(LOGDRV_OFFSET)
+ LD A,(CURRENT_DRIVE.Removable)
+ LD (IX + LOGDRV.MediaParameters),A
+ XOR A
+ LD (IX + LOGDRV.SECTOR_OFFSET + 0),A
+ LD (IX + LOGDRV.SECTOR_OFFSET + 1),A
+ LD (IX + LOGDRV.SECTOR_OFFSET + 2),A
+ LD (IX + LOGDRV.SECTOR_OFFSET + 3),A
+ ; [ ] SIZE DISK
+ LD (IX + LOGDRV.SIZE_IN_SECTORS + 0),E
+ LD (IX + LOGDRV.SIZE_IN_SECTORS + 1),D
+ LD (IX + LOGDRV.SIZE_IN_SECTORS + 2),L
+ LD (IX + LOGDRV.SIZE_IN_SECTORS + 3),H
+ ; [ ] sector size
+ LD (IX + LOGDRV.SECTOR_SIZE),C
+ LD (IX + LOGDRV.SECTOR_SIZE + 1),B
+ RET
+ ;
+; вход: B - bit0=1 removable, bit1=1 drive changed, bit7..2 reserved
+.Start: LD IX,0
+ LD DE,0
+ LD A,B
+ AND %1111'1101
+ LD (CURRENT_DRIVE.Removable),A
+ LD (EXT_Partition.Low),DE ;R01
+ LD (EXT_Partition.High),DE ;R01
+ ;
+.LOOP: LD (CURRENT_SECTOR.Low),DE
+ LD (CURRENT_SECTOR.High),IX
+ CALL .LOAD_SECTOR
+ JR C,.check_atapi
+ ;
+.check_sign: LD HL,(PARTITION_BUFFER.MBR_SIGNATURE)
+ LD DE,#AA55
+ AND A
+ SBC HL,DE
+ ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов
+ ;JR NZ,NODEFIN
+
+ ; [ ] CDFS
+ JR NZ,.CDFS_TST
+ ;SCF
+ ;RET NZ
+ ;
+ ; [ ] если ATAPI, то пробуем прочесть 0 сектор как-будто нет MBR
+ ;LD A,(CURRENT_DRIVE.Number)
+ ;CP DRIVE_CODES.SPRINTER.CDROM
+
+ ;
+ LD IY,PARTITION_BUFFER.PARTITION_TABLE ; Offset of partition table in the MBR
+ LD B,+(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; Number of entries in the partition table
+.DOSAGA: PUSH BC
+ LD A,(IY+_sMBR_PARTITION_RECORD.FS_ID)
+ CP PartitionSysTypes.Extended
+ JR Z,.SubLevel
+ CP PartitionSysTypes.Win_Ext_LBA
+ JP NZ,.NotExtended
+ ;
+.SubLevel: PUSH IY
+ LD DE,(CURRENT_SECTOR.Low)
+ LD IX,(CURRENT_SECTOR.High)
+ PUSH DE
+ PUSH IX
+ ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов
+ LD A,(.ExtendedPartitionFlag)
+ INC A
+ LD (.ExtendedPartitionFlag),A ; !TODO загрузка с расширенного раздела не поддерживается
+ ;
+ CALL .ParseExtended
+ ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов
+ LD A,(.ExtendedPartitionFlag)
+ DEC A
+ LD (.ExtendedPartitionFlag),A ; !TODO загрузка с расширенного раздела не поддерживается
+ ;
+ POP IX
+ POP DE
+ LD (CURRENT_SECTOR.Low),DE
+ LD (CURRENT_SECTOR.High),IX
+ CALL .LOAD_SECTOR
+ POP IY
+.NextPartition: LD DE,_sMBR_PARTITION_RECORD ;Size of a partition table entry
+ ADD IY,DE
+ POP BC
+ DJNZ .DOSAGA
+.exit: AND A
+ RET
+ ;
+.ParseExtended: LD HL,(EXT_Partition.Low)
+ LD DE,(EXT_Partition.High)
+ LD A,L
+ OR H
+ OR E
+ OR D
+ LD E,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 0)
+ LD D,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 1)
+ LD L,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 2)
+ LD H,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 3)
+ JP NZ,.ext_in_ext
+ LD (EXT_Partition.Low),DE
+ LD (EXT_Partition.High),HL
+ PUSH DE
+ JR .set_regs
+ ;
+.ext_in_ext: LD IX,(EXT_Partition.Low)
+ ADD IX,DE
+ LD DE,(EXT_Partition.High)
+ ADC HL,DE
+ PUSH IX
+.set_regs: PUSH HL
+ POP IX
+ POP DE
+ JP .LOOP
+ ;
+.LOAD_SECTOR: PUSH IY
+ LD IX,(CURRENT_SECTOR.Low)
+ LD HL,(CURRENT_SECTOR.High)
+ LD DE,PARTITION_BUFFER
+ LD A,(CURRENT_DRIVE.Number)
+ LD BC,1*256 + BIOS.DRV_READ
+ RST ToBIOS
+ POP IY
+ RET
+ ;
+.Check_0_BPB: LD A,(CURRENT_DRIVE.Number)
+ CP DRIVE_CODES.SPRINTER.ATAPI
+ RET C
+ LD C,BIOS.DRV_GET_PAR
+ RST ToBIOS
+ RET C
+ ;
+ LD B,XH
+ LD C,XL
+ CALL .set_LOGDRV
+ LD A,(CURRENT_DRIVE.Removable)
+ LD (IX + LOGDRV.MediaParameters),A
+ LD (IX + LOGDRV.PARTITION_RECORD_NUM),#FF
+ CALL .set_drv_tbl
+ JP INC_DRV_COUNT
+ ;
+; ; ;
+
+GetSectorSize: PUSH IY
+ LD A,(CURRENT_DRIVE.Number)
+ ; sector size
+ LD C,BIOS.DRV_GET_PAR ; [ ] media change заменить на drv_detect ?
+ RST ToBIOS
+ JR NC,.no_err
+ ;
+ LD IX,#FFFF
+.no_err: LD B,XH
+ LD C,XL
+ POP IY
+ RET
+;----------------------------------------------------------------------;
+;
+
+;!TEST Подстраховка от переполнения таблицы LOGDRV
+INC_DRV_COUNT: LD A,(Init.count)
+ INC A
+ CP DSS_MAX_DRIVES_AMOUNT+1
+ RET NC
+ LD (Init.count),A
+ RET
+
+;=======================================================================
+
+;=======================================================================
+; PHISICAL DRIVE NUMBER
+; #80/#81 - primary мастер/слейв, #82/#83 - secondary мастер/слейв
+CURRENT_DRIVE:
+.Number: DB #00
+.Removable: DB #00
+;
+CURRENT_SECTOR:
+.Low: DW #0000
+.High: DW #0000
+;
+EXT_Partition: ;CURRENT PARTITION TABLE
+.Low: DW #0000
+.High: DW #0000
+;
+LOGDRV_OFFSET: DW LOGDRV ;POINTER ON CURRENT DISK RECORD
+;=======================================================================
+
+ ENDMODULE
\ No newline at end of file
diff --git a/DSS/drivers/media/fdd-drv.asm b/DSS/drivers/media/fdd-drv.asm
new file mode 100644
index 0000000..db7cb0a
--- /dev/null
+++ b/DSS/drivers/media/fdd-drv.asm
@@ -0,0 +1,426 @@
+
+; Disk Driver Specification ver. 2.00
+;[]===========================================================[0]
+;Procedure : Initialization
+;
+;Function : Initialization device(s)
+;
+;Input : C = 00h
+; IX - Environment
+;Output : A = Amount drive support
+; HL = Size driver
+;[]===========================================================[]
+;[]===========================================================[1]
+;Procedure : Open
+;
+;Function : Open disk
+;
+;Input : C = 01h
+; A - Drive
+;Output : None
+;
+;[]===========================================================[]
+;[]===========================================================[2]
+;Procedure : Close
+;
+;Function : Close disk
+;
+;Input : C = 02h
+; A - Drive
+;Output : None
+;
+;[]===========================================================[]
+;[]===========================================================[3]
+;Procedure : Media check
+;
+;Function : Checking change line
+;
+;Input : C = 03h
+; A - Drive
+;Output : A = 00h disk no changed
+; A = 0FFh disk changed
+;
+;[]===========================================================[]
+;[]===========================================================[4]
+;Procedure : Get BPB
+;
+;Function : Get Block Parameters BIOS
+;
+;Input : C = 04h
+; DE - Address
+;Output : None
+;
+;[]===========================================================[]
+;[]===========================================================[5]
+;Procedure : Input
+;
+;Function : Input from disk
+;
+;Input : C = 05h
+; HL:IX - Logical Block (sector)
+; DE - Address
+; B - Sector count
+;Output : None
+;
+;[]===========================================================[]
+;[]===========================================================[6]
+;Procedure : Output
+;
+;Function : Output to disk
+;
+;Input : C = 06h
+; HL:IX - Logical Block (sector)
+; DE - Address
+; B - Sector count
+;Output : None
+;
+;[]===========================================================[]
+;[]===========================================================[7]
+;Procedure : Removable
+;
+;Function : Checking change line
+;
+;Input : C = 07h
+; A - Drive
+;Output : A = 00h Removable
+; A = FFh Nonremovable
+;
+;[]===========================================================[]
+;[]===========================================================[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 :
+;
+;[]===========================================================[]
+;
+; 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
+
+
+
+////////////////////////////////////////////////////////////////////////
+ MODULE FDD_DRV
+////////////////////////////////////////////////////////////////////////
+
+
+
+;-------------------------------------------------
+; Обработчик FDD (rst 18h)
+;-------------------------------------------------
+API_TABLE: INC C
+ DEC C
+ JP Z,Init ;#00 Init
+ DEC C
+ JP Z,Open ;#01 Open
+ DEC C
+ JP Z,Close ;#02 Close
+ DEC C
+ JP Z,MediaCheck ;#03 MediaCheck
+ DEC C
+ JP Z,GetBPB ;#04 GetBPB
+ DEC C
+ JP Z,Read ;#05 Read
+ DEC C
+ JP Z,Write ;#06 Write
+ DEC C
+ JP Z,Removable ;#07 Removable
+ DEC C
+ JP Z,GenIOCTL ;#08 GenIOCTL
+ DEC C
+ JP Z,Reserved ;#09
+ ;
+Reserved: LD A,BIOS.Error.InvalidSubFunction
+ SCF
+ RET
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;Commands for restart #18 ;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;
+Init: LD A,2 ;количество FDD в компе
+ AND A
+ RET
+; ; ;
+
+;
+Open: PUSH AF
+ LD C,BIOS.DRV_RESET
+ RST ToBIOS
+ POP BC
+ RET C
+ ;
+ LD A,B
+ LD C,BIOS.DRV_GET_PAR
+ RST ToBIOS
+ LD DE,-DSS_MAX_SECTOR_SIZE - 1 ; [ ] 15/04/25 не будет читать сектор больше DSS_MAX_SECTOR_SIZE
+ ; ZF = 0
+ LD A,BIOS.Error.UnknownDevice
+ OR A ; убираем ZF, если есть
+ ;
+ ADD IX,DE ; если размер сектора больше, то облом
+ RET
+; ; ;
+
+;
+Close: XOR A
+ RET
+; ; ;
+
+
+;!FIXIT проверять ВГ93 когда (если) это станет возможным
+MediaCheck: CALL Open
+ RET C
+ IF NON_REMOVABLE_FDD
+ XOR A
+ ELSE
+ LD A,#FF
+ OR A
+ ENDIF
+ RET
+; ; ;
+
+
+;DE - ADDRESS
+GetBPB: LD IX,0
+ LD HL,0
+ PUSH DE
+ PUSH AF
+ LD BC,1*256 + BIOS.DRV_READ
+ RST ToBIOS
+ POP DE
+ POP HL
+ RET C
+ LD BC,BOOT_SECTOR.SectorsPerTrack
+ ADD HL,BC
+ LD E,(HL)
+ PUSH DE
+ LD A,D
+ LD C,BIOS.DRV_GET_PAR
+ RST ToBIOS
+ LD A,H
+ POP HL
+ PUSH HL
+ LD H,A
+ POP AF
+ LD C,BIOS.DRV_SET_PAR
+ RST ToBIOS
+ XOR A
+ RET
+; ; ;
+
+
+; !TODO read track?
+;READTR: XOR A
+; RET
+; ; ;
+
+
+Read: LD C,BIOS.DRV_READ
+ RST ToBIOS
+ RET
+; ; ;
+
+
+Write: LD C,BIOS.DRV_WRITE
+ RST ToBIOS
+ RET
+; ; ;
+
+
+; 00 - GET DEVICE PARAMETERS
+; 01 - READ TRACK
+; 02 - TEST TRACK
+; 80 - SET DEVICE PARAMETERS
+; 81 - WRITE TRACK
+; 82 - FORMAT TRACK
+GenIOCTL: BIT 7,B
+ JR NZ,.O_CTL_F
+ INC B
+ DEC B
+ JP Z,.GetParams
+ ;!TODO
+ ;DEC B
+ ;JP Z,.ReadTrack
+ ;DEC B
+ ;JP Z,.TestTRK
+ ;
+ LD A,BIOS.Error.InvalidSubFunction
+ SCF
+ RET
+ ;
+.O_CTL_F: RES 7,B
+ INC B
+ DEC B
+ JP Z,.SetParams
+ ;!TODO
+ ;DEC B
+ ;JP Z,.WriteTRK
+ ;DEC B
+ ;JP Z,.FormatTRK
+ ;
+ LD A,BIOS.Error.InvalidSubFunction
+ SCF
+ RET
+; ; ;
+
+
+; Вход: - A - Drive number
+; Выход:
+; HL:DE - SECTORS ON LOGICAL DISK
+; C - PARTITION RECORD NUMBER IN DRIVE MBR. 0 for fdd ;[x] 17.12.2023 загрузка с активного раздела, а не с первого
+; HL' - CYLINDERS ON PHISICAL DISK
+; DE' - HEADS ON PHISICAL DISK
+; BC' - SECTORS PER TRACK ON PHISICAL DISK
+; A' - PHISICAL DRIVE NUMBER
+; A - EXTENDED INFORMATION
+; D7 - "1" RESERVED
+; D6 - ADDRESSING MODE LBA/CHS
+; D5 - "1" RESERVED
+; D4 - DEVICE MASTER/SLAVE
+; D1..D3 - "0" RESERVED (MAY BE OTHER)
+.GetParams: EX DE,HL
+ LD BC,#55AA
+ AND #0F
+ SBC HL,BC
+ JR Z,.next
+ ;
+ LD A,BIOS.Error.Failure
+ SCF
+ RET
+ ;
+.next: PUSH AF
+ LD C,BIOS.DRV_GET_PAR
+ RST ToBIOS
+ JR C,.NONE_FDD
+ PUSH HL
+ PUSH DE
+ LD A,H
+ LD H,0
+ ;
+.mull_loop1: ADD HL,HL
+ DEC A
+ JR NZ,.mull_loop1
+ ;
+ ; HL - SECTOR PER CYLLINDER
+ ; A=0 ZF=0 CF=0
+ LD B,H
+ LD C,L
+ ;LD HL,0
+ ;XOR A
+ LD H,A
+ LD L,A
+ EX AF,AF'
+ ;
+.mull_loop2: EX AF,AF'
+ ADD HL,BC
+ ADC A,0
+ DEC DE
+ EX AF,AF'
+ LD A,D
+ OR E
+ JR NZ,.mull_loop2
+ ;
+ ; A=0 DE=0 ZF=0 CF=0
+ EX AF,AF'
+ LD E,A
+ EX DE,HL
+ ; H=0
+ LD C,H ;[x] 17.12.2023 загрузка с активного раздела, а не с первого
+ EXX
+ POP DE
+ POP HL
+ POP AF
+ EX AF,AF'
+ ; A=0 ZF=0 CF=0
+ LD B,0
+ LD C,L
+ LD L,H
+ LD H,B
+ EX DE,HL
+ EXX
+ AND A
+ RET
+ ;
+.NONE_FDD: POP BC
+ LD A,BIOS.Error.BadNumber
+ ; CF=1
+ 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
+.SetParams: PUSH AF
+ EXX
+ EX DE,HL
+ LD H,L
+ LD L,C
+ POP AF
+ AND #0F
+ PUSH AF
+ PUSH HL
+ PUSH DE
+ LD C,BIOS.DRV_GET_PAR
+ RST ToBIOS
+ POP DE
+ POP HL
+ JR C,.NONE_FDD
+ POP AF
+ LD C,BIOS.DRV_SET_PAR
+ JP ToBIOS
+; ; ;
+
+
+Removable: XOR A
+ INC A
+ RET
+; ; ;
+
+;==============================================
+
+ ENDMODULE ; FDD_DRV
+
+////////////////////////////////////////////////////////////////////////
\ No newline at end of file
diff --git a/DSS/drivers/media/ram_disk-drv.asm b/DSS/drivers/media/ram_disk-drv.asm
new file mode 100644
index 0000000..3687f03
--- /dev/null
+++ b/DSS/drivers/media/ram_disk-drv.asm
@@ -0,0 +1,533 @@
+
+
+; 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: ;!FIXIT неправильные значения
+; 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 CALL GET_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
+
+ MODULE RAMDSK_DRV
+
+; parser
+API_TABLE: INC C
+ DEC C
+ JP Z,Init ; 0
+ DEC C
+ JR Z,Open ; 1
+ DEC C
+ JR Z,Close ; 2
+ DEC C
+ JR Z,MediaCheck ; 3
+ DEC C
+ JR Z,GetBPB ; 4
+ DEC C
+ JR Z,Read ; 5
+ DEC C
+ JR Z,Write ; 6
+ DEC C
+ JR Z,Removable ; 7
+ DEC C
+ JP Z,GenIOCTL ; 8
+ DEC C
+ JP Z,.error ; 9 RESR_H
+ DEC C
+ JP Z,ReadLong ; 10
+ DEC C
+ JP Z,WriteLong ; 11
+ ;
+.error: LD A,BIOS.Error.InvalidSubFunction
+ SCF
+ RET
+
+;
+Removable:
+Open:
+Close: XOR A
+ RET
+;
+
+;!FIXIT сделать в SYS_PAGE для рамдисков переменные и брать оттуда значение
+ ;!FIXIT как-то определять смену RMD?
+ ; [x] 18/08/2024 пока немного костыльно и опасно
+MediaCheck: ;LD A,#FF
+ ;AND A
+ XOR A
+ ;
+ RET
+
+;DE - ADDRESS
+GetBPB: LD IX,0
+ LD HL,0
+ LD B,#01
+ ;JP READ_RD
+;READ SECTORS
+; HL:IX - SECTOR
+; DE - ADDRESS
+; B - COUNT
+; A - DRIVE
+Read: PUSH BC
+ CALL GET_RAMDRV_NUM
+ POP BC
+ LD C,BIOS.DRV_READ
+ JP ToBIOS
+ ; RST ToBIOS
+ ; XOR A
+ ; RET
+ReadLong: PUSH BC
+ CALL GET_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: PUSH BC
+ CALL GET_RAMDRV_NUM
+ POP BC
+ LD C,BIOS.DRV_WRITE
+ JP ToBIOS
+ ; RST ToBIOS
+ ; XOR A
+ ; RET
+
+WriteLong: PUSH BC
+ CALL GET_RAMDRV_NUM
+ POP BC
+ LD C,BIOS.DRV_WRITE_LONG
+ JP ToBIOS
+ ; RST ToBIOS
+ ; XOR A
+ ; RET
+
+;
+;;
+;;;
+;----------------------------------------------------------------------;!TEST
+; ;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 ; Получение идентификатора блока, назначенного на 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 / RAMDTBL.TBL_Entry
+; CP B
+; JR NZ,.initLoop
+
+; LD HL,RAMDTBL ;!FIXIT LD HL,-RAMDTBL
+; EX DE,HL
+; AND A ;!FIXIT ----
+; SBC HL,DE ;!FIXIT ADD HL,DE
+; SRL L
+; LD A,L
+; ; LD HL,ENDDRVR
+; AND A
+; RET
+;----------------------------------------------------------------------;!TEST
+;;;
+;;
+;
+
+;
+;;
+;;;
+;----------------------------------------------------------------------;!TEST
+;S_P_P DB #00
+Init:
+; .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 ; Получение идентификатора блока, назначенного на RAM-Disk
+ LD DE,RAMDTBL
+.initLoop: PUSH BC
+ LD A,B
+ PUSH DE
+ RST ToBIOS
+ POP DE
+ OR A
+ JR Z,.noDRV
+ ;
+ INC DE
+ LD (DE),A
+ DEC DE
+ ;
+ POP BC
+ LD A,B
+ LD (DE),A
+ INC DE
+ INC DE
+ JP .skip_pop
+ ;
+.noDRV: POP BC
+.skip_pop: INC B
+ LD A,RAMDTBL.Size/RAMDTBL.TBL_Entry
+ CP B
+ JR NZ,.initLoop
+
+ LD HL,RAMDTBL ;!FIXIT LD HL,-RAMDTBL
+ EX DE,HL
+ AND A ;!FIXIT ----
+ SBC HL,DE ;!FIXIT ADD HL,DE
+ SRL L
+ LD A,L
+ ; LD HL,ENDDRVR
+ AND A
+ RET
+;----------------------------------------------------------------------;!TEST
+;;;
+;;
+;
+
+; ;
+; ; ТАБЛИЦА СООТВЕТСТВИЯ МЕЖДУ ФИЗИЧЕСКИМ НОМЕРОМ РАМДИСКА И ЕГО RAM-DISK ID
+; ; Log Number: DB RAM_DRIVE_ID, RAM_DRIVE_NUMBER
+; RAMDTBL.TBL_Entry EQU 2
+; RAMDTBL: DUP MAX_RAMDRIVES * RAMDTBL.TBL_Entry
+; 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
+GenIOCTL: 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,BIOS.Error.InvalidSubFunction
+ 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,BIOS.Error.InvalidSubFunction
+ SCF
+ RET
+
+; C - PARTITION RECORD NUMBER IN DRIVE MBR must be 0 here ;[x] 17.12.2023 загрузка с активного раздела, а не с первого
+; 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,BIOS.Error.Failure
+ SCF
+ RET NZ
+ ;
+ EX AF,AF'
+ LD A,L
+ CALL GET_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 C,A ;[x] 17.12.2023 загрузка с активного раздела, а не с первого
+ LD A,%10100000
+ RET
+
+; !TODO
+; !FIXIT
+; .RSETPRM: AND A
+; RET
+
+GET_RAMDRV_NUM: LD BC,RAMDTBL
+.skip_tbl: ADD A,A
+ ADD A,C
+ LD C,A
+ LD A,0
+ ADC A,B
+ LD B,A
+ ;INC BC
+ LD A,(BC)
+ OR #60 ;!HARDCODE сделать номера разных устройств через метки
+ RET
+;
+;ENDDRVR EQU $
+ ENDMODULE ;RAMDSK_DRV
+;
diff --git a/SHELL/BATCH.ASM b/SHELL/BATCH.ASM
new file mode 100644
index 0000000..a33e30c
--- /dev/null
+++ b/SHELL/BATCH.ASM
@@ -0,0 +1,546 @@
+; Обработка BAT-файлов
+;
+
+;fhandle
+BAT_FM: db 0 ; дескр. bat-файла
+;count: db 0 ; число прочит. байт из файла
+
+; флаг echo-режима
+echo_mode:
+ db true ; 1/0 on/off
+
+; буфер bat-файла
+;T98B9: ds 256
+
+
+ ; IF 0
+ ; CALL RUN_BAT
+ ; CALL BATCH
+ ; CALL MAKE_BATCH_PRM_ARRAY
+ ; CALL NEWLINE
+ ; CALL CMDMODE
+ ; CALL EVALCMD
+ ; CALL RUN_BAT
+ ; ENDIF
+
+;-------------------------------------------------
+; Запуск bat-файла
+; вход: hl=имя файла
+;-------------------------------------------------
+RUN_BAT:
+ call BATCH
+ jp c,EXEERR ; ошибка откр. файла (cpp.asm)
+ ret
+;-------------------------------------------------
+
+; вход: b=число слов "ZERO".."NINE"
+MAKE_BATCH_PRM_ARRAY:
+ dec hl
+.loop: inc hl
+ ld a,(hl)
+ or a
+ ret z
+ cp " "
+ jr z,.loop
+ cp 9 ; Tab
+ jr z,.loop
+ ex de,hl
+ ld (hl),e
+ inc hl
+ ld (hl),d
+ inc hl
+ ex de,hl
+.B_FIND_SPACE:
+ inc hl
+ ld a,(hl)
+ cp " "+1
+ jr nc,.B_FIND_SPACE
+ ld (hl),0
+ or a
+ ret z
+ djnz .loop
+ ret
+
+
+;-------------------------------------------------
+; Загрузка и выполнение BAT-файла
+; вход: hl=имя файла
+; выход: "CF" - ошибка откр. файла
+;-------------------------------------------------
+BATCH:
+ ; [x] 11/12/23 вложенные bat
+ ld a,(BAT_FM)
+ or a
+ jr nz,.new_process
+ ;
+
+ push hl ; сохр. имя bat-файла
+ ld de,Buffers.work.buffer ; 512 местный буфер
+ call copy_string ; скопир. строку (с нулем)
+ ld hl,Buffers.work.buffer ; 512 местный буфер
+ ld de,BAT_PRM_ARRAY ; таблица указат. на "ZERO".."NINE"
+ ld b,BAT_PRM_ARRAY.TOTAL ; число слов "ZERO".."NINE"
+ call MAKE_BATCH_PRM_ARRAY
+ jr nz,.B_ALL_P
+ ld hl,NULL ; ds 2*10
+ ex de,hl
+.B_CLR_P:
+ ld (hl),e
+ inc hl
+ ld (hl),d
+ inc hl
+ djnz .B_CLR_P
+ ex de,hl
+.B_ALL_P:;-
+ pop hl ; восст. имя bat-файла
+
+ ld a,Dss.Open.R ; на чтение
+ ld c,Dss.Open ; открыть файл
+ RST ToDSS
+ ;push af ; сохр. код ошибки
+ ;call c,restore_disk_path ; восст. тек. диск и путь
+ ;R10
+ ;CALL Restore_Screen
+ ;R10
+ ;pop af
+ JR NC,.good
+ CP DSS_Error.sys.TOO_MANY_FILES_IN_DIR
+ SCF
+ RET NZ
+ LD A,DSS_Error.sys.FILE_NOT_FOUND
+ RET
+ ;
+.good: ld (BAT_FM),a ; дескр. bat-файла
+ ; выполн. команд bat-файла
+ call NEWLINE
+ ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat
+ ;R10
+ push af
+ CALL Restore_Screen
+ pop af
+ ;R10
+ xor a ;!FIXIT
+ ret
+ ; [x] 11/12/23 вложенные bat
+.new_process:
+ ld de,Buffers.work.buffer2
+ call copy_string
+ ;
+ ld hl,.shell
+ ld de,Buffers.input_line.Path
+ call copy_string
+ ;
+ ld hl,Buffers.work.buffer2
+ ld de,Buffers.input_line.Path + .shell.size - 1
+ call copy_string
+ ;
+ ld hl,Buffers.input_line.Path
+ ld bc,Dss.Exec
+ RST ToDSS
+ ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat
+ xor a
+ ret
+ ;
+ ;rst ToDSS
+ ;
+ ; ret nc
+ ; CP DSS_Error.sys.FILE_NOT_FOUND
+ ; ret nz
+
+ ; jp z,A83DD ; ошибка откр. файла (cpp.asm)
+ ; ret
+
+;.shell: DB '?:\SYSTEM.EXE /C ',0
+
+.shell: DB 'SYSTEM.EXE /C ',0
+.shell.size EQU $ - .shell
+
+;!TODO
+ ; .ErrorEnv: DB 'ERRORLEVEL='
+ ; .ErrorEnv.Code: DB 'xxx',0
+ ; .ErrorEnv.Size EQU $ - .ErrorEnv
+;
+
+;---------------------------------------------------
+; Выполнение команд BAT-файла
+;---------------------------------------------------
+NEWLINE:
+ LD (cmd_break.sp),SP ; [x] 11/12/23 cmd_break
+ ;
+ ld de,Buffers.input_line.Path
+.ADDBAT: push de
+ call READBAT ; прочитать 128 байт из файла в "Buffers.work.buffer1"
+ pop de
+ ;!TODO доделать тут нормальную проверку на облом с чтением файла, выводить ошибку
+ jp c,cmd_break.exit
+ or a ; a=число прочит. байт
+ jr nz,.BATLINE
+ ;
+ ex de,hl
+ ld de,Buffers.input_line.Path
+ sbc hl,de
+ jp z,cmd_break.exit; ;[x] убран баг с незакрытым BAT-файлом
+ ld a,l
+ ld (Buffers.input_line.Symbols_Num),a ; длина строки
+ call CMDMODE ; тест на bat-команды
+ ; ^^^^^^^
+ ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat
+ JP cmd_break.exit
+; .exit: ld a,(BAT_FM) ; дескр. bat-файла
+; ld c,Dss.Close ; закрыть файл
+; ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat
+; RST ToDSS
+; xor a
+; ld (BAT_FM),a
+; ret
+ ;
+.BATLINE:
+ ld hl,Buffers.work.buffer1
+.loop: call MOVWORD ; скопир. Buffers.work.buffer1 -> Buffers.input_line.Path
+ jr c,.ADDBAT
+ ld a,b
+ ld (MOVWORD.count),a ; осталось пропарсить прочитанных байтов
+ push hl
+ ex de,hl
+ ld de,Buffers.input_line.Path
+ sbc hl,de
+ ld a,l
+ ld (Buffers.input_line.Symbols_Num),a ; длина строки
+ call CMDMODE ; тест на bat-команды
+ ; ^^^^^^^
+ ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat
+ ld de,Buffers.input_line.Path
+ pop hl
+ jr .loop
+
+
+;-------------------------------------------------
+; Чтение данных (hl) -> (de), при необходимости
+; подкачка из файла.
+;
+; вход: hl=откуда
+; de=куда
+;-------------------------------------------------
+MOVWORD:
+.count+1: ld a,0 ; число прочит. байт из файла
+ ; [x] 15/12/23 exit if 0
+ OR A
+ SCF
+ RET Z
+ ;
+ ld b,a
+.loop: ld a,(hl)
+ ld (de),a
+ cp " "
+ jr c,.loop_
+ inc hl
+ inc de
+ djnz .loop
+ scf
+ ret
+ ; прочитать доп. блок из файла
+.loop2: ld a,(hl)
+ cp " "
+ ret nc
+.loop_: inc hl
+ djnz .loop2
+ push de
+ call READBAT ; прочитать 128 байт из файла
+ pop de
+ ;!TODO доделать тут нормальную проверку на облом с чтением файла, выводить ошибку
+ RET C
+ ;ld hl,BATBUFF ; 128 буфер (ccp.asm) "work_buffer1"
+ ld hl,Buffers.work.buffer1
+ ld b,a ; число прочит. байт
+ or a
+ jr nz,.loop2
+ scf
+ ret
+
+; прочитать 128 байт из файла
+READBAT:
+ ld hl,Buffers.work.buffer1
+ ld de,128 ; сколько
+ ld a,(BAT_FM) ; дескр. bat-файла
+ ld c,Dss.Read ; чтение файла
+ RST ToDSS
+ ld a,e
+ ; [x] 28/09/23
+ JR NC,1F
+ ;!TODO доделать тут нормальную проверку на облом с чтением файла, сохранять ошибку
+ LD A,0 ; сохраняем флаг CF
+ ;
+1: ld (MOVWORD.count),a ; число прочит. байт из файла
+ ret
+
+
+; Тест на bat-команды
+; должен соблюдаться баланс стека для cmd_break
+CMDMODE:
+ ;xor a
+ ;ld (D96A6),a ; (inline.asm)
+ call EVALCMD ; (batch.asm)
+ ;ld ix,T96AC ; нужно?? закоментарил (inline.asm)
+ ;ld hl,T96AE ;;256 буфер (inline.asm)
+ ld hl,Buffers.input_line.Path
+ ld a,(hl)
+ cp "@" ; 40h
+ jr nz,.A8240
+ dec hl
+ ;ld hl,Buffers.input_line.Symbols_Num;;
+ dec (hl)
+ jr z,.A825B
+ ld c,(hl) ; длина строки
+ inc hl
+ ld b,0
+ ;ld hl,Buffers.work.buffer+256;;
+ ld d,h
+ ld e,l
+ inc hl
+ ldir
+ jr .A825B
+ ;
+.A8240: ld a,(echo_mode) ; флаг echo-режима
+ or a
+ jr z,.A825B ; off
+ ; вывести сист. путь и строку содержимого bat-файла
+ ;ld de,T96AE ;;256 буфер (inline.asm)
+ ;ld de,Buffers.input_line.Path
+ ;call A95DE ; вывод экран. пути с ">" (inline.asm)
+ ; вывести экран. путь и введ. команду
+ ld c,BIOS.LP_GET_PLACE ; узнать полож. курсора
+ RST ToBIOS
+ ld (YXpos),de ; Y/X начало ком-строки
+ ld (cursor_position),de ; Y/X позиция курсора
+ call print_compath ; вывести путь + новая ширина поля ввода
+ ld de,(YXpos) ; Y/X начало ком-строки
+ ld c,Dss.Locate ; уст. полож. курсора
+ RST ToDSS
+ ;ld hl,Buffers.work.buffer+256;;
+ ld hl,Buffers.input_line.Symbols_Num ; длина строки
+ ld a,(hl)
+ ld b,a
+ inc hl ;+5
+ push bc
+ ld c,BIOS.LP_PRINT_LINE2 ; вывод строки без атрибутов
+ RST ToBIOS
+ pop bc ; b=длина строки
+ ld a,(width_inpline) ; ширина поля ввода (76..48)
+ sub b
+ ;ei
+ ret z ; правый край экрана
+ jr c,.A8250; ; строка больше ширины экрана
+ ; заполнить строку до конца экрана
+ dec a ; чтобы не сработал скроллинг экрана ;!FIXIT scroll
+ ld b,a ; число вывод. символов
+ ld a," " ; символ
+ ld c,BIOS.LP_PRINT_SYM ; вывод символа без атрибута
+ RST ToBIOS
+ ;ei
+ ;!TEST
+.A8250: call newline
+ ;
+ ;
+ ;ld a,(D96AD) ;; длина строки (inline.asm)
+ ;ld a,(Buffers.input_line.Symbols_Num);-
+ ;or a
+ ;ret z
+ ;call newline
+ ;jr A8264
+ ;
+.A825B: ;ld a,(D96AD) ;; длина строки (inline.asm)
+ ld a,(Buffers.input_line.Symbols_Num)
+ or a
+ ret z
+;A8264: ld hl,T96AE ;;256 буфер (inline.asm)
+ ;ld hl,Buffers.input_line.Path
+ ;dec hl
+ ; убрать концевые пробелы строки
+ ld hl,Buffers.input_line.Symbols_Num
+ ld c,(hl) ; hl=длина строки (inline.asm)
+ ld b,0
+ inc hl
+ ;ld hl,Buffers.work.buffer+256;;
+.A826C: ld a,(hl)
+ cp " "
+ jr nz,.A8276
+ inc hl
+ dec c
+ jr nz,.A826C
+ ret
+ ;
+.A8276: ld d,h
+ ld e,l
+ add hl,bc
+ ld (hl),b ; 0 в конец строки (первого конц. пробела)
+ sbc hl,bc
+ ld a,c
+ ex af,af'
+ ld a," "
+ cpir
+ jr nz,.A8286
+ inc c
+.A8286: ex af,af'
+ sub c
+ ld c,a ; длина слова или строки ?
+ ld hl,BATLIST ; команды bat + dos-команды
+ ;
+ ; de=Buffers.input_line.Path, c=длина строки (без конц. пробелов)
+ ; выполн. команду или запустить файл
+ jp COMP.start
+
+; должна убрать конц. пробелы и уст. длину строки, если урезалась
+EVALCMD: xor a
+ ld hl,Buffers.input_line.Symbols_Num ;!HARDCODE
+ ld c,(hl)
+ ld b,a
+ inc hl
+ add hl,bc
+ ld (hl),a ; 0 в конец строки
+ sbc hl,bc
+ ld de,Buffers.work.buffer2 ; 256 буфер
+ call EVALSTR
+ ld hl,Buffers.work.buffer2 ;work_buffer+256
+ ld de,Buffers.input_line.Path ; куда
+ ld bc,255 ;!HARDCODE
+.loop: ld a,(hl)
+ ldi
+ inc b
+ or a
+ jr nz,.loop
+ dec b
+ ld a,b
+ ld (Buffers.input_line.Symbols_Num),a ; длина строки (edline.asm)
+ and a
+ ret
+
+; HL - STRING WITH %VAR%
+EVALSTR: ld a,(hl)
+ cp "%"
+ jr z,.TVARIABLE
+.VARL1: ldi
+ or a
+ jr nz,EVALSTR
+ ; A=0
+ ld b,a
+ ld c,a
+ ld (.TVAR_PNT),bc
+ ret
+ ;
+.TVARIABLE:
+.TVAR_PNT+1: ld bc,0
+ ld a,b
+ or c
+ ld a,"%"
+ ld (.TVAR_PNT),de
+ jr nz,.TVAR1
+ inc hl
+ ld a,(hl) ;!FIXIT я в console.asm исправлял баг с параметром %A например. Тут мои правки или Василя?
+ cp "9"+1
+ jr c,.TVAR0
+.TVAR2: ld a,"%" ; > "9"
+ dec hl
+ jp .VARL1
+.TVAR0: cp "0"
+ jr c,.TVAR2 ; < "0"
+ ; BATCH PARAM %0, %1, %2 ...
+ inc hl
+ push hl
+ ld (.TVAR_PNT),bc
+ sub "0"
+ add a,a
+ ld c,a
+ ld hl,BAT_PRM_ARRAY ; таблица указат. на "ZERO".."NINE"
+ add hl,bc
+ ld a,(hl)
+ inc hl
+ ld h,(hl)
+ ld l,a
+ or h
+ jr z,.NOBTP ; NO BATCH PARM
+ call copy_string ; скопир. строку (с нулем)
+ dec de
+.NOBTP: pop hl
+ jp EVALSTR
+ ;
+.TVAR1: push hl
+ ld h,d
+ ld l,e
+ dec hl
+ and a
+ sbc hl,bc
+ jr z,.TNOVAR
+ ld a,"="
+ ld (de),a
+ inc de
+ xor a
+ ld (de),a
+ ld d,b ; de=буфер значения перем.
+ ld e,c
+ ld h,b ; hl=имя перем.
+ ld l,c
+ inc hl
+ ld bc,Dss.Environ.Get ; получить перем. окружения
+ RST ToDSS
+.TNOVAR: pop hl
+ inc hl
+ ld bc,0
+ ld (.TVAR_PNT),bc
+ jp EVALSTR
+
+
+
+; !! Не делать одну команду > 256 символов)) !!
+;
+ ; BAT-команды (не отделять от дос-команд)
+BATLIST: DZ 'PAUSE' : DW cmd_pause
+ DZ 'REM' : DW cmd_rem
+ DZ 'EXIT' : DW cmd_break
+ ;
+ ; DSS-команды
+CMDLIST: DZ 'CD' : DW cmd_chdir
+ DZ 'DIR' : DW cmd_dir
+ DZ 'ECHO' : DW cmd_echo
+ DZ 'ECHO.' : DW cmd_echoLN
+ DZ 'PATH' : DW cmd_path
+ DZ 'MD' : DW cmd_mkdir
+ DZ 'REN' : DW cmd_rename
+ DZ 'DEL' : DW cmd_del
+ DZ 'RD' : DW cmd_rmdir
+ DZ 'INFO' : DW cmd_info
+ DZ 'SET' : DW cmd_set
+ DZ 'TIME' : DW cmd_time
+ DZ 'DATE' : DW cmd_date
+ DZ 'VER' : DW cmd_version
+ DZ 'CLS' : DW cmd_cls
+ DZ 'CHDIR' : DW cmd_chdir
+ DZ 'MKDIR' : DW cmd_mkdir
+ DZ 'RENAME' : DW cmd_rename
+ DZ 'ERASE' : DW cmd_del
+ DZ 'RMDIR' : DW cmd_rmdir
+ DZ 'HELP' : DW cmd_help
+ DZ 'VERSION' : DW cmd_version
+ DZ 'EXIT' : DW cmd_exit
+ DZ 'REBOOT' : DW cmd_reboot
+ DB #00
+
+
+IZERO DB "ZERO",0
+IONE DB "ONE",0
+ITWO DB "TWO",0
+ITHREE DB "THREE",0
+IFOUR DB "FOUR",0
+IFIVE DB "FIVE",0
+ISIX DB "SIX",0
+ISEVEN DB "SEVEN",0
+IEIGHT DB "EIGHT",0
+ININE DB "NINE",0
+
+BAT_PRM_ARRAY:
+ DW IZERO, IONE, ITWO, ITHREE, IFOUR, IFIVE, ISIX, ISEVEN, IEIGHT, ININE
+ DW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 10 число слов "ZERO".."NINE"
+.TOTAL EQU ($-BAT_PRM_ARRAY)/4
+ DISPLAY "First compilation test: 10 = ",/D, BAT_PRM_ARRAY.TOTAL
+ ASSERT BAT_PRM_ARRAY.TOTAL = 10, "BAT_PRM_ARRAY.TOTAL"
+NULL: DB 0
+;TVAR_PNT: DW 0
diff --git a/SHELL/Commands/BREAK.ASM b/SHELL/Commands/BREAK.ASM
new file mode 100644
index 0000000..55e7b69
--- /dev/null
+++ b/SHELL/Commands/BREAK.ASM
@@ -0,0 +1,11 @@
+; [x] 11/12/23
+cmd_break:
+.sp+1: LD SP,0
+ ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat
+.exit: ld a,(BAT_FM) ; дескр. bat-файла
+ ld c,Dss.Close ; закрыть файл
+ RST ToDSS
+ xor a
+ ld (BAT_FM),a
+ ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat
+ ret
\ No newline at end of file
diff --git a/SHELL/Commands/CHDIR.ASM b/SHELL/Commands/CHDIR.ASM
new file mode 100644
index 0000000..20f168c
--- /dev/null
+++ b/SHELL/Commands/CHDIR.ASM
@@ -0,0 +1,35 @@
+;///////////////////////////////////////////////////
+;
+; CD, CHDIR. Смена каталога
+;
+;///////////////////////////////////////////////////
+cmd_chdir:
+ ex de,hl
+ ld de,Buffers.work.buffer1;
+ ld c,Dss.GSwitch ; выделить параметр ком-строки
+ RST ToDSS
+ xor a
+ ld hl,Buffers.work.buffer1;
+ cp (hl)
+ jr nz,.chdir
+ ld (hl),"." ; ".." родит. папка
+ inc hl
+ ld (hl),"."
+ inc hl
+ ld (hl),0
+ dec hl
+ dec hl
+.chdir: ld c,Dss.ChDir ; сменить тек. каталог
+ RST ToDSS
+ call c,print_err_message ; вывод сообщения
+ jp Get_Path ; сохр. тек. диск и путь
+; ; вывод сист. пути на экран
+; ld c,8Eh ; узнать полож. курсора
+; RST ToBIOS
+; ld (YXpos),de ; Y/X начало ком-строки
+; ld (cursor_position),de ; Y/X позиция курсора
+; ;call print_compath ; вывести путь + новая ширина поля ввода
+; ;ld de,(YXpos) ; Y/X начало ком-строки
+; ;ld c,84h ; уст. полож. курсора
+; ;RST ToBIOS
+; ret
diff --git a/SHELL/Commands/CLS.ASM b/SHELL/Commands/CLS.ASM
new file mode 100644
index 0000000..3f62cbb
--- /dev/null
+++ b/SHELL/Commands/CLS.ASM
@@ -0,0 +1,66 @@
+;///////////////////////////////////////////////////
+;
+; CLS. Очистить экран
+;
+; Можно задать один аргумент - цвет экрана.
+; Если аргумент не задан, исп. по-умолчанию #07.
+;///////////////////////////////////////////////////
+cmd_cls: ex de,hl ; hl=ком-строка
+ ;ld de,T9186 ; буфер под параметр
+ ld de,Buffers.work.buffer1;
+ push de
+ ld c,Dss.GSwitch ; выделить параметр ком-строки
+ RST ToDSS
+ pop hl
+ jp nc,invalid_param ; "Invalid parametr" (>1 парам.)
+ ld b,7 ; атрибут очистки по-умолчанию
+ ld a,(hl)
+ or a
+ jr z,cls_clear
+ call ascii2byte
+ jp c,invalid_param ; "Invalid parametr"
+ and 7
+ ld b,a
+ inc hl
+ ld a,(hl)
+ or a
+ jr z,cls_clear
+ ld a,b
+ rlca
+ rlca
+ rlca
+ rlca
+ ld b,a
+ ld a,(hl)
+ call ascii2byte
+ jp c,invalid_param ; "Invalid parametr"
+ or b
+ ld b,a
+cls_clear: ld a,b
+ ld (color_screen),a ; атрибут
+ ld de,0 ; Y/X полож.
+ ld hl,#2050 ; Y/X размер ;!HARDCODE win size
+ ld a," "
+ ld c,Dss.Clear ; очистить окно
+ RST ToDSS
+ ; уст. курсор в Home
+ ld de,0 ; Y/X полож.
+ ld c,Dss.Locate
+ RST ToDSS
+ ret
+
+
+; ascii -> int
+ascii2byte: cp "0"
+ ret c
+ cp "9"+1
+ jr c,.number
+ ;
+ and %0101'1111
+ cp "F"+1
+ ccf
+ ret c
+ sub 7
+.number: sub "0"
+ or a
+ ret
diff --git a/SHELL/Commands/DATE.ASM b/SHELL/Commands/DATE.ASM
new file mode 100644
index 0000000..7392470
--- /dev/null
+++ b/SHELL/Commands/DATE.ASM
@@ -0,0 +1,175 @@
+; Обработчики команд DATE и TIME
+;
+
+
+;///////////////////////////////////////////////////
+;
+; DATE. Вывод или установка даты
+;
+;///////////////////////////////////////////////////
+cmd_date:
+ ex de,hl ; hl=ком-строка
+ ld de,Buffers.work.buffer1;
+ ld c,Dss.GSwitch ; выделить параметр ком-строки
+ RST ToDSS
+ ld de,Buffers.work.buffer1;
+ ld a,(de)
+ or a
+ jr z,.cmd_dt1
+ call STR2DEC
+ jp c,invalid_param ; "Invalid parametr"
+ xor a
+ cp h
+ jp nz,invalid_param ; "Invalid parametr"
+ ld a,31
+ cp l
+ jp c,invalid_param ; "Invalid parametr"
+ ld b,l
+ push bc
+ call STR2DEC
+ pop bc
+ jp c,invalid_param ; "Invalid parametr"
+ xor a
+ cp h
+ jp nz,invalid_param ; "Invalid parametr"
+ ld a,12
+ cp l
+ jp c,invalid_param ; "Invalid parametr"
+ ld c,l
+ push bc
+ call STR2DEC
+ push hl
+ ld c,Dss.SysTime
+ RST ToDSS
+ pop ix
+ pop de
+ ld c,Dss.SetTime
+ RST ToDSS
+.cmd_dt1:
+ ld c,Dss.SysTime
+ RST ToDSS
+ PUSH BC ; [x] вывод дня недели 26/01/2023
+ push ix
+ push de
+ ld a,d ; число
+ ld hl,Buffers.bat_params.PRM1; куда
+ call PUTB ; десят. вывод в буфер
+ ld a,"."
+ ld (hl),a
+ inc hl
+ pop de
+ ld a,e ; число
+ call PUTB ; десят. вывод в буфер
+ ld a,"."
+ ld (hl),a
+ inc hl
+ push hl
+ pop ix
+ pop hl
+ call PDIGIT
+ ; [x] вывод дня недели 26/01/2023
+ POP DE
+ LD D,0
+ LD A,E
+ CP 8
+ JR C,.skip
+ LD E,8
+.skip: LD HL,.days
+ LD BC,.days.size
+ CALL LCPIR
+ ;
+ LD DE,Buffers.bat_params.PRM2
+ CALL ncopy_string
+ ;
+ ld de,MAIN_MSG.DATE ; индекс "Current date: %1"
+ jp ECHO_MESSAGE ; вывести строку
+ ;
+.days: DB 0
+ DZ "Sunday"
+ DZ "Monday"
+ DZ "Tuesday"
+ DZ "Wednesday"
+ DZ "Thursday"
+ DZ "Friday"
+ DZ "Saturday"
+ DZ "check CMOS!"
+.days.size EQU $ - .days
+
+
+;///////////////////////////////////////////////////
+;
+; TIME. Вывод или установка времени
+;
+;///////////////////////////////////////////////////
+cmd_time:
+ ex de,hl
+ ;ld de,T9186
+ ld de,Buffers.work.buffer1;
+ ld c,Dss.GSwitch
+ RST ToDSS
+ ;ld de,T9186
+ ld de,Buffers.work.buffer1;
+ ld a,(de)
+ or a
+ jr z,cmd_tm1
+ call STR2DEC
+ jp c,invalid_param ; "Invalid parametr"
+ xor a
+ cp h
+ jp nz,invalid_param ; "Invalid parametr"
+ ld a,23
+ cp l
+ jp c,invalid_param ; "Invalid parametr"
+ ld b,l
+ push bc
+ call STR2DEC
+ pop bc
+ jp c,invalid_param ; "Invalid parametr"
+ xor a
+ cp h
+ jp nz,invalid_param ; "Invalid parametr"
+ ld a,59
+ cp l
+ jp c,invalid_param ; "Invalid parametr"
+ ld c,l
+ push bc
+ call STR2DEC
+ pop bc
+ jp c,invalid_param ; "Invalid parametr"
+ xor a
+ cp h
+ jp nz,invalid_param ; "Invalid parametr"
+ ld a,59
+ cp l
+ jp c,invalid_param ; "Invalid parametr"
+ push bc
+ ld a,l
+ push af
+ ld c,Dss.SysTime
+ RST ToDSS
+ pop bc
+ pop hl
+ ld c,Dss.SetTime
+ RST ToDSS
+cmd_tm1:ld c,Dss.SysTime
+ RST ToDSS
+ push bc
+ push hl
+ ld a,h ; число
+ ld hl,Buffers.bat_params.PRM1; куда
+ call PUTB ; десят. вывод в буфер
+ ld a,":"
+ ld (hl),a
+ inc hl
+ pop de
+ ld a,e ; число
+ call PUTB ; десят. вывод в буфер
+ ld a,":"
+ ld (hl),a
+ inc hl
+ pop af ; число
+ call PUTB ; десят. вывод в буфер
+ xor a
+ ld (hl),a ; в конец строки
+ ld de,MAIN_MSG.TIME ; индекс "Current time: %1"
+ jp ECHO_MESSAGE ; вывести строку
diff --git a/SHELL/Commands/DEL.ASM b/SHELL/Commands/DEL.ASM
new file mode 100644
index 0000000..f66a790
--- /dev/null
+++ b/SHELL/Commands/DEL.ASM
@@ -0,0 +1,15 @@
+;///////////////////////////////////////////////////
+;
+; DEL, ERASE. Удалить файл
+;
+;///////////////////////////////////////////////////
+cmd_del: ex de,hl
+ ld de,Buffers.work.buffer1;
+ ld c,Dss.GSwitch
+ RST ToDSS
+ ld hl,Buffers.work.buffer1;
+ ld c,Dss.Delete
+ RST ToDSS
+ call c,print_err_message ; вывод сообщения
+ ret
+;///////////////////////////////////////////////////
\ No newline at end of file
diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM
new file mode 100644
index 0000000..70dbd0c
--- /dev/null
+++ b/SHELL/Commands/DIR.ASM
@@ -0,0 +1,813 @@
+;///////////////////////////////////////////////////
+;
+; DIR. Вывод списка файлов и папок
+;///////////////////////////////////////////////////
+cmd_dir: push de
+ ;;;; [ ] поддержка параметров
+ ; зануляем все параметры на старте
+ xor a
+ ld (Buffers.work.buffer2),a
+ ld (Buffers.work.free),a
+ ld (read_disk_info.full),a
+ ld (.key_p),a
+ ; выполняем/настраиваем все найденные параметры в строке
+ LD C,256-3 ;!HARDCODE длина строки с командой
+.parse: ld hl,cmd_dir_options
+ call RUN_OPTION
+ jr nc,.end_opt
+ jp (hl)
+.end_opt: ; выводим строку о расчёте свободного места так, чтоб она затёрлась
+ ld a,(read_disk_info.full)
+ and a
+ jr z,.skip
+ LD DE,MAIN_MSG.CALCULATING
+ CALL ECHO_MESSAGE
+ ; 23/05/24
+.skip: ;LD C,Dss.CurDisk ; узнать тек. диск
+ ;RST ToDSS
+ ;CALL read_disk_info ; прочитать метку и серийный номер диска
+ ;
+ pop de
+ xor a
+ ld h,a
+ ld l,a
+ ld (FILES),hl
+ ld (dir_number),hl
+ ld (S_LOW),hl
+ ld (S_MED),hl
+ ld (S_HIGH),a
+ ;
+ ex de,hl
+ ld de,Buffers.work.buffer1
+ ld c,Dss.GSwitch ; выделить параметр ком-строки
+ RST ToDSS
+ ;
+ ld a,(Buffers.work.buffer1)
+ or a
+ ;jr nz,.SkipMask ; задана маска имён
+ jr z,.NoSkipMask ; не задана маска имён
+ ld hl,Buffers.work.buffer1
+ ld bc,Dss.EX_Path.GET_ALL
+ rst ToDSS
+ ;!FIXIT сделать поиск по маски без пути в начале
+ ; сейчас перед маской нужен путь типа dir .\*.asm
+ and %00001100 ; имя диска и путь ;!FIXIT сделать поиск по маски без пути в начале
+ jr z,.SkipMask
+ ;
+ ld hl,Buffers.work.buffer2+2
+ ld c,Dss.CurDir
+ rst ToDSS
+ ld c,Dss.CurDisk
+ rst ToDSS
+ add a,"A"
+ ld (Buffers.work.buffer2),a
+ ld a,":"
+ ld (Buffers.work.buffer2+1),a
+ ;
+ xor a
+ ld hl,Buffers.work.buffer1
+ ld bc,256
+ cpir
+ ;!FIXIT проверка на ошибку по флагу P/V
+ dec hl
+ ex de,hl
+ ld hl,256-1
+ and a
+ sbc hl,bc
+ ld b,h
+ ld c,l
+ ld a,'\' ;
+ ex de,hl
+ cpdr
+ ;!FIXIT проверка на ошибку по флагу P/V
+ inc hl
+ ld (hl),0
+ inc hl
+ ld de,Buffers.bat_params.PRM1
+ call ncopy_string ; сохраняем маску файла
+ ;
+ ld hl,Buffers.work.buffer1
+ ld c,Dss.ChDir
+ rst ToDSS
+ jr nc,.no_error
+ ;
+ cp DSS_Error.sys.MEDIA_CHANGED
+ jp nz,print_err_message
+ call print_err_message
+ ;
+ ld hl,Buffers.work.buffer1
+ ld c,Dss.ChDir
+ rst ToDSS
+ jp c,print_err_message
+.no_error: ;
+ ld hl,Buffers.bat_params.PRM1
+ ld de,Buffers.work.free
+ call ncopy_string ; восстанавливаем маску файла
+ ;
+ ld a,(Buffers.bat_params.PRM1)
+ or a
+ jr nz,.SkipMask
+ ;
+ ; добавление маски
+.NoSkipMask: ld hl,mask_fname ; "*.*"
+ ld de,Buffers.work.free
+ call copy_string
+ ; 23/05/24
+.SkipMask: LD C,Dss.CurDisk ; узнать тек. диск
+ RST ToDSS
+ CALL read_disk_info ; прочитать метку и серийный номер диска
+ JR NC,.NeXt
+ ;
+ CALL print_err_message
+ SCF
+ RET
+ ;
+.NeXt: CALL Print_Header
+ ; [ ] 01/10/23
+ ld hl,Buffers.work.free ; имя файла
+ ld de,Buffers.work.buffer1 ; 80 буфер
+ ld a,FAT_ATTR.NoVolID ; атрибут (все, кроме метки тома)
+ ld bc,Dss.F_First.FATname ; f_first (формат 11)
+ RST ToDSS
+ JR C,.Dir_Empty ;R14
+ ;
+ LD A,32-5 ; количество строк до ожидания клавиши (с вычетом заголовка) ;!HARDCODE
+ PUSH AF
+ ; цикл вывода списка файлов/папок
+.loop: POP AF
+.key_p+1: and #ff
+ dec a
+ jr nz,.skip_wait
+ ld de,MAIN_MSG.DIRPAUSE
+ call ECHO_MESSAGE ; вывести строку
+ ld c,Dss.WaitKey
+ rst ToDSS
+ PUSH DE
+ ld de,MAIN_MSG.CLSLINE
+ call ECHO_MESSAGE
+ POP DE
+ dec d
+ ld de,MAIN_MSG.DIR_ESCAPE
+ jp z,ECHO_MESSAGE ; закончить по ESC
+ ;jr nz,.skip_esc
+ ;xor a
+ ;ld (.key_p),a ; отменяем ESC
+.skip_esc: ld a,32-1
+.skip_wait: PUSH AF
+ ld hl,Buffers.work.buffer1+33 ; 80
+ ;push af
+ ;ld de,33
+ ;add hl,de
+ call PRNNAME
+ ;
+ ld ix,Buffers.work.buffer1 ; 80
+ ld a,(ix+32) ; атрибут тек. записи
+ and FAT_ATTR.DIRECTORY ; папка ?
+ jr z,.Calc_Size ; нет
+ ; считаем папки
+ ; не считаем папкой служебные "." и ".."
+ ld d,(ix+33)
+ ld e,(ix+34)
+ ld hl,-('..')
+ add hl,de
+ ld a,h
+ or l
+ jr z,.next
+ ld hl,-('. ')
+ add hl,de
+ ld a,h
+ or l
+ jr z,.next
+ ; увеличиваем счётчик папок
+ ld hl,(dir_number)
+ inc hl
+ ld (dir_number),hl
+ jr .next
+ ;;R14
+.Dir_Empty: ;push af
+ ;CALL Print_Header
+ ;pop af
+ CALL print_err_message
+ jr .print
+ ;;R14
+ ; прибавить размер тек. файла
+.Calc_Size: ld hl,(FILES)
+ inc hl
+ ld (FILES),hl
+ ld e,(ix+FAT_DIRECTORY_RECORD.F_SIZE+2)
+ ld d,(ix+FAT_DIRECTORY_RECORD.F_SIZE+3)
+ ld hl,(S_MED)
+ ld a,(S_HIGH)
+ exx
+ ld e,(ix+FAT_DIRECTORY_RECORD.F_SIZE)
+ ld d,(ix+FAT_DIRECTORY_RECORD.F_SIZE+1)
+ ld hl,(S_LOW)
+ add hl,de
+ ld (S_LOW),hl
+ exx
+ adc hl,de
+ ld (S_MED),hl
+ ;exx
+ adc a,0
+ ld (S_HIGH),a
+ ;exx
+.next: ld de,Buffers.work.buffer1 ; 80 буфер
+ ld c,Dss.F_Next ; поиск след.
+ RST ToDSS
+ jp nc,.loop ; назад в цикл, если не конец списка
+ pop af ; баланс стека
+ ; Десятичный вывод
+.print: ld hl,(FILES)
+ ld ix,Buffers.bat_params.PRM3; количество файлов
+ call PDIGIT
+ ;
+ ld a,(S_HIGH)
+ ld hl,(S_MED) ; ст. разряд
+ exx
+ ld hl,(S_LOW) ; мл. разряд
+ ;exx
+ ;
+ ;CALL PRINT_DWORD
+ CALL PRINT_5BYTES
+ ;
+ ; [x] вывод количества папок
+ ; [x] вывод общего количества свободного места
+ ld hl,SIZE_BUFFER.high ; "000 000 000 000"
+ ld de,Buffers.bat_params.PRM1; + PRM2. размер файлов в каталоге
+ ld bc,SIZE_BUFFER.bytes
+ call ncopy_string.start ; скопир. строку (с нулем), макс. SIZE_BUFFER.bytes симв.
+ ;
+ ; Десятичный вывод
+ ld hl,(dir_number)
+ ld ix,Buffers.bat_params.PRM4; кол-во каталогов в каталоге
+ call PDIGIT
+ ; full capacity
+ ld a,(full_space_high)
+ ld hl,(full_space_medium) ; ст. разряд
+ exx
+ ld hl,(full_space_low) ; мл. разряд
+ CALL PRN_DISK_SIZE
+ ; ;
+ ld de,MAIN_MSG.DIR_2 ; индекс " %1 file(s), %2 bytes, %3 Dir(s)"
+ CALL ECHO_MESSAGE ; вывести строку
+ ;
+ ; [ ] 23/05/2024
+ ld hl,Buffers.work.buffer2
+ ld c,Dss.ChDir
+ ld a,(hl)
+ or a
+ call nz,ToDSS
+ ;
+ ld a,(read_disk_info.LastDskInfoIsFull)
+ and a
+ RET Z
+ ;
+ ; free space
+ ld a,(free_space_high)
+ ld hl,(free_space_medium) ; ст. разряд
+ exx
+ ld hl,(free_space_low) ; мл. разряд
+ ;
+ CALL PRN_DISK_SIZE
+ ;
+ ld de,MAIN_MSG.DIR_4 ; индекс " %6 bytes free"
+ jp ECHO_MESSAGE
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+
+PRN_DISK_SIZE: call PRINT_5BYTES
+ ld hl,SIZE_BUFFER.high ; "000 000 000 000"
+ ld de,Buffers.bat_params.PRM5; and PRM6. куда
+ ld bc,SIZE_BUFFER.bytes
+ jp ncopy_string.start ; скопир. строку (с нулем), макс. SIZE_BUFFER.bytes симв.
+ ;
+Print_Header: ; %1
+ ld hl,Buffers.bat_params.PRM1
+ ld a,'"'
+ ld (hl),a
+ inc hl
+ push hl
+ ;
+ ld c,Dss.CurDisk
+ rst ToDSS
+ add a,"A"
+ ;
+ pop hl
+ ld (hl),a
+ inc hl
+ ld a,'"'
+ ld (hl),a
+ inc hl
+ ;ld (hl),":"
+ ld (hl),0
+ ; %2
+ ld hl,serial_string ; строка серийного номера диска
+ ld de,Buffers.bat_params.PRM2; куда
+ call ncopy_string ; скопир. строку (с нулем)
+ ; %3..5
+ ;push hl
+ ld hl,Buffers.work.free + 256 + 128 ; 128 - на всякий случай
+ ld c,Dss.CurDir
+ rst ToDSS
+ ld hl,Buffers.bat_params.PRM3
+ ld a,(Buffers.bat_params.PRM1 + 1)
+ ld (hl),a
+ inc hl
+ ld (hl),':'
+ ;
+ ld hl,Buffers.bat_params.PRM3 +2
+ ld de,Buffers.bat_params.PRM3 +2 + 1
+ ld (hl),0
+ ld bc,16+16+16-1-2
+ ldir
+ ;
+ ld hl,Buffers.work.free + 256 + 128; сист. путь
+ ld de,Buffers.bat_params.PRM3 + 2 ;+PRM4..5. 2 + 48 байтов буфер
+ call make_short_path
+ ld de,MAIN_MSG.DIR_1 ; индекс "Volume in drive %1..."
+ JP ECHO_MESSAGE ; вывести строку
+ ;
+
+; Подготовить строку списка файлов/папок ; !FIXIT не готова к LFN
+PRNNAME: dec hl
+ ld a,(hl)
+ and FAT_ATTR.DIRECTORY
+ call z,.set_small
+ inc hl
+ ;
+ ld bc,8
+ ld de,Buffers.bat_params.PRM1
+ ldir
+ xor a
+ ld (de),a
+ ld de,Buffers.bat_params.PRM2; куда
+ ldi
+ ldi
+ ldi
+ ld (de),a
+ ld ix,Buffers.work.buffer1
+ call PRNSIZE ; вывести в буфер имя файла и его размер (у папки )
+ call PRNDATE ; вывести в буфер дату файла/папки
+ call PRNTIME ; вывести в буфер время файла/папки
+ ld de,MAIN_MSG.DIR_3 ; индекс "%1 %2 %3 %4 %5"
+ jp ECHO_MESSAGE ; вывод строки
+ ;
+.set_small:
+ ld d,h
+ ld e,l
+ ld b,11 ;!HARDCODE длина имени DOS
+.loop: inc hl
+ ld a,(hl)
+ call CorrBigChar
+; cp 'A'
+; jr c,.next
+; cp 'Z'+1
+; jr c,.letter
+; ;
+; cp 'А' ;#80
+; jr c,.next
+; cp 'П'+1 ;#9F + 1
+; jr c,.letter
+; ;
+; cp 'Я'+1
+; jr c,.next
+; ;
+; .letter: or %0010'0000
+ ld (hl),a
+.next: djnz .loop
+ ex de,hl
+ ret
+
+; Вывести в буфер имя файла и его размер (у папки )
+PRNSIZE: ld a,(ix+32)
+ ld hl,DIRIDD ; " "
+ and FAT_ATTR.DIRECTORY ; папка ?
+ jr nz,.PRZ ; да
+ ld l,(ix+FAT_DIRECTORY_RECORD.F_SIZE) ; мл. разряд
+ ld h,(ix+FAT_DIRECTORY_RECORD.F_SIZE+1)
+ exx
+ ld l,(ix+FAT_DIRECTORY_RECORD.F_SIZE+2) ; ст. разряд
+ ld h,(ix+FAT_DIRECTORY_RECORD.F_SIZE+3)
+ exx
+ push ix
+ call MAKE_LN ; десятичный 32-х разрядный вывод
+.not_zero: ld de,SIZE_BUFFER.low ; "0 000 000 000"
+ ld hl,L32BIT_ ; "0000000000"
+ ldi
+ ld a," "
+ ld (de),a
+ inc de
+ ldi
+ ldi
+ ldi
+ ld (de),a
+ inc de
+ ldi
+ ldi
+ ldi
+ ld (de),a
+ inc de
+ ldi
+ ldi
+ ldi
+ ld hl,SIZE_BUFFER.low ; "0 000 000 000"
+ pop ix
+.PRZ: ld de,Buffers.bat_params.PRM3; 16 буфер
+ jp ncopy_string ; скопир. строку (с нулем), макс.15 симв.
+
+; Скопировать в буфер дату файла/папки
+PRNDATE: ld c,(ix+FAT_DIRECTORY_RECORD.DATE)
+ ld b,(ix+FAT_DIRECTORY_RECORD.DATE+1)
+ ld hl,SIZE_BUFFER.low ; "0 000 000 000"
+ call MAKE_DATE ; вывод в буфер даты
+ ld (hl),0
+ ld hl,SIZE_BUFFER.low ; "0 000 000 000"
+ ld de,Buffers.bat_params.PRM4; 16 куда
+ jp ncopy_string ; скопир. строку (с нулем), макс.15 симв.
+
+; Скопировать в буфер время файла/папки
+PRNTIME: ld b,(ix+22)
+ ld c,(ix+23)
+ ld hl,SIZE_BUFFER.low ; "0 000 000 000"
+ call MAKE_TIME ; скопир. в буфер время файла/папки
+ ld (hl),0
+ ld hl,SIZE_BUFFER.low ; "0 000 000 000"
+ ld de,Buffers.bat_params.PRM5; 80 буфер строки
+ jp ncopy_string ; скопир. строку (с нулем), макс.15 симв.
+
+; в буфер время файла/папки
+MAKE_TIME: srl c
+ rr b
+ srl c
+ rr b
+ srl c
+ rr b
+ srl b
+ srl b
+ ld a,c
+ call toNumber
+ ld (hl),":" ; раздел. времени
+ inc hl
+ ld a,b
+ jr toNumber
+
+; в буфер дату файла/папки
+MAKE_DATE: ld a,c
+ and #1F
+ push bc
+ call toNumber
+ ld (hl),"." ; раздел. даты
+ inc hl
+ pop bc
+ ld a,c
+ srl b
+ rla
+ rla
+ rla
+ rla
+ and #0F
+ call toNumber
+ ld (hl),"." ; раздел. даты
+ inc hl
+ ld a,b
+ add a,80
+ cp 100
+ jr c,toNumber
+.loop: sub 100
+ cp 100
+ jr nc,.loop
+ ;
+toNumber: ld c,#2F
+.loop: inc c
+ sub 10
+ jr nc,.loop
+ add a,10
+ add a,"0"
+ ld (hl),c
+ inc hl
+ ld (hl),a
+ inc hl
+ ret
+;
+
+;!TODO перетащить в procedures/math.asm
+; Десятичный 32-х разрядный вывод
+; HL':HL - число для перевода
+; !FIXIT можно объеденить с PDIGIT
+MAKE_LN: ld ix,L32BIT_ ; "0000000000"
+ exx
+ ld de,#3B9A
+ exx
+ ld de,#CA00
+ ; DE':DE = 1,000,000,000
+ call GET_DIG
+.skip_1: exx
+ ld de,#05F5
+ exx
+ ld de,#E100
+ ; DE':DE = 100,000,000
+ call GET_DIG ; 100,000,000...999,999,999
+ exx
+ ld de,#98
+ exx
+ ld de,#9680
+ ; DE':DE = 10,000,000
+ call GET_DIG ; 10,000,000...99,999,999
+ exx
+ ld de,#0F
+ exx
+ ld de,#4240
+ ; DE':DE = 1,000,000
+ call GET_DIG ; 1,000,000...9,999,999
+ exx
+ ld de,#01
+ exx
+ ld de,#86A0
+ ; DE':DE = 100,000
+ call GET_DIG ; 100,000...999,999
+ exx
+ ld de,#00
+ exx
+ ld de,#2710
+ ; DE':DE = 10,000
+ call GET_DIG ; 10,000...99,999
+ exx
+ ld de,#00
+ exx
+ ld de,#03E8
+ ; DE':DE = 1,000
+ call GET_DIG ; 1,000...9,999
+ exx
+ ld de,#00
+ exx
+ ld de,#64
+ ; DE':DE = 100
+ call GET_DIG ; 100..999
+ exx
+ ld de,#00
+ exx
+ ld de,#0A
+ ; DE':DE = 10
+ call GET_DIG ; 10..99
+ ld a,l
+ add a,"0"
+ ld (ix+0),a
+ inc ix
+ ret
+ ;
+GET_DIG: ld a,"0"-1
+ AND A
+.loop: inc a
+ sbc hl,de
+ exx
+ sbc hl,de
+ exx
+ jp nc,.loop
+ ;
+ add hl,de
+ exx
+ adc hl,de
+ exx
+ ;dec a
+ cp "0"
+ jr nz,.putChar
+ ld b,a
+ ld a,(ix-1)
+ cp " "
+ jr z,.putChar
+ ld a,b
+ ;
+.putChar: ld (ix+0),a
+ inc ix
+ ret
+;
+
+FILES: WORD 0
+S_LOW: WORD 0
+S_MED: WORD 0
+S_HIGH: BYTE 0
+dir_number: WORD 0
+;
+full_space_low: WORD 0
+full_space_medium: WORD 0
+full_space_high: BYTE 0
+;
+
+; !TODO может обойтись одним буфером 00 вместо двух?
+L40BIT: db " " ; маркер для ix-1
+.Str: db " " ; 00
+L32BIT_: db " " ; 000000000
+.end: db "0"
+;
+DIRIDD: db " ",0
+;
+SIZE_BUFFER: db " " ; маркер для ix-1
+.high db " " ; "00"
+.low: db " ",0,0 ; "0 000 000 000",0,0
+.bytes equ SIZE_BUFFER - $
+;
+
+;---------------;
+SlashMaskFname: db '\' ;
+; маска файлов
+mask_fname: db "*.*",0
+;---------------;
+
+cmd_dir_options:; [x] параметр /F - вывод количества свободного места на диске (тормозит, поэтому параметром)
+ DB 'f' : DW cmd_dir_freeSpace
+ DB 'p' : DW cmd_dir_pause
+.Size EQU ($-cmd_dir_options)/3
+.paramLength EQU 3
+;
+
+;
+cmd_dir_freeSpace:
+ ; ставим опцию для API DSS DskInfo
+ ld a,1
+ ld (read_disk_info.full),a
+ jp cmd_dir.parse
+;
+cmd_dir_pause: ld a,#ff
+ ld (cmd_dir.key_p),a
+ jp cmd_dir.parse
+///////////////////////////////////////////////////////////////////////////////////////
+GET_BIG_DIG: ld b,"0"-1
+ and a
+.loop: inc b
+ sbc hl,de
+ exx
+ sbc hl,de
+ exx
+ sbc a,c
+ jp nc,.loop
+ ;
+ add hl,de
+ ;
+ exx
+ adc hl,de
+ exx
+ adc a,c
+ ;
+ ex af,af'
+ ;dec b
+ ld a,b
+ cp "0"
+ jr nz,.putChar
+ ld a,(ix-1)
+ cp " "
+ jr z,.putChar
+ ld a,b
+ ;
+.putChar: ld (ix+0),a
+ ex af,af'
+ inc ix
+ ret
+ ; stop
+; A:HL':HL - число для перевода
+PRINT_5BYTES: ld ix,L40BIT.Str ; "00"
+ ld c,#17
+ exx
+ ld de,#4876
+ exx
+ ld de,#E800
+ ; C:DE':DE = 100,000,000,000
+ call GET_BIG_DIG
+ ;
+ ld c,#02
+ exx
+ ld de,#540B
+ exx
+ ld de,#E400
+ ; C:DE':DE = 10,000,000,000
+ CALL GET_BIG_DIG
+ ;
+ ld c,#00
+ exx
+ ld de,#3B9A
+ exx
+ ld de,#CA00
+ ; C:DE':DE = 1,000,000,000
+ CALL GET_BIG_DIG
+ ;
+ ; DE':DE = 100,000,000
+ CALL MAKE_LN.skip_1
+ ld de,SIZE_BUFFER.high ; "0 000 000 000"
+ ld hl,L40BIT.Str ; "0000000000"
+ ldi
+ ldi
+ ld a,(hl)
+ ldi
+ cp " "
+ jr z,1F
+ ld a,"," ; разд. разрядов
+1: ld (de),a
+ inc de
+ ldi
+ ldi
+ ld a,(hl)
+ ldi
+ cp " "
+ jr z,1F
+ ld a,"," ; разд. разрядов
+1: ld (de),a
+ inc de
+ ldi
+ ldi
+ ld a,(hl)
+ ldi
+ cp " "
+ jr z,1F
+ ld a,"," ; разд. разрядов
+1: ld (de),a
+ inc de
+ ldi
+ ldi
+ ldi
+ scf
+ ret
+///////////////////////////////////////////////////////////////////////////////////////
+
+
+///////////////////////////////////////////////////////////////////////////////////////
+;----------------------------------------------------------------------;
+;Процедура умножения (16*8bit)
+;На вход: DE * C
+;На выход:A:HL = результат
+ IFUSED Mult32
+Mult16X8: SUB A
+ LD L,A
+ LD H,A
+ CP C
+ RET Z
+ OR D
+ OR E
+ RET Z
+ LD A,C
+ LD C,#00
+ LD B,#08
+.loop: ADD HL,HL
+ RLA
+ JR NC,.next
+ ADD HL,DE
+ ADC A,C
+.next: DJNZ .loop
+ RET
+ ENDIF
+;----------------------------------------------------------------------;
+;----------------------------------------------------------------------;
+;Процедура умножения (32bit)
+;На вход: HL:DE * BC
+;На выход:HL:DE = результат
+ IFUSED Mult32
+Mult32: PUSH IX
+ LD IX,#0000
+ LD A,#20
+ EX DE,HL
+.loop: ADD IX,IX
+ ADC HL,HL
+ RL E
+ RL D
+ JR NC,.no_add
+ ADD IX,BC
+ JR NC,no_add
+ INC HL
+.no_add: DEC A
+ JR NZ,.loop
+ LD E,LX
+ LD D,HX
+ POP IX
+ RET
+ ENDIF
+;----------------------------------------------------------------------;
+;INPUT : DE * BC
+;OUTPUT: HL:DE
+ IFUSED Mult32
+Mult_16x16: LD IX,0
+ LD HL,0
+ ;
+ LD A,B
+ OR C
+ JR Z,.exit
+ ;
+.loop: SRL B
+ RR C
+ JP NC,.no_add
+ ADD IX,DE
+ JR NC,.no_add
+ INC HL
+ ;
+.no_add: LD A,B
+ OR C
+ JR Z,.exit
+ ;
+ SLA E
+ RL D
+ RL L
+ RL H
+ JP .loop
+ ;
+.exit: LD D,XH
+ LD E,XL
+ RET
+ ENDIF
+///////////////////////////////////////////////////////////////////////////////////////
diff --git a/SHELL/Commands/ECHO.ASM b/SHELL/Commands/ECHO.ASM
new file mode 100644
index 0000000..183a51f
--- /dev/null
+++ b/SHELL/Commands/ECHO.ASM
@@ -0,0 +1,58 @@
+;///////////////////////////////////////////////////
+;
+; ECHO. Вывод сообщений на экран
+;
+;///////////////////////////////////////////////////
+cmd_echo:
+ ex de,hl
+ ld a,(hl) ; ком-строка
+ or a
+ jr z,A862E ; без аргументов
+ ex de,hl
+ ; тест аргументов на "on","off"
+ push de
+ ld b,3 ; длина сравнения
+ ld hl,T8C21 ; "ON",0
+ call COMPARE ; сравнить строки
+ pop de
+ ld a,true ; режим "on"
+ jr z,A864B
+ push de
+ ld b,4 ; длина сравнения
+ ld hl,T8C24 ; "OFF",0
+ call COMPARE ; сравнить строки
+ pop hl
+ ld a,false ; режим "off"
+ jr z,A864B
+ ; аргументы не "on","off"
+A8623: ld c,Dss.PChars
+ RST ToDSS
+ jp newline
+
+; Показать тек. режим эха
+A862E: ld a,(echo_mode) ; флаг echo-режима
+ or a
+ ld de,7 ; индекс "on"
+ jr nz,$+5 ; false ;!FIXIT $
+ ld de,MAIN_MSG.OFF ; индекс "off"
+ call FMESAGE ; найти строку по индексу
+ ld de,Buffers.bat_params.PRM1; куда (аргумент %1)
+ call ncopy_string ; скопир. строку (с нулем), макс.15 симв.
+ ld de,MAIN_MSG.ECHO ; индекс "Echo is %1"
+ jp ECHO_MESSAGE
+ ;
+A864B: ld (echo_mode),a ; флаг echo-режима
+ ret
+
+
+;///////////////////////////////////////////////////
+;
+; Команда "ECHO." Вставка пустой строки на экран
+;
+;///////////////////////////////////////////////////
+cmd_echoLN:
+ ex de,hl
+ ld a,(hl) ; ком-строка
+ or a
+ jp z,newline ; без аргументов
+ jr A8623 ; вывести аргументы
diff --git a/SHELL/Commands/EXIT.ASM b/SHELL/Commands/EXIT.ASM
new file mode 100644
index 0000000..78f5b9c
--- /dev/null
+++ b/SHELL/Commands/EXIT.ASM
@@ -0,0 +1,12 @@
+;///////////////////////////////////////////////////
+;
+; EXIT. Выход в родительский процесс
+;
+;///////////////////////////////////////////////////
+cmd_exit:
+.TASKX+1: ld a,2 ; уровень текущего шелла
+ dec a
+ dec a
+ ret z ; a=2 (primary шелл)
+ ;pop hl ; восст. баланс стека (убрать вызов COMP в гл. цикле оболочки)
+ jp back_to_parent_process ; вернуться в родит. процесс
diff --git a/SHELL/Commands/HELP.ASM b/SHELL/Commands/HELP.ASM
new file mode 100644
index 0000000..df431b4
--- /dev/null
+++ b/SHELL/Commands/HELP.ASM
@@ -0,0 +1,34 @@
+;///////////////////////////////////////////////////
+;
+; HELP. Вывод экрана помощи
+;
+;///////////////////////////////////////////////////
+cmd_help: LD HL,.help_txt
+ JP PRINTZ
+ ; LD A,(color_screen)
+ ; AND A ; no attr-mode
+ ; EX AF,AF'
+ ; XOR A ; no XY-mode
+ ; LD BC,BIOS.LP_PR_LINE_DIR
+ ; LD IY,0 ; YH = YL = B
+ ; JP ToBIOS
+ ;JP ECHO_MESSAGE
+
+; 1 2\ 3 4 5 6 7 8
+; 01234567890123456789012345678901234567890123456789012345678901234567890123456789;
+.help_txt: DB "COMMANDS:\r\n"
+ DB "SET INFO REN = RENAME PATH CLS [ink]\r\n"
+ DB "CD = CHDIR DEL = ERASE HELP VER = VERSION\r\n"
+ DB "MD = MKDIR TIME ECHO EXIT\r\n"
+ DZ "RD = RMDIR DATE REBOOT DIR [path] [/p /f]\r\n\n"
+; ; ; ; ; ; ; ; ; ; ; ; ;
+;
+;LP_PR_LINE_DIR:
+; A - атрибуты выводимого символа если ZF=0
+; CF - XY-mode
+; DE - место символа в окне, если CF=1
+; HL - адрес с выводимой строкой
+; B - разделитель
+; IY - два спец.символа для выхода с CF=1. Должны быть равны B, если не нужны
+; A' - цвет консоли (используется при скролле и очистке окна)
+; CF' - выводить символ с атрибутами
\ No newline at end of file
diff --git a/SHELL/Commands/INFO.ASM b/SHELL/Commands/INFO.ASM
new file mode 100644
index 0000000..b20b2f9
--- /dev/null
+++ b/SHELL/Commands/INFO.ASM
@@ -0,0 +1,198 @@
+;[ ] 24/06/2024
+cmd_info: CALL Get_Path
+ ;
+ LD DE,MAIN_MSG.INFO_1 ; индекс "Drive Label Serial number Size"
+ CALL ECHO_MESSAGE
+ ;
+ LD HL,.Collect_Msg
+ LD C,Dss.PChars
+ RST ToDSS
+ ;
+ LD A,":"
+ LD (Buffers.bat_params.PRM9+1),A
+ XOR A
+ LD (Buffers.bat_params.PRM9+2),A ; Drive "X:",0
+ LD (read_disk_info.full),A
+ ;
+ LD C,Dss.CurDisk
+ RST ToDSS
+ LD B,C
+ LD C,-1
+ ;
+.loop: INC C
+ PUSH BC
+ LD A,C
+ LD (.patch_A),A
+ ADD "A"
+ LD (Buffers.bat_params.PRM9),A
+ LD (.Collect_Msg+1),A
+ ;
+ LD HL,.Collect_Msg
+ LD C,Dss.PChars
+ RST ToDSS
+ ;
+.patch_A+1: LD A,0
+ CALL read_disk_info
+ JR NC,.info_ok
+ ;
+ CP DSS_Error.sys.MEDIA_CHANGED
+ JR NZ,.Unsupported_Partition
+ ;
+ LD A,(.patch_A)
+ CALL read_disk_info
+ JR C,.Unsupported_Partition
+ ; %7 - Volume label
+ ; serial_string - Volume serial number string
+ ; full_space_high \
+ ; full_space_medium - Partition size
+ ; full_space_low /
+ ;
+.info_ok: LD HL,serial_string
+ LD DE,Buffers.bat_params.PRM4 ; Volume serial number string
+ CALL ncopy_string
+ ; full capacity
+ ld a,(full_space_high)
+ ld hl,(full_space_medium) ; ст. разряд
+ exx
+ ld hl,(full_space_low) ; мл. разряд
+.convert_hex: CALL PRN_DISK_SIZE
+ ; %5..6 - Full size
+ ;
+ ; форматирование PRM5
+ LD HL,Buffers.bat_params.PRM5 - 1
+ LD DE,Buffers.bat_params.PRM5
+.clear_spaces: INC HL
+ LD A,(HL)
+ CP " "
+ JR Z,.clear_spaces
+ AND A
+ CALL NZ,copy_string
+ ;
+.print_info_2: LD DE,MAIN_MSG.INFO_2 ; индекс "Drive Label Serial number Size"
+ CALL ECHO_MESSAGE
+ ;
+.next_drv: POP BC
+ DJNZ .loop
+ ;
+ LD A,"\n"
+ LD C,Dss.PutChar
+ RST ToDSS
+ JP RESTORE_ALL.path
+ ;RET
+ ;
+.Unsupported_Partition:
+ LD HL,.none_string
+ LD DE,Buffers.bat_params.PRM4 ; Volume serial number string
+ CALL ncopy_string
+ LD HL,.none_string
+ LD DE,Buffers.bat_params.PRM7 ; Volume label
+ CALL ncopy_string
+ LD HL,.Unknown_str
+ LD DE,Buffers.bat_params.PRM8 ; Volume file system
+ CALL ncopy_string
+ ;
+ POP BC
+ PUSH BC
+ LD A,C
+ CP "C" - "A"
+ JR C,.ItIsFDD
+ ;
+ LD DE,Dss.DRV.GenIOCTL.Enter
+ LD BC,Dss.DRV.GenIOCTL.GetParams
+ RST ToDSS.DRV
+ JR C,.noMedia
+ LD A,H
+ AND %1111'0000 ; проверка на номер сектора > 28bit = нет носителя
+ JR Z,.calc_size
+ ;
+.ItIsFDD: ;
+.noMedia: LD HL,.Unknown_str
+ LD DE,Buffers.bat_params.PRM5 ; Drive size
+ CALL ncopy_string
+ JR .print_info_2
+
+/*
+312 585 200
+ A H L D E
+0000 0000. 0001 0010. 1010 0001. 1010 1011. 1111 0000.
+0000 1001. 0101 0000. 1101 0101. 1111 1000. 0000 0000. 128
+0001 0010. 1010 256
+0010 0101. 512
+1001 0101 2048
+
+*/
+; максимальный размер сектора для перевода в байты - 2048; !FIXIT ; [ ] sector size
+; HL:DE * sector_size = A:H'L':HL
+.calc_size: LD A,B
+ CP #FF
+ JR Z,.ItIsFDD
+ AND A
+ JR Z,.ItIsFDD
+ ;
+ RRA
+ JR C,.s128
+ RRA
+ JR C,.set_regs
+ ;
+.RL_LOOP: RL E
+ RL D
+ RL L
+ RL H
+ RRA
+ JR NC,.RL_LOOP
+ ;XOR A
+ ;
+.set_regs: EXX
+ LD L,A
+ EXX
+ ;
+ LD A,H
+ EX AF,AF
+ LD A,E
+ LD H,L
+ LD L,D
+ EXX
+ LD H,A
+ EX AF,AF
+ JP .convert_hex
+ ;
+.s128: ; A = 0
+ SRL H
+ RR L
+ RR D
+ RR E
+ RRA
+ JR .set_regs
+
+
+
+
+; ; HL:DE * 512 = A:H'L':HL ;!HARDCODE sector size
+; .calc_size: RL E
+; RL D
+; RL L
+; RL H
+; LD A,H
+; EX AF,AF
+; LD A,E
+; LD H,L
+; LD L,D
+; EXX
+; LD H,A
+; LD L,0
+; EX AF,AF
+; JR .convert_hex
+ ;
+.Collect_Msg: DZ " A: \r" ; патчится буква драйва в цикле
+.Unknown_str: DZ "unknown"
+.none_string: DZ "none"
+
+
+/*
+0 1 2 3 4 5 6 7
+01234567890123456789012345678901234567890123456789012345678901234567890123456789;
+Drive File System Label Serial number Size in bytes
+ C: FAT32 NO NAME xxxx-xxxx 147,102,629,888
+ D: FAT16 SP_SYS xxxx-xxxx 147,102,629,888
+ ;
+*/
diff --git a/SHELL/Commands/MKDIR.ASM b/SHELL/Commands/MKDIR.ASM
new file mode 100644
index 0000000..141c4d1
--- /dev/null
+++ b/SHELL/Commands/MKDIR.ASM
@@ -0,0 +1,19 @@
+;///////////////////////////////////////////////////
+;
+; MD, MKDIR. Создать папку
+;
+;///////////////////////////////////////////////////
+cmd_mkdir:
+ ld c,Dss.MkDir ; создать папку
+ push bc
+ jp cmd_rmdir.shared
+
+ ; ex de,hl
+ ; ld de,Buffers.work.buffer1;
+ ; ld c,Dss.GSwitch ; выделить параметр ком-строки
+ ; RST ToDSS
+ ; ld hl,Buffers.work.buffer1 ; имя папки
+ ; ld c,Dss.MkDir ; создать папку
+ ; RST ToDSS
+ ; call c,print_err_message ; вывод сообщения
+ ; ret
diff --git a/SHELL/Commands/PATH.ASM b/SHELL/Commands/PATH.ASM
new file mode 100644
index 0000000..c7faa99
--- /dev/null
+++ b/SHELL/Commands/PATH.ASM
@@ -0,0 +1,49 @@
+T858C: db "PATH=",0 ; строка
+
+;///////////////////////////////////////////////////
+;
+; PATH. Установка пути
+;
+;///////////////////////////////////////////////////
+cmd_path:
+ ld a,(de) ; ком-строка
+ or a
+ jr z,A85B9 ; аргументов не было
+ ; уст. путь
+ inc de
+ cp 9 ; Tab
+ jr z,cmd_path
+ cp " "+1
+ jr c,cmd_path
+ dec de
+ ex de,hl
+ dec hl
+ ld (hl),"="
+ dec hl
+ ld (hl),"H"
+ dec hl
+ ld (hl),"T"
+ dec hl
+ ld (hl),"A"
+ dec hl
+ ld (hl),"P" ; начало строки имени
+ ld bc,Dss.Environ.Set ; устан./удалить перем. окружения
+ RST ToDSS
+ call c,print_err_message ; вывод сообщения
+ ret
+
+; Показать системный путь
+A85B9: ;ld de,T9186 ; куда
+ ld de,Buffers.work.buffer1;
+ ld hl,T858C ; имя переменной "PATH="
+ ld bc,Dss.Environ.Get ; получить переменную окружения
+ RST ToDSS
+ jp c,print_err_message ; вывод сообщения
+ ld hl,T858C ; "PATH=",0
+ ld c,Dss.PChars
+ RST ToDSS
+ ;ld hl,T9186 ; строка
+ ld hl,Buffers.work.buffer1;
+ ld c,Dss.PChars
+ RST ToDSS
+ jp newline
diff --git a/SHELL/Commands/PAUSE.ASM b/SHELL/Commands/PAUSE.ASM
new file mode 100644
index 0000000..0c39baf
--- /dev/null
+++ b/SHELL/Commands/PAUSE.ASM
@@ -0,0 +1,22 @@
+;///////////////////////////////////////////////////
+;
+; PAUSE. Пауза (в bat-файле)
+;
+;///////////////////////////////////////////////////
+cmd_pause:
+ LD de,MAIN_MSG.PAUSE ; индекс "Press any key to continue ..."
+ CALL ECHO_MESSAGE ; вывод строки
+ LD A,LF
+ LD C,Dss.PutChar
+ RST ToDSS
+ LD A,R
+ PUSH AF
+ LD C,Dss.WaitKey ; ждем нажатия клавиши
+ EI
+ RST ToDSS
+ POP AF
+ DI
+ RET PO
+ EI
+ RET
+ ;ret
diff --git a/SHELL/Commands/REM.ASM b/SHELL/Commands/REM.ASM
new file mode 100644
index 0000000..4bba462
--- /dev/null
+++ b/SHELL/Commands/REM.ASM
@@ -0,0 +1,10 @@
+;///////////////////////////////////////////////////
+;
+; REM. Комментарий (в bat-файле)
+;
+;///////////////////////////////////////////////////
+cmd_rem:; [x] 15/12/23 может и не понадобится
+ AND A
+ ;
+ ret
+;
diff --git a/SHELL/Commands/REN.ASM b/SHELL/Commands/REN.ASM
new file mode 100644
index 0000000..4e6c82f
--- /dev/null
+++ b/SHELL/Commands/REN.ASM
@@ -0,0 +1,19 @@
+;///////////////////////////////////////////////////
+;
+; REN, RENAME. Переименовать файл
+;
+;///////////////////////////////////////////////////
+cmd_rename:
+ ex de,hl
+ ld de,Buffers.work.buffer1;
+ ld c,Dss.GSwitch
+ RST ToDSS
+ ld de,Buffers.work.buffer+256;
+ ld c,Dss.GSwitch
+ RST ToDSS
+ ld hl,Buffers.work.buffer1;
+ ld de,Buffers.work.buffer+256;
+ ld c,Dss.Rename
+ RST ToDSS
+ call c,print_err_message ; вывод сообщения
+ ret
diff --git a/SHELL/Commands/RMDIR.ASM b/SHELL/Commands/RMDIR.ASM
new file mode 100644
index 0000000..62b4867
--- /dev/null
+++ b/SHELL/Commands/RMDIR.ASM
@@ -0,0 +1,18 @@
+;///////////////////////////////////////////////////
+;
+; RD, RMDIR. Удалить папку
+;
+;///////////////////////////////////////////////////
+cmd_rmdir: ld c,Dss.RmDir ; создать папку
+ push bc
+ ;
+.shared: ex de,hl
+ ld de,Buffers.work.buffer1;
+ ld c,Dss.GSwitch ; выделить параметр ком-строки
+ RST ToDSS
+ ld hl,Buffers.work.buffer1 ; имя папки
+ POP BC
+ RST ToDSS
+ ret nc
+ JP print_err_message ; вывод сообщения
+;
diff --git a/SHELL/Commands/Reboot.asm b/SHELL/Commands/Reboot.asm
new file mode 100644
index 0000000..334eca3
--- /dev/null
+++ b/SHELL/Commands/Reboot.asm
@@ -0,0 +1,10 @@
+;R12
+cmd_reboot: DI
+ LD C,BIOS.FullInit
+ RST ToBIOS
+ LD BC,BIOS.REINIT.SOFT_RESET
+ RST ToBIOS
+
+ DI
+ HALT
+;R12
\ No newline at end of file
diff --git a/SHELL/Commands/SET.ASM b/SHELL/Commands/SET.ASM
new file mode 100644
index 0000000..3eba9b9
--- /dev/null
+++ b/SHELL/Commands/SET.ASM
@@ -0,0 +1,35 @@
+;///////////////////////////////////////////////////
+;
+; SET. Установить переменную окружения
+;
+;///////////////////////////////////////////////////
+cmd_set:ld a,(de) ; ком-строка
+ or a
+ jr z,A85EE ; пустая
+ ; уст. переменную окружения
+ inc de
+ cp 9
+ jr z,cmd_set
+ cp " "+1
+ jr c,cmd_set
+ dec de
+ ex de,hl
+ ld bc,Dss.Environ.Set
+ RST ToDSS
+ call c,print_err_message ; вывод сообщения
+ ret
+
+; Показать системное окружение
+A85EE: ;ld hl,T9186 ; куда
+ ld hl,Buffers.work.buffer1;
+ ld bc,Dss.Environ.Read ; получить сист. окружение
+ RST ToDSS
+ ;ld hl,T9186
+ ld hl,Buffers.work.buffer1;
+A85F8: ld c,Dss.PChars
+ RST ToDSS
+ call newline
+ ld a,(hl)
+ or a ; конец сист. окружения ?
+ jr nz,A85F8 ; нет
+ ret
diff --git a/SHELL/Commands/VER.ASM b/SHELL/Commands/VER.ASM
new file mode 100644
index 0000000..443154d
--- /dev/null
+++ b/SHELL/Commands/VER.ASM
@@ -0,0 +1,47 @@
+;///////////////////////////////////////////////////
+;
+; VER, VERSION. Вывод версии ДОС
+;
+;///////////////////////////////////////////////////
+cmd_version:
+ LD C,Dss.Version
+ RST ToDSS
+ LD L,D
+ LD H,E
+ LD DE,Buffers.bat_params.PRM1
+ CALL .Set_Ver_to_PRM ; set DSS version
+ ;R13
+ LD HL,256*CONSOLE_MODF + CONSOLE_VERS
+ LD BC,CONSOLE_BUILD
+ LD DE,Buffers.bat_params.PRM2
+ CALL .Set_Ver_to_PRM ; set Shell version
+ ;R13
+ LD DE,MAIN_MSG.VERSION
+ JP ECHO_MESSAGE
+
+; Вход:
+; L - номер версии (0..9)
+; H - номер модификации (0..99)
+; BC - номер билда (0..999)
+; DE - номер параметра
+.Set_Ver_to_PRM:
+ PUSH BC
+ PUSH HL
+ LD H,0
+ CALL hex2dec_ascii_16bit.n10 ;decim2 номер версии (0..9)
+ LD A,'.'
+ LD (DE),A
+ INC DE
+ POP HL
+ LD L,H
+ LD H,0
+ CALL hex2dec_ascii_16bit.n10 ;decim2 номер модификации (0..99)
+ POP HL
+ LD A,'.'
+ LD (DE),A
+ INC DE
+ CALL hex2dec_ascii_16bit.n100 ;decim3 номер билда (0..999)
+ XOR A
+ LD (DE),A
+ RET
+;
\ No newline at end of file
diff --git a/SHELL/EDLINE.ASM b/SHELL/EDLINE.ASM
new file mode 100644
index 0000000..fc778ee
--- /dev/null
+++ b/SHELL/EDLINE.ASM
@@ -0,0 +1,1009 @@
+; Расчитана на функцию #32 ДОС с новым курсором.
+;
+
+; Функция строки редактирования. Имеет историю вводимых строк.
+; Функция использует для своей работы временный буфер:
+;
+; Buffers.work.buffer - этот буфер использует история
+; ;Buffers.work.buffer+256 - возвращается набранная строка
+;
+; Клавиши:
+; Esc - сбросить текущую строку
+; Enter - выход из функции (в Buffers.work.buffer+256 готовая строка)
+; Ins - смена режима ввода (вставка/замена)
+; , курсор - прокрутка истории
+; PageUp - в начало истории
+; PageDown - в конец истории
+; Ctrl+Del - стереть историю
+;
+;
+; Используется как заготовка для шелла ДОС. Выводит системный путь.
+; Макс. длина экран. пути 34 символа (с диском), остальное обрезается.
+;
+
+
+
+
+;true equ 1
+;false equ 0
+
+max_screen_path equ 32 ; макс. длина экран. пути (без диска)
+max_len_comline equ 254 ; макс. длина ком-строки (больше не делать)
+history_size equ 256 ; размер history-буфера
+
+; события (внутренние)
+evNothing equ 0 ; нет событий
+evKeyboard equ 1 ; нажата обычная клавиша
+evCombKey equ 2 ; нажата комбин. клавиш или курсорные
+
+
+
+
+
+
+;===========================================================
+; Строка редактирования
+;
+; Выход из строки по клавише ,
+; ;в Buffers.work.buffer+256 = набранная строка (или пустая)
+;===========================================================
+input_line:
+ ld a,1
+ ld (insert_mode),a
+ ld c,BIOS.LP_GET_PLACE ; узнать полож. курсора
+ RST ToBIOS
+ ld e,4 ; X начало
+ ld (YXpos),de ; Y/X начало ком-строки
+ ld (cursor_position),de ; Y/X позиция курсора
+ call clear_inpline ; очистить структуру ~input line~
+ call print_compath ; вывести путь + новая ширина поля ввода
+ jp event_input_line ; на обраб. строки ввода
+
+
+
+
+;---------------------------------------------------------------
+; Вывод пути в ком-строке на экран + новая ширина поля ввода
+;---------------------------------------------------------------
+print_compath:
+ ld hl,Buffers.sys_path ; сист. путь
+ ld de,Buffers.screen_path+2 ; буфер для короткого пути
+ call make_short_path
+ xor a
+ ld (de),a ; зануление строки
+ ex af,af' ; восст. длину строки
+ add a,2 ; + длина "X:"
+ ld b,a
+ inc a
+ ld (YXpos),a ; X начало ком-строки
+ ld a,width_inpline.MAX-1 ; ширина экрана - 1
+ sub b
+ ld (width_inpline),a ; новая ширина поля ввода (76..48)
+ push bc
+ ; очистить экран. строку
+ ld de,(cursor_position) ; Y/X полож.
+ ld e,0
+ ld hl,#0150 ; Y/X размер ;!HARDCODE win size
+ ld a,(color_screen) ; атрибут
+ ld b,a
+ ld a," " ; символ очистки
+ ld c,Dss.Clear ; очистить окно
+ RST ToDSS
+ pop bc
+ ; вывести экран. путь
+ ld hl,Buffers.screen_path ; экран. путь
+ ;call print_inpchar ; вывод строки по счетчику
+ ld c,BIOS.LP_PRINT_LINE2
+ RST ToBIOS;
+ ld a,">"
+ ld bc,1*256 + BIOS.LP_PRINT_SYM ; символ без атрибута
+ RST ToBIOS
+ ;jr print_inpline ; вывод строки ввода
+ ;-------------------------------------------------
+ ; Вывод строки ~input line~ на экран
+ ;-------------------------------------------------
+print_inpline:
+ ld de,(YXpos) ; Y/X начало ком-строки
+ ld c,Dss.Locate ; уст. курсор
+ RST ToDSS
+ ld hl,Buffers.input_line ; структура буфера ~input line~
+ push hl
+ pop iy
+ ld a,(iy + Input_Line.Left_Shift) ;+3 смещ. строки за левый край
+ add a,l
+ ld l,a
+ jr nc,$+3 ; !FIXIT
+ inc h
+ inc hl
+ inc hl
+ inc hl
+ inc hl
+ inc hl
+ ld a,(width_inpline) ; ширина поля
+ ld c,a
+ ld b,a
+ push bc
+ xor a
+ ld de,Buffers.work.buffer ; врем. буфер
+ push de
+ ld (de),a
+ inc de
+ djnz $-2 ; !FIXIT
+ ld a,(iy + Input_Line.max_Len)
+ sub (iy + Input_Line.Left_Shift)
+ cp c
+ jr nc,$+3 ; !FIXIT
+ ld c,a
+ ld a,(iy + Input_Line.Symbols_Num) ; число введ. символов
+ sub c
+ jr nc,$+4 ; !FIXIT
+ add a,c
+ ld c,a
+ pop de
+ push de
+ ld a,b
+ or c
+ jr z,$+4 ; !FIXIT
+ ldir
+ pop hl
+ pop bc
+ ld a,b ; длина строки
+ or a
+ ;call nz,print_inpchar ; вывод строки по счетчику
+ ld c,BIOS.LP_PRINT_LINE2
+ call nz,ToBIOS
+ ld a,(YXpos) ; X начало ком-строки
+ ld e,(iy + Input_Line.Cur_X) ;+2 тек. полож. курсора в строке
+ add a,e
+ cp width_inpline.MAX ; ширина экрана
+ jr c,prne1__
+ ld b,width_inpline.MAX-1
+ sub b
+ ld d,a ; "наезд" за правый край
+ ld a,e
+ sub d
+ ld (iy + Input_Line.Cur_X),a ;+2 новое полож. курсора
+ ld a,b
+prne1__:ld (cursor_position),a ; X полож. курсора на экране
+ ret
+
+; вход: HL - полный путь
+; DE - буфер для короткой строки пути
+make_short_path:; узнать длину сист. пути
+ ld (.bufferAddr),de
+ ld e,l
+ ld d,h
+ ld bc,max_len_comline ; 254
+ xor a
+ ld (.flag),a ; сбр. флаг
+ cpir
+ dec hl
+ push hl ; сохр. конец пути
+ sbc hl,de
+ ld a,l ; длина строки
+ cp max_screen_path+1 ; 33
+ jr c,.copy
+ ; длина пути > 32
+ ld a,max_screen_path ; 32
+ ld (.flag),a ; уст. флаг
+.copy: ld c,a ; полная длина строки
+ ld b,0
+ ex af,af' ; сохр. длину строки
+ pop hl ; восст. конец пути
+.bufferAddr+1: ld de,0 ; куда
+ ; скопировать строку
+ and a
+ sbc hl,bc ; hl=начало перекачки
+ ldir
+.flag+1: ld a,0 ; флаг переполн. строки
+ or a
+ ret z
+ ld hl,(.bufferAddr)
+ ld (hl),'\'
+ inc hl
+ ld a,"."
+ ld (hl),a
+ inc hl
+ ld (hl),a
+ ret
+
+; Вывод строки по счетчику
+;print_inpchar:
+ ;ld a,(hl)
+ ;inc hl
+ ;push hl
+ ;push bc
+ ;ld bc,0182h
+ ;RST ToBIOS
+; ld c,86h
+; RST ToBIOS
+ ;pop bc
+ ;pop hl
+ ;djnz print_inpchar
+; ret
+
+
+
+
+;-------------------------------------------------
+; Чтение событий
+;-------------------------------------------------
+handle_event:
+cursor_position+1:
+ ld de,0
+ ;
+ ld c,Dss.Locate
+ RST ToDSS
+ ld c,Dss.EchoKey ; опрос клавы
+ RST ToDSS
+ ld hl,what ; поле событий
+ ld a,e
+ or a
+ jr z,handle_event_comb
+ ld (hl),evKeyboard ;+0 событие
+ inc hl
+ ld (hl),e ;+1 код клавиши
+ inc hl
+ ld (hl),d ;+2 скен-код клавиши
+ ret
+handle_event_comb:
+ ld (hl),evCombKey ;+0 событие
+ inc hl
+ ld (hl),b ;+1 флаги клавы
+ inc hl
+ ld (hl),d ;+2 код курс. клавиш
+ ret
+
+; поле событий
+what: ds 3
+
+step_scroll equ 1 ; шаг X скроллинга строки
+
+
+;=================================================
+; Обработчик событий ~Input Line~
+;=================================================
+event_input_line:
+ call handle_event ; читаем событие
+ ld hl,event_input_line
+ push hl
+ ld iy,Buffers.input_line ; структура буфера ~input line~
+ ld hl,what ; список событий
+ ld a,(hl)
+ inc hl
+ cp evKeyboard
+ jr z,EvComKeys
+ cp evCombKey
+ jp z,EvComComb
+ ret
+
+;
+Enter: pop hl ; восст. баланс стека (выход из обработчика)
+ xor a
+ ;ld (Buffers.work.buffer+256),a ; задать пустую строку
+ ld hl,Buffers.input_line.Symbols_Num ; число введ. символов
+ ld e,(hl)
+ cp e
+ ret z ; пустая строка
+ ld c," " ; пробел
+ ld d,a
+ add hl,de
+ ld a,(hl)
+ cp c
+ jr nz,ent1__ ; нет конц. пробелов
+ ld b,e
+ ; убрать конц. пробелы ком-строки
+ ld a,(hl)
+ cp c
+ jr nz,$+8 ;!FIXIT $
+ dec hl
+ dec (iy+4) ; --число введ. символов
+ djnz $-8 ;!FIXIT $
+ inc hl
+ ld (hl),d ; в конец ком-строки
+ ld a,b
+ or a
+ ret z ; были одни пробелы
+ ld de,Buffers.input_line.Symbols_Num ; число введ. символов
+ ld (de),a ; новое число (для history_adding)
+ent1__: call history_adding ; добавить строку в history
+ ; скопир. строку во врем. буфер
+; ld hl,Buffers.input_line.Symbols_Num ; откуда
+; ld de,Buffers.work.buffer+254 ; куда
+; ld a,(hl) ; скопир. строку (с нулем)
+; ldi
+; or a
+; jr nz,$-4
+ ;call clear_input_line ; очистить строку ввода
+; ld a,(YXpos+1); ; Y начало ком-строки
+; inc a
+; cp 32
+; jr c,$+3
+; xor a
+; ld (YXpos+1),a;
+ ; восст. буфер
+; ld hl,Buffers.work.buffer+254 ; откуда
+; ld de,Buffers.input_line.Symbols_Num ; куда
+; ld a,(hl) ; скопир. строку (с нулем)
+; ldi
+; or a
+; jr nz,$-4
+ ; уст. историю на посл. пустую строку
+ ld a,(history_count) ; число строк в истории
+ ld (history_cur_string),a ; номер тек. строки истории
+ ret
+
+
+; Событие - обычная клавиша
+EvComKeys:
+ ld a,(hl) ;+1 what
+ cp #1B ; Esc
+ jp z,clear_input_line ; очистить строку ввода
+ cp #0D ; Enter
+ jr z,Enter
+ cp 8 ; Backspace
+ jr z,inpline_work
+ cp " "
+ ret c
+inpline_work:
+ ld de,input_line_done
+ push de
+ ld hl,Buffers.input_line ; структура буфера ~input line~
+ ex af,af'
+ res 7,(iy + Input_Line.ReadyString) ;+1 флаг ReadyString
+ ld a,(insert_mode) ; режим ввода: 1-inser, 0-overwrite
+ and 1
+ rrca ; вправо (мл.бит -> перенос)
+ or (iy + Input_Line.ReadyString)
+ ld (iy + Input_Line.ReadyString),a ;+1 флаг ReadyString
+ ex af,af'
+ cp 8 ; Backspace
+ jp z,back_space
+ ex af,af'
+ ld a,(iy + Input_Line.Symbols_Num) ; InputSymb
+ cp (iy + Input_Line.max_Len)
+ jr nz,ILn___
+ ld a,(iy + Input_Line.Cur_X)
+ add a,(iy + Input_Line.Left_Shift)
+ cp (iy + Input_Line.max_Len)
+ ;ret nc
+ JR NC,LastChar_BEEP
+ bit 7,(iy + Input_Line.ReadyString)
+ ;ret nz
+ JR NZ,NoMoreChars_BEEP
+ILn___: ld a,(iy + Input_Line.Symbols_Num)
+ sub (iy + Input_Line.Left_Shift)
+ sub (iy + Input_Line.Cur_X)
+ jr z,no_insert
+ dec (iy + Input_Line.Symbols_Num)
+ bit 7,(iy + Input_Line.ReadyString)
+ jr z,no_insert
+ inc (iy + Input_Line.Symbols_Num)
+ ; ввод в середину текста (вставка)
+ ld c,a
+ ld b,0
+ ld hl,Buffers.input_line ; структура буфера ~input line~
+ ld a,(iy + Input_Line.Symbols_Num) ;+4 число введ. символов
+ add a,l
+ ld l,a
+ jr nc,$+3 ;!FIXIT
+ inc h
+ inc hl
+ inc hl
+ inc hl
+ inc hl
+ inc hl
+ ld d,h
+ ld e,l
+ dec hl
+ lddr
+no_insert:
+ ld hl,Buffers.input_line ; структура буфера ~input line~
+ ld a,(iy + Input_Line.Cur_X) ; X тек. полож. курсора в строке
+ add a,(iy + Input_Line.Left_Shift)
+ add a,l
+ ld l,a
+ jr nc,$+3 ;!FIXIT
+ inc h
+ inc hl
+ inc hl
+ inc hl
+ inc hl
+ inc hl
+ ex af,af'
+ ld (hl),a ; сохр. символ в строке
+ inc (iy + Input_Line.Symbols_Num)
+ inc (iy + Input_Line.Cur_X)
+ ld a,(width_inpline) ; ширина поля ввода
+ cp (iy + Input_Line.Cur_X) ; X тек. полож. курсора в пределах строки
+ jr nz,$+8 ;!FIXIT
+ ; курсор за полем
+ inc (iy + Input_Line.Left_Shift) ; смещ. строки за левый край
+ dec (iy + Input_Line.Cur_X) ; X тек. полож. курсора в пределах строки
+ call print_inpline ; вывести строку на экран
+ pop de ; восст. баланс стека
+input_line_done:
+ ret
+LastChar_BEEP:
+ ;!TODO если символы привысили максимальное число, то на экране
+ ; в строке остаётся эхо нажатой клавиши, которая не влезла
+ ; и висит до нажатия очередной клавиши. Исправить.
+ LD A,7 ;ASCII BELL
+ LD C,Dss.PutChar
+ JP ToDSS
+
+NoMoreChars_BEEP:
+ ;!TODO если символы привысили максимальное число, то на экране
+ ; в строке остаётся эхо нажатой клавиши, которая не влезла
+ ; и висит до нажатия очередной клавиши. Исправить.
+ LD A,7 ;ASCII BELL
+ LD C,Dss.PutChar
+ JP ToDSS
+
+; Событие - курс. клавиши или комбинации
+EvComComb:
+ ld b,(hl) ;+1 what
+ inc hl
+ ld a,(hl) ;+2 what
+ ld hl,Buffers.input_line ; структура буфера ~input line~
+ ld de,input_line_done ; точка выхода
+ push de
+ cp #54 ; курсор влево
+ jr z,Left
+ cp #56 ; курсор вправо
+ jr z,Right
+ cp #58 ; курсор вверх, пред. строка истории
+ jp z,history_prev
+ cp #52 ; курсор вниз, след. строка истории
+ jp z,history_next
+ cp #59 ; PageUp, в начало истории
+ jp z,history_begin
+ cp #53 ; PageDown, в конец истории
+ jp z,history_last
+ cp #4F ; Del, удалить символ в тек. позиции
+ jp z,Delete
+ cp #57 ; Home, в начало строки
+ jp z,Home
+ cp #51 ; End, в конец строки
+ jp z,End1
+ cp #50 ; Ins, смена режима ввода
+ jr z,change_insert_mode
+ bit 5,b ; Ctrl бит
+ jr z,.exit
+ cp #4F+#80 ; Ctrl+Del, очистить историю команд
+ jp z,clear_history
+.exit: pop de
+ ret
+
+; Смена режима ввода
+change_insert_mode:
+ ld a,(insert_mode)
+ xor 1
+ ld (insert_mode),a
+ ret
+
+; Курсор влево
+Left: ld a,(iy + Input_Line.Cur_X)
+ dec a
+ jp p,ComPrint
+ ld a,(iy + Input_Line.Left_Shift) ; смещ. строки за левый край
+ sub step_scroll ; шаг скроллинга
+ ret c ; курсор в крайнем левом полож.
+ ld (iy + Input_Line.Left_Shift),a ; X смещ. строки за левый край (в символах)
+ ld a,(iy + Input_Line.Cur_X) ; X полож. курсора в пределах строки
+ add a,step_scroll-1 ; шаг скроллинга
+ComPrint:
+ ld (iy + Input_Line.Cur_X),a
+ jp print_inpline ; вывести строку на экран
+
+; Курсор вправо
+Right: ld a,(iy + Input_Line.Cur_X) ; X полож. курсора в пределах строки
+ add a,(iy + Input_Line.Left_Shift) ; смещ. строки за левый край
+ cp (iy+4) ; число введ. символов
+ ret z
+ ld a,(width_inpline) ; ширина поля ввода
+ ld b,a
+ ld a,(iy + Input_Line.Cur_X) ; X полож. курсора в пределах строки
+ inc a
+ cp b
+ jr nz,ComPrint
+ inc (iy + Input_Line.Left_Shift) ; смещ. строки за левый край
+ ld a,(iy + Input_Line.Cur_X) ; X полож. курсора в пределах строки
+ sub step_scroll-1 ; шаг скроллинга
+ jr ComPrint
+
+; Backspace - удалить символ левее курсора
+back_space:
+ ld a,(iy + Input_Line.Cur_X) ; X тек. полож. курсора в строке
+ or a
+ jr nz,back_space1
+ ld a,(iy + Input_Line.Left_Shift) ; смещ. строки за левый край
+ sub step_scroll ; шаг скроллинга
+ ret c
+ ld (iy + Input_Line.Left_Shift),a
+ inc (iy + Input_Line.Cur_X) ;+2 тек. полож. курсора в строке
+back_space1:
+ ld hl,Buffers.input_line ; структура буфера ~input line~
+ ld a,(iy + Input_Line.Cur_X) ;+2 X тек. полож. курсора в строке
+ add a,(iy + Input_Line.Left_Shift) ;+3 смещ. строки за левый край
+ add a,l
+ ld l,a
+ jr nc,$+3 ;!FIXIT
+ inc h
+ inc hl
+ inc hl
+ inc hl
+ inc hl
+ inc hl
+ ld d,h
+ ld e,l
+ dec de
+ ld a,(iy + Input_Line.Symbols_Num) ;+4 число введ. символов
+ sub (iy + Input_Line.Left_Shift) ; смещ. строки за левый край
+ sub (iy + Input_Line.Cur_X) ; X полож. курсора в пределах строки
+ jr z,$+7 ; курсор за концом строки ;!FIXIT
+ ld c,a
+ ld b,0
+ ldir ; обновить остаток строки
+ xor a
+ ld (de),a ; в конец строки
+ dec (iy + Input_Line.Cur_X) ; X полож. курсора в пределах строки
+ dec (iy + Input_Line.Symbols_Num) ; число введ. символов
+ jp print_inpline ; вывести строку на экран
+
+; Delete - удалить символ в тек. позиции
+Delete: ld hl,Buffers.input_line ; структура буфера ~input line~
+ ld a,(iy + Input_Line.Cur_X) ; X тек. полож. курсора в строке
+ inc a
+ add a,(iy + Input_Line.Left_Shift) ; смещ. строки за левый край
+ add a,l
+ ld l,a
+ jr nc,$+3 ;!FIXIT
+ inc h
+ inc hl
+ inc hl
+ inc hl
+ inc hl
+ inc hl
+ ld d,h
+ ld e,l
+ dec de
+ ld a,(iy + Input_Line.Symbols_Num) ;+4 число введ. символов
+ sub (iy + Input_Line.Left_Shift) ; смещ. строки за левый край
+ sub (iy + Input_Line.Cur_X) ; X тек. полож. курсора в строке
+ ret z ; курсор за концом строки
+ ld c,a
+ ld b,0
+ ldir ; обновить остаток строки
+ xor a
+ ld (de),a ; в конец строки
+ dec (iy + Input_Line.Symbols_Num) ; число введ. символов
+ jp print_inpline ; вывести строку на экран
+
+; Home - в начало строки
+Home: ld a,(iy + Input_Line.Cur_X) ; X тек. полож. курсора в строке
+ add a,(iy + Input_Line.Left_Shift) ; смещ. строки за левый край
+ ret z
+ xor a ; X полож. курсора
+ ld (iy + Input_Line.Cur_X),a ; X полож. курсора в пределах строки
+ ld (iy + Input_Line.Left_Shift),a ; смещ. строки за левый край
+ jp ComPrint ; вывести строку на экран
+
+; End - в конец строки
+End1: ld a,(iy + Input_Line.Symbols_Num) ;+4 число введ. символов
+ sub (iy + Input_Line.Left_Shift) ;+3 смещ. строки за левый край
+ cp (iy + Input_Line.Cur_X) ;+2 X тек. полож. курсора в строке
+ ret z
+ add a,(iy + Input_Line.Left_Shift) ; смещ. строки за левый край
+ ld c,a
+ ld (iy + Input_Line.Left_Shift),0 ; смещ. строки за левый край
+ ld a,(width_inpline) ; ширина поля ввода
+ sub c
+ jr z,EndLp
+ jr nc,EndNIL
+ neg
+EndLp: inc (iy + Input_Line.Left_Shift) ; X смещ. строки за левый край
+ sub step_scroll ; шаг скроллинга
+ jr nc,EndLp
+EndNIL: ld a,(iy + Input_Line.Symbols_Num) ; число введ. символов
+ sub (iy + Input_Line.Left_Shift) ; смещ. строки за левый край
+ jp ComPrint ; вывести строку на экран
+
+
+
+
+; Очистить буфер строки
+clear_input_line:
+ call clear_inpline ; очистить структуру ~input line~
+ jp print_inpline ; вывести строку на экран
+
+
+; очистить структуру ~input line~
+clear_inpline:
+ xor a
+ ld hl,Buffers.input_line ; структура буфера ~input line~
+ ld b,(hl) ;+0 макс. длина строки
+ inc hl
+ ld (hl),a ;+1 сбр. флаг ReadyString
+ inc hl
+ ld (hl),a ;+2 X тек. полож. курсора в строке
+ inc hl
+ ld (hl),a ;+3 смещ. строки за левый край
+ inc hl
+ ld (hl),a ;+4 число введ. символов
+ cp b
+ ret z
+ inc hl ;+5 буфер редакт. строки
+ ld (hl),a
+ djnz $-2 ;!FIXIT
+ ret
+
+
+
+; Вставить строку из history-буфера
+; вход: de=структура строки: +0=длина строки, +1=строка
+put_from_history:
+ call clear_inpline ; очистить строку ввода
+ ld a,(de) ;+0 длина строки
+ ld c,a
+put_history_loop:
+ inc de
+ ld hl,Buffers.input_line ; структура буфера ~input line~
+ ld a,(iy + Input_Line.Cur_X) ; X тек. полож. курсора в строке
+ add a,(iy + Input_Line.Left_Shift)
+ add a,l
+ ld l,a
+ jr nc,$+3 ;!FIXIT
+ inc h
+ inc hl
+ inc hl
+ inc hl
+ inc hl
+ inc hl
+ ld a,(de)
+ ld (hl),a
+ inc (iy + Input_Line.Symbols_Num) ; число введ. символов
+ inc (iy + Input_Line.Cur_X) ; X тек. полож. курсора в строке
+ ld a,(width_inpline) ; ширина поля ввода
+ cp (iy + Input_Line.Cur_X) ; X тек. полож. курсора в пределах строки
+ jr nz,$+8 ;!FIXIT
+ ; курсор за правым краем поля ввода
+ inc (iy + Input_Line.Left_Shift) ; смещ. строки за левый край
+ dec (iy + Input_Line.Cur_X) ; X тек. полож. курсора в пределах строки
+ dec c
+ jr nz,put_history_loop
+ ; вывести строку на экран
+ jp print_inpline
+
+
+
+; Очистить историю команд
+clear_history:
+ call clear_input_line ; очистить строку ~input line~
+ xor a
+ ld (history_count),a ; число строк в history
+ ld (history_cur_string),a ; номер тек. строки history
+ ld hl,Buffers.history ; конец посл. строки
+ ld (history_end),hl
+ ret
+
+
+
+
+
+
+;========================================================================
+; History Код
+;========================================================================
+
+history_count:
+ db 0 ; число строк в истории
+ ;
+history_cur_string:
+ db 0 ; номер тек. строки истории
+ ;
+history_end:
+ dw Buffers.history ; конец послед. строки истории
+
+
+
+;-------------------------------------------------
+; В начало истории
+;-------------------------------------------------
+history_begin:
+ ld a,(history_count)
+ or a
+ ret z ; нет строк
+ xor a
+ ld (history_cur_string),a
+ jr history_copy ; перейти на 1-ю строку
+
+;-------------------------------------------------
+; В конец истории
+;-------------------------------------------------
+history_last:
+ ld a,(history_count)
+ or a
+ ret z ; нет строк
+ ld (history_cur_string),a ; уст. послед. пустую строку
+ jp clear_input_line ; вернуть пустую строку
+
+;-------------------------------------------------
+; Следующая строка
+;-------------------------------------------------
+history_next:
+ ld a,(history_count)
+ or a
+ ret z ; нет строк
+ dec a
+ ld b,a
+ ld hl,history_cur_string
+ ld a,(hl)
+ cp b
+ jr c,$+7 ;!FIXIT
+ inc b
+ ld (hl),b
+ jp clear_input_line ; вернуть пустую строку
+ ;
+ inc a
+ ld (hl),a
+ jr history_copy
+
+;-------------------------------------------------
+; Предыдущая строка
+;-------------------------------------------------
+history_prev:
+ ld a,(history_count)
+ or a
+ ret z ; нет строк
+ ld b,a
+ ld hl,history_cur_string
+ ld a,(hl)
+ or a
+ jr z,history_copy ; уперлись в начало истории
+ cp b
+ jr c,$+3 ;!FIXIT
+ ld a,b
+ dec a
+ ld (hl),a
+; перейти на строку по ее индексу
+history_copy:
+ call history_index
+ jp put_from_history ; строку из history в буфер ком-строки
+
+; вход: а=индекс строки
+; выход: de=строка (ее структура из history-буфера)
+history_index:
+ ld b,0
+ ld hl,Buffers.history ; буфер истории
+ or a ; индекс строки
+ jr z,hist_index ; 1-я строка истории
+ ld c,(hl) ; размер строки
+ inc c
+ add hl,bc ; на след. строку
+ dec a
+ jr nz,$-4 ;!FIXIT
+hist_index:
+ ex de,hl
+ ret
+
+
+;-----------------------------------------------------------
+; Добавить новую строку в конец буфера истории.
+; Если строка не влезает, удаляются самые старые строки до
+; тех пор, пока появится достаточно места для новой строки.
+;-----------------------------------------------------------
+history_adding:
+ ld de,Buffers.input_line.Symbols_Num ; структура строки
+ call history_compare ; сравнить строки
+ ret z ; уже есть такая строка
+ ld bc,(history_end) ; адрес конца посл. строки
+ ld hl,Buffers.history + history_size ; адрес конца буфера
+ and a
+ sbc hl,bc ; hl=размер своб. места
+ ld a,(de) ; длина новой строки
+ inc a
+ ld c,a
+ xor a
+ ld b,a
+ sbc hl,bc ; умещ. в своб. месте буфера истории ?
+ jr nc,history_add_ok ; да
+ ; удалить первую (самую старую) строку из буфера
+ ;push de
+ ld de,Buffers.history ; буфер истории
+ ld a,(de) ; длина 1-й строки
+ inc a
+ ld c,a
+ xor a
+ ld b,a
+ ld hl,(history_end)
+ sbc hl,bc
+ ld (history_end),hl ; конец посл. строки
+ ld l,e ; hl=history_buff
+ ld h,d
+ add hl,bc ; начало 2-й строки
+ push hl
+ ld hl,history_size ; размер буфера
+ and a
+ sbc hl,bc
+ ld c,l ; размер остатка буфера
+ ld b,h
+ pop hl ; начало 2-й строки
+ ldir
+ ld hl,history_count
+ dec (hl) ; --число строк в history
+ ;pop de ; восст. адрес Buffers.input_line.Symbols_Num
+ jr history_adding
+ ;
+history_add_ok:
+ ld hl,(history_end) ; адрес конца посл. строки
+ ex de,hl
+ ldir
+ ld (history_end),de ; конец посл. строки
+ ld hl,history_count
+ ld a,(hl)
+ ld (history_cur_string),a ; тек. строка history
+ inc (hl) ; ++число строк в history
+ ret
+
+
+; Сравнить строки. Если строки равны, то переместить
+; тек. строку в конец истории.
+; вход: de=структура строки: +0=длина строки, +1=строка
+; выход: Z-есть строка
+; NZ-нет строки
+history_compare:
+ ld hl,history_count
+ ld b,(hl) ; число строк в history
+ dec b
+ inc b
+ jr z,hist_comp_quit ; history-буфер пустой
+ ex af,af'
+ xor a ; сбр. индекс сравн. строки
+ ex af,af'
+ ld hl,Buffers.history ; буфер истории
+history_comp_loop:
+ push de
+ ld (move_cur_str+1),hl ; тек. строка истории
+ ld c,(hl) ; длина тек. строки history
+ ld a,(de) ; длина новой строки
+ inc hl
+ inc de
+ cp c
+ jr z,hist_comp_loop ; строки одинаковой длины
+ ld a,l
+ add a,c
+ ld l,a
+ ld a,h
+ adc a,0
+ ld h,a
+ jr hist_comp_next
+ ;
+; сравнить строки
+hist_comp_loop:
+ ld a,(de)
+ cp (hl)
+ jr nz,hist_comp_notequal ; строки не равны
+ inc hl
+ inc de
+ dec c
+ jr nz,hist_comp_loop
+ ; строки равны
+ jr move_to_end_history ; найденную строку в конец истории
+ ;
+hist_comp_notequal:
+ inc hl
+ dec c
+ jr nz,$-2 ; до конца строки ;!FIXIT $
+hist_comp_next:
+ pop de
+ ex af,af'
+ inc a ; ++индекс сравн. строки
+ ex af,af'
+ djnz history_comp_loop
+hist_comp_quit:
+ xor a
+ dec a ; NZ-флаг
+ ret
+
+; переместить тек. строку в конец истории
+move_to_end_history:
+ ld a,(history_count) ; число строк истории
+ ld c,a
+ dec c
+ ex af,af' ; индекс найденной строки
+ cp c
+ jr nc,not_move_to_end ; найденная строка уже в конце
+ ; сохр. строку во врем. буфере
+move_cur_str:
+ ld hl,0 ; тек. строка истории
+ ld de,Buffers.work.buffer ; врем. буфер
+ ld c,(hl) ;+0 длина строки
+ inc c ; учесть ячейку длины строки
+ xor a
+ ld b,a
+ push bc
+ push hl
+ ldir
+ pop de ; куда (на место старой строки)
+ pop bc
+ ; сдвинуть остаток буфера на место сохр. строки
+ push hl
+ ld hl,(history_end) ; конец посл. строки истории
+ and a
+ sbc hl,de
+ and a
+ sbc hl,bc
+ ld c,l ; величина сдвига
+ ld b,h
+ pop hl ; откуда
+ ldir
+ ; восст. строку из врем. буфера в конец истории
+ ld hl,Buffers.work.buffer ; врем. буфер
+ ld c,(hl)
+ inc c
+ ld b,a
+ ldir
+not_move_to_end:
+ ld a,(history_count)
+ dec a
+ ld (history_cur_string),a ; тек. строка history
+ pop de
+ xor a ; Z флаг
+ ret
+
+
+
+
+
+;!FIXIT к буферам почти всё
+////////////////////////////////////////////////////////////////////////
+; 1 0
+;cursor_position:
+; dw 0 ; Y/X полож. курсора
+
+; 2 0
+width_inpline:
+.MAX EQU 80
+ db width_inpline.MAX-4 ; тек. ширина поля ввода
+
+; 3 0
+YXpos: dw 0 ; Y/X начало ком-строки
+
+; 4 0
+; режим ввода
+insert_mode:
+ db 1 ; 01/00 inser/overwrite
+
+; 5 0
+; экранный путь
+; screen_path:
+; db "A:"
+; BLOCK max_screen_path+1,0 ; 32+1
+
+; 6 0
+; системный путь
+; system_path:
+; BLOCK 256,0 ;!HARDCODE
+
+; ; 7 0
+; ; Структура строки ввода ~input line~
+; Buffers.input_line.:
+; db max_len_comline ;+0 254 макс. число ввод. символов
+; db 0 ;+1 флаг ReadyString
+; db 0 ;+2 X тек. полож. курсора в пределах строки
+; db 0 ;+3 X смещ. строки за левый край (в символах)
+; db 0 ;+4 число введенных символов
+; BLOCK max_len_comline+1,0 ;+5 строка ввода
+
+; ; 8 0
+; ; Буфер истории
+; history_buff:
+; BLOCK history_size,0 ; 256
+
+; ; 9 0
+; ; Рабочий буфер
+; Buffers.work.buffer:
+; BLOCK 512,0
+////////////////////////////////////////////////////////////////////////
+;
\ No newline at end of file
diff --git a/SHELL/EXEC.ASM b/SHELL/EXEC.ASM
new file mode 100644
index 0000000..9f78156
--- /dev/null
+++ b/SHELL/EXEC.ASM
@@ -0,0 +1,214 @@
+; раб. ячейка
+SAVEHL: dw 0
+
+
+
+;-------------------------------------------------------------
+; Разбор и выполнение введенных команд и имен файлов
+;-------------------------------------------------------------
+COMP: call EVALCMD ; (batch.asm)
+ ld hl,Buffers.input_line.Path
+ dec hl
+ ld c,(hl) ; длина строки
+ ld b,0
+ inc hl ; Buffers.input_line.Path
+.loop: ld a,(hl)
+ cp " "
+ jr nz,.COMP01
+ inc hl
+ dec c
+ jr nz,.loop
+ ret
+.COMP01:
+ ld d,h
+ ld e,l
+ add hl,bc
+ ld (hl),0
+ sbc hl,bc
+ ld a,c
+ ex af,af'
+ ld a," "
+ cpir
+ jr nz,.COMP005
+ inc c
+.COMP005:
+ ex af,af'
+ sub c
+ ld c,a
+ ld hl,CMDLIST ; список команд ДОС-а
+.start: call RUN_COMMAND
+ jr nc,.skip ; NC если не найдена команда
+ jp (hl)
+ ;
+.skip: ; Не дос-команды. Тест на задание диска и запуск файла
+ ld h,d
+ ld l,e
+ ; hl=Buffers.input_line.Path
+ ld b,(hl) ;+0 1-й символ
+ inc hl
+ ld c,(hl) ;+1 2-й символ
+ inc hl
+ ld a,(hl) ;+2 3-й символ
+ or a ; задан диск типа "x:" ?
+ jr nz,RUN_EXT ; нет, имеем больше 2-х символов
+ ld a,":" ; постфикс буквы диска
+ cp c ; 2-й символ
+ jr nz,RUN_EXT ; задан не диск
+ ld a,b ; 1-й символ
+ CALL COMPARE.cmp_AZ
+.NOUP: sub "A" ; номер диска
+ ld (.dsk),a
+ ld c,Dss.ChDisk ; сменить тек. диск
+ RST ToDSS
+ jr nc,.no_err
+ ;
+ cp DSS_Error.sys.MEDIA_CHANGED
+ jp nz,print_err_message
+ ;
+ call print_err_message
+.dsk+1: ld a,0
+ ld c,Dss.ChDisk ; сменить тек. диск
+ RST ToDSS
+ jp c,print_err_message
+ ;
+.no_err:
+;!FIXIT тут восстанавливается директория и могут быть глюки на новом ядре
+ ;!TODO доставать Buffers.sys_path отдельно для каждого диска (или в ядре сделать?)
+ ; тест на существование папки на целевом диске
+ IFDEF MANY_SYS_PATHES
+ ld hl,Buffers.sys_path ; буфер сист. пути
+ ld c,Dss.ChDir ; уст. тек. путь
+ RST ToDSS
+ jp nc,Get_Path ; Ok
+ ENDIF
+ ;
+
+ ; уст. корень, нет такой папки на новом диске
+ ld hl,Buffers.sys_path + 1 ; буфер сист. пути
+ ld (hl),0
+ dec hl
+ ld (hl),'\'
+
+ ;!TODO доставать system_path отдельно для каждого диска (или в ядре сделать?)
+ IFDEF MANY_SYS_PATHES
+ ld c,Dss.ChDir ; уст. тек. путь
+ RST ToDSS
+ jp c,print_err_message ; вывод сообщения
+ ENDIF
+ ;
+ jp Get_Path ; Ok
+
+; задан не диск
+RUN_EXT: ex de,hl ; восст. адрес начала строки
+ ld (SAVEHL),hl ; Buffers.input_line.Path
+ ld de,EXTBF ; буфер
+ ld bc,4*256 + Dss.EX_Path ; выделить расш. файла
+ RST ToDSS
+ ld hl,(SAVEHL) ; имя файла
+ jr c,RUN_EXE ; выполнить exe-файл
+ bit 1,a ; есть расш. ?
+ jr z,.NON_EXT ; нет
+ ; есть расш. файла
+ ld de,EXTBF ; буфер расш. файла
+ ld hl,BATBF ; "BAT"
+ ld b,3 ; длина сравнения ;!HARDCODE
+ call COMPARE ; сравнить строки
+ ld hl,(SAVEHL)
+ jp z,RUN_BAT ; выполнить bat-файл (batch.asm)
+ jr RUN_EXE ; выполнить exe-файл
+.NON_EXT:
+ ld bc,Dss.Exec ; загр. и выполнить программу
+ RST ToDSS
+ ;[x] 01/11/23 ;!TEST
+ PUSH AF
+ CALL RESTORE_ALL
+ POP AF
+ ;
+ ;[x] 25/10/23
+ JP NC,Ret_New_Line ; Ok
+ ;
+ ld hl,(SAVEHL)
+ cp DSS_Error.sys.FILE_NOT_FOUND
+ jr nz,EXEERR
+ push hl
+ ;ld a,(D96AD) ; длина строки (inline.asm)
+ ld a,(Buffers.input_line.Symbols_Num) ; длина строки
+ ld b,a
+.loop: ld a,(hl)
+ cp " "+1
+ jr c,.next
+ inc hl
+ djnz .loop
+.next: ld e,b
+ ld d,0
+ add hl,de
+ push hl
+ ld e,4
+ add hl,de
+ pop de
+ ex de,hl
+ ld c,b
+ ld b,0
+ inc c
+ lddr
+ inc hl
+ ld (hl),"."
+ inc hl
+ ld (hl),"B"
+ inc hl
+ ld (hl),"A"
+ inc hl
+ ld (hl),"T"
+ pop hl
+ jp RUN_BAT ; выполнить bat-файл (batch.asm)
+
+
+; Выполнить exe-файл
+; hl=имя файла
+RUN_EXE:
+ ld bc,Dss.Exec ; загрузить программу, выполнить файл
+ RST ToDSS
+
+ ;[x] 01/11/23 ;!TEST
+ PUSH AF
+ CALL RESTORE_ALL
+ POP AF
+ ;
+
+ ;[x] 25/10/23
+ JP NC,Ret_New_Line ; Ok
+ ;
+EXEERR: cp DSS_Error.sys.INVALID_HANDLE ; код ошибки "нет дескриптора"
+ jp nc,print_err_message ; вывод сообщения
+ xor a ; индекс "Bad command or file name"
+ jp print_err_message
+
+Ret_New_Line:
+ LD C,Dss.Cursor
+ RST ToDSS
+ XOR A
+ OR E
+ RET Z
+ jp newline
+
+RESTORE_ALL:
+ ;[x] 01/11/23 ;!TEST
+ CALL Get_Path
+ CALL .path
+ ;R10
+ CALL Restore_Screen
+ ;R10
+ RET
+ ;
+.path: ;[x] 01/11/23 ;!TEST
+ LD A,(Buffers.screen_path)
+ SUB 'A'
+ LD C,Dss.ChDisk
+ RST ToDSS
+ ;
+ LD HL,Buffers.sys_path
+ LD C,Dss.ChDir
+ RST ToDSS
+ RET
+ ;
+;
\ No newline at end of file
diff --git a/SHELL/Messages/main_txt.asm b/SHELL/Messages/main_txt.asm
new file mode 100644
index 0000000..28a686b
--- /dev/null
+++ b/SHELL/Messages/main_txt.asm
@@ -0,0 +1,65 @@
+
+ MACRO stN Name?
+@Name? EQU txtCounter
+!txtCounter=txtCounter+1
+ ENDM
+
+MAIN_MSG:
+; для удобства:
+.DIR_1 EQU .DIR_1_
+.VERSION EQU .VERS_
+.DATE EQU .DATE_
+.TIME EQU .TIME_
+.PAUSE EQU .PAUSE_
+.DIR_ESCAPE EQU .DIR_ESC_
+.INVALID EQU .INV_
+.ECHO EQU .ECHO_
+.ON EQU .ON_
+.OFF EQU .OFF_
+.DIR_2 EQU .DIR_2_
+.DIR_3 EQU .DIR_3_
+.DIR_4 EQU .DIR_4_
+.CALCULATING EQU .CALC_
+.CRLF EQU .CRLF_
+.INFO_1 EQU .INFO_1_
+.INFO_2 EQU .INFO_2_
+.DIRPAUSE EQU .DIRPAUSE_
+.CLSLINE EQU .CLSLINE_
+;
+!txtCounter DEFL 0
+; ; не сдвигать____
+.TABLE: : db 0; |
+ stN .CRLF_ : db CR,LF,0; |
+ ;________________/
+ ;
+; 1 2 3 4 5 6 7
+; 01234567890123456789012345678901234567890123456789012345678901234567890123456789;
+ stN .DIR_1_ : db "Volume in drive %1 %6 %7\r\n"
+ db "Volume Serial Number is %2, file sistem is %8\r\n"
+ DZ "\r\nDirectory of %3\r\n\n"
+ stN .VERS_ : DZ "Estex DSS version %1. Shell version %2.\r\n" ;R13
+ stN .DATE_ : DZ "Current date: %1, %2\r\n" ; [x] вывод дня недели 26/01/2023
+ stN .TIME_ : DZ "Current time: %1\r\n"
+ stN .PAUSE_ : DZ "Press any key to continue . . .\r"
+ stN .DIR_ESC_ : DZ "Command 'DIR' cancelled by user\r\n\n"
+ stN .INV_ : DZ "Invalid parametr\r\n"
+ stN .ECHO_ : DZ "Echo is %1\r\n"
+ stN .ON_ : DZ "on"
+ stN .OFF_ : DZ "off"
+ stN .DIR_2_ : db "\r\n %3 File(s)\r %1 byte(s)\r\n"
+ DZ " %4 Dir(s)\r %5 byte(s) capacity\r\n"
+ stN .DIR_4_ : DZ " Free space %5 byte(s)\r\n"
+ stN .DIR_3_ : DZ "%4 %5 %3 %1 %2 \r\n" ;DATE TIME SIZE FILENAME EXT
+ stN .CALC_ : DZ "Calculating free space...\r"
+ stN .INFO_1_ : DZ "\r\nDrive File System Label Serial number Size in bytes\r\n"
+ stN .INFO_2_ : DZ " %9 \r\t %8\r\t\t\t %7\r\t\t\t\t\t %4\r\t\t\t\t\t\t\t %5\r\n"
+ stN .DIRPAUSE_ : DZ "Press ESC to cancel or any other key to continue . . .\r"
+ stN .CLSLINE_ : DZ " \r"
+; ;R11
+ db 0
+ DZ "Unknown command"
+; ;
+.TABLE.Size EQU $-.TABLE
+;
+!txtCounter=0
+;
\ No newline at end of file
diff --git a/SHELL/Procedures/Print.ASM b/SHELL/Procedures/Print.ASM
new file mode 100644
index 0000000..b56412f
--- /dev/null
+++ b/SHELL/Procedures/Print.ASM
@@ -0,0 +1,164 @@
+;-------------------------------------------------
+; Вывод сообщения ошибки по индексу
+; вход: a=номер ошибки
+;-------------------------------------------------
+print_err_message:
+ ld hl,SYS_ERRORS ; массив строк
+ ld bc,SYS_ERRORS.Size ; размер массива
+ ;cp %1000'0000
+ RLA
+ jr nc,.set_de
+ ;
+ ;and %0111'1111
+ ld hl,DRV_ERRORS ; массив строк
+ ld bc,DRV_ERRORS.Size ; размер массива
+ ;
+.set_de: SRL A
+ ld e,a
+ ld d,0
+ inc de
+ call LCPIR ; найти строку
+ call PRINTZ ; формат. вывод строки
+ jp newline
+
+
+; Вывод строки ошибки
+;A850D:
+invalid_param:
+ ld de,MAIN_MSG.INVALID ; индекс "Invalid parametr"
+ jr ECHO_MESSAGE
+
+
+
+;-------------------------------------------------
+; Вывод сообщения по индексу
+; вход: de=индекс строки
+;-------------------------------------------------
+ECHO_MESSAGE:
+ call FMESAGE ; найти строку по индексу
+ jp PRINTZ ; формат. вывод строки
+ ;jp A82CC ; узнать и уст. полож. курсора
+
+
+; Найти строку по индексу
+; вход: de=индекс строки
+; выход: hl=строка
+FMESAGE: inc de
+ ld hl,MAIN_MSG.TABLE ; начало массива строк
+ ld bc,MAIN_MSG.TABLE.Size ; размер массива
+LCPIR: xor a
+ cpir
+ ret po
+ ret nz
+ ;R11
+ XOR A
+ CP (HL)
+ JR Z,.no_mess
+ ;
+ dec de
+ ld a,d
+ or e
+ jr nz,LCPIR
+ ret
+.no_mess: INC HL
+ RET
+
+
+;----------------------------------------------------------------------;
+; Форматированный вывод строки с подстановкой аргументов вместо %1-%9
+; вход: hl=буфер строки
+;----------------------------------------------------------------------;
+PRINTZ: ld a,(hl)
+ inc hl
+ or a
+ ret z
+ ;
+ cp '%'
+ jr z,.check_PRM
+.char: ld c,Dss.PutChar
+ RST ToDSS
+ jp PRINTZ
+ ;
+.bad_PRM: ld a,'%'
+ jp .char
+ ;
+.check_PRM: ld a,(hl)
+ cp '9'+1
+ jr nc,.bad_PRM
+ ;
+ inc hl
+ sub '1'
+ push hl
+ ADD A
+ ADD A
+ ADD A
+ ADD A
+ LD L,A
+ LD H,0
+ ;
+ ld bc,Buffers.bat_params.PRM1
+ add hl,bc
+ ld c,Dss.PChars ; вывод строки
+ RST ToDSS
+ pop hl
+ jp PRINTZ
+
+
+/*
+;[x] исправлен баг с выходом за пределы буфера PRM. Чуть оптимизирована
+;----------------------------------------------------------------------;
+; Форматированный вывод строки с подстановкой аргументов вместо %1-%9
+; вход: hl=буфер строки
+;----------------------------------------------------------------------;
+PRINTZ: ld a,(hl)
+ inc hl
+ or a
+ ret z
+ cp '%'
+ jr z,.check_PRM
+.char: ld c,Dss.PutChar
+ RST ToDSS
+ jp PRINTZ
+.bad_PRM:
+ ld a,'%'
+ jp .char
+.check_PRM:
+ ld a,(hl)
+ cp '9'+1
+ jr nc,.bad_PRM
+ inc hl
+ sub '1'
+ push hl
+ ;!TEST
+ ;ld l,a
+ ;ld h,0
+ ;add hl,hl ;1+1=2
+ ;add hl,hl ;2+2=4
+ ;add hl,hl ;4+4=8
+ ;add hl,hl ;8+8=16 размер отдельного подбуфера
+ ADD A
+ ADD A
+ ADD A
+ ADD A
+ LD L,A
+ LD H,0
+ ;
+ ld bc,Buffers.bat_params.PRM1
+ add hl,bc
+ ld c,Dss.PChars ; вывод строки
+ RST ToDSS
+ pop hl
+ jp PRINTZ
+*/
+
+; буферы аргументов командной строки
+; PRM1: BLOCK 16,0 ; аргумент %1
+; PRM2: BLOCK 16,0 ; аргумент %2
+; PRM3: BLOCK 16,0 ; аргумент %3
+; PRM4: BLOCK 16,0 ; аргумент %4
+; PRM5: BLOCK 16,0 ; аргумент %5
+; PRM6: BLOCK 16,0 ; аргумент %6
+; PRM7: BLOCK 16,0 ; аргумент %7
+; PRM8: BLOCK 16,0 ; аргумент %8
+; PRM9: BLOCK 16,0 ; аргумент %9
+;
\ No newline at end of file
diff --git a/SHELL/Procedures/math.asm b/SHELL/Procedures/math.asm
new file mode 100644
index 0000000..84ae18d
--- /dev/null
+++ b/SHELL/Procedures/math.asm
@@ -0,0 +1,75 @@
+;----------------------------------------------------------------------;
+; Вывод HL в hex-формате
+; hl=число
+; de=буфер
+hex16_to_str: ld a,h
+ call hex8_to_str
+ ld a,l
+hex8_to_str: push af
+ rrca
+ rrca
+ rrca
+ rrca
+ call .num
+ pop af
+ ;
+.num: and %0000'1111
+ add a,#90
+ daa
+ adc a,#40
+ daa
+ ld (de),a
+ inc de
+ ret
+;----------------------------------------------------------------------;
+
+
+;----------------------------------------------------------------------;
+;!FIXIT есть дубль PDIGIT
+; вход: hl=число, de=буфер
+hex2dec_ascii_16bit:
+.n10: ld ix,.tmp1
+ res 7,(ix+0)
+ jr .decim
+ ;
+.n10000: ld ix,.tmp1
+ res 7,(ix+0)
+ ld bc,100
+ call .num16
+ jr .skip1
+ ;
+.n1000: ld ix,.tmp1
+ res 7,(ix+0)
+.skip1: ld bc,100
+ call .num16
+ jr .skip2
+ ;
+.n100: ld ix,.tmp1
+ res 7,(ix+0)
+.skip2: ld bc,100
+ call .num16
+ ;
+.decim: ld bc,10
+ call .num16
+ ld a,l
+ add a,"0"
+ jr .num16_exit
+ ;
+.num16: ld a,'0'-1
+ and a
+ inc a
+ sbc hl,bc
+ jr nc,$-3 ;!FIXIT $
+ add hl,bc
+ cp "0"
+ jr z,$+6 ;!FIXIT $
+ set 7,(ix+0)
+ bit 7,(ix+0)
+ ret z
+.num16_exit:
+ ld (de),a ; сохр. в буфере
+ inc de
+ ret
+ ;
+.tmp1: BYTE 0
+;----------------------------------------------------------------------;
diff --git a/SHELL/Procedures/parsers.asm b/SHELL/Procedures/parsers.asm
new file mode 100644
index 0000000..9a59823
--- /dev/null
+++ b/SHELL/Procedures/parsers.asm
@@ -0,0 +1,130 @@
+////////////////////////////////////////////////////////////////////////
+; Вход: hl - список команд формата: "строка",0,cmd_addr
+; de - строка с командой
+; c - длина строки
+; Выход: CF=1 - в HL адрес команды на исполнение
+; CF=0 - нет опознаной команды
+RUN_COMMAND:
+ push bc
+ push de
+ ;
+.loop: ld a,(de)
+ CALL COMPARE.cmp_AZ
+.skip: cp (hl)
+ jr nz,.not_cmd ; не команда
+ inc hl
+ inc de
+ dec c
+ jr nz,.loop
+ ;
+ xor a
+ cp (hl)
+ jr nz,.not_cmd
+ pop bc
+ pop bc
+ ld a,(de)
+ cp " "
+ jr nz,.no_sp
+ inc de
+.no_sp: inc hl
+ ld a,(hl)
+ inc hl
+ ld h,(hl)
+ ld l,a
+ scf ; маркер опознаной команды
+ ret
+ ;jp (hl) ; на соотв. обработчик команды
+.not_cmd:
+ xor a
+ LD C,A
+ CPIR
+ inc hl
+ inc hl
+ pop de
+ pop bc
+ ld a,(hl)
+ or a
+ jr nz,RUN_COMMAND ; назад в цикл, еще не дошли конца списка дкоманд
+ ret
+ ;
+////////////////////////////////////////////////////////////////////////
+
+
+////////////////////////////////////////////////////////////////////////
+; Вход: hl - список ключей формата: "строка",cmd_addr
+; de - строка с командой
+; c - длина строки с командой
+; Выход: CF=1 - в HL адрес ключа на исполнение
+; CF=0 - нет опознаного ключа
+; !FIXIT переделать эту хрень
+RUN_OPTION:
+.cont: EX DE,HL
+ LD B,C
+.loop: LD A,(HL)
+ CP '/' ;
+ INC HL
+ JR Z,.got
+ AND A
+ RET Z
+ DJNZ .loop
+ ; not found key
+ AND A
+ RET
+ ;
+.got: LD C,B
+ INC HL
+ LD A,(HL)
+ DEC C
+ CP ' '
+ JR Z,.good
+ AND A
+ JR NZ,RUN_OPTION.loop
+ ;LD C,1
+ ;
+.good: dec hl
+ push hl
+ ld b,cmd_dir_options.Size ;!HARDCODE
+ ex de,hl
+ ld a,(de)
+ OR %0010'0000
+ ld de,cmd_dir_options.paramLength ;!HARDCODE
+ ;
+.find: cp (hl)
+ jr z,.found
+ add hl,de
+ djnz .find
+ ; not found
+ pop hl
+ jr RUN_OPTION
+ ; found
+.found: ; затираем найденый ключ
+ pop de
+ ex de,hl
+ ld (hl),' '
+ dec hl
+ ld (hl),' '
+ inc hl
+ inc hl
+ inc hl
+ ex de,hl
+ ;ld A,'/'
+ ;ex de,hl
+ ;ld bc,4
+ ;CPDR
+ ;inc hl
+ ;ld (hl),' '
+ ;inc hl
+ ;ld (hl),' '
+ ;inc hl
+ ;ex de,hl
+ ;
+ LD B,C
+ inc hl
+ ld a,(hl)
+ inc hl
+ ld h,(hl)
+ ld l,a
+ scf ; маркер опознаной опции
+ ret
+
+////////////////////////////////////////////////////////////////////////
diff --git a/SHELL/Procedures/shared.asm b/SHELL/Procedures/shared.asm
new file mode 100644
index 0000000..ea07568
--- /dev/null
+++ b/SHELL/Procedures/shared.asm
@@ -0,0 +1,249 @@
+;----------------------------------------------------------------------;
+; [x] теперь не лезет напрямую, делает через новый параметр функции DskInfo
+; иная логика получения метки тома - сначала ищется в корневой директории,
+; если там нет, то берётся из BPB
+; Вход: выставить переменную read_disk_info.full:
+; 0 - не считать свободное место, !0 - считать
+; Выход:
+; %7 - Volume label
+; serial_string - Volume serial number string
+; full_space_high \
+; full_space_medium - Partition size
+; full_space_low /
+; %6 - "has no label" or "has label"
+;
+read_disk_info: OR #80
+ LD HL,Buffers.work.buffer
+.full+1: LD B,0
+ LD C,Dss.DskInfo
+ RST ToDSS
+ RET C
+ ; Файловая система
+ ; Серийный номер диска
+ ; Метка диска в BPB
+ ; Физический номер диска, номер раздела
+ ;
+ ; HL':HL - общее кол-во кластеров
+ ; DE':DE - свободных кластеров
+ ; A - размер кластера в секторах
+ ; BC - размер сектора в байтах
+ ; max sector (LBA28) #0FFF'FFFF
+ ;
+ EX AF,AF'
+ LD A,D
+ AND E
+ EXX
+ AND D
+ AND E
+ EXX
+ INC A
+ LD (.LastDskInfoIsFull),A
+ ;
+ AND H
+
+ EX AF,AF'
+ ;
+ ; --> (HL':HL)*BC*A, (DE':DE)*BC*A = B':HL'HL, C':DE':DE
+ EXX
+ LD BC,0
+ EXX
+ SRL B
+ RR C
+ RRCA
+ JR C,.loop2
+ ;
+.loop1: SLA L
+ RL H
+ EXX
+ RL L
+ RL H
+ RL B
+ EXX
+ ;
+ SLA E
+ RL D
+ EXX
+ RL E
+ RL D
+ RL C
+ EXX
+ ;
+ RRCA
+ JR NC,.loop1
+ ;
+.loop2: SLA L
+ RL H
+ EXX
+ RL L
+ RL H
+ RL B
+ EXX
+ ;
+ SLA E
+ RL D
+ EXX
+ RL E
+ RL D
+ RL C
+ EXX
+ ;
+ SRL B
+ RR C
+ JR NC,.loop2
+ ; <-- B':HL'HL, C':DE':DE
+ EXX
+ LD A,C
+ LD (free_space_high),A
+ LD (free_space_medium),DE
+ ;
+ LD A,B
+ LD (full_space_high),A
+ LD (full_space_medium),HL
+ EXX
+ LD (free_space_low),DE
+ LD (full_space_low),HL
+ ;
+.no_full_space_option:
+ ; parse
+ ; copy FS type
+ LD HL,Buffers.work.buffer
+ LD DE,Buffers.bat_params.PRM8; куда
+ LD B,0
+ LD C,(HL) ; тут в HL длина поля "Файловая система"
+ INC HL
+ LDIR
+ EX DE,HL
+ LD (HL),0
+ EX DE,HL
+ ;
+ LD D,0
+ ; ; тут в HL длина поля "Файловая система"
+ ; LD E,(HL)
+ ; ADD HL,DE
+ ; INC HL
+ ; длина поля "Серийный номер диска"
+ LD A,(HL)
+ LD E,A
+ ADD HL,DE
+ INC HL
+ PUSH HL ; указатель на длину поля "Метка диска"
+ CP 4 ;!HARDCODE длина поля серийного номера
+ JR NZ,.unknown_serial
+ DEC HL
+ ; старшее слово серийника
+ LD D,(HL)
+ DEC HL
+ LD E,(HL)
+ DEC HL
+ PUSH HL
+ EX DE,HL
+ LD DE,serial_string ; xxxx-xxxx
+ CALL hex16_to_str
+ POP HL
+ ;
+ LD A,"-"
+ LD (DE),A
+ INC DE
+ ; младшее слово серийника
+ LD A,(HL)
+ DEC HL
+ LD L,(HL)
+ LD H,A
+ CALL hex16_to_str
+ ;
+.get_label: ; тут в HL длина поля "Метка диска"
+ POP HL
+ LD A,(HL)
+ INC HL
+ AND A
+ JR Z,.no_volume_label ; да
+ PUSH HL
+ LD B,A
+ LD A,' '
+ ;
+.loop: CP (HL)
+ JR NZ,.good_label
+ INC HL
+ DJNZ .loop
+ POP HL ; снимаем лишнее
+ ; нет метки
+.no_volume_label:; %6
+ LD HL,volume_string_no ; строка
+ LD DE,Buffers.bat_params.PRM6; куда
+ CALL ncopy_string ; скопир. строку (с нулем)
+ XOR A
+ LD (Buffers.bat_params.PRM7),A
+ RET
+ ;
+.good_label: POP HL
+ PUSH HL ; толкаем лишнее
+ ; есть метка
+.volume_label: POP DE ; снимаем лишнее
+ ; %7
+ LD DE,Buffers.bat_params.PRM7
+ LD BC,11 ;!HARDCODE длина метки
+ LDIR
+ XOR A
+ LD (DE),A
+ ; %6
+ LD HL,volume_string_yes ; строка
+ LD DE,Buffers.bat_params.PRM6; куда
+ XOR A
+ JP ncopy_string ; скопир. строку (с нулем)
+ ;
+ ; если не удалось прочитать серийный номер диска или формат неизвестен
+.unknown_serial: ; серийный номер диска - неизвестен ;!HARDCODE ниже
+ LD HL,serial_string
+ LD A,'?'
+ LD B,serial_string.Size
+.loop3: LD (HL),A
+ INC HL
+ DJNZ .loop3
+ LD HL,serial_string+4
+ LD (HL),'-'
+ JR .get_label
+ ;
+.LastDskInfoIsFull:
+ DB 0
+ ;
+///////////////////////////////////////////////////////////////////////
+free_space_low: WORD 0
+free_space_medium: WORD 0
+free_space_high: BYTE 0
+; Серийный номер диска
+serial_string: db "xxxx-xxxx"
+.Size equ $-serial_string
+ db 0 ; закрывашка
+;
+volume_string_no: db "has no label",0
+;
+volume_string_yes: db "has label",0
+;
+; has_not_full_info: db ' (?)',0
+///////////////////////////////////////////////////////////////////////
+;----------------------------------------------------------------------;
+
+
+
+;Процедура коррекции буквы к маленькой букве
+CorrBigChar: CP 'A'
+ RET C
+ CP 'Z' + 1
+ JR NC,.CheckRUS
+.Dec: ADD #20
+ RET
+ ;
+.CheckRUS: CP 'А'
+ RET C
+ CP 'П'+1
+ JR C,.Dec
+ ;
+.BGUPPER: CP 'Я' + 1
+ JR NC,.HGUPPER
+ ADD #50
+ RET
+ ;
+.HGUPPER: CP 'Ё' ; русская буква ё, код #F1
+ RET NZ
+ INC A
+ RET
diff --git a/SHELL/README.txt b/SHELL/README.txt
new file mode 100644
index 0000000..c4e6a8c
--- /dev/null
+++ b/SHELL/README.txt
@@ -0,0 +1,34 @@
+Сорцы рабочие!. Практически ничего не убирал из них, на случай вылезания
+глюков.
+Команда DIR выводит теперь метку и серийник дисков.
+
+
+bat-команды:
+ PAUSE
+ REM
+
+дос-команды:
+ CD,CHDIR
+ CLS
+ DATE,TIME
+ DEL,ERASE
+ DIR
+ ECHO,ECHO.
+ EXIT
+ HELP
+ MD,MKDIR
+ PATH
+ REN,RENAME
+ RD,RMDIR
+ SET
+ VER,VERSION
+
+
+Перемещение по истории команд:
+
+ Esc - сбросить текущую строку
+ Ins - смена режима ввода (вставка/замена)
+ курс. клавиши вверх/вниз - прокрутка истории
+ PageUp - в начало истории
+ PageDown - в конец истории
+ Ctrl+Del - стереть историю
diff --git a/SHELL/SHELL.ASM b/SHELL/SHELL.ASM
new file mode 100644
index 0000000..5090b2d
--- /dev/null
+++ b/SHELL/SHELL.ASM
@@ -0,0 +1,593 @@
+; Последняя редакция: 22.10.2006
+;
+
+
+; - Исправлен фирм. баг, при котором строка в bat-файле, длиннее ширины
+; экрана, обрезалась по ширине экрана и остаток строки не выводился.
+; - Исправлен фирм. баг, при котором в команде "dir" строка выводимого
+; пути имела макс. 15 символов.
+; - Пофиксено неверное изменение диска/пути после ошибок выполнения команд.
+; - Добавлена команда "ECHO." для вставки пустой строки.
+; - Команда DIR выводит метку и серийный номер дисков.
+;
+;
+
+; SYSTEM.EXE /S /P
+;
+; /P Primary command processor
+; /S Secondary command processor
+; /C Execute batch file
+
+;=====================================================================[]
+;Rev. Date Name Description
+;---------------------------------------------------------------------[]
+;R14 22-09-2023 BAO Исправлен баг "File not found" в команде DIR на пустом разделе
+;R13 03-08-2023 BAO Добавлен вывод номера версии Консоли для команды VERSION
+;R12 23-07-2023 BAO Добавлена команда REBOOT - перезагрузка с полной очисткой памяти
+;R11 20-07-2023 BAO Поправлена функция LCPIR для корректного выбора сообщения об ошибке при номере ошибки > заготовленных сообщений
+;R10 16-05-2023 BAO TEХT MODE AND TEXT ARE RESTORED AFTER RETURNING FROM THE APP
+;R08 21-02-2003 DNS FIX BUG IN BAT-PARSER, IT SPLIT STRINGS WHEN LINE BEGAN AT #xx00 OFFSET
+;R07 14-12-2002 DNS PARSING BATCH LINE
+;R06 12-12-2002 DNS ADD %0, %1, %2 ...
+;R05 11-12-2002 DNS IMPLEMENTED %VAR%
+;R04 11-12-2002 DNS ADD 'EVALSTRING' ROUTINE
+;R03 11-12-2002 DNS NEW VERSION
+;R02 19-11-2002 DNS CORRECT SOME ERROR MESSAGES
+;R01 19-11-2002 DNS ADD ENVIRONMENT %VARIABLE% IN ECHO
+;=====================================================================[]
+ DEFINE SHELL_COMPILATION 1
+ DEFINE App_EXE_Version 1
+
+ includelua 'Shared_includes/lua/Functions.lua'
+ include 'shared_includes/constants/bios_equ.inc'
+ include 'shared_includes/constants/dss_equ.inc'
+ include 'SHELL/version.inc'
+ include 'shared_includes/structures/FileSystem.inc'
+ include 'SHELL/structures.inc'
+;
+; Program EQU section
+;---------------------------------------------------------------------[]
+CR EQU 13
+LF EQU 10
+true EQU 1
+false EQU 0
+
+Loader_length EQU 0
+code_addr EQU shell
+program_start EQU shell
+stack_point EQU #C000
+stack_size EQU #100
+org_addr EQU #8000 + CLP_Buffer
+;---------------------------------------------------------------------[]
+;
+
+
+
+;work_buffer1 equ entry - (256+128) ; 2-й раб. буфер ; 128 bytes
+;work_buffer2 equ entry - 256 ; 3-й раб. буфер ; 256 bytes
+
+
+
+
+ ; org 7F00h
+
+ ; db "EX" ; exe ID
+ ; db 45h ; exe тип
+ ; db 0 ; exe версия
+ ; dw 512 ; 512, мл. смещ. кода
+ ; dw 0 ; ст. смещ. кода
+ ; dw 0 ; end-beg, первичный загрузчик
+ ; dw 0,0,0 ; резерв
+ ; dw entry ; адрес загрузки кода
+ ; dw shell ; адрес передачи управления
+ ; dw #BFFE ; адрес стека
+ ; ds 490 ; резерв
+
+
+; Версия/Модификация/Билд шелла
+;entry: db "0.01.003" ;!FIXIT перенести в конец
+
+ INCLUDE 'Shared_Includes/constants/EXE_Header.z80'
+ ORG org_addr
+;==============================================================
+; Точка входа в Шелл
+;==============================================================
+shell: ld hl,Buffers
+ ld de,Buffers+1
+ ld (hl),0
+ ld bc,Struc_Buffers-1
+ ldir
+ ;
+ ld hl,":A"
+ ld (Buffers.screen_path),hl
+ ld a,max_len_comline
+ ld (Buffers.input_line),a
+ ;
+ ; сохр. уровень тек. шелла
+ ld a,(ix-1)
+ ld (cmd_exit.TASKX),a
+ push ix
+ call Get_Path ; сохр. тек. диск и путь
+ pop hl ; hl=ix
+ ;
+ ; Тест на опции запуска самого шелла
+ call GET_CMD
+ ld a,(RUNMODE) ; бит-флаги опций
+ bit 7,a ; "P" 7-й бит (идет вызов из boot-загрузчика)
+ jr nz,FPRIMAR
+ bit 5,a ; "S" 5-й бит (запуск 2-й копии шелла)
+ ;jp nz,option_s
+ jr nz,run_shell
+ bit 4,a ; "C" 4-й бит (выполнить bat-файл)
+ jr nz,option_c
+ bit 6,a ; 6-й бит (вводились дополн. параметры)
+ jr z,back_to_parent_process
+ ; вводились дополн. параметры
+ call CMDMODE ; (batch.asm) выполн. команду или запустить файл
+ ; ^^^^^^^
+ ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat
+ call Get_Path ; узнать и сохр. тек. диск и путь
+ ;
+ ; Вернуться в родит. процесс
+back_to_parent_process:
+ ; [x] 11/12/23 вложенные bat
+ and a
+.saveA: LD B,0
+ JR NC,.exit
+ LD B,A
+.exit: ld c,Dss.Exit
+ ;ld bc,0*256 + Dss.Exit
+ ;
+ JP ToDSS
+
+
+
+;---------------------------------------------------------------
+; Опция "S". Запуск 2-й копии шелла. Без отработки AUTOEXEC.BAT.
+; Можно выйти по EXIT.
+;---------------------------------------------------------------
+; option_s:
+; call cmd_version ; версия ДОС
+; jr run_shell
+
+
+
+;---------------------------------------------------------------
+; Опция "C". Выполнить BAT-файл.
+; После выполнения файла, возвращается в родительский процесс.
+;---------------------------------------------------------------
+option_c:
+ ;ld hl,T96AE ; имя bat-файла, 256 буфер (inline.asm)
+ ;ld hl,Buffers.work.buffer+256;;
+ ld hl,Buffers.input_line.Path ; имя bat-файла
+ call BATCH ; обработка bat-файла (batch.asm)
+ ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat
+ jr back_to_parent_process.saveA ; вернуться в родит. процесс
+
+
+
+;---------------------------------------------------------------
+; Опция "P". Запуск копии шелла. С отработкой AUTOEXEC.BAT.
+; С ней идет вызов шелла из boot-загрузчика.
+; Можно выйти по EXIT, но не из запущенного boot-загрузчиком.
+;---------------------------------------------------------------
+FPRIMAR:
+ halt
+ ld c,Dss.CTRLKey ; узнать сост. клавы в данный момент
+ RST ToDSS
+ ld hl,autoexec_fname ; имя файла "system.bat"
+ ld a,b
+ and #C0 ; нажаты Shift-ы ?
+ call z,BATCH ; нет, выполнить bat-файл (batch.asm)
+;==============================================================
+; Запуск копии шелла
+;==============================================================
+run_shell:
+ call newline
+run_shell_loop:
+ ;call A82CC ; узнать и уст. полож. курсора
+ ; вывести тек.сист. путь и войти в строку редактирования
+ call Get_Path ; узнать и сохр. тек. диск и путь
+run_shell_loop1:
+ call input_line
+ call newline ; на новую строку
+ ld a,(Buffers.input_line.Symbols_Num) ; число введ. символов
+ or a
+ jr z,run_shell_loop1 ; пустая
+ ; Парсинг и выполнение команд
+ call COMP
+ jr run_shell_loop ; назад в цикл
+
+
+
+
+
+
+; Тест опций шелла
+; вход: hl=адрес ком-строки
+GET_CMD:
+ ld e,(hl) ; длина строки
+ inc hl
+ ld d,0
+ ex de,hl ; hl=длина строки, de=строка
+ add hl,de
+ ; убрать концевые пробелы
+.loop1: dec hl
+ ld a,(hl)
+ cp " "
+ jr z,.loop1
+ inc hl
+ ld (hl),0 ; в конец ком-строки
+.NEXTPRM:
+ ex de,hl ; hl=тек. адрес в строке
+.SKIPSP:
+ ld a,(hl)
+ inc hl
+ cp " "
+ ret c
+ jr z,.SKIPSP
+ dec hl
+ cp '/' ; опция
+ jr nz,.PROCESS
+ ld de,Buffers.work.buffer1 ; 128 буфер для параметра
+ ld c,Dss.GSwitch ; выдел. параметр ком-строки
+ RST ToDSS
+ push af
+ ex de,hl
+ ld hl,Buffers.work.buffer1 ; 128 буфер для параметра
+ inc hl
+ call set_option_flag ; уст. биты флагов
+ pop af
+ jr nc,.NEXTPRM
+ ret
+; уст. бит-флаг
+.PROCESS:
+ ld a,(RUNMODE)
+ set 6,a ; 6-й бит (вводились дополн. параметры) ;!HARDCODE
+ ld (RUNMODE),a
+ ; скопир. параметр из ком-строки
+ ; в буфер строки редактирования
+ ;copy_to_input_line:
+ ld iy,Buffers.input_line ; структура буфера ~input line~
+ push hl
+ call clear_inpline ; обнулить структуру "input line"
+ pop de ; de=хвост строки
+.loop: ld hl,Buffers.input_line ; структура буфера ~input line~
+ ld a,(iy + Input_Line.Cur_X) ; X тек. полож. курсора в строке
+ add a,(iy + Input_Line.Left_Shift)
+ add a,l
+ ld l,a
+ jr nc,1F
+ inc h
+1: inc hl
+ inc hl
+ inc hl
+ inc hl
+ inc hl
+ ld a,(de) ; символ из строки
+ ld (hl),a
+ or a
+ ret z ; конец строки
+ inc (iy + Input_Line.Symbols_Num) ; число введ. символов
+ inc (iy + Input_Line.Cur_X) ; X тек. полож. курсора в строке
+ ld a,(width_inpline) ; ширина поля ввода
+ cp (iy + Input_Line.Cur_X) ; X тек. полож. курсора в пределах строки
+ jr nz,2F
+ ; курсор за правым краем поля ввода
+ inc (iy + Input_Line.Left_Shift) ; смещ. строки за левый край
+ dec (iy + Input_Line.Cur_X) ; X тек. полож. курсора в пределах строки
+2: ld a,(de) ; символ из строки
+ inc de ; продв. поток
+ cp " "
+ jr nc,.loop
+ ret
+
+; Тест на опции шелла и уст. бит-флагов
+; вход: hl=строка опций
+set_option_flag:
+ ld a,(RUNMODE) ; ячейка бит-флагов
+ ld c,a
+ ld a,(hl)
+ call COMPARE.cmp_AZ
+.setopt1: cp "P" ; запуск шелла с отраб. autoexec.bat
+ jr nz,.setopt2
+ set 7,c
+ jr .setopt4
+ ;
+.setopt2: cp "S" ; запуск 2-й копии шелла (без отраб. autoexec.bat)
+ jr nz,.setopt3
+ set 5,c
+ jr .setopt4
+ ;
+.setopt3: cp "C" ; выполн. bat-файл и вернуться в родит. процесс
+ ret nz
+ set 4,c
+.setopt4: ld a,c
+ ld (RUNMODE),a
+ ret
+
+
+; Сохранить тек. диск и путь
+;GETPATH:
+Get_Path:
+ ; узнать тек. каталог
+ ld hl,Buffers.sys_path ; 256 буфер сист. пути
+ ld c,Dss.CurDir
+ RST ToDSS
+.disk: ; узнать тек. диск
+ ld c,Dss.CurDisk
+ RST ToDSS
+ add a,"A"
+ ld (Buffers.screen_path),a ; 33 строка экранного пути
+ ret
+
+
+; Восстановить тек. диск и путь (после ошибки)
+ IFUSED restore_disk_path
+ ASSERT restore_path
+restore_disk_path:
+ ; уст. тек. диск
+ ld a,(Buffers.screen_path) ; 33 строка экранного пути
+ sub "A"
+ ld c,Dss.ChDisk
+ RST ToDSS
+ ENDIF
+
+ IFUSED restore_path
+restore_path:
+ ; уст. тек. каталог
+ ld hl,Buffers.sys_path ; 256 буфер сист. пути
+ ld c,Dss.ChDir
+ JP ToDSS
+ ret
+ ENDIF
+;
+
+
+newline: push hl
+ ld hl,MAIN_MSG.TABLE+1 ; "CR,LF,0"
+ ld c,Dss.PChars
+ rst ToDSS
+ pop hl
+ ret
+
+; Сравнение строк (Английский)
+; in: de=string1
+; hl=string2
+; b=длина строки
+COMPARE: ld a,(de)
+ call .cmp_AZ
+.next: cp (hl)
+ ret nz
+ inc hl
+ inc de
+ djnz COMPARE
+ ret
+ ;
+.cmp_AZ: cp "a"
+ ret c
+ cp "z"+1
+ ret nc
+ and %0101'1111 ; a..z -> A..Z
+ ret
+
+
+; Скопир. строку (с нулем), макс. 15 символов
+; (hl) -> (de)
+ncopy_string:
+ ld bc,15 ; макс. длина строки
+.start: ld a,(hl)
+ ldi
+ ret po
+ or a
+ jr nz,.start
+ ret
+
+; Скопир. строку (с нулем)
+; (hl) -> (de)
+copy_string:
+ ld a,(hl)
+ ldi
+ or a
+ jr nz,copy_string
+ ret
+
+
+
+
+
+
+; Десятичный вывод в буфер
+; вход: a=число
+; hl=буфер
+PUTB: ld c,2Fh
+.loop: inc c
+ sub 10
+ jr nc,.loop
+ add a,10
+ add a,"0"
+ push af
+ ld a,c
+ ld (hl),a
+ inc hl
+ pop af
+ ld (hl),a
+ inc hl
+ ret
+
+
+
+STR2DEC:
+ ld hl,0
+.loop: ld a,(de)
+ inc de
+ or a
+ ret z
+ cp "." ; раздел. даты
+ ret z
+ cp "-" ; раздел. даты
+ ret z
+ cp ":" ; раздел. времени
+ ret z
+ ld b,h
+ ld c,l
+ add hl,hl
+ add hl,hl
+ add hl,bc
+ add hl,hl
+ call .ATODEC
+ ret c
+ add a,l
+ ld l,a
+ jr nc,.loop
+ inc h
+ jr .loop
+.ATODEC:; char -> int
+ cp "0"
+ ret c
+ cp "9"+1
+ ccf
+ ret c
+ sub "0"
+ ret
+
+;!FIXIT есть дубл hex2dec_ascii_16bit
+PDIGIT: ld de,10000
+ ld a,#C8 ; ret z
+ ld (.RET_Z),a
+ call .DIG
+ ld de,1000
+ call .DIG
+ ld de,100
+ call .DIG
+ ld de,10
+ call .DIG
+ ld a,l
+ add a,"0"
+ ;!TEST пока не требуется передавать следующий IX дальше
+ ;ld (ix+0),a
+ ;inc ix
+ ;ld (ix+0),0
+ LD (IX+0),A
+ LD (IX+1),0
+ ;
+ ret
+.DIG: xor a
+.loop: inc a
+ sbc hl,de
+ jr nc,.loop
+ add hl,de
+ dec a
+.RET_Z: ret z
+ add a,"0"
+ ld (ix+0),a
+ inc ix
+ xor a ; nop
+ ld (.RET_Z),a
+ ret
+
+Restore_Screen:
+ PUSH AF
+ LD C,Dss.GetVMod
+ RST ToDSS
+ CP #80
+ JR C,.exit
+ LD BC,1 * 256 + Dss.SetVMod
+ LD A,Dss.SetVMod.txt80x32
+ RST ToDSS
+.exit: POP AF
+ RET
+
+
+
+; цвет экрана шелла
+color_screen:
+ db 07h
+
+
+; Имя файла "autoexec.bat"
+autoexec_fname:
+ db "system.bat",0
+
+
+; бит-флаги опций самого шелла
+RUNMODE: db 0
+
+
+
+; буфер расш. файла с ограничителем 0
+EXTBF: BLOCK 4,0
+
+BATBF: db "BAT" ; расш. bat-файла
+T8C21: db "ON",0
+T8C24: db "OFF",0
+
+
+ include 'edline.asm' ; строка редактирования
+ include 'batch.asm' ; парсинг bat-файлов
+ include 'exec.asm' ; выполн. введ. команд с консоли
+ include 'procedures/print.asm' ; функции вывода сообщений
+ include '../Shared_includes/constants/dss_errors.z80' ; сообщения об ошибках
+ include 'messages/main_txt.asm' ; сообщения
+ include 'procedures/parsers.asm' ; функции прочесывания и выбора
+ include 'procedures/math.asm' ; функции математические
+ include 'procedures/shared.asm' ; функции разные
+ ;
+ include 'Commands/exit.asm' ; выход в родит. процесс
+ include 'Commands/break.asm' ; выход из парсера bat
+ include 'Commands/pause.asm' ; пауза
+ include 'Commands/rem.asm' ; комментарий
+ include 'Commands/ver.asm' ; вывод версии ДОС
+ include 'Commands/cls.asm' ; очистка экрана
+ include 'Commands/date.asm' ; вывод или установка даты/времени
+ include 'Commands/dir.asm' ; вывод списка директории
+ include 'Commands/info.asm' ; вывод информации о дисках
+ include 'Commands/chdir.asm' ; смена тек. каталога
+ include 'Commands/mkdir.asm' ; создание каталога
+ include 'Commands/rmdir.asm' ; удаление каталога
+ include 'Commands/del.asm' ; удаление файла
+ include 'Commands/ren.asm' ; переименование файла или каталога
+ include 'Commands/echo.asm' ; эхо-режим
+ include 'Commands/help.asm' ; вывод экрана помощи
+ include 'Commands/path.asm' ; задать сист. путь
+ include 'Commands/set.asm' ; задать переменную окружения
+ include 'Commands/reboot.asm' ; софт ресет
+ ;
+ DISPLAY "Empty space for buffers from ",/H,$
+ DISPLAY "Free space from ",/H,$ + Struc_Buffers
+ assert ($ + Struc_Buffers) < (stack_point - stack_size), "Buffers can leack to stack!"
+
+Buffers Struc_Buffers = $
+
+; 5 0
+; экранный путь
+;screen_path:
+; db "A:"
+; BLOCK max_screen_path+1,0 ; 32+1
+; 6 0
+; системный путь
+; system_path:
+; BLOCK 256,0 ;!HARDCODE
+; 7 0
+; Структура строки ввода ~input line~
+; struct_input_line:
+; db max_len_comline ;+0 254 макс. число ввод. символов
+; db 0 ;+1 флаг ReadyString
+; db 0 ;+2 X тек. полож. курсора в пределах строки
+; db 0 ;+3 X смещ. строки за левый край (в символах)
+; db 0 ;+4 число введенных символов
+; BLOCK max_len_comline+1,0 ;+5 строка ввода
+
+; 8 0
+; Буфер истории
+; history_buff:
+; BLOCK history_size,0 ; 256
+
+; 9 0
+; Рабочий буфер
+; work_buffer:
+; BLOCK 512,0
+
+; work_buffer1 equ $ ; 2-й раб. буфер ; 128 bytes
+; work_buffer2 equ work_buffer1+128 ; 3-й раб. буфер ; 256 bytes
+;
diff --git a/SHELL/build.txt b/SHELL/build.txt
new file mode 100644
index 0000000..8db1e5f
--- /dev/null
+++ b/SHELL/build.txt
@@ -0,0 +1 @@
+522
\ No newline at end of file
diff --git a/SHELL/structures.inc b/SHELL/structures.inc
new file mode 100644
index 0000000..db0218f
--- /dev/null
+++ b/SHELL/structures.inc
@@ -0,0 +1,37 @@
+ STRUCT Input_Line
+.max_Len BYTE 254 ;+0 254 макс. число ввод. символов
+.ReadyString BYTE 0 ;+1 флаг ReadyString
+.Cur_X BYTE 0 ;+2 X тек. полож. курсора в пределах строки
+.Left_Shift BYTE 0 ;+3 X смещ. строки за левый край (в символах)
+.Symbols_Num BYTE 0 ;+4 число введенных символов
+.Path BLOCK max_len_comline+1,0 ;+5 строка ввода
+ ENDS
+
+ STRUCT Work
+.buffer BLOCK 512,0
+.buffer1 BLOCK 128,0
+.buffer2 BLOCK 256,0
+.free BLOCK 3840,0
+ ENDS
+
+; буферы аргументов командной строки
+ STRUCT BAT_PARAMS
+.PRM1: BLOCK 16,0 ; аргумент %1
+.PRM2: BLOCK 16,0 ; аргумент %2
+.PRM3: BLOCK 16,0 ; аргумент %3
+.PRM4: BLOCK 16,0 ; аргумент %4
+.PRM5: BLOCK 16,0 ; аргумент %5
+.PRM6: BLOCK 16,0 ; аргумент %6
+.PRM7: BLOCK 16,0 ; аргумент %7
+.PRM8: BLOCK 16,0 ; аргумент %8
+.PRM9: BLOCK 16,0 ; аргумент %9 Buffers.bat_params.
+ ENDS
+
+ STRUCT Struc_Buffers
+.bat_params BAT_PARAMS
+.screen_path BLOCK 2 + max_screen_path + 1, 0 ; db "A:" : BLOCK max_screen_path+1,0
+.sys_path BLOCK 256,0
+.input_line Input_Line
+.history BLOCK history_size,0 ; 256
+.work Work
+ ENDS
diff --git a/SHELL/version.inc b/SHELL/version.inc
new file mode 100644
index 0000000..d78a3bc
--- /dev/null
+++ b/SHELL/version.inc
@@ -0,0 +1,22 @@
+;------------------[ Достаём текущую дату и BUILD++ ]-----------------[]
+ LUA PASS1
+ Console_build = increase_build("./SHELL/build.txt")
+ if Console_build > 999 then
+ Console_build = 999
+ print("WARNING! Build > 999","WARNING! Build > 999","WARNING! Build > 999","WARNING! Build > 999","\aWARNING! Build > 999\a")
+ end
+ ENDLUA
+ LUA ALLPASS
+ sj.insert_label("lua_BUILD", Console_build)
+ ENDLUA
+;---------------------------------------------------------------------[]
+
+;
+; Shell full version
+; номер версии (0..9)
+CONSOLE_VERS EQU 1
+; номер модификации (0..99)
+CONSOLE_MODF EQU 2
+; номер билда (0..999)
+CONSOLE_BUILD EQU lua_BUILD
+;
\ No newline at end of file