625 lines
11 KiB
NASM
625 lines
11 KiB
NASM
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 |