.include "../inc/common.inc"
.include "../inc/commonprint.inc"
.include "../inc/net.inc"

.export start

.import exit_to_basic

.import ascii_to_native
.import parse_dotted_quad
.import dotted_quad_value

.import tcp_listen
.import tcp_callback
.import ip65_random_word
.import ip65_error

.import tcp_connect
.import tcp_connect_ip

.import tcp_inbound_data_ptr
.import tcp_inbound_data_length

.import tcp_send
.import tcp_send_data_len

.importzp acc32
.importzp op32
.importzp acc16

.import add_32_32
.import add_16_32
.import cmp_32_32
.import cmp_16_16
.import mul_8_16

.import sub_16_16


; keep LD65 happy
.segment "INIT"
.segment "ONCE"


.segment "STARTUP"

  ; switch to lower case charset
  lda #14
  jsr print_a

start:
  jsr print_cr

  ldax #$1234
  stax acc16
  ldax #$1235
  jsr test_sub_16_16

  ldax #$180
  stax acc16
  ldax #$28
  jsr test_sub_16_16

  ldax #$ff34
  stax acc16
  ldax #$1235
  jsr test_sub_16_16

  ldax #$100
  stax acc16
  ldax #$ffff
  jsr test_sub_16_16

  ldax #$ffff
  stax acc16
  ldax #$100
  jsr test_sub_16_16

  ldax #number1
  stax acc32
  stax op32
  jsr test_cmp_32_32

  ldax #number1
  stax acc32
  ldax #number13
  stax op32
  jsr test_cmp_32_32

  ldax #number1
  stax acc32
  ldax #number2
  stax op32
  jsr test_cmp_32_32

  ldax #$12
  stax acc16
  jsr test_cmp_16_16

  ldax #$1234
  stax acc16
  jsr test_cmp_16_16

  ldax #$1234
  stax acc16
  ldax #$1235
  jsr test_cmp_16_16

  ldax #$1234
  stax acc16
  ldax #$2234
  jsr test_cmp_16_16

  ldax #$0000
  stax acc16
  jsr test_cmp_16_16

  ldax #$FFFF
  stax acc16
  jsr test_cmp_16_16

  ldax #number1
  stax acc32
  ldax #number2
  stax op32
  jsr test_add_32_32

  ldax #number3
  stax acc32
  ldax #number4
  stax op32
  jsr test_add_32_32

  ldax #number5
  stax acc32
  ldax #number6
  stax op32
  jsr test_add_32_32

  ldax #number7
  stax acc32
  ldax #number8
  stax op32
  jsr test_add_32_32

  ldax #number9
  stax acc32
  ldax #number10
  stax op32
  jsr test_add_32_32

  ldax #number11
  stax acc32
  ldax #number12
  stax op32
  jsr test_add_32_32

  ldax #number13
  stax acc32
  ldax #$1234
  jsr test_add_16_32

  ldax #number14
  stax acc32
  ldax #$1234
  jsr test_add_16_32

  ldax #number15
  stax acc32
  ldax #$1234
  jsr test_add_16_32

  ldax #number16
  stax acc32
  ldax #$1234
  jsr test_add_16_32

  ldax #number17
  stax acc32
  ldax #$158
  jsr test_add_16_32

  jsr print_cr
  init_ip_via_dhcp
  jsr print_ip_config

  jsr print_cr

  jsr print_random_number

  ; connect to port 81 - should be rejected
  ldax #tcp_callback_routine
  stax tcp_callback
  ldax tcp_dest_ip
  stax tcp_connect_ip
  ldax tcp_dest_ip+2
  stax tcp_connect_ip+2

  ldax #81
  jsr tcp_connect
  jsr check_for_error

  ldax #http_get_length
  stax tcp_send_data_len
  ldax #http_get_msg
  jsr tcp_send
  jsr check_for_error

  ; now try to connect to port 80 - should be accepted
  ldax #tcp_callback_routine
  stax tcp_callback
  ldax tcp_dest_ip
  stax tcp_connect_ip
  ldax tcp_dest_ip+2
  stax tcp_connect_ip+2

  ldax #80
  jsr tcp_connect
  jsr check_for_error

  lda #0
  sta cxn_closed

  ldax #http_get_length
  stax tcp_send_data_len
  ldax #http_get_msg
  jsr tcp_send
  jsr check_for_error

@loop_till_end:
  jsr ip65_process
  lda #1
  cmp cxn_closed

  beq @loop_till_end
  jmp exit_to_basic

  ldax #tcp_callback_routine
  stax tcp_callback
  ldax tcp_dest_ip
  stax tcp_connect_ip
  ldax tcp_dest_ip+2
  stax tcp_connect_ip+2

  ldax #80
  jsr tcp_connect
  jsr check_for_error

  ldax #4
  stax tcp_send_data_len
  ldax #http_get_msg
  jsr tcp_send
  jsr check_for_error
  ldax #http_get_length-4
  stax tcp_send_data_len
  ldax #http_get_msg+4
  jsr tcp_send
  jsr check_for_error

  ldax #looping
  jsr print
@loop_forever:
  jsr ip65_process
  jmp @loop_forever

tcp_callback_routine:
  lda tcp_inbound_data_length
  cmp #$ff
  bne @not_end_of_file
  lda #1
  sta cxn_closed
  rts

@not_end_of_file:
  lda #14
  jsr print_a                   ; switch to lower case

  ldax tcp_inbound_data_ptr
  stax get_next_byte+1

  lda #0
  sta byte_counter
  sta byte_counter+1

@print_one_byte:
  jsr get_next_byte
  jsr ascii_to_native

  jsr print_a
  inc get_next_byte+1
  bne :+
  inc get_next_byte+2
: inc byte_counter
  bne :+
  inc byte_counter+1
: ldax byte_counter
  stax acc16
  ldax tcp_inbound_data_length
  jsr cmp_16_16
  bne @print_one_byte
  rts

check_for_error:
  lda ip65_error
  beq @exit
  ldax #error_code
  jsr print
  lda ip65_error
  jsr print_hex
  jsr print_cr
  lda #0
  sta ip65_error
@exit:
  rts

print_random_number:
  jsr ip65_random_word
  stx temp_ax
  jsr print_hex
  lda temp_ax
  jsr print_hex
  jsr print_cr
  rts

; assumes acc32 & op32 already set
test_add_32_32:
  ldy #3
: lda (acc32),y
  jsr print_hex
  dey
  bpl :-

  lda #'+'
  jsr print_a
  ldy #3
: lda (op32),y
  jsr print_hex
  dey
  bpl :-

  lda #'='
  jsr print_a
  jsr add_32_32

  ldy #3
: lda (acc32),y
  jsr print_hex
  dey
  bpl :-
  jsr print_cr
  rts

; assumes acc32 & op32 already set
test_cmp_32_32:
  ldy #3
: lda (acc32),y
  jsr print_hex
  dey
  bpl :-

  lda #'='
  jsr print_a
  ldy #3
: lda (op32),y
  jsr print_hex
  dey
  bpl :-

  lda #':'
  jsr print_a
  jsr cmp_32_32
  bne @not_equal
  lda #'T'
  jmp @char_set
@not_equal:
  lda #'F'
@char_set:
  jsr print_a
  jsr print_cr
  rts

; assumes acc16& AX already set
test_cmp_16_16:
  stax temp_ax
  lda acc16+1
  jsr print_hex
  lda acc16
  jsr print_hex

  lda #'='
  jsr print_a
  lda temp_ax+1
  jsr print_hex
  lda temp_ax
  jsr print_hex

  lda #':'
  jsr print_a
  ldax temp_ax
  jsr cmp_16_16
  bne @not_equal
  lda #'T'
  jmp @char_set
@not_equal:
  lda #'F'
@char_set:
  jsr print_a
  jsr print_cr
  rts

; assumes acc32 & AX already set
test_add_16_32:
  stax temp_ax
  ldy #3
: lda (acc32),y
  jsr print_hex
  dey
  bpl :-

  lda #'+'
  jsr print_a

  lda temp_ax+1
  jsr print_hex
  lda temp_ax
  jsr print_hex

  lda #'='
  jsr print_a
  ldax temp_ax
  jsr add_16_32

  ldy #3
: lda (acc32),y
  jsr print_hex
  dey
  bpl :-
  jsr print_cr
  rts

; assumes acc16& A already set
test_mul_8_16:
  sta temp_ax
  lda acc16+1
  jsr print_hex
  lda acc16
  jsr print_hex

  lda #'*'
  jsr print_a
  lda temp_ax
  jsr print_hex

  lda #'='
  jsr print_a
  lda temp_ax
  jsr mul_8_16
  lda acc16+1
  jsr print_hex
  lda acc16
  jsr print_hex
  jsr print_cr
  rts

; assumes acc16 & AX already set
test_sub_16_16:
  stax temp_ax

  lda acc16+1
  jsr print_hex
  lda acc16
  jsr print_hex

  lda #'-'
  jsr print_a

  lda temp_ax+1
  jsr print_hex
  lda temp_ax
  jsr print_hex

  lda #'='
  jsr print_a
  ldax temp_ax
  jsr sub_16_16

  lda acc16+1
  jsr print_hex
  lda acc16
  jsr print_hex

  jsr print_cr
  rts

@error:
  ldax #failed_msg
  jsr print
  jsr print_cr
  rts


.bss

temp_ax:      .res 2
cxn_closed:   .res 1
byte_counter: .res 1


.data

number1:
  .byte $1,$2,$3,$f
number2:
.byte $10,$20,$30,$f0
number3:
  .byte $ff,$ff,$ff,$ff
number4:
  .byte $1,$0,$0,$0
number5:
  .byte $ff,$ff,$ff,$ff
number6:
  .byte $0,$0,$0,$0
number7:
  .byte $ff,$ff,$ff,$fe
number8:
  .byte $1,$0,$0,$0
number9:
  .byte $ff,$ff,$ff,$fe
number10:
  .byte $5,$0,$0,$0
number11:
  .byte $ff,$0,$0,$e
number12:
  .byte $5,$0,$0,$0
number13:
  .byte $1,$2,$3,$4
number14:
  .byte $ff,$ff,$ff,$ff
number15:
  .byte $ff,$ff,$00,$00
number16:
  .byte $00,$00,$00,$00
number17:
  .byte $5b,$bc,$08,$a9

tcp_dest_ip:
; .byte 10,5,1,1
  .byte 74,207,242,229
looping:
  .asciiz "LOOPING..."

http_get_msg:
  .byte "GET /blogx/ HTTP/1.0",13,10,13,10
http_get_msg_end:
  http_get_length = http_get_msg_end-http_get_msg

get_next_byte:
  lda $ffff
  rts



; -- LICENSE FOR math.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 --
