From 3c6e3810ac1b00a14519f1f23931e2b015a88efd Mon Sep 17 00:00:00 2001
From: jonnosan
Date: Mon, 5 Oct 2009 03:01:58 +0000
Subject: [PATCH] git-svn-id: http://svn.code.sf.net/p/netboot65/code@201
93682198-c243-4bdb-bd91-e943c89aac3b
---
client/carts/Makefile | 15 ++--
...c64_ram_header.s => c64_cart_ram_header.s} | 17 ++--
client/carts/kipperkart.s | 28 +++---
client/carts/kipperterm.s | 2 +-
client/drivers/Makefile | 6 +-
client/examples/upnatom.s | 8 +-
client/inc/disk_transfer.i | 80 ++++++++++++++++--
client/inc/kipper_constants.i | 1 -
client/inc/sidplay.i | 7 +-
client/inc/version.i | 2 +-
client/ip65/function_dispatcher.s | 31 +------
dist/make_dist.rb | 18 ++--
dist/version_number.txt | 2 +-
doc/README.C64.html | 53 ++++++------
doc/kipper_api_technical_reference.doc | Bin 176128 -> 177152 bytes
doc/netboot65.html | 4 +-
16 files changed, 159 insertions(+), 115 deletions(-)
rename client/carts/{nb65_c64_ram_header.s => c64_cart_ram_header.s} (83%)
diff --git a/client/carts/Makefile b/client/carts/Makefile
index 888683c..b11de8f 100644
--- a/client/carts/Makefile
+++ b/client/carts/Makefile
@@ -16,9 +16,9 @@ IP65LIB=../ip65/ip65.lib
IP65TCPLIB=../ip65/ip65_tcp.lib
C64PROGLIB=../drivers/c64prog.lib
-C64NB65LIB=../drivers/c64nb65.lib
+#C64NB65LIB=../drivers/c64nb65.lib
-all: kipperkart.bin kipperkart_rr.bin netboot.bin kipperterm.bin
+all: kipperkart.bin kipperkart_rr.bin netboot.bin kipperterm.bin kipperkart.prg
kipperkart.o: kipperkart.s $(INCFILES) ../inc/ping.i ../inc/disk_transfer.i ../inc/sidplay.i
$(AS) $(AFLAGS) -o $@ $<
@@ -29,6 +29,9 @@ kipperterm.o: kipperterm.s $(INCFILES) ../inc/gopher.i ../inc/telnet.i
%.o: %.s $(INCFILES)
$(AS) $(AFLAGS) $<
+kipperkart.prg: kipperkart.bin c64_cart_ram_header.prg
+ cat c64_cart_ram_header.prg kipperkart.bin > kipperkart.prg
+
%.prg: %.o $(IP65LIB) $(C64PROGLIB) $(INCFILES) ../cfg/c64prg.cfg
$(LD) -m $*.map -vm -C ../cfg/c64prg.cfg -o $*.prg $(AFLAGS) $< $(IP65LIB) $(C64PROGLIB)
@@ -36,13 +39,13 @@ netboot.bin: netboot.o $(IP65LIB) $(C64PROGLIB) $(INCFILES) ../cfg/c64_8kcart.cf
$(LD) -m netboot.map -vm -C ../cfg/c64_8kcart.cfg -o $@ $< $(IP65LIB) $(C64PROGLIB)
ruby fix_cart.rb $@ 8192
-kipperkart.bin: kipperkart.o $(IP65TCPLIB) $(C64NB65LIB) $(INCFILES) ../cfg/c64_16kcart.cfg
- $(LD) -m kipperkart.map -vm -C ../cfg/c64_16kcart.cfg -o $@ $< $(IP65TCPLIB) $(C64NB65LIB)
+kipperkart.bin: kipperkart.o $(IP65TCPLIB) $(C64PROGLIB) $(INCFILES) ../cfg/c64_16kcart.cfg
+ $(LD) -m kipperkart.map -vm -C ../cfg/c64_16kcart.cfg -o $@ $< $(IP65TCPLIB) $(C64PROGLIB)
ruby fix_cart.rb $@ 16384
ruby dupe_cart.rb kipperkart.bin kipperkart_29c040.bin 32
-kipperterm.bin: kipperterm.o $(IP65TCPLIB) $(C64NB65LIB) $(INCFILES) ../cfg/c64_16kcart.cfg
- $(LD) -m kipperterm.map -vm -C ../cfg/c64_16kcart.cfg -o $@ $< $(IP65TCPLIB) $(C64NB65LIB)
+kipperterm.bin: kipperterm.o $(IP65TCPLIB) $(C64PROGLIB) $(INCFILES) ../cfg/c64_16kcart.cfg
+ $(LD) -m kipperterm.map -vm -C ../cfg/c64_16kcart.cfg -o $@ $< $(IP65TCPLIB) $(C64PROGLIB)
ruby fix_cart.rb $@ 16384
ruby dupe_cart.rb kipperterm.bin kipperterm_29c040.bin 32
diff --git a/client/carts/nb65_c64_ram_header.s b/client/carts/c64_cart_ram_header.s
similarity index 83%
rename from client/carts/nb65_c64_ram_header.s
rename to client/carts/c64_cart_ram_header.s
index 5c8e068..9350530 100644
--- a/client/carts/nb65_c64_ram_header.s
+++ b/client/carts/c64_cart_ram_header.s
@@ -23,13 +23,22 @@ basicstub:
.word 0
init:
+
+ ;turn off BASIC
+ lda $01
+ and #$FE ;mask out bit 0
+ sta $01
+
+ ;now relocate the cart
+
ldax #cart_data
stax copy_src
ldax #$8000
stax copy_dest
- ldax #$2000
+ ldax #$4000
jsr copymem
- jmp ($8000) ;cold start vector
+
+ jmp ($8002) ;warm start vector
;copy memory
;inputs:
@@ -68,6 +77,4 @@ copymem:
;this is where the cart data will be appended to:
cart_data:
-
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/client/carts/kipperkart.s b/client/carts/kipperkart.s
index da7dbab..680985c 100644
--- a/client/carts/kipperkart.s
+++ b/client/carts/kipperkart.s
@@ -92,7 +92,7 @@
.import cfg_tftp_server
kipper_param_buffer = $6000
- directory_buffer = $6020
+ directory_buffer = $4020
.bss
@@ -101,7 +101,7 @@ temp_ptr: .res 2
call_downloaded_prg:
jsr $0000 ;overwritten when we load a file
- jmp init
+ jmp cold_init
get_value_of_axy: ;some more self-modifying code
lda $ffff,y
@@ -109,19 +109,18 @@ get_value_of_axy: ;some more self-modifying code
.segment "CARTRIDGE_HEADER"
-.word init ;cold start vector
-.word $FE47 ;warm start vector
+.word cold_init ;cold start vector
+.word warm_init ;warm start vector
.byte $C3,$C2,$CD,$38,$30 ; "CBM80"
.byte "KIPPER" ; API signature
jmp kipper_dispatcher ; KPR_DISPATCH_VECTOR : entry point for KIPPER functions
jmp ip65_process ;KPR_PERIODIC_PROCESSING_VECTOR : routine to be periodically called to check for arrival of ethernet packets
-jmp timer_vbl_handler ;KPR_VBL_VECTOR : routine to be called during each vertical blank interrupt
-
+.byte $0,$0,$0 ;reserved for future use
.code
-init:
+cold_init:
;first let the kernal do a normal startup
sei
@@ -130,7 +129,8 @@ init:
jsr $fd15 ;set vectors for KERNAL
jsr $ff5B ;init. VIC
cli ;KERNAL init. finished
-
+
+warm_init:
;set some funky colours
LDA #$04 ;purple
@@ -215,12 +215,14 @@ main_menu:
@not_f2:
cmp #KEYCODE_F3
- bne @not_f3
- .byte $92 ; fixme
+ bne @not_f3
+ jsr upload_d64
+ jmp main_menu
@not_f3:
cmp #KEYCODE_F4
bne @not_f4
- jmp d64_download
+ jsr d64_download
+ jmp main_menu
@not_f4:
cmp #KEYCODE_F5
@@ -460,7 +462,7 @@ boot_into_file:
ldax #cant_boot_basic
jsr print
jsr wait_for_keypress
- jmp init
+ jmp warm_init
@not_a_basic_file:
ldax kipper_param_buffer
@@ -750,6 +752,8 @@ autoexec_filename: .byte "AUTOEXEC.PRG",0
downloading_msg: .byte "DOWN"
loading_msg: .asciiz "LOADING "
+uploading_msg: .byte "UPLOADING ",0
+
getting_dir_listing_msg: .byte "FETCHING DIRECTORY",13,0
dir_listing_fail_msg:
diff --git a/client/carts/kipperterm.s b/client/carts/kipperterm.s
index b6abd96..815c367 100644
--- a/client/carts/kipperterm.s
+++ b/client/carts/kipperterm.s
@@ -106,7 +106,7 @@ temp_ptr: .res 2
.byte "KIPPER" ; API signature
jmp kipper_dispatcher ; KPR_DISPATCH_VECTOR : entry point for KIPPER functions
jmp ip65_process ;KPR_PERIODIC_PROCESSING_VECTOR : routine to be periodically called to check for arrival of ethernet packets
-jmp timer_vbl_handler ;KPR_VBL_VECTOR : routine to be called during each vertical blank interrupt
+.byte $0,$0,$0 ;reserved for future use
.code
diff --git a/client/drivers/Makefile b/client/drivers/Makefile
index f0e7544..d14a214 100644
--- a/client/drivers/Makefile
+++ b/client/drivers/Makefile
@@ -13,7 +13,7 @@ AFLAGS=
DRIVERS=\
apple2prog.lib \
c64prog.lib \
- c64nb65.lib \
+# c64nb65.lib \
all: $(DRIVERS)
@@ -24,8 +24,8 @@ apple2prog.lib: a2print.o uthernet.o a2timer.o a2kernal.o a2input.o a2charconv.o
c64prog.lib: c64print.o rr-net.o c64timer.o c64kernal.o c64inputs.o c64_disk_access.o c64charconv.o
ar65 a $@ $^
-c64nb65.lib: c64print.o rr-net.o c64timer_nb65.o c64kernal.o c64inputs.o c64_disk_access.o c64charconv.o
- ar65 a $@ $^
+#c64nb65.lib: c64print.o rr-net.o c64timer_nb65.o c64kernal.o c64inputs.o c64_disk_access.o c64charconv.o
+# ar65 a $@ $^
clean:
rm -f *.o
diff --git a/client/examples/upnatom.s b/client/examples/upnatom.s
index 546384c..da79eee 100644
--- a/client/examples/upnatom.s
+++ b/client/examples/upnatom.s
@@ -678,11 +678,6 @@ print_errorcode:
-update_KPR_counters_irq:
- start_irq
- jsr KPR_VBL_VECTOR
- jmp exit_from_irq
-
play_music_irq:
; inc BORDER_COLOR
@@ -816,8 +811,6 @@ raster_jump_table:
.byte $0,$20
.word pixel_scroll_irq
- .byte $0,$30
- .word update_KPR_counters_irq
.byte $0,$80
.word play_music_irq
@@ -857,6 +850,7 @@ scroll_template:
feed_url:
+.byte "http://static.cricinfo.com/rss/livescores.xml",0
.byte "http://search.twitter.com/search.atom?q=kipper",0
;leave space for whatever we read in from disk
.repeat 128
diff --git a/client/inc/disk_transfer.i b/client/inc/disk_transfer.i
index 7354459..a3c04d1 100644
--- a/client/inc/disk_transfer.i
+++ b/client/inc/disk_transfer.i
@@ -2,6 +2,7 @@
.import io_track_no
.import io_sector_no
.import io_write_sector
+.import io_read_sector
.segment "APP_SCRATCH"
@@ -11,7 +12,7 @@
sectors_in_track: .res 1
sector_buffer_address: .res 2
-;the io_* an tftp_* routines both use the 'output_buffer' so we lose the data in the second sector
+;the io_* and tftp_* routines both use the 'output_buffer' so we lose the data in the second sector
;therefore we need to copy the data to here before we use it
sector_buffer: .res 512
@@ -28,6 +29,7 @@ download_d64:
stax kipper_param_buffer+KPR_TFTP_POINTER
ldax #kipper_param_buffer
kippercall #KPR_TFTP_CALLBACK_DOWNLOAD
+after_tftp_transfer:
bcc :+
jsr print_cr
print_failed
@@ -41,6 +43,54 @@ download_d64:
rts
+upload_d64:
+ ldax #enter_filename
+ jsr print
+ kippercall #KPR_INPUT_HOSTNAME ;the 'hostname' filter is pretty close to being a filter for legal chars in file names as well
+ bcc :+
+ rts
+:
+
+ stax kipper_param_buffer+KPR_TFTP_FILENAME
+ jsr cls
+ ;switch to lower case charset
+ lda #23
+ sta $d018
+ ldax #uploading_msg
+ jsr print
+ ldax kipper_param_buffer+KPR_TFTP_FILENAME
+ jsr print
+ jsr reset_counters_to_first_sector
+ ldax #read_next_block
+ stax kipper_param_buffer+KPR_TFTP_POINTER
+ ldax #kipper_param_buffer
+ kippercall #KPR_TFTP_CALLBACK_UPLOAD
+ jmp after_tftp_transfer
+
+read_next_block:
+;tftp upload callback routine
+;AX will point to address to fill
+ stax sector_buffer_address
+ lda track
+ cmp #36
+ beq @past_last_track
+ jsr read_sector
+ jsr move_to_next_sector
+ bcc @not_last_sector
+ ldax #$100
+ rts
+@not_last_sector:
+ inc sector_buffer_address+1
+ ldax sector_buffer_address
+ jsr read_sector
+ jsr move_to_next_sector
+ ldax #$200
+ rts
+@past_last_track:
+ ldax #$0000
+ rts
+
+
save_sector:
ldax #position_cursor_for_track_display
jsr print
@@ -58,7 +108,27 @@ save_sector:
inc errors
:
jmp move_to_next_sector
+
+
+
+read_sector:
+ ldax #position_cursor_for_track_display
+ jsr print
+ jsr print_current_sector
+ lda track
+ sta io_track_no
+
+ lda sector
+ sta io_sector_no
+
+ ldax sector_buffer_address
+ jsr io_read_sector
+ bcc :+
+ inc errors
+:
+ jmp move_to_next_sector
+
write_next_block:
;tftp download callback routine
;AX will point at block to be written (prepended with 2 bytes indicating block length)
@@ -73,10 +143,6 @@ write_next_block:
stax sector_buffer_address
ldax #$200
jsr copymem
-
-
-
-
jsr save_sector
bcc @not_last_sector
@@ -165,4 +231,6 @@ errors_msg:
.byte " ERRORS $",0
position_cursor_for_track_display:
.byte $13,13,13,0
-
+position_cursor_for_error_display:
+.byte $13,13,13,0
+enter_filename: .asciiz "FILENAME: "
diff --git a/client/inc/kipper_constants.i b/client/inc/kipper_constants.i
index ea98eca..3db0b94 100644
--- a/client/inc/kipper_constants.i
+++ b/client/inc/kipper_constants.i
@@ -8,7 +8,6 @@ KPR_API_VERSION_NUMBER EQU $01
KPR_CART_SIGNATURE EQU $8009
KPR_DISPATCH_VECTOR EQU $800f
KPR_PERIODIC_PROCESSING_VECTOR EQU $8012
-KPR_VBL_VECTOR EQU $8015
;function numbers
;to make a function call:
diff --git a/client/inc/sidplay.i b/client/inc/sidplay.i
index 380b604..52aeea6 100644
--- a/client/inc/sidplay.i
+++ b/client/inc/sidplay.i
@@ -160,7 +160,6 @@ play_sid:
@reset_song:
jsr print_current_song
- lda current_song
jsr init_song
jmp @keypress_loop
@@ -198,7 +197,8 @@ install_irq_handler:
irq_handler:
-
+ lda play_song_handler+2
+ beq :+
lda $d012
cmp #100
bne irq_handler
@@ -207,7 +207,7 @@ irq_handler:
inc $d020
jsr play_song
dec $d020
-
+:
jmp jmp_old_irq
@@ -273,6 +273,7 @@ play_song_handler:
pla
sta $01
rts
+
jmp_old_irq:
jmp $ffff
diff --git a/client/inc/version.i b/client/inc/version.i
index 7189cc2..17181db 100644
--- a/client/inc/version.i
+++ b/client/inc/version.i
@@ -1 +1 @@
-.byte "0.9.30"
+.byte "0.9.35"
diff --git a/client/ip65/function_dispatcher.s b/client/ip65/function_dispatcher.s
index 0176701..076d956 100644
--- a/client/ip65/function_dispatcher.s
+++ b/client/ip65/function_dispatcher.s
@@ -51,32 +51,13 @@ buffer_ptr= copy_dest
.data
-jmp_old_irq:
- jmp $0000
-
-irq_handler_installed_flag:
- .byte 0
ip_configured_flag:
.byte 0
.code
-irq_handler:
- jsr KPR_VBL_VECTOR
- jmp jmp_old_irq
-
-install_irq_handler:
- ldax $314 ;previous IRQ handler
- stax jmp_old_irq+1
- sei ;don't want any interrupts while we fiddle with the vector
- ldax #irq_handler
- stax $314 ;previous IRQ handler
- sta irq_handler_installed_flag
- cli
- rts
-
set_tftp_params:
ldx #$03
:
@@ -121,22 +102,17 @@ kipper_dispatcher:
bne ip_configured
jsr ip65_init
bcs init_failed
- jsr install_irq_handler
jsr dhcp_init
bcc dhcp_ok
jsr ip65_init ;if DHCP failed, then reinit the IP stack (which will reset IP address etc that DHCP messed with to cartridge default values)
dhcp_ok:
lda #1
sta ip_configured_flag
-irq_handler_installed:
clc
init_failed:
rts
ip_configured:
- lda irq_handler_installed_flag
- bne irq_handler_installed
- jsr install_irq_handler
clc
rts
:
@@ -310,13 +286,8 @@ ip_configured:
cpy #KPR_DEACTIVATE
+ ;nothing to do now we don't use IRQ
bne :+
- ldax jmp_old_irq+1
- sei ;don't want any interrupts while we fiddle with the vector
- stax $314 ;previous IRQ handler
- lda #0
- sta irq_handler_installed_flag
- cli
clc
rts
:
diff --git a/dist/make_dist.rb b/dist/make_dist.rb
index 57f6484..e6ac18e 100644
--- a/dist/make_dist.rb
+++ b/dist/make_dist.rb
@@ -12,19 +12,20 @@ VERSION_FILE=File.expand_path(File.dirname(__FILE__)+"/version_number.txt")
VERSION_INC_FILE=File.expand_path(File.dirname(__FILE__)+"/../client/inc/version.i")
version_string=File.open(VERSION_FILE).read
-["","c64","lib","bin","boot","doc","inc","examples"].each do |dir_suffix|
+["","c64","lib","bin","boot","doc","inc"].each do |dir_suffix|
dir_path="#{WORKING_DIR}/#{dir_suffix}"
Dir.mkdir(dir_path) unless File.exist?(dir_path)
end
[
#["client/nb65/utherboot.dsk","a2/"],
-["client/nb65/set_ip_config.rb","bin/"],
+["client/carts/set_ip_config.rb","bin/"],
#["client/nb65/nb65_rrnet.bin","c64/"],
-["client/nb65/nb65_c64_ram.prg","c64/"],
-["client/nb65/nb65_std_cart.bin","c64/"],
-["client/nb65/nb65_tcp_cart.bin","c64/"],
-["client/nb65/nb65_tcp_cart_rr.bin","c64/"],
+["client/carts/kipperkart.prg","c64/"],
+["client/carts/kipperkart.bin","c64/"],
+["client/carts/kipperkart_rr.bin","c64/"],
+["client/carts/kipperterm.bin","c64/"],
+["client/carts/netboot.bin","c64/"],
["client/nb65/d64_upload.prg","boot/"],
["client/examples/upnatom.prg","boot/"],
["server/lib/tftp_server.rb","lib"],
@@ -37,10 +38,9 @@ end
["doc/netboot65.html","doc/index.html"],
#["doc/README.Apple2.html","doc"],
["doc/README.C64.html","doc"],
-["doc/nb65_api_technical_reference.doc","doc"],
+["doc/kipper_api_technical_reference.doc","doc"],
["client/inc/common.i","inc"],
-["client/inc/nb65_constants.i","inc"],
-["client/examples/dasm_example.asm","examples/"],
+["client/inc/kipper_constants.i","inc"],
["client/examples/upnatom.d64","c64/"],
#["client/nb65/d64_upload.s","examples/"],
#["client/nb65/nb65_skeleton.s","examples/"],
diff --git a/dist/version_number.txt b/dist/version_number.txt
index f1bf126..1485a00 100644
--- a/dist/version_number.txt
+++ b/dist/version_number.txt
@@ -1 +1 @@
-0.9.30
\ No newline at end of file
+0.9.35
\ No newline at end of file
diff --git a/doc/README.C64.html b/doc/README.C64.html
index a77fbce..26ee7b5 100644
--- a/doc/README.C64.html
+++ b/doc/README.C64.html
@@ -1,6 +1,6 @@
-NETBOOT65 FOR THE C64
+NETBOOT FOR THE C64
-There are 2 major 'flavours' of the NB65 client, the major difference being whether the cart supports UDP only (but allows access to BASIC), or UDP + TCP (but loses access to BASIC). The
+There are 2 major 'flavours' of clients, the major difference being whether the cart supports UDP only (but allows access to BASIC), or UDP + TCP (but loses access to BASIC). The
reason for this is the UDP only version of the client fits into an 8KB cartridge, whereas the TCP code pushes the cartridge size up to 16KB, and the upper half of a 16KB cartridge sits in the same
memory location as BASIC.
@@ -15,10 +15,10 @@ Within the major flavours, there are also variations in media - the majority of
filename | flavour | media | command to use in VICE |
-nb65_c64_ram.prg | UDP only (+ BASIC) | RAM | x64.exe nb65_c64_ram.prg |
-nb65_std_cart.bin | UDP only (+ BASIC) | standard 8KB cart | x64.exe -cart8 nb65_std_cart.bin |
-nb65_tcp_cart.bin | UDP/TCP (no BASIC) | standard 16KB cart | x64.exe -cart16 nb65_tcp_cart.bin |
-nb65_tcp_cart_rr.bin | UDP/TCP (no BASIC) | Retro Replay cart image | x64.exe -cartrr nb65_tcp_cart_rr.bin |
+netboot.bin | UDP only (+ BASIC) | standard 8KB cart | x64.exe -cart8 netboot.bin |
+kipperkart.bin | UDP/TCP (no BASIC) | standard 16KB cart | x64.exe -cart16 kipperkart.bin |
+kipperterm.bin | telnet & gopher client | standard 16KB cart | x64.exe -cart16 kipperterm.bin |
+kipperkart_rr.bin | UDP/TCP (no BASIC) | Retro Replay cart image | x64.exe -cartrr kipperkart_rr.bin |
@@ -28,17 +28,12 @@ When the cartridge starts, it will attempt to configure the IP stack via DHCP. I
then the IP stack will fall back to using the IP configuration built into the cartridge. See the section "IP CONFIGURATION" for info on how to modify the
cartridge defaults prior to burning an image.
-Once the IP stack is initialised, an attempt to boot from disk will take place (on the 16KB image only - see autoexec section for more). If this fails, or the 8KB cartridge is being used,
-the "main menu" screen will be displayed. There are slight variations between the menus shown on the 2 "flavours".
-
Main Menu - UDP only carts
-
- - F1 : TFTP BOOT. This will query a TFTP server for a list of PRG files, and allow the selection of a file to be downloaded and executed. Most 'single load' applications should work
- - F3 : BASIC. This will exit to BASIC (with IP stack still configured, so NB65 aware apps can be loaded from disk and run)
- - F5 : ARP TABLE. This will show a table of the current mapping of IP and MAC addresses
- - F7 : CONFIG. This brings up a menu where the IP configuration can be modified. Changes made here will be persistent until the next reboot.
-
-Main Menu - UDP/TCP carts
+NETBOOT - UDP only cart
+
+Once the IP stack is initialised, an attempt to boot from the network will take place. a TFTP server will be queried for a list of PRG files, and then a menu appears allowing the selection of a file to be downloaded and executed. Most 'single load' applications should work
+
+KIPPERKART - UDP/TCP cart
- F1 : TFTP BOOT. This will query a TFTP server for a list of PRG files, and allow the selection of a file to be downloaded and executed. This version of TFTP BOOT is restricted to running only
pure machine language programs, since BASIC is not available when this cart is active. (NB - programs that are pure M/L except for a BASIC stub consisting of a single SYS call will be executed).
@@ -47,12 +42,19 @@ the "main menu" screen will be displayed. There are slight variations between th
pure machine language programs, since BASIC is not available when this cart is active. (NB - programs that are pure M/L except for a BASIC stub consisting of a single SYS call will be executed).
- - F3 : NET APPS. This will bring up another menu of network-orientated applications (see below for more details).
-
- F5 : ARP TABLE. This will show a table of the current mapping of IP and MAC addresses
+ - F3 : UPLOAD D64. TBD
+ - F4 : DOWNLOAD D64. A TFTP server is queried for a list of D64 files, which can be selected from a menu. Once a D64 file is selected, it will be downloaded and written to drive #8.
+ - F5 : SID NETPLAY. A TFTP server is queried for a list of SID files, which can be selected from a menu. Once a SID file is selected, it will be played. Not all SIDs work yet.
+ - F6 : PING. You will be prompted for a hostname which will be pinged 3 times, and a response time (in milliseconds) is printed for each ping.
- F7 : CONFIG. This brings up a menu where the IP configuration can be modified. Changes made here will be persistent until the next reboot.
-Net Apps - UDP/TCP carts
+AUTOEXEC
+Once the 16KB cartridge image has initialised the IP stack, it will look for a file called "autoexec.prg" on the default drive. If this file is found it will be loaded (using the load address specified by the first 2
+bytes of the file) and executed. NB - since BASIC is not available only 100% Machine Language programs can be executed, although if there is a BASIC stub consisting of a single line that does a SYS
+call, the target of the SYS call will be used as the address to start execution from.
+
+KIPPERTERM cart
- F1 : TELNET. You will be prompted to enter a hostname, a port number, and a connection mode. Connection mode is either
@@ -62,13 +64,12 @@ the "main menu" screen will be displayed. There are slight variations between th
- Line - Data is converted to/from ASCII, but each line of input can be edited and is not sent until the RETURN key is pressed.
Once a connection is made, it can be terminated by hitting RUN/STOP
- - F2 : GOPHER. You will be prompted to enter the hostname (only - no port number can be specified) of a gopher server, and the gopher client will be launched connecting to the specified server.
-
- F3 : GOPHER.FLOODGAP.COM. This will launch the Gopher client, and connect to the gopher portal at gopher://gopher.floodgap.com/
- - F5 : PING. You will be prompted for a hostname which will be pinged 3 times, and a response time (in milliseconds) is printed for each ping.
- - F7 : MAIN MENU. This will return to the main menu.
+ - F3 : GOPHER. You will be prompted to enter the hostname (only - no port number can be specified) of a gopher server, and the gopher client will be launched connecting to the specified server.
+
- F5 : GOPHER.FLOODGAP.COM. This will launch the Gopher client, and connect to the gopher portal at gopher://gopher.floodgap.com/
+ - F7 : CONFIG. This brings up a menu where the IP configuration can be modified. Changes made here will be persistent until the next reboot.
-Gopher Client - UDP/TCP carts
+Gopher Client
Once a gopher resource is loaded, the following keys are active:
- SPACE, F7 or down arrow : scroll down to next page
@@ -83,10 +84,6 @@ starting with a highlighted letter (e.g. the first link on a page will have an i
the 2nd link on a page will have an inverse "B" next to it etc). Press the letter assigned to the link
to load up that resource.
-
AUTOEXEC
-Once the 16KB cartridge image has initialised the IP stack, it will look for a file called "autoexec.prg" on the default drive. If this file is found it will be loaded (using the load address specified by the first 2
-bytes of the file) and executed. NB - since BASIC is not available only 100% Machine Language programs can be executed, although if there is a BASIC stub consisting of a single line that does a SYS
-call, the target of the SYS call will be used as the address to start execution from.
IP CONFIGURATION
There is a script in the "bin" folder called "set_ip_config.rb" that can be used to modify the MAC address and IP config details in the cart image before
diff --git a/doc/kipper_api_technical_reference.doc b/doc/kipper_api_technical_reference.doc
index f9c3239fd152948c0119e3f4896f31d419466abf..fb8d53f8a99e58ba595aa73ffb39e93a6d2960b5 100644
GIT binary patch
delta 24225
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
B(Wn3b
diff --git a/doc/netboot65.html b/doc/netboot65.html
index 8fa316c..7bfb067 100644
--- a/doc/netboot65.html
+++ b/doc/netboot65.html
@@ -84,7 +84,7 @@ netboot65 is a project to support network booting Commodore 64 computers. It is
- a server (written in ruby for maximum portability) that provides a TFTP server with some proprietary extensions to allow clients to request a directory listing.
- clients (currently a cartridge or a standalone prg file for C64) that initialises an IP stack, acquires an IP address via DHCP, queries the local LAN for a TFTP server,
and then allows a program file to be downloaded via TFTP and executed. Currently only 'single load' programs are supported, but many old games and utility programs can be run in this way.
-
- the NB65 API (currently for C64 only) that allows for IP aware applications to be developed without being tied to a specific MAC address, IP address or network device, as is the case with most existing
+
- the KIPPER API (currently for C64 only) that allows for IP aware applications to be developed without being tied to a specific MAC address, IP address or network device, as is the case with most existing
IP libraries for 6502 computers.
@@ -96,7 +96,7 @@ IP libraries for 6502 computers.