base:using_a_running_vice_session_for_development
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
base:using_a_running_vice_session_for_development [2016-06-28 20:00] – compyx | base:using_a_running_vice_session_for_development [2016-07-01 13:35] (current) – compyx | ||
---|---|---|---|
Line 11: | Line 11: | ||
This article attempts to explain that process. For now, only for *nix systems. | This article attempts to explain that process. For now, only for *nix systems. | ||
+ | Please note that I use a SVN snapshot of VICE, installed into /usr/local, so you may have to adjust a few paths, such as the location of the C64 kernal image. | ||
+ | |||
==== Requirements ==== | ==== Requirements ==== | ||
Line 21: | Line 23: | ||
* make for making things easier | * make for making things easier | ||
- | Obviously we need an assembler, one which can output VICE labels if you want to use that feature. I personally use 64tass (again, build a current version). | + | Obviously we need an assembler, one which can output VICE labels if you want to use that feature. I personally use 64tass (again, build a current version, r1184 added support for scoped labels, eg: .foo:bar). |
- | And of course a decent editor, one which can at least syntax highlight Makefile' | + | And of course a decent editor, one which can at least syntax highlight Makefile' |
Line 61: | Line 63: | ||
<code bash> | <code bash> | ||
- | cp /usr/lib/ | + | cp /usr/local/lib64/ |
echo "1d69: 9f" | xxd -r - kernal-quick-memtest | echo "1d69: 9f" | xxd -r - kernal-quick-memtest | ||
</ | </ | ||
Any method of altering a binary can be used, I prefer to do it this way, so I can stick it in a Makefile and never have to worry about whether I patched the KERNAL or not. | Any method of altering a binary can be used, I prefer to do it this way, so I can stick it in a Makefile and never have to worry about whether I patched the KERNAL or not. | ||
- | This makes the BASIC memtest finish immediately and still report the correct number of bytes free. (Thanks a lot to iAN CooG for suggesting this!) | + | This makes the BASIC memtest finish |
VICE still needs to know about this new KERNAL, so the command to start VICE becomes: | VICE still needs to know about this new KERNAL, so the command to start VICE becomes: | ||
Line 83: | Line 85: | ||
<code make> | <code make> | ||
- | # x64 binary | + | # VICE' |
- | X64 = / | + | X64=/ |
+ | # Standard flags to pass to VICE during startup | ||
+ | X64_FLAGS= | ||
# Original KERNAL | # Original KERNAL | ||
- | KERNAL=/ | + | KERNAL=/ |
# Patched KERNAL | # Patched KERNAL | ||
KERNAL_PATCHED=kernal-quick-memtest | KERNAL_PATCHED=kernal-quick-memtest | ||
Line 120: | Line 124: | ||
</ | </ | ||
+ | == Access VICE's output == | ||
+ | |||
+ | If you want to see VICE's messages, you redirect stdout and stderr to log files, which you inspect later, or just '' | ||
+ | |||
+ | <code make> | ||
+ | # VICE's x64 binary | ||
+ | X64=/ | ||
+ | # Standard flags to pass to VICE during startup | ||
+ | X64_FLAGS= | ||
+ | |||
+ | # Log file for x64's stdout (VICE' | ||
+ | X64_STDOUT=vice.log | ||
+ | # Log file for x64's stderr | ||
+ | X64_STDERR=vice.err (useful when debug VICE itself) | ||
+ | |||
+ | |||
+ | # Rule to start VICE with remote monitor, with patched KERNAl for quicker | ||
+ | # reset and running it in the background with any output of VICE redirected to | ||
+ | # log files | ||
+ | session: $(KERNAL_PATCHED) | ||
+ | $(X64) $(X64_FLAGS) -remotemonitor -kernal $(KERNAL_PATCHED) \ | ||
+ | 1> | ||
+ | </ | ||
==== Setting up the client side ==== | ==== Setting up the client side ==== | ||
Line 141: | Line 168: | ||
Again, this becomes tedious, having to type this again and again, so we update our Makefile (just the new parts for now): | 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 177: | ||
# 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 174: | Line 204: | ||
Again giving VICE time to process the ' | Again giving VICE time to process the ' | ||
- | So, lets update our Makefile once again (full Makefile now): | + | So, lets update our Makefile once again (nearly complete |
<code make> | <code make> | ||
- | # x64 binary | + | # vim: noet ts=8 sw=8 sts=8 |
- | X64 = / | + | # |
+ | # Makefile for CB64 article 'Using a running VICE session for development' | ||
+ | |||
+ | # This uses an SVN build of VICE, so adjust the paths to the x64 binary and | ||
+ | # the KERNAL if using the 2.4 stable build (which is way too old) | ||
+ | |||
+ | |||
+ | # Assembler (Soci' | ||
+ | ASM=64tass | ||
+ | # Assembler flags (see the 64tass manual) | ||
+ | ASM_FLAGS=--ascii --case-sensitive --shadow-check --m6502 | ||
+ | # Flags needed to output VICE labels (see the 64tass manual) | ||
+ | ASM_LABELS=--vice-labels -l $(LABEL_FILE) | ||
+ | |||
+ | # file to output VICE labels to | ||
+ | LABEL_FILE=labels.txt | ||
+ | |||
+ | |||
+ | # VICE' | ||
+ | X64=/ | ||
+ | # Standard flags to pass to VICE during startup | ||
+ | X64_FLAGS= | ||
+ | # Log file for x64's stdout output | ||
+ | X64_STDOUT=vice.log | ||
+ | # Log file for x64's stderr output | ||
+ | X64_STDERR=vice.err | ||
+ | |||
+ | |||
+ | # Our demo binary | ||
+ | TARGET=demo.prg | ||
# Original KERNAL | # Original KERNAL | ||
- | KERNAL=/ | + | KERNAL=/ |
# Patched KERNAL | # Patched KERNAL | ||
KERNAL_PATCHED=kernal-quick-memtest | KERNAL_PATCHED=kernal-quick-memtest | ||
- | # Generate patched KERNAL | + | # Default make target, just our binary |
+ | all: $(TARGET) | ||
+ | |||
+ | |||
+ | # Rule to assemble our binary and output labels | ||
+ | $(TARGET): demo.s | ||
+ | $(ASM) $(ASM_FLAGS) $(ASM_LABELS) -o $@ $< | ||
+ | |||
+ | |||
+ | # Rule to patch the KERNAL for quicker reset | ||
$(KERNAL_PATCHED): | $(KERNAL_PATCHED): | ||
cp $(KERNAL) $(KERNAL_PATCHED) | cp $(KERNAL) $(KERNAL_PATCHED) | ||
echo "1d69: 9f" | xxd -r - $(KERNAL_PATCHED) | echo "1d69: 9f" | xxd -r - $(KERNAL_PATCHED) | ||
- | all: demo.prg | ||
- | # Assemble program | + | # Rule to start VICE with remote monitor, with patched KERNAl for quicker |
- | demo.prg: demo.s | + | # reset and running it in the background with any output |
- | $(X64) -a -C -o demo.prg demo.s --vice-labels -l labels.txt | + | # log file files |
+ | session: $(KERNAL_PATCHED) | ||
+ | $(X64) $(X64_FLAGS) -remotemonitor | ||
+ | 1> | ||
- | # Inject | + | # Rule to inject the program |
- | run: demo.prg | + | run: $(TARGET) |
- | # we need to wait one second | + | # reset machine and wait for 1 second after EOF from machine |
- | echo 'reset 0' | netcat -q 1 localhost 6510 | + | echo 'reset 0' | netcat -q1 localhost 6510 |
- | # clear and (re)load labels | + | |
- | echo ' | + | # optional: |
- | echo ' | + | # command to complete) |
- | # load demo.prg from the virtual FS, our host OS | + | echo ' |
- | echo 'l "demo.prg 0"' | + | echo ' |
- | # this assumes demo.prg starts at $080d | + | |
+ | # load binary | ||
+ | echo 'l "$(TARGET)" | ||
+ | # execute binary, ignoring BASIC interpreter | ||
echo 'g 080d' | netcat localhost 6510 | echo 'g 080d' | 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 | # Clean up | ||
Line 230: | Line 297: | ||
Since we bypass the C64's OS (the BASIC interpreter), | Since we bypass the C64's OS (the BASIC interpreter), | ||
- | So we need a way to do a proper ' | + | So we need a way to do a proper ' |
+ | |||
+ | Let's assume our demo.s looks like this: | ||
+ | <code 6502tasm> | ||
+ | * = $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 | ||
+ | </ | ||
+ | |||
+ | 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 ' | ||
+ | |||
+ | First we load the binary into VICE, then we set the end-of-basic pointer to $080d, fill the keyboard buffer with " | ||
+ | <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 " | ||
+ | # put ' | ||
+ | echo 'f 0277 027a 52 55 4e 0d' | netcat localhost 6510 | ||
+ | # set keyboard buffer size to $04 -> strlen(" | ||
+ | echo 'f 00c6 00c6 04' | netcat localhost 6510 | ||
+ | </ | ||
+ | |||
+ | Putting this in our Makefile, we end up with this: | ||
+ | <code make> | ||
+ | # vim: noet ts=8 sw=8 sts=8 | ||
+ | # | ||
+ | # Makefile for CB64 article 'Using a running VICE session for development' | ||
+ | |||
+ | # This uses an SVN build of VICE, so adjust the paths to the x64 binary and | ||
+ | # the KERNAL if using the 2.4 stable build (which is way too old) | ||
+ | |||
+ | |||
+ | # Assembler (Soci' | ||
+ | ASM=64tass | ||
+ | # Assembler flags (see the 64tass manual) | ||
+ | ASM_FLAGS=--ascii --case-sensitive --shadow-check --m6502 | ||
+ | # Flags needed to output VICE labels (see the 64tass manual) | ||
+ | ASM_LABELS=--vice-labels -l $(LABEL_FILE) | ||
+ | |||
+ | # file to output VICE labels to | ||
+ | LABEL_FILE=labels.txt | ||
+ | |||
+ | |||
+ | # VICE's x64 binary | ||
+ | X64=/ | ||
+ | # Standard flags to pass to VICE during startup | ||
+ | X64_FLAGS= | ||
+ | # Log file for x64's stdout output | ||
+ | X64_STDOUT=vice.log | ||
+ | # Log file for x64's stderr output | ||
+ | X64_STDERR=vice.err | ||
+ | |||
+ | |||
+ | # Our demo binary | ||
+ | TARGET=demo.prg | ||
+ | |||
+ | # Original KERNAL | ||
+ | KERNAL=/ | ||
+ | # Patched KERNAL | ||
+ | KERNAL_PATCHED=kernal-quick-memtest | ||
+ | |||
+ | |||
+ | # Default make target, just our binary | ||
+ | all: $(TARGET) | ||
+ | |||
+ | |||
+ | # Rule to assemble our binary and output labels for VICE | ||
+ | $(TARGET): demo.s | ||
+ | $(ASM) $(ASM_FLAGS) $(ASM_LABELS) -o $@ $< | ||
+ | |||
+ | |||
+ | # Rule to patch the KERNAL for quicker reset | ||
+ | $(KERNAL_PATCHED): | ||
+ | cp $(KERNAL) $(KERNAL_PATCHED) | ||
+ | echo "1d69: 9f" | xxd -r - $(KERNAL_PATCHED) | ||
+ | |||
+ | |||
+ | # Rule to start VICE with remote monitor, with patched KERNAl for quicker | ||
+ | # reset and running it in the background with any output of VICE redirected to | ||
+ | # log file files | ||
+ | session: $(KERNAL_PATCHED) | ||
+ | $(X64) $(X64_FLAGS) -remotemonitor -kernal $(KERNAL_PATCHED) \ | ||
+ | 1> | ||
+ | |||
+ | |||
+ | # Rule to inject the program file and run it | ||
+ | run: $(TARGET) | ||
+ | # reset machine and wait for 1 second after EOF from machine | ||
+ | echo 'reset 0' | netcat -q1 localhost 6510 | ||
+ | |||
+ | # optional: load labels (we have to wait for one second to allow the | ||
+ | # command to complete) | ||
+ | echo ' | ||
+ | echo ' | ||
+ | |||
+ | # load binary | ||
+ | echo 'l " | ||
+ | # run binary by putting ' | ||
+ | echo 'f 0277 027a 52 55 4e 0d' | netcat localhost 6510 | ||
+ | echo 'f 00c6 00c6 04' | netcat localhost 6510 | ||
+ | # now the BASIC interpreter notices it has data in its buffer and parses that, | ||
+ | # resulting in a proper RUN being executed for our program. Even the KERNAL | ||
+ | # itself does it, just look at $e5ee, the handler for Shift+Run/ | ||
+ | |||
+ | |||
+ | .PHONY: clean | ||
+ | clean: | ||
+ | rm -f $(KERNAL_PATCHED) | ||
+ | rm -f $(LABEL_FILE) $(X64_STDOUT) $(X64_STDERR) | ||
+ | rm -f $(TARGET) | ||
+ | </ | ||
+ | |||
+ | |||
+ | More later.. | ||
- | (More coming up, tired) | + | TODO: |
+ | * attaching disk images | ||
+ | * debugging via telnet | ||
+ | * < | ||
+ | * VIM integration | ||
base/using_a_running_vice_session_for_development.1467136836.txt.gz · Last modified: 2016-06-28 20:00 by compyx