Compare commits

..

8 Commits

Author SHA1 Message Date
boykovra
0a3eb0225e Refactoring code for best reuse in other utilities 2024-07-11 18:57:55 +03:00
boykovra
8d5f374035 Init, buffer TX and RX procedures debug complete 2024-07-11 15:41:51 +03:00
boykovra
2a422f7a39 wterm 1-st impl 2024-07-09 15:16:15 +03:00
boykovra
89b92be3f6 debug tx-cmd subroutine 2024-07-01 20:39:19 +03:00
boykovra
fcda0b02d4 upc1 2024-07-01 16:09:12 +03:00
Roman Boykov
5a153d3b29 Footprint changes for better soldering 2024-02-13 10:49:46 +03:00
f5e216b6a4
Update README.md 2023-01-18 11:07:22 +03:00
064e19c22a
Update README.md 2023-01-18 11:06:19 +03:00
30 changed files with 6476 additions and 12274 deletions

8
.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
*.exe
*.sld
*.labels
*.tmp
*.bak
*.lst
*.list
.tmp/

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 544 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 395 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 556 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 395 KiB

Binary file not shown.

BIN
Gerber/Gerber_v1.0.5.zip Normal file

Binary file not shown.

View File

@ -6,9 +6,9 @@
![image](Export/sprinter-esp.jpg) ![image](Export/sprinter-esp.jpg)
[Принципиальная схема](Export/Schematic_Sprinter-ESP_v1.0.3.pdf) [Принципиальная схема](Export/Schematic_Sprinter-ESP_v1.0.4.pdf)
[Монтажная схема](Export/PCB_Sprinter-ESP-v1.0.3.pdf) [Монтажная схема](Export/PCB_Sprinter-ESP-v1.0.4.pdf)
[Спринтер в Телеграм](https://t.me/zx_sprinter) [Спринтер в Телеграм](https://t.me/zx_sprinter)
@ -17,5 +17,6 @@
Часто, модули с Ali идут без прошивки ESP-AT. В таком виде карта Sprinter Wi-Fi работать не будет, модуль ESP нужно прошить. Инструкция в [документе](Docs/ESP-module-flashing.pdf). Часто, модули с Ali идут без прошивки ESP-AT. В таком виде карта Sprinter Wi-Fi работать не будет, модуль ESP нужно прошить. Инструкция в [документе](Docs/ESP-module-flashing.pdf).
## Изменения ## Изменения
V *1.0.3* Устранена ошибка с перепутанными сигналами RTS и CTS. В [документе](Docs/rts-cts-fix.pdf) описано, как это исправить на старых версиях платы. * _v1.0.3_ Устранена ошибка с перепутанными сигналами RTS и CTS. В [документе](Docs/rts-cts-fix.pdf) описано, как это исправить на старых версиях платы.
V *1.0.4* Добавлен контакт VCC на разъеме X2 для подачи напряжения 5В при программировании ESP через внешний USB-TTL UART адаптер. * _v1.0.4_ Добавлен контакт VCC на разъеме X2 для подачи напряжения 5В при программировании ESP через внешний USB-TTL UART адаптер.
* _v1.0.5_ Косметические изменения для удобства пайки.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

173
Sources/ESPLib/.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,173 @@
{
"version": "0.2.0",
"configurations": [
// {
// "type": "dezog",
// "request": "launch",
// "name": "WSET 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"
// },
// },
// "sjasmplus": [
// {
// "path": "espset.sld"
// }
// ],
// "history": {
// "reverseDebugInstructionCount": 1000000,
// "spotCount": 10,
// "codeCoverageEnabled": true
// },
// "startAutomatically": false,
// "commandsAfterLaunch": [],
// "rootFolder": "${workspaceFolder}",
// "topOfStack": "STACK_TOP",
// "loadObjs": [
// {
// "path": "espset.exe",
// "start": "0x0000"
// }
// ],
// "execAddress": "0x8100",
// "smallValuesMaximum": 513,
// "tmpDir": ".tmp"
// },
{
"type": "dezog",
"request": "launch",
"name": "WTERM 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"
},
},
"sjasmplus": [
{
"path": "wterm.sld"
}
],
"history": {
"reverseDebugInstructionCount": 1000000,
"spotCount": 10,
"codeCoverageEnabled": true
},
"startAutomatically": false,
"commandsAfterLaunch": [],
"rootFolder": "${workspaceFolder}",
"topOfStack": "STACK_TOP",
"loadObjs": [
{
"path": "wterm.exe",
"start": "0x0000"
}
],
"execAddress": "0x8100",
"smallValuesMaximum": 513,
"tmpDir": ".tmp"
}
]
}

70
Sources/ESPLib/.vscode/tasks.json vendored Normal file
View File

@ -0,0 +1,70 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "make ESPSET (sjasmplus)",
"type": "shell",
"command": "sjasmplus",
"args": [
"--sld=espset.sld",
"--sym=espset.labels",
"--raw=espset.exe",
"--fullpath",
"espset.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": "make WTERM (sjasmplus)",
"type": "shell",
"command": "sjasmplus",
"args": [
"--sld=wterm.sld",
"--sym=wterm.labels",
"--raw=wterm.exe",
"--fullpath",
"wterm.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": []
}
]
}

349
Sources/ESPLib/dss.asm Normal file
View File

@ -0,0 +1,349 @@
; ======================================================
; DSS Estex dumb for debug code in VSC with DEZOG plugin
; By Roman Boykov. Copyright (c) 2024
; https://github.com/romychs
; ======================================================
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_ECHOKEY
JP Z, _ECHOKEY
CP DSS_SETVMOD
JP Z, _SETVMOD
CP DSS_GETVMOD
JP Z, _GETVMOD
CP low DSS_CLEAR
JP Z, _CLEAR
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
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
; Выходные значения:
; 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
ZIP_FILE_NAME
DB "file.zip",0
ZIP_FILE
DS 1024,0
ZIP_FILE_END
UNZIP_FILE
DS 1024,0
ALIGN 16384, 0

41
Sources/ESPLib/dss.inc Normal file
View File

@ -0,0 +1,41 @@
; ======================================================
; Defines for DSS Estex for Sprinter computer
; By Roman Boykov. Copyright (c) 2024
; https://github.com/romychs
; ======================================================
; DSS RST Entry
DSS EQU 0x10
; DSS Functions
DSS_CURDISK EQU 0x02
DSS_CREATE_FILE EQU 0x0B
DSS_OPEN_FILE EQU 0x11
DSS_CLOSE_FILE EQU 0x12
DSS_READ_FILE EQU 0x13
DSS_WRITE EQU 0x14
DSS_MOVE_FP_CP EQU 0x0115
DSS_FIND_FIRST EQU 0x0119
DSS_FIND_NEXT EQU 0x011A
DSS_MKDIR EQU 0x1B
DSS_CHDIR EQU 0x1D
DSS_CURDIR EQU 0x1E
DSS_ECHOKEY EQU 0x32
DSS_EXIT EQU 0x41
DSS_WAITKEY EQU 0x48
DSS_SETVMOD EQU 0x50
DSS_GETVMOD EQU 0x51
DSS_CLEAR EQU 0x56
DSS_PCHARS EQU 0x5C
DSS_VMOD_T40 EQU 0x02 ; text 40x32, 16 colors
DSS_VMOD_T80 EQU 0x03 ; text 80x32, 16 colors
DSS_VMOD_G320 EQU 0x81 ; graphics 320x256, 256 colors
DSS_VMOD_G640 EQU 0x82 ; graphics 640x256, 16 colors
; DSS Error codes
E_FILE_EXISTS EQU 7
E_FILE_NOT_FOUND EQU 3

View File

@ -1,283 +1,483 @@
; =========================================== ; ======================================================
; SOLID C Lbrary to work with Sprinter WiFi ; Library for Sprinter-WiFi ESP ISA Card
; ESP ISA Card ; By Roman Boykov. Copyright (c) 2024
; =========================================== ; https://github.com/romychs
; License: BSD 3-Clause
; ======================================================
DEVICE NOSLOT64K ;ISA_BASE_A EQU 0xC000 ; Базовый адрес портов ISA в памяти
;INCLUDE "ports.inc" PORT_UART EQU 0x03E8 ; Базовый номер порта COM3
PORT_UART_A EQU ISA_BASE_A + PORT_UART ; Порты чипа UART в памяти
PORT_ISA EQU 0x9FBD ; UART TC16C550 Registers in memory
PORT_SYSTEM EQU 0x1FFD REG_RBR EQU PORT_UART_A
PORT_MEM_W3 EQU 0xE2 REG_THR EQU PORT_UART_A
REG_IER EQU PORT_UART_A + 1
REG_IIR EQU PORT_UART_A + 2
REG_FCR EQU PORT_UART_A + 2
REG_LCR EQU PORT_UART_A + 3
REG_MCR EQU PORT_UART_A + 4
REG_LSR EQU PORT_UART_A + 5
REG_MSR EQU PORT_UART_A + 6
REG_SCR EQU PORT_UART_A + 7
REG_DLL EQU PORT_UART_A
REG_DLM EQU PORT_UART_A + 1
REG_AFR EQU PORT_UART_A + 2
ISA_BASE_A EQU 0xC000 ; Базовый адрес портов ISA в памяти
PORT_UART EQU 0x03E8 ; Базовый номер порта COM3
PORT_UART_A EQU ISA_BASE_A + PORT_UART ; Порты чипа UART в памяти
; Регистры UART TC16C550 в памяти
REG_RBR EQU PORT_UART_A + 0
REG_THR EQU PORT_UART_A + 0
REG_IER EQU PORT_UART_A + 1
REG_IIR EQU PORT_UART_A + 2
REG_FCR EQU PORT_UART_A + 2
REG_LCR EQU PORT_UART_A + 3
REG_MCR EQU PORT_UART_A + 4
REG_LSR EQU PORT_UART_A + 5
REG_MSR EQU PORT_UART_A + 6
REG_SCR EQU PORT_UART_A + 7
REG_DLL EQU PORT_UART_A + 0
REG_DLM EQU PORT_UART_A + 1
REG_AFR EQU PORT_UART_A + 2
BAUD_RATE EQU 115200 ; Скорость соединения с ESP8266 ; UART TC16C550 Register bits
XIN_FREQ EQU 14745600 ; Частота генератора для TL16C550 MCR_DTR EQU 0x01
DIVISOR EQU XIN_FREQ / (BAUD_RATE * 16) ; Делитель частоты для передачи/приема данных MCR_RTS EQU 0x02
MCR_RST EQU 0x04
MCR_PGM EQU 0x08
MCR_LOOP EQU 0x10
MCR_AFE EQU 0x20
LCR_WL8 EQU 0x03 ; 8 bits word len
LCR_SB2 EQU 0x04 ; 1.5 or 2 stp bits
LCR_DLAB EQU 0x80 ; Enable Divisor latch
FCR_FIFO EQU 0x01 ; Enable FIFO for rx and tx
FCR_RESET_RX EQU 0x02 ; Reset Rx FIFO
FCR_RESET_TX EQU 0x04 ; Reset Tx FIFO
FCR_DMA EQU 0x08 ; Set -RXRDY, -TXRDY to "1"
FCR_TR1 EQU 0x00 ; Trigger on 1 byte in fifo
FCR_TR4 EQU 0x40 ; Trigger on 4 bytes in fifo
FCR_TR8 EQU 0x80 ; Trigger on 8 bytes in fifo
FCR_TR14 EQU 0xC0 ; Trigger on 14 bytes in fifo
LSR_DR EQU 0x01 ; Data Ready
LSR_OE EQU 0x02 ; Overrun Error
LSR_PE EQU 0x04 ; Parity Error
LSR_FE EQU 0x08 ; Framing Error
LSR_BI EQU 0x10 ; Break Interrupt
LSR_THRE EQU 0x20 ; Transmitter Holding Register Empty
LSR_TEMT EQU 0x40 ; Transmitter empty
LSR_RCVE EQU 0x80 ; Error in receiver FIFO
ORG 0x0000 ; Speed divider for UART
jp main BAUD_RATE EQU 115200 ; Скорость соединения с ESP8266
XIN_FREQ EQU 14745600 ; Частота генератора для TL16C550
DIVISOR EQU XIN_FREQ / (BAUD_RATE * 16) ; Делитель частоты для передачи/приема данных
save_mmu3 DB 0 ; Variable to save memory page RS_BUFF_SIZE EQU 2048 ; Receive buffer size
MAX_BUFF_SIZE EQU 16384
; =============================================== LSTR_SIZE EQU 20 ; Size of buffer for last response line
; Small delay LF EQU 0x0A
; void delay(hl) CR EQU 0x0D
; in hl - number of cycles, if hl=0, then 2000
; ===============================================
MODULE delay
delay_:
push af
ld a,h
or l
jp nz,delay_l1
ld hl,2000
delay_l1: dec hl
ld a,h
or l
jp nz,delay_l1
pop af
ret
ENDMODULE
; =============================================== ; --
; Reset ISA device RES_OK EQU 0
; =============================================== RES_ERROR EQU 1
MODULE reset_isa RES_FAIL EQU 2
reset_isa_: RES_TX_TIMEOUT EQU 3
push af RES_RS_TIMEOUT EQU 4
push bc RES_CONNECTED EQU 5
push hl RES_NOT_CONN EQU 6
ld bc, PORT_ISA RES_ENABLED EQU 7
ld a, 0xC0 ; RESET=1 AEN=1 RES_DISABLED EQU 8
out (c), a
ld hl,2000
call delay.delay_
xor a
out (c), a ; RESET=0 AEN=0
add hl,hl
call delay.delay_
pop hl
pop bc
pop af
ret
ENDMODULE
; ===============================================
; Open access to ISA ports as memory
; input a = 0 - ISA slot 0, 1 - ISA SLOT 1
; ===============================================
MODULE open_isa
open_isa_:
push af
push bc
PORT_EMM_WIN_P3in_p3
in a,(c)
ld (save_mmu3), a
push bc
ld bc, PORT_SYSTEM
ld a, 0x11
out (c), a
PORT_MEM_W3 ; em m_win_p3
pop af
and a, 0x01
rlca
rlca
or a, 0xd0 ; 1101 - Magic number, 0100 - 0,ISA PORT, ISA SLOT, 0
out (c), a
ld bc, PORT_SYSTEM
xor a
out (c), a
pop bc
ret
ENDMODULE
; =============================================== MODULE WIFI
; Close access to ISA ports
; ===============================================
MODULE close_isa
close_isa_:
push af
push bc
ld bc, PORT_SYSTEM
ld a, 0x01
out (c), a
ld a, save_mmu3
PORT_EMM_WIN_P3in_p3
out (c), a
pop bc
pop af
ret
ENDMODULE
; =============================================== ; -- UART Registers offset
; Init ISA device
; ===============================================
MODULE init_isa
init_isa_:
call reset_isa.reset_isa_ ; just only reset
ret
ENDMODULE
; =============================================== _RBR EQU 0
; Init UART device TL16C550 _THR EQU 0
; =============================================== _IER EQU 1
MODULE init_serial _IIR EQU 2
init_serial_: _FCR EQU 2
push af _LCR EQU 3
push hl _MCR EQU 4
call open_isa.open_isa_ _LSR EQU 5
ld a, 1 _MSR EQU 6
ld (REG_FCR _SCR EQU 7
a ; 8 byte FIFO buffer _DLL EQU 0
ld a, 0x81 _DLM EQU 1
ld (REG_FCR _AFR EQU 2
a
xor a
ld (REG_IER
), a ; Disable interrupts
; Set baud rate
ld a, 0x83
ld (REG_LCR), a ; enable Baud rate latch
ld a, DIVISOR
ld (REG_DLL), a ; 8 - 115200
xor a
ld (REG_DLM), a
ld a, 0x03 ; disable Baud rate latch & 8N1
ld (REG_LCR), a
; reset ESP ; ------------------------------------------------------
ld a,0x06 ; ESP -PGM=1, -RTS=0 ; Find TL550C in ISA slot
ld (REG_MCR), a ; Out: CF=1 - Not found, CF=0 - ISA.ISA_SLOT found in slot
ld hl,2000 ; ------------------------------------------------------
call delay.delay_ UART_FIND
ld a,0x02 ; ESP -RST=1, -RTS=0 PUSH HL
call delay.delay_ XOR A
call close_isa.close_isa_ CALL UT_T_SLOT
pop hl JR Z, UF_T_FND
pop af LD A,1
ret CALL UT_T_SLOT
ENDMODULE JR Z, UF_T_FND
SCF
UF_T_FND
POP HL
RET
; =============================================== ; Test slot, A - ISA Slot no. 0 or 1
; Read TL16C550 register UT_T_SLOT
; char read_reg(reg) ; check IER hi bits, will be 0
; input hl - register no LD (ISA.ISA_SLOT), A
; output a - value from register LD HL, REG_IER
; =============================================== CALL UART_READ
MODULE read_reg AND 0xF0
read_reg_: RET NZ
call open_isa.open_isa_
ld a, (hl)
call close_isa.close_isa_
ret
ENDMODULE
; =============================================== ; check SCR register
; Write TL16C550 register LD DE,0x5555
; void write_reg(reg, b) CALL CHK_SCR
; input hl - reg no, e - value RET NZ
; =============================================== LD DE,0xAAAA
MODULE write_reg CALL CHK_SCR
write_reg_: RET
call open_isa.open_isa_
ld (hl), e
call close_isa.close_isa_
ret
ENDMODULE
; =============================================== CHK_SCR
; Wait for transmitter ready LD HL, REG_SCR
; char wait_tr() CALL UART_WRITE
; output a = 0 - tr not ready, !=0 - tr ready CALL UART_READ
; =============================================== CP D
MODULE wait_tr RET
wait_tr_:
push bc
push hl
ld bc, 100
ld hl, REG_LSR
wait_tr_r:
call read_reg.read_reg_
and a, 0x20
jp nz,wait_tr_e
dec bc
ld a, c
or b
jp nz,wait_tr_r
xor a
wait_tr_e:
pop hl
pop bc
ret
ENDMODULE
; ===============================================
; Empty receiver FIFO buffer
; void empty_rs()
; ===============================================
MODULE empty_rs
empty_rs_:
push af
call open_isa.open_isa_
ld a, 0x83
ld (REG_FCR
a
call close_isa.close_isa_
pop af
ret
ENDMODULE
; ===============================================
; Wait byte in receiver fifo
; char wait_rs()
; output a=0 - fifo still empty, a!=0 - receiver fifo is not empty
; ===============================================
MODULE wait_rs
wait_rs_:
push bc
push hl
ld bc, 1000
ld hl, REG_LSR
wait_rs_r:
call read_reg.read_reg_
and a, 0x01
jp nz,wait_rs_e
dec bc
ld a, c
or b
jp nz,wait_rs_r
xor a
wait_rs_e:
pop hl
pop bc
ret
ENDMODULE
; =============================================== ; ------------------------------------------------------
; STUB ; Init UART device TL16C550
; =============================================== ; ------------------------------------------------------
UART_INIT
PUSH AF, IX
main: CALL ISA.ISA_OPEN
call init_isa.init_isa_ LD IX, PORT_UART_A
ret LD A, FCR_TR8 | FCR_FIFO ; Enable FIFO buffer, trigger to 14 byte
LD (IX+_FCR),A
XOR A
LD (IX+_IER), A ; Disable interrupts
; Set 8bit word and Divisor for speed
LD A, LCR_DLAB | LCR_WL8
LD (IX+_LCR), A ; Enable Baud rate latch
LD A, DIVISOR
LD (IX+_DLL), A ; 8 - 115200
XOR A
LD (IX+_DLM), A
LD A, LCR_WL8 ; 8bit word, disable latch
LD (IX+_LCR), A
CALL ISA.ISA_CLOSE
POP IX,AF
RET
; ------------------------------------------------------
; Read TL16C550 register
; Inp: HL - register
; Out: A - value from register
; ------------------------------------------------------
UART_READ
CALL ISA.ISA_OPEN
LD A, (HL)
CALL ISA.ISA_CLOSE
RET
; ------------------------------------------------------
; Write TL16C550 register
; Inp: HL - register, E - value
; ------------------------------------------------------
UART_WRITE
CALL ISA.ISA_OPEN
LD (HL), E
CALL ISA.ISA_CLOSE
RET
; ------------------------------------------------------
; Wait for transmitter ready
; Out: CF=1 - tr not ready, CF=0 ready
; ------------------------------------------------------
UART_WAIT_TR
CALL ISA.ISA_OPEN
CALL UART_WAIT_TR_INT
CALL ISA.ISA_CLOSE
RET
;
; Wait, without open/close ISA
;
UART_WAIT_TR_INT
PUSH AF, BC, HL
LD BC, 500
LD HL, REG_LSR
WAIT_TR_BZY
LD A,(HL)
AND A, LSR_THRE
JR NZ,WAIT_TR_RDY
CALL UTIL.DELAY_100uS ; ~11 bit tx delay
DEC BC
LD A, C
OR B
JR NZ,WAIT_TR_BZY
SCF
WAIT_TR_RDY
POP HL, BC, AF
RET
; ------------------------------------------------------
; Transmit byte
; Inp: E - byte
; Out: CF=1 - Not ready
; ------------------------------------------------------
UART_TX_BYTE
CALL UART_WAIT_TR
JP C, UTB_NOT_R
LD HL, REG_THR
CALL UART_WRITE
XOR A
UTB_NOT_R
RET
; ------------------------------------------------------
; Transmit buffer
; Inp: HL -> buffer, BC - size
; Out: CF=0 - Ok, CF=1 - Timeout
; ------------------------------------------------------
UART_TX_BUFFER
PUSH BC,DE,HL
LD DE, REG_THR
CALL ISA.ISA_OPEN
UTX_NEXT
; buff not empty?
LD A, B
OR C
JR Z,UTX_EMP
; check transmitter ready
CALL UART_WAIT_TR_INT
JR C, UTX_TXNR
; transmitt byte
LD A,(HL)
INC HL
LD (DE),A
DEC BC
JR UTX_NEXT
; CF=0
UTX_EMP
AND A
UTX_TXNR
CALL ISA.ISA_CLOSE
POP HL,DE,BC
RET
; ------------------------------------------------------
; Transmit zero ended string
; Inp: HL -> buffer
; Out: CF=0 - Ok, CF=1 - Timeout
; ------------------------------------------------------
UART_TX_STRING
PUSH DE,HL
LD DE, REG_THR
CALL ISA.ISA_OPEN
UTXS_NEXT
LD A,(HL)
AND A
JR Z,UTXS_END
; check transmitter ready
CALL UART_WAIT_TR_INT
JR C, UTXS_TXNR
; transmitt byte
LD A,(HL)
INC HL
LD (DE),A
JR UTXS_NEXT
; CF=0
UTXS_END
AND A
UTXS_TXNR
CALL ISA.ISA_CLOSE
POP HL,DE
RET
; ------------------------------------------------------
; Empty receiver FIFO buffer
; ------------------------------------------------------
UART_EMPTY_RS
PUSH DE, HL
LD E, FCR_TR8 | FCR_RESET_RX | FCR_FIFO
LD HL, REG_FCR
CALL UART_WRITE
POP HL, DE
RET
; ------------------------------------------------------
; Wait byte in receiver fifo
; Inp: BC - Wait ms
; Out: CF=1 - Timeout, FIFO is EMPTY
; ------------------------------------------------------
UART_WAIT_RS1
PUSH BC,HL
WAIT_MS+* LD BC,0x2000
JR UVR_NEXT
UART_WAIT_RS
PUSH BC,HL
UVR_NEXT
LD HL, REG_LSR
CALL UART_READ
AND LSR_DR
JR NZ,UVR_OK
CALL UTIL.DELAY_1MS
DEC BC
LD A,B
OR C
JR NZ,UVR_NEXT
UVR_TO
IF TRACE
PUSH AF,BC,DE,HL
PRINTLN MSG_RCV_EMPTY
POP HL,DE,BC,AF
ENDIF
SCF
UVR_OK
POP HL,BC
RET
; ------------------------------------------------------
; Reset ESP module
; ------------------------------------------------------
ESP_RESET
PUSH AF,HL
CALL ISA.ISA_OPEN
LD HL, REG_MCR
LD A, MCR_RST ;| MCR_RTS ; -OUT1=0 -> RESET ESP
LD (REG_MCR), A
CALL UTIL.DELAY_1MS
LD A, MCR_AFE | MCR_RTS ; 0x22 -OUT1=1 RTS=1 AutoFlow enabled
LD (HL), A
CALL ISA.ISA_CLOSE
; wait 2s for ESP firmware boot
LD HL,2000
CALL UTIL.DELAY
POP HL,AF
RET
; Receive block size
BSIZE DW 0
; Received message for OK result
MSG_OK DB "OK", 0
; Received message for Error
MSG_ERROR DB "ERROR", 0
; Received message for Failure
MSG_FAIL DB "FAIL", 0
; ------------------------------------------------------
; UART TX Command
; Inp: HL - ptr to command,
; DE - ptr to receive buffer,
; BC - wait ms
; Out: CF=1 if Error
; ------------------------------------------------------
UART_TX_CMD
PUSH BC, DE, HL
LD A, low RS_BUFF_SIZE
LD (BSIZE), A
LD A, high RS_BUFF_SIZE
LD (BSIZE+1), A
;LD (RESBUF),DE
XOR A
LD (DE), A
LD (WAIT_MS), BC
CALL UART_EMPTY_RS
; HL - Buffer, BC - Size
;CALL UTIL.STRLEN
CALL UART_TX_STRING
JR NC, UTC_STRT_RX
; error, transmit timeout
LD A, RES_TX_TIMEOUT
JR UTC_RET
UTC_STRT_RX
; no transmit timeout, receive response
; IX - pointer to begin of current line
LD IXH, D
LD IXL, E
LD BC,(BSIZE)
UTC_RCV_NXT
; wait receiver ready
;LD BC,(WAIT_MS)
CALL UART_WAIT_RS1
JR NC, UTC_NO_RT
; error, read timeout
LD A, RES_RS_TIMEOUT
JR UTC_RET
; no receive timeout
UTC_NO_RT
; read symbol from tty
LD HL, REG_RBR
CALL UART_READ
CP CR
JP Z, UTC_RCV_NXT ; Skip CR
CP LF
JR Z, UTC_END ; LF - last symbol in responce
LD (DE),A
INC DE
DEC BC
LD A, B
OR C
JR NZ, UTC_RCV_NXT
UTC_END
XOR A
LD (DE),A ; temporary mark end of string
PUSH DE ; store DE
POP IY
PUSH IX
POP DE ; DE - ptr to begin pf current line
; It is 'OK<LF>'?
LD HL, MSG_OK
CALL UTIL.STRCMP
JR NC, UTC_RET
; It is 'ERROR<LF>'?
LD HL,MSG_ERROR
CALL UTIL.STRCMP
JR C, UTC_CP_FAIL
LD A, RES_ERROR
; It is 'FAIL<LF>'?
JR UTC_RET
UTC_CP_FAIL
LD HL,MSG_FAIL
CALL UTIL.STRCMP
JR C, UTC_NOMSG
LD A, RES_FAIL
JR UTC_RET
UTC_NOMSG
; no resp message, continue receive
PUSH IY
POP DE
LD A, LF
LD (DE),A ; change 0 - EOL to LF
INC DE
LD IXH,D ; store new start line ptr
LD IXL,E
JR UTC_RCV_NXT
UTC_RET
POP HL, DE, BC
RET
IF TRACE
MSG_RCV_EMPTY
DB "Receiver is empty!",0
ENDIF
; Buffer to receive response from ESP
RS_BUFF DS RS_BUFF_SIZE, 0
ENDMODULE

View File

@ -1,83 +0,0 @@
#pragma nonrec
#define port_isa 0x9FBD
#define port_system 0x1FFD
#define isa_addr_base 0xC000
#define com3_addr_base 0x3E8
#define emm_win_p3 0xE2
#define port_serial 0xC3E8
#define RBR port_serial
#define THR port_serial
#define IER port_serial+1
#define IIR port_serial+2
#define FCR port_serial+2
#define LCR port_serial+3
#define MCR port_serial+4
#define LSR port_serial+5
#define MSR port_serial+6
#define SCR port_serial+7
#define DLL port_serial
#define DLM port_serial+1
#define AFR port_serial+2
#define BAUD_RATE 115200
#define XIN_FREQ 14745600
#define DIVISOR XIN_FREQ / (BAUD_RATE * 16)
/**
* Small delay
*/
void delay();
/**
* Reset ISA device
*/
void reset_isa();
/*
* Open access to ISA ports as memory
*/
void open_isa();
/*
* Close access to ISA ports
*/
void close_isa();
/*
* Init ISA device
*/
void init_isa();
/*
* Init UART device TL16C550
*/
void init_serial();
/*
* Read TL16C550 register
*/
char read_reg();
/*
* Write TL16C550 register
*/
void write_reg();
/*
* Wait for transmitter ready
*/
void wait_tr();
/*
* Clear receiver FIFO buffer
*/
void empty_rs();
/*
* Wait byte in receiver fifo
*/
void wait_rs();

301
Sources/ESPLib/espset.asm Normal file
View File

@ -0,0 +1,301 @@
; ======================================================
; ESPSET for Sprinter-WiFi for Sprinter computer
; By Roman Boykov. Copyright (c) 2024
; https://github.com/romychs
; License: BSD 3-Clause
; ======================================================
; Set to 1 to turn debug ON with DeZog VSCode plugin
; Set to 0 to compile .EXE
DEBUG EQU 0
; Set to 1 to output TRACE messages
TRACE EQU 1
; Version of EXE file, 1 for DSS 1.70+
EXE_VERSION EQU 0
; Timeout to wait ESP response
DEFAULT_TIMEOUT EQU 2000
SLDOPT COMMENT WPMEM, LOGPOINT, ASSERTION
DEVICE NOSLOT64K
IF DEBUG == 1
INCLUDE "dss.asm"
DB 0
ALIGN 16384, 0
DS 0x80, 0
ENDIF
INCLUDE "macro.inc"
INCLUDE "dss.inc"
INCLUDE "sprinter.inc"
MODULE MAIN
ORG 0x8080
; ------------------------------------------------------
EXE_HEADER
DB "EXE"
DB EXE_VERSION ; EXE Version
DW 0x0080 ; Code offset
DW 0
DW 0 ; Primary loader size
DW 0 ; Reserved
DW 0
DW 0
DW START ; Loading Address
DW START ; Entry Point
DW STACK_TOP ; Stack address
DS 106, 0 ; Reserved
ORG 0x8100
@STACK_TOP
; ------------------------------------------------------
START
IF DEBUG == 1
; LD IX,CMD_LINE1
LD SP, STACK_TOP
ENDIF
CALL ISA.ISA_RESET
PRINTLN MSG_START
CALL FIND_SWF
; Turn local echo Off
CALL INIT_ESP
; Display main menu to make selection
MENU_AGAIN
CALL SELECT_MAIN_MENU
; Do somethink with selected item
AND A
JR Z, MENU_EXIT
DEC A
JP Z, MENU_SELECT_WIFI
DEC A
JP Z, MENU_CONFIGURE_IP
DEC A
JP Z, MENU_DISPLAY_INFO
JP MENU_AGAIN
MENU_EXIT
LD B,0
JP EXIT
MENU_SELECT_WIFI
MENU_CONFIGURE_IP
MENU_DISPLAY_INFO
JP MENU_AGAIN
NO_TL_FOUND
PRINTLN MSG_SWF_NOF
LD B,2
JP EXIT
CHECK_ERROR
RET NC
ADD A,'0'
LD (COMM_ERROR_NO), A
PRINTLN MSG_COMM_ERROR
LD B,3
POP HL ; ret addr reset
EXIT
LD C,DSS_EXIT
RST DSS
FIND_SWF
; Find Sprinter-WiFi
CALL WIFI.UART_FIND
JP C, NO_TL_FOUND
LD A,(ISA.ISA_SLOT)
ADD A,'1'
LD (MSG_SLOT_NO),A
PRINTLN MSG_SWF_FOUND
LD C,DSS_PCHARS
RST DSS
RET
; ------------------------------------------------------
; Init basic parameters of ESP
; ------------------------------------------------------
INIT_ESP
PUSH BC, DE
LD DE, WIFI.RS_BUFF
LD BC, DEFAULT_TIMEOUT
TRACELN MSG_ECHO_OFF
SEND_CMD CMD_ECHO_OFF
TRACELN MSG_STATIOJN_MODE
SEND_CMD CMD_STATION_MODE
TRACELN MSG_NO_SLEEP
SEND_CMD CMD_NO_SLEEP
TRACELN MSG_SET_UART
SEND_CMD CMD_SET_SPEED
TRACELN MSG_SET_OPT
SEND_CMD CMD_CWLAP_OPT
POP DE,BC
RET
; ------------------------------------------------------
; Set DHCP mode
; Out: CF=1 if error
; ------------------------------------------------------
SET_DHCP_MODE
PUSH BC,DE
LD DE, WIFI.RS_BUFF
LD BC, DEFAULT_TIMEOUT
TRACELN MSG_SET_DHCP
SEND_CMD CMD_SET_DHCP
POP DE,BC
RET
; ------------------------------------------------------
; Output main menu to select user action
; Ret: A = selected menu item
; ------------------------------------------------------
SELECT_MAIN_MENU
PUSH BC
PRINTLN MSG_MAIN_MENU
SMM_L1
PRINT MSG_ENT_NO
; SCANF
LD C, DSS_ECHOKEY
RST DSS
SUB '0'
; Test A in range [0..3]
AND A
JP M, SMM_L1
CP 4
JP P, SMM_L1
POP BC
RET
; ------------------------------------------------------
; Messages DB "\r\n1 - Select WiFi Network\r\n"
DB "2 - Configure IP parameters\r\n"
DB "3 - Display info\r\n"
DB "0 - Exit",0
; ------------------------------------------------------
MSG_START
DB "Setup for Sprinter-WiFi by Sprinter Team, ", __DATE__ ,"\r\n", 0
MSG_SWF_NOF
DB "Sprinter-WiFi not found!",0
MSG_SWF_FOUND
DB "Sprinter-WiFi found in ISA#"
MSG_SLOT_NO
DB "n slot.",0
MSG_COMM_ERROR
DB "Error communication with Sprinter-WiFi #"
COMM_ERROR_NO
DB "n!",0
MSG_MAIN_MENU
DB "\r\n1 - Select WiFi Network\r\n"
DB "2 - Configure IP parameters\r\n"
DB "3 - Display info\r\n"
DB "0 - Exit",0
MSG_ENT_NO
DB "\r\nEnter number 0..3: ",0
; ------------------------------------------------------
; Debug messages
; ------------------------------------------------------
IF TRACE
MSG_ECHO_OFF
DB "Echo off",0
MSG_STATIOJN_MODE
DB "Station mode",0
MSG_NO_SLEEP
DB "No sleep",0
MSG_SET_UART
DB "Setup uart",0
MSG_SET_OPT
DB "Set options",0
MSG_SET_DHCP
DB "Set DHCP mode",0
ENDIF
; ------------------------------------------------------
; Commands
; ------------------------------------------------------
CMD_SET_SPEED
DB "AT+UART_CUR=115200,8,1,0,3\r\n",0
CMD_ECHO_OFF
DB "ATE0\r\n",0
CMD_STATION_MODE
DB "AT+CWMODE=1\r\n",0
CMD_NO_SLEEP
DB "AT+SLEEP=0\r\n",0
CMD_CHECK_CONN_AP
DB "AT+CWJAP?\r\n",0
CMD_CWLAP_OPT
DB "AT+CWLAPOPT=1,23\r\n",0
CMD_GET_AP_LIST
DB "AT+CWLAP\r\n",0
CMD_GET_DHCP
DB "AT+CWDHCP?\r\n",0
CMD_SET_DHCP
DB "AT+CWDHCP=1,1\r\n",0
CMD_GET_IP
DB "AT+CIPSTA?\r\n",0
LINE_END
DB "\r\n",0
IF DEBUG == 1
CMD_TEST1 DB "ATE0\r\n",0
BUFF_TEST1 DS RS_BUFF_SIZE,0
ENDIF
ENDMODULE
INCLUDE "util.asm"
INCLUDE "isa.asm"
INCLUDE "esplib.asm"
END MAIN.START
; PUSH IX ; IX ptr to cmd line
; POP HL
; INC HL ; Skip size of Command line
; LD DE,ZIP_FILE
; CALL GET_CMD_PARAM
; JR C,INVALID_CMDLINE
; LD DE,FILES_TO_ZIP
; CALL GET_CMD_PARAM
; JR C,INVALID_CMDLINE

80
Sources/ESPLib/isa.asm Normal file
View File

@ -0,0 +1,80 @@
; ======================================================
; ISA Library for Sprinter computer
; By Roman Boykov. Copyright (c) 2024
; https://github.com/romychs
; License: BSD 3-Clause
; ======================================================
PORT_ISA EQU 0x9FBD
PORT_SYSTEM EQU 0x1FFD
ISA_BASE_A EQU 0xC000 ; Базовый адрес портов ISA в памяти
; --- PORT_ISA bits
ISA_A14 EQU 0x01
ISA_A15 EQU 0x02
ISA_A16 EQU 0x04
ISA_A17 EQU 0x08
ISA_A18 EQU 0x10
ISA_A19 EQU 0x20
ISA_AEN EQU 0x40
ISA_RST EQU 0x80
MODULE ISA
; ------------------------------------------------------
; Reset ISA device
; ------------------------------------------------------
ISA_RESET
LD BC, PORT_ISA
LD A,ISA_RST | ISA_AEN ; RESET=1 AEN=1
OUT (C), A
CALL UTIL.DELAY_1MS
XOR A
OUT (C), A ; RESET=0 AEN=0
LD HL,100
CALL UTIL.DELAY
RET
; ------------------------------------------------------
; Open access to ISA ports as memory
; Inp: A = 0 - ISA slot 0, 1 - ISA SLOT 1
; ------------------------------------------------------
ISA_OPEN
PUSH AF,BC
LD BC, PAGE3
IN A,(C)
LD (SAVE_MMU3), A
LD BC, PORT_SYSTEM
LD A, 0x11
OUT (C), A
ISA_SLOT+* LD A,0x01
SLA A
OR A, 0xD4 ; D4 - ISA1, D6 - ISA2
LD BC, PAGE3
OUT (C), A
LD BC, PORT_ISA
XOR A
OUT (C), A
POP BC,AF
RET
; ------------------------------------------------------
; Close access to ISA ports
; ------------------------------------------------------
ISA_CLOSE
PUSH AF,BC
LD A,0x01
LD BC,PORT_SYSTEM
OUT (C),A
LD BC,PAGE3
LD A,(SAVE_MMU3)
OUT (C),A
POP BC,AF
RET
; To save memory page 3
SAVE_MMU3 DB 0
ENDMODULE

39
Sources/ESPLib/macro.inc Normal file
View File

@ -0,0 +1,39 @@
; ======================================================
; Macros for Sprinter-WiFi utilities
; By Roman Boykov. Copyright (c) 2024
; https://github.com/romychs
; License: BSD 3-Clause
; ======================================================
; Transmit data|command via UART and check response
MACRO SEND_CMD data
LD HL, data
CALL WIFI.UART_TX_CMD
CALL CHECK_ERROR
ENDM
; Print data ASCIIZ string to screen
MACRO PRINT data
LD HL,data
LD C,DSS_PCHARS
RST DSS
ENDM
; Print data ASCIIZ string to screen and CR+LF
MACRO PRINTLN data
LD HL,data
LD C,DSS_PCHARS
RST DSS
LD C,DSS_PCHARS
LD HL, WCOMMON.LINE_END
RST DSS
ENDM
; Print data ASCIIZ string to screen if TRACE enabled
MACRO TRACELN data
IF TRACE == 1
PUSH BC,DE
PRINTLN data
POP DE,BC
ENDIF
ENDM

View 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;
}
}

View File

@ -0,0 +1,32 @@
; ======================================================
; Defines for Sprinter computer hardware
; By Roman Boykov. Copyright (c) 2024
; https://github.com/romychs
; ======================================================
; Memory pages
PAGE0_ADDR EQU 0x0000
PAGE1_ADDR EQU 0x4000
PAGE2_ADDR EQU 0x8000
PAGE3_ADDR EQU 0xC000
; Sprinter ports to switch mem pages
PAGE0 EQU 0x82
PAGE1 EQU 0xA2
PAGE2 EQU 0xC2
PAGE3 EQU 0xE2
; CTC Control register ports
CTC_CH0 EQU 0x10
CTC_CH1 EQU 0x11
CTC_CH2 EQU 0x12
CTC_CH3 EQU 0x13
CTC_CR_VEC EQU 0x01 ; 1 - Vector, 0 - Control
CTC_CR_SWR EQU 0x02 ; 1 - Software Reset, 0 - Continued operation
CTC_CR_TCF EQU 0x04 ; 1 - TYime const follows
CTC_CR_TTR EQU 0x08 ; 1 - Time trigger
CTC_CT_TRE EQU 0x10 ; 1 - Trigger Edge
CTC_CT_PRE EQU 0x20 ; 1 - 256 Prescaler, 0 - 16
CTC_CT_CTR EQU 0x40 ; 0 - Timer, 1 - Counter
CTC_CT_EI EQU 0x80 ; Interrupt 1 - enable, 0 - disable

184
Sources/ESPLib/util.asm Normal file
View File

@ -0,0 +1,184 @@
; ======================================================
; Utility code for Sprinter-WiFi utilities
; By Roman Boykov. Copyright (c) 2024
; https://github.com/romychs
; License: BSD 3-Clause
; ======================================================
MODULE UTIL
; ------------------------------------------------------
; Small delay
; Inp: HL - number of cycles, if HL=0, then 2000
; ------------------------------------------------------
DELAY
PUSH AF,BC,HL
LD A,H
OR L
JR NZ,DELAY_NXT
LD HL,20
DELAY_NXT
CALL DELAY_1MS_INT
DEC HL
LD A,H
OR L
JP NZ,DELAY_NXT
POP HL,BC,AF
RET
DELAY_1MS_INT
LD BC,400
SBD_NXT
DEC BC
LD A, B
OR C
JR NZ, SBD_NXT
RET
DELAY_1MS
PUSH BC
CALL DELAY_1MS_INT
POP BC
RET
DELAY_100uS
PUSH BC
LD BC,40
CALL SBD_NXT
POP BC
RET
; ------------------------------------------------------
; Calc length of zero ended string
; Inp: HL - pointer to string
; Out: BC - length of string
; ------------------------------------------------------
STRLEN
PUSH DE,HL,HL
LD BC,MAX_BUFF_SIZE
XOR A
CPIR
POP DE
SUB HL,DE ; llength of zero ended string
LD BC,HL
LD A, B
OR C
JR Z, STRL_NCOR
DEC BC
STRL_NCOR
POP HL,DE
RET
; ------------------------------------------------------
; Compare zero-ended strings
; Inp: HL, DE - pointers to strinngs to compare
; Out: CF=0 - equal, CF=1 - not equal
; ------------------------------------------------------
STRCMP
PUSH DE,HL
STC_NEXT
LD A, (DE)
CP (HL)
JR NZ, STC_NE
AND A
JR Z, STC_EQ
INC DE
INC HL
JR STC_NEXT
STC_NE
SCF
STC_EQ
POP HL,DE
RET
; ------------------------------------------------------
; Convert string to number
; Inp: DE - ptr to zero ended string
; Out: HL - Result
; ------------------------------------------------------
ATOU
PUSH BC
LD HL,0x0000
ATOU_L1
LD A,(DE)
AND A
JR Z, ATOU_LE
SUB 0x30
CP 10
JR NC, ATOU_LE
INC DE
LD B,H
LD C,L
ADD HL,HL
ADD HL,HL
ADD HL,BC
ADD HL,HL
ADD A,L
LD L,A
JR NC,ATOU_L1
INC H
JP ATOU_L1
ATOU_LE
POP BC
RET
; ------------------------------------------------------
; Find char in string
; Inp: HL - ptr to zero endeds string
; A - char to find
; Outp: CF=0, HL points to char if found
; CF=1 - Not found
; ------------------------------------------------------
STRCHR
PUSH BC
STCH_NEXT
LD C,A
LD A,(HL)
AND A
JR Z, STCH_N_FOUND
CP C
JR Z, STCH_FOUND
INC HL
JR STCH_NEXT
STCH_N_FOUND
SCF
STCH_FOUND
POP BC
RET
; ------------------------------------------------------
; Convert Byte to hex
; Inp: C
; Out: (DE)
; ------------------------------------------------------
HEXB
LD A,C
RRA
RRA
RRA
RRA
CALL CONV_NIBLE
LD A,C
CONV_NIBLE
AND 0x0f
ADD A,0x90
DAA
ADC A,0x40
DAA
LD (DE), A
INC DE
RET
ENDMODULE

272
Sources/ESPLib/wcommon.asm Normal file
View File

@ -0,0 +1,272 @@
; ======================================================
; Common code for Sprinter-WiFi utilities
; By Roman Boykov. Copyright (c) 2024
; https://github.com/romychs
; License: BSD 3-Clause
; ======================================================
MODULE WCOMMON
; ------------------------------------------------------
; Ckeck for error (CF=1) print message and exit
; ------------------------------------------------------
CHECK_ERROR
RET NC
ADD A,'0'
LD (COMM_ERROR_NO), A
PRINTLN MSG_COMM_ERROR
CALL DUMP_UART_REGS
LD B,3
POP HL ; ret addr reset
EXIT
CALL REST_VMODE
LD C,DSS_EXIT
RST DSS
; ------------------------------------------------------
; Search Sprinter WiFi card
; ------------------------------------------------------
FIND_SWF
; Find Sprinter-WiFi
CALL WIFI.UART_FIND
JP C, NO_TL_FOUND
LD A,(ISA.ISA_SLOT)
ADD A,'1'
LD (MSG_SLOT_NO),A
PRINTLN MSG_SWF_FOUND
RET
NO_TL_FOUND
POP BC
PRINTLN MSG_SWF_NOF
LD B,2
JP EXIT
IF TRACE
; ------------------------------------------------------
; Dump all UTL16C550 registers to screen for debug
; ------------------------------------------------------
DUMP_UART_REGS
; Dump, DLAB=0 registers
LD BC, 0x0800
CALL DUMP_REGS
; Dump, DLAB=1 registers
LD HL, REG_LCR
LD E, LCR_DLAB | LCR_WL8
CALL WIFI.UART_WRITE
LD BC, 0x0210
CALL DUMP_REGS
LD HL, REG_LCR
LD E, LCR_WL8
CALL WIFI.UART_WRITE
RET
DUMP_REGS
LD HL, PORT_UART_A
DR_NEXT
LD DE,MSG_DR_RN
CALL UTIL.HEXB
INC C
CALL WIFI.UART_READ
PUSH BC
LD C,A
LD DE,MSG_DR_RV
CALL UTIL.HEXB
PUSH HL
PRINTLN MSG_DR
POP HL,BC
INC HL
DJNZ DR_NEXT
RET
ENDIF
; ------------------------------------------------------
; Store old video mode, set 80x32 and clear
; ------------------------------------------------------
INIT_VMODE
PUSH BC,DE,HL
; Store previous vmode
LD C,DSS_GETVMOD
RST DSS
LD (SAVE_VMODE),A
CP DSS_VMOD_T80
; Set vmode 80x32
JR Z, IVM_ALRDY_80
LD C,DSS_SETVMOD
LD A,DSS_VMOD_T80
RST DSS
IVM_ALRDY_80
; Clear screen
LD A,' '
LD B,0x07
LD C,DSS_CLEAR
LD HL,0x2050
LD DE,0x0000
RST DSS
POP HL,DE,BC
RET
; ------------------------------------------------------
; Restore saved video mode
; ------------------------------------------------------
REST_VMODE
PUSH BC
LD A,(SAVE_VMODE)
CP DSS_VMOD_T80
JR Z, RVM_SAME
; Restore mode
PRINTLN MSG_PRESS_AKEY
LD C, DSS_WAITKEY
RST DSS
LD C,DSS_SETVMOD
RST DSS
RVM_SAME
POP BC
RET
; ------------------------------------------------------
; Init basic parameters of ESP
; ------------------------------------------------------
INIT_ESP
PUSH BC, DE
LD DE, WIFI.RS_BUFF
LD BC, DEFAULT_TIMEOUT
TRACELN MSG_ECHO_OFF
SEND_CMD CMD_ECHO_OFF
TRACELN MSG_STATIOJN_MODE
SEND_CMD CMD_STATION_MODE
TRACELN MSG_NO_SLEEP
SEND_CMD CMD_NO_SLEEP
TRACELN MSG_SET_UART
SEND_CMD CMD_SET_SPEED
TRACELN MSG_SET_OPT
SEND_CMD CMD_CWLAP_OPT
POP DE,BC
RET
; ------------------------------------------------------
; Set DHCP mode
; Out: CF=1 if error
; ------------------------------------------------------
SET_DHCP_MODE
PUSH BC,DE
LD DE, WIFI.RS_BUFF
LD BC, DEFAULT_TIMEOUT
TRACELN MSG_SET_DHCP
SEND_CMD CMD_SET_DHCP
POP DE,BC
RET
; ------------------------------------------------------
; Messages
; ------------------------------------------------------
MSG_SWF_NOF
DB "Sprinter-WiFi not found!",0
MSG_SWF_FOUND
DB "Sprinter-WiFi found in ISA#"
MSG_SLOT_NO
DB "n slot.",0
MSG_COMM_ERROR
DB "Error communication with Sprinter-WiFi #"
COMM_ERROR_NO
DB "n!",0
MSG_PRESS_AKEY
DB "Press any key to continue...",0
MSG_ESP_RESET
DB "Reset ESP module.",0
MSG_UART_INIT
DB "Reset UART.",0
LINE_END
DB "\r\n",0
SAVE_VMODE
DB 0
; ------------------------------------------------------
; Debug messages
; ------------------------------------------------------
IF TRACE
MSG_DR
DB "Reg[0x"
MSG_DR_RN
DB "vv]=0x"
MSG_DR_RV
DB "vv",0
MSG_ECHO_OFF
DB "Echo off",0
MSG_STATIOJN_MODE
DB "Station mode",0
MSG_NO_SLEEP
DB "No sleep",0
MSG_SET_UART
DB "Setup uart",0
MSG_SET_OPT
DB "Set options",0
MSG_SET_DHCP
DB "Set DHCP mode",0
ENDIF
; ------------------------------------------------------
; Commands
; ------------------------------------------------------
CMD_QUIT
DB "QUIT\r",0
CMD_VERSION
DB "AT+GMR\r\n",0
CMD_SET_SPEED
DB "AT+UART_CUR=115200,8,1,0,3\r\n",0
CMD_ECHO_OFF
DB "ATE0\r\n",0
CMD_STATION_MODE
DB "AT+CWMODE=1\r\n",0
CMD_NO_SLEEP
DB "AT+SLEEP=0\r\n",0
CMD_CHECK_CONN_AP
DB "AT+CWJAP?\r\n",0
CMD_CWLAP_OPT
DB "AT+CWLAPOPT=1,23\r\n",0
CMD_GET_AP_LIST
DB "AT+CWLAP\r\n",0
CMD_GET_DHCP
DB "AT+CWDHCP?\r\n",0
CMD_SET_DHCP
DB "AT+CWDHCP=1,1\r\n",0
CMD_GET_IP
DB "AT+CIPSTA?\r\n",0
ENDMODULE

117
Sources/ESPLib/wterm.asm Normal file
View File

@ -0,0 +1,117 @@
; ======================================================
; WTERM terminal for Sprinter-WiFi ISA Card
; For Sprinter computer DSS
; By Roman Boykov. Copyright (c) 2024
; https://github.com/romychs
; License: BSD 3-Clause
; ======================================================
; Set to 1 to turn debug ON with DeZog VSCode plugin
; Set to 0 to compile .EXE
DEBUG EQU 0
; Set to 1 to output TRACE messages
TRACE EQU 1
; Version of EXE file, 1 for DSS 1.70+
EXE_VERSION EQU 0
; Timeout to wait ESP response
DEFAULT_TIMEOUT EQU 2000
SLDOPT COMMENT WPMEM, LOGPOINT, ASSERTION
DEVICE NOSLOT64K
IF DEBUG == 1
INCLUDE "dss.asm"
DB 0
ALIGN 16384, 0
DS 0x80, 0
ENDIF
INCLUDE "macro.inc"
INCLUDE "dss.inc"
INCLUDE "sprinter.inc"
MODULE MAIN
ORG 0x8080
; ------------------------------------------------------
EXE_HEADER
DB "EXE"
DB EXE_VERSION ; EXE Version
DW 0x0080 ; Code offset
DW 0
DW 0 ; Primary loader size
DW 0 ; Reserved
DW 0
DW 0
DW START ; Loading Address
DW START ; Entry Point
DW STACK_TOP ; Stack address
DS 106, 0 ; Reserved
ORG 0x8100
@STACK_TOP
; ------------------------------------------------------
START
IF DEBUG == 1
; LD IX,CMD_LINE1
LD SP, STACK_TOP
ENDIF
CALL ISA.ISA_RESET
CALL WCOMMON.INIT_VMODE
PRINTLN MSG_START
CALL WCOMMON.FIND_SWF
PRINTLN WCOMMON.MSG_UART_INIT
CALL WIFI.UART_INIT
PRINTLN WCOMMON.MSG_ESP_RESET
CALL WIFI.ESP_RESET
CALL WIFI.UART_EMPTY_RS
CALL WCOMMON.INIT_ESP
; ------------------------------------------------------
; Do Some
; ------------------------------------------------------
OK_EXIT
LD B,0
JP WCOMMON.EXIT
; ------------------------------------------------------
; Custom messages
; ------------------------------------------------------
MSG_START
DB "Terminal for Sprinter-WiFi by Sprinter Team. v1.0.1, ", __DATE__, "\r\n", 0
; ------------------------------------------------------
; Custom commands
; ------------------------------------------------------
CMD_QUIT
DB "QUIT\r",0
IF DEBUG == 1
CMD_TEST1 DB "ATE0\r\n",0
BUFF_TEST1 DS RS_BUFF_SIZE,0
ENDIF
ENDMODULE
INCLUDE "wcommon.asm"
INCLUDE "util.asm"
INCLUDE "isa.asm"
INCLUDE "esplib.asm"
END MAIN.START