mirror of
https://github.com/romychs/SprinterESP.git
synced 2026-11-08 23:50:00 +03:00
First fixed version
This commit is contained in:
commit
b86c4aa48a
16 files changed
+12677
No files matched your search
@@ -0,0 +1,279 @@
|
||||
; ===========================================
|
||||
; SOLID C Lbrary to work with Sprinter WiFi
|
||||
; ESP ISA Card
|
||||
; ===========================================
|
||||
|
||||
DEVICE NOSLOT64K
|
||||
;INCLUDE "ports.inc"
|
||||
|
||||
port_isa EQU 0x9FBD
|
||||
port_system EQU 0x1FFD
|
||||
emm_win_p3 EQU 0xE2
|
||||
|
||||
ISA_BASE_A EQU 0xC000 ; Базовый адрес портов ISA в памяти
|
||||
PORT_UART EQU 0x03E8 ; Базовый номер порта COM3
|
||||
PORT_UART_A EQU ISA_BASE_A + PORT_UART ; Порты чипа UART в памяти
|
||||
|
||||
; Порты UART TC16C550 в памяти
|
||||
RBR EQU PORT_UART_A + 0
|
||||
THR EQU PORT_UART_A + 0
|
||||
IER EQU PORT_UART_A + 1
|
||||
IIR EQU PORT_UART_A + 2
|
||||
FCR EQU PORT_UART_A + 2
|
||||
LCR EQU PORT_UART_A + 3
|
||||
MCR EQU PORT_UART_A + 4
|
||||
LSR EQU PORT_UART_A + 5
|
||||
MSR EQU PORT_UART_A + 6
|
||||
SCR EQU PORT_UART_A + 7
|
||||
DLL EQU PORT_UART_A + 0
|
||||
DLM EQU PORT_UART_A + 1
|
||||
AFR EQU PORT_UART_A + 2
|
||||
|
||||
BAUD_RATE EQU 115200 ; Скорость соединения с ESP8266
|
||||
XIN_FREQ EQU 14745600 ; Частота генератора для TL16C550
|
||||
DIVISOR EQU XIN_FREQ / (BAUD_RATE * 16) ; Делитель частоты для передачи/приема данных
|
||||
|
||||
ORG 0x0000
|
||||
jp main
|
||||
|
||||
save_mmu3 DB 0 ; Variable to save memory page
|
||||
|
||||
; ===============================================
|
||||
; Small delay
|
||||
; void delay(hl)
|
||||
; 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
|
||||
; ===============================================
|
||||
MODULE reset_isa
|
||||
reset_isa_:
|
||||
push af
|
||||
push bc
|
||||
push hl
|
||||
ld bc, port_isa
|
||||
ld a, 0xC0 ; RESET=1 AEN=1
|
||||
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
|
||||
ld bc, emm_win_p3
|
||||
in a,(c)
|
||||
ld (save_mmu3), a
|
||||
push bc
|
||||
ld bc, port_system
|
||||
ld a, 0x11
|
||||
out (c), a
|
||||
pop bc ; emm_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
|
||||
|
||||
; ===============================================
|
||||
; 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
|
||||
ld bc, emm_win_p3
|
||||
out (c), a
|
||||
pop bc
|
||||
pop af
|
||||
ret
|
||||
ENDMODULE
|
||||
|
||||
; ===============================================
|
||||
; Init ISA device
|
||||
; ===============================================
|
||||
MODULE init_isa
|
||||
init_isa_:
|
||||
call reset_isa.reset_isa_ ; just only reset
|
||||
ret
|
||||
ENDMODULE
|
||||
|
||||
; ===============================================
|
||||
; Init UART device TL16C550
|
||||
; ===============================================
|
||||
MODULE init_serial
|
||||
init_serial_:
|
||||
push af
|
||||
push hl
|
||||
call open_isa.open_isa_
|
||||
ld a, 1
|
||||
ld (FCR), a ; 8 byte FIFO buffer
|
||||
ld a, 0x81
|
||||
ld (FCR), a
|
||||
xor a
|
||||
ld (IER), a ; Disable interrupts
|
||||
|
||||
; Set baud rate
|
||||
ld a, 0x83
|
||||
ld (LCR), a ; enable Baud rate latch
|
||||
ld a, DIVISOR
|
||||
ld (DLL), a ; 8 - 115200
|
||||
xor a
|
||||
ld (DLM), a
|
||||
ld a, 0x03 ; disable Baud rate latch & 8N1
|
||||
ld (LCR), a
|
||||
|
||||
; reset ESP
|
||||
ld a,0x06 ; ESP -PGM=1, -RTS=0
|
||||
ld (MCR), a
|
||||
ld hl,2000
|
||||
call delay.delay_
|
||||
ld a,0x02 ; ESP -RST=1, -RTS=0
|
||||
call delay.delay_
|
||||
call close_isa.close_isa_
|
||||
pop hl
|
||||
pop af
|
||||
ret
|
||||
ENDMODULE
|
||||
|
||||
; ===============================================
|
||||
; Read TL16C550 register
|
||||
; char read_reg(reg)
|
||||
; input hl - register no
|
||||
; output a - value from register
|
||||
; ===============================================
|
||||
MODULE read_reg
|
||||
read_reg_:
|
||||
call open_isa.open_isa_
|
||||
ld a, (hl)
|
||||
call close_isa.close_isa_
|
||||
ret
|
||||
ENDMODULE
|
||||
|
||||
; ===============================================
|
||||
; Write TL16C550 register
|
||||
; void write_reg(reg, b)
|
||||
; input hl - reg no, e - value
|
||||
; ===============================================
|
||||
MODULE write_reg
|
||||
write_reg_:
|
||||
call open_isa.open_isa_
|
||||
ld (hl), e
|
||||
call close_isa.close_isa_
|
||||
ret
|
||||
ENDMODULE
|
||||
|
||||
; ===============================================
|
||||
; Wait for transmitter ready
|
||||
; char wait_tr()
|
||||
; output a = 0 - tr not ready, !=0 - tr ready
|
||||
; ===============================================
|
||||
MODULE wait_tr
|
||||
wait_tr_:
|
||||
push bc
|
||||
push hl
|
||||
ld bc, 100
|
||||
ld hl, 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 (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, 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
|
||||
; ===============================================
|
||||
|
||||
main:
|
||||
call init_isa.init_isa_
|
||||
ret
|
||||
@@ -0,0 +1,83 @@
|
||||
#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();
|
||||
|
||||
Reference in new issue
Block a user