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 ",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