mirror of
https://github.com/romychs/sprinter-unzip.git
synced 2025-04-18 01:52:42 +03:00
Initial commit
This commit is contained in:
parent
53a4f1da92
commit
f88fc0e5ff
10
.gitignore
vendored
Normal file
10
.gitignore
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
*.dos
|
||||||
|
*.sna
|
||||||
|
*.lst
|
||||||
|
*.sld
|
||||||
|
*.obj
|
||||||
|
*.labels
|
||||||
|
*.tmp
|
||||||
|
*.EXE
|
||||||
|
*.exe
|
||||||
|
*.bin
|
10
.vscode/extensions.json
vendored
Normal file
10
.vscode/extensions.json
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"recommendations": [
|
||||||
|
"maziac.asm-code-lens",
|
||||||
|
"maziac.dezog",
|
||||||
|
"maziac.hex-hover-converter",
|
||||||
|
"maziac.z80-instruction-set",
|
||||||
|
"maziac.sna-fileviewer",
|
||||||
|
"maziac.nex-fileviewer",
|
||||||
|
]
|
||||||
|
}
|
94
.vscode/launch.json
vendored
Normal file
94
.vscode/launch.json
vendored
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"type": "dezog",
|
||||||
|
"request": "launch",
|
||||||
|
"name": "Internal Simulator",
|
||||||
|
"remoteType": "zsim",
|
||||||
|
"zsim": {
|
||||||
|
"visualMemory": true,
|
||||||
|
"memoryModel": "CUSTOM",
|
||||||
|
"customMemory": {
|
||||||
|
"slots": [
|
||||||
|
{
|
||||||
|
"name": "PAGE0",
|
||||||
|
"range": ["0x0000","0x3FFF"],
|
||||||
|
"banks": [{"index": [0, 255]}],
|
||||||
|
"initialBank": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "PAGE1",
|
||||||
|
"range": ["0x4000","0x7FFF"],
|
||||||
|
"banks": [{"index": [0, 255]}],
|
||||||
|
"initialBank": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "PAGE2",
|
||||||
|
"range": ["0x8000","0xBFFF"],
|
||||||
|
"banks": [{"index": [0, 255]}],
|
||||||
|
"initialBank": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "PAGE3",
|
||||||
|
"range": ["0xC000","0xFFFF"],
|
||||||
|
"banks": [{"index": [0, 255]}],
|
||||||
|
"initialBank": 3
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"ioMmu": [
|
||||||
|
"if (portAddress == 0x82) {",
|
||||||
|
" bank = portValue;",
|
||||||
|
" PAGE0 = bank;",
|
||||||
|
"}",
|
||||||
|
"if (portAddress == 0xA2) {",
|
||||||
|
" bank = portValue;",
|
||||||
|
" PAGE1 = bank;",
|
||||||
|
"}",
|
||||||
|
"if (portAddress == 0xC2) {",
|
||||||
|
" bank = portValue;",
|
||||||
|
" PAGE2 = bank;",
|
||||||
|
"}",
|
||||||
|
"if (portAddress == 0xE2) {",
|
||||||
|
" bank = portValue;",
|
||||||
|
" PAGE3 = bank;",
|
||||||
|
"}"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"customCode": {
|
||||||
|
"debug": false,
|
||||||
|
"jsPath": "sim/ports.js"
|
||||||
|
//"uiPath": "simulation/ui.html"
|
||||||
|
},
|
||||||
|
//"ulaScreen": true,
|
||||||
|
//"zxBorderWidth": 20,
|
||||||
|
//"vsyncInterrupt": true,
|
||||||
|
//"zxKeyboard": true,
|
||||||
|
//"zxBeeper": true
|
||||||
|
},
|
||||||
|
"sjasmplus": [
|
||||||
|
{
|
||||||
|
"path": "unzip.sld"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"history": {
|
||||||
|
"reverseDebugInstructionCount": 1000000,
|
||||||
|
"spotCount": 10,
|
||||||
|
"codeCoverageEnabled": true
|
||||||
|
},
|
||||||
|
"startAutomatically": false,
|
||||||
|
"commandsAfterLaunch": [],
|
||||||
|
"rootFolder": "${workspaceFolder}",
|
||||||
|
"topOfStack": "STACK_TOP",
|
||||||
|
"loadObjs": [
|
||||||
|
{
|
||||||
|
"path": "unzip.obj",
|
||||||
|
"start": "0x0000"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"execAddress": "0x8100",
|
||||||
|
"smallValuesMaximum": 513,
|
||||||
|
"tmpDir": ".tmp"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
41
.vscode/tasks.json
vendored
Normal file
41
.vscode/tasks.json
vendored
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"version": "2.0.0",
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"label": "make (sjasmplus)",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "sjasmplus",
|
||||||
|
"args": [
|
||||||
|
"--sld=unzip.sld",
|
||||||
|
"--sym=unzip.labels",
|
||||||
|
"--raw=unzip.obj",
|
||||||
|
"--fullpath",
|
||||||
|
"unzip.asm"
|
||||||
|
],
|
||||||
|
"problemMatcher": {
|
||||||
|
"owner": "sjasmplus",
|
||||||
|
"fileLocation": "autoDetect",
|
||||||
|
"pattern": {
|
||||||
|
"regexp": "^(.*)\\((\\d+)\\):\\s+(warning|error):\\s+(.*)$",
|
||||||
|
"file": 1,
|
||||||
|
"line": 2,
|
||||||
|
"severity": 3,
|
||||||
|
"message": 4
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"group": {
|
||||||
|
"kind": "build",
|
||||||
|
"isDefault": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "start mame",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "while true; do ./mame spectrum -window -debugger gdbstub -debug -debugger_port 12000 -verbose -resolution 512x384 ; sleep 2 ; done",
|
||||||
|
"options": {
|
||||||
|
"cwd": "${config:mame_dir}"
|
||||||
|
},
|
||||||
|
"problemMatcher": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
4
README.md
Normal file
4
README.md
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
UNZIP for Sprinter
|
||||||
|
==================
|
||||||
|
|
||||||
|
Dizassembled code from UNZIP.EXE v0.7 for Sprinter computer.
|
189
bios.asm
Normal file
189
bios.asm
Normal file
@ -0,0 +1,189 @@
|
|||||||
|
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 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 0x5C
|
||||||
|
JP Z, _PCHARS
|
||||||
|
CP 0x41
|
||||||
|
JP Z, _EXIT
|
||||||
|
|
||||||
|
POP BC
|
||||||
|
POP HL
|
||||||
|
|
||||||
|
|
||||||
|
NOT_IMPL
|
||||||
|
LD A,0x01
|
||||||
|
SCF
|
||||||
|
RET
|
||||||
|
|
||||||
|
_PCHARS
|
||||||
|
LD BC, 0x9000
|
||||||
|
|
||||||
|
NXT_PCHAR
|
||||||
|
LD A, (HL)
|
||||||
|
OUT (C),A
|
||||||
|
INC HL
|
||||||
|
OR A
|
||||||
|
JR NZ, NXT_PCHAR
|
||||||
|
|
||||||
|
NORM_EXIT
|
||||||
|
CCF
|
||||||
|
POP BC
|
||||||
|
POP HL
|
||||||
|
RET
|
||||||
|
|
||||||
|
BAD_EXIT
|
||||||
|
SCF
|
||||||
|
POP BC
|
||||||
|
POP HL
|
||||||
|
RET
|
||||||
|
|
||||||
|
|
||||||
|
; Входные значения:
|
||||||
|
; HL - указатель на файловую спецификацию
|
||||||
|
; A - атрибут файла
|
||||||
|
; Выходные значения:
|
||||||
|
; A — код ошибки, если CF=1
|
||||||
|
; A - файловый манипулятор, если CF=0
|
||||||
|
_CREATE_FILE
|
||||||
|
JP DSS_OPEN_FILE
|
||||||
|
|
||||||
|
; Входные значения:
|
||||||
|
; HL - указатель на файловую спецификацию
|
||||||
|
; A - режим доступа
|
||||||
|
; A=0 чтение/запись
|
||||||
|
; A=1 чтение
|
||||||
|
; A=2 запись
|
||||||
|
; Выходные значения:
|
||||||
|
; A - код ошибки, если CF=1
|
||||||
|
; A - файловый манипулятор, если CF=0
|
||||||
|
CUR_FILE_MAN
|
||||||
|
DB 0x4F
|
||||||
|
|
||||||
|
_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
|
||||||
|
|
||||||
|
|
||||||
|
_EXIT
|
||||||
|
; LOGPOINT STOPPED!
|
||||||
|
|
||||||
|
HALT
|
||||||
|
JP _EXIT
|
||||||
|
|
||||||
|
ALIGN 16384, 0
|
44
sim/ports.js
Normal file
44
sim/ports.js
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
port_p0 = 0;
|
||||||
|
port_p1 = 1;
|
||||||
|
port_p2 = 2;
|
||||||
|
port_p3 = 3;
|
||||||
|
message = "";
|
||||||
|
|
||||||
|
// This function is called when time (t-states) advances.
|
||||||
|
API.tick = () => {
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function is called when an 'out' is executed in Z80.
|
||||||
|
API.writePort = (port, value) => {
|
||||||
|
// Go through all ports
|
||||||
|
if (port == 0x9000) {
|
||||||
|
if (value != 0) {
|
||||||
|
message += String.fromCharCode(value);
|
||||||
|
} else {
|
||||||
|
API.log("> " + message);
|
||||||
|
message = "";
|
||||||
|
}
|
||||||
|
} else if (port == 0x82) {
|
||||||
|
port_p0 = value;
|
||||||
|
} else if (port == 0xA2) {
|
||||||
|
port_p1 = value;
|
||||||
|
} else if (port == 0xC2) {
|
||||||
|
port_p2 = value;
|
||||||
|
} else if (port == 0xE2) {
|
||||||
|
port_p3 = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
API.readPort = (port) => {
|
||||||
|
if (port == 0x82) {
|
||||||
|
return port_p0;
|
||||||
|
} else if (port == 0xA2) {
|
||||||
|
return port_p1;
|
||||||
|
} else if (port == 0xC2) {
|
||||||
|
return port_p2;
|
||||||
|
} else if (port == 0xE2) {
|
||||||
|
return port_p3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
37
test_data.asm
Normal file
37
test_data.asm
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
|
||||||
|
ORG 0x4000
|
||||||
|
|
||||||
|
ZIP_FILE
|
||||||
|
DB 0x50, 0x4B, 0x03, 0x04, 0x14, 0x00, 0x04, 0x00, 0x08, 0x00, 0xC9, 0xA3, 0xBA, 0x58, 0xA0, 0xE8, 0xCD, 0xD3, 0xEA, 0x00
|
||||||
|
DB 0x00, 0x00, 0x7B, 0x02, 0x00, 0x00, 0x05, 0x00, 0x1C, 0x00, 0x31, 0x2E, 0x61, 0x73, 0x6D, 0x55, 0x54, 0x09, 0x00, 0x03
|
||||||
|
DB 0xA9, 0x71, 0x53, 0x66, 0xE6, 0x58, 0x68, 0x66, 0x75, 0x78, 0x0B, 0x00, 0x01, 0x04, 0xE8, 0x03, 0x00, 0x00, 0x04, 0xE8
|
||||||
|
DB 0x03, 0x00, 0x00, 0xB5, 0x91, 0xC1, 0x8E, 0xC2, 0x30, 0x0C, 0x44, 0xCF, 0xE3, 0xAF, 0x40, 0xE2, 0x52, 0xA4, 0x1C, 0x58
|
||||||
|
DB 0x90, 0xB8, 0xA7, 0x49, 0x2A, 0x8A, 0xD2, 0x50, 0x25, 0x01, 0x01, 0x17, 0xFE, 0xFF, 0x2F, 0xD6, 0x71, 0x4B, 0xD9, 0x20
|
||||||
|
DB 0x71, 0xDC, 0x53, 0xD3, 0xD8, 0xF3, 0xE2, 0x19, 0xE7, 0x94, 0x9F, 0xDB, 0x1F, 0x42, 0x1F, 0xA0, 0x55, 0x63, 0x86, 0xF3
|
||||||
|
DB 0x25, 0xB9, 0x0D, 0x21, 0x46, 0xA3, 0x57, 0x84, 0xD3, 0x88, 0x60, 0x54, 0xAE, 0x7A, 0xEC, 0xAB, 0xC7, 0x5B, 0x38, 0xA5
|
||||||
|
DB 0x09, 0x6D, 0x9F, 0x71, 0x28, 0x07, 0x63, 0x3A, 0xD6, 0x44, 0x97, 0x11, 0x1E, 0x44, 0xA2, 0xDA, 0x7D, 0x25, 0xC7, 0x85
|
||||||
|
DB 0xBC, 0xF4, 0xFC, 0x25, 0xDB, 0xEF, 0x64, 0xF0, 0xC3, 0x5A, 0x39, 0x82, 0x0E, 0x16, 0xEB, 0x7D, 0x47, 0xE5, 0x42, 0x26
|
||||||
|
DB 0x91, 0x82, 0x9F, 0x0B, 0xDB, 0xFD, 0x62, 0x63, 0x76, 0x73, 0x8E, 0x60, 0x55, 0xD5, 0x6C, 0x6B, 0x8A, 0xBC, 0x5A, 0x53
|
||||||
|
DB 0xCC, 0x27, 0x65, 0x86, 0xBD, 0x99, 0xCC, 0x60, 0x49, 0x25, 0x8D, 0x5E, 0xE2, 0xFB, 0xF8, 0xB8, 0x34, 0xE5, 0x74, 0x12
|
||||||
|
DB 0xEF, 0x29, 0xB7, 0x17, 0x42, 0xE2, 0xB4, 0x4A, 0x78, 0xE5, 0x0F, 0x75, 0xBF, 0xD8, 0x2B, 0x2E, 0x98, 0xDE, 0x0C, 0xED
|
||||||
|
DB 0x46, 0x22, 0xD6, 0xDE, 0xB3, 0x26, 0xA4, 0xC9, 0x88, 0xC4, 0x20, 0xE5, 0x9B, 0x94, 0x65, 0xF4, 0x69, 0x9E, 0x66, 0xB8
|
||||||
|
DB 0xCB, 0x55, 0x7A, 0x2D, 0x85, 0x57, 0x43, 0xB8, 0xBB, 0xF1, 0x69, 0xE3, 0xB5, 0x20, 0xB5, 0x5A, 0x77, 0x9C, 0x5D, 0x1F
|
||||||
|
DB 0x0C, 0x8E, 0x9C, 0x99, 0x19, 0xD1, 0x1C, 0x7D, 0x59, 0xFD, 0xB4, 0xBF, 0xFF, 0x2E, 0xAC, 0xE8, 0x17, 0x50, 0x4B, 0x01
|
||||||
|
DB 0x02, 0x1E, 0x03, 0x14, 0x00, 0x04, 0x00, 0x08, 0x00, 0xC9, 0xA3, 0xBA, 0x58, 0xA0, 0xE8, 0xCD, 0xD3, 0xEA, 0x00, 0x00
|
||||||
|
DB 0x00, 0x7B, 0x02, 0x00, 0x00, 0x05, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xB4, 0x81, 0x00
|
||||||
|
DB 0x00, 0x00, 0x00, 0x31, 0x2E, 0x61, 0x73, 0x6D, 0x55, 0x54, 0x05, 0x00, 0x03, 0xA9, 0x71, 0x53, 0x66, 0x75, 0x78, 0x0B
|
||||||
|
DB 0x00, 0x01, 0x04, 0xE8, 0x03, 0x00, 0x00, 0x04, 0xE8, 0x03, 0x00, 0x00, 0x50, 0x4B, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00
|
||||||
|
DB 0x01, 0x00, 0x01, 0x00, 0x4B, 0x00, 0x00, 0x00, 0x29, 0x01, 0x00, 0x00, 0x00, 0x00
|
||||||
|
ZIP_FILE_END
|
||||||
|
|
||||||
|
CMD_LINE1
|
||||||
|
DB 20, " C:\\FOLDER\\ FILE.ZIP", 0
|
||||||
|
|
||||||
|
CMD_LINE2
|
||||||
|
DB 19, " C:\\FOLDER\\FILE.ZIP", 0
|
||||||
|
|
||||||
|
|
||||||
|
UNZIP_FILE
|
||||||
|
DS 1024, 0
|
||||||
|
|
||||||
|
ALIGN 16384, 0
|
Loading…
Reference in New Issue
Block a user