Initial commit

This commit is contained in:
boykovra 2024-05-27 11:03:22 +03:00
commit 8003040904
29 changed files with 10443 additions and 0 deletions

54
DOS/README.md Normal file
View File

@ -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

24
DOS/a.bat Normal file
View File

@ -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

5
DOS/bios.inc Normal file
View File

@ -0,0 +1,5 @@
; -------------------------------------
; BIOS Definitions
; -------------------------------------
SYSPAGE EQU #FE

16
DOS/build.inc Normal file
View File

@ -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

150
DOS/cerror.asm Normal file
View File

@ -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

23
DOS/changes.log Normal file
View File

@ -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

267
DOS/disk_x.asm Normal file
View File

@ -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

412
DOS/dos-main.asm Normal file
View File

@ -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]

1691
DOS/dos5.asm Normal file

File diff suppressed because it is too large Load Diff

78
DOS/dos_equ.asm Normal file
View File

@ -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

1023
DOS/dos_fm.asm Normal file

File diff suppressed because it is too large Load Diff

330
DOS/dos_x.asm Normal file
View File

@ -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]

146
DOS/drv_main.asm Normal file
View File

@ -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]

104
DOS/dss.inc Normal file
View File

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

62
DOS/dss_map.txt Normal file
View File

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

251
DOS/environ.asm Normal file
View File

@ -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]

40
DOS/errors.inc Normal file
View File

@ -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) - зарезервирова

1208
DOS/execute.asm Normal file

File diff suppressed because it is too large Load Diff

482
DOS/fat_x.asm Normal file
View File

@ -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]

366
DOS/fdd_drv0.asm Normal file
View File

@ -0,0 +1,366 @@
; Disk Driver Specification ver. 2.00
;[]===========================================================[]
;Procedure : Initialization
;
;Function : Initialization device(s)
;
;Input : C = 00h
; IX - Environment
;Output : A = Amount drive support
; HL = Size driver
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Open
;
;Function : Open disk
;
;Input : C = 01h
; A - Drive
;Output : None
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Close
;
;Function : Close disk
;
;Input : C = 02h
; A - Drive
;Output : None
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Media check
;
;Function : Checking change line
;
;Input : C = 03h
; A - Drive
;Output : A = 00h disk no changed
; A = 0FFh disk changed
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Get BPB
;
;Function : Get Block Parameters BIOS
;
;Input : C = 04h
; DE - Address
;Output : None
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Input
;
;Function : Input from disk
;
;Input : C = 05h
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
;Output : None
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Output
;
;Function : Output to disk
;
;Input : C = 06h
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
;Output : None
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Removable
;
;Function : Checking change line
;
;Input : C = 07h
; A - Drive
;Output : A = 00h Removable
; A = FFh Nonremovable
;
;[]===========================================================[]
;[]===========================================================[]
;Procedure : Generic IOCTL
;
;Function : Generic Input Output Control
;
;Input : C = 08h
; B - Subcommand
; DE = 55AAh Magic Number
; Subcommand
;----------------------
; 00h - Get Device Parameters
; 01h - Read track
; 02h - Test track
; 80h - Set Device Parameters
; 81h - Write track
; 82h - Format track
;Output :
;
;[]===========================================================[]
;
; Errors:
; 0 (00h) - NO ERRORS
; 1 (01h) - BAD COMMAND
; 2 (02h) - BAD DRIVE NUMBER
; 3 (03h) - UNKNOW FORMAT
; 4 (04h) - NOT READY
; 5 (05h) - SEEK ERROR
; 6 (06h) - SECTOR NOT FOUND
; 7 (07h) - CRC ERROR
; 8 (08h) - WRITE PROTECT
; 9 (09h) - READ ERROR
; 10 (0Ah) - WRITE ERROR
; 11 (0Bh) - FAILURE
; 12 (0Ch) - BUSY (DEVICE OPENED)
; 13 (0Dh) - RESERVED
R_COM EQU #0F ;Command/Status
R_TRK EQU #3F ;Track
R_SEC EQU #5F ;Sector
R_DAT EQU #7F ;Data
R_DSK EQU #FF ;Drive Control
COM_B EQU #1B
FDDRIVE
INC C
DEC C
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
;==============================================

7
DOS/hardware.inc Normal file
View File

@ -0,0 +1,7 @@
;Memory ports
PAGE0 EQU #82
PAGE1 EQU #A2
PAGE2 EQU #C2
PAGE3 EQU #E2

696
DOS/ide_drv0.asm Normal file
View File

@ -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
;=======================================================

930
DOS/intmouse.asm Normal file
View File

@ -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]

891
DOS/keyinter.asm Normal file
View File

@ -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]

12
DOS/known.bug Normal file
View File

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

443
DOS/ram_drv0.asm Normal file
View File

@ -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

39
DOS/release.inc Normal file
View File

@ -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

687
DOS/video.asm Normal file
View File

@ -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]

6
README.md Normal file
View File

@ -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/)