From 80030409044d8d5a72d30bdbd5d87dc0ba02292e Mon Sep 17 00:00:00 2001 From: boykovra Date: Mon, 27 May 2024 11:03:22 +0300 Subject: [PATCH] Initial commit --- DOS/README.md | 54 ++ DOS/a.bat | 24 + DOS/bios.inc | 5 + DOS/build.inc | 16 + DOS/cerror.asm | 150 ++++ DOS/changes.log | 23 + DOS/disk_x.asm | 267 ++++++++ DOS/dos-main.asm | 412 +++++++++++ DOS/dos5.asm | 1691 ++++++++++++++++++++++++++++++++++++++++++++++ DOS/dos_equ.asm | 78 +++ DOS/dos_fm.asm | 1023 ++++++++++++++++++++++++++++ DOS/dos_x.asm | 330 +++++++++ DOS/drv_main.asm | 146 ++++ DOS/dss.inc | 104 +++ DOS/dss_map.txt | 62 ++ DOS/environ.asm | 251 +++++++ DOS/errors.inc | 40 ++ DOS/execute.asm | 1208 +++++++++++++++++++++++++++++++++ DOS/fat_x.asm | 482 +++++++++++++ DOS/fdd_drv0.asm | 366 ++++++++++ DOS/hardware.inc | 7 + DOS/ide_drv0.asm | 696 +++++++++++++++++++ DOS/intmouse.asm | 930 +++++++++++++++++++++++++ DOS/keyinter.asm | 891 ++++++++++++++++++++++++ DOS/known.bug | 12 + DOS/ram_drv0.asm | 443 ++++++++++++ DOS/release.inc | 39 ++ DOS/video.asm | 687 +++++++++++++++++++ README.md | 6 + 29 files changed, 10443 insertions(+) create mode 100644 DOS/README.md create mode 100644 DOS/a.bat create mode 100644 DOS/bios.inc create mode 100644 DOS/build.inc create mode 100644 DOS/cerror.asm create mode 100644 DOS/changes.log create mode 100644 DOS/disk_x.asm create mode 100644 DOS/dos-main.asm create mode 100644 DOS/dos5.asm create mode 100644 DOS/dos_equ.asm create mode 100644 DOS/dos_fm.asm create mode 100644 DOS/dos_x.asm create mode 100644 DOS/drv_main.asm create mode 100644 DOS/dss.inc create mode 100644 DOS/dss_map.txt create mode 100644 DOS/environ.asm create mode 100644 DOS/errors.inc create mode 100644 DOS/execute.asm create mode 100644 DOS/fat_x.asm create mode 100644 DOS/fdd_drv0.asm create mode 100644 DOS/hardware.inc create mode 100644 DOS/ide_drv0.asm create mode 100644 DOS/intmouse.asm create mode 100644 DOS/keyinter.asm create mode 100644 DOS/known.bug create mode 100644 DOS/ram_drv0.asm create mode 100644 DOS/release.inc create mode 100644 DOS/video.asm create mode 100644 README.md diff --git a/DOS/README.md b/DOS/README.md new file mode 100644 index 0000000..51fc5f1 --- /dev/null +++ b/DOS/README.md @@ -0,0 +1,54 @@ +# Sprinter DOS source code + +There is sources, mixed from original source codes and recovered by me from binary files of v1.62.100. + +You can use [SjasmPlus](https://github.com/z00m128/sjasmplus) to compile this code. + + +`sjasmplus --fullpath "--raw=system.dos dos-main.asm` + +[Sprinter computer site](https://sprinter.ru) + +[Sprinter in Telegram](https://t.me/zx_sprinter) + + +## Original README + +This is a source code of Sprinter DOS (called Estex Disk Sub System or Estex DSS) for 8-bit +computer PetersPlus Sprinter (Sp2000) that used Z80-compatible microprocessor running on 21 MHz +frequency and Altera PLD that performed all magic. To compile the code you need to use AS80.EXE +assembler for DOS (v1.31) included in this repo (referenced in A.BAT files as c:\asm\as80). + +* [20000817.152][] -> DSS v1.52 +* [20010208.152][] -> DSS v1.52 +* [20010806.155][] -> DSS v1.55 ( [oldtree][] ) +* [20021215.160][] -> DSS v1.60 RC +* [20030214.160][] -> DSS v1.60 R ( [tree][] ) +* [20030423.170][] -> DSS v1.70 beta ( current ) + +[tree]:https://gitlab.com/sprinter-computer/dos/-/tree/v1.60R +[oldtree]:https://gitlab.com/sprinter-computer/dos/-/tree/v1.55 +[20000817.152]:https://gitlab.com/sprinter-computer/dos/-/commit/06cf3fe3cd9141489941175c75f0df35623fc215 +[20010208.152]:https://gitlab.com/sprinter-computer/dos/-/commit/d0d5a70d405effc3664e1d31f1b8854a8daaef50 +[20010806.155]:https://gitlab.com/sprinter-computer/dos/-/commit/20586b76791ac1d9c2d0797911f8057419a916a2 +[20021215.160]:https://gitlab.com/sprinter-computer/dos/-/commit/438f52ce179efb8d1fda2cb177818a7b201f6412 +[20030214.160]:https://gitlab.com/sprinter-computer/dos/-/commit/f541c51c29289f22784c288df06c22299743235b +[20030423.170]:https://gitlab.com/sprinter-computer/dos/-/commit/0f7350186a6002d1774b20f516e1d7bdc5ab95b1 + +Tagged source code of the kernel v1.60R: https://gitlab.com/sprinter-computer/dos/-/tree/v1.60R + +Binary release of v1.60R you can find in [release][] subdirectory of this repo. + +[release]:https://gitlab.com/sprinter-computer/dos/-/tree/master/release + +Estex DSS v1.60 R was last officially released binary distribution of Sprinter DOS +(released by Peters Plus Ltd in February 2003), but the source code was publicly released +to community only in 2009 (we believe it was done under PUBLIC DOMAIN terms). +Note: there is a community supported continuation of DSS v1.6X branch, disassembled by enthusiasts +before this public release happened, so for real work with modern reincarnations of Sprinter computer +you need to use other versions of the DOS. Purpose of this particular repo is just to store officially +released sources AS IS in browsable manner for historical and educational purposes. +Feel free to fork it if you want to do anything with it. + +For more info see Sprinter Unofficial http://sprinter.nedopc.org + diff --git a/DOS/a.bat b/DOS/a.bat new file mode 100644 index 0000000..f668e6c --- /dev/null +++ b/DOS/a.bat @@ -0,0 +1,24 @@ +@echo ============================================================================== +@type read.me +@built.exe +@echo Assembling . . . +@echo Assembling Drivers . . . +@c:\asm\as80 -i -x3 -l -n drv-main.asm +@if errorlevel=3 goto error +@echo Drivers OK +@echo Assembling Kernel . . . +@c:\asm\as80 -i -x3 -l -n dos-main.asm +@if errorlevel=3 goto error +@goto good +:error +@echo ----------------------------------------------------------------------- +@echo │ ERROR ERROR │ +@echo ----------------------------------------------------------------------- +@goto quit +:good +@del system.dss +@ren dos-main.bin system.dss +@copy /b system.dss+drv-main.bin +@echo Имя файла Размер Занято ┌── Изменен ──┐ Загружен Атрибуты +@dir system.dss /v | find "system.dss" +:quit diff --git a/DOS/bios.inc b/DOS/bios.inc new file mode 100644 index 0000000..591ed1f --- /dev/null +++ b/DOS/bios.inc @@ -0,0 +1,5 @@ + +; ------------------------------------- +; BIOS Definitions +; ------------------------------------- +SYSPAGE EQU #FE diff --git a/DOS/build.inc b/DOS/build.inc new file mode 100644 index 0000000..8af582b --- /dev/null +++ b/DOS/build.inc @@ -0,0 +1,16 @@ +; ------------------------------------- +; DOS Build Definitions +; ------------------------------------- + +REL_COUNT EQU 11 + +REL_YEAR EQU 2024 +REL_MONTH EQU 05 +REL_DAY EQU 21 + +REL_HOUR EQU 10 +REL_MINUTE EQU 30 +REL_SECOND EQU 00 + +REL_DAYCOUNT EQU 113 + diff --git a/DOS/cerror.asm b/DOS/cerror.asm new file mode 100644 index 0000000..28a08eb --- /dev/null +++ b/DOS/cerror.asm @@ -0,0 +1,150 @@ + +; ------------------------------------- +; Error handler +; ------------------------------------- + +CERR_VECT +CERR_BNK DW 0 +CERR_ADR DW ERRSTUB + + +SET_CERROR_VECTOR: + LD (CERR_BNK),DE + LD (CERR_ADR),HL + LD (CERR_STK),IX + AND A + RET + +GET_CERROR_VECTOR: + LD DE,(CERR_BNK) + LD HL,(CERR_ADR) + LD IX,(CERR_STK) + AND A + RET + +; +; CALL CERR_BNK:CERR_ADR +; + +CERROR: + PUSH BC + PUSH DE + PUSH HL + PUSH IX + + LD HL,0 + ADD HL,SP + EX DE,HL + + LD C,PAGE3 + IN B,(C) + + LD HL,(CERR_BNK) + OUT (C),L + + LD SP,(ERRSTACK) + + PUSH DE + PUSH BC + LD HL,(CERR_ADR) + LD (_CALL01+1),HL +_CALL01: + CALL #0000 + POP BC + POP HL + OUT (C),B + LD SP,HL + + POP IX + POP HL + POP DE + POP BC + RET + +F_RETRY EQU 0 +F_IGNORE EQU 1 +F_FAIL EQU 2 + +ERRSTUB: + PUSH AF + LD HL,ER_ABORT + LD C,PCHARS + RST #10 + POP AF + LD HL,ER_RETRY + BIT F_RETRY,A ; RETRY + CALL NZ,ADD_EMSG + LD HL,ER_IGNORE + BIT F_IGNORE,A ; IGNORE + CALL NZ,ADD_EMSG + LD HL,ER_FAIL + BIT F_FAIL,A ; FAIL + CALL NZ,ADD_EMSG + LD A,'?' + LD C,PUTCHAR + RST #10 +KEYAGA: + PUSH AF + LD C,WAITKEY + RST #10 + CALL UPPER + CP 'A' + JR Z,CM_ABORT + CP 'R' + JR Z,CM_RETRY + CP 'I' + JR Z,CM_IGNORE + CP 'F' + JR Z,CM_FAIL + POP AF + JR KEYAGA + +CM_FAIL: + POP AF + BIT F_FAIL,A + JR Z,KEYAGA + LD A,3 ;FAIL + RET + +CM_ABORT: + POP AF + BIT F_ABORT,A + JR Z,KEYAGA + LD A,2 ;ABORT + RET + +CM_RETRY: + POP AF + BIT F_RETRY,A + JR Z,KEYAGA + LD A,1 ;RETRY + RET + +CM_IGNORE: + POP AF + BIT F_IGNORE,A + JR Z,KEYAGA + LD A,0 ;IGNORE + RET + +ADD_EMSG: + PUSH AF + LD A,"," + LD C,PUTCHAR + RST #10 + LD A," " + LD C,PUTCHAR + RST #10 + LD C,PCHARS + RST #10 + POP AF + RET + +ER_ABORT: + DB 13,10,"Abort",0 +ER_RETRY: + DB "Retry",0 +ER_IGNORE: + DB "Ignore",0 +ER_FAIL: + DB "Fail",0 diff --git a/DOS/changes.log b/DOS/changes.log new file mode 100644 index 0000000..2c7113e --- /dev/null +++ b/DOS/changes.log @@ -0,0 +1,23 @@ +;Изменения после версии 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); +;Изменения после версии 1.00 diff --git a/DOS/disk_x.asm b/DOS/disk_x.asm new file mode 100644 index 0000000..79f0f9a --- /dev/null +++ b/DOS/disk_x.asm @@ -0,0 +1,267 @@ + +; DISK DRIVER SPECIFICATION +;--------------------------------------------- +; COMMAND 00h (INITIALIZATION) +; +; INPUT: A - DRIVE LETTER +; IX - ENVIRONMENT +; RETURN: A - AMOUNT DRIVE SUPPORT +; HL - LENGHT 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 + + +INTDISK: + 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,2 + SCF + RET + +PDEVICE: + DW DEVICE + +DEVICE: + DEFS 26*3,0xFF + ;DB 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF + ;DB 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF + ;DB 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF + DB 0xFF + +FLOPPY EQU 0x0001 +FIXED EQU 0x0002 +CDROM EQU 0x0004 +NETWORK EQU 0x0008 + +;DISKS DB 27 ;LENGHT 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 ;LENGHT 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 ;LENGHT 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: + 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,A + CALL HDDRIVE + LD DE,HDDRIVE + CALL MAKEDVC + XOR A + LD C,A + 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) +MAKEDV1: + LD (HL),C + INC HL + LD (HL),E + INC HL + LD (HL),D + INC HL + INC C + DEC A + JR NZ,MAKEDV1 + LD (PDEVICE),HL + DEC A + LD (HL),A + RET + +; TODO Unknown new function +NEW_FN1 + DI + CALL INITDVC + LD A,(LDRIVE) + EI + RET + +BOOTDSK + LD A,(BOOTDRV) + AND A + RET + +SETBOOT + LD B,A + LD C,0x0 +NXTDV + PUSH BC + LD A,C + LD BC,0x8 + LD DE,0x55aa + RST A0018 + POP BC + JR C,NO_SUPP + EX AF,AF' + CP B + JR NZ,NO_SUPP + LD A,C + LD (BOOTDRV),A + AND A + RET +NO_SUPP + INC C + LD A,(LDRIVE) + CP C + JR NZ,NXTDV + SCF + RET + diff --git a/DOS/dos-main.asm b/DOS/dos-main.asm new file mode 100644 index 0000000..8af4ab7 --- /dev/null +++ b/DOS/dos-main.asm @@ -0,0 +1,412 @@ +;[BEGIN] +;//MODULE: DOS-MAIN AUTHOR: Denis Parinov +;//CREATE: A LONG TIME AGO :) +;--------------------------------------------------------------- +;Rev Date Name Description +;--------------------------------------------------------------- +;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 +;--------------------------------------------------------------- + DEVICE NOSLOT64K +SPRINTER EQU 2000 + +VERS EQU 01 ; Version Number (XX.) +MODF EQU 62 ; Modification (.xx) +SUBMOD EQU 100 + +DAY EQU 01 +MONTH EQU 01 +YEAR EQU 2005 + + INCLUDE "build.inc" + +PAGEDRV EQU #00 + +DIRPAGE EQU 0 +FATPAGE EQU 1 +TXTPAGE EQU 2 +ENVPAGE EQU 2 +DRVPAGE EQU 3 + +TXTADDR EQU 0xC000 +ENVADDR EQU 0xE400 + +DIR EQU 0xC000 +FAT EQU 0xC000 + +putvers macro + db "0"+VERS + db "." + db MODF/10+"0" + db MODF-(MODF/10)*10+"0" + endm + +ORG_ ORG 0x0000 +ROM__ +A0000 + JP LEAVE ;CLOSE TASK +SOUND_K + DS 5,0xFF + +A0008 + PUSH AF ;INT BIOS + LD A,0x00 + OUT (0x7C),A + POP AF + RET + DB 0xFF + +A0010 + JP RST_10 ;INT DOS + DS 5,0xFF + +A0018 + JP INTDISK ; + DS 5,0xFF + +A0020 + JP NOPS ; + DS 5,0xFF + +A0028 + JP NOPS ; + DS 5,0xFF + +A0030 + JP INTMOUS ;INT MOUSE + DS 5,0xFF + +A0038 + JP RST_38 ;INTERRUPT + +;WARNING! DON'T CHANGE LENGHT OF MASK INTERUPT! +;FOR CORRECTED WORKING "Non-Mask Interupt" + +RST_38 ;MAIN INTERUPT +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 + CALL P38 + 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 + db 0xff + +NMI_RET + RETN + +NMI_ISR ; NMI ISR + NOP + NOP + NOP + JP NMI_RET + +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 + +NOPS + LD A,ERR_INVALID_FUNCTION + SCF + RET + +P38 + LD A, (ECHO_PREP+1) + OR A + RET Z +P38_LB1 EQU $+1 + LD A, 0x1 + DEC A + CALL Z,ECHO_PREP_0 + LD (P38_LB1),A + RET + +;Move to #0080 +; DS 5+8 ;ALIGN +;------=====------ +;ENTER +; IN A,(C) ;0 +; OUT (C),B ;2 +; +; POP BC ;4 +; RET ;5 +;------=====------ + +;R01 +; Area for boot sector [512Bytes] +BOOT DB #00,#00,#00 ; +00 JMP +ID_NAME + DB "DSS_" + putvers + +; Block Parameters BIOS + +B_P_S DW 0x0200 ; +0B BYTE PER SECTOR +S_P_C DB 2 ; +0D SECTORS PER CLUSTER +RESERVE DW 1 ; +0E RESERVE SECTORS +FAT_NUM DB 2 ; +10 AMOUNT FATS +F_P_DIR DW 112 ; +11 FILES IN DIRECTORY +S_P_D DW 1440 ; +13 ALL SECTORS ON DISK +ID_FORM DB 0xF0 ; +15 ID FORMAT +S_P_F DW 2 ; +16 SIZE FAT IN SECTORS +S_P_T DW 9 ; +18 SECTOR PER TRACK +HEADS DW 2 ; +1A AMOUNT SIDES +HIDDEN DW 0x0000 ; +1C HIDDEN SECTORS + DW 0x0000 +BPB_BIG_TOTAL_SECTORS + DW 0x0000,0x0000 ; +20 BIG TOTAL SECTOR +BPB_PHISICAL_DRIVE_NUMBER + DW 0x0080 ; +24 PHISICAL DRIVE NUMBER +BPB_EXT_BOOT_RECORD_SIGNATURE + DB 0x29 ; +26 EXTENDED BOOT RECORD SIGNATURE +BPB_SERIAL_NUMBER + DW 0x0000,0x0000 ; +27 VOLUME SERIAL NUMBER +BPB_LABEL + DB "NO NAME " ;+2B DISK LABEL +ID_FAT +BPB_FS_ID + DB "FAT16 " ; +36 FILE SYSTEM ID + +SIZE_OF_BOOT EQU $-BOOT + +DRIVE DB 0 +BOOTDRV DB 0 + +VER_IN + IN A,(PAGE2) + PUSH AF + LD A,(BANKTBL+2) + OUT (PAGE2),A + LD DE,0x8000 + PUSH DE + LD C,0xb8 + RST 0x08 + LD HL,0x8600 + LD BC,0x1ff + LD A,0x1a + CALL SUB_ram_00f0 + POP HL + LD BC,0x5ff + LD A,COM_A + CALL SUB_ram_00f0 + POP AF + OUT (PAGE2),A + RET + +SUB_ram_00f0 + LD E,L + LD D,H + LD (HL),0xff + INC DE + LDIR + LD DE,0x8000 + LD C,0xb6 + RST 0x08 + RET + + NOP + NOP + +//MAXSIZM DB 0, 0 + + ALIGN 256 + +MEMTAB DS 256 ;,0 + +ADRST10 ;DS 512 ;,0 +;FUNCTION ADDRESS ARRAY +;-------------------------------------------------------------- +;FN 0 00h + DB VER&0xFF,CHNDISK&0xFF,CURRDSK&0xFF,DISKINF&0xFF,NOPS&0xFF,NOPS&0xFF,NOPS&0xFF,NOPS&0xFF +;FN 8 08h + DB NEW_FN1&0xFF,BOOTDSK&0xFF,CREATE&0xFF,CREAT_N&0xFF,NOPS&0xFF,NOPS&0xFF,DELETE0&0xFF,NOPS&0xFF +;FN 16 10h + DB RENAME&0xFF,OPEN&0xFF,CLOSE&0xFF,READ&0xFF,WRITE&0xFF,MOVE_FP&0xFF,ATTRIB&0xFF,GET_D_T&0xFF +;FN 24 18h + DB PUT_D_T&0xFF,F_FIRST&0xFF,F_NEXT&0xFF,MKDIR&0xFF,RMDIR&0xFF,CHDIR&0xFF,CURRDIR&0xFF,NOPS&0xFF +;FN 32 20h + DB NOPS&0xFF,SYSTIME&0xFF,SETTIME&0xFF,NOPS&0xFF,NOPS&0xFF,NOPS&0xFF,NOPS&0xFF,NOPS&0xFF +;FN 40 28h + DB NOPS&0xFF,NOPS&0xFF,NOPS&0xFF,NOPS&0xFF,NOPS&0xFF,NOPS&0xFF,NOPS&0xFF,NOPS&0xFF +;FN 48 30h + DB WAITKEY&0xFF,SCANKEY&0xFF,ECHOKEY0&0xFF,CTRLKEY&0xFF,NOPS&0xFF,K_CLEAR&0xFF,K_SETUP&0xFF,TESTKEY&0xFF +;FN 56 38h + DB SETWIN&0xFF,SETWIN1&0xFF,SETWIN2&0xFF,SETWIN3&0xFF,FREEMEM&0xFF,GETMEM&0xFF,RETMEM&0xFF,SETMEM&0xFF +;FN 64 40h + DB EXEC&0xFF,LEAVE&0xFF,WAIT&0xFF,GSWITCH&0xFF,DOSNAME&0xFF,EX_PATH&0xFF,ENVIRON&0xFF,APPINFO&0xFF +;FN 72 48h + DB NOPS&0xFF,NOPS&0xFF,NOPS&0xFF,NOPS&0xFF,NOPS&0xFF,NOPS&0xFF,NOPS&0xFF,NOPS&0xFF +;FN 80 50h + DB SETVMOD&0xFF,GETVMOD&0xFF,LOCATE&0xFF,CURSOR&0xFF,SELPAGE&0xFF,SCROLL&0xFF,CLEAR&0xFF,RDCHAR&0xFF +;FN 88 58h + DB WRCHAR&0xFF,WINCOPY&0xFF,WINREST&0xFF,PUTCHAR&0xFF,PCHARS&0xFF,NOPS&0xFF,NOPS&0xFF,PRINT&0xFF +;FN 96 60h + DB NOPS&0xFF,NOPS&0xFF,NOPS&0xFF,NOPS&0xFF,NOPS&0xFF,NOPS&0xFF,NOPS&0xFF,NOPS&0xFF + + DS #88 + DB NOPS&0xFF,NOPS&0xFF,NOPS&0xFF,NOPS&0xFF,NOPS&0xFF,NOPS&0xFF,NOPS&0xFF,NOPS&0xFF + DB NOPS&0xFF,NOPS&0xFF,NOPS&0xFF,NOPS&0xFF,NOPS&0xFF,NOPS&0xFF,NOPS&0xFF,NOPS&0xFF + + DB VER/256,CHNDISK/256,CURRDSK/256,DISKINF/256,NOPS/256,NOPS/256,NOPS/256,NOPS/256 + DB NEW_FN1/256,BOOTDSK/256,CREATE/256,CREAT_N/256,NOPS/256,NOPS/256,DELETE0/256,NOPS/256 + DB RENAME/256,OPEN/256,CLOSE/256,READ/256,WRITE/256,MOVE_FP/256,ATTRIB/256,GET_D_T/256 + DB PUT_D_T/256,F_FIRST/256,F_NEXT/256,MKDIR/256,RMDIR/256,CHDIR/256,CURRDIR/256,NOPS/256 + DB NOPS/256,SYSTIME/256,SETTIME/256,NOPS/256,NOPS/256,NOPS/256,NOPS/256,NOPS/256 + DB NOPS/256,NOPS/256,NOPS/256,NOPS/256,NOPS/256,NOPS/256,NOPS/256,NOPS/256 + DB WAITKEY/256,SCANKEY/256,ECHOKEY0/256,CTRLKEY/256,NOPS/256,K_CLEAR/256,K_SETUP/256,TESTKEY/256 + DB SETWIN/256,SETWIN1/256,SETWIN2/256,SETWIN3/256,FREEMEM/256,GETMEM/256,RETMEM/256,SETMEM/256 + DB EXEC/256,LEAVE/256,WAIT/256,GSWITCH/256,DOSNAME/256,EX_PATH/256,ENVIRON/256,APPINFO/256 + DB NOPS/256,NOPS/256,NOPS/256,NOPS/256,NOPS/256,NOPS/256,NOPS/256,NOPS/256 + DB SETVMOD/256,GETVMOD/256,LOCATE/256,CURSOR/256,SELPAGE/256,SCROLL/256,CLEAR/256,RDCHAR/256 + DB WRCHAR/256,WINCOPY/256,WINREST/256,PUTCHAR/256,PCHARS/256,NOPS/256,NOPS/256,PRINT/256 + DB NOPS/256,NOPS/256,NOPS/256,NOPS/256,NOPS/256,NOPS/256,NOPS/256,NOPS/256 + DS #88 + DB NOPS/256,NOPS/256,NOPS/256,NOPS/256,NOPS/256,NOPS/256,NOPS/256,NOPS/256 + DB NOPS/256,NOPS/256,NOPS/256,NOPS/256,NOPS/256,NOPS/256,NOPS/256,NOPS/256 + +;[INCLUDE] +;KEYBOARD BUFFER + include "errors.inc" + include "keyinter.asm" + + + + + +BUFFER +SECBUF DS 512, 0x00 + + + + 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" + +DTA DB " " + DB " " + DB 0x20 + DW 0,0,0,0,0 + DW 0 + DW 0 +CLUSTER DW 0 +SIZE DW 0,0 +ASCIIZ DB "FILENAME.EXT",#00 + + + include "disk_x.asm" + include "ide_drv0.asm" + include "fdd_drv0.asm" + include "ram_drv0.asm" + + + +; TODO +; Check label names +ECHO_PREP_A1 EQU $+1 +ECHO_PREP_0 + LD A,0x0 + CPL + LD (ECHO_PREP_A1),A + +ECHO_PREP_1 + LD C,0x8e + RST 0x8 + LD (ECHO_DE1),DE + XOR A + LD C,0xb4 + RST 0x08 + LD BC,WOV_PG + LD A,(ECHO_PREP_A1) + OR A + JR Z,ECHO_PREP_2 + LD B,0x1a + LD A,(KEYFLAG) + BIT 0x1,A + JR NZ,ECHO_PREP_2 + LD B,COM_A +ECHO_PREP_2 + XOR A + RST 0x8 + LD A,0x1 + LD (ECHO_PREP+1),A + LD A,0xb + RET + + +ECHO_PREP + LD A,0x0 + OR A + RET Z + LD A,0xff + LD (ECHO_PREP_A1),A + INC A + LD (ECHO_PREP+1),A + LD A,0xb + LD (P38_LB1),A +ECHO_DE1 EQU $+1 +ECHO_DE + LD DE,0x0 + BIT 0x7,E + RET NZ + LD C,0xb4 + XOR A + RST A0008 + XOR A + LD BC,WOV_PG + RST A0008 + RET + +ECHO_PREP_3 + CALL ECHO_PREP_1 + EI + RET + + + + + INCLUDE "release.inc" + + ;C_OSNAME +;[END] diff --git a/DOS/dos5.asm b/DOS/dos5.asm new file mode 100644 index 0000000..aaaa64a --- /dev/null +++ b/DOS/dos5.asm @@ -0,0 +1,1691 @@ + +;[BEGIN] +;//MODULE: DOS5 +;//CREATE: 19-05-1998 AUTHOR: Denis Parinov +;//UPDATE: 24-10-1999 DNS Restore module +;------------------------------------------------------------- +;Rev Date Name Description +;------------------------------------------------------------- +;R08 15-04-2003 DNS SAVE AND RESTORE CURPATH 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 + INC B + DEC B + JR Z,RATTRIB + DEC B + JR Z,WATTRIB + JP NOPS + +RATTRIB + XOR A + CALL OPENATR ;R02 + RET C + LD C,A + LD A, (FM_BUF_ATTR) + LD B,A + LD A,C + 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 + LD C,A + LD A,(FM_BUF_AM) + SET 7,A + LD (FM_BUF_AM),A + + RES 3,B ;CLEAR LABEL ATTR ;R03 + LD A,B + LD (FM_BUF_ATTR),A + LD A,C + 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 + AND #E7 ;R04 + LD (ACCESS),A + LD (PATH+1),HL + PUSH HL + CALL GETWORD + POP HL + RET C + LD HL,TMPNAME + LD DE,MASKARE + CALL MASK + RET C + CALL SEARCH + CALL NC,DELFILE ;FILE EXIST RECREAT + JR CREAT + +; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 +; OUTPUT: A - FM + +CREAT_N + AND #E7 ;R04 %76A00SHR + LD (ACCESS),A + LD (PATH+1),HL + PUSH HL + CALL GETWORD + POP HL + 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 + +PATH + LD HL,0x0 + XOR A + JP OPEN + +; TODO: Unknown code +DELETE0 + BIT 0x0,A + SCF + LD A,0x8 + RET NZ + +; 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,16 + SCF + RET Z + CALL LOADDIR + CALL SEARCH + RET C + +DELFILE + XOR A + CALL BANK + LD (IX+NAM),0xE5 + LD E,(IX+CLU1) + LD D,(IX+CLU2) + OUT (PAGE3),A + LD A,E + OR D + JP Z,SAVEDIR ; SMALDEL + +DEL01 + EX DE,HL + CALL R_F_FAT + PUSH DE + PUSH AF + LD DE,#0000 + CALL W_T_FAT + POP AF + POP DE + JR NC,DEL01 + CALL WR_FAT + JP SAVEDIR + +; 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,16 + 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,16 + SCF + RET Z + PUSH IX + LD A,#33 + CALL ASEARCH + POP IX + LD A,7 + CCF + RET C + XOR A + CALL BANK + LD HL,MASKARE + LD D,XH + LD E,XL + LD BC,11 + LDIR + OUT (PAGE3),A + JP SAVEDIR + + +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 + + +OPEN + LD (ACCESS),A + CALL GETWORD + RET C + LD HL,TMPNAME + LD DE,MASKARE + CALL MASK + RET C + +OPENEXE + CALL SEARCH + RET C + +OPENAT + CALL GET_FM + RET C + LD A,C + EX AF,AF' + EXX + LD (FM_BUF_HNDL),DE + EXX + LD HL,HANDBUF + LD DE, FM_BUF + LD BC,#0020 + LDIR + LD A,(ACCESS) + LD (FM_BUF_AM),A + LD A,(TASK) + LD (FM_BUF_TASK),A + XOR A + LD (FM_BUF_FPL),A + LD (FM_BUF_FPL+1),A + LD (FM_BUF_FPH),A + LD (FM_BUF_FPH+1),A + LD A,(DRIVE) + LD (FM_BUF_DC),A + LD DE,(FM_BUF_ST_CL) + LD (FM_BUF_DIR_CL),DE + EX AF,AF' + AND A + RET + +CLOSE ;R08 + LD (ACCESS),A + CALL SET_FM + RET C + LD A,(FM_BUF_TASK) + LD C,A + LD A,(TASK) + CP C + LD A,0x13 + SCF + RET NZ + LD A,(FM_BUF_AM) + BIT 7,A + JR Z,NOTMODF + LD DE, (FM_BUF_DIR_CL) + PUSH DE + XOR A + CALL SET_FM + POP DE + LD (FM_BUF_DIR_CL), DE + CALL LOADDIR + LD A,(ACCESS) + CALL SET_FM + LD HL,DIR + LD DE,#0020 + LD BC,(FM_BUF_HNDL) + JR CLOSE2 +CLOSE1 + ADD HL,DE + DEC BC +CLOSE2 + LD A,B + OR C + JR NZ,CLOSE1 + EX DE,HL + ;LD D,YH + ;LD E,YL + XOR A + CALL BANK + LD HL, FM_BUF + LD BC,#0020 + LDIR + OUT (PAGE3),A + CALL SAVEDIR + +NOTMODF + LD A,(ACCESS) + JP RES_FM + +//PATH0 DW #0000 + +ACCESS DB #00 + +HANDBUF 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 + + +WRT_HND + XOR A + CALL BANK + PUSH AF + LD IX,DIR + EXX + LD DE,0 + EXX +WRT_HN1 + LD A,(IX+00) + OR A + JR Z,WRT_HN2 + CP #E5 + JR Z,WRT_HN2 + LD BC,#0020 + ADD IX,BC + JR NC,WRT_HN1 + POP AF + OUT (PAGE3),A + LD A,9 + SCF + RET + +WRT_HN2 + LD D,XH + LD E,XL + LD HL,HANDBUF + LD BC,#0020 + LDIR + POP AF + OUT (PAGE3),A + LD HL,DIR + LD BC,(DIRSIZE) + DEC BC + ADD HL,BC + AND A + SBC HL,DE + RET NC + LD HL,(DIRSIZE) + LD BC,(B_P_C) + ADD HL,BC + LD (DIRSIZE),HL + AND A + RET + +DOSNAME + INC B + DEC B + JR Z,GETNAME + DEC B + JP Z,MASK + LD A,1 + 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 + +FIND_S + INC DE + LD BC,#0020 + ADD IX,BC + LD (CURHND),IX + LD HL,HANDBUF+12 + LD BC,20 + LDIR + LD A,(HANDBUF+11) + LD (DE),A + INC DE + LD HL,HANDBUF + LD A,(FNDMODE) + OR A + JR NZ,FIND_M2 + LD BC,11 + LDIR +FIND_M1 + LD A,1 + LD (NO_NEXT),A + XOR A + RET + +FIND_M2 + CALL GETNAME + JR FIND_M1 + +F_NEXT + LD A,(NO_NEXT) + OR A + LD A,14 + SCF + RET Z + LD (DTABUF),DE + LD HL,MASKARE + EX DE, HL + LD BC,11 + LDIR + XOR A + LD (NO_NEXT),A + LD A,(HL) + PUSH HL + CALL NSEARCH + POP DE + RET C + JR FIND_S + +NSEARCH + EX AF,AF' + XOR A + CALL BANK + PUSH AF + EX AF,AF' + CPL + LD C,A + EXX + LD DE,0 + EXX + LD IX,(CURHND) + LD A,IXH + OR IXL + JR Z,SEARCH31 + JR SEARCH1 + +DSEARCH + LD A,#10 + CALL ASEARCH + RET NC + LD A,4 + RET + +SEARCH + LD A,0x27 ;%00100011 + +ASEARCH + EX AF,AF' ; 76ADLSHR + XOR A + 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,SEARCH32 + CP #E5 + JP Z,SEARCH3 + LD A,(IX+11) + AND C + JP 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) + JP NZ,SEARCH3 +SEARCH5 + INC HL + INC DE + DJNZ SEARCH2 + LD D,XH + LD E,XL + LD HL,HANDBUF + EX DE,HL + LD BC,#0020 + LDIR + POP AF + OUT (PAGE3),A + AND A + RET + +SEARCH3 + EXX + INC DE + EXX + LD DE,#0020 + ADD IX,DE + JP NC,SEARCH1 + +SEARCH31 + LD E,0x23 + JR SEARCH4 +SEARCH32 + LD E,0x3 + +SEARCH4 + POP AF + OUT (PAGE3),A + LD A,E + SCF + RET + +GETWORD + LD DE,TMPNAME + LD BC,#0DFF +GETWRD1 + LD A,(HL) + INC HL + CP "\\" + JR Z,DIRNAME + CP ":" + JR Z,DRVNAME + LD (DE),A + INC DE + CP #21 + CCF + RET NC + DJNZ GETWRD1 + LD A,16 + SCF + RET + +DIRNAME + LD A,#00 + LD (DE),A + PUSH HL + LD HL,TMPNAME + CALL OPENDIR + POP HL + JR NC,GETWORD + RET + +DRVNAME + LD A,(TMPNAME) + RES 5,A + SUB 0x41 + PUSH HL + CALL OPENDSK + POP HL + JR NC,GETWORD + RET + +TMPNAME DB " ",#00 + +OPENDSK + LD C,A + LD A,(DRIVE) + CP C + JR NZ,OPDISK1 + JR OPDISK2 +OPDISK1 + LD A,C + CALL CHNDISK + RET C +OPDISK2 + LD A,(LDRIVE) + AND A + RET + + +OPENDIR + XOR A + CALL SET_FM + LD A,(HL) + OR A + JR NZ,SUBDIR +REROOT1 + LD DE,0 + LD (FM_BUF_ST_CL),DE + CALL LOADDIR + LD HL,DIRSPEC + LD (HL),#5C ; \ + INC HL + LD (HL),#00 + AND A + RET + +SUBDIR CP "." + JR NZ,SUBDIR2 + LD A,(FM_BUF_ST_CL+1) + LD C,A + LD A,(FM_BUF_ST_CL) + OR C + 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 (FM_BUF_ST_CL),DE + LD DE,#4000 + LD (FM_BUF_FSL),DE + CALL LOADDIR + AND A + RET + +FINDD03 + LD BC,#0020 + ADD IX,BC + JR NC,FINDD01 +FINDD04 + POP AF + OUT (PAGE3),A + LD A,4 + SCF + RET + +; FIND "MASKAREA" IN DIRECTORY +FINDDIR + XOR A + CALL BANK + PUSH AF + LD IX,DIR +FINDD01 + LD A,(IX+00) + OR A + JR Z,FINDD04 + CP #E5 + JR Z,FINDD03 + LD A,(IX+11) + AND #10 + JR Z,FINDD03 + LD HL,MASKARE + LD D,XH + LD E,XL + EX DE,HL + LD B,11 +FINDD02 + LD A,(DE) + CP "?" + JR Z,FINDD05 + CP (HL) + JR NZ,FINDD03 +FINDD05 + INC HL + INC DE + DJNZ FINDD02 + LD A,(IX+0) + CP "." + JR NZ,ADDSPEC + LD A,(IX+1) + CP "." + JR NZ,IT_DIR + LD HL,DIRSPEC + LD D,H + LD E,L + LD BC,#100 + XOR A + CPIR + DEC HL + LD BC,#100 + LD A,#5C ; \ + CPDR + INC HL + AND A + EX DE,HL + SBC HL,DE + EX DE,HL + JR NZ,ROTZ + INC HL +ROTZ + LD (HL),0 +IT_DIR + LD E,(IX+CLU1) + LD D,(IX+CLU2) + POP AF + OUT (PAGE3),A + AND A + RET + +ADDSPEC LD E,XL + LD D,XH + LD HL,DIRSPEC + LD BC,#FF + XOR A + CPIR + DEC HL + DEC HL + LD A,#5C ;"\" + CP (HL) + INC HL + JR Z,ADDSPE0 + LD (HL),A + INC HL +ADDSPE0 LD BC,#0820 +MM1 LD A,(DE) + INC DE + CP C + JR Z,MM2 + LD (HL),A + INC HL +MM2 DJNZ MM1 + LD A,(DE) + INC DE + CP C + JR Z,MM3 + LD (HL),"." + INC HL + LD (HL),A + INC HL + LD A,(DE) + INC DE + CP C + JR Z,MM3 + LD (HL),A + INC HL + LD A,(DE) + CP C + JR Z,MM3 + LD (HL),A + INC HL + +MM3 LD (HL),0 + JR IT_DIR + +CURRDIR EX DE,HL + LD HL,DIRSPEC +CURDIR1 LD A,(HL) + OR A + LDI + JR NZ,CURDIR1 + RET + +LOADDIR + XOR A + LD L,A + LD H,A + PUSH HL + POP IX + LD B,A + CALL MOVE_FP + XOR A + CALL BANK + PUSH AF + LD HL,#C000 + LD DE,#C001 + LD BC,#3FFF + LD (HL),L + LDIR + LD A,(DRIVE) + LD (FM_BUF_DC),A + LD DE,(FM_BUF_ST_CL) + LD A,D + OR E + JR Z,LROTDIR + LD HL,DIR + LD DE,#4000 + XOR A + CALL READ + LD (DIRSIZE),DE + POP AF + OUT (PAGE3),A + AND A + RET + +LROTDIR + LD HL,(DIR_FRH) + LD IX,(DIR_FRL) + LD A,(DIR_S_S) + LD B,32 + SUB B + JR NC,RTD1 + ADD A,B + LD B,A +RTD1 + LD A,(DRIVE) + LD C,5 + LD DE,DIR + RST #18 + POP AF + OUT (PAGE3),A + AND A + RET + +SAVEDIR + XOR A + LD L,A + LD H,A + PUSH HL + POP IX + LD B,A + CALL MOVE_FP + XOR A + CALL BANK + PUSH AF + LD A,(DRIVE) + LD (FM_BUF_DC),A + LD DE,(FM_BUF_ST_CL) + LD A,D + OR E + JR Z,SROTDIR + LD HL,DIR + LD DE,(DIRSIZE) + XOR A + CALL WRITE + POP AF + OUT (PAGE3),A + AND A + RET + +SROTDIR LD HL,(DIR_FRH) + LD IX,(DIR_FRL) + LD A,(DIR_S_S) + LD B,32 + SUB B + JR NC,RTD1S + ADD A,B + LD B,A +RTD1S LD A,(DRIVE) + LD C,6 + LD DE,DIR + RST #18 + POP AF + OUT (PAGE3),A + AND A + RET + +DIRSIZE DW 0 + +BANK + LD C,A + LD B,0 + LD HL,BANKTBL + ADD HL,BC + IN A,(PAGE3) + LD C,PAGE3 + OUTI + AND A + RET + +BANKTBL DB #FF,#FF,#FF,#FF + +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 #21 +MASKB LD A,16 + RET C + LD BC,#0902 +MASK1 LD A,(HL) + CP #21 + CCF + RET NC + CP #22 + JR Z,MASK7 + CP "*" + JR Z,MASK3 + CP "+" + JR Z,MASK7 + CP "," + JR Z,MASK7 + CP "." + JR Z,MASK5 + CP "/" + JR Z,MASK7 + CP ":" + JR Z,MASK7 + CP ";" + JR Z,MASK7 + CP "<" + JR Z,MASK7 + CP "=" + JR Z,MASK7 + CP ">" + JR Z,MASK7 + CP "[" + JR Z,MASK7 + CP #5C ;"\" + 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,16 + SCF + RET + +MASK3 + LD A,"?" + INC HL + DJNZ MASK6 + JR MASK7 + +MASK6 + LD (DE),A + INC DE + DJNZ MASK6 + LD B,1 + JR MASK1 + +MASK5 + LD A," " + INC HL + DJNZ MASK4 + +MASK51 + LD B,4 + DEC C + JR NZ,MASK1 + JR MASK7 + +MASK4 + LD (DE),A + INC DE + DJNZ MASK4 + JR MASK51 + +UPPER + CP "a" + RET C + CP "{" + JR NC,MDUPPER + SUB #20 + RET + +MDUPPER + CP #A0 + RET C + CP #B0 + JR NC,BGUPPER + SUB #20 + RET + +BGUPPER + CP #E0 + RET C + CP #F0 + JR NC,HGUPPER + SUB #50 + RET + +HGUPPER + CP #F1 + RET NZ + DEC A + RET + +SYSTIME + LD C,#F5 + RST #08 + 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 #08 + 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 #08 + 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 #08 + 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 #08 +; 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 + +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 + DB 0xDD ; TODO: Undocumented + PUSH HL + PUSH BC + PUSH HL + PUSH DE + LD C,#F5 + RST #08 + JR 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 #08 + + 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 #08 + 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 0x0000 ; HOUR/MINUTE +NC_SEC DW 0x0001 ; SECOND/WEEKDAY +NC_YEAR DW YEAR ; YEAR + + +GET_D_T + CALL SET_FM + RET C + LD E,(IY+TIM1) + LD D,(IY+TIM2) + LD C,(IY+DAT1) + LD B,(IY+DAT2) + 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+TIM1),E + LD (IY+TIM2),D + LD (IY+DAT1),C + LD (IY+DAT2),B + SET 7,(IY+AMODE) ;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 + 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,(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 BC,0xA20 +MKD02 + INC HL + LD (HL),C + 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 BC,0x0920 + +MKD03 + INC HL + LD (HL),C + DJNZ MKD03 + INC HL + PUSH HL + XOR A + CALL BANK + POP HL + PUSH AF + LD A,(DIR) + CP "." + LD DE,DIR+11 + JR Z,MKD04 + LD IX,HANDBUF + XOR A + LD (IX+CLU1),A + LD (IX+CLU2),A + LD DE,HANDBUF+11 + +MKD04 + EX DE,HL + LD BC,21 + LDIR + POP AF + OUT (PAGE3),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,(S_P_C) + +MKD12 + PUSH AF + PUSH HL + PUSH IX + IN A,(PAGE3) + PUSH AF + IN A,(PAGE0) + OUT (PAGE3),A +; + LD DE,SECBUF+#C000 + LD B,1 + LD A,(DRIVE) + LD C,6 + RST #18 +; + POP AF + OUT (PAGE3),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 + 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,16 + SCF + RET Z + CALL LOADDIR + CALL DSEARCH + RET C + LD HL,(HANDBUF+CLU1) + PUSH IX +RMD17 + PUSH HL + CALL NSECTOR + LD A,(S_P_C) +RMD12 + PUSH AF + PUSH HL + PUSH IX + IN A,(PAGE3) + PUSH AF + IN A,(PAGE0) + OUT (PAGE3),A + + LD DE,SECBUF+#C000 + LD BC,#0105 + LD A,(DRIVE) + RST #18 + + POP AF + OUT (PAGE3),A + + LD B,16 + LD HL,SECBUF +RMD10 + LD A,(HL) + OR A + JR 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 + AND 0x8 + JR 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,11 + SCF + RET + +;//MODULE: DOS5 +;[END] + diff --git a/DOS/dos_equ.asm b/DOS/dos_equ.asm new file mode 100644 index 0000000..b5dd108 --- /dev/null +++ b/DOS/dos_equ.asm @@ -0,0 +1,78 @@ + +; ------------------------------------- +; DOS Function numbers definitions +; ------------------------------------- + +VERSION EQU #00 ; VERSION (Version of DSS) +CHDISK EQU #01 ; CHDISK (Set the current disk) +CURDISK EQU #02 ; CURDISK (Get the current disk) +DSKINFO EQU #03 ; DSKINFO (Information about disk) +G_ENTRY EQU #04 ; + +BOOTDSK EQU #09 ; BOOTDSK (Get number of boot disk) +CREATE EQU #0A ; CREATE (Create file) +CREAT_N EQU #0B ; CREATE NEW FILE +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 + + + + \ No newline at end of file diff --git a/DOS/dos_fm.asm b/DOS/dos_fm.asm new file mode 100644 index 0000000..878d267 --- /dev/null +++ b/DOS/dos_fm.asm @@ -0,0 +1,1023 @@ + +;[BEGIN] +;//MODULE: DOS_FM +;//CREATE: 19-05-1998 AUTHOR: Denis Parinov +;//UPDATE: 24-10-1999 DNS Restore module +;//R01 : 16-11-1999 DNS ERROR READING FAT CHAIN + +NAM EQU 0 +EXT EQU 8 +ATR EQU 11 +TIM1 EQU 22 +TIM2 EQU 23 +DAT1 EQU 24 +DAT2 EQU 25 +CLU1 EQU 26 +CLU2 EQU 27 +LEN1 EQU 28 +LEN2 EQU 29 +LEN3 EQU 30 +LEN4 EQU 31 +POS1 EQU 32 +POS2 EQU 33 +POS3 EQU 34 +POS4 EQU 35 +DIRCLU1 EQU 36 +DIRCLU2 EQU 37 +HND1 EQU 38 +HND2 EQU 39 +FDRV EQU 40 +AMODE EQU 41 +FTASK EQU 42 + +FMCOUNT EQU 10 + +FMS DB 0x00 + +;ACCESS MODE: +; 00 - READ/WRITE +; 01 - READ +; 02 - WRITE + +;File Manipulator (FM) +FM_BUF + DB ". " ;+00 NAME + DB " " ;+08 EXT +FM_BUF_ATTR ; Attribute + DB 10h +FM_BUF_RES ; Reserved + DS 10,0 +FM_BUF_TIME ; Time + DW 0h +FM_BUF_DATE ; Date + DW 0h +FM_BUF_ST_CL ; Start cluster + DW 0h +FM_BUF_FSL ; FileSize low word + DW 0h +FM_BUF_FSH ; FileSize hi word + DW 0h +FM_BUF_FPL ; File position low word + DW 0h +FM_BUF_FPH ; File position hi word + DW 0h +FM_BUF_DIR_CL ; Directory cluster + DW 0h +FM_BUF_HNDL ; Handle number + DW 0h +FM_BUF_DC ; DRIVE OR CURRENT + DB 0h +FM_BUF_AM ; ACCESS MODE + DB 0h +FM_BUF_TASK ; TASK + DB 0h +FM_BUF_REM + DS 17,0x00 +END_FM +;End of FM + +FM_SIZE EQU END_FM-FM_BUF + + +; TODO: Rewritten sub +SET_FM + CP 0xb + JP NC,ABS_FM + PUSH DE + PUSH HL + PUSH BC + EX AF,AF' + LD A,0x1 + CALL BANK + EX AF,AF' + LD C,A + LD A,(FMS) + CP C + JR Z,SET_FM3 + LD A,C + PUSH AF + CALL SET_FM_SUB + POP AF + LD HL,0xe000 + LD DE,0x3d + OR A + JR Z,SET_FM2 + +SET_FM1 + ADD HL,DE + CP (HL) + JR Z,SET_FM2 + DJNZ SET_FM1 + POP BC + POP HL + POP DE + EX AF,AF' + OUT (PAGE3),A + +ABS_FM + LD A,0x5 + SCF + RET +SET_FM2 + LD DE,FMS + LD BC,0x3d + LDIR +SET_FM3 + EX AF,AF' + OUT (PAGE3),A + POP BC + POP HL + POP DE + RET + +; TODO: New sub +SET_FM_SUB + PUSH DE + LD A,(FMS) + INC A + JR Z,SFS_L3 + DEC A + LD B,A + LD HL,0xe000 + LD DE,0x3d + OR B + JR Z,SFS_L2 +SFS_L1 + ADD HL,DE + DJNZ SFS_L1 +SFS_L2 + EX DE,HL + LD HL,FMS + LD BC,0x3d + LDIR +SFS_L3 + POP DE + RET + +RES_FM + CP 0xb + JR NC,ABS_FM + EX AF,AF' + LD A,0x1 + CALL BANK + EX AF,AF' + PUSH HL + PUSH BC + LD HL,0xe000 + LD DE,0x3d + LD B,A +RES_FM1 + ADD HL,DE + DJNZ RES_FM1 + LD A,0xff + LD (FMS),A + LD DE,FMS + EX DE,HL + PUSH HL + PUSH DE + INC HL + XOR A + LD (HL),A + LD BC,0x3c + LDIR + POP DE + POP HL + LD BC,0x3d + LDIR + EX AF,AF' + OUT (PAGE3),A + POP BC + POP HL + RET + +; TODO: New sub, called from OPENAT +GET_FM + PUSH HL + PUSH DE + LD A,0x1 + CALL BANK + EX AF,AF' + CALL SET_FM_SUB + LD B,0xa + LD C,0x0 + LD HL,0xe000 + LD DE,0x3d +GET_FM1 + ADD HL,DE + INC C + LD A,(HL) + INC A + JR Z,GET_FM2 + DJNZ GET_FM1 + SCF + JP GET_FM3 +GET_FM2 + LD A,C + LD DE,FMS + LD BC,0x3d + LDIR + LD (FMS),A + LD C,A +GET_FM3 + POP DE + POP HL + EX AF,AF' + OUT (PAGE3),A + RET + +; HL:IX - OFFSET POINTER +; A - FILE MANIPULATOR +MOVE_FP + CALL SET_FM + RET C + INC B + DEC B + JR Z,MOVE_FA + DEC B + JR Z,MOVE_FB + DEC B + JR Z,MOVE_FC + JP NOPS +;from Start File +MOVE_FA + LD BC,0 + LD E,C + LD D,C + JR MOVE_F1 + +;from End File +MOVE_FC + LD BC,(FM_BUF_FSL) + LD DE,(FM_BUF_FSH) + JR MOVE_F1 + +;from Current Position +MOVE_FB + LD BC,(FM_BUF_FPL) + LD DE,(FM_BUF_FPH) + +MOVE_F1 + ADD IX,BC + ADC HL,DE + LD (FM_BUF_FPL),IX + LD (FM_BUF_FPH),HL + XOR A + RET + +;FP COMPARE +; CY - FILE POINTER > SIZE +; NC - FILE POINTER < SIZE +MOVE_CP + LD HL,(FM_BUF_FSL) + LD DE,(FM_BUF_FPL) + AND A + SBC HL,DE + LD HL,(FM_BUF_FSH) + LD DE,(FM_BUF_FPH) + SBC HL,DE + RET + +;-------------------- + +ECL2: + POP BC + POP DE + AND A + RET + +BLOKRD0: + POP BC + POP DE + SCF + RET + + + +; ------------------------------------- +; READ FILE SECTORS +; HL:DE - File pos in sectors +; B - Count of sectors +BLOK_RD: + PUSH BC + LD (READMEM),IX + LD A,(S_P_C) ;SECTORS PER CLUSTER + CALL DIV32 + PUSH HL + LD HL,(FM_BUF_ST_CL) + 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,(S_P_C) + SUB E + LD C,A + CP B + JR C,BLOKRD3 ;SIZE > RESIDUE CLUSTER + LD C,B ;SIZE < CLUSTER +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,(DRIVE) + LD B,C + LD C,5 + RST #18 + JR C,BLOKRD0 + POP BC + LD HL,(READMEM) + LD DE,(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,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 + JR C,ECL1 ;R01? + EX DE,HL + PUSH HL + PUSH BC + CALL NSECTOR + LD DE,(READMEM) + LD A,(DRIVE) + LD B,C + LD C,5 + RST #18 + JP C,BLOKRD0 + POP BC + LD HL,(READMEM) + LD DE,(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 FILE SECTORS +; HL:DE - File pointer in sectors +; B - Count of sectors +BLOK_WR: + PUSH BC + LD (READMEM),IX + LD A,(S_P_C) ;SECTORS PER CLUSTER + CALL DIV32 + PUSH HL + LD HL,(FM_BUF_ST_CL) + LD A,H + OR L + JR NZ,BLOKWR2 + PUSH BC + CALL G_CLUST + JR C,BLOKWRC + LD (FM_BUF_ST_CL),HL + LD DE,(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,(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,(DRIVE) + LD B,C + LD C,6 + RST #18 + JP C,BLOKWR0 + POP BC + LD HL,(READMEM) + LD DE,(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,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,(DRIVE) + LD B,C + LD C,6 + RST #18 + JP C,BLOKWR0 + POP BC + LD HL,(READMEM) + LD DE,(B_P_S) +BLOKWR8 + ADD HL,DE + DEC C + JR NZ,BLOKWR8 + LD (READMEM),HL + POP DE + JR BLOKWR6 + +BLOKWRA + POP BC + LD A,10 + SCF + RET + +TSTSIZE + XOR A + LD (READCOD),A + LD HL,(FM_BUF_FPL) ;FP LOW + ADD HL,DE + EXX + LD E,A + LD D,A + LD HL,(FM_BUF_FPH) + ADC HL,DE + EXX ;HL':HL - NEW FP + LD BC,(FM_BUF_FSL) + AND A + SBC HL,BC + EXX + LD BC,(FM_BUF_FSH) ;SIZE HIGH + SBC HL,BC + EXX + RET C ;OK READ ALL + EX DE,HL + SBC HL,DE ;VERY BIG + EX DE,HL + LD A,0xFF + 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,(FM_BUF_DC) + CALL OPENDSK + JP C,RPERR1 + LD HL, FM_BUF_FPL + LD C,(HL) + INC HL + LD A,(HL) + INC HL + LD E,A + AND 0x01 + LD B,A + LD D,(HL) + INC HL + LD L,(HL) + 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) + LD HL,(READMEM) + AND A + SBC HL,DE + LD C,H + LD B,0 + ADD HL,DE + LD (R_POINT),HL + SRL C + LD HL,(SECTORL) + ADD HL,BC + EX DE,HL + LD HL,(SECTORH) + LD C,B + ADC HL,BC +ROV2 + POP BC + LD A,B + AND #01 + LD B,A + OR C + JR Z,ROV6 + PUSH BC + LD IX,BUFFER+#C000 + LD B,1 + IN A,(PAGE3) + PUSH AF + IN A,(PAGE0) + OUT (PAGE3),A + CALL BLOK_RD + POP BC + LD C,PAGE3 + OUT (C),B + JP C,RPERR1 + LD HL,BUFFER + LD DE,(R_POINT) + POP BC + LDIR + LD (R_POINT),DE +ROV6 + 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_FB + POP DE +NOREAD + LD A,(READCOD) + OR A + RET + +ROV1 + PUSH BC + PUSH HL + PUSH DE + LD IX,BUFFER+#C000 + LD B,1 + IN A,(PAGE3) + PUSH AF + IN A,(PAGE0) + OUT (PAGE3),A + CALL BLOK_RD + POP BC + LD C,PAGE3 + OUT (C),B + POP HL + JR 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,8 + SCF + RET + +; HL - ADDRESS +; DE - SIZE +; A - FM +WRITE + LD (R_POINT),HL + LD (S_POINT),HL + PUSH DE + CALL SET_FM + JR C,PWERR1 + LD A,(FM_BUF_AM) + LD C,A + AND 0x01 + JR NZ,RD_ONLY + LD A,C + SET 7,A + LD (FM_BUF_AM),A + LD A,(FM_BUF_ATTR) + SET 5,A + LD (FM_BUF_ATTR),A + LD A,(FM_BUF_DC) + CALL OPENDSK + JR C,PWERR1 + LD HL,FM_BUF_FPL + LD C,(HL) + INC HL + LD A,(HL) + INC HL + LD E,A + AND #01 + LD B,A + LD D,(HL) + INC HL + LD L,(HL) + LD H,0x0000 + 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 + 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 + POP HL + ADD HL,BC + EX DE,HL + POP HL + LD C,B + ADC HL,BC +WOV2 + POP BC + LD A,B + AND 0x01 + LD B,A + OR C + JR Z,WOV6 + PUSH HL + PUSH DE + PUSH BC + LD IX,BUFFER+#C000 + LD B,1 + IN A,(PAGE3) + PUSH AF + IN A,(PAGE0) + OUT (PAGE3),A + CALL BLOK_RD + POP BC + LD C,PAGE3 + 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,(PAGE3) + PUSH AF + IN A,(PAGE0) + OUT (PAGE3),A + CALL BLOK_WR + POP BC + LD C,PAGE3 + 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_FB + CALL MOVE_CP + POP DE + RET NC + LD HL,(FM_BUF_FPL) + LD BC,(FM_BUF_FPH) + LD (FM_BUF_FSL),HL + LD (FM_BUF_FSH),BC + AND A + RET + +WOV1 + PUSH BC + PUSH HL + PUSH DE + LD IX,BUFFER+#C000 + LD B,1 + +WOV_PG EQU $ + 1 + IN A,(PAGE3) + PUSH AF + IN A,(PAGE0) + OUT (PAGE3),A + CALL BLOK_RD + POP BC + LD C,PAGE3 + 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,(PAGE3) + PUSH AF + IN A,(PAGE0) + OUT (PAGE3),A + CALL BLOK_WR + POP BC + LD C,PAGE3 + 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 + LD DE,0x0000 + DEC HL + DEC HL + LD A,(S_P_C) + LD B,A + DEC A + LD A,B + LD B,E + JR Z,ADD_DE2 + RRCA +ADD_DE1 + ADD HL,HL + RL E + RL D + RRCA + JP NC,ADD_DE1 ; TODO: JR? + +ADD_DE2 + EX DE,HL + DB 0xDD ; TODO: fix to undocumented + LD L,E + DB 0xDD + LD H,D + + LD DE,(DAT_FRM) + ADD IX,DE + LD E,B + LD D,B + ADC HL,DE + AND A + RET + +; HL:DE / BC => DE:IX HL-OSTATOK +DIV32 + LD B,A + DEC A + JP NZ,DIV001 + LD C,A + JR DIV003 +DIV001 + AND E + LD C,A + LD A,B + RRCA +DIV002 + SRL H + RR L + RR D + RR E + RRCA + JR NC,DIV002 +DIV003 + EX DE,HL + LD B,H + LD H,0x0 + LD A,C + LD C,L + LD L,A + RET + +READCOD + DB 0x00 + +READMEM + DW 0x0000 + +SECTORH + DW 0 +SECTORL + DW 0 + +R_POINT + DW 0 +S_POINT + DW 0 + + + +;//MODULE: DOS_FM +;[END] diff --git a/DOS/dos_x.asm b/DOS/dos_x.asm new file mode 100644 index 0000000..08b1f5d --- /dev/null +++ b/DOS/dos_x.asm @@ -0,0 +1,330 @@ + +;[BEGIN] +;//MODULE: DOS_X +;//CREATE: 19-05-1998 AUTHOR: Denis Parinov +;//UPDATE: 24-10-1999 DNS Restore module +;--------------------------------------------------------------- +;Rev Date Name Description +;--------------------------------------------------------------- +;R11 15-04-2003 DNS ROUTINE FOR STORE CURDISK AND CURDIR +;R10 03-04-2003 DNS IMPROVED FN. VERSION +;R09 27-03-2003 DNS PASTED SET/GET BOOT FN. +;R08 14-11-2002 DNS IMPROVE BPB-FUNCTION +;R07 17-12-1999 DNS BUG FIX SIGNATURE #55AA AT 510 OFFSET +;R06 21-11-1999 DNS FN. DISKINF SUPPORT ALL DISKS +;R05 21-11-1999 DNS BUG FIX SIGNATURE #55AA IN BOOT SECTOR +;R04 08-11-1999 DNS KILL OLD FUNCTIONS +;R03 23-11-1998 DNS BUG FIX (IX+28) -> (IY+28) +;R02 21-11-1998 DNS CHANGE FUNCTION "MAKE FAT" +;R01 20-11-1998 DNS REPAIR FUNCTION "SAVE" +;--------------------------------------------------------------- + +RGADR EQU 0x89 ;VIDEO CONTROL REGISTER +PAGE0 EQU 0x82 ;WIN 0x0000-#3FFF +PAGE1 EQU 0xA2 ;WIN #4000-#7FFF +PAGE2 EQU 0xC2 ;WIN #8000-#BFFF +PAGE3 EQU 0xE2 ;WIN #C000-0xFFFF + +SYSPAGE EQU 0xFE + +;Commands for restart #10 +;NOPS +; LD A,ERR_INVALID_FUNCTION +; SCF +; RET + +VERSION + XOR A + LD DE,VERS*256+MODF + LD BC, SUBMOD + LD H,A + LD L,A + RET + +CHNDISK + LD C,A + PUSH BC + LD C,0x1 + RST 0x18 + POP BC + JR C,NDISK11 + LD A,C + LD (DRIVE),A + CALL RD_BPB + RET C + LD A,(LDRIVE) + AND A + RET +NDISK11 + CP 0x2 + SCF + RET Z + LD A,0x14 + RET + +CURRDSK + LD A,(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 + XOR A + CP E + JR NZ,SKIC + CP D + JR NZ,SKIC + INC BC +SKIC + INC HL + JR FRESP + +FRESP2 + LD D,B + LD E,C + LD HL,(MAX_CLU) + DEC HL + LD BC,(B_P_S) + LD A,(S_P_C) + AND A + RET + +LDRIVE DB 0x02 +TDRIVE DB 0x00 +TCLUST DW 0x0000 +TCOUNT DW 0x0000 + DB 0 +RD_BPB + LD C,PAGE3 + IN B,(C) + PUSH BC + EX AF,AF' + IN A,(PAGE0) + OUT (PAGE3),A + LD DE,SECBUF+0xC000 ;R08 + EX AF,AF' + LD C,4 + RST 0x18 + POP BC + OUT (C),B + JP C,RDERR1 + LD DE,#AA55 + LD HL,(SECBUF+510) + AND A + SBC HL,DE + JP NZ,ERR_BPB + LD HL,SECBUF + LD DE,BOOT + LD BC,SIZE_OF_BOOT + LDIR + LD A, (ID_FORM) + CP 0xF0 + JP C,ERR_BPB + LD HL,0 ; calc. first sector FAT + LD DE,(RESERVE) ;Reserve sec + EX DE,HL + LD (FAT_FRM),HL ; first sector FAT + LD (FAT2_XX),HL ; first sector FAT #2 + LD DE,(S_P_F) + LD A,(FAT_NUM) ; amount FATs + CP 1 + JR Z,C_DATA1 + DEC A + ADD HL,DE + LD (FAT2_XX),HL + +C_DATA1 + ADD HL,DE + DEC A + JR NZ,C_DATA1 + LD (DIR_FRM),HL ; first sector DIR + LD BC,(B_P_S) + 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 (F_P_S),A + LD DE,(F_P_DIR) + 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 (DIR_S_S),A + ADD HL,BC ; Start DATA area + LD (DAT_FRM),HL + LD BC,(B_P_S) ; Size sector + LD HL,0 + LD A,(S_P_C) +NEXTAD3 + ADD HL,BC ; calc. cluster size + DEC A + JR NZ,NEXTAD3 + LD (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 (C_P_B),A ; A - Clusters per bank (16k) + + LD HL,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" + JP NZ,ERR_BPB + LD A,(HL) + CP "6" ; FAT16 + LD HL,0xFFFF + JR Z,BPB_FAT + CP "2" ; FAT12 + JP NZ,ERR_BPB + LD HL,0x0FFF +BPB_FAT + LD (FAT_TYP),A + LD (ENDCLUS),HL + LD HL,0 + LD BC,(S_P_T) ; Sector per track + LD A,(HEADS) +BPB_L1: ; calc. sector per cylinder + ADD HL,BC + DEC A + JR NZ,BPB_L1 + LD (S_X_H),HL + LD DE,(DAT_FRM) + LD HL,(S_P_D) + LD A,H + OR L + JR NZ,HDDSMAL + LD HL,(BPB_BIG_TOTAL_SECTORS) + LD BC,(BPB_BIG_TOTAL_SECTORS+2) + SBC HL,DE + JR NC,HDDBIG + DEC BC + JR HDDBIG +HDDSMAL + SBC HL,DE + LD BC,0 +HDDBIG + LD A,(S_P_C) + SCF +S4C01 + RRA + JR C,S4C02 + RR B + RR C + RR H + RR L + JR S4C01 +S4C02 + INC HL + LD (MAX_CLU),HL + LD HL,0 + LD (FATCASH),HL + LD A,FATPAGE + CALL BANK + PUSH AF + XOR A + CALL RE_FAT + POP AF + OUT (PAGE3),A + CALL R_CLUST + XOR A + RET + +IBMDOS_ + LD A,(ID_FORM) + CP 0xF0 + JR C,ERR_BPB + CP 0xF8 + LD A,"6" + LD HL,0xFFFF + JR Z,BPB_FAT + LD A,"2" + LD HL,0x0FFF + JP BPB_FAT + +ERR_BPB + LD A,13 + SCF + RET + +RDERR1 + LD A,20 + SCF + RET + +FATMSG DB "FAT" + +READ_PG DB 0x00 + +BLOCK DB 0x00 + +DIR_CLU DW 0x0000 + +;DRIVE DB 0x01 +FAT_FRM +FAT1_XX DW 0x0000 ; MSD_FAT_SEC first sector FAT +FAT2_XX DW 0x0000 +DIR_FRH DW 0x0000 ; MSD_CAT_SEC first sector DIR +DIR_FRM +DIR_FRL DW 0x0000 ; MSD_CAT_SEC first sector DIR +F_P_S DB 0x00 +DIR_S_S DB 0x00 ; DIR_SEC_SIZE +DAT_FRM DW 0x0000 ; MSD_DAT_SEC +CLU_LEN +B_P_C DW 0x0000 ; CLUSTER_LEN +C_P_B DB 0x00 ; A - Clusters per bank (16k) +FAT_TYP DB 0x00 ; TYPE FAT (#32 - 12bit, #36 - 16bit) +S_X_H DW 0x0000 +ENDCLUS DW 0xFFFF + +DIRSPEC DB #5C ; \ + DS 256 + + +;============================================= +;//MODULE: DOS_X +;[END] + diff --git a/DOS/drv_main.asm b/DOS/drv_main.asm new file mode 100644 index 0000000..5d1f41a --- /dev/null +++ b/DOS/drv_main.asm @@ -0,0 +1,146 @@ +;[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" + +PAGEDRV EQU #00 + + ORG 0x0000 + +A0000 JP RST_00 ;CLOSE TASK + DB #FF,#FF,#FF,#FF,#FF +A0008 PUSH AF ;INT BIOS + LD A,#00 + OUT (#7C),A + POP AF + RET + RET +A0010 JP RST_10 ;INT DOS + DB #FF,#FF,#FF,#FF,#FF +;A0018 JP INTDISK ;INT DISK +; DB #FF,#FF,#FF,#FF,#FF +A0018 PUSH AF + PUSH BC + LD BC,PAGEDRV+PAGE0 + JP ENTER +A0020 JP RST_20 ; + DB #FF,#FF,#FF,#FF,#FF +A0028 JP RST_28 ; + DB #FF,#FF,#FF,#FF,#FF +A0030 JP RST_30 ;INT MOUSE + DB #FF,#FF,#FF,#FF,#FF +A0038 JP RST_38 ;INTERRUPT + +;WARNING! DON'T CHANGE LENGHT OF MASK INTERUPT! +;FOR CORRECTED WORKING "Non-Mask Interupt" + +RST_38 ;MAIN INTERUPT +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 + +RST_00 +RST_20 +RST_28 +RST_30 + LD A,1 + SCF + RET + +NMI RETN + NOP + NOP + NOP +A0066 JP NMI + +;!!!!!!!!!!!!!!!!!! +ADRST10 EQU #00 ;!!! +;!!!!!!!!!!!!!!!!!! + +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 + +;Move to #007E + DS 8 ;ALIGN +;------=====------ +LEAVE PUSH BC +RETBANK LD BC,#0000+PAGE0 + OUT (C),B +;Entry point from DSS main page + LD (RETBANK+2),A + POP BC + POP AF +ADCALL CALL DISPATCH + JR LEAVE + + LD B,#00 ;2 + OUT (C),A ;9 +;--- + POP BC ;10 + RET ;11 +;------=====------ + +ENTER + RET + + +DISPATCH + CALL INITDVC + LD HL,INTDISK + LD (ADCALL+1),HL + LD A,(LDRIVE) + AND A + RET + +KEYSCAN + RET + + +LDRIVE DB #00 + + INCLUDE "disk_x.asm" + INCLUDE "ide_drv0.asm" + INCLUDE "fdd_drv0.asm" + INCLUDE "ram_drv0.asm" + + DB 0 +;[END] diff --git a/DOS/dss.inc b/DOS/dss.inc new file mode 100644 index 0000000..5197cee --- /dev/null +++ b/DOS/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/DOS/dss_map.txt b/DOS/dss_map.txt new file mode 100644 index 0000000..e57b7ad --- /dev/null +++ b/DOS/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/DOS/environ.asm b/DOS/environ.asm new file mode 100644 index 0000000..48e70ce --- /dev/null +++ b/DOS/environ.asm @@ -0,0 +1,251 @@ +;[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 +ENVI_L1 + JR Z,INITENV ;B=FF +ENVI_L2 + DEC B +ENVI_L3 + JR Z,READENV ;B=0 + DEC B + JR Z,GETENV ;B=1 + DEC B + JR Z,SETENV ;B=2 + LD A,ERR_INVALID_FUNCTION ; TODO: Call to NOP? + 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 (PAGE3),A + AND A + RET + +READENV PUSH HL + LD A,ENVPAGE + CALL BANK + LD H,A + LD C,PAGE3 + IN L,(C) + EXX + LD HL,ENVIRONMENT + INC HL + POP DE + LD BC,(ENVSIZE) + EXX +; +RD_ENV1 + 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,RD_ENV1 + 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 (PAGE3),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,(SECBUF) + OR A + JR Z,CLR_ENV + LD HL,EXEBUFF + +F_EVN2 + LD A,(HL) + LDI + CP "=" + JR NZ,F_EVN2 + LD HL,SECBUF +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 (PAGE3),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,0xff + LD DE,ENVNAME +ENV_E0 + XOR A + LD (DE),A + LD (SECBUF),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 + JR ENV_E4 + +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,SECBUF + LD (DE),A + LD C,#FF +ENV_E2 + LD A,(HL) + LDI + OR A + RET Z + DJNZ ENV_E2 +ENV_E4 + LD A,B + LD (DE),A + INC DE + SCF + RET + +ENVNAME EQU EXEBUFF ;DS 32 +ENVVALUE EQU #3800 ; BUFFER ;DS 128 + +ENVSIZE DW 1 ;E_END-ENVIRONMENT ;160 + +ENVIRONMENT EQU ENVADDR + +DEFAULT_ENV + DB 0 ; "",0 +DEF_ENV_SIZE EQU $-DEFAULT_ENV + +;[END] diff --git a/DOS/errors.inc b/DOS/errors.inc new file mode 100644 index 0000000..c164abe --- /dev/null +++ b/DOS/errors.inc @@ -0,0 +1,40 @@ +; ===================================== +; Error codes +; ===================================== +ERR_NO_ERROR EQU 0x00 ; (00) - нет ошибок +ERR_INVALID_FUNCTION EQU 0x01 ; (01) - неверный номер функции +ERR_INVALID_DRIVE EQU 0x02 ; (02) - неправильный номер устройства +ERR_FILE_NOT_FOUND EQU 0x03 ; (03) - файл не обнаружен +ERR_PATH_NOT_FOUND EQU 0x04 ; (04) - неверный путь +ERR_INVALID_HANDLE EQU 0x05 ; (05) - несуществующий файловый манипулятор +ERR_NO_HANDLES EQU 0x06 ; (06) - нет свободного файлового манипулятора +ERR_FILE_EXISTS EQU 0x07 ; (07) - файл существует +ERR_READONLY EQU 0x08 ; (08) - файл только для чтения +ERR_ROOT_OVERFLOW EQU 0x09 ; (09) - переполнение ROOT ; (корневого каталога) +ERR_DISK_FULL EQU 0x0A ; (10) - нет свободного места на диске +ERR_DIR_NOT_EMPTY EQU 0x0B ; (11) - каталог не пуст +ERR_CURRENT_DIR EQU 0x0C ; (12) - попытка удалить текущий каталог +ERR_UNKNOWN_FORMAT EQU 0x0D ; (13) - неизвестный формат +ERR_INVALID_ACCESS EQU 0x0E ; (14) - невозможная операция +ERR_DIR_EXISTS EQU 0x0F ; (15) - каталог уже есть +ERR_INVALID_NAME EQU 0x10 ; (16) - неверное имя +ERR_INVALID_EXE EQU 0x11 ; (17) - неправильный EXE-файл +ERR_UNKNOWN_EXE EQU 0x12 ; (18) - не поддерживаемая версия EXE-файла +ERR_ACCESS_DENIED EQU 0x13 ; (19) - ресурс не доступен +; +ERR_NOT_READY EQU 0x14 ; (20) - нет готовности +ERR_SEEK_ERROR EQU 0x15 ; (21) - ошибка позиционирования +ERR_SECTOR_NOT_FOUND EQU 0x16 ; (22) - сектор не найден +ERR_CRC_ERROR EQU 0x17 ; (23) - ошибка CRC +ERR_WRITE_PROTECT EQU 0x18 ; (24) - защита записи +ERR_READ_ERROR EQU 0x19 ; (25) - ошибка чтения +ERR_WRITE_ERROR EQU 0x1A ; (26) - ошибка записи +ERR_GENERAL_FAILURE EQU 0x1B ; (27) - общая ошибка +ERR_RESERVED_28 EQU 0x1C ; (28) - зарезервирован +ERR_RESERVED_29 EQU 0x1D ; (29) - зарезервирован +; +ERR_NOT_ENOUGH_MEMORY EQU 0x1E ; (30) - недостаточно памяти +ERR_INVALID_MEMORY_HND EQU 0x1F ; (31) - несуществующий блок памяти +ERR_RESERVED_32 EQU 0x20 ; (32) - зарезервирова +; +ERR_INVALID_VIDEO_MODE EQU 0x30 ; (48) - зарезервирова diff --git a/DOS/execute.asm b/DOS/execute.asm new file mode 100644 index 0000000..78c6250 --- /dev/null +++ b/DOS/execute.asm @@ -0,0 +1,1208 @@ + +;[BEGIN] +;//MODULE: EXECUTE +;//CREATE: 19-05-1998 AUTHOR: Denis Parinov +;//UPDATE: 24-10-1999 DNS Restore module +;--------------------------------------------------------------- +;Rev Date Name Description +;--------------------------------------------------------------- +;R01 14-05-1999 DNS DECREASE HEADER SIZE FOR EXE-FILE +;R02 24-05-1999 DNS FIX CREATE PSP AND +; MOVE EXEC STACK +;R03 19-11-2002 DNS CHECK SUBFN. FOR FN. EXEC +;R04 26-11-2002 DNS TRY TO FIX EXEC WITH PATH +;R05 02-12-2002 DNS ADD APP_PATH TO THE PROGRAM PREFIX +;R06 02-12-2002 DNS FIX BUG WITH NULL-TERMINATED STRING +;R07 05-12-2002 DNS FIX FOR EXECUTING IN CURRENT DIR WITHOUT PATH +;R08 05-12-2002 DNS FIX BUG WITH INCREMENT TASK ID AND OPEN *.EXE ERROR +;R09 14-04-2003 DNS NOW EXEC DON'T FOLLOW TO PROGRAM'S DIR +;--------------------------------------------------------------- + +; +; 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,#0100 + XOR A + CPIR + LD A,#5C ;"\" + 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,ERR_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,1 + 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,2 + 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,16 + 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 + 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 #08 + RET + +; B - SIZE BLOCK +; RET: A - ID MEMORY BLOCK + +GETMEM + LD C,#C2 + RST #08 + 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,31 + SCF + RET NZ + PUSH DE + LD A,E + LD C,#C3 + RST #08 + POP DE + LD A,31 + RET C + LD HL,MEMTAB + ADD HL,DE + XOR A + LD (HL),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,31 + SCF + RET NZ + LD D,B + PUSH DE + LD A,E + CALL SIZEBLK + POP DE + LD A,31 + RET C + LD A,B + CP D + RET Z + JR C,INCMEM +DECMEM LD B,D + LD A,E + LD C,#9D + RST #08 + LD A,B + LD C,#C3 + RST #08 + XOR A + RET + +INCMEM LD A,D + SUB B + LD B,A + LD C,E + PUSH BC + LD C,#C2 + RST #08 + POP BC + LD B,A + LD A,30 + RET C + LD A,C + LD C,#9E + RST #08 + XOR A + RET + +SIZEBLK LD B,#FF + LD C,A +BLK001 INC B + PUSH BC + LD A,C + LD C,#C4 + RST #08 + 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 PAGE1 + BIT 6,H ;if 0C000h or high? + JR Z,SETWIN2 ;no, go to open in PAGE2 + JR SETWIN3 ;yes, go to open in PAGE3 + +; B - LOGICAL PAGE +; A - ID BLOCK +; RET: A - PAGE (WIN) + +SETWIN1 LD C,#C4 + EX DE,HL + RST #08 + EX DE,HL + RET C + LD C,PAGE1 + IN B,(C) + OUT (C),A + LD A,B + RET + +SETWIN2 LD C,#C4 + EX DE,HL + RST #08 + EX DE,HL + RET C + LD C,PAGE2 + IN B,(C) + OUT (C),A + LD A,B + RET + +SETWIN3 LD C,#C4 + EX DE,HL + RST #08 + EX DE,HL + RET C + LD C,PAGE3 + IN B,(C) + OUT (C),A + LD A,B + RET + +EXEC + INC B ;R03 + DEC B ;R03 + JP Z,EXEC0 ;R03 + DEC B ;R03 + JP Z,EXEC1 ;R03 + LD A,ERR_INVALID_FUNCTION ;R03 + SCF ;R03 + RET ;R03 + +CHECKPATH + LD A,(HL) + INC HL + CP #5C ;"\" + 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 (PAGE3),A + 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 + +;;; + +ENVTEMP EQU #FE00 +TMP_CURDIR EQU #FD00 +PATH_PNT_ARRAY EQU #FC80 + +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 + CALL OPENEXE + JR NC,EXEC02 ;R07 CONTINUE EXECUTING PROGRAM + JR DECTASK ;R08 + +EXEC0_SHORT +;SHORT NAME + +; TRY TO FIND IN CURRENT DIRECTORY + 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, SEACHING 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,#5845 + SBC HL,DE + LD A,17 + SCF + JP NZ,ERREXE + LD A,(IX+3) + OR A + LD A,18 + SCF + JP NZ,ERREXE + LD DE,(LOADER) + LD A,E + OR D + JP NZ,PRELOAD + LD L,A + LD H,A + PUSH HL + POP IX + LD B,#02 + LD A,(EXE_FM) + CALL MOVE_FP + LD DE,(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,(PAGE3) + LD D,A + IN A,(PAGE2) + LD E,A + IN A,(PAGE1) + PUSH DE + PUSH AF + LD (EXSTACK),SP + LD SP,HL + EXX + LD DE,RAMMAP + LD BC,#00C4 + LD A,(EXE_MEM) + RST #08 + LD (DE),A + INC DE + LD BC,#01C4 + LD A,(EXE_MEM) + RST #08 + LD (DE),A + INC DE + LD BC,#02C4 + LD A,(EXE_MEM) + RST #08 + LD (DE),A + INC DE + LD BC,#03C4 + LD A,(EXE_MEM) + RST #08 + 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 (PAGE1),A + OUT (PAGE2),A + OUT (PAGE3),A + LD HL,(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 (PAGE1),A + INC DE +FR8000 + LD A,(DE) + OUT (PAGE2),A + INC DE +FRC000 + LD A,(DE) + OUT (PAGE3),A + CALL M_PSP + LD HL,(OFFCOD2) + LD IX,(OFFCOD1) + LD B,#00 + LD A,(EXE_FM) + CALL MOVE_FP + LD SP,#403F + LD DE,(LD_ADDR) + XOR A + LD L,A + LD H,A + SBC HL,DE + EX DE,HL + LD HL,(LD_ADDR) + LD A,(EXE_FM) + CALL READ + LD A,(EXE_FM) + CALL CLOSE + LD SP,(SP_REG) + LD HL,(LD_ADDR) + LD DE,#0080 + AND A + SBC HL,DE + EX DE,HL + LD XH,D + LD XL,E + LD HL,(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,(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 + JR C,ERREXE0 + LD (EXE_MEM),A + EXX + POP DE + LD HL,#0000 + ADD HL,SP + LD SP,(EXSTACK) + PUSH HL + PUSH DE + IN A,(PAGE3) + LD D,A + IN A,(PAGE2) + LD E,A + IN A,(PAGE1) + PUSH DE + PUSH AF + LD (EXSTACK),SP + LD SP,HL + EXX + LD DE,RAMMAP + LD BC,#00C4 + LD A,(EXE_MEM) + RST #08 + LD (DE),A + INC DE + LD BC,#01C4 + LD A,(EXE_MEM) + RST #08 + LD (DE),A + INC DE + LD BC,#02C4 + LD A,(EXE_MEM) + RST #08 + LD (DE),A + INC DE + LD BC,#03C4 + LD A,(EXE_MEM) + RST #08 + 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 (PAGE1),A + OUT (PAGE2),A + OUT (PAGE3),A + LD HL,(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 (PAGE1),A + INC DE +FR8000H LD A,(DE) + OUT (PAGE2),A + INC DE + +FRC000H + LD A,(DE) + OUT (PAGE3),A + CALL M_PSP + LD HL,(OFFCOD2) + LD IX,(OFFCOD1) + LD B,#00 + LD A,(EXE_FM) + CALL MOVE_FP + LD SP,#403F + LD HL,(LD_ADDR) + LD DE,(LOADER) + LD A,(EXE_FM) + CALL READ + LD SP,(SP_REG) + LD HL,(LD_ADDR) + LD DE,#0080 + AND A + SBC HL,DE + EX DE,HL + LD XH,D + LD XL,E + LD HL,(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 (PAGE1),A + LD A,L + OUT (PAGE2),A + LD A,H + OUT (PAGE3),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,(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 + CPIR + DEC HL + DEC HL + LD A,#5C ;"\" + 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,#8021 +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 + +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 + DS 512-($-EXEBUFF) +;(!!!HERE STACK FOR EXEC!!!) + + DS 255 +XSTACK DB #00 + +;//MODULE: EXECUTE +;[END] + diff --git a/DOS/fat_x.asm b/DOS/fat_x.asm new file mode 100644 index 0000000..f5894c5 --- /dev/null +++ b/DOS/fat_x.asm @@ -0,0 +1,482 @@ + +;[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+1),HL + RET + +G_CLUST + 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+1),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,(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,(FAT_TYP) + CP "2" + JR 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 (PAGE3),A + LD HL,#FFEF + XOR A + SBC HL,DE + POP HL + 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 (PAGE3),A + LD HL,#0FEF + XOR A + 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,(FAT_TYP) + CP "2" + JR 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 (PAGE3),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 + JR C,W_T_F01 + LD (HL),E + INC HL + LD A,(HL) + AND #F0 + OR D + LD (HL),A + POP AF + POP HL + OUT (PAGE3),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 (PAGE3),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,(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,(DRIVE) + LD B,16 ;16 * 512 = 8192 (CASH SIZE) + LD C,5 + RST #18 + POP HL + RET + +WR_FAT EXX + LD A,FATPAGE + CALL BANK + EXX + PUSH AF + CALL WR_FAT_ + POP AF + OUT (PAGE3),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,(S_P_F) + LD A,16 + AND A + SBC HL,DE + JR C,WALLFAT + EX DE,HL + LD HL,16 + SBC HL,DE + JR C,FATERR + LD A,L +WALLFAT + LD H,B + LD L,C + LD DE,(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,(DRIVE) + PUSH BC + RST #18 + POP BC + POP HL + LD DE,(FAT2_XX) + ADD HL,DE + EX DE,HL + LD IX,0 + ADD IX,DE + LD DE,FAT + LD HL,0 + LD A,(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/DOS/fdd_drv0.asm b/DOS/fdd_drv0.asm new file mode 100644 index 0000000..066e9ca --- /dev/null +++ b/DOS/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 + JR Z,INIT ;#00 + DEC C + JR Z,RESE ;#01 + DEC C + JR Z,STAT ;#02 + DEC C + JR Z,CHEK ;#03 + DEC C + JR Z,GBPB ;#04 + DEC C + JR Z,READD ;#05 + DEC C + JR Z,WRITED ;#06 + DEC C + JP Z,REMOV_F ;#07 + DEC C + JR Z,IOCTL_F ;#08 + LD A,1 ; TODO: NOOP? + SCF + RET + +;Commands for restart #18 +INIT + LD A,2 + AND A + RET + +RESE + LD C,#51 + RST #08 + RET + +STAT + XOR A + RET + +CHEK + LD A,#FF + AND A + RET + +;DE - ADDRESS + +GBPB + LD IX,0 + LD HL,0 + PUSH DE + PUSH AF + LD BC,#0155 + RST #08 + POP DE + POP HL + RET C + LD BC,#0018 + ADD HL,BC + LD E,(HL) + PUSH DE + LD A,D + LD C,#58 + RST #08 + LD A,H + POP HL + PUSH HL + LD H,A + POP AF + LD C,#59 + RST #08 + XOR A + RET + +;READTR +; XOR A +; RET + +READD + LD C,#55 + RST #08 + RET + +WRITED + LD C,#56 + RST #08 + 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 + JR Z,FGETPRM + LD A,1 + SCF + RET + +O_CTL_F + RES 7,B + INC B + DEC B + JR Z,FSETPRM + LD A,1 + 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,11 + SCF + RET NZ + LD A,L + AND #0F + PUSH AF + LD C,#58 + RST #08 + 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 + EX AF,AF' + XOR A + LD L,A + LD H,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,2 + 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 #08 + POP DE + POP HL + JR C,NONEF + POP AF + LD C,#59 + RST #08 + RET C + AND A + RET + +REMOV_F + LD A,1 + AND A + RET + +;============================================== + + + diff --git a/DOS/hardware.inc b/DOS/hardware.inc new file mode 100644 index 0000000..f00d886 --- /dev/null +++ b/DOS/hardware.inc @@ -0,0 +1,7 @@ + +;Memory ports + +PAGE0 EQU #82 +PAGE1 EQU #A2 +PAGE2 EQU #C2 +PAGE3 EQU #E2 diff --git a/DOS/ide_drv0.asm b/DOS/ide_drv0.asm new file mode 100644 index 0000000..4811383 --- /dev/null +++ b/DOS/ide_drv0.asm @@ -0,0 +1,696 @@ +;--------------------------------------------------------------- +;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 + JR 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 + JR Z,RESR_H ;#09 + DEC C + JP Z,LREADH ;#0A + DEC C + JP Z,LWRITEH ;#0Bh + +RESR_H ; TODO: UNK? + LD A,1 + SCF + RET + +;Commands for restart #18 +INIT_H + PUSH IY + LD HL,LOGDRV + LD (OFFSECT),HL + LD IX,DEVICE_CFG + LD C,#5F + RST #08 + XOR A + LD B,(IX+2) ;HDD + CP B + JR Z,NO_HARDS + LD B,0x04 ; TODO: 1op + LD C,0x80 + +NX_DVCI + PUSH BC + LD A,C + LD (DRV),A + CALL PARTIT + POP BC + INC C + DJNZ NX_DVCI + +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 + +LOGDRV DB 0 ;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... +SOFF DW 0,0 ;+01 LONG SECTOR OFFSET +NSECT DW 0,0 ;+05 LONG SIZE IN SECTORS + DS 183,0 ;+09 FREE + +DEVICE_CFG EQU #4000 + + +;+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 + + +SELHDD + PUSH DE + PUSH BC + PUSH HL + LD L,A + LD H,0x0 + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + EX DE,HL + LD HL,LOGDRV + ADD HL,DE + LD A,(HL) ; LOGDRV + INC HL + LD C,(HL) ; =>SOFF+0 + INC HL + LD B,(HL) ; =>SOFF+1 + INC HL + LD E,(HL) ; =>SOFF+2 + INC HL + LD D,(HL) ; =>SOFF+3 + POP HL + ADD IX,BC + ADC HL,DE + 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 + JR Z,HGETPRM + DEC B + JR Z,HRDTRAC + DEC B + JR Z,HCHTRAC + LD A,1 + SCF + RET + +O_CTL_H + RES 7,B + INC B + DEC B + JR Z,HSETPRM + DEC B + JR Z,HWRTRAC + DEC B + JR Z,HFRTRAC + LD A,1 + SCF + RET + +HRDTRAC + LD A,11 + SCF + RET + +HCHTRAC + LD B,L + JP CHECKH + +HSETPRM + AND A + RET + +HWRTRAC + LD A,11 + SCF + RET + +HFRTRAC + LD A,11 + 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,11 + 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 + ADD IY,BC + LD E,(IY+5) ; Number of sectors 0 + LD D,(IY+6) ; Number of sectors 1 + LD L,(IY+7) ; Number of sectors 2 + LD H,(IY+8) ; Number of sectors 3 + + LD A,(IY+0) ; drv + LD C,A + LD IY,IDE0 + AND #0F + JR Z,GELH1 + LD IY,IDE1 +GELH1 + IN A,(PAGE3) + PUSH AF + LD A,SYSPAGE + OUT (PAGE3),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 B,D + LD C,(IY+SC_PT_H) ;SECTORS + EXX + EX AF,AF' + POP AF + OUT (PAGE3),A + LD A,C + EX AF,AF' + POP IY + AND A + RET + +REMOV_H + LD A,1 + AND A + RET + +RESE_H + LD L,A + LD H,0x0 + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + EX DE,HL + LD HL,LOGDRV + ADD HL,DE + LD A,(HL) + RET + +STAT_H + XOR A + RET + +CHEK_H + LD A,#FF + AND A + RET + +;HL:IX - SECTOR +; DE - ADDRESS + +GBPB_H + LD HL,0x0 + LD IX,0x0 + CALL SELHDD + LD BC,0x155 + JP A0008 + +;HL:IX - SECTOR +; DE - ADDRESS +; B - COUNTER +; A'- PAGE + +;READ SECTOR +LREADH + CALL SELHDD + LD C,0x52 + JP A0008 + +;HL:IX - SECTOR +; DE - ADDRESS +; B - COUNTER +; A'- PAGE + +;WRITE SECTOR +LWRITEH + CALL SELHDD + LD C,0x53 + JP A0008 + +;HL:IX - SECTOR +; DE - ADDRESS +; B - COUNTER + +;WRITE SECTOR +WRITEH + CALL SELHDD + LD C,0x56 + JP A0008 + +;HL:IX - SECTOR +; DE - ADDRESS +; B - COUNTER + +;READ SECTOR +READH + CALL SELHDD + LD C,0x55 + JP A0008 + +;HL:IX - SECTOR +; DE - ADDRESS +; B - COUNTER + +;CHECK SECTOR +CHECKH + CALL SELHDD + LD C,0x54 + JP A0008 + +;----------------- +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,(PAGE3) + PUSH AF + LD A,#FF + OUT (PAGE3),A + CALL PARTIT1 + POP AF + OUT (PAGE3),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 + RET C + 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 + JR NXTPART + +NOEXTDS + CP 0xf + JR Z,SUBLEV + CP 0xe + JP Z,HIGHDOS + CP 0x6 + JP Z,HIGHDOS + CP 0x4 + JP Z,HIGHDOS + CP 0x1 + JP Z,HIGHDOS + CP 0xb + JR Z,SUBLEV + CP 0x7 + JR Z,SUBLEV + CP 0x82 + JR Z,SUBLEV + CP 0x83 + JR Z,SUBLEV + CP 0xeb + JR Z,SUBLEV + 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) + JR 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 #08 + 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/DOS/intmouse.asm b/DOS/intmouse.asm new file mode 100644 index 0000000..102d742 --- /dev/null +++ b/DOS/intmouse.asm @@ -0,0 +1,930 @@ + +;[BEGIN] +;//MODULE: INTMOUSE +;//CREATE: 19-05-1998 AUTHOR: Denis Parinov +;//UPDATE: 24-10-1999 DNS Restore module + +CMOUSE EQU #1B +DMOUSE EQU #1A +Y_PORT EQU #89 +VPAGE EQU #C9 + +; 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 + JR NZ,EMOUSE + INC C + DEC C + JR 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 ; TODO: JR? + DEC C + JR 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 + JR Z,MS_RESR + DEC C + JR Z,MS_RESR + DEC C + JP Z,MS_GSEN + DEC C + JP Z,MS_SENT + +MS_RESR + LD A,1 + 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,1 + SCF + RET + +MS_INIT + DI + LD A,85 + OUT (#10),A + LD A,45 + OUT (#10),A + LD A,0 + OUT (CMOUSE),A + LD A,1 + OUT (CMOUSE),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 + LD A,1 + 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 + XOR A + 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 (YHOT_SP),BC + EXX + LD A,(M_XSIZE) + LD C,A + LD B,0 + LD A,(M_YSIZE) + LD L,B + LD H,B + +MSCURS1 + ADD HL,BC + DEC A + JR NZ,MSCURS1 + PUSH HL + LD BC,MAXSIZM+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 L,B + LD H,B + +MSBCUR1 + ADD HL,BC + DEC A + JR NZ,MSBCUR1 + PUSH HL + LD BC,MAXSIZM+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 HL,(M_XSIZE) + LD BC,(XHOT_SP) + LD E,C + LD BC,(YHOT_SP) + LD D,C + XOR A + LD C,A + LD B,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,(Y_PORT) + LD XH,A + IN A,(PAGE1) + LD XL,A +; + DI +; + LD A,#54 + OUT (PAGE1),A +; + LD A,D + ADD A,A + ADD A,A ;Y * 4 + LD L,A + LD H,#43 ;+ #4300 +; + IN A,(VPAGE) + RRCA + AND #80 + OR #01 + ADD A,E + OUT (Y_PORT),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 (PAGE1),A + LD A,XH + OUT (Y_PORT),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,(Y_PORT) + LD XH,A + IN A,(PAGE1) + LD XL,A +; + DI +; + LD A,#50 + OUT (PAGE1),A +; + LD A,D + ADD A,A + ADD A,A ;Y * 4 + LD L,A + LD H,#43 ;+ #4300 +; + IN A,(VPAGE) + RRCA + AND #80 + OR #01 + ADD A,E + OUT (Y_PORT),A + INC L + LD A,(HL) ;SIMBOL + LD (HL),A + INC L + LD A,(HL) ;ATTRIBUT + LD (HL),A +; + LD A,XL + OUT (PAGE1),A + LD A,XH + OUT (Y_PORT),A + RET + +RESTORE + LD A,#00 + BIT 7,A + JR Z,RESTORT +RESTORG + IN A,(PAGE3) + LD B,A + IN A,(Y_PORT) + LD C,A + PUSH BC + LD A,#50 + OUT (PAGE3),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 ;PAGE 0 + JR Z,AA2 + LD DE,#C000+320 ;PAGE 1 +AA2 ADD HL,DE +REST_A LD A,0 + LD XH,A + EX AF,AF' +REST_H +RS002 LD BC,10 + OUT (Y_PORT),A + EX AF,AF' +; PUSH HL + LD (PUSH_HL+1),HL + LD D,H + LD E,L + LDIR +PUSH_HL 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 (PAGE3),A + LD A,C + OUT (Y_PORT),A + XOR A + RET + +;HL/DE - X/Y + +MOUSE + LD A,(MODE) + LD (RESTORE+1),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,(PAGE3) + LD H,A + IN A,(Y_PORT) + LD L,A + EX (SP),HL + LD A,#5C + OUT (PAGE3),A + LD A,E + EX AF,AF' + IN A,(VPAGE) + 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 (Y_PORT),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 (PAGE3),A + LD A,C + OUT (Y_PORT),A + XOR A + RET + +READ_M + LD A,(M_VAR_Y) + LD E,A + LD BC, 0xFFDF + IN A,(C) + LD (M_VAR_Y), A + LD (M_VAR_Y2), A + SUB E + NEG + LD D,A + LD A,(M_VAR_X) + LD E,A + LD B,0xfb + IN A,(C) + LD (M_VAR_X),A + LD (M_VAR_Y2),A + SUB E + LD E,A + LD B,0xfa + IN A,(C) + CPL + AND 0x7 + LD (MB),A + LD A,(M_VAR_Y2) + OR A + RET Z + CALL SENSE + LD (MX),DE + XOR A + LD (M_VAR_Y2),A + SCF + RET + +M_VAR_Y2 DB 0x00 + +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 + JR NC,YCOO + LD HL,(MAX_X) + LD (PIX_X),HL + JR 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),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 + CP 0x81 + JR Z,S320256 + CP 0x82 + JR Z,S640256 + +UNKMODE + XOR A + SCF + RET + +S320256 + LD DE,319 +SET_HV + LD HL,0x0 + CALL MS_HORZ + LD DE,0xff + JP MS_VERT + +S640256 + LD DE,639 + JR SET_HV + + +;Mouse Interrupt +M_INT IN A,(PAGE3) + LD B,A + IN A,(Y_PORT) + LD C,A + PUSH BC + CALL REFRESH ;Refresh mouse + CALL CONTROL + POP BC + LD A,B + OUT (PAGE3),A + LD A,C + OUT (Y_PORT),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,#00 + OR A + RET Z + +REDY + LD A,#00 + CALL RESTORE + LD HL,(PIX_X) + LD DE,(PIX_Y) + CALL MOUSE + LD A,#FF + LD (REDY+1),A + RET + +MODE DB #03 + +PIX_X DW 160 +PIX_Y DW 128 + +MX DB #00 +MY DB #00 +MB DB #00 +MB_OLD DB #00 + +M_VAR_X DB 0 +M_VAR_Y DB 0 + +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 + +X EQU #00 +W EQU #FE +N EQU #FF + +M_IMAGE +MS_BMP DB X,X,N,N,N,N,N,N,N,N + DB X,W,X,N,N,N,N,N,N,N + DB X,W,W,X,N,N,N,N,N,N + DB X,W,W,W,X,N,N,N,N,N + DB X,W,W,W,W,X,N,N,N,N + DB X,W,W,W,W,W,X,N,N,N + DB X,W,W,W,W,W,W,X,N,N + DB X,W,W,W,W,X,X,X,X,N + DB X,W,W,X,W,X,N,N,N,N + DB X,W,X,X,W,W,X,N,N,N + DB X,X,N,N,X,W,X,N,N,N + DB X,N,N,N,X,W,W,X,N,N + DB N,N,N,N,N,X,X,N,N,N + DB N,N,N,N,N,N,N,N,N,N + DS 116 +MAXSIZM EQU $-M_IMAGE + +;//MODULE: INTMOUSE +;[END] + diff --git a/DOS/keyinter.asm b/DOS/keyinter.asm new file mode 100644 index 0000000..1df7a1f --- /dev/null +++ b/DOS/keyinter.asm @@ -0,0 +1,891 @@ + + +;[BEGIN] +;//MODULE: KEYINTER +;//CREATE: 19-05-1998 AUTHOR: Denis Parinov +;//UPDATE: 24-10-1999 DNS Restore module +;------------------------------------------------ +;R01 10-02-2003 DNS Add cursor visualisation +; +; DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + +SBUF + 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 + 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 +EBUF + +HEAD DB #00 +HOST DB #00 + +K_LOCK EQU $-KEYFLAG +KEYFLAG DB #02 ;D0-Key Pressed +K_SHIFT EQU $-KEYFLAG +KEYCTRL DB #00 +KEYFLG EQU $-KEYFLAG + DB #00 + DB #03 +UNICODE DW 0 + +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 +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 + +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 + +;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 + +; 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 codeKEYFLAG + + +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 + +; TODO FixIt! +ECHOKEY0 + CALL ECHO_PREP_3 + +ECHOKEY + CALL SCANKEY + JR Z,ECHOKEY + PUSH DE + PUSH BC + PUSH AF + CALL ECHO_PREP + POP AF + OR A + CALL NZ,PUTCHAR + POP BC + POP DE + LD A,E + AND A + RET + +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,4 ; 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,1 + SCF + RET + +K_C2 + LD A,#35 + CP B + JR NC,K_C3 + LD A,1 + SCF + RET + +K_C3 + LD C,B + RST #10 + 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,4 ; 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,4 ; 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 + LD HL,#CF00 ;Ctrl + Alt + Del + AND A + SBC HL,DE + CALL Z,RST_X + LD BC,(KEYFLAG) + JP PUTSYM + +UN_KEY + RES FLAG_F0,(IX+KEYFLG) + LD L,A + CALL XLAT + CALL UNSHIFT + RES FLAG_E0,(IX+KEYFLG) + LD H,0 + LD (UNICODE),HL + RET + +CAPS_X LD A,(IX+K_LOCK) + XOR #01 + LD (IX+K_LOCK),A + RET + +RUS_X BIT X_CTRL,(IX+K_SHIFT) + RET Z + LD A,(IX+K_LOCK) + XOR #80 + LD (IX+K_LOCK),A + BIT SF_ALT,(IX+SOUND_K) + RET Z + EXX + LD DE,190 + LD HL,20 + CALL BEEP + EXX + RET + +INS_X + LD A,(IX+K_LOCK) + XOR 0x2 + LD (IX+K_LOCK),A + RET + +NUM_X + LD A,(IX+K_LOCK) + XOR 0x8 + LD (IX+K_LOCK),A + RET + +PAUSE_X + BIT X_CTRL,(IX+K_SHIFT) + RET Z + LD A,(IX+K_LOCK) + XOR 0x40 + LD (IX+K_LOCK),A + BIT PAUSE_L,(IX+K_LOCK) + RET Z + EI + +PAUSE_ + HALT + BIT PAUSE_L,(IX+K_LOCK) + JR NZ,PAUSE_ + DI + RET + +SCL_X + LD A,(IX+K_LOCK) + XOR 0x04 + LD (IX+K_LOCK),A + RET + +RST_X + LD C,0x30 + LD A,(IX+K_SHIFT) + AND C + CP C + RET NZ + XOR A + LD BC,0x1FD + RST 0x8 + RET + +UNSHIFT + LD A,L + CP #37 ; L ALT + JR NZ,USH1 + RES L_ALT,(IX+K_SHIFT) + BIT R_ALT,(IX+K_SHIFT) + RET NZ + RES X_ALT,(IX+K_SHIFT) + RET + +USH1 + CP #39 ;R ALT + JR NZ,USH2 + RES R_ALT,(IX+K_SHIFT) + BIT L_ALT,(IX+K_SHIFT) + RET NZ + RES X_ALT,(IX+K_SHIFT) + RET +USH2 + CP #36 ;L CTRL + JR NZ,USH3 + RES L_CTRL,(IX+K_SHIFT) + BIT R_CTRL,(IX+K_SHIFT) + RET NZ + RES X_CTRL,(IX+K_SHIFT) + RET +USH3 CP #3A ;R CTRL + JR NZ,USH4 + RES R_CTRL,(IX+K_SHIFT) + BIT L_CTRL,(IX+K_SHIFT) + RET NZ + RES X_CTRL,(IX+K_SHIFT) + RET +USH4 + CP #29 ;L SHIFT + JR NZ,USH5 + RES L_SHIFT,(IX+K_SHIFT) + RET +USH5 + CP #34 ;R SHIFT + RET NZ + RES R_SHIFT,(IX+K_SHIFT) +USH6 + RET + +SHIFTS LD A,L + CP #37 ;L ALT + JR NZ,NSH1 + SET L_ALT,(IX+K_SHIFT) + SET X_ALT,(IX+K_SHIFT) + RET +NSH1 CP #39 ;R ALT + JR NZ,NSH2 + SET R_ALT,(IX+K_SHIFT) + SET X_ALT,(IX+K_SHIFT) + RET +NSH2 CP #36 ;L CTRL + JR NZ,NSH3 + SET L_CTRL,(IX+K_SHIFT) + SET X_CTRL,(IX+K_SHIFT) + RET +NSH3 + CP #3A ;R CTRL + JR NZ,NSH4 + SET R_CTRL,(IX+K_SHIFT) + SET X_CTRL,(IX+K_SHIFT) + RET +NSH4 + CP #29 ;L SHIFT + JR NZ,NSH5 + SET L_SHIFT,(IX+K_SHIFT) + RET +NSH5 + CP 0x34 ;R SHIFT + RET NZ + SET R_SHIFT,(IX+K_SHIFT) + RET + +; TODO: Strange part for keyboard inter ================= +VER + DI + PUSH AF + CALL KINIT + CALL PRINT_INIT + LD C,0 + RST #30 + LD A,(VMODE) + LD C,#81 + RST #30 + CALL INITDVC + EI + ; Set new address fn. VERSION + LD DE,VERSION + LD HL,ADRST10 + LD (HL),E + INC H + LD (HL),D + ; Allocate memory + LD BC,0x3c2 + RST 0x08 + LD HL,BANKTBL + LD C,A + LD B,0x2 + +VERINIT + PUSH BC + PUSH HL + LD A,C + LD C,0xc4 + RST 0x08 + POP HL + POP BC + JR C,VER_L2 + LD (HL),A + INC HL + DEC B + JP M,VER_L2 + JR VERINIT +VER_L2 + CALL VER_IN + LD B,0xff + CALL ENVIRON + LD A,0x1 + CALL BANK + EX AF,AF' + LD HL,0xe000 + PUSH HL + LD DE,0xe001 + LD BC,0x262 + XOR A + LD (HL),A + LDIR + LD BC,0x3d + POP HL + LD E,0xa + DEC A +VER_L3 + LD (HL),A + ADD HL,BC + DEC E + JR NZ,VER_L3 + EX AF,AF' + OUT (0x00e2),A + POP AF + CALL SETBOOT + PUSH AF + CALL CHNDISK + POP AF + ADD A,0x41 + LD (BOOT_LBL_DRV),A + LD HL,BOOT_LBL + LD B,0x2 + CALL ENVIRON + JP VERSION + +BOOT_LBL + DB 'BOOTDSK=' +BOOT_LBL_DRV + DB 'A:' + DS 199, 0x00 + +; End of strange part ================ + +; ALIGN 256 +; DEFS $/256+1*256-$,0 + +; 0 1 2 3 4 5 6 7 8 9 A B C D E +; F +XLAT_T + DB #00,#43,#00,#3F,#3D,#3B,#3C,#46,#00,#44,#42,#40,#3E,#0F,#00,#00 ;00 + DB #00,#37,#29,#00,#36,#10,#02,#00,#00,#00,#2A,#1E,#1D,#11,#03,#00 ;10 + DB #00,#2C,#2B,#1F,#12,#05,#04,#00,#00,#38,#2D,#20,#14,#13,#06,#00 ;20 + DB #00,#2F,#2E,#22,#21,#15,#07,#00,#00,#00,#30,#23,#16,#08,#09,#00 ;30 + DB #00,#31,#24,#17,#18,#0B,#0A,#00,#00,#32,#33,#25,#26,#19,#0C,#00 ;40 + DB #00,#00,#27,#00,#1A,#0D,#00,#00,#1C,#34,#28,#1B,#00,#35,#00,#00 ;50 + DB #00,#00,#00,#00,#00,#00,#0E,#00,#00,#51,#00,#54,#57,#00,#00,#00 ;60 + DB #50,#4F,#52,#55,#56,#58,#01,#49,#45,#4D,#53,#4C,#4B,#59,#48,#00 ;70 + DB #00,#00,#00,#41,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 ;80 + +XLAT BIT FLAG_E0,(IX+KEYFLG) + JR Z,W_O_E0 + CP #11 ;Right ALT + LD L,#39 + RET Z + CP #14 ;Right CTRL + LD L,#3A + RET Z + CP #5A ;enter + LD L,#4E + RET Z + CP #4A ; / + LD L,#4A + RET Z + CP #7C ; * - Print Screen + LD L,#47 + RET Z + LD L,A +W_O_E0 LD H,XLAT_T/256 + LD L,(HL) + RET + + +;INPCODE BIT 1,(IX+1) ;00110000 +; JR NZ,FN_KEY ;LRCAcaRP + +INPCODE LD D,L + LD E,0 + BIT LANG_L,(IX+K_LOCK) + JP NZ,RUSCODE + LD A,(IX+K_SHIFT) + AND #C0 + JR NZ,SHIFT_L + SET 7,D + BIT X_ALT,(IX+K_SHIFT) + RET NZ + BIT X_CTRL,(IX+K_SHIFT) + RET NZ + LD D,L + BIT CAPS_L,(IX+K_LOCK) + LD BC,CAPSTAB + JR NZ,CONVER + LD BC,NORMTAB +CONVER LD H,0 + ADD HL,BC + LD E,(HL) + RET + +SHIFT_L LD BC,SHIFTAB + BIT CAPS_L,(IX+K_LOCK) + JR Z,CONVER5 + LD BC,SHF2TAB +CONVER5 LD H,0 + ADD HL,BC + LD E,(HL) + SET 7,D + RET + +RUSCODE LD A,(IX+K_SHIFT) + AND #C0 + JR NZ,SHIFT_R + SET 7,D + BIT X_ALT,(IX+K_SHIFT) + RET NZ + BIT X_CTRL,(IX+K_SHIFT) + RET NZ + LD D,L + BIT CAPS_L,(IX+K_LOCK) + LD BC,CAPSRUS + JR NZ,CONVER2 + LD BC,NORMRUS +CONVER2 + LD H,0 + ADD HL,BC + LD E,(HL) + RET + +SHIFT_R LD BC,SHIFRUS + BIT CAPS_L,(IX+K_LOCK) + JR Z,CONVER4 + LD BC,SHF2RUS +CONVER4 + LD H,0 + ADD HL,BC + LD E,(HL) + SET 7,D + RET + +K_SETUP + INC B + DEC B + JR Z,KEYMAP + DEC B + JR Z,K_SND_R + DEC B + JR Z,K_SND_W + LD A,#0E + SCF + RET + +K_SND_R LD A,(SOUND_K) + AND A + RET + +K_SND_W LD (SOUND_K),A + AND A + RET + +KEYMAP LD BC,ENDNORM-NORMTAB + BIT 7,A + JR NZ,READMAP + LD DE,NORMTAB + OR A + JR Z,LTAB + LD DE,SHIFTAB + DEC A + JR Z,LTAB + LD DE,CAPSTAB + DEC A + JR Z,LTAB + LD DE,SHF2TAB + DEC A + JR Z,LTAB + LD DE,NORMRUS + DEC A + JR Z,LTAB + LD DE,SHIFRUS + DEC A + JR Z,LTAB + LD DE,CAPSRUS + DEC A + JR Z,LTAB + LD DE,SHF2RUS + DEC A + JR Z,LTAB + XOR A + SCF + RET +LTAB + LDIR + XOR A + RET + +READMAP + RES 7,A + LD DE,NORMTAB + OR A + JR Z,RTAB + LD DE,SHIFTAB + DEC A + JR Z,RTAB + LD DE,CAPSTAB + DEC A + JR Z,RTAB + LD DE,SHF2TAB + DEC A + JR Z,RTAB + LD DE,NORMRUS + DEC A + JR Z,RTAB + LD DE,SHIFRUS + DEC A + JR Z,RTAB + LD DE,CAPSRUS + DEC A + JR Z,RTAB + LD DE,SHF2RUS + DEC A + JR Z,RTAB + XOR A + SCF + RET +RTAB + EX DE,HL + LDIR + XOR A + RET + +; ` +; 0 +; Esc,"1","2","3","4","5","6","7","8","9","0","-","=",Back +; 1 2 3 4 5 6 7 8 9 A B C D E +; Tab,"Q","W","E","R","T","Y","U","I","O","P","[","]" +; F 10 11 12 13 14 15 16 17 18 19 1A 1B +; Cps,"A","S","D","F","G","H","J","K","L",";","'",Enter +; 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 +; LSh,"Z","X","C","V","B","N","M",",",".","/",RSh,#5C +; 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 +; LCl,LAt,SPC,Rat,RCl,F01,F02,F03,F04,F05,F06,F07,F08 +; 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 +; F09,F10,F11,F12,prn,scr,num,"/","*","-","+",ent,Del +; 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F +; Ins,End,Dwn,PgD,Lft,"5",Rgh,Hom,Upp,PgU +; 50 51 52 53 54 55 56 57 58 59 +; +;================================ +Esc EQU #1B +Bcs EQU #08 +Tab EQU #09 +Cps EQU #00 +Spc EQU #20 +Ent EQU #0D + +;Standart ASCII tables +NORMTAB DB "`",Esc,"1","2","3","4","5","6","7","8","9","0","-","=",Bcs + DB Tab,"q","w","e","r","t","y","u","i","o","p","[","]" + DB Cps,"a","s","d","f","g","h","j","k","l",";","'",Ent + DB #00,"z","x","c","v","b","n","m",#2C,".","/",#00,#5C + DB #00,#00,Spc,#00,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + DB #00,#00,#00,"/","*","-","+",Ent,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00 +ENDNORM + +SHIFTAB DB "~",Esc,"!","@","#","$","%","^","&","*","(",")","_","+",Bcs + DB Tab,"Q","W","E","R","T","Y","U","I","O","P","{","}" + DB Cps,"A","S","D","F","G","H","J","K","L",":",#22,Ent + DB #00,"Z","X","C","V","B","N","M","<",">","?",#00,"|" + DB #00,#00,Spc,#00,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + DB #00,#00,#00,"/","*","-","+",Ent,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + +CAPSTAB DB "`",Esc,"1","2","3","4","5","6","7","8","9","0","-","=",Bcs + DB Tab,"Q","W","E","R","T","Y","U","I","O","P","[","]" + DB Cps,"A","S","D","F","G","H","J","K","L",";","'",Ent + DB #00,"Z","X","C","V","B","N","M",#2C,".","/",#00,#5C + DB #00,#00,Spc,#00,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + DB #00,#00,#00,"/","*","-","+",Ent,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + +SHF2TAB DB "~",Esc,"!","@","#","$","%","^","&","*","(",")","_","+",Bcs + DB Tab,"q","w","e","r","t","y","u","i","o","p","{","}" + DB Cps,"a","s","d","f","g","h","j","k","l",":",#22,Ent + DB #00,"z","x","c","v","b","n","m","<",">","?",#00,"|" + DB #00,#00,Spc,#00,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + DB #00,#00,#00,"/","*","-","+",Ent,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + +;Standart Russian tables +NORMRUS DB #F1,Esc,"1","2","3","4","5","6","7","8","9","0","-","=",Bcs + DB Tab,#A9,#E6,#E3,#AA,#A5,#AD,#A3,#E8,#E9,#A7,#E5,#EA + DB Cps,#E4,#EB,#A2,#A0,#AF,#E0,#AE,#AB,#A4,#A6,#ED,Ent + DB #00,#EF,#E7,#E1,#AC,#A8,#E2,#EC,#A1,#EE,".",#00,#5C + DB #00,#00,Spc,#00,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + DB #00,#00,#00,"/","*","-","+",Ent,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + +SHIFRUS DB #F0,Esc,"!",#22,"#","$",":",#2C,".",";","?","%","_","+",Bcs + DB Tab,#89,#96,#93,#8A,#85,#8D,#83,#98,#99,#87,#95,#9A + DB Cps,#94,#9B,#82,#80,#8F,#90,#8E,#8B,#84,#86,#9D,Ent + DB #00,#9F,#97,#91,#8C,#88,#92,#9C,#81,#9E,#2C,#00,"|" + DB #00,#00,Spc,#00,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + DB #00,#00,#00,"/","*","-","+",Ent,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + +CAPSRUS DB #F0,Esc,"1","2","3","4","5","6","7","8","9","0","-","=",Bcs + DB Tab,#89,#96,#93,#8A,#85,#8D,#83,#98,#99,#87,#95,#9A + DB Cps,#94,#9B,#82,#80,#8F,#90,#8E,#8B,#84,#86,#9D,Ent + DB #00,#9F,#97,#91,#8C,#88,#92,#9C,#81,#9E,".",#00,#5C + DB #00,#00,Spc,#00,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + DB #00,#00,#00,"/","*","-","+",Ent,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + +SHF2RUS DB #F1,Esc,"!",#22,"#","$",":",#2C,".",";","?","%","_","+",Bcs + DB Tab,#A9,#E6,#E3,#AA,#A5,#AD,#A3,#E8,#E9,#A7,#E5,#EA + DB Cps,#E4,#EB,#A2,#A0,#AF,#E0,#AE,#AB,#A4,#A6,#ED,Ent + DB #00,#EF,#E7,#E1,#AC,#A8,#E2,#EC,#A1,#EE,#2C,#00,"|" + DB #00,#00,Spc,#00,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + DB #00,#00,#00,"/","*","-","+",Ent,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + +;================================ + +BEEP LD A,#10 + OUT (#FE),A + LD B,D + LD C,E +BPP DEC BC + LD A,B + OR C + JR NZ,BPP + LD A,#00 + OUT (#FE),A + LD B,D + LD C,E +BPP2 DEC BC + LD A,B + OR C + JR NZ,BPP2 + DEC HL + LD A,H + OR L + JR NZ,BEEP + RET + +COM_A EQU #19 +DAT_A EQU #18 + +KINIT + LD A,0x30 + OUT (COM_A),A + LD A,0x18 + OUT (COM_A),A + LD A,0x01 + OUT (COM_A),A + LD A,0x00 + OUT (COM_A),A + LD A,0x03 + OUT (COM_A),A + LD A,0xC1 + OUT (COM_A),A + LD A,0x04 + OUT (COM_A),A + LD A,0x07 + OUT (COM_A),A + LD A,0x05 + OUT (COM_A),A + IF SPRINTER=97 + LD A,0x60 + ELSE + LD A,0x62 + ENDIF + OUT (COM_A),A + RET + +;//MODULE: KEYINTER +;[END] + diff --git a/DOS/known.bug b/DOS/known.bug new file mode 100644 index 0000000..b1deed3 --- /dev/null +++ b/DOS/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/DOS/ram_drv0.asm b/DOS/ram_drv0.asm new file mode 100644 index 0000000..332f11c --- /dev/null +++ b/DOS/ram_drv0.asm @@ -0,0 +1,443 @@ + +; 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 + +RMDRIVE + INC C + DEC C + JP Z,INIT_RD + DEC C + JR Z,RESE_RD + DEC C + JR Z,STAT_RD + DEC C + JR Z,CHEK_RD + DEC C + JR Z,GBPB_RD + DEC C + JR Z,READR + DEC C + JR Z,WRITER + LD A,1 + SCF + RET + +RESE_RD + XOR A + RET + +STAT_RD + XOR A + RET + +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 + LD A,0x20 + LD (S_P_P),A + LD DE,RAMDTBL + LD BC,0xce + +INIT_R0 + PUSH BC + LD A,B + RST #08 + OR A + JR Z,NORAMD + LD (DE),A + INC DE + +NORAMD + POP BC + INC B + LD A,#10 + CP B + JR NZ,INIT_R0 + LD HL,RAMDTBL + EX DE,HL + AND A + SBC HL,DE + LD A,L + AND A + RET + +RAMDTBL DB #FF,#FF,#FF,#FF + DB #FF,#FF,#FF,#FF + DB #FF,#FF,#FF,#FF + DB #FF,#FF,#FF,#FF + +; SECTOR / S_P_P = START PAGE +; INPUT : HL:IX -SECTOR +; OUTPUT: A':HL - ADDRESS + +RAMADDR + LD BC,RAMDTBL + 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 P +;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 #08 + 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,PAGE3 + SET 6,H + JR C,RMDL02 + LD C,PAGE1 + 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,PAGE3 ;GET NEXT PAGE + IN B,(C) + LD A,SYSPAGE + 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,PAGE3 + SET 6,H + JR C,WMDL02 + LD C,PAGE1 + 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,PAGE3 ;GET NEXT PAGE + IN B,(C) + LD A,SYSPAGE + 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 + +ENDDRVR + diff --git a/DOS/release.inc b/DOS/release.inc new file mode 100644 index 0000000..9de6156 --- /dev/null +++ b/DOS/release.inc @@ -0,0 +1,39 @@ + +;Release Types + +RELEASE EQU 0 +RC EQU 1 +BETA EQU 2 +DP EQU 3 + +OSTYPE EQU BETA +REVISION EQU 0 + +C_OSNAME macro + db "ESTEX",0 + endm + + +C_OSRELEASE macro + db "Estex DSS",0 + endm + + ; if OSTYPE=DP + ; db "-DP",#30+REVISION,0 + ; endif + + ; if OSTYPE=BETA + ; db "-BETA",#30+REVISION,0 + ; endif + + ; if OSTYPE=RC + ; db "-RC",#30+REVISION,0 + ; endif + + ; if OSTYPE=RELEASE + ; db "-RELEASE",0 + ; endif + + ; if OSTYPE != RELEASE & OSTYPE != RC & OSTYPE != BETA & OSTYPE != DP + ; db "-UNKNOWN",0 + ; endif diff --git a/DOS/video.asm b/DOS/video.asm new file mode 100644 index 0000000..eb934aa --- /dev/null +++ b/DOS/video.asm @@ -0,0 +1,687 @@ + +;[BEGIN] +;//MODULE: VIDEO +;//CREATE: 19-05-1998 AUTHOR: Denis Parinov +;//UPDATE: 24-10-1999 DNS Restore module +;--------------------------------------------------------------- +;Rev Date Name Description +;--------------------------------------------------------------- +;R01 07-11-2002 DNS FIX BUG WITH SCROLLUP FN. (A=0) +;R02 07-11-2002 DNS CORRECT FN. WINCOPY & WINREST, ADD "DI+EI" +;--------------------------------------------------------------- + +; CLEAR TEXT WINDOW +;===================== +; D - Y +; E - X +; H - HEIGHT +; L - WIDTH +; B - COLOR +; A - ATTR + +CLEAR LD C,#8D + RST #08 + AND A + RET +; + +; PRINT NULL-TERMINATED CHARS STRING +;====================================== +; HL - STRING POINTER + +PCHARS + LD A,(HL) + INC HL + OR A + RET Z + CALL PUTCHAR + JR PCHARS + +; PRINT CHAR +;============== +; A - CHAR + +PUTCHAR + LD B,A + LD C,0x8e + RST 0x08 + LD A,B + CP 0xd + JR Z,CR_ + CP 0xa + JR Z,LF_ + CP 0x9 + JR Z,TB_ + CP 0x8 + JR Z,BK_ + PUSH HL + LD BC,0x182 + RST 0x08 + PUSH AF + LD A,E + CP 0x4f + JP NZ,NLFF + LD A,D + CP 0x1f + JP NZ,NLFF + LD E,0x0 + LD C,0x84 + RST 0x08 + CALL LFF +NLFF + POP AF + POP HL + RET + +BK_ + LD C,0x8e ;GET CURSOR + RST 0x08 + XOR A + CP E + JP Z,LOCATE + DEC E + JP LOCATE + +TB_ + LD C,0x8e + RST 0x08 + LD A,E + ADD A,0x8 + AND 0x78 + LD E,A + JP LOCATE + +CR_ + LD C,0x8e + RST 0x08 + LD E,0x0 + JP LOCATE + +LF_ + LD C,0x8e + RST 0x08 + LD A,D + CP 0x1f + JR NC,LFF + INC D + CALL LOCATE + JR CR_ + +LFF + PUSH HL + LD BC,0x18a + LD DE,0x20 + EI + HALT + DI + RST 0x08 + LD DE,0x1f00 + PUSH DE + CALL LOCATE + LD A,0x20 + LD BC,0x5082 + RST 0x08 + EI + POP DE + CALL LOCATE + POP HL + RET + + +; SET CURRENT CURSOR POSITION +;=============================== +; D = Y +; E = X + +LOCATE + LD C,#84 + RST #08 + RET + +; GET CURRENT CURSOR POSITION +;=============================== +; + +CURSOR + LD C,#8E + RST #08 + RET +; D - Y +; E - X + +; READ CHAR & ATTR FROM THE SCREEN +;============================= +; D - Y +; E - X + +RDCHAR + XOR A + LD C,#B4 + RST #08 + LD A,L + LD B,H + AND A + RET +; A - CHAR +; B - ATTR + +; WRITE CHAR & ATTR TO THE SCREEN +;=================================== +; D - Y +; E - X +; A - CHAR +; B - ATTR + +WRCHAR LD C,A + PUSH BC + PUSH DE + LD C,#B4 + XOR A + RST #08 + POP DE + POP HL + LD C,#B5 + XOR A + RST #08 + AND A + RET + +; COPY WINDOW FROM THE SCREEN +;=============================== +; D - Y +; E - X +; H - HEIGHT +; L - WIDTH +; IX - ADDRESS +; B - PAGE, IF IX > 0C000H + +WINCOPY + LD A,R ;R02 + PUSH AF ;R02 + XOR A + DI ;R02 + LD C,#B2 + RST #08 + POP AF ;R02 + SCF ;R02 + CCF ;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 + +WINREST + LD A,R ;R02 + PUSH AF ;R02 + XOR A + DI ;R02 + LD C,#B3 + RST #08 + POP AF ;R02 + SCF ;R02 + CCF ;R02 + RET PO ;R02 + EI ;R02 + RET + +; SCROLL WINDOWS +;================== +; 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 + XOR A + LD C,0xb7 + DI + RST 0x8 + EI + POP HL + POP DE + POP BC + XOR A + CP B + RET NZ + LD A,D + ADD A,H + DEC A + LD D,A + +SCR1 + PUSH DE + CALL LOCATE + LD A,0x20 + LD B,L + LD C,0x82 + RST 0x8 + POP DE + CALL LOCATE + AND A + RET + + +SCR_DW + DJNZ SCR_ERR + LD B,A + LD C,L + PUSH DE + PUSH BC + LD XH,D + LD XL,E + INC XH + DEC H + XOR A + LD C,0xb7 + DI + RST 0x8 + EI + POP HL + POP DE + XOR A + CP B + JR Z,SCR1 + RET + +SCR_ERR + LD A,1 + SCF + RET + +; SELECT SCREEN PAGE +;====================== +; B - SCREEN PAGE + +SELPAGE + PUSH BC + LD A,(VMODE) + BIT 7,A + JR NZ,SEL2 + LD C,A + CALL TEXT_M +SEL2 POP BC + LD A,B + AND #01 + OUT (#C9),A + RET + +; GET CURRENT VIDEO MODE +;========================== +; +GETVMOD + IN A,(#C9) + LD B,A + LD A,(VMODE) + AND A + RET +; A - MODE +; B - PAGE + +; 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 + JR Z,T_40_32 + DEC A + JR Z,T_80_32 +NOMODE + POP IX + LD A,#30 + SCF + RET + +GRAPH + CALL SAVETXT + AND #7F + JP Z,G320_16 + DEC A + JP Z,G320_56 + DEC A + JP Z,G640_16 + DEC A + JP Z,G640_56 + LD A,#30 + SCF + RET + +T_40_32 + PUSH BC + LD HL,TAB2 + 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 (#C9),A + LD A,(VMODE) + LD C,#81 + RST #30 + LD A,#C0 + OUT (Y_PORT),A + 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 (#C9),A + LD A,(VMODE) + LD C,#81 + RST #30 + LD A,#C0 + OUT (Y_PORT),A + XOR A + RET + +G320_16 + LD A,#30 + SCF + RET + +G320_56 + PUSH BC + LD HL,TAB4 + LD E,#11 + CALL SETMODE + LD HL,TAB8 + LD E,#00 + CALL SETMODE + POP BC + LD A,C + LD (VMODE),A + LD A,B + AND #01 + OUT (#C9),A + LD A,(VMODE) + LD C,#81 + RST #30 + LD A,#C0 + OUT (Y_PORT),A + XOR A + RET + +G640_16 PUSH BC + LD HL,TAB3 + LD E,#11 + CALL SETMODE + LD HL,TAB7 + LD E,#00 + CALL SETMODE + POP BC + LD A,C + LD (VMODE),A + LD A,B + AND #01 + OUT (#C9),A + LD A,(VMODE) + LD C,#81 + RST #30 + LD A,#C0 + OUT (Y_PORT),A + XOR A + RET + +G640_56 LD A,#30 + SCF + 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,0xFEE0 + LD BC,0x0020 + CALL MOVBIOS + POP DE + LD IX,0xFEE0 + LD C,0xB0 + RST 0x08 + LD A,0xC0 + OUT (Y_PORT),A + XOR A + RET + +MOVBIOS LD A,R + IN A,(PAGE3) + EX AF,AF' + LD A,#FE + OUT (PAGE3),A + LDIR + EX AF,AF' + OUT (PAGE3),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) + +;80x32 +TAB1 DB #28,#20,#00,#00,#1B,#00,#00,#00 +;40x32 +TAB2 DB #28,#20,#00,#00,#3B,#00,#00,#00 +;640x256 PAGE 0 +TAB3 DB #28,#20,#00,#00,#00,#00,#00,#00 +;320x256 PAGE 0 +TAB4 DB #28,#20,#00,#00,#20,#00,#00,#00 +;640x256 PAGE 1 +TAB7 DB #28,#20,#00,#00,#40,#00,#28,#00 +;320x256 PAGE 1 +TAB8 DB #28,#20,#00,#00,#60,#00,#28,#00 + +SAVETXT + PUSH AF + LD A,(VMODE) + BIT 0x7,A + JR NZ,NOSAVET + SUB 0x2 + JR C,NOSAVET + PUSH BC + PUSH DE + PUSH HL + PUSH IX + PUSH AF + LD C,0x8e + RST 0x08 + + LD (TCURS),DE + POP AF + LD IX,0xc000 + LD DE,0x0 + LD HL,0x2050 + OR A + JR NZ,SVTEXT1 + LD L,0x28 +SVTEXT1 + LD (SVHL1),HL + LD A,(BANKTBL+TXTPAGE) ;(BANKTBL_2) + LD B,A + XOR A + LD C,0xb2 + DI + RST 0x08 + EI + POP IX + POP HL + POP DE + POP BC +NOSAVET + POP AF + RET + + +BACKTXT + PUSH AF +VVMODE EQU $+1 + LD A,0x0 + RLCA + JR NC,NOBACKT + PUSH BC + PUSH DE + PUSH HL + PUSH IX + LD IX,0xc000 + LD DE,0x0 +SVHL1 EQU $+1 + LD HL,0x2050 + LD A,(BANKTBL+TXTPAGE) + LD B,A + XOR A + LD C,0xb3 + DI + RST 0x8 + EI +TCURS EQU $+1 + LD DE,0x0 + LD C,0x84 + RST 0x8 + POP IX + POP HL + POP DE + POP BC +NOBACKT + POP AF + RET + +; SEND A SYMBOL TO THE PRINTER +;============================== +; A - SYMBOL +; +LPT_A EQU #1B +LPT_B EQU #1C + +PRINT + 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) + LD C,A + ; IN (1Bh): bit 5 - busy, Bit 3 - Ack + ; IN (19h): bit 5 - Paper Enable, Bit 3 - Select + + BIT 5,A + JR NZ,LPTBUSY + AND 0xd8 + JR Z,LPTBUSY + LD A,B + OUT (LPT_B),A + POP AF + SCF + CCF + RET PO + EI + RET + +LPTBUSY + POP AF + LD A,C + SCF + RET PO + EI + RET + +; B - SYMBOL +; CF = 1 - PRINTER BUSY + +PRINT_INIT + DI + LD A,#CF ; port 1F только чеpез LD BC,1F: Out (BC),reg !!! + LD BC,#001F + OUT (C),A + LD A,#63 + OUT (C),A + LD A,#C0 ; Bit 7 - Select (1), Bit 6 - Auto_Line_Feed (1) + OUT (#1E),A + LD A,#0F ; Init printer port for Out + OUT (#1D),A + RET + + +;//MODULE: VIDEO +;[END] diff --git a/README.md b/README.md new file mode 100644 index 0000000..6704661 --- /dev/null +++ b/README.md @@ -0,0 +1,6 @@ +# Sprinter Firmware + +This repository containts source codes recovered and modified by me from latest versions of binary files. + +[DOS Estex](DOS/) +