DemoN/dss.asm
2024-08-08 14:52:38 +03:00

398 lines
8.3 KiB
NASM
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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