.ifndef SCREEN_WIDTH SCREEN_WIDTH = 40 .endif .include "zeropage.inc" .export print_hex .export print_ip_config .export dhcp_msg .export ok_msg .export failed_msg .export init_msg .export print .export print_ascii_as_native .export print_integer .export print_dotted_quad .export mac_address_msg .export ip_address_msg .export netmask_msg .export gateway_msg .export dns_server_msg .export tftp_server_msg .import ip65_error .export print_errorcode .export press_a_key_to_continue .import ascii_to_native .import eth_name .importzp copy_src .import cfg_mac .import cfg_ip .import cfg_netmask .import cfg_gateway .import cfg_dns .import dhcp_server .import cfg_tftp_server pptr = ptr1 .bss temp_bin: .res 2 temp_bcd: .res 3 temp_ptr: .res 2 .code .macro print_hex_double arg lda #>(.right (.tcount (arg)-1, arg)) jsr print_hex lda #<(.right (.tcount (arg)-1, arg)) jsr print_hex .endmacro .macro print_driver_init ldax #eth_name jsr print_ascii_as_native ldax #init_msg jsr print_ascii_as_native .endmacro .macro print_dhcp_init ldax #dhcp_msg jsr print_ascii_as_native ldax #init_msg jsr print_ascii_as_native .endmacro .macro print_failed ldax #failed_msg jsr print_ascii_as_native jsr print_cr .endmacro .macro print_ok ldax #ok_msg jsr print_ascii_as_native jsr print_cr .endmacro .code .import print_a .import print_cr .import eth_name print_ip_config: ldax #interface_type jsr print_ascii_as_native ldax #eth_name jsr print_ascii_as_native jsr print_cr ldax #mac_address_msg jsr print_ascii_as_native ldax #cfg_mac jsr print_mac jsr print_cr ldax #ip_address_msg jsr print_ascii_as_native ldax #cfg_ip jsr print_dotted_quad jsr print_cr ldax #netmask_msg jsr print_ascii_as_native ldax #cfg_netmask jsr print_dotted_quad jsr print_cr ldax #gateway_msg jsr print_ascii_as_native ldax #cfg_gateway jsr print_dotted_quad jsr print_cr ldax #dns_server_msg jsr print_ascii_as_native ldax #cfg_dns jsr print_dotted_quad jsr print_cr ldax #tftp_server_msg jsr print_ascii_as_native ldax #cfg_tftp_server jsr print_dotted_quad jsr print_cr ldax #dhcp_server_msg jsr print_ascii_as_native ldax #dhcp_server jsr print_dotted_quad jsr print_cr rts print: sta pptr stx pptr + 1 @print_loop: ldy #0 lda (pptr),y beq @done_print jsr print_a inc pptr bne @print_loop inc pptr+1 bne @print_loop ; if we ever get to $ffff, we've probably gone far enough ;-) @done_print: rts print_ascii_as_native: sta pptr stx pptr + 1 @print_loop: ldy #0 lda (pptr),y beq @done_print jsr ascii_to_native jsr print_a inc pptr bne @print_loop inc pptr+1 bne @print_loop ; if we ever get to $ffff, we've probably gone far enough ;-) @done_print: rts ; print the 4 bytes pointed at by AX as dotted decimals print_dotted_quad: sta pptr stx pptr + 1 lda #0 @print_one_byte: pha tay lda (pptr),y ldx #0 jsr print_integer pla cmp #3 beq @done clc adc #1 pha lda #'.' jsr print_a pla bne @print_one_byte @done: rts ; print 6 bytes printed at by AX as a MAC address print_mac: stax pptr ldy #0 @one_mac_digit: tya ; just to set the Z flag pha beq @dont_print_colon lda #':' jsr print_a @dont_print_colon: pla tay lda (pptr),y jsr print_hex iny cpy #06 bne @one_mac_digit rts print_integer: ; print 16 bit number in AX as a decimal number ; hex to bcd routine taken from Andrew Jacob's code at http://www.6502.org/source/integers/hex2dec-more.htm stax temp_bin sed ; Switch to decimal mode lda #0 ; Ensure the result is clear sta temp_bcd sta temp_bcd+1 sta temp_bcd+2 ldx #16 ; The number of source bits : asl temp_bin+0 ; Shift out one bit rol temp_bin+1 lda temp_bcd+0 ; And add into result adc temp_bcd+0 sta temp_bcd+0 lda temp_bcd+1 ; propagating any carry adc temp_bcd+1 sta temp_bcd+1 lda temp_bcd+2 ; ... thru whole result adc temp_bcd+2 sta temp_bcd+2 dex ; And repeat for next bit bne :- stx temp_bin+1 ; x is now zero - reuse temp_bin as a count of non-zero digits cld ; back to binary ldx #2 stx temp_bin+1 ; reuse temp_bin+1 as loop counter @print_one_byte: ldx temp_bin+1 lda temp_bcd,x pha lsr lsr lsr lsr jsr @print_one_digit pla and #$0f jsr @print_one_digit dec temp_bin+1 bpl @print_one_byte rts @print_one_digit: cmp #0 beq @this_digit_is_zero inc temp_bin ; increment count of non-zero digits @ok_to_print: clc adc #'0' jsr print_a rts @this_digit_is_zero: ldx temp_bin ; how many non-zero digits have we printed? bne @ok_to_print ldx temp_bin+1 ; how many digits are left to print? bne @this_is_not_last_digit inc temp_bin ; to get to this point, this must be the high nibble of the last byte. ; by making 'count of non-zero digits' to be >0, we force printing of the last digit @this_is_not_last_digit: rts print_hex: pha pha lsr lsr lsr lsr tax lda hexdigits,x jsr print_a pla and #$0F tax lda hexdigits,x jsr print_a pla rts print_errorcode: ldax #error_code jsr print_ascii_as_native lda ip65_error jsr print_hex jmp print_cr .rodata hexdigits: .byte "0123456789ABCDEF" .if SCREEN_WIDTH >= 30 interface_type: .byte "Interface : ",0 mac_address_msg: .byte "MAC Address : ",0 ip_address_msg: .byte "IP Address : ",0 netmask_msg: .byte "Netmask : ",0 gateway_msg: .byte "Gateway : ",0 dns_server_msg: .byte "DNS Server : ",0 dhcp_server_msg: .byte "DHCP Server : ",0 tftp_server_msg: .byte "TFTP Server : ",0 .else ; for small width screens e.g. VIC 20 interface_type: .byte "Interface", 10,0 mac_address_msg: .byte "MAC Address",10,0 ip_address_msg: .byte "IP Address", 10,0 netmask_msg: .byte "Netmask", 10,0 gateway_msg: .byte "Gateway", 10,0 dns_server_msg: .byte "DNS Server", 10,0 dhcp_server_msg: .byte "DHCP Server",10,0 tftp_server_msg: .byte "TFTP Server",10,0 .endif dhcp_msg: .byte "DHCP",0 init_msg: .byte 10,"Initializing ",0 failed_msg: .byte "failed",0 ok_msg: .byte "OK",0 dns_lookup_failed_msg: .byte "DNS LOOKUP FAILED",0 error_code: .asciiz "error code: " press_a_key_to_continue: .byte "Press a key to continue",10,0 ; -- LICENSE FOR commonprint.inc -- ; 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 --