zxuno-git/gopher.asm

216 lines
3.4 KiB
NASM

; hl - server
; de - path
; bc - port
openPage:
push hl
push de
push bc
ex hl, de
ld de, hist
ld bc, 147
ldir
ld hl, page_buffer
xor a
ld (hl), a
ld de, page_buffer + 1
ld bc, 32767
ldir
pop bc
pop de
pop hl
call makeRequest
ld hl, page_buffer
call loadData
xor a
ld (show_offset), a
ld a, 1
ld (cursor_pos), a
ret
; HL - domain stringZ
; DE - path stringZ
; BC - port stringZ
makeRequest:
push de
push bc
push HL
ld hl, downloading_msg
call showTypePrint
ld hl, cmd_open1 ; Open TCP connection
call uartWriteStringZ
pop hl
call uartWriteStringZ
ld hl, cmd_open2
call uartWriteStringZ
pop hl
call uartWriteStringZ
ld hl, cmd_open3
call okErrCmd
cp 1
jp nz, reqErr
ld hl, cmd_send ; Send request
call uartWriteStringZ
pop hl
push hl
call getStringLength ; Calculate addr length
push bc
pop hl
inc hl ; CR
inc hl ; LF
call B2D16 ; To string
ld hl, B2DBUF
call SkipWhitespace
call uartWriteStringZ
ld hl, crlf
call okErrCmd
cp 1
jp nz, reqErr
wPrmt:
call uartReadBlocking
call pushRing
ld hl, send_prompt
call searchRing
cp 1
jr nz, wPrmt
pop hl
call uartWriteStringZ
ld hl, crlf
call uartWriteStringZ
ld a, 1
ld (connectionOpen), a
ret
reqErr
ld hl, connectionError
call putStringZ
xor a
ld (connectionOpen), a
ret
; Load data to ram via gopher
; HL - data pointer
; In data_recv downloaded volume
loadData:
ld (data_pointer), hl
ld hl, 0
ld (data_recv), hl
lpLoop:
call getPacket
ld a, (connectionOpen)
and a
jp z, ldEnd
ld bc, (bytes_avail)
ld de, (data_pointer)
ld hl, output_buffer
ldir
ld hl, (data_pointer)
ld de, (bytes_avail)
push de
add hl, de
ld (data_pointer), hl
pop de
ld hl, (data_recv)
add hl, de
ld (data_recv), hl
jp lpLoop
ldEnd
xor a
ld (data_pointer), a
ret
; Download file via gopher
; HL - filename
downloadData:
ld b, FMODE_CREATE
call fopen
ld (fstream), a
dwnLp:
call getPacket
ld a, (connectionOpen)
and a
jp z, dwnEnd
ld bc, (bytes_avail)
ld hl, output_buffer
ld a, (fstream)
call fwrite
ld a, (fstream)
call fsync
jp dwnLp
dwnEnd:
ld a, (fstream)
call fclose
ret
openURI:
call cleanIBuff
ld b, 19
ld c, 0
call gotoXY
ld hl, cleanLine
call printZ64
ld b, 19
ld c, 0
call gotoXY
ld hl, hostTxt
call printZ64
call input
ld b, 19
ld c, 0
call gotoXY
ld hl, cleanLine
call printZ64
ld hl, iBuff
ld a, (hl)
and a
ret z
ld de, d_host
ld bc, 65
ldir
ld hl, d_host
ld de, d_path
ld bc, d_port
call openPage
jp showPage
ret
data_pointer defw #4000
data_recv defw 0
fstream defb 0
closed_callback
xor a
ld (connectionOpen), a
ret
hostTxt db 'Enter host: ', 0
d_path db '/'
defs 69
d_host defs 70
d_port db '70'
defs 5
hist ds 147
connectionOpen db 0
downloading_msg db 'Downloading...', 0
connectionError db 'Cant open TCP connection', 0