Files
ZiFi/_esp/zifi_driver.asm
T
2026-08-31 21:04:48 +03:00

625 lines
11 KiB
NASM
Raw 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.
device zxspectrum128
page_for_download equ #20
org #8000
start
im2_init
ld a,#be
ld i,a
ld hl,int_gfx_view
ld (#beff),hl
im 2
ei
; memory init
ld bc,MEMCONFIG
ld a,%00001110
out (c),a
xor a
call set_page0
ld a,4
out (#fe),a
call init_zifi
ld a,1
out (#fe),a
; create http
ld hl,test_url
call parse_url
; set page for download data
ld a,page_for_download
ld (zipd_page+1),a
ld hl,#0000 ; start adress
ld (zipd_adr+1),hl
call get_url
ld a,5
out (#fe),a
; lenght of received data: #00 : #0000
ld a,(readed_len_high+1) ; high byte lenght
ld hl,(readed_len_low+1) ; low word lenght
jr $
test_url db "http://httpbin.org/ip",#0d
init_zifi ld bc,#c7ef
ld de,#fff1
out (c),e ;Set API mode 1
out (c),d ;Get Version
in a,(c)
cp #ff
jp z,nozifi
ld a,#01
out (c),a ;Clear RX FIFO
2 ld hl,cmd_at
call zifi_send
ld de,str_ok
call buffer_cmp
jr nz,2b
;ld hl,cmd_uart
; call zifi_send
ld hl,cmd_gmr
call zifi_send
ld hl,cmd_cwmode
call zifi_send
ld hl,cmd_cwautoconn
call zifi_send
ld hl,cmd_cipmux
call zifi_send
ld hl,cmd_cwjap ; AT+CWJAP_CUR . Connect to AP, for current
call zifi_send
2 call zifi_check_receive_command
ld de,str_ok
call buffer_cmp
jr nz,2b
ret ; we all connected, OK 0:1
nozifi ld hl,conf_not_found_msg ; old rs232 port, cancel
jr $
conf_not_found_msg
db "Error: Please update TS Conf.",0
// send and receive data without header
get_url ld hl,cmd_conn2site ; AT+CIPSTART - connect to site
call zifi_send
ld de,str_error
call buffer_cmp
jr nz,zg_ok
ld hl,cmd_cipclose
call zifi_send
1 ld de,str_ok
call buffer_cmp
jr z,get_url
call wait_frame
call fifo_inir
jr 1b
zg_ok ld de,str_ok
call buffer_cmp
jr nz,get_url
1 ld hl,cmd_cipsend ; AT+CIPSEND=<link ID>,<length>
call zifi_send_raw
2 call fifo_inir
ld de,str_ok
call buffer_cmp
jr nz,2b
1 ld a,(hl)
inc hl
cp #ff
jr z,2b
cp ">"
jr nz,1b
; send http request
ld hl,modem_command
call zifi_send_raw
1
call zifi_getchar
cp "O"
jr nz,1b
call zifi_getchar
cp "K"
jr nz,1b
// receive header
first_ipd
call reread_ipd
2
; skip data
call read_fifo_char
dec hl
cp #0d
jr nz,2b
call read_fifo_char
dec hl
cp #0a
jr nz,2b
call read_fifo_char
dec hl
cp #0d
jr nz,2b
call read_fifo_char
dec hl
cp #0a
jr nz,2b
// header skipped --------------------
ld a,h
or l
jr z,read_all_ipds
ld (zipd_full_len+1),hl
jr zipd_adr
// receive data
read_all_ipds call reread_ipd
zipd_adr ld hl,#0000 ; adress for receive data ----------------------
zipd_full_len ld de,0 ; ipd len
p231 ld bc,zifi_input_fifo_status
1 in a,(c)
or a ; 0 - input FIFO is empty,
jr z,1b
p232 cp 0xbf ; BIG THANKS FOR DDp for his MIGHTY code!
jr c,p233 ;
ld a,0xbf ; д
p233 ld c,a ; о
ld a,d ; л
or a ; г
jr nz,p234 ; о
ld a,e ;
cp c ; з
jr nc,p234 ; а
ld c,e ; п
p234 ex de,hl ; р
xor a ; я
ld b,a ; г
sbc hl,bc ; а
ex de,hl ; е
ld b,c ; м
ld c,0xef ;
inir ; и быстро едем
ld a,d
or e
jr nz,p231
ld a,h
cp #40
jr c,1f
zipd_page ld a,0
inc a
ld (zipd_page+1),a
call set_page0
inc a
call set_page1
ld a,h
sub #40
ld h,a
1 ld (zipd_adr+1),hl
ld hl,(zipd_full_len+1)
ld b,h
readed_len_low ld de,0
add hl,de
ld (readed_len_low+1),hl
jr nc,1f
readed_len_high ld a,0
inc a
ld (readed_len_high+1),a
1 jp read_all_ipds
read_fifo_char ld bc,zifi_input_fifo_status ; ждём прихода данных в фифо
3 in a,(c)
jr z,3b ; 0 - input FIFO is empty,
ld b,0
in a,(c)
ret
reread_ipd ld e,#ff
ld hl,output_buff
call rdipd
ld de,CLOSED
call buffer_cmp
; or a ; CLOSED, exit
jp z,zifi_read_ipd_ex
ld de,str_ipd
call buffer_cmp
jr nz,reread_ipd
ex de,hl
call count_ipd_lenght ; in HL - lenght of ipd packet
ld (zipd_full_len+1),hl
ret
zifi_read_ipd_ex
pop af
ld a,(readed_len_high+1)
ld c,a
ld hl,(readed_len_low+1)
ret
rdipd: call zifi_getchar
jr z,rdipd
ld (hl),a
inc hl
cp ':'
ret z
cp #0a
ret z
jr rdipd
zifi_getchar:
call zifi_input_fifo_check
or a
jr z,zifi_getchar
ld b,0
in a,(c)
dec b
ret
count_ipd_lenght
ld hl,0 ; count lenght
cil1 ld a,(de)
inc de
cp ':'
ret z
sub 0x30
ld c,l
ld b,h
add hl,hl
add hl,hl
add hl,bc
add hl,hl
ld c,a
ld b,0
add hl,bc
jr cil1
ss_cmp ld hl,output_buff
ss_cm1 ld a,(de)
or a
ret z
inc de
cpi
jr z,ss_cm1
ret
read_pack
ld bc,zifi_input_fifo_status ; ждём прихода данных в фифо
ld hl,0
1 dec hl
ld a,h
or a
jr z,zifi_read_ipd_ex
in a,(c)
or a ; 0 - input FIFO is empty,
jr z,1b
ld hl,output_buff ; in E - lenght
fifo_inir push de
call zifi_input_fifo_check
ld hl,output_buff ; read data from fifo, count: #bf
push hl
ld bc,zifi_data_reg
inir
pop hl
pop de
ret
zifi_send call zifi_send_raw
zifi_check_receive_command jp fifo_inir
buffer_cmp ld hl,output_buff
data_cmp ld (buffer_cmp_start+1),de
ld c,low output_buff+#bf
buffer_cmp_start
ld de,0
buffer_cmp0 ld a,(de)
cp (hl)
jr z,buffer_cmp1
ld a,l
cp c
jr z,buffer_cmp_notfound
inc hl
jr buffer_cmp0
buffer_cmp_notfound
or a
ret
buffer_cmp1 inc de
inc hl
ld a,(de)
or a
ret z
cp (hl)
jr nz,buffer_cmp_start
jr buffer_cmp1
zifi_send_raw call check_output_fifo_status
call clear_output_fifo
push hl
ld hl,output_buff
ld de,output_buff+1
ld bc,#ef
ld (hl),l
ldir
pop hl
ld bc,zifi_data_reg
1 ld a,(hl)
or a
ret z
out (c),a
inc hl
jr 1b
zifi_input_fifo_check
ld bc,zifi_input_fifo_status ; ждём прихода данных в фифо
ld e,0
3 in a,(c)
or a ; 0 - input FIFO is empty,
ret nz
call wait_frame
dec e
jr nz,3b
error ld a,2
out (#fe),a
ret
clear_output_fifo ld a,cmd_clear_output_fifo
call zifi_out_command
check_output_fifo_status
ld bc,zifi_output_fifo_status
cofs in a,(c)
or a
jr z,cofs ; 0 - output FIFO is full
ret
clear_input_fifo ld a,cmd_clear_input_fifo
call zifi_out_command
ld bc,zifi_input_fifo_status
clear_input_fifo1 in a,(c)
or a
jr nz,clear_input_fifo1 ;0 - input FIFO is empty
ret
zifi_out_command ld bc,zifi_command_reg
out (c),a
ret
zifi_command_result ld bc,zifi_error_reg
in a,(c)
ret
; in hl - adress:
; http://zxaaa.untergrund.net/get.php?f=DEMO6/a_brief_history_of_vacuum_cleaner_nozzle_attachments.zip
parse_url ld de,cmd_conn2site_adr
pu1 ld a,(hl) ; http://
inc hl
cp "/"
jr nz,pu1
inc hl ; /
ld bc,"//"
ld (host_url+1),hl
call find_copy_char
inc hl
ld (file_url+1),hl
; ld c,#0d
; call find_copy_char
create_link1 ld hl,create_link_suffix
ld bc,7
ldir
ld hl,modem_command
ld (hl),"G"
inc hl
ld (hl),"E"
inc hl
ld (hl),"T"
inc hl
ld (hl)," "
inc hl
ld (hl),"/"
inc hl
ex hl,de
file_url ld hl,0
ld bc,#0d0a
call find_copy_char
ld hl,http_part1
ld bc,http_part2-http_part1
ldir
host_url ld hl,0
ld bc,"//"
call find_copy_char
ld a,13
ld (de),a
inc de
ld a,10
ld (de),a
inc de
ld hl,http_part2
ld bc,http_part3-http_part2
ldir
; dec de
ex de,hl
ld de,modem_command
or a
sbc hl,de
; inc hl
ld de,url_len
ld bc,-1000
call Num1
cp "0"
jr z,1f
ld (de),a
inc de
1 ld bc,-100
call Num1
ld (de),a
inc de
1 ld c,-10
call Num1
ld (de),a
inc de
1 ld c,-1
call Num1
ld (de),a
inc de
ld a,#0d
ld (de),a
inc de
ld a,#0a
ld (de),a
inc de
xor a
ld (de),a
ret
Num1: ld a,'0'-1
Num2: inc a
add hl,bc
jr c,Num2
sbc hl,bc
ret
find_copy_char ld a,(hl)
cp c
ret z
cp b
ret z
ld (de),a
inc hl
inc de
jr find_copy_char
create_link_suffix
db #22,",80",13,10,0
set_page0 ld bc,PAGE0
out (c),a
ret
set_page1 ld bc,PAGE1
out (c),a
ret
wait_frame ld a,(frame+1)
or a
jr z,wait_frame
xor a
ld (frame+1),a
ret
int_gfx_view push af,hl,de,bc
frame ld a,0
inc a
ld (frame+1),a
pop bc,de,hl,af
ei
ret
zifi_command_reg equ #C7EF
zifi_error_reg equ #C7EF
zifi_data_reg equ #BFEF
zifi_input_fifo_status equ #C0EF
zifi_output_fifo_status equ #C1EF
cmd_clear_input_fifo equ 1
cmd_clear_output_fifo equ 2
modem_command ds 256+128
CLOSED db "CLOSED",#0d,#0a,0
http_part1 db " HTTP/1.0",13,10 ;size=123
db "Host: " ;zxart.ee",13,10
http_part2 db "User-Agent: ZiFi (ZX Evo)",13,10 ; show off ;)
db "Accept: */*",13,10
db "Connection: close",13,10,13,10
http_part3
; init esp8266
cmd_at: defb "ATE0",13,10,0
cmd_gmr: defb "AT+GMR",13,10,0 ; 3. AT+GMR – View version info
;This AT command is used to check the version of AT commands and SDK that you are using, the type of which is "executed".
cmd_uart db "AT+UART_CUR=115200,8,1,0,3",13,10,0
cmd_cwmode: defb "AT+CWMODE_DEF=1",13,10,0 ; Wi-Fi default mode(sta/AP/sta+AP) Save to Flash
cmd_cipmux db "AT+CIPMUX=0",13,10,0 ; Выбрать режим одиночного или множественных подключений
cmd_cwautoconn: defb "AT+CWAUTOCONN=0",13,10,0 ; Connect to AP automatically when power on
cmd_cwqap: defb "AT+CWQAP",13,10,0 ; Disconnect from AP
cmd_cwlap: defb "AT+CWLAP",13,10,0 ; Lists available APs
cmd_cwjap: defb "AT+CWJAP_CUR=",0x22 ; Connect to AP, won’t save to Flash
cmd_cwjap_ap defb "YV" ; SSID
defb #22,#2c,#22
cmd_cwjap_pass defb "1234123412" ; password
defb #22,#0d,#0a
cmd_cipsta: defb "AT+CIPSTA?",13,10,0 ; AT+CIPSTA – Set IP address of station
cmd_cipclose db "AT+CIPCLOSE",13,10,0
; load data from server
cmd_conn2site defb "AT+CIPSTART="
;cmd_conn2site_task_num db "0,"
db 0x22,"TCP",0x22,",",0x22
;AT+CIPSTART – Establish TCP connection or UDP transmission
;AT+CIPMODE – Set transfer mode ------!!!------
; UART-WiFi passthrough mode (transparent transmission) can only be enabled in TCP single
; connection mode or UDP of which remote IP and port won’t change (parameter <UDP mode> is 0
; when using command “AT+CIPSTART” to create a UDP transmission) .
cmd_conn2site_adr ds #40 ; defb "zxart.ee" ; site
; defb 0x22,",80",13,10
cmd_cipsend db "AT+CIPSEND="
;download_task_num db "0,"
url_len ds 6
db 0
str_ok: defb "OK",13,0
str_already_con:defb "ALREADY CONNECT",13,0
str_error: defb "ERROR",13,0
str_fail: defb "FAIL",13,0
str_send_ok: defb "SEND OK",13,0
str_ipd db "+IPD,",0
include "tsconfig.asm"
align 256
output_buff
end
SAVEBIN "_spg/zifi_driver.bin",start, end-start