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 @@ -
@@ -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 |
-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". -