mirror of
https://github.com/StewBC/penetrator-apple2.git
synced 2024-06-08 08:33:38 +00:00
Initial commit
This commit is contained in:
commit
978a6fa77f
2
.gitattributes
vendored
Normal file
2
.gitattributes
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
# Auto detect text files and perform LF normalization
|
||||||
|
* text=auto
|
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
.vscode/*
|
||||||
|
!.vscode/settings.json
|
||||||
|
!.vscode/tasks.json
|
||||||
|
!.vscode/launch.json
|
||||||
|
!.vscode/extensions.json
|
||||||
|
*.code-workspace
|
24
LICENSE
Normal file
24
LICENSE
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
This is free and unencumbered software released into the public domain.
|
||||||
|
|
||||||
|
Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||||
|
distribute this software, either in source code form or as a compiled
|
||||||
|
binary, for any purpose, commercial or non-commercial, and by any
|
||||||
|
means.
|
||||||
|
|
||||||
|
In jurisdictions that recognize copyright laws, the author or authors
|
||||||
|
of this software dedicate any and all copyright interest in the
|
||||||
|
software to the public domain. We make this dedication for the benefit
|
||||||
|
of the public at large and to the detriment of our heirs and
|
||||||
|
successors. We intend this dedication to be an overt act of
|
||||||
|
relinquishment in perpetuity of all present and future rights to this
|
||||||
|
software under copyright law.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
For more information, please refer to <http://unlicense.org>
|
354
Makefile
Normal file
354
Makefile
Normal file
|
@ -0,0 +1,354 @@
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
### Generic Makefile for cc65 projects - full version with abstract options ###
|
||||||
|
### V1.3.0(w) 2010 - 2013 Oliver Schmidt & Patryk "Silver Dream !" Łogiewa ###
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
### In order to override defaults - values can be assigned to the variables ###
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
# Space or comma separated list of cc65 supported target platforms to build for.
|
||||||
|
# Default: c64 (lowercase!)
|
||||||
|
TARGETS := apple2
|
||||||
|
|
||||||
|
# Name of the final, single-file executable.
|
||||||
|
# Default: name of the current dir with target name appended
|
||||||
|
PROGRAM :=
|
||||||
|
|
||||||
|
# Path(s) to additional libraries required for linking the program
|
||||||
|
# Use only if you don't want to place copies of the libraries in SRCDIR
|
||||||
|
# Default: none
|
||||||
|
LIBS :=
|
||||||
|
|
||||||
|
# Custom linker configuration file
|
||||||
|
# Use only if you don't want to place it in SRCDIR
|
||||||
|
# Default: none
|
||||||
|
CONFIG :=
|
||||||
|
|
||||||
|
# Additional C assembler flags and options.
|
||||||
|
# Default: none
|
||||||
|
CFLAGS =
|
||||||
|
|
||||||
|
# Additional assembler flags and options.
|
||||||
|
# Default: none
|
||||||
|
ASFLAGS = --debug-info --listing $@.lst
|
||||||
|
|
||||||
|
# Additional linker flags and options.
|
||||||
|
# Default: none
|
||||||
|
LDFLAGS = -vm -m $@.map -Ln $@.vice
|
||||||
|
|
||||||
|
# Path to the directory containing C and ASM sources.
|
||||||
|
# Default: src
|
||||||
|
SRCDIR :=
|
||||||
|
|
||||||
|
# Path to the directory where object files are to be stored (inside respective target subdirectories).
|
||||||
|
# Default: obj
|
||||||
|
OBJDIR :=
|
||||||
|
|
||||||
|
# Command used to run the emulator.
|
||||||
|
# Default: depending on target platform. For default (c64) target: x64 -kernal kernal -VICIIdsize -autoload
|
||||||
|
EMUCMD :=
|
||||||
|
|
||||||
|
# Optional commands used before starting the emulation process, and after finishing it.
|
||||||
|
# Default: none
|
||||||
|
#PREEMUCMD := osascript -e "tell application \"System Events\" to set isRunning to (name of processes) contains \"X11.bin\"" -e "if isRunning is true then tell application \"X11\" to activate"
|
||||||
|
#PREEMUCMD := osascript -e "tell application \"X11\" to activate"
|
||||||
|
#POSTEMUCMD := osascript -e "tell application \"System Events\" to tell process \"X11\" to set visible to false"
|
||||||
|
#POSTEMUCMD := osascript -e "tell application \"Terminal\" to activate"
|
||||||
|
PREEMUCMD :=
|
||||||
|
POSTEMUCMD :=
|
||||||
|
|
||||||
|
# On Windows machines VICE emulators may not be available in the PATH by default.
|
||||||
|
# In such case, please set the variable below to point to directory containing
|
||||||
|
# VICE emulators.
|
||||||
|
ifeq ($(OS),Windows_NT)
|
||||||
|
VICE_HOME :=
|
||||||
|
else
|
||||||
|
UNAME_S := $(shell uname -s)
|
||||||
|
ifeq ($(UNAME_S),Darwin)
|
||||||
|
VICE_HOME := /Applications/Vice/x64.app/Contents/MacOS/
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Options state file name. You should not need to change this, but for those
|
||||||
|
# rare cases when you feel you really need to name it differently - here you are
|
||||||
|
STATEFILE := Makefile.options
|
||||||
|
|
||||||
|
###################################################################################
|
||||||
|
#### DO NOT EDIT BELOW THIS LINE, UNLESS YOU REALLY KNOW WHAT YOU ARE DOING! ####
|
||||||
|
###################################################################################
|
||||||
|
|
||||||
|
###################################################################################
|
||||||
|
### Mapping abstract options to the actual assembler, assembler and linker flags ###
|
||||||
|
### Predefined assembler, assembler and linker flags, used with abstract options ###
|
||||||
|
### valid for 2.14.x. Consult the documentation of your cc65 version before use ###
|
||||||
|
###################################################################################
|
||||||
|
|
||||||
|
# assembler flags used to tell the assembler to optimise for SPEED
|
||||||
|
define _optspeed_
|
||||||
|
CFLAGS += -Oris
|
||||||
|
endef
|
||||||
|
|
||||||
|
# assembler flags used to tell the assembler to optimise for SIZE
|
||||||
|
define _optsize_
|
||||||
|
CFLAGS += -Or
|
||||||
|
endef
|
||||||
|
|
||||||
|
# assembler and assembler flags for generating listings
|
||||||
|
define _listing_
|
||||||
|
CFLAGS += --listing $$(@:.o=.lst)
|
||||||
|
ASFLAGS += --listing $$(@:.o=.lst)
|
||||||
|
REMOVES += $(addsuffix .lst,$(basename $(OBJECTS)))
|
||||||
|
endef
|
||||||
|
|
||||||
|
# Linker flags for generating map file
|
||||||
|
define _mapfile_
|
||||||
|
LDFLAGS += --mapfile $$@.map
|
||||||
|
REMOVES += $(PROGRAM).map
|
||||||
|
endef
|
||||||
|
|
||||||
|
# Linker flags for generating VICE label file
|
||||||
|
define _labelfile_
|
||||||
|
LDFLAGS += -Ln $$@.lbl
|
||||||
|
REMOVES += $(PROGRAM).lbl
|
||||||
|
endef
|
||||||
|
|
||||||
|
# Linker flags for generating a debug file
|
||||||
|
define _debugfile_
|
||||||
|
LDFLAGS += -Wl --dbgfile,$$@.dbg
|
||||||
|
REMOVES += $(PROGRAM).dbg
|
||||||
|
endef
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
### Defaults to be used if nothing defined in the editable sections above ###
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
# Presume the C64 target like the cl65 compile & link utility does.
|
||||||
|
# Set TARGETS to override.
|
||||||
|
ifeq ($(TARGETS),)
|
||||||
|
TARGETS := c64
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Presume we're in a project directory so name the program like the current
|
||||||
|
# directory. Set PROGRAM to override.
|
||||||
|
ifeq ($(PROGRAM),)
|
||||||
|
PROGRAM := $(notdir $(CURDIR))
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Presume the C and asm source files to be located in the subdirectory 'src'.
|
||||||
|
# Set SRCDIR to override.
|
||||||
|
ifeq ($(SRCDIR),)
|
||||||
|
SRCDIR := src
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Presume the object and dependency files to be located in the subdirectory
|
||||||
|
# 'obj' (which will be created). Set OBJDIR to override.
|
||||||
|
ifeq ($(OBJDIR),)
|
||||||
|
OBJDIR := obj
|
||||||
|
endif
|
||||||
|
TARGETOBJDIR := $(OBJDIR)/$(TARGETS)
|
||||||
|
|
||||||
|
# On Windows it is mandatory to have CC65_HOME set. So do not unnecessarily
|
||||||
|
# rely on cl65 being added to the PATH in this scenario.
|
||||||
|
ifdef CC65_HOME
|
||||||
|
CC := $(CC65_HOME)/bin/cl65
|
||||||
|
else
|
||||||
|
CC := cl65
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Default emulator commands and options for particular targets.
|
||||||
|
# Set EMUCMD to override.
|
||||||
|
cx16_EMUCMD := $(VICE_HOME)x16emu -run -prg
|
||||||
|
c64_EMUCMD := $(VICE_HOME)x64 -kernal kernal -VICIIdsize -autostart
|
||||||
|
c128_EMUCMD := $(VICE_HOME)x128 -kernal kernal -VICIIdsize -autoload
|
||||||
|
vic20_EMUCMD := $(VICE_HOME)xvic -kernal kernal -VICdsize -autoload
|
||||||
|
pet_EMUCMD := $(VICE_HOME)xpet -Crtcdsize -autoload
|
||||||
|
plus4_EMUCMD := $(VICE_HOME)xplus4 -TEDdsize -autoload
|
||||||
|
apple2_EMUCMD := test.bat
|
||||||
|
# So far there is no x16 emulator in VICE (why??) so we have to use xplus4 with -memsize option
|
||||||
|
c16_EMUCMD := $(VICE_HOME)xplus4 -ramsize 16 -TEDdsize -autoload
|
||||||
|
cbm510_EMUCMD := $(VICE_HOME)xcbm2 -model 510 -VICIIdsize -autoload
|
||||||
|
cbm610_EMUCMD := $(VICE_HOME)xcbm2 -model 610 -Crtcdsize -autoload
|
||||||
|
atari_EMUCMD := atari800 -windowed -xl -pal -nopatchall -run
|
||||||
|
|
||||||
|
ifeq ($(EMUCMD),)
|
||||||
|
EMUCMD = $($(CC65TARGET)_EMUCMD)
|
||||||
|
endif
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
### The magic begins ###
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
# The "Native Win32" GNU Make contains quite some workarounds to get along with
|
||||||
|
# cmd.exe as shell. However it does not provide means to determine that it does
|
||||||
|
# actually activate those workarounds. Especially does $(SHELL) NOT contain the
|
||||||
|
# value 'cmd.exe'. So the usual way to determine if cmd.exe is being used is to
|
||||||
|
# execute the command 'echo' without any parameters. Only cmd.exe will return a
|
||||||
|
# non-empy string - saying 'ECHO is on/off'.
|
||||||
|
#
|
||||||
|
# Many "Native Win32" programs accept '/' as directory delimiter just fine. How-
|
||||||
|
# ever the internal commands of cmd.exe generally require '\' to be used.
|
||||||
|
#
|
||||||
|
# cmd.exe has an internal command 'mkdir' that doesn't understand nor require a
|
||||||
|
# '-p' to create parent directories as needed.
|
||||||
|
#
|
||||||
|
# cmd.exe has an internal command 'del' that reports a syntax error if executed
|
||||||
|
# without any file so make sure to call it only if there's an actual argument.
|
||||||
|
ifeq ($(shell echo),)
|
||||||
|
MKDIR = mkdir -p $1
|
||||||
|
RMDIR = rmdir $1
|
||||||
|
RMFILES = $(RM) $1
|
||||||
|
else
|
||||||
|
MKDIR = mkdir $(subst /,\,$1)
|
||||||
|
RMDIR = rmdir $(subst /,\,$1)
|
||||||
|
RMFILES = $(if $1,del /f $(subst /,\,$1))
|
||||||
|
endif
|
||||||
|
COMMA := ,
|
||||||
|
SPACE := $(N/A) $(N/A)
|
||||||
|
define NEWLINE
|
||||||
|
|
||||||
|
|
||||||
|
endef
|
||||||
|
# Note: Do not remove any of the two empty lines above !
|
||||||
|
|
||||||
|
TARGETLIST := $(subst $(COMMA),$(SPACE),$(TARGETS))
|
||||||
|
|
||||||
|
ifeq ($(words $(TARGETLIST)),1)
|
||||||
|
|
||||||
|
# Set PROGRAM to something like 'myprog.c64'.
|
||||||
|
override PROGRAM := $(PROGRAM).$(TARGETLIST)
|
||||||
|
|
||||||
|
# Set SOURCES to something like 'src/foo.c src/bar.s'.
|
||||||
|
# Use of assembler files with names ending differently than .s is deprecated!
|
||||||
|
SOURCES := $(wildcard $(SRCDIR)/*.c)
|
||||||
|
SOURCES += $(wildcard $(SRCDIR)/*.s)
|
||||||
|
SOURCES += $(wildcard $(SRCDIR)/*.asm)
|
||||||
|
SOURCES += $(wildcard $(SRCDIR)/*.a65)
|
||||||
|
|
||||||
|
# Add to SOURCES something like 'src/c64/me.c src/c64/too.s'.
|
||||||
|
# Use of assembler files with names ending differently than .s is deprecated!
|
||||||
|
SOURCES += $(wildcard $(SRCDIR)/$(TARGETLIST)/*.c)
|
||||||
|
SOURCES += $(wildcard $(SRCDIR)/$(TARGETLIST)/*.s)
|
||||||
|
SOURCES += $(wildcard $(SRCDIR)/$(TARGETLIST)/*.asm)
|
||||||
|
SOURCES += $(wildcard $(SRCDIR)/$(TARGETLIST)/*.a65)
|
||||||
|
|
||||||
|
# Set OBJECTS to something like 'obj/c64/foo.o obj/c64/bar.o'.
|
||||||
|
OBJECTS := $(addsuffix .o,$(basename $(addprefix $(TARGETOBJDIR)/,$(notdir $(SOURCES)))))
|
||||||
|
|
||||||
|
# Set DEPENDS to something like 'obj/c64/foo.d obj/c64/bar.d'.
|
||||||
|
DEPENDS := $(OBJECTS:.o=.d)
|
||||||
|
|
||||||
|
# Add to LIBS something like 'src/foo.lib src/c64/bar.lib'.
|
||||||
|
LIBS += $(wildcard $(SRCDIR)/*.lib)
|
||||||
|
LIBS += $(wildcard $(SRCDIR)/$(TARGETLIST)/*.lib)
|
||||||
|
|
||||||
|
# Add to CONFIG something like 'src/c64/bar.cfg src/foo.cfg'.
|
||||||
|
CONFIG += $(wildcard $(SRCDIR)/$(TARGETLIST)/*.cfg)
|
||||||
|
CONFIG += $(wildcard $(SRCDIR)/*.cfg)
|
||||||
|
|
||||||
|
# Select CONFIG file to use. Target specific configs have higher priority.
|
||||||
|
ifneq ($(word 2,$(CONFIG)),)
|
||||||
|
CONFIG := $(firstword $(CONFIG))
|
||||||
|
$(info Using config file $(CONFIG) for linking)
|
||||||
|
endif
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
.PHONY: all test clean zap love
|
||||||
|
|
||||||
|
all: $(PROGRAM)
|
||||||
|
|
||||||
|
-include $(DEPENDS)
|
||||||
|
-include $(STATEFILE)
|
||||||
|
|
||||||
|
# If OPTIONS are given on the command line then save them to STATEFILE
|
||||||
|
# if (and only if) they have actually changed. But if OPTIONS are not
|
||||||
|
# given on the command line then load them from STATEFILE. Have object
|
||||||
|
# files depend on STATEFILE only if it actually exists.
|
||||||
|
ifeq ($(origin OPTIONS),command line)
|
||||||
|
ifneq ($(OPTIONS),$(_OPTIONS_))
|
||||||
|
ifeq ($(OPTIONS),)
|
||||||
|
$(info Removing OPTIONS)
|
||||||
|
$(shell $(RM) $(STATEFILE))
|
||||||
|
$(eval $(STATEFILE):)
|
||||||
|
else
|
||||||
|
$(info Saving OPTIONS=$(OPTIONS))
|
||||||
|
$(shell echo _OPTIONS_=$(OPTIONS) > $(STATEFILE))
|
||||||
|
endif
|
||||||
|
$(eval $(OBJECTS): $(STATEFILE))
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
ifeq ($(origin _OPTIONS_),file)
|
||||||
|
$(info Using saved OPTIONS=$(_OPTIONS_))
|
||||||
|
OPTIONS = $(_OPTIONS_)
|
||||||
|
$(eval $(OBJECTS): $(STATEFILE))
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Transform the abstract OPTIONS to the actual cc65 options.
|
||||||
|
$(foreach o,$(subst $(COMMA),$(SPACE),$(OPTIONS)),$(eval $(_$o_)))
|
||||||
|
|
||||||
|
# Strip potential variant suffix from the actual cc65 target.
|
||||||
|
CC65TARGET := $(firstword $(subst .,$(SPACE),$(TARGETLIST)))
|
||||||
|
|
||||||
|
# The remaining targets.
|
||||||
|
$(TARGETOBJDIR):
|
||||||
|
$(call MKDIR,$@)
|
||||||
|
|
||||||
|
vpath %.c $(SRCDIR)/$(TARGETLIST) $(SRCDIR)
|
||||||
|
|
||||||
|
$(TARGETOBJDIR)/%.o: %.c | $(TARGETOBJDIR)
|
||||||
|
$(CC) -t $(CC65TARGET) -c --create-dep $(@:.o=.d) $(CFLAGS) -o $@ $<
|
||||||
|
|
||||||
|
vpath %.s $(SRCDIR)/$(TARGETLIST) $(SRCDIR)
|
||||||
|
|
||||||
|
$(TARGETOBJDIR)/%.o: %.s | $(TARGETOBJDIR)
|
||||||
|
$(CC) -t $(CC65TARGET) -c --create-dep $(@:.o=.d) $(ASFLAGS) -o $@ $<
|
||||||
|
|
||||||
|
vpath %.asm $(SRCDIR)/$(TARGETLIST) $(SRCDIR)
|
||||||
|
|
||||||
|
$(TARGETOBJDIR)/%.o: %.asm | $(TARGETOBJDIR)
|
||||||
|
$(CC) -t $(CC65TARGET) -c --create-dep $(@:.o=.d) $(ASFLAGS) -o $@ $<
|
||||||
|
|
||||||
|
vpath %.a65 $(SRCDIR)/$(TARGETLIST) $(SRCDIR)
|
||||||
|
|
||||||
|
$(TARGETOBJDIR)/%.o: %.a65 | $(TARGETOBJDIR)
|
||||||
|
$(CC) -t $(CC65TARGET) -c --create-dep $(@:.o=.d) $(ASFLAGS) -o $@ $<
|
||||||
|
|
||||||
|
$(PROGRAM): $(CONFIG) $(OBJECTS) $(LIBS)
|
||||||
|
$(CC) -t $(CC65TARGET) $(LDFLAGS) -o $@ $(patsubst %.cfg,-C %.cfg,$^)
|
||||||
|
|
||||||
|
test: $(PROGRAM)
|
||||||
|
$(PREEMUCMD)
|
||||||
|
$(EMUCMD) $(notdir $(<))
|
||||||
|
$(POSTEMUCMD)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(call RMFILES,$(OBJECTS))
|
||||||
|
$(call RMFILES,$(DEPENDS))
|
||||||
|
$(call RMFILES,$(REMOVES))
|
||||||
|
$(call RMFILES,$(PROGRAM))
|
||||||
|
|
||||||
|
else # $(words $(TARGETLIST)),1
|
||||||
|
|
||||||
|
all test clean:
|
||||||
|
$(foreach t,$(TARGETLIST),$(MAKE) TARGETS=$t $@$(NEWLINE))
|
||||||
|
|
||||||
|
endif # $(words $(TARGETLIST)),1
|
||||||
|
|
||||||
|
OBJDIRLIST := $(wildcard $(OBJDIR)/*)
|
||||||
|
|
||||||
|
zap:
|
||||||
|
$(foreach o,$(OBJDIRLIST),-$(call RMFILES,$o/*.o $o/*.d $o/*.lst)$(NEWLINE))
|
||||||
|
$(foreach o,$(OBJDIRLIST),-$(call RMDIR,$o)$(NEWLINE))
|
||||||
|
-$(call RMDIR,$(OBJDIR))
|
||||||
|
-$(call RMFILES,$(basename $(PROGRAM)).* $(STATEFILE))
|
||||||
|
|
||||||
|
love:
|
||||||
|
@echo "Not war, eh?"
|
||||||
|
|
||||||
|
###################################################################
|
||||||
|
### Place your additional targets in the additional Makefiles ###
|
||||||
|
### in the same directory - their names have to end with ".mk"! ###
|
||||||
|
###################################################################
|
||||||
|
-include *.mk
|
133
README.md
Normal file
133
README.md
Normal file
|
@ -0,0 +1,133 @@
|
||||||
|
# penetrator
|
||||||
|
Remake of the ZX Spectrum game for the Apple II.
|
||||||
|
|
||||||
|
1. INTRODUCTION
|
||||||
|
|
||||||
|
This is a "port" of the Commander X16 version that's also in my repo's as just
|
||||||
|
penetrator. I had to rewrite quite a bit of the drawing code and make some
|
||||||
|
other changes to make it work on the Apple II, and to make it fast enough.
|
||||||
|
|
||||||
|
This is also my very first program for the Apple II. It was a learning
|
||||||
|
experience :)
|
||||||
|
|
||||||
|
2. CURRENT STATUS
|
||||||
|
|
||||||
|
The game is a pretty good replica of the original. It is missing sound. It's
|
||||||
|
also missing the demo attract mode, and the fireworks.
|
||||||
|
|
||||||
|
3. TECHNICAL DETAILS
|
||||||
|
|
||||||
|
The game is written in 6502 assembly using the ca65 assembler.
|
||||||
|
|
||||||
|
The other interesting thing about the original is that it ran the AI and user
|
||||||
|
input twice for every world move. This version does not do it the same way. The
|
||||||
|
bullet update ran twice for each world update but now that the world moves while
|
||||||
|
the bullets move twice, the bullets could pass through the walls. To fix this
|
||||||
|
issue, I have made the bullets 50% longer.
|
||||||
|
|
||||||
|
4. KEYS and JOYSTICK
|
||||||
|
|
||||||
|
The Apple 2 gameplay works only with a joystick since you cannot detect multiple
|
||||||
|
keys down on the Apple II. The UI works with the keyboard or joystick and the
|
||||||
|
world editor uses both.
|
||||||
|
|
||||||
|
The menus all show the keys to advance. There's also a help screen in the
|
||||||
|
editor.
|
||||||
|
|
||||||
|
5. THE FILES
|
||||||
|
|
||||||
|
I tried to comment all the code very thoroughly in the CX16 version. Since this
|
||||||
|
version is derived from that version, the code is also well documented, but to
|
||||||
|
be honest, the comments may not always be accurate. I did not do a pass to see
|
||||||
|
if they are accurate.
|
||||||
|
|
||||||
|
There are actually 2 programs in this. The 1st is the game, and it's in
|
||||||
|
src/apple2.
|
||||||
|
|
||||||
|
* defs.inc - Constants and definitions used throughout
|
||||||
|
* draw.inc - VERA layer drawing. drawSprite, for example
|
||||||
|
* edit.inc - The built-in world editor
|
||||||
|
* file.inc - Load and Save code
|
||||||
|
* fontdata.inc - A ZX Spectrum font in 16x8
|
||||||
|
* game.inc - The in-game logic, AI etc. The bulk of the "game"
|
||||||
|
* input.inc - User controls for game and editor
|
||||||
|
* logo.hgr - 8Kb splash screen in HGR format
|
||||||
|
* logo.inc - file that simply does an incbin on logo.hgr
|
||||||
|
* logodata.inc - Line data for writing Penetrator and logo image data
|
||||||
|
* macros.inc - print macros mostly
|
||||||
|
* penetrator.asm - Where the game starts, initial setup, etc.
|
||||||
|
* penetrator.cfg - ca65 configuration file
|
||||||
|
* rodata.inc - Read-only data such as lookup tables, sprites etc.
|
||||||
|
* terrain.inc - The terrain drawing routines
|
||||||
|
* text.inc - In game text and print functions
|
||||||
|
* trndata.inc - The world data (triplet - top, bottom and enemy pos)
|
||||||
|
* ui.inc - User facing screens, name input, etc.
|
||||||
|
* variables.inc - All non zero page variables
|
||||||
|
* zpvars.inc - The zero page variables
|
||||||
|
|
||||||
|
The second is the ProDos loader that will auto-load the game. It's in the
|
||||||
|
src/apple2.loader folder. It has these files (all provided to me by Oliver
|
||||||
|
Schmidt)
|
||||||
|
|
||||||
|
* loader.cfg - ca65 configuration file
|
||||||
|
* loader.s - file to load and start the game
|
||||||
|
|
||||||
|
6. BUILDING THE GAME
|
||||||
|
|
||||||
|
Making the game has a few steps. Use make and the Makefile on all OSs, that would be the easiest.
|
||||||
|
|
||||||
|
Start by making the loader - this needs to be done once only.
|
||||||
|
make TARGETS=apple2.loader
|
||||||
|
|
||||||
|
Next, make the game with:
|
||||||
|
make
|
||||||
|
|
||||||
|
The next step is to make a bootable disk image. For this, you will need some
|
||||||
|
other piece of 3rd party software. It's called AppleCommander. Once
|
||||||
|
downloaded, put it in the apple2 folder in the root (apple2 folder at same level
|
||||||
|
as Makefile). This software will put the loader and game into the disk image.
|
||||||
|
|
||||||
|
Since I use Windows to develop, I have a file called build.cmd next to the
|
||||||
|
Makefile (and checked in here as well). The contents of this file is listed
|
||||||
|
below (where the line ends with "\" isn't actually a line-end, I just cut the
|
||||||
|
line there for readability, the next line is actually on the same line as the
|
||||||
|
line ending with "\").
|
||||||
|
|
||||||
|
copy apple2\template.dsk Penetrator.dsk
|
||||||
|
java -jar apple2\AppleCommander-win64-1.5.0.jar -p Penetrator.dsk \
|
||||||
|
penetrat.system sys < penetrator.apple2.loader
|
||||||
|
java -jar apple2\AppleCommander-win64-1.5.0.jar -as Penetrator.dsk \
|
||||||
|
penetrat bin < penetrator.apple2
|
||||||
|
apple2\Applewin.exe -d1 penetrator.dsk
|
||||||
|
|
||||||
|
You will need to install Java to use AppleCommander. The apple2/template.dsk is
|
||||||
|
a "blank ProDos floppy" that has the loader and the game placed on it by
|
||||||
|
AppleCommander. I use the AppleWin emulator to run the game (-d1 penetrator.dsk
|
||||||
|
mounts the floppy in drive one, and then boots from it automatically). In
|
||||||
|
powershell, when developing the game, I would just use this command to do it
|
||||||
|
all:
|
||||||
|
make; .\build.cmd
|
||||||
|
|
||||||
|
Find AppleCommander here (I used Version 1.5.0):
|
||||||
|
https://github.com/AppleCommander/AppleCommander/releases
|
||||||
|
|
||||||
|
Find AppleWin here:
|
||||||
|
https://github.com/AppleWin/AppleWin/releases
|
||||||
|
|
||||||
|
7. CREDITS
|
||||||
|
|
||||||
|
* Phillip Mitchell and Beam Software for creating and publishing the game in
|
||||||
|
1982.
|
||||||
|
* A special call-out to Oliver Schmidt who provided me with invaluable
|
||||||
|
assistance to get me going on the Apple II.
|
||||||
|
* Everyone involved in the Apple II projects (AppleWin | AppleCommander).
|
||||||
|
* Everyone involved in making the cc65 tools, it's very good.
|
||||||
|
|
||||||
|
8. CONTACT
|
||||||
|
|
||||||
|
Feel free to contact me at swessels@email.com if you have thoughts or
|
||||||
|
suggestions.
|
||||||
|
|
||||||
|
Thank you
|
||||||
|
Stefan Wessels
|
||||||
|
16 December 2019 - Initial Revision
|
BIN
apple2/template.dsk
Normal file
BIN
apple2/template.dsk
Normal file
Binary file not shown.
4
build.cmd
Normal file
4
build.cmd
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
copy apple2\template.dsk Penetrator.dsk
|
||||||
|
java -jar apple2\AppleCommander-win64-1.5.0.jar -p Penetrator.dsk penetrat.system sys < penetrator.apple2.loader
|
||||||
|
java -jar apple2\AppleCommander-win64-1.5.0.jar -as Penetrator.dsk penetrat bin < penetrator.apple2
|
||||||
|
apple2\Applewin.exe -d1 penetrator.dsk
|
14
src/apple2.loader/loader.cfg
Normal file
14
src/apple2.loader/loader.cfg
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
#################################################################################
|
||||||
|
# #
|
||||||
|
# LOADER.SYSTEM - an Apple][ ProDOS 8 loader for cc65 programs (Oliver Schmidt) #
|
||||||
|
# #
|
||||||
|
#################################################################################
|
||||||
|
|
||||||
|
MEMORY {
|
||||||
|
LOADER: start = $2000, size = $0200, file = %O;
|
||||||
|
}
|
||||||
|
|
||||||
|
SEGMENTS {
|
||||||
|
CODE: load = LOADER, type = ro;
|
||||||
|
DATA: load = LOADER, type = rw;
|
||||||
|
}
|
172
src/apple2.loader/loader.s
Normal file
172
src/apple2.loader/loader.s
Normal file
|
@ -0,0 +1,172 @@
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
; ;
|
||||||
|
; LOADER.SYSTEM - an Apple][ ProDOS 8 loader for cc65 programs (Oliver Schmidt) ;
|
||||||
|
; ;
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
A1L := $3C
|
||||||
|
A1H := $3D
|
||||||
|
PATHNAME := $0280
|
||||||
|
MLI := $BF00
|
||||||
|
TXTCLR := $C050 ; Display graphics
|
||||||
|
TXTSET := $C051 ; Display text
|
||||||
|
MIXCLR := $C052 ; Disable 4 lines of text
|
||||||
|
LOWSCR := $C054 ; Page 1
|
||||||
|
HISCR := $C055 ; Page 2
|
||||||
|
HIRES := $C057 ; Hires graphics
|
||||||
|
VERSION := $FBB3
|
||||||
|
RDKEY := $FD0C
|
||||||
|
PRBYTE := $FDDA
|
||||||
|
COUT := $FDED
|
||||||
|
|
||||||
|
QUIT_CALL = $65
|
||||||
|
OPEN_CALL = $C8
|
||||||
|
READ_CALL = $CA
|
||||||
|
CLOSE_CALL = $CC
|
||||||
|
|
||||||
|
FILE_NOT_FOUND_ERR = $46
|
||||||
|
|
||||||
|
; ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
.data
|
||||||
|
|
||||||
|
OPEN_PARAM:
|
||||||
|
.byte $03 ;PARAM_COUNT
|
||||||
|
.addr PATHNAME ;PATHNAME
|
||||||
|
.addr $4000 - $0400 ;IO_BUFFER
|
||||||
|
OPEN_REF: .byte $00 ;REF_NUM
|
||||||
|
|
||||||
|
READ_PARAM:
|
||||||
|
.byte $04 ;PARAM_COUNT
|
||||||
|
READ_REF: .byte $00 ;REF_NUM
|
||||||
|
.addr $4000 ;DATA_BUFFER
|
||||||
|
.word $FFFF ;REQUEST_COUNT
|
||||||
|
.word $0000 ;TRANS_COUNT
|
||||||
|
|
||||||
|
CLOSE_PARAM:
|
||||||
|
.byte $01 ;PARAM_COUNT
|
||||||
|
CLOSE_REF: .byte $00 ;REF_NUM
|
||||||
|
|
||||||
|
QUIT_PARAM:
|
||||||
|
.byte $04 ;PARAM_COUNT
|
||||||
|
.byte $00 ;QUIT_TYPE
|
||||||
|
.word $0000 ;RESERVED
|
||||||
|
.byte $00 ;RESERVED
|
||||||
|
.word $0000 ;RESERVED
|
||||||
|
|
||||||
|
LOADING:
|
||||||
|
.byte $0D
|
||||||
|
.asciiz "Loading "
|
||||||
|
|
||||||
|
ELLIPSES:
|
||||||
|
.byte " ...", $0D, $0D, $00
|
||||||
|
|
||||||
|
FILE_NOT_FOUND:
|
||||||
|
.asciiz "... File Not Found"
|
||||||
|
|
||||||
|
ERROR_NUMBER:
|
||||||
|
.asciiz "... Error $"
|
||||||
|
|
||||||
|
PRESS_ANY_KEY:
|
||||||
|
.asciiz " - Press Any Key "
|
||||||
|
|
||||||
|
; ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
.code
|
||||||
|
|
||||||
|
; Reset stack
|
||||||
|
ldx #$FF
|
||||||
|
txs
|
||||||
|
|
||||||
|
; Remove ".SYSTEM" from pathname
|
||||||
|
lda PATHNAME
|
||||||
|
sec
|
||||||
|
sbc #.strlen(".SYSTEM")
|
||||||
|
sta PATHNAME
|
||||||
|
|
||||||
|
; Add trailing '\0' to pathname
|
||||||
|
tax
|
||||||
|
lda #$00
|
||||||
|
sta PATHNAME+1,x
|
||||||
|
|
||||||
|
; Provide some user feedback
|
||||||
|
lda #<LOADING
|
||||||
|
ldx #>LOADING
|
||||||
|
jsr PRINT
|
||||||
|
lda #<(PATHNAME+1)
|
||||||
|
ldx #>(PATHNAME+1)
|
||||||
|
jsr PRINT
|
||||||
|
lda #<ELLIPSES
|
||||||
|
ldx #>ELLIPSES
|
||||||
|
jsr PRINT
|
||||||
|
|
||||||
|
jsr MLI
|
||||||
|
.byte OPEN_CALL
|
||||||
|
.word OPEN_PARAM
|
||||||
|
bcc :+
|
||||||
|
jmp ERROR
|
||||||
|
|
||||||
|
; Copy file reference number
|
||||||
|
: lda OPEN_REF
|
||||||
|
sta READ_REF
|
||||||
|
sta CLOSE_REF
|
||||||
|
|
||||||
|
; Switch to hires page 2
|
||||||
|
bit TXTCLR
|
||||||
|
bit MIXCLR
|
||||||
|
bit HISCR
|
||||||
|
bit HIRES
|
||||||
|
|
||||||
|
jsr MLI
|
||||||
|
.byte READ_CALL
|
||||||
|
.word READ_PARAM
|
||||||
|
bcs ERROR
|
||||||
|
|
||||||
|
jsr MLI
|
||||||
|
.byte CLOSE_CALL
|
||||||
|
.word CLOSE_PARAM
|
||||||
|
bcs ERROR
|
||||||
|
|
||||||
|
; Go for it ...
|
||||||
|
jmp $6000
|
||||||
|
|
||||||
|
PRINT:
|
||||||
|
sta A1L
|
||||||
|
stx A1H
|
||||||
|
ldx VERSION
|
||||||
|
ldy #$00
|
||||||
|
: lda (A1L),y
|
||||||
|
beq :++
|
||||||
|
cpx #$06 ; //e ?
|
||||||
|
beq :+
|
||||||
|
cmp #$60 ; lowercase ?
|
||||||
|
bcc :+
|
||||||
|
and #$5F ; -> uppercase
|
||||||
|
: ora #$80
|
||||||
|
jsr COUT
|
||||||
|
iny
|
||||||
|
bne :-- ; Branch always
|
||||||
|
: rts
|
||||||
|
|
||||||
|
ERROR:
|
||||||
|
bit TXTSET
|
||||||
|
bit LOWSCR
|
||||||
|
cmp #FILE_NOT_FOUND_ERR
|
||||||
|
bne :+
|
||||||
|
lda #<FILE_NOT_FOUND
|
||||||
|
ldx #>FILE_NOT_FOUND
|
||||||
|
jsr PRINT
|
||||||
|
beq :++ ; Branch always
|
||||||
|
: pha
|
||||||
|
lda #<ERROR_NUMBER
|
||||||
|
ldx #>ERROR_NUMBER
|
||||||
|
jsr PRINT
|
||||||
|
pla
|
||||||
|
jsr PRBYTE
|
||||||
|
: lda #<PRESS_ANY_KEY
|
||||||
|
ldx #>PRESS_ANY_KEY
|
||||||
|
jsr PRINT
|
||||||
|
jsr RDKEY
|
||||||
|
jsr MLI
|
||||||
|
.byte QUIT_CALL
|
||||||
|
.word QUIT_PARAM
|
101
src/apple2/defs.inc
Normal file
101
src/apple2/defs.inc
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; defs.inc
|
||||||
|
; Part of penetrator, the zx spectrum game, made for Apple II
|
||||||
|
;
|
||||||
|
; Stefan Wessels, 2019
|
||||||
|
; This is free and unencumbered software released into the public domain.
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; System locations
|
||||||
|
.include "apple2.inc"
|
||||||
|
|
||||||
|
ram_layer0 = $2000 ; HGR Pages
|
||||||
|
ram_layer1 = $4000
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; self-modifying address marker
|
||||||
|
PLACEHOLDER = $FFFF
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; modes
|
||||||
|
GAME_MODE_PLAY = $00
|
||||||
|
GAME_MODE_TRAIN = $01
|
||||||
|
GAME_MODE_EDIT = $02
|
||||||
|
|
||||||
|
BRUSH_TERRAIN = $00
|
||||||
|
BRUSH_ENEMIES = $01
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; digital input constants
|
||||||
|
KEY_RIGHT = %00000001
|
||||||
|
KEY_LEFT = %00000010
|
||||||
|
KEY_DOWN = %00000100
|
||||||
|
KEY_UP = %00001000
|
||||||
|
KEY_START = %00010000
|
||||||
|
KEY_SELECT = %00100000
|
||||||
|
KEY_FIRE = %01000000
|
||||||
|
KEY_BOMB = %10000000
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; game constants
|
||||||
|
XINSET = 4 ; By how many BYTE cols the display is offset into X
|
||||||
|
XSIZE = (80 - (4 * XINSET)) ; columns on screen (1 BYTE col = 2 game cols)
|
||||||
|
YSIZE = 192 ; lines on screen
|
||||||
|
|
||||||
|
WORLD_START = $08 ; top line where world is drawn
|
||||||
|
WORLD_END = $B3 ; last line where world is drawn
|
||||||
|
BUFLENGTH = $100 ; size for buffers that hold enemies
|
||||||
|
|
||||||
|
NUM_LIVES = 5 ; How many lives to start with
|
||||||
|
NUM_STAGES = 5
|
||||||
|
NUM_BOMBS = 2 ; How many bombs the player can drop
|
||||||
|
NUM_INFLIGHT = 3 ; How many missiles can be in-flight at once
|
||||||
|
NUM_SKIP_MONST = 4 ; How many rockets to skip before making one a monster
|
||||||
|
|
||||||
|
DANGER_FONT = 4 ; Number of font characters that make one filled column
|
||||||
|
DANGER_LENGTH = ((textEnd-1)-textDangerBar) ; how many characters in the danger column (skip trailing 0)
|
||||||
|
DANGER_TICKS = ((((worldDataEnd-worldDataStart) / 3) / DANGER_LENGTH) / DANGER_FONT)
|
||||||
|
|
||||||
|
; The enemyBuffer is filled with these values, which break down as:
|
||||||
|
;
|
||||||
|
; Bits 1 & 2 - Type. 0 - monster, 1 - missile, 2 - radar & 3 - nuke
|
||||||
|
; Bits 3 & 4 - Column of sprite - Missile 2 wide, radar 4 wide, etc.
|
||||||
|
; Bits 5, 6 & 7 - Animation frame number, 0 - 7 (Radar has 8 frames)
|
||||||
|
; Bit 8 - 1 - Flying, 0 - on ground
|
||||||
|
;
|
||||||
|
; For monsters, Bits 5, 6 and 7 mean the following:
|
||||||
|
; Monster Bit 5 - Direction - 0 is up and 1 is down
|
||||||
|
; Monster Bit 6 & 7 - The delay counter while it is stopped. 0 - moving, <> 0 paused
|
||||||
|
;
|
||||||
|
; All 0 means empty, no enemy at that location
|
||||||
|
|
||||||
|
SPR_MONSTER0 = %10000000 ; enemy buffer mask MONSTER left
|
||||||
|
SPR_MONSTER1 = %10000100 ; enemy buffer mask MONSTER col 2
|
||||||
|
SPR_MONSTER2 = %10001000 ; enemy buffer mask MONSTER right
|
||||||
|
SPR_MISSILE0 = %00000001 ; enemy buffer mask missile left
|
||||||
|
SPR_MISSILE1 = %00000101 ; enemy buffer mask missile right
|
||||||
|
SPR_RADAR0 = %00000010 ; enemy buffer mask radar left
|
||||||
|
SPR_RADAR1 = %00000110 ; enemy buffer mask radar col 2
|
||||||
|
SPR_RADAR2 = %00001010 ; enemy buffer mask radar col 3
|
||||||
|
SPR_RADAR3 = %00001110 ; enemy buffer mask radar right
|
||||||
|
SPR_NUKE0 = %00000011 ; enemy buffer mask nuke left
|
||||||
|
SPR_NUKE1 = %00000111 ; enemy buffer mask nuke right
|
||||||
|
|
||||||
|
MONSTER_HEIGHT = 13 ; rows in monster sprite
|
||||||
|
MONSTER_WIDTH = 3 ; cols in monster sprite
|
||||||
|
MONSTER_SPEED = 4 ; speed at which monster moves (in rows)
|
||||||
|
|
||||||
|
MISSILE_HEIGHT = 14 ; rows in missile sprite
|
||||||
|
|
||||||
|
RADAR_HEIGHT = 16 ; rows in radar sprite
|
||||||
|
|
||||||
|
NUKE_HEIGHT = 8 ; rows in nuke sprite
|
||||||
|
|
||||||
|
EXPLOSION_HEIGHT = 16 ; rows in explosion sprite
|
||||||
|
|
||||||
|
BOMB_HEIGHT = 6 ; rows in bomb sprite
|
||||||
|
BOMB_FRWRD_FRMS = 6 ; horz bomb travel duration
|
||||||
|
|
||||||
|
SHIP_HEIGHT = 12 ; rows in player ship sprite
|
||||||
|
SHIP_WIDTH = 4 ; cols in player ship sprite
|
||||||
|
SHIP_START = 16 ; height above world where ship starts
|
1125
src/apple2/draw.inc
Normal file
1125
src/apple2/draw.inc
Normal file
File diff suppressed because it is too large
Load Diff
564
src/apple2/edit.inc
Normal file
564
src/apple2/edit.inc
Normal file
|
@ -0,0 +1,564 @@
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; edit.inc
|
||||||
|
; Part of penetrator, the zx spectrum game, made for Apple II
|
||||||
|
;
|
||||||
|
; Stefan Wessels, 2019
|
||||||
|
; This is free and unencumbered software released into the public domain.
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
.segment "CODE"
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
.proc editLoop
|
||||||
|
|
||||||
|
jsr drawClearScreen ; make sure the screen is clear before adjusting the
|
||||||
|
|
||||||
|
jsr editInit
|
||||||
|
jsr editLoadStage
|
||||||
|
lda #2
|
||||||
|
sta updateHUD
|
||||||
|
|
||||||
|
loop:
|
||||||
|
jsr inputEdit
|
||||||
|
beq :+
|
||||||
|
jsr editHandleKeys
|
||||||
|
lda pause ; pause is quit flag in endit
|
||||||
|
beq :+
|
||||||
|
rts
|
||||||
|
:
|
||||||
|
clc
|
||||||
|
jsr terrainShow ; show terrain 1st because it collides with nothing
|
||||||
|
jsr drawEnemies ; enemies collide with nothing in edit mode
|
||||||
|
jsr editDrawCursor
|
||||||
|
lda updateHUD
|
||||||
|
beq :+
|
||||||
|
jsr uiShowEditLabels
|
||||||
|
:
|
||||||
|
jsr drawPresent ; flip layers 0/1 (bring backLayer to visible)
|
||||||
|
|
||||||
|
jmp loop
|
||||||
|
|
||||||
|
.endproc
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
.proc editHandleKeys
|
||||||
|
|
||||||
|
cmp #'6' ; 6 or bigger - not a stage command
|
||||||
|
bcs notnum
|
||||||
|
cmp #'1' ; less than 1 - not a stage command
|
||||||
|
bcc notnum
|
||||||
|
sbc #'1' ; stages are 0 based
|
||||||
|
sta stage
|
||||||
|
lda #0 ; reset where the buffers will start
|
||||||
|
sta bufferInsert
|
||||||
|
jsr drawClearScreen
|
||||||
|
jsr editLoadStage ; get the right stage at the right place
|
||||||
|
jmp uiShowEditLabels ; update the HUD
|
||||||
|
|
||||||
|
notnum:
|
||||||
|
cmp #$1b ; ESC key
|
||||||
|
bne notQuit
|
||||||
|
lda #1
|
||||||
|
sta pause ; abuse pause to signal quit
|
||||||
|
rts
|
||||||
|
|
||||||
|
notQuit:
|
||||||
|
cmp #'c' ; c or C for help
|
||||||
|
beq help
|
||||||
|
cmp #'C'
|
||||||
|
bne notHelp
|
||||||
|
|
||||||
|
help:
|
||||||
|
jmp uiShowEditHelp
|
||||||
|
|
||||||
|
notHelp:
|
||||||
|
cmp #'s' ; s or S for save
|
||||||
|
beq save
|
||||||
|
cmp #'S'
|
||||||
|
bne notSave
|
||||||
|
|
||||||
|
save:
|
||||||
|
lda #0 ; a 0 is save
|
||||||
|
jsr uiFileLoadSave
|
||||||
|
jmp editLoop
|
||||||
|
|
||||||
|
notSave:
|
||||||
|
cmp #'l' ; l or L for load
|
||||||
|
beq load
|
||||||
|
cmp #'L'
|
||||||
|
bne done
|
||||||
|
|
||||||
|
load:
|
||||||
|
lda #1 ; a 1 is load
|
||||||
|
jsr uiFileLoadSave
|
||||||
|
jmp editLoop
|
||||||
|
|
||||||
|
done:
|
||||||
|
clc
|
||||||
|
rts
|
||||||
|
|
||||||
|
.endproc
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; Move the world left (feels like YOU are moving right)
|
||||||
|
; will update the stage when a stage boundary is crossed and will then
|
||||||
|
; update the HUD
|
||||||
|
.proc editGameWorldRight
|
||||||
|
|
||||||
|
zaWorldPtr = tempBlock + 14 ; 2 bytes for a ptr
|
||||||
|
|
||||||
|
lda stage ; only scroll right while the stage
|
||||||
|
cmp #4 ; isn't 5 (0 based so 4). Stage 5
|
||||||
|
bcc :+ ; cannot be edited
|
||||||
|
rts
|
||||||
|
:
|
||||||
|
jsr gameWorldMove ; use the game move code
|
||||||
|
|
||||||
|
lda zWorldPtr + 1 ; but then calculate a point where the stage marker might be
|
||||||
|
sta zaWorldPtr + 1
|
||||||
|
lda zWorldPtr
|
||||||
|
sec
|
||||||
|
sbc #((XSIZE+3)*3)
|
||||||
|
sta zaWorldPtr
|
||||||
|
bcs :+
|
||||||
|
dec zaWorldPtr + 1
|
||||||
|
|
||||||
|
:
|
||||||
|
ldy #2 ; and read the enemy byte
|
||||||
|
lda (zaWorldPtr), y
|
||||||
|
bit Bit7Mask ; and see if this is a stage change
|
||||||
|
beq :+
|
||||||
|
inc stage ; bit was set so change stage
|
||||||
|
lda #2 ; and update the HUD
|
||||||
|
sta updateHUD
|
||||||
|
:
|
||||||
|
inc bufferDraw ; the bufferDraw (col 0) is also one more to the right
|
||||||
|
rts
|
||||||
|
|
||||||
|
.endproc
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; Scroll to the left, updating the stage boundary and adding enemies as needed.
|
||||||
|
.proc editGameWorldLeft
|
||||||
|
|
||||||
|
leftWorldPtr = tempBlock + 14
|
||||||
|
|
||||||
|
lda zWorldPtr + 1 ; get the left edge insert point by subtracting
|
||||||
|
sta leftWorldPtr + 1 ; XSIZE+3 from the right edge. XSIZE-1 is the current
|
||||||
|
lda zWorldPtr ; left screen col. +3 is 4 past, which is the width
|
||||||
|
sec ; of a radar that could now scroll on-screen
|
||||||
|
sbc #((XSIZE+3)*3) ; the buffer will have proper height data for at least
|
||||||
|
sta leftWorldPtr ; 2 of these 3 cols to the left - see editLoadStage
|
||||||
|
bcs :+
|
||||||
|
dec leftWorldPtr + 1
|
||||||
|
|
||||||
|
:
|
||||||
|
lda leftWorldPtr + 1 ; see if this new dest is <= the world start.
|
||||||
|
cmp #>worldDataStart ; if it is then don't scroll any further left, just exit
|
||||||
|
beq :+ ; hi equal to worldStart hi, so test low
|
||||||
|
bcs leftOk ; hi > worldStart hi so good to go
|
||||||
|
done:
|
||||||
|
rts
|
||||||
|
:
|
||||||
|
lda leftWorldPtr
|
||||||
|
cmp #<worldDataStart
|
||||||
|
bcc done ; lo < lo - too small, no go
|
||||||
|
beq done ; lo equal so also no go
|
||||||
|
|
||||||
|
leftOk:
|
||||||
|
lda zWorldPtr ; there's room to go left so move the right edge left
|
||||||
|
sec ; by 1 col, or one triplet of data, so 3 bytes
|
||||||
|
sbc #3
|
||||||
|
sta zWorldPtr
|
||||||
|
bcs :+
|
||||||
|
dec zWorldPtr + 1
|
||||||
|
:
|
||||||
|
dec bufferDraw ; adjust the draw and insert buffer "counters"
|
||||||
|
dec bufferInsert ; now points at the "new" screen locations
|
||||||
|
|
||||||
|
clc
|
||||||
|
ldx bufferDraw ; the bufferDraw is the left edge
|
||||||
|
dex ; back up 4 bytes (so 1 past where a radar
|
||||||
|
dex ; could be added) and write a 0 in there
|
||||||
|
dex ; to stomp any old circular buffer data
|
||||||
|
dex
|
||||||
|
lda #0
|
||||||
|
sta enemyBuffer, x
|
||||||
|
inx ; now move to the col where the heights will be added
|
||||||
|
|
||||||
|
ldy #0 ; get the world bottom
|
||||||
|
lda (leftWorldPtr), y
|
||||||
|
sta worldBBuffer, x ; and put it in the buffer
|
||||||
|
iny ; and get the world top
|
||||||
|
lda (leftWorldPtr), y
|
||||||
|
sta worldTBuffer, x ; and put it in the buffer
|
||||||
|
|
||||||
|
ldy #2 ; see if there's a radar to go with this height data
|
||||||
|
lda (leftWorldPtr), y ; get the enemy flag
|
||||||
|
bit Bit7Mask ; see if this is a stage change
|
||||||
|
beq radar ; no - check for radar
|
||||||
|
pha ; stage is changing so save a
|
||||||
|
dec stage ; dec the stage
|
||||||
|
lda #2 ; mark the HUD for update
|
||||||
|
sta updateHUD
|
||||||
|
pla ; restore a - could also hold a missile or radar
|
||||||
|
|
||||||
|
radar:
|
||||||
|
bit Bit2Mask ; is it a radar
|
||||||
|
beq missile ; no - go check for a missile
|
||||||
|
jmp gameWorldFlag ; add the radar - can't also be a missile so all done
|
||||||
|
|
||||||
|
missile:
|
||||||
|
inx ; the missile will start 2 cols later
|
||||||
|
inx
|
||||||
|
ldy #8 ; and is also 2 (past height)+(2*3) bytes later in the world
|
||||||
|
lda (leftWorldPtr), y ; get the enemy flag
|
||||||
|
bit Bit1Mask ; see if it's a missile
|
||||||
|
beq done ; if not a missile then done
|
||||||
|
jmp gameWorldFlag ; add the missile and finish
|
||||||
|
|
||||||
|
.endproc
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; Prepare for editing by initializing the needed variables
|
||||||
|
.proc editInit
|
||||||
|
|
||||||
|
brushType = tempBlock + 16
|
||||||
|
|
||||||
|
lda #GAME_MODE_EDIT
|
||||||
|
sta gameMode
|
||||||
|
|
||||||
|
lda #0
|
||||||
|
sta brushType ; BRUSH_TERRAIN is also 0
|
||||||
|
sta direction ; go to the right
|
||||||
|
sta terrainOrigin ; don't scroll in, just be all there
|
||||||
|
sta zCollision
|
||||||
|
sta stopScrolling
|
||||||
|
sta bufferInsert
|
||||||
|
sta pause
|
||||||
|
sta terrainOrigin
|
||||||
|
|
||||||
|
tax ; start at 0 for the buffers
|
||||||
|
:
|
||||||
|
sta worldBBuffer, x ; and init all 256 bytes of each buffer to 0
|
||||||
|
sta worldTBuffer, x
|
||||||
|
sta enemyBuffer, x
|
||||||
|
sta enemyHgtBuffer, x
|
||||||
|
sta explosionBuffer, x
|
||||||
|
sta bulletsBuffer, x
|
||||||
|
dex
|
||||||
|
bne :-
|
||||||
|
|
||||||
|
ldx #NUM_STAGES-1 ; mark all stages as all rockets, no monsters
|
||||||
|
:
|
||||||
|
sta makeMonster, x
|
||||||
|
dex
|
||||||
|
bpl :-
|
||||||
|
|
||||||
|
lda #$ff
|
||||||
|
sta lastInput ; set no keys down - all 1's
|
||||||
|
|
||||||
|
lda #(XSIZE/2) ; middle of the screen in X
|
||||||
|
sta playerShipX ; is where the cursor is
|
||||||
|
|
||||||
|
lda #(WORLD_START + (WORLD_END - WORLD_START) / 2)
|
||||||
|
sta playerShipY ; and in Y also in the middle
|
||||||
|
|
||||||
|
rts
|
||||||
|
|
||||||
|
.endproc
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; Show a custom character as a cursor. Also redraw the down arrow
|
||||||
|
; since the cursor draws into the top 8 likes that don't get cleaned/updated
|
||||||
|
; with every frame. Drawing the arrow fixes up the out of bounds areas
|
||||||
|
.proc editDrawCursor
|
||||||
|
|
||||||
|
yPos = tempBlock + 14
|
||||||
|
xPos = tempBlock + 15
|
||||||
|
|
||||||
|
zaStrL = tempBlock + 1 ; parameter - string lo
|
||||||
|
zaStrH = tempBlock + 2 ; parameter - string hi
|
||||||
|
zaFontL = tempBlock + 4 ; internal - point at the character memory Lo
|
||||||
|
zaFontH = tempBlock + 5 ; internal - point at the character memory Hi
|
||||||
|
zaFontOffset = tempBlock + 6 ; 0-15 - index from zaFont
|
||||||
|
|
||||||
|
lda playerShipX
|
||||||
|
lsr
|
||||||
|
sta xPos
|
||||||
|
|
||||||
|
print textEditDnArrow, xPos, 0 ; redraw arrow to fix out of top cursor overwrite
|
||||||
|
|
||||||
|
lda #$87 ; cursor symbol
|
||||||
|
ldy #0
|
||||||
|
jsr setFont
|
||||||
|
|
||||||
|
lda playerShipY ; get the screen Y for cursor
|
||||||
|
sec ; but raise it so the horz bar is at the "ship" level
|
||||||
|
sbc #2
|
||||||
|
sta yPos ; init the row working buffer
|
||||||
|
ldx backLayer ; write to back layer
|
||||||
|
|
||||||
|
plotLoop:
|
||||||
|
ldy yPos ; at the working row offset
|
||||||
|
lda rowL, y ; get the memory address
|
||||||
|
clc
|
||||||
|
adc xPos ; add in column
|
||||||
|
sta write + 1 ; point lo at memory
|
||||||
|
lda rowH, y
|
||||||
|
adc layersH, x
|
||||||
|
sta write + 2
|
||||||
|
|
||||||
|
ldy zaFontOffset ; get the offset into the character
|
||||||
|
lda (zaFontL), y
|
||||||
|
|
||||||
|
write: ; get the actual left character byte
|
||||||
|
sta PLACEHOLDER ; plot the left hand side
|
||||||
|
cpy #$05 ; cursor character is 5 rows high
|
||||||
|
bcs done ; if 10 then done with the cursor
|
||||||
|
inc zaFontOffset ; move 2 bytes for last row plotted
|
||||||
|
inc zaFontOffset
|
||||||
|
inc yPos ; move down a row on screen
|
||||||
|
|
||||||
|
bne plotLoop ; always take this branch
|
||||||
|
|
||||||
|
done:
|
||||||
|
rts
|
||||||
|
|
||||||
|
.endproc
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; Will set the terrain to the cursor, and will move enemies to be back
|
||||||
|
; on the terrain when needed. Will set both the draw buffers and the
|
||||||
|
; actual world data stream (the triplets)
|
||||||
|
.proc editSetTerrainBottom
|
||||||
|
|
||||||
|
zaColumn = tempBlock + 3
|
||||||
|
zaMidScreen = tempBlock + 4
|
||||||
|
|
||||||
|
lda zWorldPtr + 1 ; make a copy of the world pointer
|
||||||
|
sta zaMidScreen + 1 ; that corresponds with the position of the cursor
|
||||||
|
lda zWorldPtr
|
||||||
|
sec
|
||||||
|
sbc #((XSIZE/2)*3) ; 1/2 way in screen, 3 bytes per column
|
||||||
|
sta zaMidScreen
|
||||||
|
bcs :+
|
||||||
|
dec zaMidScreen + 1
|
||||||
|
|
||||||
|
:
|
||||||
|
ldy #3 ; index from ptr
|
||||||
|
lda playerShipY ; cursor height in playerShipY
|
||||||
|
sta (zaMidScreen), y ; store in the terrain bottom
|
||||||
|
|
||||||
|
lda bufferDraw ; now update the draw buffer
|
||||||
|
clc
|
||||||
|
adc playerShipX ; get to the correct column offset
|
||||||
|
tax ; save in x
|
||||||
|
lda playerShipY ; get the height
|
||||||
|
sta worldBBuffer, x ; update the buffer
|
||||||
|
lda enemyBuffer, x ; get the enemy flag
|
||||||
|
beq done ; no enemy - all done
|
||||||
|
bit Bit12Mask ; see if it's a radar or missile
|
||||||
|
beq done ; if bits 12 not set then not an enemy
|
||||||
|
ldy #2 ; assume a missile - 2 columns
|
||||||
|
and #%00001110 ; column and way to id enemy (10 is radar)
|
||||||
|
lsr ; move col to 1's position
|
||||||
|
lsr
|
||||||
|
bcc :+ ; if carry clear then this is a missile
|
||||||
|
ldy #4 ; a radar is 4 columns
|
||||||
|
:
|
||||||
|
sta zaColumn ; save the enemy column
|
||||||
|
txa ; get the screen column under the cursor (in the buffer)
|
||||||
|
sec
|
||||||
|
sbc zaColumn ; subtract the enemy column, giving the buffer column of the 1st enemy column
|
||||||
|
tax ; get the index into a
|
||||||
|
lda worldBBuffer, x ; get the world height
|
||||||
|
sec
|
||||||
|
sbc #1 ; and go 1 row higher (on top of ground)
|
||||||
|
:
|
||||||
|
sta enemyHgtBuffer, x ; write the world height to all
|
||||||
|
inx ; the columns of the enemy
|
||||||
|
dey
|
||||||
|
bne :-
|
||||||
|
|
||||||
|
done:
|
||||||
|
rts
|
||||||
|
|
||||||
|
.endproc
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; Set the terrain top in the world data stream as well as the draw buffers
|
||||||
|
.proc editSetTerrainTop
|
||||||
|
|
||||||
|
zaMidScreen = tempBlock + 4
|
||||||
|
|
||||||
|
lda zWorldPtr + 1 ; make a ptr to the cursor
|
||||||
|
sta zaMidScreen + 1
|
||||||
|
lda zWorldPtr
|
||||||
|
sec
|
||||||
|
sbc #((XSIZE/2)*3)
|
||||||
|
sta zaMidScreen
|
||||||
|
bcs :+
|
||||||
|
dec zaMidScreen + 1
|
||||||
|
|
||||||
|
:
|
||||||
|
ldy #4 ; index from ptr
|
||||||
|
lda playerShipY
|
||||||
|
sta (zaMidScreen), y ; save the top in the world data
|
||||||
|
|
||||||
|
lda bufferDraw ; also update the draw buffer
|
||||||
|
clc
|
||||||
|
adc playerShipX
|
||||||
|
tax
|
||||||
|
lda playerShipY
|
||||||
|
sta worldTBuffer, x
|
||||||
|
|
||||||
|
rts
|
||||||
|
|
||||||
|
.endproc
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; This routine will "kill" enemies that overlap with the cursor column.
|
||||||
|
; the zaDrawSprWidth is 4 (radar) or 2 (missile) for the type of enemy
|
||||||
|
; for which room needs to be created
|
||||||
|
; Enemies are removed from the world stream and the draw buffers
|
||||||
|
.proc editPreSetEnemy
|
||||||
|
|
||||||
|
zaDrawSprWidth = tempBlock + 3 ; Parameter
|
||||||
|
zaMidScreenL = tempBlock + 5
|
||||||
|
zaMidScreenH = tempBlock + 6
|
||||||
|
|
||||||
|
lda zWorldPtr + 1 ; calculate an offset for the cursor
|
||||||
|
sta zaMidScreenH
|
||||||
|
lda zWorldPtr
|
||||||
|
sec
|
||||||
|
sbc #(((XSIZE/2)+2)*3)
|
||||||
|
sta zaMidScreenL
|
||||||
|
bcs :+
|
||||||
|
dec zaMidScreenH
|
||||||
|
|
||||||
|
:
|
||||||
|
lda #3 ; check 3 columns before the cursor as a 4 col
|
||||||
|
clc ; radar could start 3 col earlier and still overlap
|
||||||
|
adc zaDrawSprWidth ; and add the length of the enemy (4 for radar, 2 for missile)
|
||||||
|
tax ; put the number of cols to check in x
|
||||||
|
ldy #2 ; index off of ptr to point at enemy bytes
|
||||||
|
krl:
|
||||||
|
lda (zaMidScreenL), y ; get the enemy byte
|
||||||
|
bit Bit2Mask ; see if it's a radar
|
||||||
|
beq :+
|
||||||
|
and #%11111100 ; mask off the enemy bits (making it blank but keeping stage data)
|
||||||
|
sta (zaMidScreenL), y ; and save the "deleted" enemy
|
||||||
|
:
|
||||||
|
iny ; advance the offset by 3 to the next enemy byte
|
||||||
|
iny
|
||||||
|
iny
|
||||||
|
dex ; and one less column to do
|
||||||
|
bne krl ; repeat till all cols checked
|
||||||
|
|
||||||
|
lda #1 ; now do the exact same but for missiles
|
||||||
|
clc ; but start only 1 column before the cursor as
|
||||||
|
adc zaDrawSprWidth ; a missile that overlaps can only overlap from 1 col earlier
|
||||||
|
tax
|
||||||
|
ldy #8
|
||||||
|
kml:
|
||||||
|
lda (zaMidScreenL), y
|
||||||
|
bit Bit1Mask
|
||||||
|
beq :+
|
||||||
|
and #%11111100
|
||||||
|
sta (zaMidScreenL), y
|
||||||
|
:
|
||||||
|
iny
|
||||||
|
iny
|
||||||
|
iny
|
||||||
|
dex
|
||||||
|
bne kml
|
||||||
|
|
||||||
|
lda #(XSIZE/2) ; get the offset of the cursor into the buffers
|
||||||
|
clc
|
||||||
|
adc bufferDraw
|
||||||
|
sta zEnemyCol ; and put it in the "enemy column"
|
||||||
|
jsr gameKillEnemy ; and call the game kill to see if there's an enemy to destroy
|
||||||
|
|
||||||
|
rts
|
||||||
|
|
||||||
|
.endproc
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
.proc editSetRadar
|
||||||
|
|
||||||
|
zaDrawSprWidth = tempBlock + 3 ; Parameter
|
||||||
|
zaMidScreenL = tempBlock + 5
|
||||||
|
|
||||||
|
lda #4 ; need room for a radar so 4 cols
|
||||||
|
sta zaDrawSprWidth
|
||||||
|
jsr editPreSetEnemy ; delete any overlapping enemies
|
||||||
|
lda enemyHitType ; if set, then an enemy was deleted. Just exit
|
||||||
|
bmi :+
|
||||||
|
rts
|
||||||
|
|
||||||
|
:
|
||||||
|
ldy #11 ; no overlapping enemies. The offset in the world stream from the ptr
|
||||||
|
lda #2 ; and the radar type
|
||||||
|
ora (zaMidScreenL), y ; add it to whatever is there (stage marker)
|
||||||
|
sta (zaMidScreenL), y ; and save it
|
||||||
|
|
||||||
|
lda bufferDraw ; and also insert it into the draw buffers
|
||||||
|
clc
|
||||||
|
adc #(XSIZE/2)
|
||||||
|
tax
|
||||||
|
clc
|
||||||
|
lda #2
|
||||||
|
jsr gameWorldFlag
|
||||||
|
|
||||||
|
rts
|
||||||
|
.endproc
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
.proc editSetMissile
|
||||||
|
|
||||||
|
zaDrawSprWidth = tempBlock + 3 ; Parameter
|
||||||
|
zaMidScreenL = tempBlock + 5
|
||||||
|
|
||||||
|
lda #2 ; need room for a missile (so 2 cols)
|
||||||
|
sta zaDrawSprWidth
|
||||||
|
jsr editPreSetEnemy ; delete overlapping enemies from the world and draw buffers
|
||||||
|
lda enemyHitType ; if set, enemies were deleted so exit
|
||||||
|
bmi :+
|
||||||
|
rts
|
||||||
|
|
||||||
|
:
|
||||||
|
ldy #11 ; no overlapping enemies. The offset in the world stream from the ptr
|
||||||
|
lda #1 ; and the missile type
|
||||||
|
ora (zaMidScreenL), y ; add it to whatever is there (stage marker)
|
||||||
|
sta (zaMidScreenL), y ; and save it
|
||||||
|
|
||||||
|
lda bufferDraw ; also add the missile to the draw buffers
|
||||||
|
clc
|
||||||
|
adc #(XSIZE/2)
|
||||||
|
tax
|
||||||
|
clc
|
||||||
|
lda #1
|
||||||
|
jsr gameWorldFlag
|
||||||
|
|
||||||
|
rts
|
||||||
|
.endproc
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
.proc editLoadStage
|
||||||
|
|
||||||
|
jsr gameFindStage ; find the stage
|
||||||
|
|
||||||
|
lda #(XSIZE+2) ; scroll it on-screen but make sure there are
|
||||||
|
sta tempBlock + 1 ; extra cols of data in the buffers
|
||||||
|
:
|
||||||
|
jsr gameWorldMove ; populate the buffers
|
||||||
|
dec tempBlock + 1
|
||||||
|
bpl :-
|
||||||
|
|
||||||
|
lda #4 ; start the screen draw 2 cols more to the right than
|
||||||
|
sta bufferDraw ; there's buffer data for so a left scroll will work
|
||||||
|
|
||||||
|
rts
|
||||||
|
|
||||||
|
.endproc
|
125
src/apple2/file.inc
Normal file
125
src/apple2/file.inc
Normal file
|
@ -0,0 +1,125 @@
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; file.inc
|
||||||
|
; Part of penetrator, the zx spectrum game, made for Apple II
|
||||||
|
;
|
||||||
|
; Stefan Wessels, 2019
|
||||||
|
; This is free and unencumbered software released into the public domain.
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
PATHNAME = $0280
|
||||||
|
MLI = $BF00
|
||||||
|
|
||||||
|
QUIT_CALL = $65
|
||||||
|
OPEN_CALL = $C8
|
||||||
|
READ_CALL = $CA
|
||||||
|
WRITE_CALL = $CB
|
||||||
|
CLOSE_CALL = $CC
|
||||||
|
CREATE_CALL = $C0
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
.segment "DATA"
|
||||||
|
createParam:
|
||||||
|
.byte $07 ;PARAM_COUNT
|
||||||
|
.addr PATHNAME ;PATHNAME
|
||||||
|
.byte $C3 ;ACCESS
|
||||||
|
.byte $06 ;FILE_TYPE (6 is binay)
|
||||||
|
.word $0000 ;AUX_TYPE
|
||||||
|
.byte $01 ;STORAGE_TYPE
|
||||||
|
.word $0000 ;CREATE_DATE
|
||||||
|
.word $0000 ;CREATE_TIME
|
||||||
|
|
||||||
|
openParam:
|
||||||
|
.byte $03 ;PARAM_COUNT
|
||||||
|
.addr PATHNAME ;PATHNAME
|
||||||
|
.addr $2000-$400 ;IO_BUFFER
|
||||||
|
openRef:
|
||||||
|
.byte $00 ;REF_NUM
|
||||||
|
|
||||||
|
readParam:
|
||||||
|
.byte $04 ;PARAM_COUNT
|
||||||
|
readRef:
|
||||||
|
.byte $00 ;REF_NUM
|
||||||
|
.addr worldDataStart ;DATA_BUFFER
|
||||||
|
.word $FFFF ;REQUEST_COUNT
|
||||||
|
.word $0000 ;TRANS_COUNT
|
||||||
|
|
||||||
|
writeParam:
|
||||||
|
.byte $04 ;PARAM_COUNT
|
||||||
|
writeRef:
|
||||||
|
.byte $00 ;REF_NUM
|
||||||
|
.addr worldDataStart ;DATA_BUFFER
|
||||||
|
.word worldDataEnd-worldDataStart ;REQUEST_COUNT
|
||||||
|
.word $0000 ;TRANS_COUNT
|
||||||
|
|
||||||
|
closeParam:
|
||||||
|
.byte $01 ;PARAM_COUNT
|
||||||
|
closeRef:
|
||||||
|
.byte $00 ;REF_NUM
|
||||||
|
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
.segment "CODE"
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
.proc fileSave
|
||||||
|
|
||||||
|
jsr MLI ; create the file
|
||||||
|
.byte CREATE_CALL
|
||||||
|
.word createParam
|
||||||
|
bcc :+
|
||||||
|
jmp error
|
||||||
|
|
||||||
|
:
|
||||||
|
jsr MLI
|
||||||
|
.byte OPEN_CALL
|
||||||
|
.word openParam
|
||||||
|
bcc :+
|
||||||
|
jmp error
|
||||||
|
|
||||||
|
:
|
||||||
|
lda openRef
|
||||||
|
sta writeRef
|
||||||
|
sta closeRef
|
||||||
|
|
||||||
|
jsr MLI
|
||||||
|
.byte WRITE_CALL
|
||||||
|
.word writeParam
|
||||||
|
bcs error
|
||||||
|
|
||||||
|
jsr MLI
|
||||||
|
.byte CLOSE_CALL
|
||||||
|
.word closeParam
|
||||||
|
bcs error
|
||||||
|
|
||||||
|
error:
|
||||||
|
rts
|
||||||
|
|
||||||
|
.endproc
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
.proc fileLoad
|
||||||
|
|
||||||
|
jsr MLI
|
||||||
|
.byte OPEN_CALL
|
||||||
|
.word openParam
|
||||||
|
bcc :+
|
||||||
|
jmp error
|
||||||
|
|
||||||
|
:
|
||||||
|
lda openRef
|
||||||
|
sta readRef
|
||||||
|
sta closeRef
|
||||||
|
|
||||||
|
jsr MLI
|
||||||
|
.byte READ_CALL
|
||||||
|
.word readParam
|
||||||
|
bcs error
|
||||||
|
|
||||||
|
jsr MLI
|
||||||
|
.byte CLOSE_CALL
|
||||||
|
.word closeParam
|
||||||
|
bcs error
|
||||||
|
|
||||||
|
error:
|
||||||
|
rts
|
||||||
|
|
||||||
|
.endproc
|
948
src/apple2/fontdata.inc
Normal file
948
src/apple2/fontdata.inc
Normal file
|
@ -0,0 +1,948 @@
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; fontdata.inc
|
||||||
|
; Part of penetrator, the zx spectrum game, made for Apple II
|
||||||
|
;
|
||||||
|
; Stefan Wessels, 2019
|
||||||
|
; This is free and unencumbered software released into the public domain.
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
.segment "RODATA"
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; The characters are listed in Apple format (backwards) and human-facing
|
||||||
|
; format (not backwards ;)
|
||||||
|
font:
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $24 ; --X--X-- --X--X--
|
||||||
|
.byte $24 ; --X--X-- --X--X--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $24 ; --X--X-- --X--X--
|
||||||
|
.byte $7E ; -XXXXXX- -XXXXXX-
|
||||||
|
.byte $24 ; --X--X-- --X--X--
|
||||||
|
.byte $24 ; --X--X-- --X--X--
|
||||||
|
.byte $7E ; -XXXXXX- -XXXXXX-
|
||||||
|
.byte $24 ; --X--X-- --X--X--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $78 ; -XXXX--- ---XXXX-
|
||||||
|
.byte $14 ; ---X-X-- --X-X---
|
||||||
|
.byte $38 ; --XXX--- ---XXX--
|
||||||
|
.byte $50 ; -X-X---- ----X-X-
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $46 ; -X---XX- -XX---X-
|
||||||
|
.byte $26 ; --X--XX- -XX--X--
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $64 ; -XX--X-- --X--XX-
|
||||||
|
.byte $62 ; -XX---X- -X---XX-
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $14 ; ---X-X-- --X-X---
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $54 ; -X-X-X-- --X-X-X-
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $5C ; -X-XXX-- --XXX-X-
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $20 ; --X----- -----X--
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $20 ; --X----- -----X--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $04 ; -----X-- --X-----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $04 ; -----X-- --X-----
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $28 ; --X-X--- ---X-X--
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $7C ; -XXXXX-- --XXXXX-
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $28 ; --X-X--- ---X-X--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $7C ; -XXXXX-- --XXXXX-
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $7C ; -XXXXX-- --XXXXX-
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $18 ; ---XX--- ---XX---
|
||||||
|
.byte $18 ; ---XX--- ---XX---
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $40 ; -X------ ------X-
|
||||||
|
.byte $20 ; --X----- -----X--
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $04 ; -----X-- --X-----
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $62 ; -XX---X- -X---XX-
|
||||||
|
.byte $52 ; -X-X--X- -X--X-X-
|
||||||
|
.byte $4A ; -X--X-X- -X-X--X-
|
||||||
|
.byte $46 ; -X---XX- -XX---X-
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $18 ; ---XX--- ---XX---
|
||||||
|
.byte $14 ; ---X-X-- --X-X---
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $7C ; -XXXXX-- --XXXXX-
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $40 ; -X------ ------X-
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $02 ; ------X- -X------
|
||||||
|
.byte $7E ; -XXXXXX- -XXXXXX-
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $30 ; --XX---- ----XX--
|
||||||
|
.byte $40 ; -X------ ------X-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $18 ; ---XX--- ---XX---
|
||||||
|
.byte $14 ; ---X-X-- --X-X---
|
||||||
|
.byte $12 ; ---X--X- -X--X---
|
||||||
|
.byte $7E ; -XXXXXX- -XXXXXX-
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $7E ; -XXXXXX- -XXXXXX-
|
||||||
|
.byte $02 ; ------X- -X------
|
||||||
|
.byte $3E ; --XXXXX- -XXXXX--
|
||||||
|
.byte $40 ; -X------ ------X-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $02 ; ------X- -X------
|
||||||
|
.byte $3E ; --XXXXX- -XXXXX--
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $7E ; -XXXXXX- -XXXXXX-
|
||||||
|
.byte $40 ; -X------ ------X-
|
||||||
|
.byte $20 ; --X----- -----X--
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $7C ; -XXXXX-- --XXXXX-
|
||||||
|
.byte $40 ; -X------ ------X-
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $04 ; -----X-- --X-----
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $20 ; --X----- -----X--
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $20 ; --X----- -----X--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $7C ; -XXXXX-- --XXXXX-
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $7C ; -XXXXX-- --XXXXX-
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $20 ; --X----- -----X--
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $20 ; --X----- -----X--
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $52 ; -X-X--X- -X--X-X-
|
||||||
|
.byte $6A ; -XX-X-X- -X-X-XX-
|
||||||
|
.byte $7A ; -XXXX-X- -X-XXXX-
|
||||||
|
.byte $02 ; ------X- -X------
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $7E ; -XXXXXX- -XXXXXX-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $3E ; --XXXXX- -XXXXX--
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $3E ; --XXXXX- -XXXXX--
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $3E ; --XXXXX- -XXXXX--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $02 ; ------X- -X------
|
||||||
|
.byte $02 ; ------X- -X------
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $1E ; ---XXXX- -XXXX---
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $1E ; ---XXXX- -XXXX---
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $7E ; -XXXXXX- -XXXXXX-
|
||||||
|
.byte $02 ; ------X- -X------
|
||||||
|
.byte $3E ; --XXXXX- -XXXXX--
|
||||||
|
.byte $02 ; ------X- -X------
|
||||||
|
.byte $02 ; ------X- -X------
|
||||||
|
.byte $7E ; -XXXXXX- -XXXXXX-
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $7E ; -XXXXXX- -XXXXXX-
|
||||||
|
.byte $02 ; ------X- -X------
|
||||||
|
.byte $3E ; --XXXXX- -XXXXX--
|
||||||
|
.byte $02 ; ------X- -X------
|
||||||
|
.byte $02 ; ------X- -X------
|
||||||
|
.byte $02 ; ------X- -X------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $02 ; ------X- -X------
|
||||||
|
.byte $72 ; -XXX--X- -X--XXX-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $7E ; -XXXXXX- -XXXXXX-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $7C ; -XXXXX-- --XXXXX-
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $7C ; -XXXXX-- --XXXXX-
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $40 ; -X------ ------X-
|
||||||
|
.byte $40 ; -X------ ------X-
|
||||||
|
.byte $40 ; -X------ ------X-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $12 ; ---X--X- -X--X---
|
||||||
|
.byte $0E ; ----XXX- -XXX----
|
||||||
|
.byte $12 ; ---X--X- -X--X---
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $02 ; ------X- -X------
|
||||||
|
.byte $02 ; ------X- -X------
|
||||||
|
.byte $02 ; ------X- -X------
|
||||||
|
.byte $02 ; ------X- -X------
|
||||||
|
.byte $02 ; ------X- -X------
|
||||||
|
.byte $7E ; -XXXXXX- -XXXXXX-
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $66 ; -XX--XX- -XX--XX-
|
||||||
|
.byte $5A ; -X-XX-X- -X-XX-X-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $46 ; -X---XX- -XX---X-
|
||||||
|
.byte $4A ; -X--X-X- -X-X--X-
|
||||||
|
.byte $52 ; -X-X--X- -X--X-X-
|
||||||
|
.byte $62 ; -XX---X- -X---XX-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $3E ; --XXXXX- -XXXXX--
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $3E ; --XXXXX- -XXXXX--
|
||||||
|
.byte $02 ; ------X- -X------
|
||||||
|
.byte $02 ; ------X- -X------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $4A ; -X--X-X- -X-X--X-
|
||||||
|
.byte $52 ; -X-X--X- -X--X-X-
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $3E ; --XXXXX- -XXXXX--
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $3E ; --XXXXX- -XXXXX--
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $02 ; ------X- -X------
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $40 ; -X------ ------X-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $7F ; -XXXXXXX XXXXXXX-
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $24 ; --X--X-- --X--X--
|
||||||
|
.byte $18 ; ---XX--- ---XX---
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $5A ; -X-XX-X- -X-XX-X-
|
||||||
|
.byte $24 ; --X--X-- --X--X--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $24 ; --X--X-- --X--X--
|
||||||
|
.byte $18 ; ---XX--- ---XX---
|
||||||
|
.byte $18 ; ---XX--- ---XX---
|
||||||
|
.byte $24 ; --X--X-- --X--X--
|
||||||
|
.byte $42 ; -X----X- -X----X-
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $41 ; -X-----X X-----X-
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $14 ; ---X-X-- --X-X---
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $7E ; -XXXXXX- -XXXXXX-
|
||||||
|
.byte $20 ; --X----- -----X--
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $04 ; -----X-- --X-----
|
||||||
|
.byte $7E ; -XXXXXX- -XXXXXX-
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $70 ; -XXX---- ----XXX-
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $70 ; -XXX---- ----XXX-
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $02 ; ------X- -X------
|
||||||
|
.byte $04 ; -----X-- --X-----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $20 ; --X----- -----X--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $0E ; ----XXX- -XXX----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $0E ; ----XXX- -XXX----
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $1C ; ---XXX-- --XXX---
|
||||||
|
.byte $2A ; --X-X-X- -X-X-X--
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $FF ; XXXXXXXX XXXXXXXX
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $38 ; --XXX--- ---XXX--
|
||||||
|
.byte $44 ; -X---X-- --X---X-
|
||||||
|
.byte $1E ; ---XXXX- -XXXX---
|
||||||
|
.byte $04 ; -----X-- --X-----
|
||||||
|
.byte $04 ; -----X-- --X-----
|
||||||
|
.byte $7E ; -XXXXXX- -XXXXXX-
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $1C ; ---XXX-- --XXX---
|
||||||
|
.byte $20 ; --X----- -----X--
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $04 ; -----X-- --X-----
|
||||||
|
.byte $04 ; -----X-- --X-----
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $44 ; -X---X-- --X---X-
|
||||||
|
.byte $44 ; -X---X-- --X---X-
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $38 ; --XXX--- ---XXX--
|
||||||
|
.byte $04 ; -----X-- --X-----
|
||||||
|
.byte $04 ; -----X-- --X-----
|
||||||
|
.byte $04 ; -----X-- --X-----
|
||||||
|
.byte $38 ; --XXX--- ---XXX--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $20 ; --X----- -----X--
|
||||||
|
.byte $20 ; --X----- -----X--
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $1C ; ---XXX-- --XXX---
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $1E ; ---XXXX- -XXXX---
|
||||||
|
.byte $02 ; ------X- -X------
|
||||||
|
.byte $1C ; ---XXX-- --XXX---
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $30 ; --XX---- ----XX--
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $18 ; ---XX--- ---XX---
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $20 ; --X----- -----X--
|
||||||
|
.byte $1C ; ---XXX-- --XXX---
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $02 ; ------X- -X------
|
||||||
|
.byte $02 ; ------X- -X------
|
||||||
|
.byte $1E ; ---XXXX- -XXXX---
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $0C ; ----XX-- --XX----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $1C ; ---XXX-- --XXX---
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $20 ; --X----- -----X--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $20 ; --X----- -----X--
|
||||||
|
.byte $20 ; --X----- -----X--
|
||||||
|
.byte $20 ; --X----- -----X--
|
||||||
|
.byte $24 ; --X--X-- --X--X--
|
||||||
|
.byte $18 ; ---XX--- ---XX---
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $04 ; -----X-- --X-----
|
||||||
|
.byte $14 ; ---X-X-- --X-X---
|
||||||
|
.byte $0C ; ----XX-- --XX----
|
||||||
|
.byte $0C ; ----XX-- --XX----
|
||||||
|
.byte $14 ; ---X-X-- --X-X---
|
||||||
|
.byte $24 ; --X--X-- --X--X--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $30 ; --XX---- ----XX--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $16 ; ---X-XX- -XX-X---
|
||||||
|
.byte $2A ; --X-X-X- -X-X-X--
|
||||||
|
.byte $2A ; --X-X-X- -X-X-X--
|
||||||
|
.byte $2A ; --X-X-X- -X-X-X--
|
||||||
|
.byte $2A ; --X-X-X- -X-X-X--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $1E ; ---XXXX- -XXXX---
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $1C ; ---XXX-- --XXX---
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $1C ; ---XXX-- --XXX---
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $1E ; ---XXXX- -XXXX---
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $1E ; ---XXXX- -XXXX---
|
||||||
|
.byte $02 ; ------X- -X------
|
||||||
|
.byte $02 ; ------X- -X------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $20 ; --X----- -----X--
|
||||||
|
.byte $40 ; -X------ ------X-
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $38 ; --XXX--- ---XXX--
|
||||||
|
.byte $04 ; -----X-- --X-----
|
||||||
|
.byte $04 ; -----X-- --X-----
|
||||||
|
.byte $04 ; -----X-- --X-----
|
||||||
|
.byte $04 ; -----X-- --X-----
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $1C ; ---XXX-- --XXX---
|
||||||
|
.byte $02 ; ------X- -X------
|
||||||
|
.byte $1C ; ---XXX-- --XXX---
|
||||||
|
.byte $20 ; --X----- -----X--
|
||||||
|
.byte $1E ; ---XXXX- -XXXX---
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $1C ; ---XXX-- --XXX---
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $30 ; --XX---- ----XX--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $1C ; ---XXX-- --XXX---
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $14 ; ---X-X-- --X-X---
|
||||||
|
.byte $14 ; ---X-X-- --X-X---
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $2A ; --X-X-X- -X-X-X--
|
||||||
|
.byte $2A ; --X-X-X- -X-X-X--
|
||||||
|
.byte $2A ; --X-X-X- -X-X-X--
|
||||||
|
.byte $14 ; ---X-X-- --X-X---
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $14 ; ---X-X-- --X-X---
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $14 ; ---X-X-- --X-X---
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $3C ; --XXXX-- --XXXX--
|
||||||
|
.byte $20 ; --X----- -----X--
|
||||||
|
.byte $1C ; ---XXX-- --XXX---
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $3E ; --XXXXX- -XXXXX--
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $04 ; -----X-- --X-----
|
||||||
|
.byte $3E ; --XXXXX- -XXXXX--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $60 ; -XX----- -----XX-
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $0C ; ----XX-- --XX----
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $60 ; -XX----- -----XX-
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $10 ; ---X---- ----X---
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $06 ; -----XX- -XX-----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $30 ; --XX---- ----XX--
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $06 ; -----XX- -XX-----
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $28 ; --X-X--- ---X-X--
|
||||||
|
.byte $14 ; ---X-X-- --X-X---
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $1C ; ---XXX-- --XXX---
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $59 ; -X-XX--X X--XX-X-
|
||||||
|
.byte $45 ; -X---X-X X-X---X-
|
||||||
|
.byte $45 ; -X---X-X X-X---X-
|
||||||
|
.byte $59 ; -X-XX--X X--XX-X-
|
||||||
|
.byte $22 ; --X---X- -X---X--
|
||||||
|
.byte $1C ; ---XXX-- --XXX---
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $02 ; ------X- -X------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $01 ; -------X X-------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $05 ; -----X-X X-X-----
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $15 ; ---X-X-X X-X-X---
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $55 ; -X-X-X-X X-X-X-X-
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $49 ; -X--X--X X--X--X-
|
||||||
|
.byte $3E ; --XXXXX- -XXXXX--
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $3E ; --XXXXX- -XXXXX--
|
||||||
|
.byte $49 ; -X--X--X X--X--X-
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $2A ; --X-X-X- -X-X-X--
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
.byte $08 ; ----X--- ---X----
|
||||||
|
.byte $00 ; -------- --------
|
||||||
|
endFont:
|
1197
src/apple2/game.inc
Normal file
1197
src/apple2/game.inc
Normal file
File diff suppressed because it is too large
Load Diff
386
src/apple2/input.inc
Normal file
386
src/apple2/input.inc
Normal file
|
@ -0,0 +1,386 @@
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; input.inc
|
||||||
|
; Part of penetrator, the zx spectrum game, made for Apple II
|
||||||
|
;
|
||||||
|
; Stefan Wessels, 2019
|
||||||
|
; This is free and unencumbered software released into the public domain.
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
.segment "CODE"
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
.proc inputReadJoystick
|
||||||
|
|
||||||
|
joyMask = tempBlock + 21
|
||||||
|
|
||||||
|
lda #0 ; assume no buttons
|
||||||
|
sta joyMask ; init the mask
|
||||||
|
|
||||||
|
lda $c061 ; check RDBTN0
|
||||||
|
cmp #$80 ; fully active
|
||||||
|
bne :+ ; no, ignore
|
||||||
|
lda #KEY_FIRE ; RDBTN0 maps to fire
|
||||||
|
sta joyMask ; init the mask
|
||||||
|
|
||||||
|
:
|
||||||
|
lda $c062 ; check BUTN1
|
||||||
|
cmp #$80 ; fully active
|
||||||
|
bne :+ ; no, ignore
|
||||||
|
lda joyMask
|
||||||
|
ora #KEY_BOMB ; BUTN1 maps to Bomb
|
||||||
|
sta joyMask ; update the mask
|
||||||
|
|
||||||
|
:
|
||||||
|
lda $c070 ; Reset the input
|
||||||
|
|
||||||
|
ldy #0 ; zero the direction counters
|
||||||
|
ldx #0
|
||||||
|
|
||||||
|
xchk: ; get bit 8 clear in c064 and c065
|
||||||
|
lda $c064 ; load left/right
|
||||||
|
bpl goY ; bit 8 not set?
|
||||||
|
nop ; wast time
|
||||||
|
inx ; count the ticks
|
||||||
|
lda $c065 ; load up/down
|
||||||
|
bmi ychk ;
|
||||||
|
bpl xchk ;
|
||||||
|
ychk:
|
||||||
|
iny ; inc y counter
|
||||||
|
jmp xchk ; goX
|
||||||
|
|
||||||
|
goY:
|
||||||
|
lda $c065 ; load up/down
|
||||||
|
bmi ychk ; bit 8 set?
|
||||||
|
|
||||||
|
tya ; y is the direction analog
|
||||||
|
cmp #$66 ; >= $66 is down
|
||||||
|
bcs down
|
||||||
|
cmp #$33 ; < $33 is up, $33-$65 is deadzone
|
||||||
|
bcs doX
|
||||||
|
lda #KEY_UP ; < $33 is KEY_UP digital
|
||||||
|
bne :+
|
||||||
|
down:
|
||||||
|
lda #KEY_DOWN ; >= $66 is KEY_DOWN digital
|
||||||
|
:
|
||||||
|
ora joyMask ; update the mask
|
||||||
|
sta joyMask ; for the Y direction
|
||||||
|
|
||||||
|
doX:
|
||||||
|
txa ; turn x into digital
|
||||||
|
cmp #$66 ; >= $66 is right
|
||||||
|
bcs right
|
||||||
|
cmp #$33 ; < $33 is left, rest is deadzone
|
||||||
|
bcs leave
|
||||||
|
lda #KEY_LEFT ; < $33 is KEY_LEFT digital
|
||||||
|
bne :+
|
||||||
|
right:
|
||||||
|
lda #KEY_RIGHT ; > $66 is KEY_RIGHT
|
||||||
|
:
|
||||||
|
ora joyMask
|
||||||
|
eor #$ff
|
||||||
|
sta joyMask ; update the joy Mask with X digital
|
||||||
|
rts ; return with joyMask in accumulator
|
||||||
|
|
||||||
|
leave:
|
||||||
|
lda joyMask ; return with joyMask in accumulator
|
||||||
|
eor #$ff
|
||||||
|
sta joyMask ; update the joy Mask with X digital
|
||||||
|
rts
|
||||||
|
|
||||||
|
.endproc
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; Reads the joystick and moves the player.
|
||||||
|
.proc inputGame
|
||||||
|
|
||||||
|
zaRawInput = tempBlock + 1
|
||||||
|
zaRawEor = tempBlock + 2
|
||||||
|
|
||||||
|
lda fireCoolDown
|
||||||
|
beq :+
|
||||||
|
dec fireCoolDown
|
||||||
|
:
|
||||||
|
jsr inputReadJoystick
|
||||||
|
|
||||||
|
sta zaRawInput ; save the input
|
||||||
|
eor #$ff ; invert the bits
|
||||||
|
sta zaRawEor ; save this state too
|
||||||
|
|
||||||
|
lda zaRawInput ; no vertical move so process vertical joystick
|
||||||
|
|
||||||
|
up:
|
||||||
|
bit Bit4Mask ; set when moving up
|
||||||
|
bne down
|
||||||
|
lda playerShipY ; and move the ship up 2 rows
|
||||||
|
sec
|
||||||
|
sbc #3
|
||||||
|
cmp #(SHIP_HEIGHT+WORLD_START) ; limit at the top
|
||||||
|
bcc preLeft ; if too high, just ignore saving the move
|
||||||
|
sta playerShipY ; save the new position
|
||||||
|
bcs preLeft ; up, so skip down and check horizontal
|
||||||
|
|
||||||
|
down:
|
||||||
|
bit Bit3Mask ; ser for joystick down
|
||||||
|
bne left
|
||||||
|
lda playerShipY ; move the ship 2 rows down
|
||||||
|
clc
|
||||||
|
adc #3
|
||||||
|
cmp #(WORLD_END+1) ; limit at the bottom
|
||||||
|
bcs preBomb ; skip saving the new position if too low
|
||||||
|
sta playerShipY ; new position okay so save it
|
||||||
|
|
||||||
|
preLeft:
|
||||||
|
lda zaRawInput ; no horizontal movement so process horiz joystick
|
||||||
|
|
||||||
|
left:
|
||||||
|
bit Bit2Mask ; left sets this bit
|
||||||
|
bne right ; not set see if right is set
|
||||||
|
ldx playerShipX ; the ship should move left
|
||||||
|
dex ; move left one column
|
||||||
|
bmi preBomb ; if off-screen to the left, ignore
|
||||||
|
stx playerShipX ; save the movement
|
||||||
|
bpl preBomb
|
||||||
|
|
||||||
|
right:
|
||||||
|
bit Bit1Mask ; bit set when right joystick active
|
||||||
|
bne bomb ; if nothing, go process player movement
|
||||||
|
|
||||||
|
ldx playerShipX ; get the ship position
|
||||||
|
inx ; move one column to the right
|
||||||
|
cpx #(((XSIZE/3)*2) - SHIP_WIDTH - 1) ; limit to two-thirds toward the right
|
||||||
|
bcs preBomb ; if over limit, ignore
|
||||||
|
stx playerShipX ; save movement
|
||||||
|
|
||||||
|
preBomb:
|
||||||
|
lda zaRawInput
|
||||||
|
|
||||||
|
bomb:
|
||||||
|
bit Bit8Mask ; Button_A = bomb
|
||||||
|
bne fire
|
||||||
|
lda lastInput ; debounce the key for single shot
|
||||||
|
and zaRawEor
|
||||||
|
and Bit8Mask
|
||||||
|
beq nobomb ; bomb key not down
|
||||||
|
lda playerShipY ; bomb requested but can't
|
||||||
|
cmp #(WORLD_END-BOMB_HEIGHT) ; drop it when there's no room
|
||||||
|
bcs nobomb ; before the world end (else it draws out of bounds)
|
||||||
|
ldx #NUM_BOMBS-1 ; iterate over all bombs
|
||||||
|
:
|
||||||
|
lda bombY, x
|
||||||
|
beq drop ; find one that's available
|
||||||
|
dex
|
||||||
|
bpl :-
|
||||||
|
bmi nobomb ; none available
|
||||||
|
drop:
|
||||||
|
lda playerShipX ; bomb is relative to player
|
||||||
|
clc
|
||||||
|
adc #2
|
||||||
|
sta bombX, x
|
||||||
|
lda playerShipY
|
||||||
|
adc #6
|
||||||
|
sta bombY, x
|
||||||
|
lda #BOMB_FRWRD_FRMS ; set it to fly forward
|
||||||
|
sta bombDir, x
|
||||||
|
nobomb:
|
||||||
|
lda zaRawInput
|
||||||
|
|
||||||
|
fire:
|
||||||
|
bit Bit7Mask ; Button_B = fire
|
||||||
|
bne joyDone
|
||||||
|
lda fireCoolDown
|
||||||
|
bne joyDone
|
||||||
|
lda lastInput ; debounce the key for single shot
|
||||||
|
and zaRawEor
|
||||||
|
and Bit7Mask
|
||||||
|
beq joyDone
|
||||||
|
lda playerShipX ; Put even/odd into carry
|
||||||
|
lsr
|
||||||
|
lda playerShipX ; bullets start relative to ship
|
||||||
|
adc #4 ; 4 for even, 5 for odd
|
||||||
|
adc bulletIndex
|
||||||
|
tax
|
||||||
|
lda playerShipY
|
||||||
|
sec
|
||||||
|
sbc #4
|
||||||
|
sta bulletsBuffer, x ; put height into 3 columns
|
||||||
|
lda #3
|
||||||
|
sta fireCoolDown
|
||||||
|
|
||||||
|
joyDone:
|
||||||
|
lda zaRawInput ; remember the key-state for next time
|
||||||
|
sta lastInput ; so that fire and bombs can be debounced
|
||||||
|
|
||||||
|
lda KBD ; leave with a key in the accumulator
|
||||||
|
bit KBDSTRB ; reset the key
|
||||||
|
|
||||||
|
clc ; keep carry clear between routines
|
||||||
|
rts
|
||||||
|
|
||||||
|
.endproc
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
.proc inputEdit
|
||||||
|
|
||||||
|
rawInput = tempBlock + 17
|
||||||
|
rawEor = tempBlock + 18
|
||||||
|
brushType = tempBlock + 16
|
||||||
|
|
||||||
|
lda KBD
|
||||||
|
bit Bit8Mask
|
||||||
|
beq :+
|
||||||
|
bit KBDSTRB
|
||||||
|
and #$7f
|
||||||
|
bne :++
|
||||||
|
:
|
||||||
|
lda #0
|
||||||
|
:
|
||||||
|
pha
|
||||||
|
|
||||||
|
jsr inputReadJoystick
|
||||||
|
sta rawInput ; save the input state
|
||||||
|
|
||||||
|
pla
|
||||||
|
pha
|
||||||
|
cmp #' '
|
||||||
|
bne :+
|
||||||
|
lda rawInput
|
||||||
|
eor #KEY_SELECT
|
||||||
|
sta rawInput
|
||||||
|
pla
|
||||||
|
pha
|
||||||
|
|
||||||
|
:
|
||||||
|
cmp #'B'
|
||||||
|
bne :+
|
||||||
|
lda rawInput
|
||||||
|
eor #KEY_START
|
||||||
|
sta rawInput
|
||||||
|
|
||||||
|
:
|
||||||
|
lda rawInput
|
||||||
|
eor #$ff ; invert the bits so 1 means button down
|
||||||
|
sta rawEor ; save the inverted bits
|
||||||
|
bit Bit6Mask ; see if select button is held
|
||||||
|
bne Button_B ; if it is down, key processing done
|
||||||
|
and lastInput ; otherwise debounce the keys
|
||||||
|
sta rawEor ; and save this state as the key state
|
||||||
|
|
||||||
|
Button_B:
|
||||||
|
bit Bit7Mask ; Button_B
|
||||||
|
beq Button_A
|
||||||
|
lda brushType
|
||||||
|
bne radar
|
||||||
|
ora #KEY_RIGHT ; when pressed, move right as well
|
||||||
|
sta rawEor
|
||||||
|
jsr editSetTerrainBottom
|
||||||
|
jmp :+
|
||||||
|
|
||||||
|
radar:
|
||||||
|
jsr editSetRadar
|
||||||
|
:
|
||||||
|
lda rawEor ; no horizontal movement so process horiz joystick
|
||||||
|
|
||||||
|
Button_A:
|
||||||
|
bit Bit8Mask ; Button_A
|
||||||
|
beq up
|
||||||
|
lda brushType
|
||||||
|
bne missile
|
||||||
|
ora #KEY_RIGHT
|
||||||
|
sta rawEor
|
||||||
|
jsr editSetTerrainTop
|
||||||
|
jmp :+
|
||||||
|
|
||||||
|
missile:
|
||||||
|
jsr editSetMissile
|
||||||
|
:
|
||||||
|
lda rawEor ; no horizontal movement so process horiz joystick
|
||||||
|
|
||||||
|
up:
|
||||||
|
bit Bit4Mask ; set when moving up
|
||||||
|
beq down
|
||||||
|
ldx playerShipY
|
||||||
|
cpx #9
|
||||||
|
bcc :+
|
||||||
|
dex
|
||||||
|
stx playerShipY
|
||||||
|
:
|
||||||
|
lda rawEor ; no horizontal movement so process horiz joystick
|
||||||
|
|
||||||
|
down:
|
||||||
|
bit Bit3Mask ; ser for joystick down
|
||||||
|
beq left
|
||||||
|
ldx playerShipY
|
||||||
|
cpx #WORLD_END
|
||||||
|
bcs :+
|
||||||
|
inx
|
||||||
|
stx playerShipY
|
||||||
|
:
|
||||||
|
lda rawEor ; no horizontal movement so process horiz joystick
|
||||||
|
|
||||||
|
left:
|
||||||
|
bit Bit2Mask ; left sets this bit
|
||||||
|
beq right ; not set see if right is set
|
||||||
|
jsr editGameWorldLeft
|
||||||
|
lda rawEor ; no horizontal movement so process horiz joystick
|
||||||
|
|
||||||
|
right:
|
||||||
|
bit Bit1Mask ; bit set when right joystick active
|
||||||
|
beq Button_Start
|
||||||
|
jsr editGameWorldRight
|
||||||
|
|
||||||
|
Button_Start:
|
||||||
|
lda rawInput ; This is a toggle so never auto-repeat
|
||||||
|
eor #$ff ; start from source
|
||||||
|
and lastInput ; and debounce
|
||||||
|
bit Bit5Mask ; test if Start button down
|
||||||
|
beq joyDone
|
||||||
|
lda brushType ; if down, toggle the brush type between terrain and enemies
|
||||||
|
eor #1
|
||||||
|
sta brushType
|
||||||
|
jsr uiShowEditLabels ; update the HUD
|
||||||
|
|
||||||
|
joyDone:
|
||||||
|
lda rawInput ; preserve this input for next frame as last input
|
||||||
|
sta lastInput ; so that fire and bombs can be debounced
|
||||||
|
|
||||||
|
pla ; get the keyboard in accumulator
|
||||||
|
clc ; keep carry clear between routines
|
||||||
|
rts
|
||||||
|
|
||||||
|
.endproc
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; Checks for a user input on keyboard or joystick
|
||||||
|
; upon exit - acc 0 means nothing, <> 0 means user input detected
|
||||||
|
.proc inputCheckForInput
|
||||||
|
|
||||||
|
rawInput = tempBlock + 20 ; internal
|
||||||
|
|
||||||
|
lda KBD
|
||||||
|
bit Bit8Mask
|
||||||
|
bne done ; if there's a key then done here
|
||||||
|
|
||||||
|
jsr inputReadJoystick ; check the joystick
|
||||||
|
sta rawInput ; keep the raw bits
|
||||||
|
eor #$ff ; invert
|
||||||
|
and lastInput ; debounce
|
||||||
|
pha ; save this
|
||||||
|
lda rawInput ; back up the raw to the last
|
||||||
|
sta lastInput
|
||||||
|
pla ; and get back the debounced bits
|
||||||
|
beq done
|
||||||
|
ldx #1
|
||||||
|
:
|
||||||
|
lsr
|
||||||
|
bcs :+
|
||||||
|
inx
|
||||||
|
bne :-
|
||||||
|
:
|
||||||
|
txa
|
||||||
|
rts
|
||||||
|
|
||||||
|
done:
|
||||||
|
and #$7f
|
||||||
|
rts ; upon return 0 means no interaction, anything else is a user input
|
||||||
|
|
||||||
|
.endproc
|
||||||
|
|
BIN
src/apple2/logo.hgr
Normal file
BIN
src/apple2/logo.hgr
Normal file
Binary file not shown.
10
src/apple2/logo.inc
Normal file
10
src/apple2/logo.inc
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; logo.inc
|
||||||
|
; Part of penetrator, the zx spectrum game, made for Apple II
|
||||||
|
;
|
||||||
|
; Oliver Schmidt, 2019
|
||||||
|
; This is free and unencumbered software released into the public domain.
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
.segment "HGR"
|
||||||
|
.incbin "logo.hgr"
|
56
src/apple2/logodata.inc
Normal file
56
src/apple2/logodata.inc
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; logodata.inc
|
||||||
|
; Part of penetrator, the zx spectrum game, made for Apple II
|
||||||
|
;
|
||||||
|
; Stefan Wessels, 2019
|
||||||
|
; This is free and unencumbered software released into the public domain.
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
.segment "RODATA"
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; x/y coordinates for lines that spell out Penetrator
|
||||||
|
dataLogoLines:
|
||||||
|
.byte $00, $0C, $00, $26
|
||||||
|
.byte $01, $0D, $07, $13
|
||||||
|
.byte $06, $14, $01, $19
|
||||||
|
.byte $02, $21, $08, $1C
|
||||||
|
.byte $09, $1B, $02, $1B
|
||||||
|
.byte $02, $1C, $05, $22
|
||||||
|
.byte $06, $22, $0B, $1D
|
||||||
|
.byte $0C, $1C, $0C, $17
|
||||||
|
.byte $0D, $17, $10, $1F
|
||||||
|
.byte $11, $1E, $11, $16
|
||||||
|
.byte $14, $1B, $19, $15
|
||||||
|
.byte $19, $14, $14, $14
|
||||||
|
.byte $14, $15, $13, $16
|
||||||
|
.byte $13, $17, $17, $1D
|
||||||
|
.byte $17, $1C, $1B, $16
|
||||||
|
.byte $1B, $15, $1D, $09
|
||||||
|
.byte $1E, $0A, $1E, $1A
|
||||||
|
.byte $1D, $14, $21, $14
|
||||||
|
.byte $22, $15, $23, $16
|
||||||
|
.byte $22, $1B, $24, $12
|
||||||
|
.byte $25, $11, $28, $11
|
||||||
|
.byte $28, $12, $29, $13
|
||||||
|
.byte $25, $19, $26, $17
|
||||||
|
.byte $27, $16, $29, $16
|
||||||
|
.byte $29, $17, $2C, $1C
|
||||||
|
.byte $2B, $1D, $29, $1F
|
||||||
|
.byte $28, $1F, $27, $1F
|
||||||
|
.byte $26, $1E, $25, $1D
|
||||||
|
.byte $25, $1C, $27, $1A
|
||||||
|
.byte $28, $1A, $29, $1A
|
||||||
|
.byte $2C, $1C, $2E, $16
|
||||||
|
.byte $2E, $15, $30, $0E
|
||||||
|
.byte $31, $10, $31, $22
|
||||||
|
.byte $2F, $1A, $34, $1A
|
||||||
|
.byte $32, $21, $35, $1B
|
||||||
|
.byte $36, $1B, $39, $1E
|
||||||
|
.byte $39, $1F, $36, $22
|
||||||
|
.byte $36, $22, $34, $20
|
||||||
|
.byte $38, $26, $3A, $1C
|
||||||
|
.byte $3B, $1B, $3C, $1B
|
||||||
|
.byte $3D, $1B, $3E, $1B
|
||||||
|
.byte $3E, $1C, $3F, $1D
|
||||||
|
dataLogoLinesEnd:
|
128
src/apple2/macros.inc
Normal file
128
src/apple2/macros.inc
Normal file
|
@ -0,0 +1,128 @@
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; macros.inc
|
||||||
|
; Part of penetrator, the zx spectrum game, made for Apple II
|
||||||
|
;
|
||||||
|
; Stefan Wessels, 2019
|
||||||
|
; This is free and unencumbered software released into the public domain.
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
.macro printZAStr sx, sy
|
||||||
|
|
||||||
|
.if .paramcount <> 2
|
||||||
|
.error "Parameters issue for macro printZAStr"
|
||||||
|
.endif
|
||||||
|
|
||||||
|
.local textX, textY
|
||||||
|
|
||||||
|
textX = tempBlock + 10
|
||||||
|
textY = tempBlock + 11
|
||||||
|
|
||||||
|
lda sx
|
||||||
|
sta textX
|
||||||
|
lda sy
|
||||||
|
sta textY
|
||||||
|
jsr textOut
|
||||||
|
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
.macro print szText, sx, sy
|
||||||
|
|
||||||
|
.if .paramcount <> 3
|
||||||
|
.error "Parameters issue for macro print"
|
||||||
|
.endif
|
||||||
|
|
||||||
|
.local zaStrL, zaStrH, textX, textY
|
||||||
|
|
||||||
|
zaStrL = tempBlock + 1
|
||||||
|
zaStrH = tempBlock + 2
|
||||||
|
|
||||||
|
lda #<szText
|
||||||
|
sta zaStrL
|
||||||
|
lda #>szText
|
||||||
|
sta zaStrH
|
||||||
|
|
||||||
|
printZAStr sx, sy
|
||||||
|
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
.macro printBCD number, digits, force, sx, sy
|
||||||
|
|
||||||
|
.if .paramcount <> 5
|
||||||
|
.error "Parameters issue for macro printBCD"
|
||||||
|
.endif
|
||||||
|
|
||||||
|
.local zaStrL, zaStrH
|
||||||
|
|
||||||
|
zaStrL = tempBlock + 1
|
||||||
|
zaStrH = tempBlock + 2
|
||||||
|
|
||||||
|
lda #<number
|
||||||
|
sta zaStrL
|
||||||
|
lda #>number
|
||||||
|
sta zaStrH
|
||||||
|
ldy digits
|
||||||
|
ldx force
|
||||||
|
jsr textBCDtoSZ
|
||||||
|
|
||||||
|
print textNumber, sx, sy
|
||||||
|
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
.macro printBig szText, sx, sy, wx, hy
|
||||||
|
|
||||||
|
.if .paramcount <> 5
|
||||||
|
.error "Parameters issue for macro printBig"
|
||||||
|
.endif
|
||||||
|
|
||||||
|
.local zaStrL, zaStrH, width, textX, textY, height
|
||||||
|
|
||||||
|
zaStrL = tempBlock + 1
|
||||||
|
zaStrH = tempBlock + 2
|
||||||
|
textX = tempBlock + 12
|
||||||
|
textY = tempBlock + 13
|
||||||
|
width = tempBlock + 14 ; shared with drawPlotXY
|
||||||
|
height = tempBlock + 15
|
||||||
|
|
||||||
|
|
||||||
|
lda #<szText
|
||||||
|
sta zaStrL
|
||||||
|
lda #>szText
|
||||||
|
sta zaStrH
|
||||||
|
lda sx
|
||||||
|
sta textX
|
||||||
|
lda sy
|
||||||
|
sta textY
|
||||||
|
lda wx
|
||||||
|
sta width
|
||||||
|
lda hy
|
||||||
|
sta height
|
||||||
|
jsr textBigPrint
|
||||||
|
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
.macro wait time
|
||||||
|
|
||||||
|
.if .paramcount <> 1
|
||||||
|
.error "Parameters issue for macro wait"
|
||||||
|
.endif
|
||||||
|
|
||||||
|
.local loop, loopo
|
||||||
|
|
||||||
|
lda time
|
||||||
|
sta tempBlock + 20
|
||||||
|
ldx #0
|
||||||
|
loopo:
|
||||||
|
ldy #$10
|
||||||
|
loop:
|
||||||
|
dex
|
||||||
|
bne loop
|
||||||
|
dey
|
||||||
|
bne loop
|
||||||
|
dec tempBlock + 20
|
||||||
|
bne loopo
|
||||||
|
|
||||||
|
.endmacro
|
84
src/apple2/penetrator.asm
Normal file
84
src/apple2/penetrator.asm
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; penetrator, the zx spectrum game, made for Apple II
|
||||||
|
;
|
||||||
|
; Stefan Wessels, 2019
|
||||||
|
; This is free and unencumbered software released into the public domain.
|
||||||
|
;
|
||||||
|
; Use the ca65 assembler and make to build
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; assembler directives
|
||||||
|
.debuginfo on
|
||||||
|
.listbytes unlimited
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
.segment "CODE"
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
jmp main ; This ends up at $080d (sys 2061's target)
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
.include "defs.inc" ; constants
|
||||||
|
.include "macros.inc" ; vpoke, vpeek, print* & wait.
|
||||||
|
.include "zpvars.inc" ; Zero Page usage (variables)
|
||||||
|
.include "input.inc" ; Keyboard/Joystick routines
|
||||||
|
.include "ui.inc" ; The front-end code
|
||||||
|
.include "edit.inc" ; In-game editor
|
||||||
|
.include "game.inc" ; All gameplay code
|
||||||
|
.include "terrain.inc" ; Code that writes the terrain to HRG
|
||||||
|
.include "draw.inc" ; Code that writes to HRG
|
||||||
|
.include "text.inc" ; The text and text printing code
|
||||||
|
.include "file.inc" ; LOAD / SAVE routine
|
||||||
|
.include "variables.inc" ; Game Variables (DATA segment)
|
||||||
|
.include "trndata.inc" ; Terrain triplets
|
||||||
|
.include "fontdata.inc" ; The ZA Spectrum font as 2bpp, 2 bytes/char
|
||||||
|
.include "logodata.inc" ; Lines to spell Penetrator and intro graphic
|
||||||
|
.include "rodata.inc" ; Read Only (RODATA segment sprites, etc)
|
||||||
|
.include "logo.inc"
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
.segment "CODE"
|
||||||
|
.proc main
|
||||||
|
|
||||||
|
jsr mainGameSetup
|
||||||
|
:
|
||||||
|
jsr inputCheckForInput ; wait for user interaction
|
||||||
|
beq :-
|
||||||
|
jsr drawPresent
|
||||||
|
:
|
||||||
|
jsr uiTitleScreen
|
||||||
|
jsr uiMainMenu
|
||||||
|
jmp :-
|
||||||
|
|
||||||
|
.endproc
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
.proc mainGameSetup
|
||||||
|
|
||||||
|
ldx #((textHSEnd-textHS) - 1) ; empty the high score names to spaces
|
||||||
|
store:
|
||||||
|
lda textHS, x
|
||||||
|
beq :+ ; skip the null terminators
|
||||||
|
lda #$20 ; load the space (" ") character
|
||||||
|
sta textHS, x ; write it to the text areas
|
||||||
|
:
|
||||||
|
dex
|
||||||
|
bpl store
|
||||||
|
|
||||||
|
ldx #((highScoresEnd-highScores) - 1) ; set high score table scores to 0
|
||||||
|
lda #$0
|
||||||
|
:
|
||||||
|
sta highScores, x
|
||||||
|
dex
|
||||||
|
bpl :-
|
||||||
|
|
||||||
|
ldx #((BitMasksEnd - BitMasks) - 1)
|
||||||
|
:
|
||||||
|
lda BitMasks, x
|
||||||
|
sta Bit1Mask, x
|
||||||
|
dex
|
||||||
|
bpl :-
|
||||||
|
|
||||||
|
rts
|
||||||
|
|
||||||
|
.endproc
|
19
src/apple2/penetrator.cfg
Normal file
19
src/apple2/penetrator.cfg
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
SYMBOLS {
|
||||||
|
__EXEHDR__: type = import;
|
||||||
|
__FILETYPE__: type = export, value = $0006;
|
||||||
|
}
|
||||||
|
MEMORY {
|
||||||
|
ZP: file = "", start = $0050, size = $00FF-$0050;
|
||||||
|
HEADER: file = %O, start = $4000 - $003A, size = $003A;
|
||||||
|
MAIN: file = %O, define = yes, start = $4000, size = $BF00 - $4000;
|
||||||
|
BSS: file = "", start = $0800, size = $2000 - $0800;
|
||||||
|
}
|
||||||
|
SEGMENTS {
|
||||||
|
ZEROPAGE: load = ZP, type = zp;
|
||||||
|
EXEHDR: load = HEADER, type = ro;
|
||||||
|
HGR: load = MAIN, type = rw;
|
||||||
|
CODE: load = MAIN, type = rw, start = $6000;
|
||||||
|
RODATA: load = MAIN, type = ro;
|
||||||
|
DATA: load = MAIN, type = rw;
|
||||||
|
BSS: load = BSS, type = bss;
|
||||||
|
}
|
792
src/apple2/rodata.inc
Normal file
792
src/apple2/rodata.inc
Normal file
|
@ -0,0 +1,792 @@
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; rodata.inc
|
||||||
|
; Part of penetrator, the zx spectrum game, made for Apple II
|
||||||
|
;
|
||||||
|
; Stefan Wessels, 2019
|
||||||
|
; This is free and unencumbered software released into the public domain.
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
.segment "RODATA"
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; the lo byte for the memory at the start of every screen row
|
||||||
|
rowL:
|
||||||
|
.repeat $C0, Row
|
||||||
|
.byte XINSET + Row & $08 << 4 | Row & $C0 >> 1 | Row & $C0 >> 3
|
||||||
|
.endrep
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; the hi byte for the memory at the start of every screen row
|
||||||
|
rowH:
|
||||||
|
.repeat $C0, Row
|
||||||
|
.byte >$0000 | Row & $07 << 2 | Row & $30 >> 4
|
||||||
|
.endrep
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; pixels in format for drawPlotXY
|
||||||
|
plotPix: .byte %00001111, %01111000
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; Offsets for printing the high score table on the title screen
|
||||||
|
scoreTextOffset:
|
||||||
|
.byte textHighScore1-textHS
|
||||||
|
.byte textHighScore2-textHS
|
||||||
|
.byte textHighScore3-textHS
|
||||||
|
.byte textHighScore4-textHS
|
||||||
|
.byte textHighScore5-textHS
|
||||||
|
scoreTextPosX:
|
||||||
|
.byte 10, 02, 18, 1, 19
|
||||||
|
scoreTextPosY:
|
||||||
|
.byte 8 , 16, 16, 24, 24
|
||||||
|
scorePosX:
|
||||||
|
.byte 17, 09, 25, 08, 26
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
radarAL:
|
||||||
|
.byte <radar0A, <(radar0U + 1), <(radar0A + 1), <(radar0U + 2)
|
||||||
|
.byte <radar1A, <(radar1U + 1), <(radar1A + 1), <(radar1U + 2)
|
||||||
|
.byte <radar2A, <(radar2U + 1), <(radar2A + 1), <(radar2U + 2)
|
||||||
|
.byte <radar3A, <(radar3U + 1), <(radar3A + 1), <(radar3U + 2)
|
||||||
|
.byte <radar4A, <(radar4U + 1), <(radar4A + 1), <(radar4U + 2)
|
||||||
|
.byte <radar5A, <(radar5U + 1), <(radar5A + 1), <(radar5U + 2)
|
||||||
|
.byte <radar6A, <(radar6U + 1), <(radar6A + 1), <(radar6U + 2)
|
||||||
|
.byte <radar7A, <(radar7U + 1), <(radar7A + 1), <(radar7U + 2)
|
||||||
|
radarAH:
|
||||||
|
.byte >radar0A, >(radar0U + 1), >(radar0A + 1), >(radar0U + 2)
|
||||||
|
.byte >radar1A, >(radar1U + 1), >(radar1A + 1), >(radar1U + 2)
|
||||||
|
.byte >radar2A, >(radar2U + 1), >(radar2A + 1), >(radar2U + 2)
|
||||||
|
.byte >radar3A, >(radar3U + 1), >(radar3A + 1), >(radar3U + 2)
|
||||||
|
.byte >radar4A, >(radar4U + 1), >(radar4A + 1), >(radar4U + 2)
|
||||||
|
.byte >radar5A, >(radar5U + 1), >(radar5A + 1), >(radar5U + 2)
|
||||||
|
.byte >radar6A, >(radar6U + 1), >(radar6A + 1), >(radar6U + 2)
|
||||||
|
.byte >radar7A, >(radar7U + 1), >(radar7A + 1), >(radar7U + 2)
|
||||||
|
radarUL:
|
||||||
|
.byte <radar0U
|
||||||
|
.byte <radar1U
|
||||||
|
.byte <radar2U
|
||||||
|
.byte <radar3U
|
||||||
|
.byte <radar4U
|
||||||
|
.byte <radar5U
|
||||||
|
.byte <radar6U
|
||||||
|
.byte <radar7U
|
||||||
|
radarUH:
|
||||||
|
.byte >radar0U
|
||||||
|
.byte >radar1U
|
||||||
|
.byte >radar2U
|
||||||
|
.byte >radar3U
|
||||||
|
.byte >radar4U
|
||||||
|
.byte >radar5U
|
||||||
|
.byte >radar6U
|
||||||
|
.byte >radar7U
|
||||||
|
radarAS:
|
||||||
|
.byte 4, 3, 2, 1
|
||||||
|
radarAD:
|
||||||
|
.byte 2, 3, 2, 3
|
||||||
|
radarAR:
|
||||||
|
.byte 1, 1, 0, 0
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
missileAL:
|
||||||
|
.byte <missile0A, <missile1A, <(missile0U + 1), <(missile1U + 1)
|
||||||
|
missileAH:
|
||||||
|
.byte >missile0A, >missile1A, >(missile0U + 1), >(missile1U + 1)
|
||||||
|
missileUL:
|
||||||
|
.byte <missile0U, <missile1U
|
||||||
|
missileUH:
|
||||||
|
.byte >missile0U, >missile1U
|
||||||
|
missileAD:
|
||||||
|
.byte 1, 1, 2, 2
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
bombAL:
|
||||||
|
.byte <bomb0A, <bomb1A
|
||||||
|
bombAH:
|
||||||
|
.byte >bomb0A, >bomb1A
|
||||||
|
bombUL:
|
||||||
|
.byte <bomb0U, <bomb1U
|
||||||
|
bombUH:
|
||||||
|
.byte >bomb0U, >bomb1U
|
||||||
|
bombH:
|
||||||
|
.byte 6, 5
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
monsterAL:
|
||||||
|
.byte <monsterA, <(monsterU + 1), <(monsterA+1)
|
||||||
|
monsterAH:
|
||||||
|
.byte >monsterA, >(monsterU + 1), >(monsterA+1)
|
||||||
|
monsterAS:
|
||||||
|
.byte 3, 2, 1
|
||||||
|
monsterAR:
|
||||||
|
.byte 1, 0, 0
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
nukeAL:
|
||||||
|
.byte <nukeA, <(nukeU + 1)
|
||||||
|
nukeAH:
|
||||||
|
.byte >nukeA, >(nukeU + 1)
|
||||||
|
nukeUL:
|
||||||
|
.byte <nukeU
|
||||||
|
nukeUH:
|
||||||
|
.byte >nukeU
|
||||||
|
nukeAD:
|
||||||
|
.byte 1, 2
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
explosionAL:
|
||||||
|
.byte <explosion0A
|
||||||
|
.byte <explosion1A
|
||||||
|
.byte <explosion2A
|
||||||
|
.byte <explosion3A
|
||||||
|
explosionAH:
|
||||||
|
.byte >explosion0A
|
||||||
|
.byte >explosion1A
|
||||||
|
.byte >explosion2A
|
||||||
|
.byte >explosion3A
|
||||||
|
explosionUL:
|
||||||
|
.byte <explosion0U
|
||||||
|
.byte <explosion1U
|
||||||
|
.byte <explosion2U
|
||||||
|
.byte <explosion3U
|
||||||
|
explosionUH:
|
||||||
|
.byte >explosion0U
|
||||||
|
.byte >explosion1U
|
||||||
|
.byte >explosion2U
|
||||||
|
.byte >explosion3U
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
layersL:
|
||||||
|
.byte <ram_layer0, <ram_layer1
|
||||||
|
layersH:
|
||||||
|
.byte >ram_layer0, >ram_layer1
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; nuke, missile, monster, radar
|
||||||
|
scoreTable:
|
||||||
|
.word $0100, $0001, $0002, $0010
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
BitMasks:
|
||||||
|
.byte %00000001
|
||||||
|
.byte %00000010
|
||||||
|
.byte %00000100
|
||||||
|
.byte %00001000
|
||||||
|
.byte %00010000
|
||||||
|
.byte %00100000
|
||||||
|
.byte %01000000
|
||||||
|
.byte %10000000
|
||||||
|
.byte %00000011
|
||||||
|
.byte %00001100
|
||||||
|
.byte %01100000
|
||||||
|
.byte %10001110
|
||||||
|
.byte %11110000
|
||||||
|
BitMasksEnd:
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; Sprite Information
|
||||||
|
; Images to the right in human form, not Apple II form (i.e. bytes don't
|
||||||
|
; neccesarily match visuals). Rendering is bottom up so stored upside-down.
|
||||||
|
|
||||||
|
missile0A:
|
||||||
|
.byte $41 ; X.....X
|
||||||
|
.byte $41 ; X.....X
|
||||||
|
.byte $41 ; X.....X
|
||||||
|
.byte $63 ; XX...XX
|
||||||
|
.byte $63 ; XX...XX
|
||||||
|
.byte $7F ; XXXXXXX
|
||||||
|
.byte $3E ; .XXXXX.
|
||||||
|
.byte $22 ; .X...X.
|
||||||
|
.byte $3E ; .XXXXX.
|
||||||
|
.byte $1C ; ..XXX..
|
||||||
|
.byte $1C ; ..XXX..
|
||||||
|
.byte $08 ; ...X...
|
||||||
|
.byte $08 ; ...X...
|
||||||
|
.byte $08 ; ...X...
|
||||||
|
|
||||||
|
missile0U:
|
||||||
|
.byte $10, $08 ; ....X.....X...
|
||||||
|
.byte $10, $08 ; ....X.....X...
|
||||||
|
.byte $10, $08 ; ....X.....X...
|
||||||
|
.byte $30, $0C ; ....XX...XX...
|
||||||
|
.byte $30, $0C ; ....XX...XX...
|
||||||
|
.byte $70, $0F ; ....XXXXXXX...
|
||||||
|
.byte $60, $07 ; .....XXXXX....
|
||||||
|
.byte $20, $04 ; .....X...X....
|
||||||
|
.byte $60, $07 ; .....XXXXX....
|
||||||
|
.byte $40, $03 ; ......XXX.....
|
||||||
|
.byte $40, $03 ; ......XXX.....
|
||||||
|
.byte $00, $01 ; .......X......
|
||||||
|
.byte $00, $01 ; .......X......
|
||||||
|
.byte $00, $01 ; .......X......
|
||||||
|
|
||||||
|
missile1A:
|
||||||
|
.byte $55 ; X.X.X.X
|
||||||
|
.byte $5D ; X.XXX.X
|
||||||
|
.byte $49 ; X..X..X
|
||||||
|
.byte $6B ; XX.X.XX
|
||||||
|
.byte $63 ; XX...XX
|
||||||
|
.byte $7F ; XXXXXXX
|
||||||
|
.byte $3E ; .XXXXX.
|
||||||
|
.byte $22 ; .X...X.
|
||||||
|
.byte $3E ; .XXXXX.
|
||||||
|
.byte $1C ; ..XXX..
|
||||||
|
.byte $1C ; ..XXX..
|
||||||
|
.byte $08 ; ...X...
|
||||||
|
.byte $08 ; ...X...
|
||||||
|
.byte $08 ; ...X...
|
||||||
|
|
||||||
|
missile1U:
|
||||||
|
.byte $50, $0A ; ....X.X.X.X...
|
||||||
|
.byte $50, $0B ; ....X.XXX.X...
|
||||||
|
.byte $10, $09 ; ....X..X..X...
|
||||||
|
.byte $30, $0D ; ....XX.X.XX...
|
||||||
|
.byte $30, $0C ; ....XX...XX...
|
||||||
|
.byte $70, $0F ; ....XXXXXXX...
|
||||||
|
.byte $60, $07 ; .....XXXXX....
|
||||||
|
.byte $20, $04 ; .....X...X....
|
||||||
|
.byte $60, $07 ; .....XXXXX....
|
||||||
|
.byte $40, $03 ; ......XXX.....
|
||||||
|
.byte $40, $03 ; ......XXX.....
|
||||||
|
.byte $00, $01 ; .......X......
|
||||||
|
.byte $00, $01 ; .......X......
|
||||||
|
.byte $00, $01 ; .......X......
|
||||||
|
|
||||||
|
|
||||||
|
radar0A:
|
||||||
|
.byte $7C, $1F ; ..XXXXXXXXXX..
|
||||||
|
.byte $7C, $1F ; ..XXXXXXXXXX..
|
||||||
|
.byte $70, $07 ; ....XXXXXX....
|
||||||
|
.byte $70, $07 ; ....XXXXXX....
|
||||||
|
.byte $20, $02 ; .....X..X.....
|
||||||
|
.byte $70, $07 ; ....XXXXXX....
|
||||||
|
.byte $7C, $1F ; ..XXXXXXXXXX..
|
||||||
|
.byte $7E, $3F ; .XXXXXXXXXXXX.
|
||||||
|
.byte $7F, $7F ; XXXXXXXXXXXXXX
|
||||||
|
.byte $7F, $7F ; XXXXXXXXXXXXXX
|
||||||
|
.byte $7F, $7F ; XXXXXXXXXXXXXX
|
||||||
|
.byte $7E, $3F ; .XXXXXXXXXXXX.
|
||||||
|
.byte $7C, $1F ; ..XXXXXXXXXX..
|
||||||
|
.byte $70, $07 ; ....XXXXXX....
|
||||||
|
.byte $40, $01 ; ......XX......
|
||||||
|
.byte $40, $01 ; ......XX......
|
||||||
|
|
||||||
|
radar0U:
|
||||||
|
.byte $40, $7F, $03 ; ......XXXXXXXXXX.....
|
||||||
|
.byte $40, $7F, $03 ; ......XXXXXXXXXX.....
|
||||||
|
.byte $00, $7E, $00 ; ........XXXXXX.......
|
||||||
|
.byte $00, $7E, $00 ; ........XXXXXX.......
|
||||||
|
.byte $00, $24, $00 ; .........X..X........
|
||||||
|
.byte $00, $7E, $00 ; ........XXXXXX.......
|
||||||
|
.byte $40, $7F, $03 ; ......XXXXXXXXXX.....
|
||||||
|
.byte $60, $7F, $07 ; .....XXXXXXXXXXXX....
|
||||||
|
.byte $70, $7F, $0F ; ....XXXXXXXXXXXXXX...
|
||||||
|
.byte $70, $7F, $0F ; ....XXXXXXXXXXXXXX...
|
||||||
|
.byte $70, $7F, $0F ; ....XXXXXXXXXXXXXX...
|
||||||
|
.byte $60, $7F, $07 ; .....XXXXXXXXXXXX....
|
||||||
|
.byte $40, $7F, $03 ; ......XXXXXXXXXX.....
|
||||||
|
.byte $00, $7E, $00 ; ........XXXXXX.......
|
||||||
|
.byte $00, $18, $00 ; ..........XX.........
|
||||||
|
.byte $00, $18, $00 ; ..........XX.........
|
||||||
|
|
||||||
|
radar1A:
|
||||||
|
.byte $7C, $1F ; ..XXXXXXXXXX..
|
||||||
|
.byte $7C, $1F ; ..XXXXXXXXXX..
|
||||||
|
.byte $70, $07 ; ....XXXXXX....
|
||||||
|
.byte $70, $07 ; ....XXXXXX....
|
||||||
|
.byte $20, $02 ; .....X..X.....
|
||||||
|
.byte $78, $03 ; ...XXXXXX.....
|
||||||
|
.byte $7C, $01 ; ..XXXXXX......
|
||||||
|
.byte $7C, $03 ; ..XXXXXXX.....
|
||||||
|
.byte $7C, $07 ; ..XXXXXXXX....
|
||||||
|
.byte $78, $0F ; ...XXXXXXXX...
|
||||||
|
.byte $70, $0F ; ....XXXXXXX...
|
||||||
|
.byte $60, $0F ; .....XXXXXX...
|
||||||
|
.byte $70, $0F ; ....XXXXXXX...
|
||||||
|
.byte $58, $07 ; ...XX.XXXX....
|
||||||
|
.byte $08, $02 ; ...X....X.....
|
||||||
|
.byte $00, $00 ; ..............
|
||||||
|
|
||||||
|
radar1U:
|
||||||
|
.byte $40, $7F, $03 ; ......XXXXXXXXXX.....
|
||||||
|
.byte $40, $7F, $03 ; ......XXXXXXXXXX.....
|
||||||
|
.byte $00, $7E, $00 ; ........XXXXXX.......
|
||||||
|
.byte $00, $7E, $00 ; ........XXXXXX.......
|
||||||
|
.byte $00, $24, $00 ; .........X..X........
|
||||||
|
.byte $00, $3F, $00 ; .......XXXXXX........
|
||||||
|
.byte $40, $1F, $00 ; ......XXXXXX.........
|
||||||
|
.byte $40, $3F, $00 ; ......XXXXXXX........
|
||||||
|
.byte $40, $7F, $00 ; ......XXXXXXXX.......
|
||||||
|
.byte $00, $7F, $01 ; .......XXXXXXXX......
|
||||||
|
.byte $00, $7E, $01 ; ........XXXXXXX......
|
||||||
|
.byte $00, $7C, $01 ; .........XXXXXX......
|
||||||
|
.byte $00, $7E, $01 ; ........XXXXXXX......
|
||||||
|
.byte $00, $7B, $00 ; .......XX.XXXX.......
|
||||||
|
.byte $00, $21, $00 ; .......X....X........
|
||||||
|
.byte $00, $00, $00 ; .....................
|
||||||
|
|
||||||
|
radar2A:
|
||||||
|
.byte $7C, $1F ; ..XXXXXXXXXX..
|
||||||
|
.byte $7C, $1F ; ..XXXXXXXXXX..
|
||||||
|
.byte $70, $07 ; ....XXXXXX....
|
||||||
|
.byte $70, $07 ; ....XXXXXX....
|
||||||
|
.byte $20, $02 ; .....X..X.....
|
||||||
|
.byte $70, $03 ; ....XXXXX.....
|
||||||
|
.byte $78, $01 ; ...XXXXX......
|
||||||
|
.byte $7C, $03 ; ..XXXXXXX.....
|
||||||
|
.byte $60, $07 ; .....XXXXX....
|
||||||
|
.byte $40, $07 ; ......XXXX....
|
||||||
|
.byte $40, $07 ; ......XXXX....
|
||||||
|
.byte $60, $07 ; .....XXXXX....
|
||||||
|
.byte $30, $07 ; ....XX.XXX....
|
||||||
|
.byte $18, $03 ; ...XX..XX.....
|
||||||
|
.byte $00, $01 ; .......X......
|
||||||
|
.byte $00, $00 ; ..............
|
||||||
|
|
||||||
|
radar2U:
|
||||||
|
.byte $40, $7F, $03 ; ......XXXXXXXXXX.....
|
||||||
|
.byte $40, $7F, $03 ; ......XXXXXXXXXX.....
|
||||||
|
.byte $00, $7E, $00 ; ........XXXXXX.......
|
||||||
|
.byte $00, $7E, $00 ; ........XXXXXX.......
|
||||||
|
.byte $00, $24, $00 ; .........X..X........
|
||||||
|
.byte $00, $3E, $00 ; ........XXXXX........
|
||||||
|
.byte $00, $1F, $00 ; .......XXXXX.........
|
||||||
|
.byte $40, $3F, $00 ; ......XXXXXXX........
|
||||||
|
.byte $00, $7C, $00 ; .........XXXXX.......
|
||||||
|
.byte $00, $78, $00 ; ..........XXXX.......
|
||||||
|
.byte $00, $78, $00 ; ..........XXXX.......
|
||||||
|
.byte $00, $7C, $00 ; .........XXXXX.......
|
||||||
|
.byte $00, $76, $00 ; ........XX.XXX.......
|
||||||
|
.byte $00, $33, $00 ; .......XX..XX........
|
||||||
|
.byte $00, $10, $00 ; ...........X.........
|
||||||
|
.byte $00, $00, $00 ; .....................
|
||||||
|
|
||||||
|
radar3A:
|
||||||
|
.byte $7C, $1F ; ..XXXXXXXXXX..
|
||||||
|
.byte $7C, $1F ; ..XXXXXXXXXX..
|
||||||
|
.byte $70, $07 ; ....XXXXXX....
|
||||||
|
.byte $70, $07 ; ....XXXXXX....
|
||||||
|
.byte $20, $02 ; .....X..X.....
|
||||||
|
.byte $78, $03 ; ...XXXXXX.....
|
||||||
|
.byte $7C, $01 ; ..XXXXXX......
|
||||||
|
.byte $44, $03 ; ..X...XXX.....
|
||||||
|
.byte $04, $07 ; ..X....XXX....
|
||||||
|
.byte $64, $0E ; ..X..XX.XXX...
|
||||||
|
.byte $68, $0C ; ...X.XX..XX...
|
||||||
|
.byte $10, $08 ; ....X.....X...
|
||||||
|
.byte $30, $08 ; ....XX....X...
|
||||||
|
.byte $48, $04 ; ...X..X..X....
|
||||||
|
.byte $08, $03 ; ...X...XX.....
|
||||||
|
.byte $00, $00 ; ..............
|
||||||
|
|
||||||
|
radar3U:
|
||||||
|
.byte $40, $7F, $03 ; ......XXXXXXXXXX.....
|
||||||
|
.byte $40, $7F, $03 ; ......XXXXXXXXXX.....
|
||||||
|
.byte $00, $7E, $00 ; ........XXXXXX.......
|
||||||
|
.byte $00, $7E, $00 ; ........XXXXXX.......
|
||||||
|
.byte $00, $24, $00 ; .........X..X........
|
||||||
|
.byte $00, $3F, $00 ; .......XXXXXX........
|
||||||
|
.byte $40, $1F, $00 ; ......XXXXXX.........
|
||||||
|
.byte $40, $38, $00 ; ......X...XXX........
|
||||||
|
.byte $40, $70, $00 ; ......X....XXX.......
|
||||||
|
.byte $40, $6C, $01 ; ......X..XX.XXX......
|
||||||
|
.byte $00, $4D, $01 ; .......X.XX..XX......
|
||||||
|
.byte $00, $02, $01 ; ........X.....X......
|
||||||
|
.byte $00, $06, $01 ; ........XX....X......
|
||||||
|
.byte $00, $49, $00 ; .......X..X..X.......
|
||||||
|
.byte $00, $31, $00 ; .......X...XX........
|
||||||
|
.byte $00, $00, $00 ; .....................
|
||||||
|
|
||||||
|
radar4A:
|
||||||
|
.byte $7C, $1F ; ..XXXXXXXXXX..
|
||||||
|
.byte $7C, $1F ; ..XXXXXXXXXX..
|
||||||
|
.byte $70, $07 ; ....XXXXXX....
|
||||||
|
.byte $70, $07 ; ....XXXXXX....
|
||||||
|
.byte $20, $02 ; .....X..X.....
|
||||||
|
.byte $70, $07 ; ....XXXXXX....
|
||||||
|
.byte $0C, $18 ; ..XX......XX..
|
||||||
|
.byte $02, $20 ; .X..........X.
|
||||||
|
.byte $01, $40 ; X............X
|
||||||
|
.byte $41, $41 ; X.....XX.....X
|
||||||
|
.byte $41, $41 ; X.....XX.....X
|
||||||
|
.byte $42, $21 ; .X....XX....X.
|
||||||
|
.byte $4C, $19 ; ..XX..XX..XX..
|
||||||
|
.byte $70, $07 ; ....XXXXXX....
|
||||||
|
.byte $40, $01 ; ......XX......
|
||||||
|
.byte $40, $01 ; ......XX......
|
||||||
|
|
||||||
|
radar4U:
|
||||||
|
.byte $40, $7F, $03 ; ......XXXXXXXXXX.....
|
||||||
|
.byte $40, $7F, $03 ; ......XXXXXXXXXX.....
|
||||||
|
.byte $00, $7E, $00 ; ........XXXXXX.......
|
||||||
|
.byte $00, $7E, $00 ; ........XXXXXX.......
|
||||||
|
.byte $00, $24, $00 ; .........X..X........
|
||||||
|
.byte $00, $7E, $00 ; ........XXXXXX.......
|
||||||
|
.byte $40, $01, $03 ; ......XX......XX.....
|
||||||
|
.byte $20, $00, $04 ; .....X..........X....
|
||||||
|
.byte $10, $00, $08 ; ....X............X...
|
||||||
|
.byte $10, $18, $08 ; ....X.....XX.....X...
|
||||||
|
.byte $10, $18, $08 ; ....X.....XX.....X...
|
||||||
|
.byte $20, $18, $04 ; .....X....XX....X....
|
||||||
|
.byte $40, $19, $03 ; ......XX..XX..XX.....
|
||||||
|
.byte $00, $7E, $00 ; ........XXXXXX.......
|
||||||
|
.byte $00, $18, $00 ; ..........XX.........
|
||||||
|
.byte $00, $18, $00 ; ..........XX.........
|
||||||
|
|
||||||
|
radar5A:
|
||||||
|
.byte $7C, $1F ; ..XXXXXXXXXX..
|
||||||
|
.byte $7C, $1F ; ..XXXXXXXXXX..
|
||||||
|
.byte $70, $07 ; ....XXXXXX....
|
||||||
|
.byte $70, $07 ; ....XXXXXX....
|
||||||
|
.byte $20, $02 ; .....X..X.....
|
||||||
|
.byte $60, $0F ; .....XXXXXX...
|
||||||
|
.byte $40, $1F ; ......XXXXXX..
|
||||||
|
.byte $60, $11 ; .....XXX...X..
|
||||||
|
.byte $70, $10 ; ....XXX....X..
|
||||||
|
.byte $38, $13 ; ...XXX.XX..X..
|
||||||
|
.byte $18, $0B ; ...XX..XX.X...
|
||||||
|
.byte $08, $04 ; ...X.....X....
|
||||||
|
.byte $08, $06 ; ...X....XX....
|
||||||
|
.byte $10, $09 ; ....X..X..X...
|
||||||
|
.byte $60, $08 ; .....XX...X...
|
||||||
|
.byte $00, $00 ; ..............
|
||||||
|
|
||||||
|
radar5U:
|
||||||
|
.byte $40, $7F, $03 ; ......XXXXXXXXXX.....
|
||||||
|
.byte $40, $7F, $03 ; ......XXXXXXXXXX.....
|
||||||
|
.byte $00, $7E, $00 ; ........XXXXXX.......
|
||||||
|
.byte $00, $7E, $00 ; ........XXXXXX.......
|
||||||
|
.byte $00, $24, $00 ; .........X..X........
|
||||||
|
.byte $00, $7C, $01 ; .........XXXXXX......
|
||||||
|
.byte $00, $78, $03 ; ..........XXXXXX.....
|
||||||
|
.byte $00, $1C, $02 ; .........XXX...X.....
|
||||||
|
.byte $00, $0E, $02 ; ........XXX....X.....
|
||||||
|
.byte $00, $37, $02 ; .......XXX.XX..X.....
|
||||||
|
.byte $00, $33, $01 ; .......XX..XX.X......
|
||||||
|
.byte $00, $41, $00 ; .......X.....X.......
|
||||||
|
.byte $00, $61, $00 ; .......X....XX.......
|
||||||
|
.byte $00, $12, $01 ; ........X..X..X......
|
||||||
|
.byte $00, $0C, $01 ; .........XX...X......
|
||||||
|
.byte $00, $00, $00 ; .....................
|
||||||
|
|
||||||
|
radar6A:
|
||||||
|
.byte $7C, $1F ; ..XXXXXXXXXX..
|
||||||
|
.byte $7C, $1F ; ..XXXXXXXXXX..
|
||||||
|
.byte $70, $07 ; ....XXXXXX....
|
||||||
|
.byte $70, $07 ; ....XXXXXX....
|
||||||
|
.byte $20, $02 ; .....X..X.....
|
||||||
|
.byte $60, $07 ; .....XXXXX....
|
||||||
|
.byte $40, $0F ; ......XXXXX...
|
||||||
|
.byte $60, $1F ; .....XXXXXXX..
|
||||||
|
.byte $70, $03 ; ....XXXXX.....
|
||||||
|
.byte $70, $01 ; ....XXXX......
|
||||||
|
.byte $70, $01 ; ....XXXX......
|
||||||
|
.byte $70, $03 ; ....XXXXX.....
|
||||||
|
.byte $70, $06 ; ....XXX.XX....
|
||||||
|
.byte $60, $0C ; .....XX..XX...
|
||||||
|
.byte $40, $00 ; ......X.......
|
||||||
|
.byte $00, $00 ; ..............
|
||||||
|
|
||||||
|
radar6U:
|
||||||
|
.byte $40, $7F, $03 ; ......XXXXXXXXXX.....
|
||||||
|
.byte $40, $7F, $03 ; ......XXXXXXXXXX.....
|
||||||
|
.byte $00, $7E, $00 ; ........XXXXXX.......
|
||||||
|
.byte $00, $7E, $00 ; ........XXXXXX.......
|
||||||
|
.byte $00, $24, $00 ; .........X..X........
|
||||||
|
.byte $00, $7C, $00 ; .........XXXXX.......
|
||||||
|
.byte $00, $78, $01 ; ..........XXXXX......
|
||||||
|
.byte $00, $7C, $03 ; .........XXXXXXX.....
|
||||||
|
.byte $00, $3E, $00 ; ........XXXXX........
|
||||||
|
.byte $00, $1E, $00 ; ........XXXX.........
|
||||||
|
.byte $00, $1E, $00 ; ........XXXX.........
|
||||||
|
.byte $00, $3E, $00 ; ........XXXXX........
|
||||||
|
.byte $00, $6E, $00 ; ........XXX.XX.......
|
||||||
|
.byte $00, $4C, $01 ; .........XX..XX......
|
||||||
|
.byte $00, $08, $00 ; ..........X..........
|
||||||
|
.byte $00, $00, $00 ; .....................
|
||||||
|
|
||||||
|
radar7A:
|
||||||
|
.byte $7C, $1F ; ..XXXXXXXXXX..
|
||||||
|
.byte $7C, $1F ; ..XXXXXXXXXX..
|
||||||
|
.byte $70, $07 ; ....XXXXXX....
|
||||||
|
.byte $70, $07 ; ....XXXXXX....
|
||||||
|
.byte $20, $02 ; .....X..X.....
|
||||||
|
.byte $60, $0F ; .....XXXXXX...
|
||||||
|
.byte $40, $1F ; ......XXXXXX..
|
||||||
|
.byte $60, $1F ; .....XXXXXXX..
|
||||||
|
.byte $70, $1F ; ....XXXXXXXX..
|
||||||
|
.byte $78, $0F ; ...XXXXXXXX...
|
||||||
|
.byte $78, $07 ; ...XXXXXXX....
|
||||||
|
.byte $78, $03 ; ...XXXXXX.....
|
||||||
|
.byte $78, $07 ; ...XXXXXXX....
|
||||||
|
.byte $70, $0D ; ....XXXX.XX...
|
||||||
|
.byte $20, $08 ; .....X....X...
|
||||||
|
.byte $00, $00 ; ..............
|
||||||
|
|
||||||
|
radar7U:
|
||||||
|
.byte $40, $7F, $03 ; ......XXXXXXXXXX.....
|
||||||
|
.byte $40, $7F, $03 ; ......XXXXXXXXXX.....
|
||||||
|
.byte $00, $7E, $00 ; ........XXXXXX.......
|
||||||
|
.byte $00, $7E, $00 ; ........XXXXXX.......
|
||||||
|
.byte $00, $24, $00 ; .........X..X........
|
||||||
|
.byte $00, $7C, $01 ; .........XXXXXX......
|
||||||
|
.byte $00, $78, $03 ; ..........XXXXXX.....
|
||||||
|
.byte $00, $7C, $03 ; .........XXXXXXX.....
|
||||||
|
.byte $00, $7E, $03 ; ........XXXXXXXX.....
|
||||||
|
.byte $00, $7F, $01 ; .......XXXXXXXX......
|
||||||
|
.byte $00, $7F, $00 ; .......XXXXXXX.......
|
||||||
|
.byte $00, $3F, $00 ; .......XXXXXX........
|
||||||
|
.byte $00, $7F, $00 ; .......XXXXXXX.......
|
||||||
|
.byte $00, $5E, $01 ; ........XXXX.XX......
|
||||||
|
.byte $00, $04, $01 ; .........X....X......
|
||||||
|
.byte $00, $00, $00 ; .....................
|
||||||
|
|
||||||
|
explosion0A:
|
||||||
|
.byte $04, $00 ; ..X...........
|
||||||
|
.byte $0C, $00 ; ..XX..........
|
||||||
|
.byte $00, $41 ; .......X.....X
|
||||||
|
.byte $00, $00 ; ..............
|
||||||
|
.byte $00, $10 ; ...........X..
|
||||||
|
.byte $49, $01 ; X..X..XX......
|
||||||
|
.byte $60, $07 ; .....XXXXX....
|
||||||
|
.byte $60, $0F ; .....XXXXXX...
|
||||||
|
.byte $60, $2F ; .....XXXXXX.X.
|
||||||
|
.byte $60, $03 ; .....XXXX.....
|
||||||
|
.byte $08, $02 ; ...X....X.....
|
||||||
|
.byte $00, $10 ; ...........X..
|
||||||
|
.byte $30, $00 ; ....XX........
|
||||||
|
.byte $31, $00 ; X...XX........
|
||||||
|
.byte $01, $62 ; X.......X...XX
|
||||||
|
.byte $00, $00 ; ..............
|
||||||
|
|
||||||
|
explosion0U:
|
||||||
|
.byte $20, $00, $00 ; .....X...............
|
||||||
|
.byte $60, $00, $00 ; .....XX..............
|
||||||
|
.byte $00, $08, $04 ; ..........X.....X....
|
||||||
|
.byte $00, $00, $00 ; .....................
|
||||||
|
.byte $00, $00, $01 ; ..............X......
|
||||||
|
.byte $48, $0C, $00 ; ...X..X..XX..........
|
||||||
|
.byte $00, $3E, $00 ; ........XXXXX........
|
||||||
|
.byte $00, $7E, $00 ; ........XXXXXX.......
|
||||||
|
.byte $00, $7E, $02 ; ........XXXXXX.X.....
|
||||||
|
.byte $00, $1E, $00 ; ........XXXX.........
|
||||||
|
.byte $40, $10, $00 ; ......X....X.........
|
||||||
|
.byte $00, $00, $01 ; ..............X......
|
||||||
|
.byte $00, $03, $00 ; .......XX............
|
||||||
|
.byte $08, $03, $00 ; ...X...XX............
|
||||||
|
.byte $08, $10, $06 ; ...X.......X...XX....
|
||||||
|
.byte $00, $00, $00 ; .....................
|
||||||
|
|
||||||
|
explosion1A:
|
||||||
|
.byte $06, $00 ; .XX...........
|
||||||
|
.byte $04, $42 ; ..X.....X....X
|
||||||
|
.byte $00, $00 ; ..............
|
||||||
|
.byte $00, $20 ; ............X.
|
||||||
|
.byte $44, $01 ; ..X...XX......
|
||||||
|
.byte $10, $0D ; ....X..X.XX...
|
||||||
|
.byte $50, $17 ; ....X.XXXX.X..
|
||||||
|
.byte $60, $0A ; .....XX.X.X...
|
||||||
|
.byte $60, $0C ; .....XX..XX...
|
||||||
|
.byte $68, $41 ; ...X.XXX.....X
|
||||||
|
.byte $18, $02 ; ...XX...X.....
|
||||||
|
.byte $00, $08 ; ..........X...
|
||||||
|
.byte $00, $20 ; ............X.
|
||||||
|
.byte $30, $00 ; ....XX........
|
||||||
|
.byte $14, $40 ; ..X.X........X
|
||||||
|
.byte $00, $04 ; .........X....
|
||||||
|
|
||||||
|
explosion1U:
|
||||||
|
.byte $30, $00, $00 ; ....XX...............
|
||||||
|
.byte $20, $10, $04 ; .....X.....X....X....
|
||||||
|
.byte $00, $00, $00 ; .....................
|
||||||
|
.byte $00, $00, $02 ; ...............X.....
|
||||||
|
.byte $20, $0C, $00 ; .....X...XX..........
|
||||||
|
.byte $00, $69, $00 ; .......X..X.XX.......
|
||||||
|
.byte $00, $3D, $01 ; .......X.XXXX.X......
|
||||||
|
.byte $00, $56, $00 ; ........XX.X.X.......
|
||||||
|
.byte $00, $66, $00 ; ........XX..XX.......
|
||||||
|
.byte $40, $0E, $04 ; ......X.XXX.....X....
|
||||||
|
.byte $40, $11, $00 ; ......XX...X.........
|
||||||
|
.byte $00, $40, $00 ; .............X.......
|
||||||
|
.byte $00, $00, $02 ; ...............X.....
|
||||||
|
.byte $00, $03, $00 ; .......XX............
|
||||||
|
.byte $20, $01, $04 ; .....X.X........X....
|
||||||
|
.byte $00, $20, $00 ; ............X........
|
||||||
|
|
||||||
|
explosion2A:
|
||||||
|
.byte $02, $04 ; .X.......X....
|
||||||
|
.byte $00, $00 ; ..............
|
||||||
|
.byte $20, $40 ; .....X.......X
|
||||||
|
.byte $01, $21 ; X......X....X.
|
||||||
|
.byte $04, $09 ; ..X....X..X...
|
||||||
|
.byte $10, $00 ; ....X.........
|
||||||
|
.byte $10, $14 ; ....X....X.X..
|
||||||
|
.byte $24, $20 ; ..X..X......X.
|
||||||
|
.byte $20, $08 ; .....X....X...
|
||||||
|
.byte $12, $00 ; .X..X.........
|
||||||
|
.byte $08, $02 ; ...X....X.....
|
||||||
|
.byte $0A, $21 ; .X.X...X....X.
|
||||||
|
.byte $00, $00 ; ..............
|
||||||
|
.byte $10, $40 ; ....X........X
|
||||||
|
.byte $04, $00 ; ..X...........
|
||||||
|
.byte $09, $40 ; X..X.........X
|
||||||
|
|
||||||
|
explosion2U:
|
||||||
|
.byte $10, $20, $00 ; ....X.......X........
|
||||||
|
.byte $00, $00, $00 ; .....................
|
||||||
|
.byte $00, $02, $04 ; ........X.......X....
|
||||||
|
.byte $08, $08, $02 ; ...X......X....X.....
|
||||||
|
.byte $20, $48, $00 ; .....X....X..X.......
|
||||||
|
.byte $00, $01, $00 ; .......X.............
|
||||||
|
.byte $00, $21, $01 ; .......X....X.X......
|
||||||
|
.byte $20, $02, $02 ; .....X..X......X.....
|
||||||
|
.byte $00, $42, $00 ; ........X....X.......
|
||||||
|
.byte $10, $01, $00 ; ....X..X.............
|
||||||
|
.byte $40, $10, $00 ; ......X....X.........
|
||||||
|
.byte $50, $08, $02 ; ....X.X...X....X.....
|
||||||
|
.byte $00, $00, $00 ; .....................
|
||||||
|
.byte $00, $01, $04 ; .......X........X....
|
||||||
|
.byte $20, $00, $00 ; .....X...............
|
||||||
|
.byte $48, $00, $04 ; ...X..X.........X....
|
||||||
|
|
||||||
|
explosion3A:
|
||||||
|
.byte $00, $00 ; ..............
|
||||||
|
.byte $02, $10 ; .X.........X..
|
||||||
|
.byte $20, $04 ; .....X...X....
|
||||||
|
.byte $01, $01 ; X......X......
|
||||||
|
.byte $00, $40 ; .............X
|
||||||
|
.byte $04, $00 ; ..X...........
|
||||||
|
.byte $08, $10 ; ...X.......X..
|
||||||
|
.byte $41, $00 ; X.....X.......
|
||||||
|
.byte $00, $20 ; ............X.
|
||||||
|
.byte $01, $01 ; X......X......
|
||||||
|
.byte $10, $00 ; ....X.........
|
||||||
|
.byte $00, $08 ; ..........X...
|
||||||
|
.byte $02, $02 ; .X......X.....
|
||||||
|
.byte $04, $00 ; ..X...........
|
||||||
|
.byte $00, $10 ; ...........X..
|
||||||
|
.byte $01, $00 ; X.............
|
||||||
|
|
||||||
|
explosion3U:
|
||||||
|
.byte $00, $00, $00 ; .....................
|
||||||
|
.byte $10, $00, $01 ; ....X.........X......
|
||||||
|
.byte $00, $22, $00 ; ........X...X........
|
||||||
|
.byte $08, $08, $00 ; ...X......X..........
|
||||||
|
.byte $00, $00, $04 ; ................X....
|
||||||
|
.byte $20, $00, $00 ; .....X...............
|
||||||
|
.byte $40, $00, $01 ; ......X.......X......
|
||||||
|
.byte $08, $04, $00 ; ...X.....X...........
|
||||||
|
.byte $00, $00, $02 ; ...............X.....
|
||||||
|
.byte $08, $08, $00 ; ...X......X..........
|
||||||
|
.byte $00, $01, $00 ; .......X.............
|
||||||
|
.byte $00, $40, $00 ; .............X.......
|
||||||
|
.byte $10, $10, $00 ; ....X......X.........
|
||||||
|
.byte $20, $00, $00 ; .....X...............
|
||||||
|
.byte $00, $00, $01 ; ..............X......
|
||||||
|
.byte $08, $00, $00 ; ...X.................
|
||||||
|
|
||||||
|
monsterA:
|
||||||
|
.byte $78, $00 ; ...XXXX.......
|
||||||
|
.byte $4C, $01 ; ..XX..XX......
|
||||||
|
.byte $7C, $01 ; ..XXXXXX......
|
||||||
|
.byte $7E, $03 ; .XXXXXXXX.....
|
||||||
|
.byte $37, $07 ; XXX.XX.XXX....
|
||||||
|
.byte $33, $06 ; XX..XX..XX....
|
||||||
|
.byte $33, $06 ; XX..XX..XX....
|
||||||
|
.byte $7B, $06 ; XX.XXXX.XX....
|
||||||
|
.byte $7F, $07 ; XXXXXXXXXX....
|
||||||
|
.byte $7E, $03 ; .XXXXXXXX.....
|
||||||
|
.byte $7F, $07 ; XXXXXXXXXX....
|
||||||
|
.byte $7B, $06 ; XX.XXXX.XX....
|
||||||
|
.byte $01, $04 ; X........X....
|
||||||
|
|
||||||
|
monsterU:
|
||||||
|
.byte $00, $0F ; .......XXXX...
|
||||||
|
.byte $40, $19 ; ......XX..XX..
|
||||||
|
.byte $40, $1F ; ......XXXXXX..
|
||||||
|
.byte $60, $3F ; .....XXXXXXXX.
|
||||||
|
.byte $70, $76 ; ....XXX.XX.XXX
|
||||||
|
.byte $30, $66 ; ....XX..XX..XX
|
||||||
|
.byte $30, $66 ; ....XX..XX..XX
|
||||||
|
.byte $30, $6F ; ....XX.XXXX.XX
|
||||||
|
.byte $70, $7F ; ....XXXXXXXXXX
|
||||||
|
.byte $60, $3F ; .....XXXXXXXX.
|
||||||
|
.byte $70, $7F ; ....XXXXXXXXXX
|
||||||
|
.byte $30, $6F ; ....XX.XXXX.XX
|
||||||
|
.byte $10, $40 ; ....X........X
|
||||||
|
|
||||||
|
nukeA:
|
||||||
|
.byte $3F ; XXXXXX.
|
||||||
|
.byte $12 ; .X..X..
|
||||||
|
.byte $0C ; ..XX...
|
||||||
|
.byte $12 ; .X..X..
|
||||||
|
.byte $2D ; X.XX.X.
|
||||||
|
.byte $2D ; X.XX.X.
|
||||||
|
.byte $12 ; .X..X..
|
||||||
|
.byte $0C ; ..XX...
|
||||||
|
|
||||||
|
nukeU:
|
||||||
|
.byte $70, $07 ; ....XXXXXX....
|
||||||
|
.byte $20, $02 ; .....X..X.....
|
||||||
|
.byte $40, $01 ; ......XX......
|
||||||
|
.byte $20, $02 ; .....X..X.....
|
||||||
|
.byte $50, $05 ; ....X.XX.X....
|
||||||
|
.byte $50, $05 ; ....X.XX.X....
|
||||||
|
.byte $20, $02 ; .....X..X.....
|
||||||
|
.byte $40, $01 ; ......XX......
|
||||||
|
|
||||||
|
bomb0A:
|
||||||
|
.byte $04 ; ..X....
|
||||||
|
.byte $04 ; ..X....
|
||||||
|
.byte $0E ; .XXX...
|
||||||
|
.byte $1F ; XXXXX..
|
||||||
|
.byte $15 ; X.X.X..
|
||||||
|
.byte $11 ; X...X..
|
||||||
|
|
||||||
|
bomb0U:
|
||||||
|
.byte $40, $00 ;......X.......
|
||||||
|
.byte $40, $00 ;......X.......
|
||||||
|
.byte $60, $01 ;.....XXX......
|
||||||
|
.byte $70, $03 ;....XXXXX.....
|
||||||
|
.byte $50, $02 ;....X.X.X.....
|
||||||
|
.byte $10, $02 ;....X...X.....
|
||||||
|
|
||||||
|
bomb1A:
|
||||||
|
.byte $07 ; XXX....
|
||||||
|
.byte $0C ; ..XX...
|
||||||
|
.byte $3E ; .XXXXX.
|
||||||
|
.byte $0C ; ..XX...
|
||||||
|
.byte $07 ; XXX....
|
||||||
|
|
||||||
|
bomb1U:
|
||||||
|
.byte $70, $00 ; ....XXX.......
|
||||||
|
.byte $40, $01 ; ......XX......
|
||||||
|
.byte $60, $07 ; .....XXXXX....
|
||||||
|
.byte $40, $01 ; ......XX......
|
||||||
|
.byte $70, $00 ; ....XXX.......
|
||||||
|
|
||||||
|
shipA:
|
||||||
|
.byte $7C, $7F, $03 ; ..XXXXXXXXXXXXXX.....
|
||||||
|
.byte $78, $03, $00 ; ...XXXXXX............
|
||||||
|
.byte $70, $1F, $00 ; ....XXXXXXXX.........
|
||||||
|
.byte $60, $7F, $0F ; .....XXXXXXXXXXXXX...
|
||||||
|
.byte $60, $7F, $7F ; .....XXXXXXXXXXXXXXXX
|
||||||
|
.byte $60, $63, $07 ; .....XXXX...XXXXX....
|
||||||
|
.byte $60, $31, $00 ; .....XXX...XX........
|
||||||
|
.byte $70, $1F, $00 ; ....XXXXXXXX.........
|
||||||
|
.byte $78, $03, $00 ; ...XXXXXX............
|
||||||
|
.byte $7C, $00, $00 ; ..XXXXX..............
|
||||||
|
.byte $1E, $00, $00 ; .XXXX................
|
||||||
|
.byte $7F, $07, $00 ; XXXXXXXXXX...........
|
||||||
|
|
||||||
|
shipU:
|
||||||
|
.byte $40, $7F, $3F, $00 ; ......XXXXXXXXXXXXXX.....
|
||||||
|
.byte $00, $3F, $00, $00 ; .......XXXXXX............
|
||||||
|
.byte $00, $7E, $07, $00 ; ........XXXXXXXXX........
|
||||||
|
.byte $00, $7C, $7F, $01 ; .........XXXXXXXXXXXXX...
|
||||||
|
.byte $00, $7C, $7F, $0F ; .........XXXXXXXXXXXXXXXX
|
||||||
|
.byte $00, $3C, $78, $00 ; .........XXXX....XXXX....
|
||||||
|
.byte $00, $1C, $0C, $00 ; .........XXX....XX.......
|
||||||
|
.byte $00, $7E, $07, $00 ; ........XXXXXXXXX........
|
||||||
|
.byte $00, $3F, $00, $00 ; .......XXXXXX............
|
||||||
|
.byte $40, $0F, $00, $00 ; ......XXXXX..............
|
||||||
|
.byte $60, $03, $00, $00 ; .....XXXX................
|
||||||
|
.byte $70, $7F, $00, $00 ; ....XXXXXXXXXX...........
|
402
src/apple2/terrain.inc
Normal file
402
src/apple2/terrain.inc
Normal file
|
@ -0,0 +1,402 @@
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; terrain.inc
|
||||||
|
; Part of penetrator, the zx spectrum game, made for Apple II
|
||||||
|
;
|
||||||
|
; Stefan Wessels, 2019
|
||||||
|
; This is free and unencumbered software released into the public domain.
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
.segment "CODE"
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
.proc terrainShow
|
||||||
|
|
||||||
|
zaIndex = tempBlock + 1
|
||||||
|
zaWorldBot = tempBlock + 2
|
||||||
|
zaWorldTop = tempBlock + 3
|
||||||
|
zaSide = tempBlock + 4
|
||||||
|
|
||||||
|
ldy #WORLD_START ; start row
|
||||||
|
lda #(WORLD_END - WORLD_START + 1) ; no of rows to clear
|
||||||
|
ldx backLayer ; inactive (back) layer
|
||||||
|
jsr drawClearRows ; clean the part where the world must draw
|
||||||
|
|
||||||
|
lda terrainOrigin
|
||||||
|
lsr
|
||||||
|
sta zScreenCol
|
||||||
|
|
||||||
|
ldy bufferDraw ; make enemyBuffer relative to screen col 0
|
||||||
|
dey ; but back up 1 to the last drawn height
|
||||||
|
|
||||||
|
lda worldBBuffer, y ; prime the drawing with these heights
|
||||||
|
sta zaWorldBot ; as the last height is where the col 0
|
||||||
|
lda worldTBuffer, y ; draw needs to come from
|
||||||
|
sta zaWorldTop
|
||||||
|
|
||||||
|
iny ; get back to col 0 equivalent index
|
||||||
|
sty zaIndex ; and save this index
|
||||||
|
|
||||||
|
loop:
|
||||||
|
lda #0
|
||||||
|
sta zaSide
|
||||||
|
lda worldBBuffer, y
|
||||||
|
ldy zaWorldBot ; get the last height
|
||||||
|
sta zaWorldBot ; save new bottom as last
|
||||||
|
jsr terrainDrawLeftColumn
|
||||||
|
|
||||||
|
inc zaSide
|
||||||
|
ldy zaIndex
|
||||||
|
lda worldTBuffer, y
|
||||||
|
ldy zaWorldTop ; get the last height
|
||||||
|
sta zaWorldTop ; save new bottom as last
|
||||||
|
cmp #9
|
||||||
|
bcc :+
|
||||||
|
jsr terrainDrawLeftColumn
|
||||||
|
|
||||||
|
:
|
||||||
|
lda #0
|
||||||
|
sta zaSide
|
||||||
|
inc zaIndex
|
||||||
|
ldy zaIndex
|
||||||
|
lda worldBBuffer, y
|
||||||
|
ldy zaWorldBot ; get the last height
|
||||||
|
sta zaWorldBot ; save new bottom as last
|
||||||
|
jsr terrainDrawRightColumn
|
||||||
|
|
||||||
|
inc zaSide
|
||||||
|
ldy zaIndex
|
||||||
|
lda worldTBuffer, y
|
||||||
|
ldy zaWorldTop ; get the last height
|
||||||
|
sta zaWorldTop ; save new bottom as last
|
||||||
|
cmp #9
|
||||||
|
bcc :+
|
||||||
|
jsr terrainDrawRightColumn
|
||||||
|
|
||||||
|
:
|
||||||
|
ldy zaIndex
|
||||||
|
cpy bufferInsert
|
||||||
|
beq done
|
||||||
|
iny
|
||||||
|
sty zaIndex
|
||||||
|
inc zScreenCol
|
||||||
|
bne loop
|
||||||
|
|
||||||
|
done:
|
||||||
|
clc
|
||||||
|
rts
|
||||||
|
|
||||||
|
.endproc
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; y is last height, a is new height
|
||||||
|
.proc terrainDrawLeftColumn
|
||||||
|
|
||||||
|
zaSide = tempBlock + 4
|
||||||
|
zaDiff = tempBlock + 5
|
||||||
|
zaDir = tempBlock + 6 ; 2 bytes used
|
||||||
|
|
||||||
|
sty zaDiff
|
||||||
|
sec
|
||||||
|
sbc zaDiff ; get the delta (new - old)
|
||||||
|
tax ; save delta in x
|
||||||
|
bcs eqdown ; new .ge. old
|
||||||
|
|
||||||
|
up: ; new < old so go up
|
||||||
|
lda rowL, y
|
||||||
|
adc zScreenCol
|
||||||
|
sta writeUpStart + 1
|
||||||
|
lda rowH, y
|
||||||
|
adc zVramH
|
||||||
|
sta writeUpStart + 2
|
||||||
|
lda #%00000011 ; start with a 2 pixel flat area
|
||||||
|
writeUpStart:
|
||||||
|
sta PLACEHOLDER
|
||||||
|
dey ; go 1 row up
|
||||||
|
inx
|
||||||
|
beq skup ; if at new height now, skip the "up line" portion
|
||||||
|
:
|
||||||
|
lda rowL, y ; draw the "up line" portion now
|
||||||
|
adc zScreenCol
|
||||||
|
sta writeUp + 1
|
||||||
|
lda rowH, y
|
||||||
|
adc zVramH
|
||||||
|
sta writeUp + 2
|
||||||
|
lda #%00000100 ; write a single pixel up the rows
|
||||||
|
writeUp:
|
||||||
|
sta PLACEHOLDER
|
||||||
|
dey ; row up
|
||||||
|
inx
|
||||||
|
bne :- ; keep going till old .eq. new
|
||||||
|
|
||||||
|
skup:
|
||||||
|
lda rowL, y ; finish off the transition
|
||||||
|
adc zScreenCol
|
||||||
|
sta writeUpEnd + 1
|
||||||
|
lda rowH, y
|
||||||
|
adc zVramH
|
||||||
|
sta writeUpEnd + 2
|
||||||
|
lda #%00001000 ; by writing a pixel to connect to new
|
||||||
|
writeUpEnd:
|
||||||
|
sta PLACEHOLDER ; (which will become old, in next column, to draw from)
|
||||||
|
|
||||||
|
lda #$ff
|
||||||
|
ldx zaSide
|
||||||
|
sta zaDir, x
|
||||||
|
|
||||||
|
rts
|
||||||
|
|
||||||
|
eqdown:
|
||||||
|
clc ; carry still set from subtract
|
||||||
|
beq eq ; if new .eq. old it's a flat line
|
||||||
|
|
||||||
|
down: ; new > old so go down - see up, same but inc|dec is reversed
|
||||||
|
lda rowL, y
|
||||||
|
adc zScreenCol
|
||||||
|
sta writeDownStart + 1
|
||||||
|
lda rowH, y
|
||||||
|
adc zVramH
|
||||||
|
sta writeDownStart + 2
|
||||||
|
lda #%00000011
|
||||||
|
writeDownStart:
|
||||||
|
sta PLACEHOLDER
|
||||||
|
iny
|
||||||
|
dex
|
||||||
|
beq skdn
|
||||||
|
|
||||||
|
:
|
||||||
|
lda rowL, y
|
||||||
|
adc zScreenCol
|
||||||
|
sta writeDown + 1
|
||||||
|
lda rowH, y
|
||||||
|
adc zVramH
|
||||||
|
sta writeDown + 2
|
||||||
|
lda #%00000100
|
||||||
|
writeDown:
|
||||||
|
sta PLACEHOLDER
|
||||||
|
iny
|
||||||
|
dex
|
||||||
|
bne :-
|
||||||
|
|
||||||
|
skdn:
|
||||||
|
lda rowL, y
|
||||||
|
adc zScreenCol
|
||||||
|
sta writeDownEnd + 1
|
||||||
|
lda rowH, y
|
||||||
|
adc zVramH
|
||||||
|
sta writeDownEnd + 2
|
||||||
|
lda #%00001000
|
||||||
|
writeDownEnd:
|
||||||
|
sta PLACEHOLDER
|
||||||
|
|
||||||
|
lda #$01
|
||||||
|
ldx zaSide
|
||||||
|
sta zaDir, x
|
||||||
|
|
||||||
|
rts
|
||||||
|
|
||||||
|
eq: ; flat line from old to new when equal
|
||||||
|
lda rowL, y
|
||||||
|
adc zScreenCol
|
||||||
|
sta writeFlat + 1
|
||||||
|
lda rowH, y
|
||||||
|
adc zVramH
|
||||||
|
sta writeFlat + 2
|
||||||
|
lda #%00001111
|
||||||
|
writeFlat: ; 4 pixels in a line
|
||||||
|
sta PLACEHOLDER
|
||||||
|
|
||||||
|
lda #$00
|
||||||
|
ldx zaSide
|
||||||
|
sta zaDir, x
|
||||||
|
|
||||||
|
rts
|
||||||
|
|
||||||
|
.endproc
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; y is last height, a is new height
|
||||||
|
.proc terrainDrawRightColumn
|
||||||
|
|
||||||
|
zaSide = tempBlock + 4
|
||||||
|
zaDiff = tempBlock + 5
|
||||||
|
zaDir = tempBlock + 6 ; 2 bytes used
|
||||||
|
zaSaveX = tempBlock + 8
|
||||||
|
|
||||||
|
sty zaDiff
|
||||||
|
sec
|
||||||
|
sbc zaDiff ; get the delta (new - old)
|
||||||
|
tax ; save delta in x
|
||||||
|
bcc up
|
||||||
|
jmp eqdown ; new .ge. old
|
||||||
|
|
||||||
|
up: ; new < old so go up
|
||||||
|
lda rowL, y
|
||||||
|
adc zScreenCol
|
||||||
|
sta writeUpStart + 1
|
||||||
|
sta writeUpStart + 4
|
||||||
|
lda rowH, y
|
||||||
|
adc zVramH
|
||||||
|
sta writeUpStart + 2
|
||||||
|
sta writeUpStart + 5
|
||||||
|
lda #%00010000 ; start with a 2 pixel flat area
|
||||||
|
writeUpStart:
|
||||||
|
ora PLACEHOLDER
|
||||||
|
sta PLACEHOLDER
|
||||||
|
dey ; go 1 row up
|
||||||
|
inx
|
||||||
|
beq skup ; if at new height now, skip the "up line" portion
|
||||||
|
|
||||||
|
stx zaSaveX
|
||||||
|
ldx zaSide
|
||||||
|
lda zaDir, x
|
||||||
|
ldx zaSaveX
|
||||||
|
cmp #1
|
||||||
|
bne fastUp
|
||||||
|
clc
|
||||||
|
:
|
||||||
|
lda rowL, y ; draw the "up line" portion now
|
||||||
|
adc zScreenCol
|
||||||
|
sta writeUp + 1
|
||||||
|
sta writeUp + 4
|
||||||
|
lda rowH, y
|
||||||
|
adc zVramH
|
||||||
|
sta writeUp + 2
|
||||||
|
sta writeUp + 5
|
||||||
|
lda #%00100000 ; write a single pixel up the rows
|
||||||
|
writeUp:
|
||||||
|
ora PLACEHOLDER
|
||||||
|
sta PLACEHOLDER
|
||||||
|
dey ; row up
|
||||||
|
inx
|
||||||
|
bne :- ; keep going till old .eq. new
|
||||||
|
beq skup
|
||||||
|
|
||||||
|
fastUp:
|
||||||
|
clc
|
||||||
|
:
|
||||||
|
lda rowL, y ; draw the "up line" portion now
|
||||||
|
adc zScreenCol
|
||||||
|
sta writeUpFast + 1
|
||||||
|
lda rowH, y
|
||||||
|
adc zVramH
|
||||||
|
sta writeUpFast + 2
|
||||||
|
lda #%00100000 ; write a single pixel up the rows
|
||||||
|
writeUpFast:
|
||||||
|
sta PLACEHOLDER
|
||||||
|
dey ; row up
|
||||||
|
inx
|
||||||
|
bne :- ; keep going till old .eq. new
|
||||||
|
|
||||||
|
skup:
|
||||||
|
lda rowL, y ; finish off the transition
|
||||||
|
adc zScreenCol
|
||||||
|
sta writeUpEnd + 1
|
||||||
|
sta writeUpEnd + 4
|
||||||
|
lda rowH, y
|
||||||
|
adc zVramH
|
||||||
|
sta writeUpEnd + 2
|
||||||
|
sta writeUpEnd + 5
|
||||||
|
lda #%01000000 ; by writing a pixel to connect to new
|
||||||
|
writeUpEnd:
|
||||||
|
ora PLACEHOLDER
|
||||||
|
sta PLACEHOLDER ; (which will become old, in next column, to draw from)
|
||||||
|
|
||||||
|
rts
|
||||||
|
|
||||||
|
eqdown:
|
||||||
|
clc ; carry still set from subtract
|
||||||
|
bne down ; if new .eq. old it's a flat line
|
||||||
|
jmp eq
|
||||||
|
|
||||||
|
down: ; new > old so go down - see up, same but inc|dec is reversed
|
||||||
|
lda rowL, y
|
||||||
|
adc zScreenCol
|
||||||
|
sta writeDownStart + 1
|
||||||
|
sta writeDownStart + 4
|
||||||
|
lda rowH, y
|
||||||
|
adc zVramH
|
||||||
|
sta writeDownStart + 2
|
||||||
|
sta writeDownStart + 5
|
||||||
|
lda #%00010000
|
||||||
|
writeDownStart:
|
||||||
|
ora PLACEHOLDER
|
||||||
|
sta PLACEHOLDER
|
||||||
|
iny
|
||||||
|
dex
|
||||||
|
beq skdn
|
||||||
|
|
||||||
|
stx zaSaveX
|
||||||
|
ldx zaSide
|
||||||
|
lda zaDir, x
|
||||||
|
ldx zaSaveX
|
||||||
|
cmp #$ff
|
||||||
|
bne fastDown
|
||||||
|
clc
|
||||||
|
|
||||||
|
:
|
||||||
|
lda rowL, y
|
||||||
|
adc zScreenCol
|
||||||
|
sta writeDown + 1
|
||||||
|
sta writeDown + 4
|
||||||
|
lda rowH, y
|
||||||
|
adc zVramH
|
||||||
|
sta writeDown + 2
|
||||||
|
sta writeDown + 5
|
||||||
|
lda #%00100000
|
||||||
|
writeDown:
|
||||||
|
ora PLACEHOLDER
|
||||||
|
sta PLACEHOLDER
|
||||||
|
iny
|
||||||
|
dex
|
||||||
|
bne :-
|
||||||
|
beq skdn
|
||||||
|
|
||||||
|
fastDown:
|
||||||
|
clc
|
||||||
|
:
|
||||||
|
lda rowL, y
|
||||||
|
adc zScreenCol
|
||||||
|
sta writeDownFast + 1
|
||||||
|
lda rowH, y
|
||||||
|
adc zVramH
|
||||||
|
sta writeDownFast + 2
|
||||||
|
lda #%00100000
|
||||||
|
writeDownFast:
|
||||||
|
sta PLACEHOLDER
|
||||||
|
iny
|
||||||
|
dex
|
||||||
|
bne :-
|
||||||
|
|
||||||
|
skdn:
|
||||||
|
lda rowL, y
|
||||||
|
adc zScreenCol
|
||||||
|
sta writeDownEnd + 1
|
||||||
|
sta writeDownEnd + 4
|
||||||
|
lda rowH, y
|
||||||
|
adc zVramH
|
||||||
|
sta writeDownEnd + 2
|
||||||
|
sta writeDownEnd + 5
|
||||||
|
lda #%01000000
|
||||||
|
writeDownEnd:
|
||||||
|
ora PLACEHOLDER
|
||||||
|
sta PLACEHOLDER
|
||||||
|
|
||||||
|
rts
|
||||||
|
|
||||||
|
eq: ; flat line from old to new when equal
|
||||||
|
lda rowL, y
|
||||||
|
adc zScreenCol
|
||||||
|
sta writeFlat + 1
|
||||||
|
sta writeFlat + 4
|
||||||
|
lda rowH, y
|
||||||
|
adc zVramH
|
||||||
|
sta writeFlat + 2
|
||||||
|
sta writeFlat + 5
|
||||||
|
lda #%01110000
|
||||||
|
writeFlat: ; 4 pixels in a line
|
||||||
|
ora PLACEHOLDER
|
||||||
|
sta PLACEHOLDER
|
||||||
|
|
||||||
|
rts
|
||||||
|
|
||||||
|
.endproc
|
404
src/apple2/text.inc
Normal file
404
src/apple2/text.inc
Normal file
|
@ -0,0 +1,404 @@
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; text.inc
|
||||||
|
; Part of penetrator, the zx spectrum game, made for Apple II
|
||||||
|
;
|
||||||
|
; Stefan Wessels, 2019
|
||||||
|
; This is free and unencumbered software released into the public domain.
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
.segment "RODATA"
|
||||||
|
|
||||||
|
.feature string_escapes
|
||||||
|
|
||||||
|
; In game text
|
||||||
|
textTopLine: .asciiz "Stage . Player - - Score 0"
|
||||||
|
textDanger: .asciiz "Danger"
|
||||||
|
textShips: .asciiz "Ships"
|
||||||
|
textTrainer: .asciiz "Trainer"
|
||||||
|
textPlayer: .asciiz "P L A Y E R "
|
||||||
|
|
||||||
|
; title screen
|
||||||
|
textHighScores: .asciiz "High Scores"
|
||||||
|
textPhilip: .asciiz " Written by - Philip Mitchell - "
|
||||||
|
textCopyright: .asciiz "** Copyright \"Beam Software\" **"
|
||||||
|
textApple2: .asciiz " Apple II version by "
|
||||||
|
textStefan: .asciiz " Stefan Wessels, Dec 2019 "
|
||||||
|
textSupport: .asciiz " Lots of great Apple II "
|
||||||
|
textOliver: .asciiz " Support from Oliver Schmidt "
|
||||||
|
textSource: .asciiz " Source on GitHub: "
|
||||||
|
textGitHub: .asciiz " github.com/StewBC/penetrator "
|
||||||
|
textGameOver: .asciiz "********** GAME OVER **********"
|
||||||
|
|
||||||
|
; main menu
|
||||||
|
textInstructions: .asciiz "INSTRUCTIONS"
|
||||||
|
textPress: .asciiz "PRESS"
|
||||||
|
textUnderline: .asciiz "-----"
|
||||||
|
textOneTwo: .asciiz "\"1\" OR \"2\" FOR NUMBER OF PLAYERS"
|
||||||
|
textTrain: .asciiz "\"T\" FOR TRAINING CONTROL CENTER"
|
||||||
|
textEdit: .asciiz "\"E\" FOR THE LANDSCAPE EDITOR"
|
||||||
|
textLoad: .asciiz "\"L\" TO LOAD ANOTHER LANDSCAPE"
|
||||||
|
textSirens: .asciiz "\"S\" TO DISABLE SIRENS"
|
||||||
|
|
||||||
|
; training mode menu
|
||||||
|
textTrainingMode: .asciiz "TRAINING MODE"
|
||||||
|
textPressStage: .asciiz "PRESS NUMBER OF DESIRED STAGE"
|
||||||
|
textOneToFour: .asciiz "(1 - 4) TO START."
|
||||||
|
textBackup: .asciiz "ESC to back up or exit mode"
|
||||||
|
|
||||||
|
; edit mode screen
|
||||||
|
textEditStage: .asciiz "STAGE"
|
||||||
|
textEditHelp: .byte "PRESS 'C' FOR ",$86," COMMAND SUMMARY", $00
|
||||||
|
textEditBrush: .asciiz "BRUSH: "
|
||||||
|
textEditTerrain: .asciiz "TERRAIN"
|
||||||
|
textEditEnemies: .asciiz "ENEMIES"
|
||||||
|
textEditDnArrow: .byte $85, $00
|
||||||
|
|
||||||
|
; edit help screen
|
||||||
|
textEdtHlp01: .asciiz "LANDSCAPE EDITOR COMMANDS"
|
||||||
|
textEdtHlp02: .asciiz "--------- ------ --------"
|
||||||
|
textEdtHlp03: .asciiz "JOYSTICK- MOVE THE CURSOR"
|
||||||
|
textEdtHlp04: .asciiz "KBD-B - TOGGLE BETWEEN TERRAIN"
|
||||||
|
textEdtHlp05: .asciiz " AND ENEMY BRUSHES"
|
||||||
|
textEdtHlp06: .asciiz "SPACE - CONTINIOUS MOVEMENT"
|
||||||
|
textEdtHlp07: .asciiz ""
|
||||||
|
textEdtHlp08: .asciiz "JOYBTN1 - SET TERRAIN TOP"
|
||||||
|
textEdtHlp09: .asciiz " OR PLACE A MISSILE"
|
||||||
|
textEdtHlp10: .asciiz "JOYBTN0 - SET TERRAIN BOTTOM OR"
|
||||||
|
textEdtHlp11: .asciiz " PLACE A RADAR"
|
||||||
|
textEdtHlp12: .asciiz "1 - 5 - SKIP TO STAGE"
|
||||||
|
textEdtHlp13: .asciiz "S - SAVE THIS WORLD"
|
||||||
|
textEdtHlp14: .asciiz "L - LOAD A WORLD"
|
||||||
|
textEdtHlp15: .asciiz "ERASE ENEMIES USING A/B"
|
||||||
|
textEdtHlp16: .asciiz "WITH THE ENEMIES BRUSH"
|
||||||
|
textEdtHlp17: .asciiz "ESC - END THE EDIT SESSION"
|
||||||
|
|
||||||
|
; win screen
|
||||||
|
textBonus: .asciiz "BONUS"
|
||||||
|
textPoints: .asciiz "POINTS"
|
||||||
|
text1000: .asciiz "1000"
|
||||||
|
textWow: .asciiz "WOW"
|
||||||
|
textHome: .asciiz "HOME"
|
||||||
|
|
||||||
|
; high score name entry
|
||||||
|
textCongrats: .asciiz "***** CONGRATULATIONS *****"
|
||||||
|
textHSPlayer: .asciiz "PLAYER -- "
|
||||||
|
textTop5: .asciiz "Your score is in the top 5"
|
||||||
|
textTypeName: .asciiz "Please type in your name"
|
||||||
|
|
||||||
|
; file name entry
|
||||||
|
textFileLoad: .asciiz "FILE LOAD"
|
||||||
|
textFileSave: .asciiz "FILE SAVE"
|
||||||
|
textFileLines: .asciiz "---------"
|
||||||
|
textFileInfoL: .asciiz "Load"
|
||||||
|
textFileInfoS: .asciiz "Save"
|
||||||
|
textFileInfo: .asciiz "world data"
|
||||||
|
textFileEnter: .asciiz "Please enter a file name"
|
||||||
|
textFileSuccess: .asciiz "SUCCESS."
|
||||||
|
textFileThe: .asciiz "The"
|
||||||
|
textFileFailed: .asciiz "Failed. Error Code"
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
.segment "DATA"
|
||||||
|
|
||||||
|
textHS:
|
||||||
|
textHighScore1: .asciiz "123456"
|
||||||
|
textHighScore2: .asciiz "123456"
|
||||||
|
textHighScore3: .asciiz "123456"
|
||||||
|
textHighScore4: .asciiz "123456"
|
||||||
|
textHighScore5: .asciiz "123456"
|
||||||
|
textHSEnd:
|
||||||
|
|
||||||
|
textStage: .asciiz "1"
|
||||||
|
textPlayerNum: .asciiz "1"
|
||||||
|
textNumber: .asciiz "1234567" ; score display 10x score - extra digit needed
|
||||||
|
textDangerBar: .asciiz "123"
|
||||||
|
textEnd:
|
||||||
|
|
||||||
|
textFileName: .asciiz "PENEWORLD01" ; default file name
|
||||||
|
textFilePad: .asciiz "" ; This makes the null terminator on textFileName viable and a 12 char filename
|
||||||
|
textFileNameEnd:
|
||||||
|
szHex: .asciiz " "
|
||||||
|
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
.segment "CODE"
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; Use the print macro to call this code
|
||||||
|
; Writes a null-terminated string to the back buffer
|
||||||
|
; temp1/2 Ptr to the string
|
||||||
|
; textX - the string draw X position (in col coords)
|
||||||
|
; textY - the string draw Y position
|
||||||
|
.proc textOut
|
||||||
|
|
||||||
|
textX = tempBlock + 10
|
||||||
|
textY = tempBlock + 11
|
||||||
|
xPos = tempBlock + 12
|
||||||
|
yPos = tempBlock + 13
|
||||||
|
|
||||||
|
zaStrL = tempBlock + 1 ; parameter - string lo
|
||||||
|
zaStrH = tempBlock + 2 ; parameter - string hi
|
||||||
|
zaFontL = tempBlock + 4 ; internal - point at the character memory Lo
|
||||||
|
zaFontH = tempBlock + 5 ; internal - point at the character memory Hi
|
||||||
|
zaFontOffset = tempBlock + 6 ; 0-15 - index from zaFont
|
||||||
|
|
||||||
|
loop:
|
||||||
|
ldy #0
|
||||||
|
lda (zaStrL), y ; get the character in the string
|
||||||
|
bne :+ ; if non-null process it
|
||||||
|
rts ; exit on 0 terminator
|
||||||
|
|
||||||
|
:
|
||||||
|
jsr setFont
|
||||||
|
lda textY ; get the screen Y for text
|
||||||
|
sta yPos ; init the row working buffer
|
||||||
|
|
||||||
|
plotLoop:
|
||||||
|
ldy yPos ; at the working row offset
|
||||||
|
lda rowL, y ; get the memory address
|
||||||
|
adc textX ; add in column (x pos of text)
|
||||||
|
sta write + 1 ; point lo at memory
|
||||||
|
lda rowH, y
|
||||||
|
adc zVramH
|
||||||
|
sta write + 2
|
||||||
|
|
||||||
|
ldy zaFontOffset ; get the offset into the font
|
||||||
|
lda (zaFontL), y ; get the actual left character byte
|
||||||
|
write:
|
||||||
|
sta PLACEHOLDER ; plot the left hand side
|
||||||
|
cpy #7
|
||||||
|
bcs nextChar ; 0-7 then done with this character (bottom always blank)
|
||||||
|
inc zaFontOffset ; move a byte for last row plotted
|
||||||
|
inc yPos ; move down a row on screen
|
||||||
|
|
||||||
|
bne plotLoop ; always take this branch
|
||||||
|
|
||||||
|
nextChar:
|
||||||
|
inc textX ; character column
|
||||||
|
inc zaStrL ; next character in string
|
||||||
|
bne loop
|
||||||
|
inc zaStrH
|
||||||
|
bne loop ; always branch back
|
||||||
|
|
||||||
|
.endproc
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; Like textOut but uses drawPoltXY to plot each pixel in the text
|
||||||
|
; so you can write big strings using width and height.
|
||||||
|
; a setting of width and height both 1 results in a character that's
|
||||||
|
; 32x32 on-screen
|
||||||
|
.proc textBigPrint
|
||||||
|
|
||||||
|
zaStrL = tempBlock + 1 ; parameter - string lo
|
||||||
|
zaStrH = tempBlock + 2 ; parameter - string hi
|
||||||
|
zaBitCnt = tempBlock + 3 ; internal - how many bits to process for a byte to write
|
||||||
|
zaFontL = tempBlock + 4 ; internal - point at the character memory Lo
|
||||||
|
zaFontH = tempBlock + 5 ; internal - point at the character memory Hi
|
||||||
|
zaFontOffset = tempBlock + 6 ; internal - 0-15 - index from zaFont
|
||||||
|
|
||||||
|
width = tempBlock + 14 ; shared with drawPlotXY
|
||||||
|
height = tempBlock + 15
|
||||||
|
|
||||||
|
textX = tempBlock + 12
|
||||||
|
textY = tempBlock + 13
|
||||||
|
xPos = tempBlock + 7
|
||||||
|
yPos = tempBlock + 8
|
||||||
|
|
||||||
|
loop:
|
||||||
|
ldy #0
|
||||||
|
lda (zaStrL), y ; get the character in the string
|
||||||
|
bne :+ ; if non-null process it
|
||||||
|
rts ; exit on 0 terminator
|
||||||
|
|
||||||
|
:
|
||||||
|
jsr setFont
|
||||||
|
|
||||||
|
lda textY ; get the screen Y for text
|
||||||
|
sta yPos
|
||||||
|
|
||||||
|
inc zaFontOffset
|
||||||
|
|
||||||
|
plotLoop:
|
||||||
|
|
||||||
|
lda textX
|
||||||
|
sta xPos
|
||||||
|
|
||||||
|
ldx #6 ; each font character byte uses 7 pixels
|
||||||
|
stx zaBitCnt
|
||||||
|
|
||||||
|
ldy zaFontOffset ; get the offset into the font
|
||||||
|
lda (zaFontL), y ; get the actual left character byte
|
||||||
|
lsr
|
||||||
|
jsr drawBits
|
||||||
|
|
||||||
|
inc zaFontOffset ; go to the next line
|
||||||
|
ldy zaFontOffset
|
||||||
|
|
||||||
|
cpy #7 ; characters are 8 bytes long, care about 7
|
||||||
|
bcs nextChar ; if 16 then done with this character
|
||||||
|
lda yPos ; adjust the "plot" down a line
|
||||||
|
clc
|
||||||
|
adc height
|
||||||
|
sta yPos
|
||||||
|
|
||||||
|
bne plotLoop ; always take this branch
|
||||||
|
|
||||||
|
nextChar:
|
||||||
|
lda width ; move along in X to the next character
|
||||||
|
asl ; 6x the width + 2
|
||||||
|
asl
|
||||||
|
adc width
|
||||||
|
adc width
|
||||||
|
adc #2
|
||||||
|
adc textX ; add to current "plot" position
|
||||||
|
sta textX
|
||||||
|
inc zaStrL ; next character in string
|
||||||
|
bne loop
|
||||||
|
inc zaStrH
|
||||||
|
bne loop ; always branch back
|
||||||
|
|
||||||
|
drawBits:
|
||||||
|
lsr ; shift a bit into carry
|
||||||
|
pha ; save the shifted byte
|
||||||
|
bcc :+ ; if carry is set, need to plot a pixel
|
||||||
|
clc
|
||||||
|
ldx xPos ; get the x and y of where to plot
|
||||||
|
ldy yPos
|
||||||
|
jsr drawPlotXY ; draw the pixel
|
||||||
|
:
|
||||||
|
lda xPos ; move along one "pixel"
|
||||||
|
clc
|
||||||
|
adc width
|
||||||
|
sta xPos
|
||||||
|
pla ; restore the shifted character
|
||||||
|
dec zaBitCnt ; see if all bytes were handled
|
||||||
|
ldx zaBitCnt
|
||||||
|
bne drawBits
|
||||||
|
rts
|
||||||
|
|
||||||
|
.endproc
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; Point zaFont(H|L) at the character definition for the character in the accumulator
|
||||||
|
; y register must be 0 when calling this routine
|
||||||
|
.proc setFont
|
||||||
|
|
||||||
|
zaFontL = tempBlock + 4 ; internal - point at the character memory Lo
|
||||||
|
zaFontH = tempBlock + 5 ; internal - point at the character memory Hi
|
||||||
|
zaFontOffset = tempBlock + 6 ; internal - 0-15 - index from zaFont
|
||||||
|
|
||||||
|
sty zaFontOffset ; start at 0th byte in font
|
||||||
|
sty zaFontH
|
||||||
|
sty zaFontL
|
||||||
|
|
||||||
|
sec ; subtract 32 as font starts at char 32 (space)
|
||||||
|
sbc #$20
|
||||||
|
asl ; mult 8 as that's how many bytes per char
|
||||||
|
rol zaFontH
|
||||||
|
asl
|
||||||
|
rol zaFontH
|
||||||
|
asl
|
||||||
|
rol zaFontH
|
||||||
|
adc #<font ; add in the memory location
|
||||||
|
sta zaFontL
|
||||||
|
lda #>font
|
||||||
|
adc zaFontH
|
||||||
|
sta zaFontH ; now font points at the character data
|
||||||
|
|
||||||
|
rts
|
||||||
|
|
||||||
|
.endproc
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; Turns a BCD number into a text string at textNumber.
|
||||||
|
; zaStr is a ptr to the number in BCD
|
||||||
|
; y reg is the number of bytes to convert
|
||||||
|
; x reg <> 0 means print at least one digit, even if 0
|
||||||
|
.proc textBCDtoSZ
|
||||||
|
|
||||||
|
zaStrL = tempBlock + 1
|
||||||
|
zaStrH = tempBlock + 2
|
||||||
|
zaForce = tempBlock + 3
|
||||||
|
|
||||||
|
stx zaForce
|
||||||
|
dey ; zero based so -1
|
||||||
|
ldx #0
|
||||||
|
|
||||||
|
leading: ; skip leading 0's with spaces
|
||||||
|
lda #' ' ; prep buffer with two spaces
|
||||||
|
sta textNumber, x ; if the byte to output is $00
|
||||||
|
sta textNumber + 1, x ; so leading 0's are skipped
|
||||||
|
lda (zaStrL), y ; get the high byte
|
||||||
|
bit Bit8765Mask ; check 1st digit
|
||||||
|
bne loop1 ; if not zero - start printing
|
||||||
|
inx ; skip the zero by accepting the space
|
||||||
|
and #$0f ; check the 2nd digit
|
||||||
|
beq :+ ; go skip if zero
|
||||||
|
jsr digit ; print the digit
|
||||||
|
bne loop2 ; and join the main print loop
|
||||||
|
:
|
||||||
|
inx ; skip the next char in the output string
|
||||||
|
dey ; go to next byte in the BCD number
|
||||||
|
bpl leading ; keep going till all bytes done
|
||||||
|
ldy zaForce ; nothing printed - see if at least 1 digit
|
||||||
|
beq done ; needs to be printed and if no - then done
|
||||||
|
dex ; step back one digit in the string
|
||||||
|
lda #'0' ; get a zero
|
||||||
|
sta textNumber, x ; put it in the string
|
||||||
|
inx
|
||||||
|
bne done ; JuMP to done
|
||||||
|
|
||||||
|
loop: ; main loop once a digit is found
|
||||||
|
lda (zaStrL), y ; get the 2 decimal digits
|
||||||
|
loop1:
|
||||||
|
jsr both ; print them both starting with left
|
||||||
|
loop2:
|
||||||
|
dey ; next score part
|
||||||
|
bpl loop ; keep going while there are score parts
|
||||||
|
|
||||||
|
done:
|
||||||
|
lda #0 ; load a null-terminator
|
||||||
|
sta textNumber, x ; store it in the output string
|
||||||
|
rts
|
||||||
|
|
||||||
|
both:
|
||||||
|
pha ; save the 2 digits
|
||||||
|
lsr ; shift right down
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
jsr digit ; go print it
|
||||||
|
pla ; restore both
|
||||||
|
and #$0f ; mask off the right leaving left
|
||||||
|
digit: ; print the digit
|
||||||
|
ora #$30 ; add "0" to the decimal
|
||||||
|
sta textNumber, x ; put it in the string
|
||||||
|
inx ; advance the string pointer
|
||||||
|
rts
|
||||||
|
|
||||||
|
.endproc
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; Prints the accumulator to the szHez text as 2 hex bytes
|
||||||
|
.proc toHex
|
||||||
|
|
||||||
|
ldx #0 ; offset into the szHex buffer
|
||||||
|
pha ; save a for lower 4 bits
|
||||||
|
lsr ; move upper 4 bits to lo
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
jsr :+ ; process upper 4 bits
|
||||||
|
pla ; restore a to process lower 4 bits
|
||||||
|
:
|
||||||
|
and #$0f ; mask to only the 4 bits now in lo
|
||||||
|
cmp #10 ; see if it's > 9
|
||||||
|
bcc :+
|
||||||
|
adc #6 ; move from 10+ to a+
|
||||||
|
:
|
||||||
|
adc #$30 ; and move to '0' and beyond
|
||||||
|
sta szHex, x ; save this in the buffer
|
||||||
|
inx ; go to next buffer location
|
||||||
|
rts ; and return to self or caller
|
||||||
|
|
||||||
|
.endproc
|
2353
src/apple2/trndata.inc
Normal file
2353
src/apple2/trndata.inc
Normal file
File diff suppressed because it is too large
Load Diff
1072
src/apple2/ui.inc
Normal file
1072
src/apple2/ui.inc
Normal file
File diff suppressed because it is too large
Load Diff
40
src/apple2/variables.inc
Normal file
40
src/apple2/variables.inc
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; variables.inc
|
||||||
|
; Part of penetrator, the zx spectrum game, made for Apple II
|
||||||
|
;
|
||||||
|
; Stefan Wessels, 2019
|
||||||
|
; This is free and unencumbered software released into the public domain.
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
.segment "DATA"
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; Player specific variables
|
||||||
|
rsStart: ; runtime stats "struct". lives MUST be 1st
|
||||||
|
lives: .res 1 ; Chances the player gets (decimal mode), indexed by activePlayer
|
||||||
|
score: .res 3 ; activePlayer's score is copied here for gameplay
|
||||||
|
stage: .res 1 ; offset to stages in worldDataStart - needed for reset
|
||||||
|
direction: .res 1 ; 0 = right, 1 = left (fly reverse through level)
|
||||||
|
makeMonster: .res NUM_STAGES ; 1 in stage offset lookup turns missiles into monsters
|
||||||
|
rsEnd:
|
||||||
|
|
||||||
|
playerStats: .res ((rsEnd-rsStart) * 2) ; 2 copies of stats, for p1 and p2 is 2p game
|
||||||
|
|
||||||
|
highScores:
|
||||||
|
highScore1: .res 3
|
||||||
|
highScore2: .res 3
|
||||||
|
highScore3: .res 3
|
||||||
|
highScore4: .res 3
|
||||||
|
highScore5: .res 3
|
||||||
|
highScoresEnd:
|
||||||
|
|
||||||
|
; per "run" buffers
|
||||||
|
bombX: .res NUM_BOMBS ; 2 bombs allowed, their x values
|
||||||
|
bombY: .res NUM_BOMBS ; Y values for 2 bombs (0=available)
|
||||||
|
bombDir: .res NUM_BOMBS ; direction of travel (and thus sprite)
|
||||||
|
worldTBuffer: .res BUFLENGTH ; holds the world bottom height
|
||||||
|
worldBBuffer: .res BUFLENGTH ; holds the world top height
|
||||||
|
enemyBuffer: .res BUFLENGTH ; holds enemy sprite draw data
|
||||||
|
enemyHgtBuffer: .res BUFLENGTH ; holds enemy sprite draw height data
|
||||||
|
bulletsBuffer: .res BUFLENGTH ; holds the bullet heights (0=no bullet)
|
||||||
|
explosionBuffer: .res BUFLENGTH ; holds the explosion heights (0=no explosion)
|
72
src/apple2/zpvars.inc
Normal file
72
src/apple2/zpvars.inc
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; zpvars.inc
|
||||||
|
; Part of penetrator, the zx spectrum game, made for Apple II
|
||||||
|
;
|
||||||
|
; Stefan Wessels, 2019
|
||||||
|
; This is free and unencumbered software released into the public domain.
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
.segment "ZEROPAGE"
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; zero page variables
|
||||||
|
zWorldPtr: .res 2 ; where data is next read from the world stream
|
||||||
|
zVramH: .res 1 ; for HRG writes, points at the Hi of the back bank RAM
|
||||||
|
zScreenCol: .res 1 ; used for drawing - the column to draw
|
||||||
|
zEnemyCol: .res 1 ; used for enemies - the column to process
|
||||||
|
zCollision: .res 1 ; drawSprite will put a 1 in when there's a write collision
|
||||||
|
tempBlock: .res 22 ; used by different routines that need local storage
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; zero page constants
|
||||||
|
; Bit patterns for the bit instruction
|
||||||
|
Bit1Mask: .res 1
|
||||||
|
Bit2Mask: .res 1
|
||||||
|
Bit3Mask: .res 1
|
||||||
|
Bit4Mask: .res 1
|
||||||
|
Bit5Mask: .res 1
|
||||||
|
Bit6Mask: .res 1
|
||||||
|
Bit7Mask: .res 1
|
||||||
|
Bit8Mask: .res 1
|
||||||
|
Bit12Mask: .res 1
|
||||||
|
Bit34Mask: .res 1
|
||||||
|
Bit76Mask: .res 1
|
||||||
|
Bit8432Mask: .res 1
|
||||||
|
Bit8765Mask: .res 1
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------
|
||||||
|
; Game variables
|
||||||
|
numPlayers: .res 1 ; [0|1] where 0 is a 1 player game, 1 = 2 player game
|
||||||
|
activePlayer: .res 1 ; 0 for player 1, 1 for player 2
|
||||||
|
gameMode: .res 1 ; 0 for gameplay, 1 for trainer, 2 for edit
|
||||||
|
|
||||||
|
; per "run" variables
|
||||||
|
playerShipX: .res 1 ; x position in columns
|
||||||
|
playerShipY: .res 1 ; y position in rows
|
||||||
|
terrainOrigin: .res 1 ; from 0 to XSize - where to start world draw on screen
|
||||||
|
stopScrolling: .res 1 ; 1 - world will not move (for death)
|
||||||
|
playerDead: .res 1 ; 0 - gamePlay flow, > 0 players dead
|
||||||
|
monsterCnt: .res 1 ; skip # missiles before turning one into a monster
|
||||||
|
inFlight: .res 2 ; count launched missiles for launch control
|
||||||
|
victory: .res 1 ; 0 = not done, 1 = hit the nuke so done with run
|
||||||
|
nextStage: .res 1 ; -1 nothing, 0 at next stage, >0 count down
|
||||||
|
bufferInsert: .res 1 ; index where data gets added to buffers (right hand of screen)
|
||||||
|
bufferDraw: .res 1 ; index that corresponds to draw start (usually col 0 of screen)
|
||||||
|
bulletIndex: .res 1 ; like bufferDraw but bullets "travel" in opposite direction
|
||||||
|
dangerTickCount: .res 1 ; how often a dot is added to the danger line, when the world moves
|
||||||
|
dangerTickIdx: .res 1 ; the index into the text that holds the danger line of dots
|
||||||
|
moveHorz: .res 1 ; keeps track of horizontal movement - only moves every 2nd frame
|
||||||
|
moveVert: .res 1 ; keeps track of vertical movement - moves 4 rows but over 2 frames
|
||||||
|
|
||||||
|
; helper variables
|
||||||
|
updateHUD: .res 1 ; 0 - don't draw, 1+ - clean and redraw
|
||||||
|
flipFlop: .res 1 ; counter to advance explosion frames
|
||||||
|
|
||||||
|
Skip0x8F: .res 1 ; $8f zero page - paddl0? can't be used (can this variable location be asserted?)
|
||||||
|
|
||||||
|
backLayer: .res 1 ; [0|1] - Layer not shown to user *=(to be drawn to)
|
||||||
|
enemyHit: .res 1 ; the flags of the enemy destroyed in gameKillEnemy
|
||||||
|
enemyHitType: .res 1 ; 0 = nuke, 1 = missile, 2 = monster, 3 = radar, $ff - nothing
|
||||||
|
lastInput: .res 1 ; holds the value of the prev joystick frame
|
||||||
|
pause: .res 1 ; <> 0 when the game is paused
|
||||||
|
fireCoolDown: .res 1
|
Loading…
Reference in New Issue
Block a user