From c47a89ce1ab19f30928e3224ecea7416fde2537d Mon Sep 17 00:00:00 2001 From: Oliver Schmidt Date: Sun, 22 Jul 2018 19:22:57 +0200 Subject: [PATCH] Split url.s into url.s and download.s. url_parse() doesn't require TCP so it makes sense to allow a program using url_parse() to link successfully without TCP support. --- ip65/Makefile | 2 + ip65/download.s | 195 ++++++++++++++++++++++++++++++++++++++++++++++ ip65/download_c.s | 32 ++++++++ ip65/url.s | 164 +------------------------------------- ip65/url_c.s | 29 ------- 5 files changed, 233 insertions(+), 189 deletions(-) create mode 100644 ip65/download.s create mode 100644 ip65/download_c.s diff --git a/ip65/Makefile b/ip65/Makefile index 16929fe..24d77b3 100644 --- a/ip65/Makefile +++ b/ip65/Makefile @@ -21,6 +21,8 @@ IP65OBJS=\ dns_c.o \ dottedquad.o \ dottedquad_c.o \ + download.o \ + download_c.o \ eth.o \ http.o \ http_c.o \ diff --git a/ip65/download.s b/ip65/download.s new file mode 100644 index 0000000..24682ad --- /dev/null +++ b/ip65/download.s @@ -0,0 +1,195 @@ +; routine for downloading a URL + +.include "zeropage.inc" +.include "../inc/common.inc" + +TIMEOUT_SECONDS = 15 + +.importzp copy_src +.importzp copy_dest +.import copymem +.import timer_read +.import ip65_process +.import tcp_connect +.import tcp_send_string +.import tcp_send_data_len +.import tcp_callback +.import tcp_close +.import tcp_connect_ip +.import tcp_inbound_data_length +.import tcp_inbound_data_ptr +.import url_ip +.import url_port +.import url_selector +.import url_parse + +.export url_download +.export url_download_buffer +.export url_download_buffer_length +.export resource_download +.export resource_buffer + + +.bss + + src_ptr: .res 1 + dest_ptr: .res 1 + timeout_counter: .res 1 + url_download_buffer: .res 2 ; points to a buffer that url will be downloaded into + url_download_buffer_length: .res 2 ; length of buffer that url will be downloaded into + + resource_buffer: .res 2 + resource_buffer_length: .res 2 + + download_flag: .res 1 + + +.code + +; download a resource specified by an URL +; inputs: +; AX = address of URL string +; url_download_buffer - points to a buffer that url will be downloaded into +; url_download_buffer_length - length of buffer +; outputs: +; sec if an error occured, else buffer pointed at by url_download_buffer is filled with contents +; of specified resource (with an extra 2 null bytes at the end), +; AX = length of resource downloaded. +url_download: + jsr url_parse + bcc resource_download + rts + +; download a resource specified by ip,port & selector +; inputs: +; url_ip = ip address of host to connect to +; url_port = port number of to connect to +; url_selector= address of selector to send to host after connecting +; url_download_buffer - points to a buffer that url will be downloaded into +; url_download_buffer_length - length of buffer +; outputs: +; sec if an error occured, else buffer pointed at by url_download_buffer is filled with contents +; of specified resource (with an extra 2 null bytes at the end). +resource_download: + ldax url_download_buffer + stax resource_buffer + ldax url_download_buffer_length + stax resource_buffer_length + jsr put_zero_at_end_of_dl_buffer + + ldx #3 ; save IP address just retrieved +: lda url_ip,x + sta tcp_connect_ip,x + dex + bpl :- + ldax #url_download_callback + stax tcp_callback + + ldax url_port + jsr tcp_connect + bcs @error + + ; connected, now send the selector + ldx #0 + stx download_flag + ldax url_selector + + jsr tcp_send_string + jsr timer_read + txa + adc #TIMEOUT_SECONDS*4 ; what value should trigger the timeout? + sta timeout_counter + ; now loop until we're done +@download_loop: + jsr ip65_process + jsr timer_read + cpx timeout_counter + beq @timeout + lda download_flag + beq @download_loop +@timeout: + jsr tcp_close + clc +@error: + rts + +url_download_callback: + lda tcp_inbound_data_length+1 + cmp #$ff + bne not_end_of_file +@end_of_file: + lda #1 + sta download_flag + +put_zero_at_end_of_dl_buffer: + ; put a zero byte at the end of the file + ldax resource_buffer + stax ptr2 + lda #0 + tay + sta (ptr2),y + rts + +not_end_of_file: + ; copy this chunk to our input buffer + ldax resource_buffer + stax copy_dest + ldax tcp_inbound_data_ptr + stax copy_src + sec + lda resource_buffer_length + sbc tcp_inbound_data_length + pha + lda resource_buffer_length+1 + sbc tcp_inbound_data_length+1 + bcc @would_overflow_buffer + sta resource_buffer_length+1 + pla + sta resource_buffer_length + ldax tcp_inbound_data_length + jsr copymem + ; increment the pointer into the input buffer + clc + lda resource_buffer + adc tcp_inbound_data_length + sta resource_buffer + lda resource_buffer+1 + adc tcp_inbound_data_length+1 + sta resource_buffer+1 + jmp put_zero_at_end_of_dl_buffer + +@would_overflow_buffer: + pla ; clean up the stack + ldax resource_buffer_length + jsr copymem + lda resource_buffer + adc resource_buffer_length + sta resource_buffer + lda resource_buffer+1 + adc resource_buffer_length+1 + sta resource_buffer+1 + lda #0 + sta resource_buffer_length + sta resource_buffer_length+1 + jmp put_zero_at_end_of_dl_buffer + + + +; -- LICENSE FOR download.s -- +; The contents of this file are subject to the Mozilla Public License +; Version 1.1 (the "License"); you may not use this file except in +; compliance with the License. You may obtain a copy of the License at +; http://www.mozilla.org/MPL/ +; +; Software distributed under the License is distributed on an "AS IS" +; basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +; License for the specific language governing rights and limitations +; under the License. +; +; The Original Code is ip65. +; +; The Initial Developer of the Original Code is Jonno Downes, +; jonno@jamtronix.com. +; Portions created by the Initial Developer are Copyright (C) 2009 +; Jonno Downes. All Rights Reserved. +; -- LICENSE END -- diff --git a/ip65/download_c.s b/ip65/download_c.s new file mode 100644 index 0000000..fe5c798 --- /dev/null +++ b/ip65/download_c.s @@ -0,0 +1,32 @@ +.include "../inc/common.inc" + +.export _url_download + +.import url_download +.import url_download_buffer +.import url_download_buffer_length +.import resource_buffer + +.import popax + +_url_download: + stax url_download_buffer_length + jsr popax + stax url_download_buffer + jsr popax + jsr url_download + bcs error + sec + lda resource_buffer + sbc url_download_buffer + tay + lda resource_buffer+1 + sbc url_download_buffer+1 + tax + tya + rts + +error: + ldx #$00 + txa + rts diff --git a/ip65/url.s b/ip65/url.s index cfc076c..0fa6f5d 100644 --- a/ip65/url.s +++ b/ip65/url.s @@ -1,46 +1,25 @@ -; routines for parsing a URL, and downloading an URL +; routine for parsing a URL .include "zeropage.inc" .include "../inc/common.inc" .include "../inc/error.inc" -TIMEOUT_SECONDS = 15 - .import output_buffer -.importzp copy_src -.importzp copy_dest -.import copymem -.import timer_read .import ip65_error -.import ip65_process .import parser_init .import parser_skip_next .import dns_set_hostname .import dns_resolve .import parse_integer .import dns_ip -.import tcp_connect -.import tcp_send_string -.import tcp_send_data_len -.import tcp_callback -.import tcp_close -.import tcp_connect_ip -.import tcp_inbound_data_length -.import tcp_inbound_data_ptr .export url_ip .export url_port .export url_selector .export url_resource_type .export url_parse -.export url_download -.export url_download_buffer -.export url_download_buffer_length -.export resource_download -.export resource_buffer -target_string = ptr1 -search_string = ptr2 +search_string = ptr1 selector_buffer = output_buffer @@ -56,16 +35,8 @@ selector_buffer = output_buffer url_type_gopher = 1 url_type_http = 2 - src_ptr: .res 1 - dest_ptr: .res 1 - timeout_counter: .res 1 - url_download_buffer: .res 2 ; points to a buffer that url will be downloaded into - url_download_buffer_length: .res 2 ; length of buffer that url will be downloaded into - - resource_buffer: .res 2 - resource_buffer_length: .res 2 - - download_flag: .res 1 + src_ptr: .res 1 + dest_ptr: .res 1 .code @@ -265,133 +236,6 @@ skip_to_hostname: ldax #colon_slash_slash jmp parser_skip_next -; download a resource specified by an URL -; inputs: -; AX = address of URL string -; url_download_buffer - points to a buffer that url will be downloaded into -; url_download_buffer_length - length of buffer -; outputs: -; sec if an error occured, else buffer pointed at by url_download_buffer is filled with contents -; of specified resource (with an extra 2 null bytes at the end), -; AX = length of resource downloaded. -url_download: - jsr url_parse - bcc resource_download - rts - -; download a resource specified by ip,port & selector -; inputs: -; url_ip = ip address of host to connect to -; url_port = port number of to connect to -; url_selector= address of selector to send to host after connecting -; url_download_buffer - points to a buffer that url will be downloaded into -; url_download_buffer_length - length of buffer -; outputs: -; sec if an error occured, else buffer pointed at by url_download_buffer is filled with contents -; of specified resource (with an extra 2 null bytes at the end). -resource_download: - ldax url_download_buffer - stax resource_buffer - ldax url_download_buffer_length - stax resource_buffer_length - jsr put_zero_at_end_of_dl_buffer - - ldx #3 ; save IP address just retrieved -: lda url_ip,x - sta tcp_connect_ip,x - dex - bpl :- - ldax #url_download_callback - stax tcp_callback - - ldax url_port - jsr tcp_connect - bcs @error - - ; connected, now send the selector - ldx #0 - stx download_flag - ldax url_selector - - jsr tcp_send_string - jsr timer_read - txa - adc #TIMEOUT_SECONDS*4 ; what value should trigger the timeout? - sta timeout_counter - ; now loop until we're done -@download_loop: - jsr ip65_process - jsr timer_read - cpx timeout_counter - beq @timeout - lda download_flag - beq @download_loop -@timeout: - jsr tcp_close - clc -@error: - rts - -url_download_callback: - lda tcp_inbound_data_length+1 - cmp #$ff - bne not_end_of_file -@end_of_file: - lda #1 - sta download_flag - -put_zero_at_end_of_dl_buffer: - ; put a zero byte at the end of the file - ldax resource_buffer - stax ptr2 - lda #0 - tay - sta (ptr2),y - rts - -not_end_of_file: - ; copy this chunk to our input buffer - ldax resource_buffer - stax copy_dest - ldax tcp_inbound_data_ptr - stax copy_src - sec - lda resource_buffer_length - sbc tcp_inbound_data_length - pha - lda resource_buffer_length+1 - sbc tcp_inbound_data_length+1 - bcc @would_overflow_buffer - sta resource_buffer_length+1 - pla - sta resource_buffer_length - ldax tcp_inbound_data_length - jsr copymem - ; increment the pointer into the input buffer - clc - lda resource_buffer - adc tcp_inbound_data_length - sta resource_buffer - lda resource_buffer+1 - adc tcp_inbound_data_length+1 - sta resource_buffer+1 - jmp put_zero_at_end_of_dl_buffer - -@would_overflow_buffer: - pla ; clean up the stack - ldax resource_buffer_length - jsr copymem - lda resource_buffer - adc resource_buffer_length - sta resource_buffer - lda resource_buffer+1 - adc resource_buffer_length+1 - sta resource_buffer+1 - lda #0 - sta resource_buffer_length - sta resource_buffer_length+1 - jmp put_zero_at_end_of_dl_buffer - .rodata diff --git a/ip65/url_c.s b/ip65/url_c.s index a47941a..17bb58f 100644 --- a/ip65/url_c.s +++ b/ip65/url_c.s @@ -1,21 +1,14 @@ .include "../inc/common.inc" .export _url_parse -.export _url_download .export _url_ip .export _url_port .export _url_selector .import url_parse -.import url_download -.import url_download_buffer -.import url_download_buffer_length .import url_ip .import url_port .import url_selector -.import resource_buffer - -.import popax _url_parse: jsr url_parse @@ -24,28 +17,6 @@ _url_parse: rol rts -_url_download: - stax url_download_buffer_length - jsr popax - stax url_download_buffer - jsr popax - jsr url_download - bcs error - sec - lda resource_buffer - sbc url_download_buffer - tay - lda resource_buffer+1 - sbc url_download_buffer+1 - tax - tya - rts - -error: - ldx #$00 - txa - rts - _url_ip := url_ip _url_port := url_port