From 91774c8b23682a7bf403e5438d4ef6926e04478c Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 14 Jun 2023 19:08:44 +1000 Subject: [PATCH] Initial commit Estex DSS --- .gitmodules | 3 + BOOT/BOOT.ASM | 706 +++++++++++++ BOOT/BOOTNAME.ASM | 155 +++ BOOT/DSSBOOT.ASM | 756 ++++++++++++++ BOOT/README.TXT | 9 + Console/CONSOLE.ASM | 2276 ++++++++++++++++++++++++++++++++++++++++++ Console/DOS_EQU.ASM | 71 ++ Console/DSS.INC | 104 ++ Console/Errors.TXT | 66 ++ Console/HISTORY.TXT | 4 + Console/SYS.old | 2074 ++++++++++++++++++++++++++++++++++++++ DSS/CHANGES.LOG | 32 + DSS/DISK_X.ASM | 249 +++++ DSS/DOS-MAIN.ASM | 572 +++++++++++ DSS/DOS5.ASM | 1748 ++++++++++++++++++++++++++++++++ DSS/DOS_FM.ASM | 831 +++++++++++++++ DSS/DOS_X.ASM | 547 ++++++++++ DSS/DRV-MAIN.ASM | 237 +++++ DSS/DSS_MACROSES.Z80 | 72 ++ DSS/DSS_MAP.TXT | 62 ++ DSS/ENVIRON.ASM | 241 +++++ DSS/EXECUTE.ASM | 1228 +++++++++++++++++++++++ DSS/FAT_X.ASM | 473 +++++++++ DSS/FDD_DRV0.ASM | 366 +++++++ DSS/IDE_DRV0.ASM | 706 +++++++++++++ DSS/INTMOUSE.ASM | 920 +++++++++++++++++ DSS/KEYINTER.ASM | 927 +++++++++++++++++ DSS/KNOWN.BUG | 12 + DSS/RAM_DRV0.ASM | 613 ++++++++++++ DSS/RAM_DRV1.ASM | 477 +++++++++ DSS/Structures.inc | 67 ++ DSS/VERSION.INC | 24 + DSS/VIDEO.ASM | 682 +++++++++++++ DSS/defines.inc | 36 + Shared_Includes | 1 + 35 files changed, 17347 insertions(+) create mode 100644 .gitmodules create mode 100644 BOOT/BOOT.ASM create mode 100644 BOOT/BOOTNAME.ASM create mode 100644 BOOT/DSSBOOT.ASM create mode 100644 BOOT/README.TXT create mode 100644 Console/CONSOLE.ASM create mode 100644 Console/DOS_EQU.ASM create mode 100644 Console/DSS.INC create mode 100644 Console/Errors.TXT create mode 100644 Console/HISTORY.TXT create mode 100644 Console/SYS.old create mode 100644 DSS/CHANGES.LOG create mode 100644 DSS/DISK_X.ASM create mode 100644 DSS/DOS-MAIN.ASM create mode 100644 DSS/DOS5.ASM create mode 100644 DSS/DOS_FM.ASM create mode 100644 DSS/DOS_X.ASM create mode 100644 DSS/DRV-MAIN.ASM create mode 100644 DSS/DSS_MACROSES.Z80 create mode 100644 DSS/DSS_MAP.TXT create mode 100644 DSS/ENVIRON.ASM create mode 100644 DSS/EXECUTE.ASM create mode 100644 DSS/FAT_X.ASM create mode 100644 DSS/FDD_DRV0.ASM create mode 100644 DSS/IDE_DRV0.ASM create mode 100644 DSS/INTMOUSE.ASM create mode 100644 DSS/KEYINTER.ASM create mode 100644 DSS/KNOWN.BUG create mode 100644 DSS/RAM_DRV0.ASM create mode 100644 DSS/RAM_DRV1.ASM create mode 100644 DSS/Structures.inc create mode 100644 DSS/VERSION.INC create mode 100644 DSS/VIDEO.ASM create mode 100644 DSS/defines.inc create mode 160000 Shared_Includes diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..5c22af2 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "Shared_Includes"] + path = Shared_Includes + url = https://github.com/Tolik-Trek/Shared_Includes.git diff --git a/BOOT/BOOT.ASM b/BOOT/BOOT.ASM new file mode 100644 index 0000000..6f51bb4 --- /dev/null +++ b/BOOT/BOOT.ASM @@ -0,0 +1,706 @@ +; Последняя редакция: 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 new file mode 100644 index 0000000..33a4f70 --- /dev/null +++ b/BOOT/BOOTNAME.ASM @@ -0,0 +1,155 @@ +;[BEGIN] +; +; BOOTNAME.EXE +; + MODULE BOOTname + + ORG #8100-512 + INCLUDE "dss.inc" + DB "EXE" ;EXE ID + DB #00 ;EXE VERSION + DW #0200 ;CODE OFFSET LOW + DW #0000 ;CODE OFFSET HIGH + DW #0000 ;END-BEG ;PRIMARY LOADER + DW #0000 ; + DW #0000 ;RESERVED + DW #0000 ; + DW #8100 ;LOAD ADDRESS + DW #8100 ;START ADDRESS + DW #BFFF ;STACK ADDRESS + DS 490 + +START + LD BC,0*256+DSS_BOOTDSK + LD C,2 ;curdisk + RST #10 + JR C,NERR + ADD A,"A" ;correct to the human format + LD (BOOTDRIVE),A + LD HL,BOOTSTRING + LD BC,2*256+DSS_ENVIRON + RST #10 +NERR CALL C,ERROR + LD C,DSS_EXIT + RST #10 + RET + +BOOTSTRING DB "BOOTDISK=" +BOOTDRIVE DB "C:",0 + +CRLF LD A,#0D + LD C,DSS_PUTCHAR + RST #10 + LD A,#0A + LD C,DSS_PUTCHAR + RST #10 + RET + +ERROR LD E,A + LD D,0 + JP ERR_MSG + +ERR_MSG CALL FMESAGE + CALL PRINTZ + CALL CRLF + CALL CRLF + RET + +FMESAGE INC DE + LD HL,ERR0 + LD BC,ERR1-ERR0 +LCPIR XOR A + CPIR + RET PO + RET NZ + DEC DE + LD A,D + OR E + JP NZ,LCPIR + RET + +PUTPRM LD BC,15 +PUTPRMA LD A,(HL) + LDI + RET PO + OR A + JR NZ,PUTPRMA + RET + +PRINTZ LD A,(HL) + INC HL + OR A + RET Z + CP "%" + JR NZ,PRINTZ2 + LD A,(HL) + INC HL + SUB "1" + PUSH HL + LD L,A + LD H,0 + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + LD BC,PRM1 + ADD HL,BC + LD C,DSS_PCHARS + RST #10 + POP HL + JR PRINTZ +PRINTZ2 LD C,DSS_PUTCHAR + RST #10 + JP PRINTZ + +PRM1 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PRM2 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PRM3 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PRM4 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PRM5 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PRM6 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PRM7 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PRM8 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PRM9 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + +ERR0 DB #00 + DB "Bad command or file name",0 + DB "Invalid function",0 + DB "Invalid drive number",0 + DB "File not found",0 + DB "Path not found",0 + DB "Invalid handle",0 + DB "Extended error 6",0 + DB "File exist",0 + DB "File read only",0 + DB "Root overflow",0 + DB "No free space",0 + DB "Directory not empty",0 + DB "Can't delete current directory",0 + DB "Invalid media",0 + DB "Unknown operation",0 + DB "Directory exist",0 + DB "Invalid filename",0 + DB "Invalid EXE-file",0 + DB "Not supported EXE-file",0 + DB "Access denied",0 + DB "Not ready",0 + DB "Seek error",0 + DB "Sector not found",0 + DB "CRC error",0 + DB "Write protect",0 + DB "Read error",0 + DB "Write error",0 + DB "Drive failure",0 + DB "Extended error 28",0 + DB "Extended error 29",0 + DB "No free memory",0 + DB "Invalid memory block",0 + DB "Extended error 32",0 + DB "Extended error 33",0 + DB "Extended error 34",0 + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +ERR1 +; + ENDMODULE +; \ No newline at end of file diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM new file mode 100644 index 0000000..eeef089 --- /dev/null +++ b/BOOT/DSSBOOT.ASM @@ -0,0 +1,756 @@ +;--------------------------------------------------------------- +;Rev Date Name Decription +;--------------------------------------------------------------- +;R04 25-03-2023 BAO ; !FIXIT +;R03 23-01-2000 DNS OPTIMIZE NEW BOOTING PROCEDURE +;R02 08-01-2000 DNS NEW BOOTING PROCEDURE +;R01 25-05-1998 DNS Console printing +;R00 09-11-1998 DNS Color printing start message +; Install CGA palette +; +------------------------------+ +; + System Bootstrap + +; + Initial revision 09 Nov 1998 + +; +------------------------------+ + + DEFINE ORIGINAL_DSS 0 + DEFINE UNIVERSAL_BOOT 1 + + DISP #8000 + + OUTPUT 'build/DSSloader.bin' + +ADRIVE EQU #00 +CDRIVE EQU #02 + + + +DRIVE: + _mSYSID + + DI + LD (DRIVE),A + LD C,BIOS.EXT_VERSION + RST #18 + LD A,INCORR + JR C,FAIL + LD A,(DRIVE) + BIT 7,A + JR Z,GOOD_DRIVE + EX DE,HL + LD DE,#0215 ; если версия ниже 2.21, то ошибка + SBC HL,DE + LD A,INCORR + JR C,FAIL +GOOD_DRIVE: + LD DE,#8200 + LD HL,0 + LD IX,2 + LD BC,2*256+BIOS.DRV_READ + LD A,(DRIVE) + RST #18 + JR C,NULL + JP CONTINU + +FAIL CALL MESSAGE +NULL LD A,FAILURE + CALL MESSAGE + DI + HALT + JR $ + +FMESAGE LD HL,MSG0 + LD BC,MSGE-MSG0 + INC A + EX AF,AF' + XOR A + EX AF,AF' +NEXTMSG EX AF,AF' + CPIR + RET PO + RET NZ + EX AF,AF' + DEC A + JR NZ,NEXTMSG + RET + +MESSAGE CALL FMESAGE + JR PRINTZ + +;R01 Start +PRINTZ LD A,(HL) ;R01 + INC HL + OR A + RET Z + CALL PRINTX + JR PRINTZ + +PRINTX CP #0D + JR Z,CR_ + CP #0A + JR Z,LF_ + LD BC,#0182 + RST #18 + RET +CR_ LD C,#8E + RST #18 + LD E,0 + LD C,#84 + RST #18 + RET +LF_ LD C,#8E + RST #18 + LD A,#1F + CP D + JR NZ,LF2 + PUSH DE + PUSH HL + LD DE,#0020 + LD BC,#018A + RST #18 + LD DE,#1F00 + LD C,#84 + RST #18 + LD A," " + LD BC,#5082 + RST #18 + POP HL + POP DE + DEC D +LF2 INC D + LD C,#84 + RST #18 + RET ;R01 +;R01 End + +FAILURE EQU 0 +INCORR EQU 1 +ERRPART EQU 2 +ERRIBPB EQU 3 +NO_SYS EQU 4 +NOSHELL EQU 5 +STARTDO EQU 6 +;a BIOS version that is incompatible with this version of DOS +; 0 10 20 30 40 50 60 70 80 +MSG0 DB 0 + DB 13,10,"The system has been halted. Press RESET to restart your computer.",13,10 + DB 0 + DB 13,10 + DB "You started your computer with a BIOS version that is incompatible with this",13,10 + DB "version of DSS. Please update BIOS to run this version of DSS.",13,10 + DB 0 + DB "Invalid partition table.",13,10 + DB 0 + DB "Invalid BOOT sector.",13,10 + DB 0 + DB "Can't open file SYSTEM.DOS ...",13,10 + DB 0 + DB "Can't open file SYSTEM.EXE ...",13,10 + DB 0 + DB 13,10,"Starting DSS... ",13,10,13,10 + DB 0 +MSGE DB 0 + +CONTINU + LD HL,0 + LD (DISKL),HL + LD (DISKH),HL + + LD BC,1*256+BIOS.GetMem + RST #18 ;GET PAGE FOR DOS + LD (BANKDOS),A + CALL GET_BPB ;READ BPB + LD A,ERRIBPB + JP C,FAIL + CALL GETROOT + LD A,NO_SYS + JP C,FAIL + + LD HL,(FCLUSTR) + LD DE,#C000 + CALL FLOAD + DI + XOR A + OUT (SYS_PORT.OFF),A + + LD A,#10 + LD BC,#7FFD + OUT (C),A + + LD A,1 + LD B,#1F ;1FFD + OUT (C),A + + LD A,(BANKDOS) + OUT (SLOT0),A + +;DOS LOADED + IF UNIVERSAL_BOOT + + LD A,(DRIVE) + LD C,#00 + RST #10 + jp c,XFAIL + + LD A,STARTDO + CALL DOSMESS + + LD A,(DRIVE) + LD B,1 + LD C,Dss.BootDSK + RST #10 + + LD B,0 + ELSE + + IF ORIGINAL_DSS + LD C,#00 + RST #10 + ELSE + LD A,(DRIVE) + LD C,#00 + RST #10 + jp c,XFAIL + ENDIF + + LD A,STARTDO + CALL DOSMESS + + IF ORIGINAL_DSS + LD A,(DRIVE) + LD B,1 + LD C,Dss.BootDSK + RST #10 + + LD B,0 + ENDIF + ENDIF + + LD C,Dss.BootDSK + RST #10 + + LD B,"A" + ADD A,B + + LD HL,ROOT + LD (HL),A + LD C,Dss.ChDir + RST #10 + + LD HL,PSHELL + LD BC,Dss.Exec + RST #10 + LD A,NOSHELL + JP XFAIL + +PSHELL: DB '\SYSTEM.EXE /P',0 +ROOT: DB 'X:\',0 + +DOSMESS CALL FMESAGE + LD C,Dss.PChars + RST #10 + RET + +XFAIL CALL DOSMESS + LD A,FAILURE + CALL DOSMESS + DI + HALT +.halt JR .halt + +PART_TB PUSH BC + LD HL,(BOOT+510) + LD DE,#AA55 + AND A + SBC HL,DE + JR NZ,ERRP + LD IX,BOOT+#01BE + LD B,4 +DOSAGA LD A,(IX+4) + CP #0E + JR Z,YEPDOS + CP 6 + JR Z,YEPDOS + CP 4 + JR Z,YEPDOS + CP 1 + JR Z,YEPDOS + LD DE,#10 +; ошибка в оригинале +; ADD IY,DE + ADD IX,DE + DJNZ DOSAGA +ERRP LD A,ERRPART + JP FAIL + +YEPDOS LD E,(IX+08) + LD D,(IX+09) + LD L,(IX+10) + LD H,(IX+11) + LD XH,D + LD XL,E + LD (DISKL),IX + LD (DISKH),HL + LD DE,BOOT + LD BC,1*256+BIOS.DRV_READ + LD A,(DRIVE) + RST #18 + POP BC + LD A,C + RET + +SET_PRM PUSH BC + LD A,B + LD C,BIOS.DRV_GET_PAR + RST #18 + LD A,(BOOT.S_P_T) + LD L,A + POP AF + PUSH AF + LD C,BIOS.DRV_SET_PAR + RST #18 + POP BC + LD A,C + RET + +GET_BPB LD IX,#0000 + LD HL,#0000 + LD DE,BOOT + LD BC,1*256+BIOS.DRV_READ + LD A,(DRIVE) + RST #18 + RET C + LD A,(DRIVE) + LD B,A + AND #F0 + LD C,A + CP #80 + JR NZ,NX1 + CALL PART_TB ;HDD + RET C +NX1 CP #00 + JR NZ,NX2 + CALL SET_PRM ;FDD +NX2: LD HL,(BOOT+510) + LD DE,#AA55 + AND A + SBC HL,DE + SCF + RET NZ + LD IY,BOOT ;Analysing Block Parametr BIOS + LD A,(IY+_sBOOT_SEC.ID_FORM) + CP #F0 + RET C + LD HL,0 ;calc. first sector FAT + LD (DIR_FRH),HL + + LD E,(IY+_sBOOT_SEC.RESERVE) ;Reserve sec + LD D,(IY+_sBOOT_SEC.RESERVE+1) + ADD HL,DE + LD (FAT_FRM),HL ;first sector FAT + LD E,(IY+_sBOOT_SEC.S_P_F) ;sectors in FAT + LD D,(IY+_sBOOT_SEC.S_P_F+1) + LD A,(BOOT.FAT_NUM) ;amount FATs +C_DATA1 ADD HL,DE + DEC A + JR NZ,C_DATA1 + LD (DIR_FRM),HL ;first sector DIR + EX DE,HL + LD L,(IY+_sBOOT_SEC.F_P_DIR) ;Number file handel + LD H,(IY+_sBOOT_SEC.F_P_DIR+1) + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + LD A,H + SRL A + LD (DIR_S_S),A ;Sectors per dir + LD L,A + LD H,0 + ADD HL,DE + LD (DAT_FRM),HL ;First sector data + + LD C,(IY+_sBOOT_SEC.B_P_S) ;Size sector + LD B,(IY+_sBOOT_SEC.B_P_S+1) + LD HL,0 + LD A,(BOOT.S_P_C) +NEXTAD3 + ADD HL,BC ;calc. cluster size + DEC A + JR NZ,NEXTAD3 + LD (CLU_LEN),HL + + LD HL,BOOT.ID_FAT + LD DE,FATMSG + LD B,3 +R_BPBL1 + LD A,(DE) + CP (HL) + JP NZ,IBMDOS_ + INC HL + INC DE + DJNZ R_BPBL1 +FID LD A,(HL) + INC HL + CP #20 + JR Z,FID + CP "1" + SCF + RET NZ + LD A,(HL) + CP "6" ; FAT16 + LD HL,#FFFF + JR Z,BPB_FAT + CP "2" ; FAT12 + SCF + RET NZ + LD HL,#0FFF +BPB_FAT + LD (FAT_TYP),A + LD (ENDCLUS),HL + + LD IX,(DISKL) + LD HL,(DISKH) + LD DE,(FAT_FRM) + LD BC,#0000 + ADD IX,DE + ADC HL,BC +;HL:IX + LD DE,FAT + LD BC,3*256+BIOS.DRV_READ + LD A,(DRIVE) + RST #18 + RET C + LD HL,0 + LD (FATCASH),HL + XOR A + RET + +IBMDOS_ LD A,(IY+_sBOOT_SEC.ID_FORM) + CP #F0 + RET C + CP #F8 + LD A,"6" + LD HL,#FFFF + JR Z,BPB_FAT + LD A,"2" + LD HL,#0FFF + JR BPB_FAT + +GETROOT LD HL,(DIR_FRH) + LD IX,(DIR_FRL) + LD BC,(DISKL) + LD DE,(DISKH) + LD A,(DIR_S_S) +NEXTSEC PUSH AF + ADD IX,BC + ADC HL,DE +;HL:IX + PUSH IX + PUSH HL + LD BC,1*256+BIOS.DRV_READ + LD DE,DIR + LD A,(DRIVE) + RST #18 + CALL SEARCH + POP HL + POP IX + POP BC + RET C + RET NZ + LD A,B + LD DE,0 + LD BC,1 + DEC A + JR NZ,NEXTSEC + SCF + RET + +SEARCH LD C,17 ;HANDELS PER SECTOR 512/32 + 1 + LD IX,DIR-#0020 +SKIPNAM LD DE,#0020 + ADD IX,DE + DEC C + RET Z + LD A,(IX+00) + OR A + SCF + RET Z + CP #E5 + JR Z,SKIPNAM + LD A,(IX+11) + AND #10 + JR NZ,SKIPNAM + LD HL,MASKARE + LD D,XH + LD E,XL + LD B,11 +SEARCH2 LD A,(DE) + CP (HL) + JR NZ,SKIPNAM + INC HL + INC DE + DJNZ SEARCH2 + LD D,XH + LD E,XL + LD HL,HANDBUF + EX DE,HL + LD BC,#0020 + LDIR + XOR A + INC A + RET + +; HL - CLUSTER +; DE - ADDRESS + +FLOAD LD (READMEM),DE +LD_FILE PUSH HL + CALL NSECTOR + LD DE,(READMEM) + LD A,(BOOT.S_P_C) + CP #20 + JR C,SMCLUS + LD BC,#2052 + LD A,(BANKDOS) + EX AF,AF' + LD A,(DRIVE) + RST #18 + POP HL + AND A + RET + +SMCLUS LD B,A + LD C,#52 + LD A,(BANKDOS) + EX AF,AF' + LD A,(DRIVE) + RST #18 + LD HL,(READMEM) + LD DE,(CLU_LEN) + ADD HL,DE + LD (READMEM),HL + POP HL + RET C + CALL R_F_FAT + RET C + EX DE,HL + JP LD_FILE + +; HL - CLUSTER +; HL:IX - SECTOR + +NSECTOR DEC HL + DEC HL + EX DE,HL + LD A,(BOOT.S_P_C) + LD B,A + LD HL,0 + LD IX,0 +ADD_DE1 ADD IX,DE + JP NC,ADD_DE2 + INC HL +ADD_DE2 DJNZ ADD_DE1 + LD DE,(DAT_FRM) + ADD IX,DE + LD DE,#0000 + ADC HL,DE + LD DE,(DISKL) + ADD IX,DE + LD DE,(DISKH) + ADC HL,DE + RET + +;----------------- + +; HL - CLUSTER + +; DE - (CLUSTER) + +R_F_FAT PUSH HL + LD A,(FAT_TYP) + CP "2" + JP Z,R_F_F12 +R_F_F16 LD DE,768 ; DE - CLUSTERS IN CASH + XOR A +R_F_00H INC A ; HL - CLUSTER + SBC HL,DE + JP NC,R_F_00H + ADD HL,DE + ADD HL,HL ; HL - FAT OFFSET (FROM CASH) + DEC A + LD BC,(FATCASH) ; A - ELEMENT OF CASH + CP C + CALL NZ,RE_FAT + LD DE,FAT + ADD HL,DE + LD E,(HL) + INC HL + LD D,(HL) + LD HL,#FFEF + XOR A + SBC HL,DE + POP HL + RET + +R_F_F12 LD D,H + LD E,L + ADD HL,HL + ADD HL,DE + RR H + RR L + PUSH AF + EX DE,HL + LD HL,(BOOT.B_P_S) + LD B,H + LD C,L + ADD HL,HL + ADD HL,BC + EX DE,HL + XOR A ; DE - SIZE SECTOR * 3 +R_F_00 INC A ; HL - FAT OFFSET + SBC HL,DE + JP NC,R_F_00 + ADD HL,DE + DEC A + LD BC,(FATCASH) + CP C + CALL NZ,RE_FAT + LD DE,FAT + ADD HL,DE + POP AF + LD E,(HL) + INC HL + LD D,(HL) + JP C,R_F_F01 + LD A,D + AND #0F + LD D,A + JP R_F_F02 + +R_F_F01 LD A,E + AND #F0 + LD E,A + RR D + RR E + RR D + RR E + RR D + RR E + RR D + RR E +R_F_F02 LD HL,#0FEF + XOR A + SBC HL,DE + POP HL + RET + +RE_FAT PUSH HL + LD L,A + LD H,0 + LD (FATCASH),HL + LD E,L + LD D,H + ADD HL,HL + ADD HL,DE + LD IX,0 + LD DE,(FAT_FRM) + ADD HL,DE + EX DE,HL + JR NC,NOINX + INC IX +NOINX LD HL,(DISKL) + ADD HL,DE + EX DE,HL + LD BC,(DISKH) + JR NC,NOINX2 + INC IX +NOINX2 ADD IX,BC + PUSH IX + PUSH DE + POP IX + POP HL + LD DE,FAT + LD BC,#0355 + LD A,(DRIVE) + RST #18 + POP HL + RET + +MASKARE DB "SYSTEM DOS" + +FATMSG DB "FAT" + +; Area for boot sector [512Bytes] +BOOT _sBOOT_SEC = $ + +; BOOT EQU $ +; ID_NAME EQU BOOT+#03 ; +03 DOS NAME +; ; Block Parameters BIOS +; B_P_S EQU BOOT+#0B ; +0B BYTE PER SECTOR +; S_P_C EQU BOOT+#0D ; +0D SECTORS PER CLUSTER +; RESERVE EQU BOOT+#0E ; +0E RESERVE SECTORS +; FAT_NUM EQU BOOT+#10 ; +10 AMOUNT FATS +; F_P_DIR EQU BOOT+#11 ; +11 FILES IN DIRECTORY +; S_P_D EQU BOOT+#13 ; +13 ALL SECTORS ON DISK +; ID_FORM EQU BOOT+#15 ; +15 ID FORMAT +; S_P_F EQU BOOT+#16 ; +16 SIZE FAT IN SECTORS +; S_P_T EQU BOOT+#18 ; +18 SECTOR PER TRACK +; HEADS EQU BOOT+#1A ; +1A AMOUNT SIDES +; HIDDEN EQU BOOT+#1C ; +1C HIDDEN SECTORS +; ID_FAT EQU BOOT+#36 ; +36 FAT ID +; ; end boot sector + + +DIR EQU BOOT+512 +FAT EQU DIR+512 + +VALUE EQU 3*512+FAT +FATCASH EQU VALUE+0 +FAT_FRM EQU VALUE+2 ; MSD_FAT_SEC first sector FAT +DIR_FRH EQU VALUE+4 ; MSD_CAT_SEC first sector DIR +DIR_FRL EQU VALUE+6 ; MSD_CAT_SEC first sector DIR +DIR_FRM EQU VALUE+6 +DIR_S_S EQU VALUE+8 ; DIR_SEC_SIZE +DAT_FRM EQU VALUE+9 ; MSD_DAT_SEC +FAT_TYP EQU VALUE+11; TYPE FAT (#32 - 12bit, #36 - 16bit) +CLU_LEN EQU VALUE+12; CLASTER_LEN +ENDCLUS EQU VALUE+14 + +HANDBUF EQU VALUE+16 +FTIME EQU VALUE+16+22 +FDATE EQU VALUE+16+24 +FCLUSTR EQU VALUE+16+26 +FSIZE0 EQU VALUE+16+28 +FSIZE1 EQU VALUE+16+30 + +DISKH EQU VALUE+48 +DISKL EQU VALUE+50 +READMEM EQU VALUE+52 +SHEL_FM EQU VALUE+54 +BANKDOS EQU VALUE+55 +; EQU VALUE+56 + +;----------------- + BLOCK #8600-$-3,0 + DB 'SPT' +; BIGA EQU (($/256)+1)*256 +; BIGA2 EQU BIGA-$-2 +; DS BIGA2 +; DB "dp" +; E______ + +;STACK EQU (($/256)+2)*256 + + ENT +;START DI +; LD (SPZ+1),SP +; LD SP,#BFFF +; LD C,#FE +; CALL #3D13 +;SPZ LD SP,#0000 +; EI +; RET + + OUTEND +;[]-----------------------------------------------------------[] diff --git a/BOOT/README.TXT b/BOOT/README.TXT new file mode 100644 index 0000000..8d776c3 --- /dev/null +++ b/BOOT/README.TXT @@ -0,0 +1,9 @@ +Программа записи на FDD/HDD boot-загрузчика и файлов системы. + +Фитчи программы: + - В отличие от оригинального boot-инсталлятора, эта может + переписывать уже установленный boot-загрузчик. + - Файлы системы (system.dos, system.exe) могут иметь + любые размеры. + - При загрузке компьютера с дискеты, запрашивается новая + дискета для создания из нее загрузочной. diff --git a/Console/CONSOLE.ASM b/Console/CONSOLE.ASM new file mode 100644 index 0000000..374fc9e --- /dev/null +++ b/Console/CONSOLE.ASM @@ -0,0 +1,2276 @@ + +;[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 new file mode 100644 index 0000000..040325b --- /dev/null +++ b/Console/DOS_EQU.ASM @@ -0,0 +1,71 @@ +/* +VERSION EQU #00 +CHDISK EQU #01 +CURDISK EQU #02 +DSKINFO EQU #03 +G_ENTRY EQU #04 + +BOOTDSK EQU #09 +CREATE EQU #0A +CREAT_N EQU #0B +ERASE EQU #0D +DELETE EQU #0E +MOVE EQU #0F +RENAME EQU #10 +OPEN EQU #11 +CLOSE EQU #12 +READ EQU #13 +WRITE EQU #14 +MOVE_FP EQU #15 +ATTRIB EQU #16 +GET_D_T EQU #17 +PUT_D_T EQU #18 +F_FIRST EQU #19 +F_NEXT EQU #1A +MKDIR EQU #1B +RMDIR EQU #1C +CHDIR EQU #1D +CURDIR EQU #1E +SYSTIME EQU #21 +SETTIME EQU #22 + +WAITKEY EQU #30 +SCANKEY EQU #31 +ECHOKEY EQU #32 +CTRLKEY EQU #33 +EDIT EQU #34 +K_CLEAR EQU #35 + +SETWIN EQU #38 +SETWIN1 EQU #39 +SETWIN2 EQU #3A +SETWIN3 EQU #3B +FREEMEM EQU #3C +GETMEM EQU #3D +RETMEM EQU #3E +SETMEM EQU #3F + +EXEC EQU #40 +EXIT EQU #41 +WAIT EQU #42 + +GSWITCH EQU #43 +DOSNAME EQU #44 + +SETVMOD EQU #50 +GETVMOD EQU #51 +LOCATE EQU #52 +CURSOR EQU #53 +SELPAGE EQU #54 +SCROLL EQU #55 +CLEAR EQU #56 +RDCHAR EQU #57 +WRCHAR EQU #58 +WINCOPY EQU #59 +WINREST EQU #5A +PUTCHAR EQU #5B +PCHARS EQU #5C +RES_PRN EQU #5D +CTRLPRN EQU #5E +PRINT EQU #5F +*/ diff --git a/Console/DSS.INC b/Console/DSS.INC new file mode 100644 index 0000000..5197cee --- /dev/null +++ b/Console/DSS.INC @@ -0,0 +1,104 @@ + +DSS_VERSION EQU #00 +DSS_CHDISK EQU #01 +DSS_CURDISK EQU #02 +DSS_DSKINFO EQU #03 +;DSS_G_ENTRY EQU #04 +; EQU #05 +; EQU #06 +; EQU #07 +; EQU #08 +DSS_BOOTDSK EQU #09 +;File io +DSS_CREATE EQU #0A +DSS_CREAT_N EQU #0B +; EQU #0C +;DSS_ERASE EQU #0D +DSS_DELETE EQU #0E +;DSS_MOVE EQU #0F +DSS_RENAME EQU #10 +DSS_OPEN EQU #11 +DSS_CLOSE EQU #12 +DSS_READ EQU #13 +DSS_WRITE EQU #14 +DSS_MOVE_FP EQU #15 +DSS_ATTRIB EQU #16 +DSS_GET_D_T EQU #17 +DSS_PUT_D_T EQU #18 +DSS_F_FIRST EQU #19 +DSS_F_NEXT EQU #1A +DSS_MKDIR EQU #1B +DSS_RMDIR EQU #1C +DSS_CHDIR EQU #1D +DSS_CURDIR EQU #1E +; EQU #1F +; EQU #20 +DSS_SYSTIME EQU #21 +DSS_SETTIME EQU #22 +; EQU #23 +; EQU #24 +; EQU #25 +; EQU #26 +; EQU #27 +; EQU #28 +; EQU #29 +; EQU #2A +; EQU #2B +; EQU #2C +; EQU #2D +; EQU #2E +; EQU #2F +;Keyboard +DSS_WAITKEY EQU #30 +DSS_SCANKEY EQU #31 +DSS_ECHOKEY EQU #32 +DSS_CTRLKEY EQU #33 +;DSS_EDIT EQU #34 +DSS_K_CLEAR EQU #35 +DSS_K_SETUP EQU #36 +DSS_TESTKEY EQU #37 +;Memory +DSS_SETWIN EQU #38 +DSS_SETWIN1 EQU #39 +DSS_SETWIN2 EQU #3A +DSS_SETWIN3 EQU #3B +DSS_INFOMEM EQU #3C +DSS_GETMEM EQU #3D +DSS_FREEMEM EQU #3E +DSS_SETMEM EQU #3F +;Execution +DSS_EXEC EQU #40 +DSS_EXIT EQU #41 +DSS_WAIT EQU #42 + +DSS_GSWITCH EQU #43 +DSS_DOSNAME EQU #44 +DSS_EX_PATH EQU #45 +DSS_ENVIRON EQU #46 +DSS_APPINFO EQU #47 +; EQU #48 +; EQU #49 +; EQU #4A +; EQU #4B +; EQU #4C +; EQU #4D +; EQU #4E +; EQU #4F + +DSS_SETVMOD EQU #50 +DSS_GETVMOD EQU #51 +DSS_LOCATE EQU #52 +DSS_CURSOR EQU #53 +DSS_SELPAGE EQU #54 +DSS_SCROLL EQU #55 +DSS_CLEAR EQU #56 +DSS_RDCHAR EQU #57 +DSS_WRCHAR EQU #58 +DSS_WINCOPY EQU #59 +DSS_WINREST EQU #5A +DSS_PUTCHAR EQU #5B +DSS_PCHARS EQU #5C +;DSS_RES_PRN EQU #5D +;DSS_CTRLPRN EQU #5E +DSS_PRINT EQU #5F +; diff --git a/Console/Errors.TXT b/Console/Errors.TXT new file mode 100644 index 0000000..45055c1 --- /dev/null +++ b/Console/Errors.TXT @@ -0,0 +1,66 @@ +No free file handles +Bad Command or file name +Access denied +Memory allocation error +Cannot load COMMAND, system halted +Cannot start COMMAND, exiting +Top level process aborted, cannot continue +Write protect error +Invalid unit +Not ready +Invalid device request +Data error +Invalid device request parameters +Seek error +Invalid media type +Sector not found +Printer out of paper error +Write fault error +Read fault error +General failure +Sharing violation +Lock violation +Invalid disk change +FCB unavailable +System resource exhausted +Code page mismatch +Out of input +Insufficient disk space +Too many parameters +Required parameter missing +Invalid switch +Invalid keyword +Parameter value not inallowed range +Parameter value not allowed +Parameter value not allowed +Parameter format not correct +Invalid parameter +Invalid parameter combination +Invalid function +File not found +Path not found +Too many open files +Access denied +Invalid handle +Memory control blocks destroyed +Insufficient memory +Invalid memory block address +Invalid Environment +Invalid format +Invalid function parameter +Invalid data +Invalid drive specification +Attempt to remove current directory +Not same device +No more files +File exists +Cannot make directory entry +Fail on INT 24 +Too many redirections +Duplicate redirection +Invalid password +Invalid parameter +Network data fault +Function not supported by network +Required system component not installed + diff --git a/Console/HISTORY.TXT b/Console/HISTORY.TXT new file mode 100644 index 0000000..1acb2dd --- /dev/null +++ b/Console/HISTORY.TXT @@ -0,0 +1,4 @@ +21-02-2003 FIX BUG WITH LINE MERGE IN BAT-FILE +14-12-2002 ADD BAT-PARAMETERS %1 %2 +11-12-2002 ADD BAT-VARIABLES %VAR% +03-10-2002 FIX BUG WITH OUTPUT AT THE SCREEN IN BAT-MODE diff --git a/Console/SYS.old b/Console/SYS.old new file mode 100644 index 0000000..92cbf0e --- /dev/null +++ b/Console/SYS.old @@ -0,0 +1,2074 @@ + +;[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/CHANGES.LOG b/DSS/CHANGES.LOG new file mode 100644 index 0000000..d577f99 --- /dev/null +++ b/DSS/CHANGES.LOG @@ -0,0 +1,32 @@ +;Изменения после версии 1.70 +Важное: + +Среднее: + +Вообще не важное: +исправить выход из функции #41 при возможном увеличении номера таски на 1 при 255 + +; TEST + +;Изменения после версии 1.60 +10.02.2003 - Добавлена визуализация курсора в функции ECHOKEY. +06.02.2003 - Исправлена ошибка в разборе имени файла начинающегося с точки. +29.01.2003 - Исправлена ошибка в PUT_D_T, не обновлялась дата в файлах, в которые не производилась запись. +;Изменения после версии 1.60RC +05.12.2002 - Реализована fn. APPINFO 47h, информация о приложении. +26.11.2002 - Исправлена ошибка в CHDIR, не выполнялся запрос "." из ROOT +19.11.2002 - Добавлена корректировка атрибута файла при его создании. +19.11.2002 - Добавлено маскирование аттрибута VOLUME LABEL. +19.11.2002 - Исправлена ошибка с атрибутом system. +17.11.2002 - Реализовано system environment, fn. 46h +07.11.2002 - Добавлен запрет/разрешение прерываний в функции WINCOPY и WINREST +07.11.2002 - Исправлена ошибка в функции SCROLL (A=0) +;Изменения после версии 1.55 +06.08.2001 - Добавлена поддержка Secondary IDE +06.08.2001 - Исправлена ошибка с подразделами второго винчестера +11.07.2001 - Поддержка принтера для Sp2000 +30.07.2001 - Исправлено описание входных параметров функции удаления файла(0Eh); +;Изменения после версии 1.54 +18.07.2001 - Добавлено описание работы с графическим экраном; +18.07.2001 - Добавлено описание параметра функции получения режима экрана(51h); +15.03.2001 - Добавлено описание функции работы с командной строкой(45h); \ No newline at end of file diff --git a/DSS/DISK_X.ASM b/DSS/DISK_X.ASM new file mode 100644 index 0000000..4593d9e --- /dev/null +++ b/DSS/DISK_X.ASM @@ -0,0 +1,249 @@ + +; DISK DRIVER SPECIFICATION +;--------------------------------------------- +; COMMAND 00h (INITIALIZATION) +; +; INPUT: A - DRIVE LETTER +; IX - ENVIRONMENT +; RETURN: A - AMOUNT DRIVE SUPPORT +; HL - LENGTH DRIVER +;--------------------------------------------- +; COMMAND 01h (OPEN) +; +; INPUT: A - DRIVE +; +;--------------------------------------------- +; COMMAND 02h (CLOSE) +; +; INPUT: A - DRIVE +; RETURN: A - +;--------------------------------------------- +; COMMAND 03h (MEDIA CHECK) +; +; INPUT: A - DRIVE +; RETURN: A - 00h - OLD DISK, 0FFh - NEW DISK +;--------------------------------------------- +; COMMAND 04h (GET BPB) +; +; INPUT: HL - ADDRESS +; A - DRIVE +;--------------------------------------------- +; COMMAND 05h (INPUT) +; +; INPUT: IX:DE - ABSOLUTE SECTOR +; HL - MEMORY ADDRESS +; B - SECTORS COUNT +; A - DRIVE +;--------------------------------------------- +; COMMAND 06h (OUTPUT) +; +; INPUT: IX:DE - ABSOLUTE SECTOR +; HL - MEMORY ADDRESS +; B - SECTORS COUNT +; A - DRIVE +;--------------------------------------------- +; COMMAND 07h (REMOVABLE) +; +; INPUT: A - DRIVE +; RETURN: A = 0 - REMOVABLE +; A = 1 - NONREMOVABLE +;--------------------------------------------- +; COMMAND 08h (GENERIC IOCTL) +; +; INPUT: A - DRIVE +; B - SUBCOMMAND +; DE - MAGIC NUMBER (55AAh) +; SUBCOMMAND +;---------------------- +; 00 - GET DEVICE PARAMETERS +; 01 - READ TRACK +; 02 - TEST TRACK +; 80 - SET DEVICE PARAMETERS +; 81 - WRITE TRACK +; 82 - FORMAT TRACK +;--------------------------------------------- +; +; ERRORS: +; 0 - NO ERRORS +; 1 - BAD COMMAND +; 2 - BAD DRIVE NUMBER +; 3 - UNKNOW FORMAT +; 4 - NOT READY +; 5 - SEEK ERROR +; 6 - SECTOR NOT FOUND +; 7 - CRC ERROR +; 8 - WRITE PROTECT +; 9 - READ ERROR +; 10 - WRITE ERROR +; 11 - FAILURE +; 12 - BUSY (DEVICE OPENED) +; 13 - RESERVED + +;INTDISK PUSH HL +; PUSH BC +; LD HL,DEVICE +; INC A +;INTD001 DEC A +; JP Z,YEP +; LD C,(HL) +; INC C +; INC HL +; INC HL +; INC HL +; JP NZ,INTD001 +; POP BC +; POP HL +; LD A,2 +; SCF +; RET + +;YEP LD A,(HL) +; INC HL +; LD C,(HL) +; INC HL +; LD H,(HL) +; LD L,C +; POP BC +; EX (SP),HL +; RET + +DSS_MAX_DRIVES_AMOUNT EQU 26 + +INTDISK: + CP #FF + JR NZ,.noNeedRescan + CP C + JR Z,INITDVC_RET_DRIVE + +.noNeedRescan: + PUSH HL + PUSH BC + LD C,A + ADD A,A + ADD A,C + LD C,A + LD B,0 + LD HL,DEVICE + ADD HL,BC + LD A,(HL) + INC A + JR Z,NODEV + DEC A + INC HL + LD C,(HL) + INC HL + LD H,(HL) + LD L,C + POP BC + EX (SP),HL + RET + +NODEV POP BC + POP HL + LD A,DSS_Error.drv.INVALID_DRIVE + SCF + RET + +PDEVICE DW DEVICE +DEVICE: BLOCK DSS_MAX_DRIVES_AMOUNT*3,#FF +.End: DB #FF + +FLOPPY EQU #0001 +FIXED EQU #0002 +CDROM EQU #0004 +NETWORK EQU #0008 + +;DISKS: DB 27 ;LENGTH DISK INFO +; DW FLOPPY ;DISK TYPE +; DB 2,"A:" ;DISK NAME +; DB 11,"NO NAME " +; DB 8,"FAT12 " +; DB #00 ;PHISICAL DRIVE NUMBER +; +; DB 27 ;LENGTH DISK INFO +; DW FLOPPY ;DISK TYPE +; DB 2,"B:" ;DISK NAME +; DB 11,"NO NAME " +; DB 8,"FAT12 " +; DB #01 ;PHISICAL DRIVE NUMBER +; +; DB 27 ;LENGTH DISK INFO +; DW FIXED ;DISK TYPE +; DB 2,"C:" ;DISK NAME +; DB 11,"NO NAME " +; DB 8,"FAT16 " +; DB #80 ;PHISICAL DRIVE NUMBER +; +; DB #00 ;END OF TABLE +INITDVC_RET_DRIVE: + CALL INITDVC + LD A,(LDRIVE) + AND A + RET + +INITDVC XOR A + LD (LDRIVE),A + LD HL,DEVICE + LD (PDEVICE),HL + LD C,A + CALL FDDRIVE + LD DE,FDDRIVE + CALL MAKEDVC +// XOR A + LD C,0 + CALL HDDRIVE + LD DE,HDDRIVE + CALL MAKEDVC +// XOR A + LD C,0 + CALL RMDRIVE + LD DE,RMDRIVE + CALL MAKEDVC + XOR A + RET + +MAKEDVC LD C,A + LD HL,LDRIVE + ADD A,(HL) + LD (HL),A + LD A,C + LD C,0 + OR A + RET Z + LD HL,(PDEVICE) +.loop: LD (HL),C + INC HL + LD (HL),E + INC HL + LD (HL),D + INC HL + INC C + DEC A + JR NZ,.loop + LD (PDEVICE),HL + DEC A + LD (HL),A + RET + +;DEVICE DB #00 +; DW FDDRIVE ; FDD A +; DB #01 +; DW FDDRIVE ; FDD B +; DB #00 +; DW HDDRIVE ; HDD C +; DB #01 +; DW HDDRIVE ; HDD D +; DB #02 +; DW HDDRIVE ; HDD E +; DB #03 +; DW HDDRIVE ; HDD F +; DB #04 +; DW HDDRIVE ; HDD G +; DB #05 +; DW HDDRIVE ; HDD H +; DB #06 +; DW HDDRIVE ; HDD I +; DB #07 +; DW HDDRIVE ; HDD J +; DB #FF + diff --git a/DSS/DOS-MAIN.ASM b/DSS/DOS-MAIN.ASM new file mode 100644 index 0000000..55badef --- /dev/null +++ b/DSS/DOS-MAIN.ASM @@ -0,0 +1,572 @@ + +;[BEGIN] +;//MODULE: DOS-MAIN AUTHOR: Denis Parinov +;//CREATE: A LONG TIME AGO :) +;--------------------------------------------------------------- +;Rev Date Name Description +;--------------------------------------------------------------- +;[ ] путь текущего каталога в DIR выводится с глюком если он длинее 256 байтов +;[ ] путь в приглашении консоли выводится с глюком если путь длинее 256 байтов +;[ ] ;!FIXIT какой-то баг при котором если нет диска и на него полезть, то всё ломается +;R11 17-04-2023 BAO OPTIMIZED BUFFERS, FREED UP 768 BYTES FOR CODE +;R10 14-04-2023 BAO Аварийный зависон с выводом сообщения при старте системы, если нет свободной памяти +;R09 08-04-2023 BAO Сокращение размера таблицы API до 96 функций (0 - #5F). (Опционально при компиляции) +;R08 15-04-2003 DNS RENAMED FN. OPEN AND CLOSE +;R07 31-03-2003 DNS NEW DEPLOYING ROUTINE +;R06 31-03-2003 DNS RELAYOUTING MEMORY +;R05 27-03-2003 DNS CHANGE DRV. INIT. METHOD +;R04 27-03-2003 DNS DRIVERS MOVE TO SPECIAL PAGE +;R03 14-03-2003 DNS CODE OPTIMIZATION +;R02 19-11-2002 DNS ADD ENVIRONMENT INITIALIZATION +;R01 14-11-2002 DNS CUT AND MOVE BPB-STRUCT +;--------------------------------------------------------------- +; OUTPUT './Build/system.dos' + +; MODULE MAIN +//SPRINTER EQU 2000 + + includelua 'Shared_includes/lua/Functions.lua' + INCLUDE 'defines.inc' + include 'shared_includes/constants/sp2000.inc' + include 'shared_includes/constants/bios_equ.inc' + include 'shared_includes/constants/dss_equ.inc' + include 'shared_includes/structures/FileSystem.inc' + include 'shared_includes/macroses/accelerator.z80' + include 'shared_includes/macroses/macros.z80' + include 'Structures.inc' + INCLUDE 'VERSION.INC' + INCLUDE 'DSS_MACROSES.Z80' + +;PAGEDRV EQU #00 + +; DIRPAGE EQU 0 +; FATPAGE EQU 1 +; TXTPAGE EQU 2 +; ENVPAGE EQU 2 +; DRVPAGE EQU 3 +; ENVPAGE EQU 3 +; DRVPAGE EQU 4 + +; TXTADDR EQU #C000 +; ENVADDR EQU #E400 + +; DIR EQU #C000 +; FAT EQU #C000 + + +; +; = -- = -- = -- = -- = = -- = -- = = -- = -- = = -- = -- = -- = -- = --; + ORG 0 +; +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; <[CLOSE TASK]> ; +RST_0x00: JP LEAVE ; +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; + +; +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; <[BIOS API]> ; + _mInfoBLOCK 8-$,#FF ; +RST_0x08: PUSH AF ; + LD A,SYS_PORT.PAGE8; + OUT (SYS_PORT.ON),A ; + POP AF ; + RET ; +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; + +; +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; <[DSS API]> ; + _mInfoBLOCK #10-$,#FF ; +RST_0x10: JP RST_10 ; +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; + +; +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; <[DRIVE API]> ; + _mInfoBLOCK #18-$,#FF ; +;A0018 JP INTDISK ; +RST_0x18: PUSH AF ; + PUSH BC ; +DRV_PG_NUMBER+2: ; + LD BC,0*256+SLOT0 ; + JP PORTAL.outMAIN ; +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; + +; +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; <[NOT USED]> ; + _mInfoBLOCK #20-$,#FF ; +RST_0x20: JP RST_20 ; +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; + +; +RST_20: +RST_28: +NOPS: LD A,DSS_Error.sys.INVALID_FUNCTION + SCF + RET +; + +; +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; <[NOT USED]> ; + _mInfoBLOCK #28-$,#FF ; +RST_0x28: JP RST_28 ; +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; + +; +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; <[MOUSE API]> ; + _mInfoBLOCK #30-$,#FF ; +RST_0x30: JP INTMOUS ; +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; + +; +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; <[MAIN INT]> ; + _mInfoBLOCK #38-$,#FF ; +RST_38: ; + JP RST_0x38 ; Этот джамп нужен, чтоб софты могли легко менять обработчик на свой. Костыльно. +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 new file mode 100644 index 0000000..aabd6cd --- /dev/null +++ b/DSS/DOS5.ASM @@ -0,0 +1,1748 @@ + +;[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 new file mode 100644 index 0000000..601f442 --- /dev/null +++ b/DSS/DOS_FM.ASM @@ -0,0 +1,831 @@ + +;[BEGIN] +;//MODULE: DOS_FM +;//CREATE: 19-05-1998 AUTHOR: Denis Parinov +;//UPDATE: 24-10-1999 DNS Restore module +;--------------------------------------------------------------- +;Rev Date Name Description +;--------------------------------------------------------------- +;R01 16-11-1999 DNS ERROR READING FAT CHAIN +;--------------------------------------------------------------- + +;FMS DB FMCOUNT + +;ACCESS MODE: +; 00 - READ/WRITE +; 01 - READ +; 02 - WRITE +;FM_BUF: +;File Manipulator (FM) + ; BYTE '. ' ;+00 NAME + ; BYTE ' ' ;+08 EXT + ; BYTE #10 ;+11 ATTRIBUT + ; BYTE 0 ;+12 RESERVED; !TODO следующий кластер для чтения + ; BYTE 0 ;+13 RESERVED; !TODO следующий кластер для записи + ; BLOCK 8,0 ;+14 RESERVED + ; WORD #0000 ;+22 TIME + ; WORD #0000 ;+24 DATE + ; WORD #0000 ;+26 START CLUSTER + ; DWORD #0000 ;+28 SIZE FILE + ; DWORD #0000 ;+32 FILE POSITION (FP) + ; WORD #0000 ;+36 DIRECTORY CLUSTER + ; WORD #0000 ;+38 HANDLE NUMBER + ; BYTE #00 ;+40 DRIVE OR CURRENT + ; BYTE #00 ;+41 ACCESS MODE + ; BYTE #00 ;+42 TASK + ; BYTE #00 ;+43 EMPTY +/* +;!TEST +FM_BUF: _sFM +.Size EQU _sFM + BLOCK (FMCOUNT-1)*FM_BUF.Size, 0 +*/ + + MACRO _mFM_FIND + CP FMCOUNT+1 + JR NC,ABS_FM + PUSH DE + + LD IY,FM_BUF + LD DE,FM_BUF.Size + AND A + JR Z,.endLoop +.loop: ADD IY,DE + DEC A + JR NZ,.loop +.endLoop: + POP DE + ; A=0 + OR (IY) ;+00 NAME + ENDM + +SET_FM: + _mFM_FIND + + LD A,0 ;!FIXIT номер ошибки + RET NZ +ABS_FM LD A,DSS_Error.sys.INVALID_HANDLE + SCF + RET + +RES_FM: + _mFM_FIND + + LD A,5 + EXX + SCF + RET Z + XOR A + LD (IY+0),A + RET + +GET_FM: LD B,FMCOUNT + LD C,#FF + LD IY,FM_BUF-FM_BUF.Size + LD DE,FM_BUF.Size +.loop: ADD IY,DE + INC C + LD A,(IY+0) + OR A + RET Z + DJNZ .loop + LD A,DSS_Error.sys.NO_HANDLES + SCF + RET + +; HL:IX - OFFSET POINTER +; A - FILE MANIPULATOR +MOVE_FP CALL SET_FM + RET C + INC B + DEC B + JR Z,.F_start + DEC B + JR Z,.F_current + DEC B + JR Z,.B_end + LD A,DSS_Error.sys.INVALID_FUNCTION + SCF + RET + +;from Start File +.F_start: + ; B=0 + LD C,B + LD D,B + LD E,B + JR MOVE_F1 + +;from End File +.B_end: LD C,(IY+28) + LD B,(IY+29) + LD E,(IY+30) + LD D,(IY+31) + JR MOVE_F1 + +;from Current Position +.F_current: + LD C,(IY+32) + LD B,(IY+33) + LD E,(IY+34) + LD D,(IY+35) +MOVE_F1 ADD IX,BC + ADC HL,DE + LD D,XH + LD E,XL + LD (IY+32),E + LD (IY+33),D + LD (IY+34),L + LD (IY+35),H + XOR A + RET + +;FP COMPARE +; CY - FILE POINTER > SIZE +; NC - FILE POINTER < SIZE + +MOVE_CP LD L,(IY+28) + LD H,(IY+29) + LD E,(IY+32) + LD D,(IY+33) + AND A + SBC HL,DE + LD L,(IY+30) + LD H,(IY+31) + LD E,(IY+34) + LD D,(IY+35) + SBC HL,DE + RET + +;-------------------- + +ECL2 POP BC + POP DE + AND A + RET + +BLOKRD0 POP BC + POP DE + SCF + RET + +;READ SECTORS OF FILE +;HL:DE - FP (in sectors) +; B - Amount sectors +BLOK_RD PUSH BC + LD (READMEM),IX + LD A,(BootSector.S_P_C) ;SECTORS PER CLUSTER + LD C,A + LD B,0 + CALL DIV32 + LD B,XH + LD C,XL + PUSH HL ;RESIDUE + LD L,(IY+26) ;START CLUSTER + LD H,(IY+27) + LD A,H + OR L + JR NZ,BLOKRD2 + JR ECL2 ;R01 JR BLOKRD0 +BLOKRD1 PUSH BC + CALL R_F_FAT + POP BC + JR C,ECL2 ;R01 + EX DE,HL + DEC BC +BLOKRD2 LD A,B + OR C + JR NZ,BLOKRD1 + POP DE + POP BC + LD A,(BootSector.S_P_C) + SUB E + LD C,A ;\ + CP B ; \ + JR C,BLOKRD3 ;SIZE > RESIDUE CLUSTER ; \ + LD C,B ;SIZE < CLUSTER ;->-|--> ; !TODO разобраться +BLOKRD3 LD A,B ; / + SUB C ; / + LD B,A ;/ + PUSH HL + PUSH BC + PUSH DE + CALL NSECTOR + POP DE + ADD IX,DE + JR NC,BLOKRD4 + INC HL +BLOKRD4 LD DE,(READMEM) + LD A,(FatBuffer.DRIVE) + LD B,C + LD C,5 + RST #18 + JP C,BLOKRD0 + POP BC + LD HL,(READMEM) + LD DE,(BootSector.B_P_S) +BLOKRD5 ADD HL,DE + DEC C + JR NZ,BLOKRD5 + LD (READMEM),HL + POP DE + LD A,B + OR A + RET Z +BLOKRD6 LD HL,BootSector.S_P_C + LD A,B + SUB (HL) + LD B,A + LD C,(HL) + JR NC,BLOKRD7 + LD B,0 + ADD A,(HL) ;0 AND CF + LD C,A + OR A ;CLEAR CF + RET Z +BLOKRD7 EX DE,HL + PUSH BC + CALL R_F_FAT + POP BC + JP C,ECL1 ;R01? + EX DE,HL + PUSH HL + PUSH BC + CALL NSECTOR + LD DE,(READMEM) + LD A,(FatBuffer.DRIVE) + LD B,C + LD C,5 + RST #18 + JP C,BLOKRD0 + POP BC + LD HL,(READMEM) + LD DE,(BootSector.B_P_S) +BLOKRD8 ADD HL,DE + DEC C + JR NZ,BLOKRD8 + LD (READMEM),HL + POP DE + JR BLOKRD6 + +ECL1 AND A + RET + +;-------------------- + +BLOKWRC POP BC +BLOKWR0 POP BC + POP DE + SCF + RET + +;WRITE SECTORS OF FILE +;HL:DE - FP (in sectors) +; B - Amount sectors + +BLOK_WR PUSH BC + LD (READMEM),IX + LD A,(BootSector.S_P_C) ;SECTORS PER CLUSTER + LD C,A + LD B,0 + CALL DIV32 + LD B,XH + LD C,XL + PUSH HL ;RESIDUE + LD L,(IY+26) ;START CLUSTER + LD H,(IY+27) + LD A,H + OR L + JR NZ,BLOKWR2 + PUSH BC + CALL G_CLUST + JR C,BLOKWRC + LD (IY+26),L + LD (IY+27),H + LD DE,(FatBuffer.ENDCLUS) + CALL W_T_FAT + PUSH HL + CALL WR_FAT + POP HL + POP BC + JR BLOKWR2 +BLOKWR1 PUSH BC + CALL R_F_FAT + JR NC,BLOKWRB + PUSH HL + CALL INC_FAT + POP HL + JR C,BLOKWRC + CALL R_F_FAT +BLOKWRB POP BC + EX DE,HL + DEC BC +BLOKWR2 LD A,B + OR C + JR NZ,BLOKWR1 + POP DE + POP BC + LD A,(BootSector.S_P_C) + SUB E + LD C,A + CP B + JR C,BLOKWR3 ;SIZE > RESIDUE CLUSTER + LD C,B ;SIZE < CLUSTER +BLOKWR3 LD A,B + SUB C + LD B,A + PUSH HL + PUSH BC + PUSH DE + CALL NSECTOR + POP DE + ADD IX,DE + JR NC,BLOKWR4 + INC HL +BLOKWR4 LD DE,(READMEM) + LD A,(FatBuffer.DRIVE) + LD B,C + LD C,6 + RST #18 + JP C,BLOKWR0 + POP BC + LD HL,(READMEM) + LD DE,(BootSector.B_P_S) +BLOKWR5 ADD HL,DE + DEC C + JR NZ,BLOKWR5 + LD (READMEM),HL + POP DE + LD A,B + OR A + RET Z +BLOKWR6 LD HL,BootSector.S_P_C + LD A,B + SUB (HL) + LD B,A + LD C,(HL) + JR NC,BLOKWR7 + LD B,0 + ADD A,(HL) ;0 AND CF + LD C,A + OR A ;CLEAR CF + RET Z +BLOKWR7 EX DE,HL + PUSH BC + CALL R_F_FAT + JR NC,BLOKWR9 + PUSH HL + CALL INC_FAT + POP HL + JR C,BLOKWRA + CALL R_F_FAT +BLOKWR9 POP BC + EX DE,HL + PUSH HL + PUSH BC + CALL NSECTOR + LD DE,(READMEM) + LD A,(FatBuffer.DRIVE) + LD B,C + LD C,6 + RST #18 + JP C,BLOKWR0 + POP BC + LD HL,(READMEM) + LD DE,(BootSector.B_P_S) +BLOKWR8 ADD HL,DE + DEC C + JR NZ,BLOKWR8 + LD (READMEM),HL + POP DE + JR BLOKWR6 + +BLOKWRA POP BC + LD A,DSS_Error.sys.DISK_FULL + SCF + RET + +TSTSIZE XOR A + LD (READCOD),A + LD L,(IY+32) ;FP LOW + LD H,(IY+33) + ADD HL,DE + EXX + LD DE,0 + LD L,(IY+34) ;FP HIGH + LD H,(IY+35) + ADC HL,DE + EXX ;HL':HL - NEW FP + LD C,(IY+28) + LD B,(IY+29) ;SIZE LOW + AND A + SBC HL,BC + EXX + LD C,(IY+30) ;SIZE HIGH + LD B,(IY+31) + SBC HL,BC + EXX + RET C ;OK READ ALL + EX DE,HL + SBC HL,DE ;VERY BIG + EX DE,HL + LD A,#FF + LD (READCOD),A + RET + +; HL - ADDRESS +; DE - SIZE +; A - FM + +READ LD (R_POINT),HL + LD (S_POINT),HL + CALL SET_FM + RET C + CALL TSTSIZE + LD A,D + OR E + JP Z,NOREAD + PUSH DE + LD A,(IY+_sFM.DRIVE) + CALL OPENDSK + JP C,RPERR1 + LD C,(IY+_sFM.F_POSITION) + LD E,(IY+_sFM.F_POSITION+1) + LD A,E + AND #01 + LD B,A + LD D,(IY+_sFM.F_POSITION+2) + LD L,(IY+_sFM.F_POSITION+3) + LD H,0 + OR A + RR L + RR D + RR E ;HL:DE FP (in sectors) + ; BC FP residue (in bytes) + LD A,B + OR C + JP NZ,ROV1 +ROV4 POP BC + PUSH BC + SRL B + JR Z,ROV2 + LD (SECTORH),HL + LD (SECTORL),DE + LD IX,(R_POINT) + CALL BLOK_RD + JP C,RPERR1 + LD DE,(R_POINT) +READMEM+1: LD HL,0 // LD HL,(READMEM) + AND A + SBC HL,DE + LD C,H + LD B,0 + ADD HL,DE + LD (R_POINT),HL + SRL C +SECTORL+1: LD HL,0 // LD HL,(SECTORL) + ADD HL,BC + EX DE,HL +SECTORH+1: LD HL,0 // LD HL,(SECTORH) + LD C,B + ADC HL,BC +ROV2 POP BC + LD A,B + AND #01 + LD B,A + OR C + JP Z,ROV6 + PUSH BC + LD IX,BUFFER+#C000 + LD B,1 + IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + CALL BLOK_RD + POP BC + LD C,SLOT3 + OUT (C),B + JP C,RPERR1 + LD HL,BUFFER + LD DE,(R_POINT) + POP BC + LDIR + LD (R_POINT),DE + +ROV6: +S_POINT+1: LD HL,0 // LD HL,(S_POINT) + LD DE,(R_POINT) + EX DE,HL + AND A + SBC HL,DE + PUSH HL + EX DE,HL + LD XH,D + LD XL,E + LD HL,0 + CALL MOVE_FP.F_current + POP DE +NOREAD: +READCOD+1: LD A,0 // LD A,(READCOD) + OR A + RET + +ROV1 PUSH BC + PUSH HL + PUSH DE + LD IX,BUFFER+#C000 + LD B,1 + IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + CALL BLOK_RD + POP BC + LD C,SLOT3 + OUT (C),B + POP HL + JP C,RPERR3 + LD BC,1 + ADD HL,BC + EX DE,HL + POP HL + LD C,B + ADC HL,BC + EXX + POP DE + LD HL,512 + AND A + SBC HL,DE + LD B,H + LD C,L + POP HL + AND A + SBC HL,BC + JR NC,ROV3 + ADD HL,BC + LD B,H + LD C,L + LD HL,0 +ROV3 PUSH HL + LD HL,BUFFER + ADD HL,DE + LD DE,(R_POINT) + LDIR + LD (R_POINT),DE + EXX + JP ROV4 + +RPERR3 POP HL +RPERR2 POP HL +RPERR1 POP BC + SCF + RET + +PWERR3 POP HL +PWERR2 POP HL +PWERR1 POP BC + SCF + RET + +RD_ONLY POP DE + LD A,DSS_Error.sys.READONLY + SCF + RET + +; HL - ADDRESS +; DE - SIZE +; A - FM + +WRITE LD (R_POINT),HL + LD (S_POINT),HL + PUSH DE + CALL SET_FM + JP C,PWERR1 + LD A,(IY+_sFM.ACCESS_MODE) + AND #01 + JR NZ,RD_ONLY + SET 7,(IY+_sFM.ACCESS_MODE) + SET 5,(IY+_sFM.ATTRIBUT) + LD A,(IY+_sFM.DRIVE) + CALL OPENDSK + JP C,PWERR1 + LD C,(IY+32) + LD A,(IY+33) + LD E,A + AND #01 + LD B,A + LD D,(IY+34) + LD L,(IY+35) + LD H,0 + OR A + RR L + RR D + RR E ;HL:DE FP (in sectors) + ; BC FP residue (in bytes) + LD A,B + OR C + JP NZ,WOV1 +WOV4 POP BC + PUSH BC + SRL B + JR Z,WOV2 + PUSH HL + PUSH DE + PUSH BC +R_POINT+2: LD IX,0 // LD IX,(R_POINT) + + CALL BLOK_WR + POP BC + JP C,PWERR3 + LD C,B + LD HL,(R_POINT) + LD DE,#0200 +WOV5 ADD HL,DE + DJNZ WOV5 + LD (R_POINT),HL + LD B,0 + POP HL + ADD HL,BC + EX DE,HL + POP HL + LD C,B + ADC HL,BC +WOV2 POP BC + LD A,B + AND #01 + LD B,A + OR C + JP Z,WOV6 + PUSH HL + PUSH DE + PUSH BC + LD IX,BUFFER+#C000 + LD B,1 + IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + CALL BLOK_RD + POP BC + LD C,SLOT3 + OUT (C),B + LD DE,BUFFER + LD HL,(R_POINT) + POP BC + JP C,PWERR2 + LDIR + LD (R_POINT),HL + POP DE + POP HL + LD IX,BUFFER+#C000 + LD B,1 + IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + CALL BLOK_WR + POP BC + LD C,SLOT3 + OUT (C),B + RET C +WOV6 LD DE,(S_POINT) + LD HL,(R_POINT) + AND A + SBC HL,DE + PUSH HL + EX DE,HL + LD XH,D + LD XL,E + LD HL,0 + CALL MOVE_FP.F_current + CALL MOVE_CP + POP DE + RET NC + LD L,(IY+32) + LD H,(IY+33) + LD C,(IY+34) + LD B,(IY+35) + LD (IY+28),L + LD (IY+29),H + LD (IY+30),C + LD (IY+31),B + AND A + RET + +WOV1 PUSH BC + PUSH HL + PUSH DE + LD IX,BUFFER+#C000 + LD B,1 + IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + CALL BLOK_RD + POP BC + LD C,SLOT3 + OUT (C),B + POP DE + POP HL + EXX + POP DE + JP C,PWERR1 + LD HL,512 + AND A + SBC HL,DE + LD B,H + LD C,L + POP HL + AND A + SBC HL,BC + JR NC,WOV3 + ADD HL,BC + LD B,H + LD C,L + LD HL,0 +WOV3 PUSH HL + LD HL,BUFFER + ADD HL,DE + LD DE,(R_POINT) + EX DE,HL + LDIR + LD (R_POINT),HL + EXX + PUSH HL + PUSH DE + LD IX,BUFFER+#C000 + LD B,1 + IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + CALL BLOK_WR + POP BC + LD C,SLOT3 + OUT (C),B + POP HL + JP C,PWERR2 + LD BC,1 + ADD HL,BC + EX DE,HL + POP HL + LD C,B + ADC HL,BC + JP WOV4 + + +; HL - CLUSTER +; HL:IX - SECTOR +NSECTOR DEC HL + DEC HL + EX DE,HL + LD A,(BootSector.S_P_C) + LD B,A + LD HL,0 + LD IX,0 +ADD_DE1 ADD IX,DE + JR NC,ADD_DE2 + INC HL +ADD_DE2 DJNZ ADD_DE1 + LD DE,(FatBuffer.DAT_FRM) + ADD IX,DE + LD DE,#0000 + ADC HL,DE + RET + +; HL:DE / BC => DE:IX HL-OSTATOK +DIV32 LD XH,D + LD XL,E + EX DE,HL + LD HL,0 + LD A,#20 +DIV001 ADD IX,IX + EX DE,HL + ADC HL,HL + EX DE,HL + ADC HL,HL + SBC HL,BC + JR NC,DIV002 + ADD HL,BC + DEC A + JR NZ,DIV001 + RET +DIV002 INC IX + DEC A + JR NZ,DIV001 + RET + +//READCOD DB #00 + +//READMEM DW #0000 + +//SECTORH DW 0 +//SECTORL DW 0 + +//R_POINT DW 0 +//S_POINT DW 0 + +;//MODULE: DOS_FM +;[END] + diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM new file mode 100644 index 0000000..6d2fe5d --- /dev/null +++ b/DSS/DOS_X.ASM @@ -0,0 +1,547 @@ + +;[BEGIN] +;//MODULE: DOS_X +;//CREATE: 19-05-1998 AUTHOR: Denis Parinov +;//UPDATE: 24-10-1999 DNS Restore module +;--------------------------------------------------------------- +;Rev Date Name Description +;--------------------------------------------------------------- +;R13 06-04-2023 BAO Функцию SETBOOT можно вызвать только раз (если завершится корректно) +;R12 03-04-2023 BAO Добавлена функция рескана драйвов LD C,8 : RST #10 +;R11 15-04-2003 DNS ROUTINE FOR STORE CURDISK AND CURDIR ;!FIXIT работает криво +;R10 03-04-2003 DNS IMPROVED FN. VERSION +;R09 27-03-2003 DNS PASTED SET/GET BOOT FN. +;R08 14-11-2002 DNS IMPROVE BPB-FUNCTION +;R07 17-12-1999 DNS BUG FIX SIGNATURE #55AA AT 510 OFFSET +;R06 21-11-1999 DNS FN. DISKINF SUPPORT ALL DISKS +;R05 21-11-1999 DNS BUG FIX SIGNATURE #55AA IN BOOT SECTOR +;R04 08-11-1999 DNS KILL OLD FUNCTIONS +;R03 23-11-1998 DNS BUG FIX (IX+28) -> (IY+28) +;R02 21-11-1998 DNS CHANGE FUNCTION "MAKE FAT" +;R01 20-11-1998 DNS REPAIR FUNCTION "SAVE" +;--------------------------------------------------------------- + +; RGADR EQU #89 ;VIDEO CONTROL REGISTER +; SLOT0 EQU #82 ;WIN #0000-#3FFF +; SLOT1 EQU #A2 ;WIN #4000-#7FFF +; SLOT2 EQU #C2 ;WIN #8000-#BFFF +; SLOT3 EQU #E2 ;WIN #C000-#FFFF + +; SYSPAGE EQU #FE + +;Commands for restart #10 +//NOPS: LD A,DSS_Error.sys.INVALID_FUNCTION +// SCF +// RET + +VERSION: + LD DE,VERS*256+MODF + XOR A + LD H,A ;!TODO пихать сюда OSINFO + LD L,A + LD BC,BUILD + RET + +//;R10 +//OSINFO: +//OSINFO_SIG: DB "OSINFOSTRUCTURE",0 + + +;R09 +BOOTDRV: DB #FF + +BOOTDSK: + INC B + DEC B + JR Z,GETBOOT + DEC B +.chg: JR Z,SETBOOT ;R13 меняется на JR С,SETBOOT после первого удачного исполнения SETBOOT + LD A,DSS_Error.sys.INVALID_FUNCTION + SCF + RET + +;GET BOOT DISK + +GETBOOT LD A,(BOOTDRV) + AND A + RET + +;SET BOOT DISK +SETBOOT: + LD B,A + LD C,0 +.loop: PUSH BC + LD A,C + LD BC,#0008 + LD DE,#55AA + RST #18 + POP BC + JR C,.NoSupport + EX AF,AF' ;PHISICAL DRIVE NUMBER + CP B + JR NZ,.NoSupport + ;R13 + LD A,#38 ; opcode for JR C,addr + LD (BOOTDSK.chg),A + ;R13 + LD A,C + LD (BOOTDRV),A + AND A + RET +.NoSupport: + INC C + LD A,(LDRIVE) + CP C + JR NZ,.loop + SCF + RET +;R09 + +;!!!!! Дубль - CHNDISK = OPENDSK +/* +CHNDISK: + PUSH AF + LD C,1 + RST #18 + POP BC + JP C,NDISK11 + LD A,B + LD (FatBuffer.DRIVE),A + CALL RD_BPB + RET C + LD A,(LDRIVE) + AND A + RET +NDISK11: + CP DSS_Error.sys.INVALID_DRIVE + SCF + RET Z + LD A,DSS_Error.sys.NOT_READY + RET +*/ + + +CURRDSK: LD A,(FatBuffer.DRIVE) + AND A + RET + +DISKINF: INC A + JR Z,CURRDS ;R06 + DEC A ;R06 + CALL CHNDISK ;R06 + RET C ;R06 +CURRDS: LD HL,2 + LD BC,0 +FRESP: PUSH BC + CALL R_F_FAT + POP BC + CP 10 + JR Z,FRESP2 + + LD A,E + OR D + JR NZ,SKIC + INC BC +SKIC: INC HL + JP FRESP + +FRESP2: LD D,B + LD E,C + LD HL,(MAX_CLU) + DEC HL + LD BC,(BootSector.B_P_S) + LD A,(BootSector.S_P_C) + AND A + RET + +LDRIVE: DB #02 +TDRIVE: DB #00 +TCLUST: DW #0000 +TCOUNT: DW #0000 + +;R04SIZE2CL LD DE,(B_P_C) +;R04 XOR A +;R04 SCF +;R04S2C01 RR D +;R04 RR E +;R04 JR C,S2C02 +;R04 RR H +;R04 RR L +;R04 RR B +;R04 RR C +;R04 JP NC,S2C01 +;R04 LD A,1 +;R04 JP S2C01 +;R04S2C02 OR A +;R04 RET Z +;R04 INC BC +;R04 RET + +;R04L_SEC_X DW 0 +;R04H_SEC_X DW 0 + +; !FIXIT чёт не используется +TESTDSK LD A,(FatBuffer.DRIVE) + LD C,3 + RST #18 + OR A + RET Z +RD_BPB LD C,SLOT3 + IN B,(C) + PUSH BC + +;!!!!! лучше оставить как в оригинале, потому что вызов этой функции +; может в дальнейшем понадобиться, и пускай она сама достаёт переменную DRIVE + ; ex af,af' ;1451 + ; in a,(SLOT0) ;1452 + ; out (SLOT3),a ;1454 + ; ld de,SECBUF+#C000 ;1456 + ; ex af,af' ;1459 + IN A,(SLOT0) + OUT (SLOT3),A +;R08 LD DE,BOOT+#C000 + LD DE,SECBUF+#C000 ;R08 + LD A,(FatBuffer.DRIVE) +;!!!!! ------------------------------ + + LD C,4 + RST #18 + POP BC + OUT (C),B + JP C,RDERR1 + PUSH IY + LD DE,#AA55 ;R05 +;R08 LD HL,(BOOT+510) ;R07 + LD HL,(SECBUF+510) ;R08 + AND A ;R05 + SBC HL,DE ;R05 + JP NZ,ERR_BPB ;R05 +;R08 + LD HL,SECBUF ;R08 + LD DE,BootSector ;R08 + LD BC,_sBOOT_SEC ;R08 size + LDIR +;R08 + + LD IY,BootSector + LD A,(IY+_sBOOT_SEC.ID_FORM) + CP #F0 + JP C,ERR_BPB + LD HL,0 ; calc. first sector FAT + LD E,(IY+_sBOOT_SEC.RESERVE) ;Reserve sec + LD D,(IY+_sBOOT_SEC.RESERVE+1) + ADD HL,DE +; LD E,(IY+#1C) ;Hidden sec +; LD D,(IY+#1D) +; ADD HL,DE +; LD (FatBuffer.FAT_FRM),HL ; first sector FAT + LD (FatBuffer.FAT1_XX),HL ; first sector FAT #1 + LD (FatBuffer.FAT2_XX),HL + + LD E,(IY+_sBOOT_SEC.S_P_F) ; sectors in FAT + LD D,(IY+_sBOOT_SEC.S_P_F+1) + LD A,(BootSector.FAT_NUM) ; amount FATs + CP 1 + JR Z,C_DATA1 + DEC A + ADD HL,DE + LD (FatBuffer.FAT2_XX),HL +C_DATA1 ADD HL,DE + DEC A + JR NZ,C_DATA1 + LD (FatBuffer.DIR_FRM),HL ; first sector DIR + + LD C,(IY+#0B) ; Size sectors + LD B,(IY+#0C) + RL C + RL B + RL C + RL B + RL C + RL B + LD C,B + LD B,0 ; BC - File handels in sectors + LD A,C + LD (FatBuffer.F_P_S),A + LD E,(IY+_sBOOT_SEC.F_P_DIR) ; Number file handel + LD D,(IY+_sBOOT_SEC.F_P_DIR+1) + EX DE,HL + DEC HL + XOR A +NEXTAD2 + INC A + JP Z,ERR_BPB + SBC HL,BC + JR NC,NEXTAD2 + EX DE,HL + LD C,A ; A - sectors in DIR + LD B,0 + LD (FatBuffer.DIR_S_S),A + ADD HL,BC ; Start DATA area + LD (FatBuffer.DAT_FRM),HL + ;LD HL,0 + LD H,B ; тут в B ноль должен быть + LD L,B + LD C,(IY+#0B) ; Size sector + LD B,(IY+#0C) + LD A,(BootSector.S_P_C) +NEXTAD3 + ADD HL,BC ; calc. cluster size + DEC A + JR NZ,NEXTAD3 + LD (FatBuffer.CLU_LEN),HL + EX DE,HL + LD HL,#3FFF + XOR A +NEXTAD4 + INC A + JP Z,ERR_BPB + SBC HL,DE + JR NC,NEXTAD4 + LD (FatBuffer.C_P_B),A ; A - Clusters per bank (16k) + + LD HL,BootSector.ID_FAT + LD DE,FatBuffer.MSG + LD B,3 +R_BPBL1 + LD A,(DE) + CP (HL) + JP NZ,IBMDOS_ + INC HL + INC DE + DJNZ R_BPBL1 +FID LD A,(HL) + INC HL + CP #20 + JR Z,FID + CP "1" + JP NZ,ERR_BPB + LD A,(HL) + CP "6" ; FAT16 + LD HL,#FFFF + JR Z,BPB_FAT + CP "2" ; FAT12 + JP NZ,ERR_BPB + LD HL,#0FFF +BPB_FAT + LD (FatBuffer.FAT_TYP),A + LD (FatBuffer.ENDCLUS),HL + LD HL,0 + LD C,(IY+_sBOOT_SEC.S_P_T) ; Sector per track + LD B,(IY+_sBOOT_SEC.S_P_T+1) + LD A,(BootSector.HEADS) +BPB_L1: ; calc. sector per cylinder + ADD HL,BC + DEC A + JR NZ,BPB_L1 + LD (FatBuffer.S_X_H),HL + + LD DE,(FatBuffer.DAT_FRM) +; LD E,(IY+#1C) ;Hidden sec +; LD D,(IY+#1D) +; AND A +; SBC HL,DE +; EX DE,HL + LD L,(IY+_sBOOT_SEC.S_P_D) + LD H,(IY+_sBOOT_SEC.S_P_D+1) + LD A,H + OR L + JP NZ,HDDSMAL + LD L,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS) + LD H,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+1) + LD C,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+2) + LD B,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+3) + AND A + SBC HL,DE + JP NC,HDDBIG + DEC BC + JP HDDBIG +HDDSMAL: +; AND A ;тут CF полюбас сброшен должен быть + SBC HL,DE + LD BC,0 +HDDBIG LD A,(BootSector.S_P_C) + SCF +S4C01 RRA + JR C,S4C02 + RR B + RR C + RR H + RR L + JP S4C01 +S4C02 INC HL + LD (MAX_CLU),HL + POP IY +; LD DE,FAT +; LD HL,0 +; LD IX,(FAT_FRM) +; LD B,3 +; LD A,(DRIVE) +; LD C,5 +; RST #18 +; JP C,RDERR1 + LD HL,0 + LD (FATCASH),HL + LD A,FATPAGE + CALL BANK + PUSH AF + XOR A + CALL RE_FAT + POP AF + OUT (SLOT3),A + CALL R_CLUST + XOR A + RET + +IBMDOS_ LD A,(IY+_sBOOT_SEC.ID_FORM) + CP #F0 + JR C,ERR_BPB +;????? надо ли изменить? +// OR 2 +// CP #FA ; ID ram-диска + CP #F8 ; а если не F8? +;????? + LD A,'6' + LD HL,#FFFF + JP Z,BPB_FAT + + LD A,'2' + LD HL,#0FFF + JP BPB_FAT + +ERR_BPB: + POP IY + LD A,DSS_Error.sys.UNKNOWN_FORMAT + SCF + RET +RDERR1: LD A,DSS_Error.sys.NOT_READY + SCF + RET + +; +FatBuffer: +.MSG: DB 'FAT' +.READ_PG: DB #00 +.BLOCK: DB #00 +.DIR_CLU: DW #0000 +.DRIVE: DB #01 +.FAT_FRM: +.FAT1_XX: DW #0000 ; MSD_FAT_SEC first sector FAT +.FAT2_XX: DW #0000 +.DIR_FRH: DW #0000 ; MSD_CAT_SEC first sector DIR +.DIR_FRL: +.DIR_FRM: DW #0000 ; MSD_CAT_SEC first sector DIR +.F_P_S: DB #00 ; число файловых записей в секторе +.DIR_S_S: DB #00 ; DIR_SEC_SIZE +.DAT_FRM: DW #0000 ; MSD_DAT_SEC +.CLU_LEN: +.B_P_C: DW #0000 ; CLUSTER_LEN +.C_P_B: DB #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) ; ????? это используется? +.FAT_TYP: DB #00 ; TYPE FAT (#32 - 12bit, #36 - 16bit) +.S_X_H: DW #0000 ; количество секторов на цилиндре ; ????? это используется? +.ENDCLUS: DW #FFFF +; + +; +DIRSPEC: DB '\' + BLOCK DIRSPEC.DEPTH,0 ;????? Было 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 new file mode 100644 index 0000000..a74a1ed --- /dev/null +++ b/DSS/DRV-MAIN.ASM @@ -0,0 +1,237 @@ +;[BEGIN] +;//MODULE: DRV-MAIN AUTHOR: Denis Parinov +;//CREATE: 2003-03-12 +;--------------------------------------------------------------- +;Rev Date Name Description +;--------------------------------------------------------------- +;R00 2003-03-19 DNS Initial version +;--------------------------------------------------------------- +// INCLUDE "hardware.inc" +// INCLUDE "bios.inc" + + +; ORG #0000 + + MODULE DRV ; !FIXIT обойтись без модуля +;PAGEDRV EQU 0 + +;!TODO +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; <[NOT USED]> ; +A0000: JP RST_00 ; +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; + +; +RST_00: + LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET +; + +; +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; <[BIOS API]> ; + BLOCK 8-$,#FF ; +A0008: PUSH AF ; + LD A,SYS_PORT.PAGE8; + OUT (SYS_PORT.ON),A ; + POP AF ; + RET ; +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; + +;!FIXIT +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; <[DSS API]> ; + BLOCK #10-$,#FF ; +A0010: ;JP RST_10 ; + DI : HALT ; +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; + +; +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; <[DRIVE API]> ; + BLOCK #18-$,#FF ; +;A0018 JP INTDISK ; +A0018: PUSH AF ; + PUSH BC ; +MAIN_PG_NUMBER+2: ; + LD BC,0*256+SLOT0 ; !FIXIT сюда не должны вставляться номера выделенных страниц? + JP PORTAL.outDRV ; +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; + +;!TODO +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; <[NOT USED]> ; + BLOCK #20-$,#FF ; +A0020: JP RST_20 ; +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; + +; +RST_20: + LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET +; + +;!TODO +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; <[NOT USED]> ; + BLOCK #28-$,#FF ; +A0028: JP RST_28 ; +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; + +; +RST_28: + LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET +; + +;!TODO +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; <[NOT USED]> ; + BLOCK #30-$,#FF ; +A0030: JP RST_30 ; +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; + +; +RST_30: + LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET +; + +;!FIXIT +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; <[MAIN INT]> ; + BLOCK #38-$,#FF ; +A0038: ; +// JP RST_38 ; +; RST_38: ; +; INT_: PUSH AF ; +; EX AF,AF' ; +; PUSH AF ; +; PUSH BC ; +; PUSH DE ; +; PUSH HL ; +; EXX ; +; PUSH BC ; +; PUSH DE ; +; PUSH HL ; +; PUSH IX ; +; PUSH IY ; +; CALL KEYSCAN ; +; LD C,#80 ; +; RST #30 ; +; POP IY ; +; POP IX ; +; POP HL ; +; POP DE ; +; POP BC ; +; EXX ; +; POP HL ; +; POP DE ; +; POP BC ; +; POP AF ; +; EX AF,AF' ; +; POP AF ; + EI ; + RETI ; +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; + +; +KEYSCAN: RET ;!FIXIT +; + +; +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; <[ NMI ]> ; +NMI: RETN ; + BLOCK #66-$,#FF ; +A0066: JP NMI ; +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; + + +;-------------------------------; +;ADRST10 EQU #00 ;!!!!! +;-------------------------------; +;!FIXIT +RST_10 PUSH HL + LD L,C + LD H,ADRST10/256 + LD C,(HL) + INC H + LD H,(HL) + LD L,C + EX (SP),HL + RET + +; +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; <[DRIVE PAGE SWITCH]> ; + BLOCK #7E-$,0 ; +PORTAL.toMAIN: ; + PUSH BC ; +RETBANK+2: ; + LD BC,0*256+SLOT0 ; + OUT (C),B ; + ASSERT $!=84,'-> Portal error!'; +;Entry point from DSS main page ; !FIXIT если 2 раза прилететь на эту точку входа, то засрётся RETBANK + LD (RETBANK),A ; + POP BC ; + POP AF ; +ADCALL+1: ; + CALL DISPATCH ; патчится на INTDISK + JR PORTAL.toMAIN ; +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; +/* + push hl + +*/ + + +;!FIXIT чёт не то тут +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; + LD B,#00; ; + OUT (C),A ; +;--- ; + POP BC ; + RET ; +PORTAL.outDRV: ; + RET ; +;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; +; + +; +DISPATCH + CALL INITDVC + LD HL,INTDISK + LD (ADCALL),HL + LD A,(LDRIVE) + AND A + RET +; + +LDRIVE DB #00 + + INCLUDE 'disk_x.asm' + INCLUDE 'ide_drv0.asm' + INCLUDE 'fdd_drv0.asm' + ;INCLUDE 'ram_drv0.asm' + INCLUDE 'ram_drv1.asm' + + DB 0 + + ENDMODULE +; OUTEND +;[END] diff --git a/DSS/DSS_MACROSES.Z80 b/DSS/DSS_MACROSES.Z80 new file mode 100644 index 0000000..8a85c11 --- /dev/null +++ b/DSS/DSS_MACROSES.Z80 @@ -0,0 +1,72 @@ +; + MACRO _mSavePath +; PUSH HL +; LD HL,BACK_CUR_PATH +; EX (SP),HL +; CALL SAVE_CUR_PATH + ENDM +; +; + MACRO _mRestorePath +; CALL BACK_CUR_PATH + ENDM +; + +; + MACRO _mRestorStackAfterRestorePath +; POP HL ;CLEAR STACK "BACK_CUR_PATH" + ENDM +; + +; + MACRO _mDSS_Version + DB 'DSS_' + db '0'+VERS + db '.' + db MODF/10+'0' + db MODF-(MODF/10)*10+'0' + ENDM +; + +; + MACRO C_OSTYPE + IF OSTYPE = DP + + C_OSNAME + DB "-DP [",#30+REVISION,']',0 + + ELSEIF OSTYPE = BETA + + C_OSNAME + DB '-BETA [',#30+REVISION,']',0 + + ELSEIF OSTYPE = RC + + C_OSNAME + DB '-RC [',#30+REVISION,']',0 + + ELSEIF OSTYPE = RELEASE + + C_OSRELEASE + ;DB "-RELEASE",0 + + ELSE + + C_OSNAME + DB "-UNKNOWN",0 + + ENDIF + ENDM +; + +; + MACRO C_OSNAME + DB "ESTEX",0 + ENDM +; + +; + MACRO C_OSRELEASE + DB "Estex DSS",0 + ENDM +; \ No newline at end of file diff --git a/DSS/DSS_MAP.TXT b/DSS/DSS_MAP.TXT new file mode 100644 index 0000000..e57b7ad --- /dev/null +++ b/DSS/DSS_MAP.TXT @@ -0,0 +1,62 @@ +0000-0038h RESTARTS + +003B-006BH 38h Interrupt + +0066-0068h NMI + +0069-0072h RST10 routine + +0073-007Fh Align space + +0080-0085h CALL interpage gate + +0086-00C3h BPB struct + +00C4-00FAh DSS INIT routine + +00FB-00FFH SPACE + +0100-01FFH MEMORY TABLE (OWNER) + +0200-03FFH FUNCTIONS ADDRESSES + +0400-043FH KEYBOARD BUFFER +0440-0BD1H KEYBOARD DRIVER + +0BD2-0EF5H SCREEN DRIVER + +0EF6-1100H FAT ROUTINES + +1101-1342H DISK IO ROUTINES + +1343-1443H CURRENT DIR NAME BUFFER + +1444-16BDH HANDLES AND FILE IO ROUTINES + +16BE-25C7H FILE AND DIR ROUTINES (DOS5) + +25C8-27ACH EXECUTE ROUTINES + +27AD-2882H MEMORY ROUTINES + +2883-2CAEH EXEC + +?2CAF-2EAEH EXEBUFFER (GLUK?) + +2EAF-2FAEH PROCESS STACK BUFFER + +2FAF-30CBH ENVIRONMENT ROUTINES + +30CC-35E0H MOUSE DRIVER +35E1-36E0H MOUSE IMAGE BUFFER + +36E1-370DH DTA BUFFER + +370D-37FFH SPACE + +3800-39FFH BUFFER & SECTOR BUFFER + + +3832-3833H ENDCODE + +3833-3FFFH FREE-SPACE diff --git a/DSS/ENVIRON.ASM b/DSS/ENVIRON.ASM new file mode 100644 index 0000000..c9e8a52 --- /dev/null +++ b/DSS/ENVIRON.ASM @@ -0,0 +1,241 @@ +;[BEGIN] +;//MODULE: ENVIRON +;//CREATE: 10-11-2002 AUTHOR: Denis Parinov +;--------------------------------------------------------------- +;Rev Date Name Description +;--------------------------------------------------------------- +;R01 19-11-2002 DNS CORRECT DE ADDRESS IN GETENV +;--------------------------------------------------------------- + +; LD HL,MYVAR +; CALL SETENV +; LD HL,MYVAR2 +; LD DE,MYBUF +; CALL GETENV + + +ENVIRON: + INC B + JR Z,INITENV ;B=FF + DEC B + JR Z,READENV ;B=0 + DEC B + JP Z,GETENV ;B=1 + DEC B + JP Z,SETENV ;B=2 + LD A,DSS_Error.sys.INVALID_FUNCTION + SCF + RET + +INITENV LD A,ENVPAGE + CALL BANK + PUSH AF + LD DE,ENVIRONMENT + XOR A + LD (DE),A + INC DE + LD HL,DEFAULT_ENV + LD BC,DEF_ENV_SIZE + LDIR + LD (DE),A + EX DE,HL + LD DE,ENVIRONMENT + AND A + SBC HL,DE + LD (ENVSIZE),HL + POP AF + OUT (SLOT3),A + AND A + RET + +READENV: + PUSH HL + LD A,ENVPAGE + CALL BANK + LD H,A + LD C,SLOT3 + IN L,(C) + EXX + LD HL,ENVIRONMENT + INC HL + POP DE + LD BC,(ENVSIZE) + EXX +; +.loop: OUT (C),L + EXX + LD A,(HL) + EXX + OUT (C),H + EXX + LD (DE),A + INC HL + INC DE + DEC BC + LD A,B + OR C + EXX + JR NZ,.loop + XOR A + RET + +GETENV + PUSH DE + CALL ENV_EX + + LD A,ENVPAGE + CALL BANK + EX AF,AF' + + CALL F_ENV + POP DE + LD A,0 + LD (DE),A + JR NC,GE_1 +GE_0 LD A,(HL) + LDI + OR A + JR NZ,GE_0 + DEC DE ;R01 + LD A,#FF + +GE_1 EX AF,AF' + OUT (SLOT3),A + EX AF,AF' + AND A + RET + +SETENV: CALL ENV_EX +; + LD A,ENVPAGE + CALL BANK + PUSH AF +; + CALL F_ENV + JR NC,PENV + XOR A + CPIR + LD A,B + OR C + JR Z,PENV + LDIR +; DEC DE +PENV LD A,(ENVVALUE) + OR A + JR Z,CLR_ENV + LD HL,ENVNAME +F_EVN2 LD A,(HL) + LDI + CP "=" + JR NZ,F_EVN2 + LD HL,ENVVALUE +F_EVN3 LD A,(HL) + LDI + OR A + JR NZ,F_EVN3 +CLR_ENV XOR A + LD (DE),A + LD HL,ENVIRONMENT + EX DE,HL + SBC HL,DE + LD (ENVSIZE),HL +; + POP AF + OUT (SLOT3),A + AND A + RET + + +; RET: +; DE - VAR VALUE +; HL - VAR ADDRESS +; BC - ENVIRONMENT SIZE +F_ENV LD HL,ENVIRONMENT + LD BC,(ENVSIZE) + PUSH HL +F_EVN0 POP DE + LD DE,ENVNAME + XOR A + CPIR + PUSH HL +F_EVN1 LD A,(HL) + OR A + JR Z,END_OF_ENV + LD A,(DE) + CP (HL) + INC HL + INC DE + DEC BC + JR NZ,F_EVN0 + CP "=" + JR NZ,F_EVN1 + SCF +END_OF_ENV + POP DE + RET + +ENV_EX LD B,32 + LD DE,ENVNAME +ENV_E0 XOR A + LD (DE),A + LD (ENVVALUE),A +ENV_E1 LD A,(HL) + INC HL + CP "=" + JR Z,EQUAL_SG + OR A + JR Z,ENV_E3 + CALL UPPER + LD (DE),A + INC DE + DJNZ ENV_E1 + SCF + RET + +ENV_E3 LD A,"=" + LD (DE),A + INC DE + XOR A + LD (DE),A + INC DE + RET + +EQUAL_SG: + LD (DE),A + INC DE + XOR A + LD (DE),A + LD DE,ENVVALUE + LD (DE),A + LD C,#FF +ENV_E2 LD A,(HL) + LDI + OR A + RET Z + DJNZ ENV_E2 + SCF + RET + +ENVNAME EQU EXEBUFF ;DS 32 +ENVVALUE EQU BUFFER //#3800 ; BUFFER ;DS 128 + +ENVSIZE DW 1 ;E_END-ENVIRONMENT ;160 + +ENVIRONMENT EQU ENVADDR + +DEFAULT_ENV +; DB "SYSTEM=C:\\system.exe",0 +; DB "PATH=\\SYSTEM\\;\\COMMAND\\;",0 + DB 0 ; "",0 +DEF_ENV_SIZE EQU $-DEFAULT_ENV + +; DB 0 +; DB "SYSTEM=C:\system.exe",0 +; DB "PATH=C:\;\FN\;",0 +; DB "OS=ESTEX",0 +; DB "VAR1=000",0 +; DB "OSNAME=ESTEX 2002",0 +; DB 0 +;E_END + +;[END] diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM new file mode 100644 index 0000000..996aa35 --- /dev/null +++ b/DSS/EXECUTE.ASM @@ -0,0 +1,1228 @@ + +;[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 new file mode 100644 index 0000000..2aa6516 --- /dev/null +++ b/DSS/FAT_X.ASM @@ -0,0 +1,473 @@ + +;[BEGIN] +;//MODULE: FAT_X +;//CREATE: 19-05-1998 AUTHOR: Denis Parinov +;//UPDATE: 24-10-1999 DNS Restore module +;--------------------------------------------------------------- +;Rev Date Name Description +;--------------------------------------------------------------- +;R01 10-02-1999 DNS UPGRADE FAT CASH +;--------------------------------------------------------------- + +R_CLUST LD HL,#0001 + LD (G_CLUST.num),HL + RET + +G_CLUST: +.num+1: LD HL,#0001 +G_CLUS1: INC HL + CALL R_F_FAT + CP 10 + SCF + RET Z + LD A,D + OR E + JR NZ,G_CLUS1 + LD (G_CLUST.num),HL + XOR A + RET + +; HL - CLUSTER + +INC_FAT PUSH HL + CALL G_CLUST + POP DE + RET C + PUSH HL + PUSH HL + EX DE,HL +INC_FA2 CALL R_F_FAT + EX DE,HL + JR NC,INC_FA2 + EX DE,HL + POP DE + CALL W_T_FAT + POP HL + LD DE,(FatBuffer.ENDCLUS) + CALL W_T_FAT + CALL WR_FAT + AND A + RET + +;R01 + +; HL - CLUSTER +; DE - (CLUSTER) + +R_F_FAT EX DE,HL + LD HL,(MAX_CLU) + AND A + SBC HL,DE + EX DE,HL + LD A,10 + RET C + EXX + LD A,FATPAGE + CALL BANK + EXX + PUSH HL + PUSH AF + LD A,(FatBuffer.FAT_TYP) + CP "2" + JP Z,R_F_F12 +R_F_F16 LD A,H + LD B,A + AND #0F + LD H,A + LD A,B + RRCA + RRCA + RRCA + RRCA + AND #0F ; A - BLOCK FAT (1 BLOCK = 8192 BYTES) + ADD HL,HL ; HL - FAT OFFSET (FROM CASH) + LD BC,(FATCASH) ; C - BLOCK FAT IN CASH + CP C + CALL NZ,RE_FAT ; A <> C - READ NEW BLOCK FAT + LD DE,FAT + ADD HL,DE + LD E,(HL) + INC HL + LD D,(HL) + POP AF + OUT (SLOT3),A + LD HL,#FFEF + XOR A ;DssErr.sys.NO_ERROR + SBC HL,DE + POP HL + ;LD A,DssErr.sys.NO_ERROR + RET + +;R01; HL - CLUSTER +;R01; DE - (CLUSTER) +;R01 +;R01R_F_FAT EX DE,HL +;R01 LD HL,(MAX_CLU) +;R01 AND A +;R01 SBC HL,DE +;R01 EX DE,HL +;R01 LD A,10 +;R01 RET C +;R01 PUSH HL +;R01 LD A,(FAT_TYP) +;R01 CP "2" +;R01 JP Z,R_F_F12 +;R01R_F_F16 LD DE,768 ; DE - CLUSTERS IN CASH +;R01 XOR A +;R01R_F_00H INC A ; HL - CLUSTER +;R01 SBC HL,DE +;R01 JP NC,R_F_00H +;R01 ADD HL,DE +;R01 ADD HL,HL ; HL - FAT OFFSET (FROM CASH) +;R01 DEC A +;R01 LD BC,(FATCASH) ; A - ELEMENT OF CASH +;R01 CP C +;R01 CALL NZ,RE_FAT +;R01 LD DE,FAT +;R01 ADD HL,DE +;R01 LD E,(HL) +;R01 INC HL +;R01 LD D,(HL) +;R01 LD HL,#FFEF +;R01 AND A +;R01 SBC HL,DE +;R01 POP HL +;R01 LD A,0 +;R01 RET +;R01 +;R01R_F_F12 LD D,H +;R01 LD E,L +;R01 ADD HL,HL +;R01 ADD HL,DE +;R01 RR H +;R01 RR L +;R01 PUSH AF +;R01 EX DE,HL +;R01 LD HL,(B_P_S) +;R01 LD B,H +;R01 LD C,L +;R01 ADD HL,HL +;R01 ADD HL,BC +;R01 EX DE,HL +;R01 XOR A ; DE - SIZE SECTOR * 3 +;R01R_F_00 INC A ; HL - FAT OFFSET +;R01 SBC HL,DE +;R01 JP NC,R_F_00 +;R01 ADD HL,DE +;R01 DEC A + +R_F_F12 LD D,H + LD E,L + ADD HL,HL + ADD HL,DE + RR H + RR L ;CLUSTER * 1.5 + PUSH AF + LD A,H + LD B,A + AND #1F + LD H,A + LD A,B + RLCA + RLCA + RLCA + AND #07 + LD BC,(FATCASH) + CP C + CALL NZ,RE_FAT + LD DE,FAT + ADD HL,DE + POP AF + LD E,(HL) + INC HL + LD D,(HL) + JR C,R_F_F01 + LD A,D + AND #0F + LD D,A + JR R_F_F02 + +R_F_F01 LD A,E + AND #F0 + LD E,A + RR D + RR E + RR D + RR E + RR D + RR E + RR D + RR E +R_F_F02 POP AF + OUT (SLOT3),A + LD HL,#0FEF + XOR A ; обнуляем CF и устанавливаем код ошибки = нулю + SBC HL,DE + POP HL + RET + +; HL - CLUSTER +; DE - (CLUSTER) + +W_T_FAT PUSH DE + EX DE,HL + LD HL,(MAX_CLU) + AND A + SBC HL,DE + EX DE,HL + POP DE + LD A,10 + RET C + EXX + LD A,FATPAGE + CALL BANK + EXX + PUSH HL + PUSH AF + LD A,1 + LD (FATCASH+1),A + LD A,(FatBuffer.FAT_TYP) + CP "2" + JP Z,W_T_F12 +W_T_F16 PUSH DE + LD A,H + LD B,A + AND #0F + LD H,A + LD A,B + RRCA + RRCA + RRCA + RRCA + AND #0F ; A - BLOCK FAT (1 BLOCK = 8192 BYTES) + ADD HL,HL ; HL - FAT OFFSET (FROM CASH) + LD BC,(FATCASH) ; C - BLOCK FAT IN CASH + CP C + CALL NZ,RE_FAT ; A <> C - READ NEW BLOCK FAT + LD DE,FAT + ADD HL,DE + POP DE + LD (HL),E + INC HL + LD (HL),D + POP AF + POP HL + OUT (SLOT3),A + XOR A + RET + +W_T_F12 PUSH DE + LD D,H + LD E,L + ADD HL,HL + ADD HL,DE + RR H + RR L ;CLUSTER * 1.5 + PUSH AF + LD A,H + LD B,A + AND #1F + LD H,A + LD A,B + RLCA + RLCA + RLCA + AND #07 + LD BC,(FATCASH) + CP C + CALL NZ,RE_FAT + LD DE,FAT + ADD HL,DE + POP AF + POP DE + JP C,W_T_F01 + LD (HL),E + INC HL + LD A,(HL) + AND #F0 + OR D + LD (HL),A + POP AF + POP HL + OUT (SLOT3),A + AND A + RET + +W_T_F01 SLA E + RL D + RL E + RL D + RL E + RL D + RL E + RL D + LD A,(HL) + AND #0F + OR E + LD (HL),A + INC HL + LD (HL),D + POP AF + POP HL + OUT (SLOT3),A + AND A + RET + +;R01 +; A - NEW FAT BLOCK + +RE_FAT PUSH HL + PUSH AF + LD A,(FATCASH+1) + OR A + CALL NZ,WR_FAT_ + POP AF + LD L,A + LD H,0 + LD (FATCASH),HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL ;FAT BLOCK * 16 = SECTOR OF FAT + LD DE,(FatBuffer.FAT_FRM) + ADD HL,DE + EX DE,HL + LD IX,0 + ADD IX,DE + LD HL,0 ;HL:IX - SECTOR FAT FOR READING + LD DE,FAT ; DE - FAT ADDRESS + LD A,(FatBuffer.DRIVE) + ; LD B,16 + ; LD C,5 + LD BC,16*256 + 5 ;рег B: 16 * 512 = 8192 (CASH SIZE) + RST #18 + POP HL + RET + +WR_FAT EXX + LD A,FATPAGE + CALL BANK + EXX + PUSH AF + CALL WR_FAT_ + POP AF + OUT (SLOT3),A + RET + +WR_FAT_ LD HL,(FATCASH) + LD H,0 + LD (FATCASH),HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL ;FAT BLOCK * 16 = SECTOR OF FAT + + PUSH HL + LD B,H + LD C,L ;BC - BLOCK OF FAT + LD DE,16 + ADD HL,DE ;+ SIZE CASH (16 SECTORS) + + LD DE,(BootSector.S_P_F) + LD A,16 + AND A + SBC HL,DE + JR C,WALLFAT + EX DE,HL + LD HL,16 +; AND A ;тут точно CF не взведён + SBC HL,DE + JP C,FATERR + LD A,L +WALLFAT LD H,B + LD L,C + LD DE,(FatBuffer.FAT_FRM) + ADD HL,DE + EX DE,HL + LD IX,0 + ADD IX,DE + LD HL,0 ;HL:IX - SECTOR OF FAT FOR SAVE + LD DE,FAT + LD B,A + LD C,6 + LD A,(FatBuffer.DRIVE) + PUSH BC + RST #18 + POP BC + POP HL + LD DE,(FatBuffer.FAT2_XX) + ADD HL,DE + EX DE,HL + LD IX,0 + ADD IX,DE + LD DE,FAT + LD HL,0 + LD A,(FatBuffer.DRIVE) + LD C,6 + RST #18 + RET +;R01 + +;R01WR_FAT LD HL,(FATCASH) +;R01 LD H,0 +;R01 LD (FATCASH),HL +;R01 LD E,L +;R01 LD D,H +;R01 ADD HL,HL +;R01 ADD HL,DE +;R01 PUSH HL +;R01 LD B,H +;R01 LD C,L +;R01 INC HL +;R01 INC HL +;R01 INC HL +;R01 LD DE,(S_P_F) +;R01 LD A,3 +;R01 AND A +;R01 SBC HL,DE +;R01 JP C,WR_FAT1 +;R01 EX DE,HL +;R01 LD HL,3 +;R01 AND A +;R01 SBC HL,DE +;R01 JP C,FATERR +;R01 LD A,L +;R01WR_FAT1 LD H,B +;R01 LD L,C +;R01 LD DE,(FAT_FRM) +;R01 ADD HL,DE +;R01 EX DE,HL +;R01 LD IX,0 +;R01 ADD IX,DE +;R01 LD DE,FAT +;R01 LD HL,0 +;R01 LD B,A +;R01 LD C,6 +;R01 LD A,(DRIVE) +;R01 PUSH BC +;R01 RST #18 +;R01 POP BC +;R01 POP HL +;R01 LD DE,(FAT2_XX) +;R01 ADD HL,DE +;R01 EX DE,HL +;R01 LD IX,0 +;R01 ADD IX,DE +;R01 LD DE,FAT +;R01 LD HL,0 +;R01 LD A,(DRIVE) +;R01 LD C,6 +;R01 RST #18 +;R01 RET + +FATERR: POP HL +; SCF + RET + +FATCASH DW #0000 +MAX_CLU DW #0FF0 + +;//MODULE: FAT_X +;[END] + + diff --git a/DSS/FDD_DRV0.ASM b/DSS/FDD_DRV0.ASM new file mode 100644 index 0000000..7bebc15 --- /dev/null +++ b/DSS/FDD_DRV0.ASM @@ -0,0 +1,366 @@ + +; Disk Driver Specification ver. 2.00 +;[]===========================================================[] +;Procedure : Initialization +; +;Function : Initialization device(s) +; +;Input : C = 00h +; IX - Environment +;Output : A = Amount drive support +; HL = Size driver +;[]===========================================================[] +;[]===========================================================[] +;Procedure : Open +; +;Function : Open disk +; +;Input : C = 01h +; A - Drive +;Output : None +; +;[]===========================================================[] +;[]===========================================================[] +;Procedure : Close +; +;Function : Close disk +; +;Input : C = 02h +; A - Drive +;Output : None +; +;[]===========================================================[] +;[]===========================================================[] +;Procedure : Media check +; +;Function : Checking change line +; +;Input : C = 03h +; A - Drive +;Output : A = 00h disk no changed +; A = 0FFh disk changed +; +;[]===========================================================[] +;[]===========================================================[] +;Procedure : Get BPB +; +;Function : Get Block Parameters BIOS +; +;Input : C = 04h +; DE - Address +;Output : None +; +;[]===========================================================[] +;[]===========================================================[] +;Procedure : Input +; +;Function : Input from disk +; +;Input : C = 05h +; HL:IX - Logical Block (sector) +; DE - Address +; B - Sector count +;Output : None +; +;[]===========================================================[] +;[]===========================================================[] +;Procedure : Output +; +;Function : Output to disk +; +;Input : C = 06h +; HL:IX - Logical Block (sector) +; DE - Address +; B - Sector count +;Output : None +; +;[]===========================================================[] +;[]===========================================================[] +;Procedure : Removable +; +;Function : Checking change line +; +;Input : C = 07h +; A - Drive +;Output : A = 00h Removable +; A = FFh Nonremovable +; +;[]===========================================================[] +;[]===========================================================[] +;Procedure : Generic IOCTL +; +;Function : Generic Input Output Control +; +;Input : C = 08h +; B - Subcommand +; DE = 55AAh Magic Number +; Subcommand +;---------------------- +; 00h - Get Device Parameters +; 01h - Read track +; 02h - Test track +; 80h - Set Device Parameters +; 81h - Write track +; 82h - Format track +;Output : +; +;[]===========================================================[] +; +; Errors: +; 0 (00h) - NO ERRORS +; 1 (01h) - BAD COMMAND +; 2 (02h) - BAD DRIVE NUMBER +; 3 (03h) - UNKNOW FORMAT +; 4 (04h) - NOT READY +; 5 (05h) - SEEK ERROR +; 6 (06h) - SECTOR NOT FOUND +; 7 (07h) - CRC ERROR +; 8 (08h) - WRITE PROTECT +; 9 (09h) - READ ERROR +; 10 (0Ah) - WRITE ERROR +; 11 (0Bh) - FAILURE +; 12 (0Ch) - BUSY (DEVICE OPENED) +; 13 (0Dh) - RESERVED + +R_COM EQU #0F ;Command/Status +R_TRK EQU #3F ;Track +R_SEC EQU #5F ;Sector +R_DAT EQU #7F ;Data +R_DSK EQU #FF ;Drive Control + +COM_B EQU #1B + +FDDRIVE: + INC C + DEC C + JP Z,.INIT ;#00 + DEC C + JP Z,.RESE ;#01 + DEC C + JP Z,.STAT ;#02 + DEC C + JP Z,.CHEK ;#03 + DEC C + JP Z,.GBPB ;#04 + DEC C + JP Z,.READD ;#05 + DEC C + JP Z,.WRITED ;#06 + DEC C + JP Z,.REMOV_F ;#07 + DEC C + JP Z,.IOCTL_F ;#08 + DEC C + JP Z,.RESRV_F ;#09 +.RESRV_F: + LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET + +;Commands for restart #18 +.INIT: LD A,2 ;количество FDD в компе ;!FIXIT а если отключу в БИОС? + 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/IDE_DRV0.ASM b/DSS/IDE_DRV0.ASM new file mode 100644 index 0000000..e9c791f --- /dev/null +++ b/DSS/IDE_DRV0.ASM @@ -0,0 +1,706 @@ +;--------------------------------------------------------------- +;Rev Date Name Description +;--------------------------------------------------------------- +;R02 06-08-2001 DNS Secondary IDE +;R01 06-08-2001 DNS Fixed BUG with partitions on Second hard disk +;--------------------------------------------------------------- +; +; Disk Driver Specification ver. 2.20 +;[]===========================================================[] +;Procedure : Initialization +; +;Function : Initialization device(s) +; +;Input : C = 00h +; IX - Environment +;Output : A = Amount drive support +; HL = Size driver +;[]===========================================================[] +;[]===========================================================[] +;Procedure : Open +; +;Function : Open disk +; +;Input : C = 01h +; A - Drive +;Output : None +; +;[]===========================================================[] +;[]===========================================================[] +;Procedure : Close +; +;Function : Close disk +; +;Input : C = 02h +; A - Drive +;Output : None +; +;[]===========================================================[] +;[]===========================================================[] +;Procedure : Media check +; +;Function : Checking change line +; +;Input : C = 03h +; A - Drive +;Output : A = 00h disk no changed +; A = 0FFh disk changed +; +;[]===========================================================[] +;[]===========================================================[] +;Procedure : Get BPB +; +;Function : Get Block Parameters BIOS +; +;Input : C = 04h +; DE - Address +;Output : None +; +;[]===========================================================[] +;[]===========================================================[] +;Procedure : Input +; +;Function : Input from disk +; +;Input : C = 05h +; HL:IX - Logical Block (sector) +; DE - Address +; B - Sector count +;Output : None +; +;[]===========================================================[] +;[]===========================================================[] +;Procedure : Output +; +;Function : Output to disk +; +;Input : C = 06h +; HL:IX - Logical Block (sector) +; DE - Address +; B - Sector count +;Output : None +; +;[]===========================================================[] +;[]===========================================================[] +;Procedure : Removable +; +;Function : Checking change line +; +;Input : C = 07h +; A - Drive +;Output : A = 00h Removable +; A = FFh Nonremovable +; +;[]===========================================================[] +;[]===========================================================[] +;Procedure : Generic IOCTL +; +;Function : Generic Input Output Control +; +;Input : C = 08h +; B - Subcommand +; DE = 55AAh Magic Number +; Subcommand +;---------------------- +; 00h - Get Device Parameters +; 01h - Read track +; 02h - Test track +; 80h - Set Device Parameters +; 81h - Write track +; 82h - Format track +;Output : +; +;[]===========================================================[] +;[]===========================================================[] +;Procedure : Read Long +; +;Function : Reading sectors from disk +; +;Input : C = 0Ah +; HL:IX - Logical Block (sector) +; DE - Address +; B - Sector count +; A'- Page +;Output : A'- Next Page +; HL:IX - Next Logical Block (sector) +; DE - Next Address +; +;[]===========================================================[] +;[]===========================================================[] +;Procedure : Write Long +; +;Function : Writing sectors to disk +; +;Input : C = 0Bh +; HL:IX - Logical Block (sector) +; DE - Address +; B - Sector count +; A'- Page +;Output : A'- Next Page +; HL:IX - Next Logical Block (sector) +; DE - Next Address +; +;[]===========================================================[] +; +; Errors: +; 0 (00h) - NO ERRORS +; 1 (01h) - BAD COMMAND +; 2 (02h) - BAD DRIVE NUMBER +; 3 (03h) - UNKNOW FORMAT +; 4 (04h) - NOT READY +; 5 (05h) - SEEK ERROR +; 6 (06h) - SECTOR NOT FOUND +; 7 (07h) - CRC ERROR +; 8 (08h) - WRITE PROTECT +; 9 (09h) - READ ERROR +; 10 (0Ah) - WRITE ERROR +; 11 (0Bh) - FAILURE +; 12 (0Ch) - BUSY (DEVICE OPENED) +; 13 (0Dh) - RESERVED + +LD_DSK EQU 16 + +IDE0 EQU #0C1C0 +IDE1 EQU #0C1C8 +PART EQU #C000 + +HDDRIVE INC C + DEC C + JP Z,INIT_H ;#00 + DEC C + JP Z,RESE_H ;#01 + DEC C + JP Z,STAT_H ;#02 + DEC C + JP Z,CHEK_H ;#03 + DEC C + JP Z,GBPB_H ;#04 + DEC C + JP Z,READH ;#05 + DEC C + JP Z,WRITEH ;#06 + DEC C + JP Z,REMOV_H ;#07 + DEC C + JP Z,IOCTL_H ;#08 + DEC C + JP Z,RESR_H ;#09 + DEC C + JP Z,LREADH ;#0A + DEC C + JP Z,LWRITEH ;#0B +RESR_H LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET + +;Commands for restart #18 +INIT_H PUSH IY + LD HL,LOGDRV + LD (OFFSECT),HL + LD IX,DEVICE_CFG + LD C,#5F + RST ToBIOS + XOR A + LD B,(IX+2) ;HDD + CP B + JR Z,NO_HARDS + LD C,#80 +NX_DVCI PUSH BC + LD A,C + LD (DRV),A + CALL PARTIT + POP BC + INC C + DJNZ NX_DVCI +;R02 +;R02 LD A,#80 +;R02 LD (DRV),A +;R02 LD C,SLOT3 +;R02 IN B,(C) +;R02 LD A,SYSPAGE +;R02 OUT (C),A +;R02 LD HL,IDE0 +;R02 CALL YEP_DRV +;R02 OUT (C),B +;R02 CALL NZ,PARTIT +;R02 +;R02 LD A,#81 +;R02 LD (DRV),A +;R02 LD C,SLOT3 +;R02 IN B,(C) +;R02 LD A,SYSPAGE +;R02 OUT (C),A +;R02 LD HL,IDE1 +;R02 CALL YEP_DRV +;R02 OUT (C),B +;R02 CALL NZ,PARTIT +NO_HARDS + POP IY + LD HL,(OFFSECT) + LD DE,LOGDRV + XOR A + SBC HL,DE + RET Z + LD DE,LD_DSK +DRVCLC INC A + SBC HL,DE + JR NZ,DRVCLC + AND A + RET + +DEVICE_CFG EQU #4000 +; DB 0 ;LEN +; DB 0 ;FDD COUNT +; DB 0 ;HDD COUNT +; DB 0 ;CDROM COUNT +; DS 28 ;RESERVED + +YEP_DRV LD A,#FF +; CP (HL) +; RET NZ + INC HL + CP (HL) + RET NZ + INC HL + CP (HL) + RET NZ + INC HL + CP (HL) + RET NZ + INC HL + CP (HL) + RET NZ + INC HL + CP (HL) + RET + +;+00 ;SECTORS PER TRACK +;+01 ;TRACKS PER CYLLINDER +;+02 ;RESERVED +;+03 ;HDD/DRIVE/LBA +;+04 ;SECTOR PER CYLINDER LOW +;+05 ;SECTOR PER CYLINDER HIGH +;+06 ;RESERVED +;+07 ;RESERVED + +DRVHD_H EQU 0 +SC_PT_H EQU 1 +HEADS_H EQU 2 +CYL_L_H EQU 3 +CYL_H_H EQU 4 +SPCLL_H EQU 5 +SPCLH_H EQU 6 + + +;IDE0 DB #FF ;DRIVE/HEAD REGISTER ;00 +; DB #FF ;SECTORS PER TRACK ;01 +; DB #FF ;HEADS ;02 +; DB #FF ;CYLINDERS LOW ;03 +; DB #FF ;CYLINDERS HIGH ;04 +; DB #FF ;SECTOR PER CYLINDER LOW ;05 +; DB #FF ;SECTOR PER CYLINDER HIGH ;06 +; DB #FF ;RESERVED ;07 + +;IDE1 DB #FF ;DRIVE/HEAD REGISTER ;00 +; DB #FF ;SECTORS PER TRACK ;01 +; DB #FF ;HEADS ;02 +; DB #FF ;CYLINDERS LOW ;03 +; DB #FF ;CYLINDERS HIGH ;04 +; DB #FF ;SECTOR PER CYLINDER LOW ;05 +; DB #FF ;SECTOR PER CYLINDER HIGH ;06 +; DB #FF ;RESERVED ;07 + +LOGDRV DS 12*LD_DSK +;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... +;+01 LONG SECTOR OFFSET +;+05 LONG SIZE IN SECTORS +;+09 FREE +;+15 + +SELHDD PUSH DE + PUSH BC + PUSH HL + LD L,A + LD H,0 + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + EX DE,HL + LD IY,LOGDRV + ADD IY,DE + LD C,(IY+1) + LD B,(IY+2) + LD E,(IY+3) + LD D,(IY+4) + POP HL + ADD IX,BC + ADC HL,DE + LD A,(IY+0) ;DRIVE NUMBER + POP BC + POP DE + RET + +; 00 - GET DEVICE PARAMETERS +; 01 - READ TRACK +; 02 - TEST TRACK +; 80 - SET DEVICE PARAMETERS +; 81 - WRITE TRACK +; 82 - FORMAT TRACK + + +IOCTL_H BIT 7,B + JR NZ,O_CTL_H + INC B + DEC B + JP Z,HGETPRM + DEC B + JP Z,HRDTRAC + DEC B + JP Z,HCHTRAC + LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET + +O_CTL_H RES 7,B + INC B + DEC B + JP Z,HSETPRM + DEC B + JP Z,HWRTRAC + DEC B + JP Z,HFRTRAC + LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET + +HRDTRAC LD A,DSS_Error.drv.GENERAL_FAILURE + SCF + RET + +HCHTRAC LD B,L + CALL CHECKH + RET + +HSETPRM AND A + RET + +HWRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE + SCF + RET + +HFRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE + SCF + RET + +; HL:DE - SECTORS ON LOGICAL DISK +; HL' - CYLINDERS ON PHISICAL DISK +; DE' - HEADS ON PHISICAL DISK +; BC' - SECTORS PER TRACK ON PHISICAL DISK +; A' - PHISICAL DRIVE NUMBER +; A - DRIVE/HEAD REGISTER PHISICAL DISK +; D0...D3 - "0" RESERVED (MAY BE OTHER) +; D4 - DEVICE MASTER/SLAVE +; D5 - "1" RESERVED +; D6 - ADDRESSING MODE LBA/CHS +; D7 - "1" RESERVED + +HGETPRM EX DE,HL + LD BC,#55AA + AND A + SBC HL,BC + LD L,A + LD A,DSS_Error.drv.GENERAL_FAILURE + SCF + RET NZ + PUSH IY + LD H,0 + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + LD B,H + LD C,L + LD IY,LOGDRV ;!FIXIT нахрена тут индексный? + ADD IY,BC + LD E,(IY+5) + LD D,(IY+6) + LD L,(IY+7) + LD H,(IY+8) + + LD A,(IY+0) + LD C,A + LD IY,IDE0 ;!FIXIT IDE CHANELS тут всего 2 канала работают + AND #0F + JR Z,GELH1 + LD IY,IDE1 +GELH1 IN A,(SLOT3) + PUSH AF + LD A,SYS_PAGE + OUT (SLOT3),A + + LD A,(IY+DRVHD_H) ;HDD/DRV + EXX + LD L,(IY+CYL_L_H) ;CYLINDER LOW + LD H,(IY+CYL_H_H) ;CYLINDER HIGH + LD E,(IY+HEADS_H) ;HEADS + LD D,0 + LD C,(IY+SC_PT_H) ;SECTORS + LD B,0 + EXX + EX AF,AF' + POP AF + OUT (SLOT3),A + LD A,C + EX AF,AF' + POP IY + AND A + RET + +REMOV_H LD A,1 + AND A + RET + +RESE_H XOR A + RET + +STAT_H XOR A + RET + +CHEK_H LD A,#FF + AND A + RET + +;HL:IX - SECTOR +; DE - ADDRESS + +GBPB_H PUSH IY + PUSH DE + LD L,A + LD H,0 + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + LD B,H + LD C,L + LD IY,LOGDRV + ADD IY,BC + LD E,(IY+1) + LD D,(IY+2) + LD L,(IY+3) + LD H,(IY+4) + LD XL,E + LD XH,D + LD A,(IY+0) + POP DE + POP IY + LD BC,#0155 + RST ToBIOS + RET + +;HL:IX - SECTOR +; DE - ADDRESS +; B - COUNTER +; A'- PAGE +;READ SECTOR +LREADH PUSH IY + CALL SELHDD + LD C,#52 ; A - HDD NUMBER +128 + RST ToBIOS + POP IY + RET + +;HL:IX - SECTOR +; DE - ADDRESS +; B - COUNTER +; A'- PAGE +;WRITE SECTOR +LWRITEH PUSH IY + CALL SELHDD + LD C,#53 ; A - HDD NUMBER +128 + RST ToBIOS + POP IY + RET + +;HL:IX - SECTOR +; DE - ADDRESS +; B - COUNTER +;WRITE SECTOR +WRITEH PUSH IY + CALL SELHDD + LD C,#56 ; A - HDD NUMBER +128 + RST ToBIOS + POP IY + RET + +;HL:IX - SECTOR +; DE - ADDRESS +; B - COUNTER +;READ SECTOR +READH PUSH IY + CALL SELHDD + LD C,#55 ; A - HDD NUMBER +128 + RST ToBIOS + POP IY + RET + +;HL:IX - SECTOR +; DE - ADDRESS +; B - COUNTER +;CHECK SECTOR +CHECKH PUSH IY + CALL SELHDD + LD C,#54 ; A - HDD NUMBER +128 + RST ToBIOS + POP IY + RET + +;----------------- +EASYDOS +MEDIDOS +HIGHDOS LD E,(IY+08) + LD D,(IY+09) + LD L,(IY+10) + LD H,(IY+11) + LD IX,(CURSECL) + ADD IX,DE + LD DE,(CURSECH) + ADC HL,DE + LD D,XH + LD E,XL + LD IX,(OFFSECT) + LD (IX+1),E ;BPB SECTOR + LD (IX+2),D + LD (IX+3),L + LD (IX+4),H +; LD DE,(CURSECL) +; LD HL,(CURSECH) +; LD (IX+1),E ;START DISK +; LD (IX+2),D +; LD (IX+3),L +; LD (IX+4),H + LD E,(IY+12) + LD D,(IY+13) + LD L,(IY+14) + LD H,(IY+15) + LD (IX+5),E ;SIZE DISK + LD (IX+6),D + LD (IX+7),L + LD (IX+8),H + LD A,(DRV) + LD (IX+0),A + LD DE,LD_DSK ; DSKITEM + ADD IX,DE + LD (OFFSECT),IX +NXTPART LD DE,#10 + ADD IY,DE + POP BC + DJNZ DOSAGA + AND A + RET + +PARTIT IN A,(SLOT3) + PUSH AF + LD A,#FF + OUT (SLOT3),A + CALL PARTIT1 + POP AF + OUT (SLOT3),A + RET + +PARTIT1 LD IX,0 + LD DE,0 + LD (EXTDOSL),DE ;R01 + LD (EXTDOSH),IX ;R01 +PARTIT2 LD (CURSECL),DE + LD (CURSECH),IX + CALL LOADSEC + LD HL,(PART+510) + LD DE,#AA55 + AND A + SBC HL,DE + JR NZ,NODEFIN + LD IY,PART+#01BE + LD B,4 +DOSAGA PUSH BC + LD A,(IY+4) + CP 5 + JR NZ,NOEXTDS +SUBLEV PUSH IY + LD DE,(CURSECL) + LD IX,(CURSECH) + PUSH DE + PUSH IX + CALL EXTDOS + POP IX + POP DE + LD (CURSECL),DE + LD (CURSECH),IX + CALL LOADSEC + POP IY + JP NXTPART +NOEXTDS CP #0F + JP Z,SUBLEV + CP #0E + JP Z,HIGHDOS + CP 6 + JP Z,HIGHDOS + CP 4 + JP Z,MEDIDOS + CP 1 + JP Z,EASYDOS + POP BC + OR A + RET Z +NODEFIN SCF + RET + +EXTDOS + LD HL,(EXTDOSL) + LD DE,(EXTDOSH) + LD A,L + OR H + OR E + OR D + LD E,(IY+08) + LD D,(IY+09) + LD L,(IY+10) + LD H,(IY+11) + JP NZ,EXTDOS2 + LD (EXTDOSL),DE + LD (EXTDOSH),HL + LD IX,(EXTDOSH) + JP PARTIT2 + +EXTDOS2 LD IX,(EXTDOSL) + ADD IX,DE + PUSH IX + LD DE,(EXTDOSH) + ADC HL,DE + PUSH HL + POP IX + POP DE + JP PARTIT2 + +LOADSEC PUSH IY + LD IX,(CURSECL) + LD HL,(CURSECH) + LD DE,PART + LD BC,#0155 + LD A,(DRV) + RST ToBIOS + POP IY + RET + +DRV DB #00 ;PHISICAL DRIVE NUMBER + +CURSECL DW #0000 ;CURRENT SECTOR LOADED +CURSECH DW #0000 + +EXTDOSL DW #0000 ;CURRENT PARTITION TABLE +EXTDOSH DW #0000 + +OFFSECT DW LOGDRV ;POINTER ON CURRENT DISK RECORD + +;======================================================= \ No newline at end of file diff --git a/DSS/INTMOUSE.ASM b/DSS/INTMOUSE.ASM new file mode 100644 index 0000000..c2d0432 --- /dev/null +++ b/DSS/INTMOUSE.ASM @@ -0,0 +1,920 @@ + +;[BEGIN] +;//MODULE: INTMOUSE +;//CREATE: 19-05-1998 AUTHOR: Denis Parinov +;//UPDATE: 24-10-1999 DNS Restore module + +CMOUSE EQU #1B ; !FIXIT на sp2000.inc +DMOUSE EQU #1A ; !FIXIT на sp2000.inc + +; MOUSE SOFTWARE SPECIFICATION +;--------------------------------------------- +; COMMAND 00h (INITIALIZATION) +; +; RETURN: NC - MOUSE PRESENT +; C - MOUSE ABSENT +;--------------------------------------------- +; COMMAND 01h (SHOW MOUSE CURSOR) +; +; RETURN: NC - DONE +; C - MOUSE ON SCREEN +;--------------------------------------------- +; COMMAND 02h (HIDE MOUSE CURSOR) +; +; RETURN: NC - DONE +; C - NONE MOUSE +;--------------------------------------------- +; COMMAND 03h (READ MOUSE STATE) +; +; RETURN: HL - X COORD +; DE - Y COORD +; A - BUTTONS D2-D0 (MIDDLE,RIGHT,LEFT) +;--------------------------------------------- +; COMMAND 04h (GOTO MOUSE CURSOR) +; +; INPUT: HL - X COORD +; DE - Y COORD +;--------------------------------------------- +; COMMAND 05h (RESERVED) +;--------------------------------------------- +; COMMAND 06h (RESERVED) +;--------------------------------------------- +; COMMAND 07h (SET VERT. BOUNDS) +; +; INPUT: HL - Y MIN +; DE - Y MAX +;--------------------------------------------- +; COMMAND 08h (SET HORZ. BOUNDS) +; +; INPUT: HL - X MIN +; DE - X MAX +;--------------------------------------------- +; COMMAND 09h (LOAD CURSOR) +; +; INPUT: IX - CURSOR IMAGE +; H - HEIGHT CURSOR +; L - WIDTH CURSOR +; D - Y HOT SPOT +; E - X HOT SPOT +; B = 0 +;--------------------------------------------- +; COMMAND 0Ah (SET CURSOR IN TEXT MODES) +; +; INPUT: H - AND SIMBOL MASK +; L - XOR SIMBOL MASK +; D - AND ATTRIBUT MASK +; E - XOR ATTRIBUT MASK +; B = 0 +;--------------------------------------------- +; COMMAND 0Bh (RETURN CURSOR) +; +; INPUT: IX - CURSOR IMAGE BUFFER +; OUTPUT: H - HEIGHT CURSOR +; L - WIDTH CURSOR +; D - Y HOT SPOT +; E - X HOT SPOT +;--------------------------------------------- +; COMMAND 0Ch (RESERVED) +;--------------------------------------------- +; COMMAND 0Dh (RESERVED) +;--------------------------------------------- +; COMMAND 0Eh (GET SENSETIVE) +; OUTPUT: H - VERTICAL SENSETIVE +; L - HORIZONTAL SENSETIVE +;--------------------------------------------- +; COMMAND 0Fh (SET SENSETIVE) +; INPUT: H - VERTICAL SENSETIVE +; L - HORIZONTAL SENSETIVE +;--------------------------------------------- +; COMMAND 80h (MOUSE HARDWARE INTERRUPT) +;--------------------------------------------- +; COMMAND 81h (CHANGE VIDEO MODE) +; INPUT: A - MODE +;--------------------------------------------- +; COMMAND 82h (RESERVED) +;--------------------------------------------- +; COMMAND 83h (MOUSE REFRESH) +;--------------------------------------------- +; ERRORS: 0 - NO ERROR +; 1 - COMMAND NOT PRESENT +; 2 - DEVICE ABSENT +; 3 - CURSOR ON (UZHE) +; 4 - CURSOR OFF (UZHE) +; 5 - CURSOR IMAGE VERY BIG + +INTMOUS BIT 7,C + JP NZ,EMOUSE + INC C + DEC C + JP Z,MS_INIT + DEC C + JP Z,MS_SHOW + DEC C + JP Z,MS_HIDD + DEC C + JP Z,MS_READ + DEC C + JP Z,MS_GOTO + DEC C + JP Z,MS_RESR + DEC C + JP Z,MS_RESR + DEC C + JP Z,MS_VERT + DEC C + JP Z,MS_HORZ + DEC C + JP Z,MS_CURS + DEC C + JP Z,MS_MASK + DEC C + JP Z,MS_BCUR + DEC C + JP Z,MS_RESR + DEC C + JP Z,MS_RESR + DEC C + JP Z,MS_GSEN + DEC C + JP Z,MS_SENT +MS_RESR LD A,DSS_Error.mouse.INVALID_COMMAND + SCF + RET + +EMOUSE RES 7,C + INC C + DEC C + JP Z,M_INT + DEC C + JP Z,M_MODE + DEC C + JR Z,M_RESR + DEC C + JP Z,M_REFR +M_RESR LD A,DSS_Error.mouse.INVALID_COMMAND + SCF + RET + +MS_INIT DI + LD A,85 + OUT (#10),A + LD A,45 + OUT (#10),A + XOR A ;LD A,0 + OUT (CMOUSE),A + INC A ;LD A,1 + OUT (CMOUSE),A + DEC A ;LD A,0 + OUT (CMOUSE),A + LD A,3 + OUT (CMOUSE),A + LD A,#41 + OUT (CMOUSE),A + LD A,4 + OUT (CMOUSE),A + LD A,#47 + OUT (CMOUSE),A + LD A,5 + OUT (CMOUSE),A + LD A,#E0 + OUT (CMOUSE),A + EI + XOR A + RET + +MS_SHOW PUSH IX + PUSH HL + PUSH DE + EX AF,AF' + PUSH AF + LD HL,(PIX_X) + LD DE,(PIX_Y) + DI + CALL MOUSE + XOR A + LD (REFRESH+1),A + EI + POP AF + EX AF,AF' + POP DE + POP HL + POP IX + XOR A + RET + +MS_HIDD PUSH IX + PUSH HL + PUSH DE + EX AF,AF' + PUSH AF + DI + LD A,1 + LD (REFRESH+1),A + CALL RESTORE + EI + POP AF + EX AF,AF' + POP DE + POP HL + POP IX + XOR A + RET + +MS_READ LD HL,(PIX_X) + LD DE,(PIX_Y) + LD A,(MB) + AND A + RET + +MS_GOTO PUSH IX + PUSH HL + PUSH DE + LD (PIX_X),HL + LD (PIX_Y),DE + EX AF,AF' + PUSH AF + DI + CALL REFRESH + EI + POP AF + EX AF,AF' + POP DE + POP HL + POP IX + XOR A + RET + +MS_CURS PUSH BC + PUSH DE + PUSH HL + PUSH IX + LD A,L + LD (M_XSIZE),A + LD A,H + LD (M_YSIZE),A + LD C,E + LD B,0 + LD (XHOT_SP),BC + LD C,D + LD B,0 + LD (YHOT_SP),BC + EXX + LD A,(M_XSIZE) + LD C,A + LD B,0 + LD A,(M_YSIZE) + LD HL,0 +MSCURS1 ADD HL,BC + DEC A + JR NZ,MSCURS1 + PUSH HL + LD BC,M_IMAGE.Size+1 + AND A + SBC HL,BC + CCF + EXX + POP BC + POP HL + LD A,5 + JR C,NOLOADM + LD DE,M_IMAGE + DI + LDIR + XOR A +NOLOADM POP HL + POP DE + POP BC + EI + RET + +MS_BCUR PUSH IX + EXX + LD A,(M_XSIZE) + LD C,A + LD B,0 + LD A,(M_YSIZE) + LD HL,0 +MSBCUR1 ADD HL,BC + DEC A + JR NZ,MSBCUR1 + PUSH HL + LD BC,M_IMAGE.Size+1 + AND A + SBC HL,BC + CCF + EXX + POP BC + POP HL + LD A,5 + JR C,NOSAVEM + LD DE,M_IMAGE + EX DE,HL + DI + LDIR + LD A,(M_XSIZE) + LD L,A + LD A,(M_YSIZE) + LD H,A + LD BC,(XHOT_SP) + LD E,C + LD BC,(YHOT_SP) + LD D,C + LD BC,0 + XOR A +NOSAVEM EI + RET + +MS_HORZ + LD (MIN_X),HL + LD (MAX_X),DE + XOR A + RET + +MS_VERT + LD (MIN_Y),HL + LD (MAX_Y),DE + XOR A + RET + +MS_MASK + LD (ANDXORS),HL + LD (ANDXORA),DE + XOR A + RET + +; H - VERTICAL SENSETIVE +; L - HORIZONTAL SENSETIVE + +MS_SENT + LD (SENSEXY),HL + XOR A + RET + +MS_GSEN + LD HL,(SENSEXY) + XOR A + RET + +MOUSET LD (REST_XT+1),HL + LD (REST_YT+1),DE +;Y + SRL D + RR E + SRL D + RR E + SRL D + RR E + LD D,E +;X + SRL H + RR L + SRL H + RR L + SRL H + RR L + LD E,L + + IN A,(PORT_Y) + LD XH,A + IN A,(SLOT1) + LD XL,A +; + DI +; + LD A,#54 + OUT (SLOT1),A +; + LD A,D + ADD A,A + ADD A,A ;Y * 4 + LD L,A + LD H,#43 ;+ #4300 +; + IN A,(RGMOD) + RRCA + AND #80 + OR #01 + ADD A,E + OUT (PORT_Y),A + INC L + LD A,(HL) ;SIMBOL + LD BC,(ANDXORS) + AND B + XOR C + LD (HL),A + INC L + LD A,(HL) ;ATTRIBUT + LD BC,(ANDXORA) + AND B + XOR C + LD (HL),A +; + LD A,XL + OUT (SLOT1),A + LD A,XH + OUT (PORT_Y),A + RET + +RESTORT +REST_XT LD HL,#0000 +REST_YT LD DE,#0000 +;Y + SRL D + RR E + SRL D + RR E + SRL D + RR E + LD D,E +;X + SRL H + RR L + SRL H + RR L + SRL H + RR L + LD E,L + + IN A,(PORT_Y) + LD XH,A + IN A,(SLOT1) + LD XL,A +; + DI +; + LD A,#50 + OUT (SLOT1),A +; + LD A,D + ADD A,A + ADD A,A ;Y * 4 + LD L,A + LD H,#43 ;+ #4300 +; + IN A,(RGMOD) + RRCA + AND #80 + OR #01 + ADD A,E + OUT (PORT_Y),A + INC L + LD A,(HL) ;SIMBOL + LD (HL),A + INC L + LD A,(HL) ;ATTRIBUT + LD (HL),A +; + LD A,XL + OUT (SLOT1),A + LD A,XH + OUT (PORT_Y),A + RET + +RESTORE: +.sw+1: LD A,#00 + BIT 7,A + JP Z,RESTORT +RESTORG IN A,(SLOT3) + LD B,A + IN A,(PORT_Y) + LD C,A + PUSH BC + LD A,#50 + OUT (SLOT3),A +REST_X LD HL,0 +REST_Y LD DE,0 + LD A,E + EX AF,AF' +REST_V LD A,#00 + AND 1 + LD DE,#C000 ;screen 0 + JR Z,AA2 + LD DE,#C000+320 ;screen 1 +AA2 ADD HL,DE +REST_A LD A,0 + LD XH,A + EX AF,AF' +REST_H +RS002 LD BC,10 + OUT (PORT_Y),A + EX AF,AF' + LD (PUSH_HL),HL + LD D,H + LD E,L + LDIR +PUSH_HL+1: LD HL,#0000 +; POP HL + EX AF,AF' + INC A + JR Z,RS003 + DEC XH + JR NZ,RS002 +RS003 POP BC + LD A,B + OUT (SLOT3),A + LD A,C + OUT (PORT_Y),A + XOR A + RET + +;HL/DE - X/Y + +MOUSE LD A,(MODE_M) + LD (RESTORE.sw),A + BIT 7,A + JP Z,MOUSET +MOUSEG CP #82 ;640x256x16 + JR NZ,NOFX + SRL H + RR L +NOFX LD IX,M_IMAGE + LD A,(M_XSIZE) + LD C,A + LD B,0 + LD (REALXS),BC + LD (REST_H+1),BC + LD C,B + LD (SKIPXF),BC + LD A,(M_YSIZE) + LD (REST_A+1),A + LD C,A + LD B,0 + LD (REALYS),BC + LD BC,(YHOT_SP) + LD A,E + SUB C + LD E,A + JR NC,GOODY + NEG + LD E,A + LD A,(M_XSIZE) + LD C,A + LD B,0 + LD A,(M_YSIZE) + SUB E +SKIPMY ADD IX,BC + DEC E + JR NZ,SKIPMY + LD C,A + LD (REALYS),BC +GOODY LD BC,(XHOT_SP) + AND A + SBC HL,BC + JR NC,GOODX + LD B,H + LD C,L + LD HL,0 + AND A + SBC HL,BC + LD (SKIPXF),HL + LD A,(M_XSIZE) + SUB L + LD L,A + LD (REALXS),HL + LD HL,0 +GOODX LD (REST_X+1),HL + LD (REST_Y+1),DE + + PUSH HL + IN A,(SLOT3) + LD H,A + IN A,(PORT_Y) + LD L,A + EX (SP),HL + LD A,#5C + OUT (SLOT3),A + LD A,E + EX AF,AF' + IN A,(RGMOD) + LD (REST_V+1),A + AND 1 + LD DE,#C000 ;PAGE 0 + JR Z,AA1 + LD DE,#C000+320 ;PAGE 1 +AA1 ADD HL,DE + LD D,XH + LD E,XL + EX DE,HL ;HL - BITMAP + LD BC,(REALYS) + LD XH,C + EX AF,AF' +MS002 LD BC,(SKIPXF) + ADD HL,BC + LD BC,(REALXS) + OUT (PORT_Y),A + EX AF,AF' + ;USH DE + LD (PUSH_DE+1),DE + LDIR +PUSH_DE LD DE,#0000 +; POP DE + EX AF,AF' + INC A + JR Z,MS003 + DEC XH + JR NZ,MS002 +MS003 POP BC + LD A,B + OUT (SLOT3),A + LD A,C + OUT (PORT_Y),A + XOR A + RET + +READ_M IN A,(CMOUSE) + RRCA + RET NC + IN A,(DMOUSE) + LD L,A + BIT 6,A + CCF + RET Z +TST_01 IN A,(CMOUSE) + RRCA + JP NC,TST_01 + IN A,(DMOUSE) + LD E,A + BIT 6,A + CCF + RET NZ +TST_02 IN A,(CMOUSE) + RRCA + JR NC,TST_02 + IN A,(DMOUSE) + LD D,A + BIT 6,A + CCF + RET NZ + LD A,E + AND #3F + LD E,A + LD A,L + AND #03 + RRCA + RRCA + OR E + LD E,A + LD A,D + AND #3F + LD D,A + LD A,L + AND #0C + RRCA + RRCA + RRCA + RRCA + OR D + LD D,A + LD A,L + RLCA + RLCA + RLCA + RES 6,A + JR NC,STBU + SET 6,A +STBU RLCA + RLCA + AND #03 + LD (MB),A + CALL SENSE + LD A,E + LD (MX),A + LD A,D + LD (MY),A + SCF + RET + +MCORECT LD HL,(PIX_X) + LD DE,(MX) + LD D,0 + BIT 7,E + JR NZ,DECX + ADD HL,DE + LD (PIX_X),HL + EX DE,HL + LD HL,(MAX_X) + AND A + SBC HL,DE + JP NC,YCOO + LD HL,(MAX_X) + LD (PIX_X),HL + JP YCOO +DECX LD A,E + NEG + LD E,A + AND A + SBC HL,DE + LD (PIX_X),HL + JR C,YCOO2 + LD DE,(MIN_X) + SBC HL,DE + JR NC,YCOO +YCOO2 LD HL,(MIN_X) + LD (PIX_X),HL + +YCOO LD HL,(PIX_Y) + LD DE,(MY) + LD D,0 + BIT 7,E + JR NZ,DECY + ADD HL,DE + LD (PIX_Y),HL + EX DE,HL + + LD HL,(MAX_Y) + AND A + SBC HL,DE + RET NC + LD HL,(MAX_Y) + LD (PIX_Y),HL + RET + +DECY LD A,E + NEG + LD E,A + AND A + SBC HL,DE + LD (PIX_Y),HL + JR C,XCOO + LD DE,(MIN_Y) + SBC HL,DE + RET NC +XCOO LD HL,(MIN_Y) + LD (PIX_Y),HL + RET + +SENSE LD HL,(SENSEXY) + LD A,L + OR L + RET Z + DEC A + RET Z + LD A,E + BIT 7,A + LD B,#FF + JR Z,SEN1 + LD B,#7F + NEG +SEN1 INC B + SUB L + JR NC,SEN1 + BIT 7,B + JR Z,SEN2 + LD A,B + RES 7,A + NEG + LD B,A +SEN2 LD E,B + LD A,D + BIT 7,A + LD B,#FF + JR Z,SEN3 + LD B,#7F + NEG +SEN3 INC B + SUB H + JR NC,SEN3 + BIT 7,B + JR Z,SEN4 + LD A,B + RES 7,A + NEG + LD B,A +SEN4 LD D,B + RET + +M_MODE LD (MODE_M),A + OR A + JR Z,UNKMODE + CP 1 + JR Z,UNKMODE + CP 2 + JR Z,S320256 + CP 3 + JR Z,S640256 + BIT 7,A + JR Z,UNKMODE + RES 7,A + CP 1 + JR Z,S320256 + CP 2 + JR Z,S640256 +UNKMODE XOR A ; ????? может тут надо .INVALID_COMMAND ? + SCF + RET + +S320256 + LD HL,0 ;MIN X + LD DE,319 ;MAX X + CALL MS_HORZ + LD HL,0 ;MIN X + LD DE,255 ;MAX X + CALL MS_VERT + XOR A + RET + +S640256 + LD HL,0 ;MIN X + LD DE,639 ;MAX X + CALL MS_HORZ + LD HL,0 ;MIN X + LD DE,255 ;MAX X + CALL MS_VERT + XOR A + RET + +;Mouse Interrupt +M_INT IN A,(SLOT3) + LD B,A + IN A,(PORT_Y) + LD C,A + PUSH BC + CALL REFRESH ;Refresh mouse + CALL CONTROL + POP BC + LD A,B + OUT (SLOT3),A + LD A,C + OUT (PORT_Y),A + RET + +M_REFR CALL CONTROL + AND A + RET + +CONTROL CALL READ_M + RET NC + CALL MCORECT + LD A,#00 + LD (REDY+1),A + RET + +REFRESH LD A,#01 + OR A + RET NZ +REDY LD A,#00 +; OR A +; RET NZ + CALL RESTORE + LD HL,(PIX_X) + LD DE,(PIX_Y) + CALL MOUSE + LD A,#FF + LD (REDY+1),A + RET + +MODE_M DB #03 + +PIX_X DW 160 +PIX_Y DW 128 + +MX DB #00 +MY DB #00 +MB DB #00 +MB_OLD DB #00 ; !FIXIT - не нужно? +MIN_X DW 0 +MAX_X DW 319 +MIN_Y DW 0 +MAX_Y DW 255 +SENSEXY +SENSE_X DB 0 +SENSE_Y DB 0 + +XHOT_SP DW 0 +YHOT_SP DW 0 + +ANDXORS DW #FF00 +ANDXORA DW #FF77 + +M_XSIZE DB 10 +M_YSIZE DB 14 +SKIPXF DW 0 +REALXS DW 0 +REALYS DW 0 + +Xx EQU #00 +Ww EQU #FE +Nn EQU #FF + +;MS_BMP +M_IMAGE: + DB Xx,Xx,Nn,Nn,Nn,Nn,Nn,Nn,Nn,Nn + DB Xx,Ww,Xx,Nn,Nn,Nn,Nn,Nn,Nn,Nn + DB Xx,Ww,Ww,Xx,Nn,Nn,Nn,Nn,Nn,Nn + DB Xx,Ww,Ww,Ww,Xx,Nn,Nn,Nn,Nn,Nn + DB Xx,Ww,Ww,Ww,Ww,Xx,Nn,Nn,Nn,Nn + DB Xx,Ww,Ww,Ww,Ww,Ww,Xx,Nn,Nn,Nn + DB Xx,Ww,Ww,Ww,Ww,Ww,Ww,Xx,Nn,Nn + DB Xx,Ww,Ww,Ww,Ww,Xx,Xx,Xx,Xx,Nn + DB Xx,Ww,Ww,Xx,Ww,Xx,Nn,Nn,Nn,Nn + DB Xx,Ww,Xx,Xx,Ww,Ww,Xx,Nn,Nn,Nn + DB Xx,Xx,Nn,Nn,Xx,Ww,Xx,Nn,Nn,Nn + DB Xx,Nn,Nn,Nn,Xx,Ww,Ww,Xx,Nn,Nn + DB Nn,Nn,Nn,Nn,Nn,Xx,Xx,Nn,Nn,Nn + DB Nn,Nn,Nn,Nn,Nn,Nn,Nn,Nn,Nn,Nn + BLOCK 256-($-M_IMAGE),0 +.Size EQU $-M_IMAGE + +;//MODULE: INTMOUSE +;[END] + diff --git a/DSS/KEYINTER.ASM b/DSS/KEYINTER.ASM new file mode 100644 index 0000000..48bf466 --- /dev/null +++ b/DSS/KEYINTER.ASM @@ -0,0 +1,927 @@ + +;[BEGIN] +;//MODULE: KEYINTER +;//CREATE: 19-05-1998 AUTHOR: Denis Parinov +;//UPDATE: 24-10-1999 DNS Restore module +;------------------------------------------------ +;R02 13-04-2023 BAO FIX BUG IN K_CLEAR WITH STACK OVERFLOW +;R01 10-02-2003 DNS Add cursor visualisation +; + _mInfoALIGN 256,0 +;KEYBOARD BUFFER +SBUF: BLOCK 64,0 + + +HEAD DB #00 +HOST DB #00 + +K_LOCK EQU $-KEYFLAG +LANG_L EQU 7 +PAUSE_L EQU 6 +RES5_L EQU 5 +RES4_L EQU 4 +NUM_L EQU 3 +SCRL_L EQU 2 +INS_L EQU 1 +CAPS_L EQU 0 +KEYFLAG DB #02 ;D0-Key Pressed + +K_SHIFT EQU $-KEYFLAG +L_SHIFT EQU 7 +R_SHIFT EQU 6 +X_CTRL EQU 5 +X_ALT EQU 4 +L_CTRL EQU 3 +L_ALT EQU 2 +R_CTRL EQU 1 +R_ALT EQU 0 +KEYCTRL DB #00 + +KEYFLG EQU $-KEYFLAG +FLAG_E0 EQU 7 +FLAG_F0 EQU 6 +FLAG_E1 EQU 5 +FLAG_04 EQU 4 +FLAG_03 EQU 3 +FLAG_02 EQU 2 +FLAG_01 EQU 1 +FLAG_00 EQU 0 + DB #00 + +SOUND_K EQU $-KEYFLAG +FLAG_S7 EQU 7 +FLAG_S6 EQU 6 +FLAG_S5 EQU 5 +FLAG_S4 EQU 4 +FLAG_S3 EQU 3 +FLAG_S2 EQU 2 +SF_ALT EQU 1 +SF_BUFF EQU 0 + DB #03 + +; D15 - LShift +; D14 - RShift +; D13 - CTRL +; D12 - ALT +; D11 - LCTRL +; D10 - LALT +; D9 - RCTRL +; D8 - RALT +; D7 - Language Lock +; D6 - Reserved +; D5 - Reserved +; D4 - Reserved +; D3 - Num Lock +; D2 - Scroll Lock +; D1 - Insert Lock +; D0 - Caps Lock + +; D15 - Keystroke +; D14 +; D13 \ +; D12 \ +; D11 -- Position code (0...5Ah) +; D10 / +; D9 / +; D8 +; D7..D0 - ASCII code + + +UNCODE DW 0 + +WAITKEY LD HL,HOST + LD A,(HEAD) + CP (HL) + JR Z,WAITKEY + CALL GETSYM + LD A,E + AND A + RET + +SCANKEY LD HL,HOST + LD A,(HEAD) + CP (HL) + RET Z + CALL GETSYM + LD A,E + RET +; + +; + IF CLASSIC_CURSOR ;------------------------------; + +ECHOKEY: +CURCOUNT+1: LD A,#FF ;R01 + INC A ;R01 + LD (CURCOUNT),A ;R01 + AND #FF ;R01 + JR NZ,NOTUR ;R01 +CURSYM+1: LD A,#00 ;R01 + XOR #01 ;R01 + LD (CURSYM),A ;R01 + LD A," " ;R01 + JR Z,CURSKI ;R01 + LD A,"_" ;R01 +CURSKI: CALL PUTCHAR ;R01 + LD A,8 ;R01 BACKSPACE + CALL PUTCHAR ;R01 +NOTUR: CALL SCANKEY + JR Z,ECHOKEY + PUSH DE + PUSH BC + PUSH AF ;R01 + LD A," " ;R01 + CALL PUTCHAR ;R01 + LD A,8 ;R01 BACKSPACE + CALL PUTCHAR ;R01 + POP AF ;R01 + CALL PUTCHAR + POP BC + POP DE + LD A,E + AND A + RET + + ELSE ;------------------------------; + +delay_curs: EQU 11 ; частота мигания курсора +INS_CUR_ZG: EQU #19 +CURSOR_ZG: EQU #1A +NORM_ZG: EQU #1B + + +ECHOKEY: CALL Cursor_On ; вкл. курсор, установить фокус на "Input Line" + EI +.loop: CALL SCANKEY + JR Z,.loop + PUSH DE + PUSH BC + PUSH AF + CALL Cursor_Off ; выкл. курсор + POP AF + OR A ; добавил + CALL NZ,PUTCHAR ; вывод "a" на экран + POP BC + POP DE + LD A,E + AND A + RET + +Cursor: +.Flag+1: LD A,0 ; флаг курсора 00-нет/01-есть + CPL + LD (.Flag),A +; Включить курсор +Cursor_On: LD C,BIOS.LP_GET_PLACE ; узнать полож. курсора + RST ToBIOS + LD (Cursor_Off.pos),DE + XOR A + LD C,BIOS.WIN_GET_SYM ; получить символ + RST ToBIOS + LD BC,NORM_ZG*256+BIOS.WIN_PUT_SYM ; b=знакоген., с=символ на экран + LD A,(Cursor.Flag) + OR A + JR Z,.put + LD B,CURSOR_ZG ; черта + LD A,(KEYFLAG) ; флаги клавы + BIT 1,A ; бит Ins + JR NZ,.put + LD B,INS_CUR_ZG ; блок +.put: XOR A ; номер окна + RST ToBIOS + LD A,1 + LD (Cursor_Off.Flag),A + LD A,delay_curs + RET + +; Выключить курсор +Cursor_Off: +.Flag+1: LD A,0 ; флаг курсора: 00-выкл/01-вкл + OR A + RET Z + LD A,-1 ; = #FF + LD (Cursor.Flag),A + INC A + LD (.Flag),A + LD A,delay_curs + LD (cursor_interrupt.timer),A +.pos+1: LD DE,0 ; Y/X полож. + BIT 7,E + RET NZ + LD C,BIOS.WIN_GET_SYM ; получить символ + XOR A + RST ToBIOS + XOR A + LD BC,NORM_ZG*256+BIOS.WIN_PUT_SYM ; символ на экран + RST ToBIOS + RET + +; Вектор обслуживания курсора +cursor_interrupt: + LD A,(Cursor_Off.Flag) + OR A + RET Z +.timer+1: LD A,1 ; пауза мигания + DEC A + CALL Z,Cursor + LD (.timer),A + RET + +; Настройка знакогенератора курсора черточкой +SETUP_CURSORS: + in a,(SLOT2) + push af ; сохр. порт + ld a,(BANKTBL+TXTPAGE) ; 2-й лог. номер страницы расш. ДОС + out (SLOT2),a + ; получить сист. знакоген. + ld de,#8000 ;!HARDCODE буфер для 2048 байт данных + push de + ld c,BIOS.WIN_GET_ZG ; получить знакоген. + rst ToBIOS + ; заполнить кодом #FF 2 нижние линии + ld hl,#8000+(2048-(2*256)) ;!HARDCODE последние 512 байт + ld bc,511 + ld a,CURSOR_ZG; ; номер знакоген. "черточка" + call .fill_data_font + pop hl + ; заполнить остальные 6 линий (полный блок) + ld bc,2048-513 ;!HARDCODE + ld a,INS_CUR_ZG ; номер знакоген. "блок" + call .fill_data_font + pop af + out (SLOT2),a ; восст. порт + ret +; Настройка знакоген. и его регистрация +; вход: a=номер знакоген. +; hl=данные +; bc=размер данных +.fill_data_font: + ld e,l + ld d,h + ld (hl),#FF + inc de + ldir + ld de,#8000 ; знакоген. + ld c,BIOS.WIN_SET_ZG ; уст. знакоген. + rst ToBIOS + ret +; + ENDIF ;------------------------------; + + + +CTRLKEY LD HL,HOST + LD A,(HEAD) + CP (HL) + LD BC,(KEYFLAG) + LD A,#00 + RET Z + DEC A + RET + +TESTKEY LD HL,HOST + LD A,(HEAD) + CP (HL) + RET Z + LD L,(HL) + LD H,SBUF/256 + LD E,(HL) + INC L + LD D,(HL) + INC L + LD B,(HL) + INC L + LD C,(HL) + LD A,E + RET + +; K_CLEAR LD A,(HOST) +; LD (HEAD),A +; LD A,#2F +; CP B +; JR C,K_C2 +; LD A,DSS_Error.sys.INVALID_FUNCTION +; SCF +; RET + +; K_C2 LD A,#34 ;R02 +; CP B +; JR NC,K_C3 +; LD A,DSS_Error.sys.INVALID_FUNCTION +; SCF +; RET + +; K_C3 LD C,B +; RST #10 +; RET + +;small optimization +K_CLEAR LD A,(HOST) + LD (HEAD),A + LD A,#2F + CP B + JR NC,.error + LD A,#34 ;R02 + CP B + JR C,.error + LD C,B + JP #10 +.error: LD A,DSS_Error.sys.INVALID_FUNCTION + SCF + RET +; + +PUTSYM LD HL,HEAD + LD A,(HOST) + SUB 4 + AND #3F + CP (HL) + JR Z,FULL_BF + LD A,(HL) + INC (HL) + INC (HL) + INC (HL) + INC (HL) + RES 6,(HL) + LD L,A + LD H,SBUF/256 + LD (HL),E + INC L + LD (HL),D + INC L + LD (HL),B + INC L + LD (HL),C + RET + +GETSYM LD HL,HOST + LD A,(HEAD) + CP (HL) + RET Z + LD A,(HL) + INC (HL) + INC (HL) + INC (HL) + INC (HL) + RES 6,(HL) + LD L,A + LD H,SBUF/256 + LD E,(HL) + INC L + LD D,(HL) + INC L + LD B,(HL) + INC L + LD C,(HL) + RET + +FULL_BF EX AF,AF' + BIT SF_BUFF,(IX+SOUND_K) + JR Z,FBF + EXX + LD DE,230 + LD HL,50 + CALL BEEP + EXX +FBF EX AF,AF' + RET + +E0_KEY SET FLAG_E0,(IX+KEYFLG) + JR RESCAN + +F0_KEY SET FLAG_F0,(IX+KEYFLG) + JR RESCAN + +E1_KEY SET FLAG_E1,(IX+KEYFLG) + JR RESCAN + +KEYSCAN LD IX,KEYFLAG + +RESCAN IN A,(COM_A) + BIT 0,A + RET Z + IN A,(DAT_A) + CP #F0 + JR Z,F0_KEY + CP #E0 + JR Z,E0_KEY + CP #E1 + JR Z,E1_KEY + BIT FLAG_F0,(IX+KEYFLG) + JR NZ,UN_KEY + LD L,A + CALL XLAT + CALL SHIFTS + RES FLAG_E0,(IX+KEYFLG) + RES FLAG_E1,(IX+KEYFLG) + RET Z ;IT'S SHIFT KEY + + CALL INPCODE ;L - AT POS. CODE +PUTCODE: + LD HL,#1C00 ;Caps Lock + AND A + SBC HL,DE + CALL Z,CAPS_X + LD HL,#B800 ;Ctrl + Space + AND A + SBC HL,DE + CALL Z,RUS_X + LD HL,#5000 ;Insert + AND A + SBC HL,DE + CALL Z,INS_X + LD HL,#4900 ;Num Lock + AND A + SBC HL,DE + CALL Z,NUM_X + LD HL,#C900 ;Pause Lock + AND A + SBC HL,DE + CALL Z,PAUSE_X + LD HL,#4800 ;Scroll Lock + AND A + SBC HL,DE + CALL Z,SCL_X + +;small optimization + ; LD HL,#CF00 ;Ctrl + Alt + Del + ; AND A + ; SBC HL,DE + ; CALL Z,RST_X +;;; + LD BC,(KEYFLAG) + CALL PUTSYM + RET + +UN_KEY RES FLAG_F0,(IX+KEYFLG) + LD L,A + CALL XLAT + CALL UNSHIFT + RES FLAG_E0,(IX+KEYFLG) + LD H,0 + LD (UNCODE),HL + RET + +CAPS_X LD A,(IX+K_LOCK) + XOR 1<","?",#00,"|" + DB #00,#00,Spc,#00,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + DB #00,#00,#00,"/","*","-","+",Ent,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + +CAPSTAB DB "`",Esc,"1","2","3","4","5","6","7","8","9","0","-","=",Bcs + DB Tab,"Q","W","E","R","T","Y","U","I","O","P","[","]" + DB Cps,"A","S","D","F","G","H","J","K","L",";","'",Ent + DB #00,"Z","X","C","V","B","N","M",#2C,".","/",#00,#5C + DB #00,#00,Spc,#00,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + DB #00,#00,#00,"/","*","-","+",Ent,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + +SHF2TAB DB "~",Esc,"!","@","#","$","%","^","&","*","(",")","_","+",Bcs + DB Tab,"q","w","e","r","t","y","u","i","o","p","{","}" + DB Cps,"a","s","d","f","g","h","j","k","l",":",#22,Ent + DB #00,"z","x","c","v","b","n","m","<",">","?",#00,"|" + DB #00,#00,Spc,#00,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + DB #00,#00,#00,"/","*","-","+",Ent,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + +;Standart Russian tables +NORMRUS DB #F1,Esc,"1","2","3","4","5","6","7","8","9","0","-","=",Bcs + DB Tab,#A9,#E6,#E3,#AA,#A5,#AD,#A3,#E8,#E9,#A7,#E5,#EA + DB Cps,#E4,#EB,#A2,#A0,#AF,#E0,#AE,#AB,#A4,#A6,#ED,Ent + DB #00,#EF,#E7,#E1,#AC,#A8,#E2,#EC,#A1,#EE,".",#00,#5C + DB #00,#00,Spc,#00,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + DB #00,#00,#00,"/","*","-","+",Ent,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + +SHIFRUS DB #F0,Esc,"!",#22,"#","$",":",#2C,".",";","?","%","_","+",Bcs + DB Tab,#89,#96,#93,#8A,#85,#8D,#83,#98,#99,#87,#95,#9A + DB Cps,#94,#9B,#82,#80,#8F,#90,#8E,#8B,#84,#86,#9D,Ent + DB #00,#9F,#97,#91,#8C,#88,#92,#9C,#81,#9E,#2C,#00,"|" + DB #00,#00,Spc,#00,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + DB #00,#00,#00,"/","*","-","+",Ent,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + +CAPSRUS DB #F0,Esc,"1","2","3","4","5","6","7","8","9","0","-","=",Bcs + DB Tab,#89,#96,#93,#8A,#85,#8D,#83,#98,#99,#87,#95,#9A + DB Cps,#94,#9B,#82,#80,#8F,#90,#8E,#8B,#84,#86,#9D,Ent + DB #00,#9F,#97,#91,#8C,#88,#92,#9C,#81,#9E,".",#00,#5C + DB #00,#00,Spc,#00,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + DB #00,#00,#00,"/","*","-","+",Ent,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + +SHF2RUS DB #F1,Esc,"!",#22,"#","$",":",#2C,".",";","?","%","_","+",Bcs + DB Tab,#A9,#E6,#E3,#AA,#A5,#AD,#A3,#E8,#E9,#A7,#E5,#EA + DB Cps,#E4,#EB,#A2,#A0,#AF,#E0,#AE,#AB,#A4,#A6,#ED,Ent + DB #00,#EF,#E7,#E1,#AC,#A8,#E2,#EC,#A1,#EE,#2C,#00,"|" + DB #00,#00,Spc,#00,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + DB #00,#00,#00,"/","*","-","+",Ent,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + +;================================ + +BEEP LD A,#10 + OUT (#FE),A + LD B,D + LD C,E +BPP DEC BC + LD A,B + OR C + JR NZ,BPP + LD A,#00 + OUT (#FE),A + LD B,D + LD C,E +BPP2 DEC BC + LD A,B + OR C + JR NZ,BPP2 + DEC HL + LD A,H + OR L + JR NZ,BEEP + RET + +COM_A EQU #19 ;!FIXIT sp2000.inc +DAT_A EQU #18 ;!FIXIT sp2000.inc + +KINIT XOR A ;LD A,0 + OUT (COM_A),A + INC A ;LD A,1 + OUT (COM_A),A + XOR A ;LD A,0 ;#18 + OUT (COM_A),A + LD A,3 + OUT (COM_A),A + LD A,#C1 + OUT (COM_A),A + LD A,4 + OUT (COM_A),A + LD A,#07 ;#05 + OUT (COM_A),A + LD A,5 + OUT (COM_A),A + LD A,#62 + OUT (COM_A),A + RET + +;//MODULE: KEYINTER +;[END] \ No newline at end of file diff --git a/DSS/KNOWN.BUG b/DSS/KNOWN.BUG new file mode 100644 index 0000000..062d8b3 --- /dev/null +++ b/DSS/KNOWN.BUG @@ -0,0 +1,12 @@ ++ function WINCOPY & WINREST эх чряЁх∙р■Є яЁхЁ√трэш  яхЁхф т√чютюь BIOS (шёяюы№чєхЄё  т√тюф ёЄхъюь!). + +- яЁш т√тюфх эр ъюэёюы№ фышээюую ЄхъёЄр, ¤ъЁрэ эх ёъЁюышЁєхЄё . ╧ЁютхЁ Є№ эр фюёЄшцхэшх 80 яючшЎшш! + ++ ю°шсър т ЇєэъЎшш SCROLL A=0. + ++ ю°шсър яЁш яЁюёьюЄЁх ърЄрыюур т ЇєэъЎш ї єёЄрэютъш рЄЁшсєЄют яЁюяєёър■Єё  ёшёЄхьэ√х Їрщы√. я/я SEARCH MASK=#23 + +- шуэюЁшЁютрэшх ю°шсюъ яЁш чряшёш ёшёЄхьэ√ї юсырёЄхщ FAT/DIR, эхтючьюцэюёЄ№ юЄЁрсюЄрЄ№ ю°шсъє write-protect, Єръ ъръ юэр ЄхЁ хЄё  яЁш яюя√Єъх чряшёрЄ№ шчьхэхээ√щ ърЄрыюу эр фшёъ. ═ю тючэшърхЄ ю°шсър file not found Єръ ъръ ёЁрчю яюёых ёючфрэш  ёшёЄхьр юЄъЁ√трхЄ Їрщы. + +- ю°шсър ЁрчсюЁр фюяєёЄшьюую шьхэш Їрщыр, хёыш юэю ёюёЄюшЄ шч "." Єръ ъръ яюфЁєчюьхтрхЄё  яЁюсхы√ Єюўър яЁюсхы√. + diff --git a/DSS/RAM_DRV0.ASM b/DSS/RAM_DRV0.ASM new file mode 100644 index 0000000..bb2a79d --- /dev/null +++ b/DSS/RAM_DRV0.ASM @@ -0,0 +1,613 @@ +; +; SYSPAGE EQU #FE +; SLOT1 EQU #A2 +; SLOT2 EQU #C2 +; SLOT3 EQU #E2 + +; ORG #3CDB +; Disk Driver Specification ver. 2.20 +;[]===========================================================[ 0] +;Procedure : Initialization +; +;Function : Initialization device(s) +; +;Input : C = 00h +; IX - Environment +;Output : A = Amount drive support +; HL = Size driver +;[]===========================================================[ 0] + + +;[]===========================================================[ 1] +;Procedure : Open +; +;Function : Open disk +; +;Input : C = 01h +; A - Drive +;Output : None +; +;[]===========================================================[ 1] + + +;[]===========================================================[ 2] +;Procedure : Close +; +;Function : Close disk +; +;Input : C = 02h +; A - Drive +;Output : None +; +;[]===========================================================[ 2] + + +;[]===========================================================[ 3] +;!TODO +;Procedure : Media check +; +;Function : Checking change line +; +;Input : C = 03h +; A - Drive +;Output : A = 00h disk no changed +; A = 0FFh disk changed +; +;[]===========================================================[ 3] + + +;[]===========================================================[ 4] +;Procedure : Get BPB +; +;Function : Get Block Parameters BIOS +; +;Input : C = 04h +; DE - Address +;Output : None +; +;[]===========================================================[ 4] + + +;[]===========================================================[ 5] +;Procedure : Input +; +;Function : Input from disk +; +;Input : C = 05h +; HL:IX - Logical Block (sector) +; DE - Address +; B - Sector count +;Output : None +; +;[]===========================================================[ 5] + + +;[]===========================================================[ 6] +;Procedure : Output +; +;Function : Output to disk +; +;Input : C = 06h +; HL:IX - Logical Block (sector) +; DE - Address +; B - Sector count +;Output : None +; +;[]===========================================================[ 6] + + +;[]===========================================================[ 7] +;!TODO +;Procedure : Removable +; +;Function : Checking change line +; +;Input : C = 07h +; A - Drive +;Output : A = 00h Removable +; A = FFh Nonremovable +; +;[]===========================================================[ 7] + + +;[]===========================================================[ 8] +;Procedure : Generic IOCTL +; +;Function : Generic Input Output Control +; +;Input : C = 08h +; B - Subcommand +; DE = 55AAh Magic Number +; Subcommand +;---------------------- +; 00h - Get Device Parameters +; 01h - Read track +; 02h - Test track +; 80h - Set Device Parameters +; 81h - Write track +; 82h - Format track +;Output : +; +;[]===========================================================[ 8] + + +;[]===========================================================[ 9] +; RESERVED +;[]===========================================================[ 9] + + +;[]===========================================================[ 10] +;!TODO +;Procedure : Read Long +; +;Function : Reading sectors from disk +; +;Input : C = 0Ah +; HL:IX - Logical Block (sector) +; DE - Address +; B - Sector count +; A'- Page +;Output : A'- Next Page +; HL:IX - Next Logical Block (sector) +; DE - Next Address +; +;[]===========================================================[ 10] + + +;[]===========================================================[ 11] +;!TODO +;Procedure : Write Long +; +;Function : Writing sectors to disk +; +;Input : C = 0Bh +; HL:IX - Logical Block (sector) +; DE - Address +; B - Sector count +; A'- Page +;Output : A'- Next Page +; HL:IX - Next Logical Block (sector) +; DE - Next Address +; +;[]===========================================================[ 11] +; +; Errors: +; 0 (00h) - NO ERRORS +; 1 (01h) - BAD COMMAND +; 2 (02h) - BAD DRIVE NUMBER +; 3 (03h) - UNKNOW FORMAT +; 4 (04h) - NOT READY +; 5 (05h) - SEEK ERROR +; 6 (06h) - SECTOR NOT FOUND +; 7 (07h) - CRC ERROR +; 8 (08h) - WRITE PROTECT +; 9 (09h) - READ ERROR +; 10 (0Ah) - WRITE ERROR +; 11 (0Bh) - FAILURE +; 12 (0Ch) - BUSY (DEVICE OPENED) +; 13 (0Dh) - RESERVED + +RMDRIVE: + INC C + DEC C + JP Z,INIT_RD ; 0 + DEC C + JR Z,RESE_RD ; 1 + DEC C + JR Z,STAT_RD ; 2 + DEC C + JR Z,CHEK_RD ; 3 + DEC C + JR Z,GBPB_RD ; 4 + DEC C + JR Z,READR ; 5 + DEC C + JR Z,WRITER ; 6 + DEC C + JR Z,REMOV_R ; 7 + DEC C + JP Z,IOCTL_R ; 8 + + ; DEC C + ; JP Z,RESR_H ; 9 + ; DEC C + ; JP Z,LREADH ; 10 + ; DEC C + ; JP Z,LWRITEH ; 11 +.error: + LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET + +REMOV_R: +RESE_RD: +STAT_RD: + XOR A + RET + +;!FIXIT сделать в SYS_PAGE для рамдисков переменные и брать оттуда значение +CHEK_RD LD A,#FF + AND A + RET + +;DE - ADDRESS +GBPB_RD LD IX,0 + LD HL,0 + LD B,#01 + ;JP READR +;READ SECTORS +; HL:IX - SECTOR +; DE - ADDRESS +; B - COUNT +; A - DRIVE +READR PUSH BC + PUSH IX + PUSH HL + PUSH BC + CALL RAMADDR + POP BC + LD IX,512 +RAMRLOP PUSH BC + PUSH IX + CALL LRDSEC + POP IX + POP BC + DJNZ RAMRLOP + POP HL + POP IX + POP BC + XOR A + CP B + LD C,B + LD B,A + JR Z,DYEP256 + ADD IX,BC + LD C,B + ADC HL,BC + XOR A + RET + +DYEP256 INC B + ADD IX,BC + LD B,C + ADC HL,BC + XOR A + RET + + +;WRITE SECTORS +; HL:IX - SECTOR +; DE - ADDRESS +; B - COUNT +; A - DRIVE +WRITER PUSH BC + PUSH IX + PUSH HL + PUSH BC + CALL RAMADDR + POP BC + LD IX,512 +RAMWLOP PUSH BC + PUSH IX + CALL WRDSEC + POP IX + POP BC + DJNZ RAMWLOP + POP HL + POP IX + POP BC + XOR A + CP B + LD C,B + LD B,A + JR Z,WYEP256 + ADD IX,BC + LD C,B + ADC HL,BC + XOR A + RET + +WYEP256 INC B + ADD IX,BC + LD B,C + ADC HL,BC + XOR A + RET + + +INIT_RD: +.SectorSize EQU 512 ;!HARDCODE + LD HL,.SectorSize + LD A,#80 +.loop: SRL A + RR H + JR NC,.loop + + LD (S_P_P),A + LD BC,#0*256 + BIOS.GET_RAMD_ST ; Получение идентификатора блока, назначенного на 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 new file mode 100644 index 0000000..8325206 --- /dev/null +++ b/DSS/RAM_DRV1.ASM @@ -0,0 +1,477 @@ + + +; SYSPAGE EQU #FE +; SLOT1 EQU #A2 +; SLOT2 EQU #C2 +; SLOT3 EQU #E2 + +; ORG #3CDB +; Disk Driver Specification ver. 2.20 +;[]===========================================================[ 0] +;Procedure : Initialization +; +;Function : Initialization device(s) +; +;Input : C = 00h +; IX - Environment +;Output : A = Amount drive support +; HL = Size driver +;[]===========================================================[ 0] + + +;[]===========================================================[ 1] +;Procedure : Open +; +;Function : Open disk +; +;Input : C = 01h +; A - Drive +;Output : None +; +;[]===========================================================[ 1] + + +;[]===========================================================[ 2] +;Procedure : Close +; +;Function : Close disk +; +;Input : C = 02h +; A - Drive +;Output : None +; +;[]===========================================================[ 2] + + +;[]===========================================================[ 3] +;!TODO +;Procedure : Media check +; +;Function : Checking change line +; +;Input : C = 03h +; A - Drive +;Output : A = 00h disk no changed +; A = 0FFh disk changed +; +;[]===========================================================[ 3] + + +;[]===========================================================[ 4] +;Procedure : Get BPB +; +;Function : Get Block Parameters BIOS +; +;Input : C = 04h +; DE - Address +;Output : None +; +;[]===========================================================[ 4] + + +;[]===========================================================[ 5] +;Procedure : Input +; +;Function : Input from disk +; +;Input : C = 05h +; HL:IX - Logical Block (sector) +; DE - Address +; B - Sector count +;Output : None +; +;[]===========================================================[ 5] + + +;[]===========================================================[ 6] +;Procedure : Output +; +;Function : Output to disk +; +;Input : C = 06h +; HL:IX - Logical Block (sector) +; DE - Address +; B - Sector count +;Output : None +; +;[]===========================================================[ 6] + + +;[]===========================================================[ 7] +;!TODO +;Procedure : Removable +; +;Function : Checking change line +; +;Input : C = 07h +; A - Drive +;Output : A = 00h Removable +; A = FFh Nonremovable +; +;[]===========================================================[ 7] + + +;[]===========================================================[ 8] +;Procedure : Generic IOCTL +; +;Function : Generic Input Output Control +; +;Input : C = 08h +; B - Subcommand +; DE = 55AAh Magic Number +; Subcommand +;---------------------- +; 00h - Get Device Parameters +; 01h - Read track +; 02h - Test track +; 80h - Set Device Parameters +; 81h - Write track +; 82h - Format track +;Output : +; +;[]===========================================================[ 8] + + +;[]===========================================================[ 9] +; RESERVED +;[]===========================================================[ 9] + + +;[]===========================================================[ 10] +;!TODO +;Procedure : Read Long +; +;Function : Reading sectors from disk +; +;Input : C = 0Ah +; HL:IX - Logical Block (sector) +; DE - Address +; B - Sector count +; A'- Page +;Output : A'- Next Page +; HL:IX - Next Logical Block (sector) +; DE - Next Address +; +;[]===========================================================[ 10] + + +;[]===========================================================[ 11] +;!TODO +;Procedure : Write Long +; +;Function : Writing sectors to disk +; +;Input : C = 0Bh +; HL:IX - Logical Block (sector) +; DE - Address +; B - Sector count +; A'- Page +;Output : A'- Next Page +; HL:IX - Next Logical Block (sector) +; DE - Next Address +; +;[]===========================================================[ 11] +; +; Errors: +; 0 (00h) - NO ERRORS +; 1 (01h) - BAD COMMAND +; 2 (02h) - BAD DRIVE NUMBER +; 3 (03h) - UNKNOW FORMAT +; 4 (04h) - NOT READY +; 5 (05h) - SEEK ERROR +; 6 (06h) - SECTOR NOT FOUND +; 7 (07h) - CRC ERROR +; 8 (08h) - WRITE PROTECT +; 9 (09h) - READ ERROR +; 10 (0Ah) - WRITE ERROR +; 11 (0Bh) - FAILURE +; 12 (0Ch) - BUSY (DEVICE OPENED) +; 13 (0Dh) - RESERVED + + +; MACRO _mGET_RAMDRV_NUM +; PUSH BC +; LD BC,RAMDTBL +; SLA A +; ADD A,C +; LD C,A +; LD A,0 +; ADC A,B +; LD B,A +; INC BC +; LD A,(BC) +; OR #60 +; POP BC +; ENDM + + MACRO _mGET_RAMDRV_NUM + LD BC,RAMDTBL + SLA A + ADD A,C + LD C,A + LD A,0 + ADC A,B + LD B,A + INC BC + LD A,(BC) + OR #60 ;!HARDCODE сделать номера разных устройств через метки + ENDM + + +; parser +RMDRIVE: + INC C + DEC C + JP Z,INIT_RD ; 0 + DEC C + JR Z,RESET_RD ; 1 + DEC C + JR Z,STATUS_RD ; 2 + DEC C + JR Z,CHEK_RD ; 3 + DEC C + JR Z,GBPB_RD ; 4 + DEC C + JR Z,READ_RD ; 5 + DEC C + JR Z,WRITE_RD ; 6 + DEC C + JR Z,REMOV_RD ; 7 + DEC C + JP Z,IOCTL_RD ; 8 + DEC C + JP Z,.error ; 9 RESR_H + DEC C + JP Z,LREAD_RD ; 10 + DEC C + JP Z,LWRITE_RD ; 11 +.error: + LD A,DSS_Error.drv.INVALID_COMMAND + SCF + RET + +REMOV_RD: +RESET_RD: +STATUS_RD: + XOR A + RET + +;!FIXIT сделать в SYS_PAGE для рамдисков переменные и брать оттуда значение +CHEK_RD LD A,#FF + AND A + RET + +;DE - ADDRESS +GBPB_RD LD IX,0 + LD HL,0 + LD B,#01 + ;JP READ_RD +;READ SECTORS +; HL:IX - SECTOR +; DE - ADDRESS +; B - COUNT +; A - DRIVE +READ_RD: + PUSH BC + _mGET_RAMDRV_NUM + POP BC + LD C,BIOS.DRV_READ + JP ToBIOS + ; RST ToBIOS + ; XOR A + ; RET +LREAD_RD: + PUSH BC + _mGET_RAMDRV_NUM + POP BC + LD C,BIOS.DRV_READ_LONG + JP ToBIOS + ; RST ToBIOS + ; XOR A + ; RET + +;WRITE SECTORS +; HL:IX - SECTOR +; DE - ADDRESS +; B - COUNT +; A - DRIVE +WRITE_RD: + PUSH BC + _mGET_RAMDRV_NUM + POP BC + LD C,BIOS.DRV_WRITE + JP ToBIOS + ; RST ToBIOS + ; XOR A + ; RET + +LWRITE_RD: + PUSH BC + _mGET_RAMDRV_NUM + POP BC + LD C,BIOS.DRV_WRITE_LONG + JP ToBIOS + ; RST ToBIOS + ; XOR A + ; RET + +;S_P_P DB #00 +INIT_RD: +; .SectorSize EQU 512 ;!HARDCODE +; LD HL,.SectorSize +; LD A,#80 +; .loop: SRL A +; RR H +; JR NC,.loop +; LD (S_P_P),A + + LD BC,#0*256 + BIOS.GET_RAMD_ST ; Получение идентификатора блока, назначенного на 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 new file mode 100644 index 0000000..06e9c0f --- /dev/null +++ b/DSS/Structures.inc @@ -0,0 +1,67 @@ +; + STRUCT _sStack ; 256 bytes +buffer BLOCK 255,0 +SPoint BYTE 0 + ENDS +; + +; + STRUCT _sEXE_HEADER ; 512 bytes +EXE_EXT TEXT 3,{"EX","E"} +VERSION BYTE 0 +OFFCOD1 WORD 0 +OFFCOD2 WORD 0 +LOADER WORD 0 +RESERVED BLOCK 6,0 +LD_ADDR WORD 0 +PC_REG WORD 0 +SP_REG WORD 0 +RESERVED2 BLOCK 490,0 + ENDS +; + +;File Manipulator (FM) + STRUCT _sFM ; 44 bytes +.NAME: TEXT 8,{". "," "} ;+00 NAME +.EXT: TEXT 3,{" "," "} ;+08 EXT +.ATTRIBUT: BYTE #10 ;+11 ATTRIBUT +.RESERVED_L: BYTE 0 ;+12 RESERVED; !TODO следующий кластер для чтения +.RESERVED_H: BYTE 0 ;+13 RESERVED; !TODO следующий кластер для записи +.RESERVED_X: BLOCK 8,0 ;+14 RESERVED +.TIME: WORD #0000 ;+22 TIME +.DATE: WORD #0000 ;+24 DATE +.ST_CLUSTER: WORD #0000 ;+26 START CLUSTER +.F_SIZE: DWORD #0000 ;+28 SIZE FILE +.F_POSITION: DWORD #0000 ;+32 FILE POSITION (FP) +.DIR_CLUSTER: WORD #0000 ;+36 DIRECTORY CLUSTER +.HANDLE: WORD #0000 ;+38 HANDLE NUMBER +.DRIVE: BYTE #00 ;+40 DRIVE OR CURRENT +.ACCESS_MODE: BYTE #00 ;+41 ACCESS MODE +.TASK_NUM: BYTE #00 ;+42 TASK +.EMPTY: BYTE #00 ;+43 EMPTY + ENDS +; +; NAM EQU 0 ; LEN4 EQU 31 +; EXT EQU 8 ; POS1 EQU 32 +; ATR EQU 11 ; POS2 EQU 33 +; TIM1 EQU 22 ; POS3 EQU 34 +; TIM2 EQU 23 ; POS4 EQU 35 +; DAT1 EQU 24 ; DIRCLU1 EQU 36 +; DAT2 EQU 25 ; DIRCLU2 EQU 37 +; CLU1 EQU 26 ; HND1 EQU 38 +; CLU2 EQU 27 ; HND2 EQU 39 +; LEN1 EQU 28 ; FDRV EQU 40 +; LEN2 EQU 29 ; AMODE EQU 41 +; LEN3 EQU 30 ; FTASK EQU 42 + +; + STRUCT _sBuffers +FileManipulator _sFM ; 44 bytes * FMCOUNT +FM_RESERVE BLOCK _sFM * (FMCOUNT-1),0 +BootSector _sBOOT_SEC ; 62 bytes ;!TODO перенести в область буферов +EXE_Header _sEXE_HEADER ; 512 bytes +Stack _sStack ; 256 bytes +Buffer BLOCK 512,0 ; FOR BUFFER & SECBUF +MemoryTable BLOCK 256,0 ; 256 bytes + ENDS +; diff --git a/DSS/VERSION.INC b/DSS/VERSION.INC new file mode 100644 index 0000000..c1bda05 --- /dev/null +++ b/DSS/VERSION.INC @@ -0,0 +1,24 @@ +; +; DSS Version +VERS EQU 01 ;Version Number (XX.) +MODF EQU 70 ;Modification (.xx) +BUILD EQU 1 +; + +; Release Types +RELEASE EQU 0 +RC EQU 1 +BETA EQU 2 +DP EQU 3 +; + +; Bulid Type +OSTYPE EQU BETA +REVISION EQU 1 +; + +; Default date +DAY EQU 30 +MONTH EQU 03 +YEAR EQU 2023 +; \ No newline at end of file diff --git a/DSS/VIDEO.ASM b/DSS/VIDEO.ASM new file mode 100644 index 0000000..5e5b1ac --- /dev/null +++ b/DSS/VIDEO.ASM @@ -0,0 +1,682 @@ + +;[BEGIN] +;//MODULE: VIDEO +;//CREATE: 19-05-1998 AUTHOR: Denis Parinov +;//UPDATE: 24-10-1999 DNS Restore module +;--------------------------------------------------------------- +;Rev Date Name Description +;--------------------------------------------------------------- +;R02 07-11-2002 DNS CORRECT FN. WINCOPY & WINREST, ADD "DI+EI" +;R01 07-11-2002 DNS FIX BUG WITH SCROLLUP FN. (A=0) +;--------------------------------------------------------------- + +; CLEAR TEXT WINDOW +CLEAR LD C,BIOS.LP_CLS_WIN2 + RST ToBIOS + AND A + RET +; + +; PRINT NULL-TERMINATED CHARS STRING +; HL - STRING POINTER +PCHARS LD A,(HL) + INC HL + OR A + RET Z + ;PUSH HL + CALL PUTCHAR + ;POP HL + JP PCHARS + +; PRINT CHAR +; A - CHAR +PUTCHAR: + CP #0D + JP Z,CR_ + CP #0A + JP Z,LF_ + CP #09 + JP Z,TB_ + CP #08 + JP Z,BK_ + ; CP #20 + ; JP NC,CHAR +CHAR: LD BC,1*256 + BIOS.LP_PRINT_SYM + RST ToBIOS +; САЙМАН тут насильный скролл экрана если напечатал в позиции последнего символа последней строки +; 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/defines.inc b/DSS/defines.inc new file mode 100644 index 0000000..7978867 --- /dev/null +++ b/DSS/defines.inc @@ -0,0 +1,36 @@ +; + DEFINE TEST_FEATURE 1 +; + +; + DEFINE SHORT_RSTx10_TABLE 0 ; укороченная таблица функций rst #10. 96 функций. +; + +; + DEFINE MAX_RAMDRIVES 16 + DEFINE NeedSafePort_Y 1 + DEFINE TABisSPACES 1 + DEFINE CLASSIC_CURSOR 0 +; +;-------------------[MEMORY]-------------------------; + DEFINE USING_MEMPAGES 4 + +;!FIXIT сделать типа DIRPAGE EQU 0 + BANKTBL и упростить BANK +DIRPAGE EQU 0 +FATPAGE EQU 1 +TXTPAGE EQU 2 +ENVPAGE EQU 2 +DRVPAGE EQU 3 +; + +DIRSPEC.DEPTH EQU 256 ; '\' + 1..255 + +TXTADDR EQU #C000 +ENVADDR EQU #E400 +DIR EQU #C000 +FAT EQU #C000 + +FMCOUNT EQU 10 ; Количество файловых манипуляторов +HANDBUF.SIZE EQU 32 +;----------------------------------------------------; +; diff --git a/Shared_Includes b/Shared_Includes new file mode 160000 index 0000000..6e27011 --- /dev/null +++ b/Shared_Includes @@ -0,0 +1 @@ +Subproject commit 6e27011b6259b0256ce65d91a53ef1185223eafa