mirror of
https://github.com/romychs/DemoN.git
synced 2025-04-09 22:06:42 +03:00
398 lines
8.3 KiB
NASM
398 lines
8.3 KiB
NASM
; ======================================================
|
||
; DSS Estex dumb for debug code in VSC with DEZOG plugin
|
||
; By Roman Boykov. Copyright (c) 2024
|
||
; https://github.com/romychs
|
||
; ======================================================
|
||
INCLUDE "dss.inc"
|
||
|
||
ORG 0x0000
|
||
|
||
RESET:
|
||
JP NOT_IMPL
|
||
DS 5, 0xFF
|
||
|
||
RST08:
|
||
JP NOT_IMPL
|
||
DS 5, 0xFF
|
||
|
||
ORG 0x0010
|
||
RST10:
|
||
JP DSS_HANDLER
|
||
DS 5, 0xFF
|
||
|
||
RST18:
|
||
JP NOT_IMPL
|
||
DS 5, 0xFF
|
||
|
||
RST20:
|
||
JP NOT_IMPL
|
||
DS 5, 0xFF
|
||
|
||
RST28:
|
||
JP NOT_IMPL
|
||
DS 5, 0xFF
|
||
|
||
RST30:
|
||
JP NOT_IMPL
|
||
DS 5, 0xFF
|
||
|
||
RST38:
|
||
JP NOT_IMPL
|
||
DS 5, 0xFF
|
||
|
||
DSS_HANDLER
|
||
|
||
PUSH HL
|
||
PUSH BC
|
||
LD A, C
|
||
CP DSS_CURDISK
|
||
JP Z, _CURDISK
|
||
CP 0x0B
|
||
JP Z, _CREATE_FILE
|
||
CP 0x11
|
||
JP Z, _OPEN_FILE
|
||
CP 0x12
|
||
JP Z, _CLOSE_FILE
|
||
CP 0x13
|
||
JP Z, _READ_FILE
|
||
CP 0x14
|
||
JP Z, _WRITE_FILE
|
||
CP 0x19
|
||
JP Z, _FIND_FIRST
|
||
CP 0x1D
|
||
JP Z, _CH_DIR
|
||
CP 0x1E
|
||
JP Z, _CURDIR
|
||
|
||
CP DSS_WAITKEY
|
||
JP Z, _WAITKEY
|
||
|
||
CP DSS_SCANKEY
|
||
JP Z, _SCANKEY
|
||
|
||
CP DSS_ECHOKEY
|
||
JP Z, _ECHOKEY
|
||
|
||
CP DSS_SETVMOD
|
||
JP Z, _SETVMOD
|
||
|
||
CP DSS_GSWITCH
|
||
JP Z, _GSWITCH
|
||
|
||
CP DSS_GETVMOD
|
||
JP Z, _GETVMOD
|
||
|
||
CP low DSS_CLEAR
|
||
JP Z, _CLEAR
|
||
|
||
CP DSS_PUTCHAR
|
||
JP Z, _PUTCHAR
|
||
|
||
CP DSS_PCHARS
|
||
JP Z, _PCHARS
|
||
|
||
CP 0x41
|
||
JP Z, _EXIT
|
||
|
||
POP BC
|
||
POP HL
|
||
|
||
|
||
NOT_IMPL
|
||
LD A,0x01
|
||
SCF
|
||
RET
|
||
|
||
_PUTCHAR
|
||
LD BC, 0x9000
|
||
OUT (C),A
|
||
JR NORM_EXIT
|
||
|
||
|
||
_PCHARS
|
||
LD BC, 0x9000
|
||
|
||
NXT_PCHAR
|
||
LD A, (HL)
|
||
OUT (C),A
|
||
INC HL
|
||
OR A
|
||
JR NZ, NXT_PCHAR
|
||
|
||
NORM_EXIT
|
||
AND A ; CF=0
|
||
POP BC
|
||
POP HL
|
||
RET
|
||
|
||
BAD_EXIT
|
||
SCF
|
||
POP BC
|
||
POP HL
|
||
RET
|
||
|
||
|
||
_CURDISK
|
||
LD A, 3
|
||
JP NORM_EXIT
|
||
|
||
; Входные значения:
|
||
; HL - указатель на файловую спецификацию
|
||
; A - атрибут файла
|
||
; Выходные значения:
|
||
; A — код ошибки, если CF=1
|
||
; A - файловый манипулятор, если CF=0
|
||
_CREATE_FILE
|
||
JP _OPEN_FILE
|
||
|
||
; Входные значения:
|
||
; HL - указатель на файловую спецификацию
|
||
; A - режим доступа
|
||
; A=0 чтение/запись
|
||
; A=1 чтение
|
||
; A=2 запись
|
||
; Выходные значения:
|
||
; A - код ошибки, если CF=1
|
||
; A - файловый манипулятор, если CF=0
|
||
CUR_FILE_MAN
|
||
DB 0x4F
|
||
|
||
CUR_DIR
|
||
DB "\\FOLDER",0
|
||
CUR_DIR_END
|
||
CUR_DIR_SIZE EQU CUR_DIR_END-CUR_DIR
|
||
|
||
_OPEN_FILE
|
||
LD HL, CUR_FILE_MAN
|
||
INC (HL)
|
||
LD A, (HL)
|
||
JP NORM_EXIT
|
||
|
||
_CLOSE_FILE
|
||
JP NORM_EXIT
|
||
|
||
CUR_F_PTR
|
||
DW ZIP_FILE
|
||
|
||
REMAINS_IN_ZIP
|
||
DW 0
|
||
|
||
; Входные значения:
|
||
; A - файловый манипулятор
|
||
; HL - адрес в памяти
|
||
; DE - количество читаемых байт
|
||
; Выходные значения:
|
||
; A - код ошибки, если CF=1
|
||
; DE - реальное количество прочитанных байт
|
||
; если CF=0:
|
||
; A = 0 прочитаны все байты
|
||
; A = 0FFh прочитано меньшее число байт
|
||
_READ_FILE
|
||
OR A
|
||
JP Z, BAD_EXIT
|
||
PUSH DE
|
||
POP BC ; BC - bytes to read
|
||
PUSH HL
|
||
|
||
LD HL, (CUR_F_PTR) ; HL -> IN ZIP_FILE
|
||
LD DE, ZIP_FILE_END
|
||
EX HL, DE
|
||
SUB HL, DE ; HL = remain bytes
|
||
LD (REMAINS_IN_ZIP), HL
|
||
SBC HL, BC
|
||
LD A, 0
|
||
JR NC, NO_OUT_OF_ZIP
|
||
DEC A
|
||
LD HL,(REMAINS_IN_ZIP)
|
||
LD BC, HL
|
||
|
||
NO_OUT_OF_ZIP
|
||
LD HL, (CUR_F_PTR)
|
||
POP DE ; DE - Buffer to write
|
||
PUSH BC
|
||
LDIR
|
||
POP DE ; DE = bytes read, A = 0 or 0xFF
|
||
LD (CUR_F_PTR), HL
|
||
|
||
JP NORM_EXIT
|
||
|
||
|
||
; Входные значения:
|
||
; A - файловый манипулятор
|
||
; HL - адрес в памяти
|
||
; DE - количество записываемых байт
|
||
; Выходные значения:
|
||
; A - код ошибки, если CF=1
|
||
; DE - реальное количество записанных байт
|
||
_WRITE_FILE
|
||
|
||
PUSH DE
|
||
POP BC
|
||
LD DE,UNZIP_FILE
|
||
|
||
PUSH BC
|
||
LDIR
|
||
POP DE
|
||
JP NORM_EXIT
|
||
|
||
; Входные значения:
|
||
; HL - указатель на файловую спецификацию
|
||
; Выходные значения:
|
||
; A - код ошибки, если CF=1
|
||
_CH_DIR
|
||
JP NORM_EXIT
|
||
|
||
|
||
; 1Eh (30) CURDIR (Информация о текущем каталоге)
|
||
; Входные значения:
|
||
; HL - буфер в памяти 256 байт
|
||
; Выходные значения:
|
||
; A - код ошибки, если CF=1
|
||
_CURDIR
|
||
PUSH DE
|
||
LD DE, CUR_DIR
|
||
EX HL,DE
|
||
LD BC, CUR_DIR_SIZE
|
||
LDIR
|
||
POP DE
|
||
JP NORM_EXIT
|
||
|
||
_ECHOKEY
|
||
PUSH HL
|
||
LD HL,EC
|
||
LD C,DSS_PCHARS
|
||
RST DSS
|
||
POP HL
|
||
LD A,(EC)
|
||
JP NORM_EXIT
|
||
|
||
EC DB "3",0
|
||
|
||
; Входные значения:
|
||
; HL - указатель на файловую спецификацию
|
||
; DE - рабочий буфер 44 байта, если B=0, иначе 256 байт
|
||
; A - атрибуты, используемые при поиске
|
||
; B = 0 - имя найденного файла в формате 11 байт "FilenameExt"
|
||
; B = 1 - имя найденного файла в формате DOS "filename.ext",0
|
||
; C - 19h
|
||
; Выходные значения:
|
||
; A - код ошибки, если CF=1
|
||
_FIND_FIRST
|
||
PUSH DE
|
||
LD HL, 33 ; offset of file name
|
||
ADD HL, DE
|
||
EX HL, DE
|
||
LD HL, ZIP_FILE_NAME
|
||
LD BC,9
|
||
LDIR
|
||
POP DE
|
||
JP NORM_EXIT
|
||
|
||
|
||
_SCANKEY
|
||
XOR A
|
||
JP NORM_EXIT
|
||
|
||
|
||
; Выходные значения:
|
||
; A - код символа
|
||
; D - позиционный код
|
||
; Е - ASCII код
|
||
; C - режим клавиатуры:
|
||
_WAITKEY
|
||
XOR A
|
||
LD D, A
|
||
LD C, A
|
||
LD E,65
|
||
LD A,65
|
||
JP NORM_EXIT
|
||
|
||
|
||
CUR_VMOD
|
||
DB 1
|
||
|
||
; 50h (80) SETVMOD (Выбор режима экрана)
|
||
; Входные значения:
|
||
; A - режим экрана:
|
||
; 02h - текстовый 40x32x16 цветов;
|
||
; 03h - текстовый 80x32x16 цветов;
|
||
; 81h - графический 320x256x256 цветов;
|
||
; 82h - графический 640x256x16 цветов;
|
||
; B - страница экрана 0/1
|
||
; C - 50h
|
||
; Выходные значения:
|
||
; A - код ошибки, если CF=1
|
||
_SETVMOD
|
||
LD (CUR_VMOD),A
|
||
JP NORM_EXIT
|
||
|
||
; 51h (81) GETVMOD (Получить текущий режим экрана)
|
||
; Входные значения:
|
||
; C - 51h
|
||
; Выходные значения:
|
||
; A - код ошибки, если CF=1
|
||
; A - текущий режим экрана, если CF=0
|
||
; B - страница экрана 0/1
|
||
_GETVMOD
|
||
LD A,(CUR_VMOD)
|
||
JP NORM_EXIT
|
||
|
||
; 56h (86) CLEAR (Очистка окна)
|
||
; Входные значения:
|
||
; D - строка левого верхнего угла окна
|
||
; E - столбец левого верхнего угла окна
|
||
; H - высота окна
|
||
; L - ширина окна
|
||
; B - атрибут заполнитель
|
||
; A - символ заполнитель
|
||
; C - 56h
|
||
; Выходные значения:
|
||
; нет
|
||
_CLEAR
|
||
JP NORM_EXIT
|
||
|
||
|
||
_EXIT
|
||
; LOGPOINT STOPPED!
|
||
|
||
HALT
|
||
JP _EXIT
|
||
|
||
; GSWITCH (Выделить параметр командной строки)
|
||
; Входные значения:
|
||
; HL - указатель командной строки
|
||
; DE - буфер для выделяемого параметра
|
||
; C - 43h
|
||
; Выходные значения:
|
||
; HL - указатель на следующий параметр командной строки
|
||
; CF = 0 - конец строки не достигнут (есть другие параметры)
|
||
; CF = 1 - конец строки (в буфер перенесён последний параметр или ноль)
|
||
|
||
_GSWITCH
|
||
LD HL,CMD_LINE1+1
|
||
PUSH DE
|
||
.next
|
||
LD A, (HL)
|
||
LD (DE), A
|
||
OR A
|
||
JR Z,.enough
|
||
INC HL
|
||
INC DE
|
||
JR .next
|
||
.enough
|
||
POP DE
|
||
JP BAD_EXIT
|
||
|
||
|
||
|
||
CMD_LINE1
|
||
DB " myfile.exe",0
|
||
ZIP_FILE_NAME
|
||
DB "file.zip",0
|
||
ZIP_FILE
|
||
DS 1024,0
|
||
ZIP_FILE_END
|
||
UNZIP_FILE
|
||
DS 1024,0
|
||
|
||
ALIGN 16384, 0 |