User Tools

Site Tools


base:using_a_running_vice_session_for_development

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Next revisionBoth sides next revision
base:using_a_running_vice_session_for_development [2016-06-28 19:39] compyxbase:using_a_running_vice_session_for_development [2016-06-30 14:44] compyx
Line 139: Line 139:
 </code> </code>
  
-Again, this becomes tedious, having to type this again and again, so we update our Makefile:+Again, this becomes tedious, having to type this again and again, so we update our Makefile (just the new parts for now):
 <code make> <code make>
 +ASM=64tass
 +
 +
 # Default make target: just assemble the program: # Default make target: just assemble the program:
 all: demo.prg all: demo.prg
Line 147: Line 150:
 # Assemble program # Assemble program
 demo.prg: demo.s demo.prg: demo.s
-        $(X64) -a -C -o demo.prg demo.s+        $(ASM) -a -C -o demo.prg demo.s
  
  
Line 161: Line 164:
  
 The `-q 1` argument to netcat is required to allow the reset to properly finish. netcat does not wait for VICE to complete its task, it immediately exits on EOF, so we use `-q 1` to tell netcat to wait one second after EOF. You could also use `sleep 1` after issuing 'reset 0', it has the same effect (adjust to sleep 3 when using a non-patched KERNAL). The `-q 1` argument to netcat is required to allow the reset to properly finish. netcat does not wait for VICE to complete its task, it immediately exits on EOF, so we use `-q 1` to tell netcat to wait one second after EOF. You could also use `sleep 1` after issuing 'reset 0', it has the same effect (adjust to sleep 3 when using a non-patched KERNAL).
 +
 +Since the 'run' target depends on 'demo.prg', that file automatically gets (re)built whenever we issue `make run`, and when the building fails no data is inserted into VICE.
 +
  
 === Loading labels into VICE === === Loading labels into VICE ===
Line 171: Line 177:
 Again giving VICE time to process the 'clear_labels' command before sending the 'load_labels' command. Obviously not needed when issuing these commands from the shell, but using a Makefile, this is required. Again giving VICE time to process the 'clear_labels' command before sending the 'load_labels' command. Obviously not needed when issuing these commands from the shell, but using a Makefile, this is required.
  
-So, lets update our Makefile once again:+So, lets update our Makefile once again (full Makefile now):
 <code make> <code make>
 # x64 binary # x64 binary
-X64 = /usr/local/bin/x64+X64=/usr/local/bin/x64 
 +# Assembler 
 +ASM=64tass
  
 # Original KERNAL # Original KERNAL
Line 191: Line 199:
 # Assemble program and output VICE labels file # Assemble program and output VICE labels file
 demo.prg: demo.s demo.prg: demo.s
-        $(X64) -a -C -o demo.prg demo.s --vice-labels -l labels.txt+        $(ASM) -a -C -o demo.prg demo.s --vice-labels -l labels.txt
  
  
Line 208: Line 216:
  
 # Start VICE session with remote monitor and patched KERNAL in the background # Start VICE session with remote monitor and patched KERNAL in the background
 +# redirecting VICE's output to a black hole
 session: $(KERNAL_PATCHED) session: $(KERNAL_PATCHED)
         $(X64) -remotemonitor -kernal $(KERNAL_PATCHED) \         $(X64) -remotemonitor -kernal $(KERNAL_PATCHED) \
Line 218: Line 227:
         rm -f $(KERNAL_PATCHED)         rm -f $(KERNAL_PATCHED)
 </code> </code>
 +
 +There you have it, running and debugging code with a live VICE session, avoiding a lot of start up time. Unfortunately, when using this for code that **doesn't** set up IRQ's, we have a little problem.
 +
 +
 +== Proper BASIC initialization ==
 +
 +Since we bypass the C64's OS (the BASIC interpreter), when we execute code using the above method, the C64 doesn't know we executed a program and keeps the IRQ of the interpreter running, resulting in a nice blinking cursor.
 +
 +So we need a way to do a proper 'RUN' after injecting our program. We can do this with a simple SYS line and some tweaking of the <del>BASIC end-of-program pointer and</del> keyboard buffer.
 +
 +Let's assume our demo.s looks like this:
 +<code 64tass>
 +        * = $0801
 +        
 +        ; BASIC section: this becomes "2016 sys2061"
 +        .word (+), 2016
 +        .null $9e, ^start
 ++       .word 0
 +
 +start   ; this is $080d
 +        lda #0
 +        sta $d020
 +        sta $d021
 +        rts
 +</code>
 +
 +When we run this using the Makefile shown, the border and background turn black, but we get a blinking cursor. So we need to somehow force BASIC to properly run this SYS line. This can be done with a little tweaking:
 +(Thanks to Groepaz for coming up with the suggestion of simply putting 'RUN' into the keyboard buffer!)
 +
 +First we load the binary into VICE, then we set the end-of-basic pointer to $080d, fill the keyboard buffer with "RUN\r" and let the magic happen:
 +<code bash>
 +# reset, and wait, otherwise the BASIC start-of-basic pointer gets overwritten to $0000 while loading
 +echo 'reset 0' | netcat -q 1 localhost 6510
 +# load binary
 +echo 'l "demo.prg" 0' localhost 6510
 +# put 'RUN\r' into the keyboard buffer
 +echo 'f 0277 027a 52 55 4e 0d' | netcat localhost 6510
 +# set keyboard buffer size to $04 -> strlen("RUN\r")
 +echo 'f 00c6 00c6 04' | netcat localhost 6510
 +</code>
 +
 +Putting this in our Makefile, we end up with this:
 +<code make>
 +# x64 binary
 +X64 = /usr/local/bin/x64
 +# Assembler
 +ASM=64tass
 +
 +# Original KERNAL
 +KERNAL=/usr/lib/vice/C64/kernal
 +# Patched KERNAL
 +KERNAL_PATCHED=kernal-quick-memtest
 +
 +
 +# Generate patched KERNAL for faster reset (skip BASIC memtest)
 +$(KERNAL_PATCHED): $(KERNAL)
 + cp $(KERNAL) $(KERNAL_PATCHED)
 + echo "1d69: 9f" | xxd -r - $(KERNAL_PATCHED)
 +all: demo.prg
 +
 +
 +# Assemble program and output VICE labels file
 +demo.prg: demo.s
 +        $(ASM) -a -C -o demo.prg demo.s --vice-labels -l labels.txt
 +
 +
 +# Inject program into VICE session and run it
 +run: demo.prg
 +        # we need to wait one second for the reset to finish, so we use -q 1
 +        echo 'reset 0' | netcat -q 1 localhost 6510
 +        # clear and (re)load labels
 +        echo 'clear_labels' | netcat -q 1 localhost 6510
 +        echo 'load_labels "labels.txt"' | netcat localhost 6510
 +        # load demo.prg from the virtual FS, our host OS
 +        echo 'l "demo.prg 0"' | netcat localhost 6510
 +        # put 'RUN\r' into the keyboard buffer
 +        echo 'f 0277 027a 52 55 4e 0d' | netcat localhost 6510
 +        # set keyboard buffer size to $04 -> strlen("RUN\r")
 +        echo 'f 00c6 00c6 04' | netcat localhost 6510
 +
 +
 +# Start VICE session with remote monitor and patched KERNAL in the background
 +# redirecting VICE's output to a black hole
 +session: $(KERNAL_PATCHED)
 +        $(X64) -remotemonitor -kernal $(KERNAL_PATCHED) \
 +                > /dev/null 2>&1 &
 +
 +# Clean up
 +.PHONY: clean
 +clean:
 +        rm -f demo.prg
 +        rm -f $(KERNAL_PATCHED)
 +</code>
 +
 +
 +More later..
 +
 +TODO:
 +  * attaching disk images
 +  * debugging via telnet
 +  * writing a proper Makefile (perhaps putting all those echo's into a file, updating it with sed)
 +  * VIM integration
  
base/using_a_running_vice_session_for_development.txt · Last modified: 2016-07-01 13:35 by compyx