init files
1
.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
.DS_Store
|
||||||
2
README.md
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
actual code is in `loader/samples/minexample`
|
||||||
|
Uses Krill's loader
|
||||||
753
loader/Makefile
Executable file
|
|
@ -0,0 +1,753 @@
|
||||||
|
|
||||||
|
NOWORKINGCOPY = $(shell svn info > /dev/null 2>&1; echo $$?)
|
||||||
|
SVNVERSION = svnversion
|
||||||
|
ifeq ($(NOWORKINGCOPY),0)
|
||||||
|
VERSION = $(shell $(SVNVERSION) | tr -d [:cntrl:])
|
||||||
|
else
|
||||||
|
VERSION = $(shell $(GREP) -oP 'VERSION_STRING "\K[^"]+' ./version.inc)
|
||||||
|
endif
|
||||||
|
|
||||||
|
CD = cd
|
||||||
|
PRINTF = printf
|
||||||
|
MKDIR = mkdir
|
||||||
|
GREP = ggrep
|
||||||
|
ZIP = zip -9 --must-match
|
||||||
|
ZIP_NO_PATHS = $(ZIP) -j
|
||||||
|
ifneq ($(VERSION),)
|
||||||
|
ZIPFILE = loader-v$(VERSION).zip
|
||||||
|
LOADERTEST = loadertest-v$(VERSION).zip
|
||||||
|
else
|
||||||
|
ZIPFILE = loader.zip
|
||||||
|
LOADERTEST = loadertest.zip
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
SHAREDFOLDER = shared
|
||||||
|
LOADERFOLDER = $(notdir $(shell pwd))
|
||||||
|
DOCSFOLDER = $(LOADERFOLDER)/docs
|
||||||
|
SRCFOLDER = $(LOADERFOLDER)/src
|
||||||
|
INCFOLDER = $(LOADERFOLDER)/include
|
||||||
|
SAMPLESFOLDER = $(LOADERFOLDER)/samples
|
||||||
|
BUILDFOLDER = $(LOADERFOLDER)/build
|
||||||
|
TOOLSFOLDER = $(LOADERFOLDER)/tools
|
||||||
|
|
||||||
|
ZIPLIST += $(LOADERFOLDER)/README
|
||||||
|
|
||||||
|
ZIPLIST += $(SHAREDFOLDER)/standard.inc
|
||||||
|
ZIPLIST += $(SHAREDFOLDER)/cpu.inc
|
||||||
|
ZIPLIST += $(SHAREDFOLDER)/vic.inc
|
||||||
|
ZIPLIST += $(SHAREDFOLDER)/cia.inc
|
||||||
|
ZIPLIST += $(SHAREDFOLDER)/mmu.inc
|
||||||
|
ZIPLIST += $(SHAREDFOLDER)/vdc.inc
|
||||||
|
ZIPLIST += $(SHAREDFOLDER)/ted.inc
|
||||||
|
ZIPLIST += $(SHAREDFOLDER)/pio.inc
|
||||||
|
ZIPLIST += $(SHAREDFOLDER)/via.inc
|
||||||
|
ZIPLIST += $(SHAREDFOLDER)/kernal.inc
|
||||||
|
ZIPLIST += $(SHAREDFOLDER)/basic.inc
|
||||||
|
ZIPLIST += $(SHAREDFOLDER)/float.inc
|
||||||
|
|
||||||
|
ZIPLIST += $(LOADERFOLDER)/Makefile
|
||||||
|
ZIPLIST += $(LOADERFOLDER)/version.inc
|
||||||
|
|
||||||
|
ZIPLIST += $(DOCSFOLDER)/Prerequisites.txt
|
||||||
|
ZIPLIST += $(DOCSFOLDER)/Protocol.txt
|
||||||
|
|
||||||
|
DECOMPFOLDER = decompress
|
||||||
|
DRIVESFOLDER = drives
|
||||||
|
HALFOLDER = hal
|
||||||
|
ZIPLIST += $(SRCFOLDER)/Makefile
|
||||||
|
ZIPLIST += $(SRCFOLDER)/make-linkfile.pl
|
||||||
|
ZIPLIST += $(SRCFOLDER)/make-loadersymbolsinc.pl
|
||||||
|
ZIPLIST += $(SRCFOLDER)/$(DECOMPFOLDER)/b2decomp.s
|
||||||
|
ZIPLIST += $(SRCFOLDER)/$(DECOMPFOLDER)/bitnaxdecomp.s
|
||||||
|
ZIPLIST += $(SRCFOLDER)/$(DECOMPFOLDER)/doynaxdecomp.s
|
||||||
|
ZIPLIST += $(SRCFOLDER)/$(DECOMPFOLDER)/exodecomp.s
|
||||||
|
ZIPLIST += $(SRCFOLDER)/$(DECOMPFOLDER)/lcdecomp.s
|
||||||
|
ZIPLIST += $(SRCFOLDER)/$(DECOMPFOLDER)/lzsa2decomp.s
|
||||||
|
ZIPLIST += $(SRCFOLDER)/$(DECOMPFOLDER)/ncdecomp.s
|
||||||
|
ZIPLIST += $(SRCFOLDER)/$(DECOMPFOLDER)/pudecomp.s
|
||||||
|
ZIPLIST += $(SRCFOLDER)/$(DECOMPFOLDER)/subsizerdecomp.s
|
||||||
|
ZIPLIST += $(SRCFOLDER)/$(DECOMPFOLDER)/tcdecomp.s
|
||||||
|
ZIPLIST += $(SRCFOLDER)/$(DECOMPFOLDER)/tsdecomp.s
|
||||||
|
ZIPLIST += $(SRCFOLDER)/$(DECOMPFOLDER)/zx0decomp.s
|
||||||
|
ZIPLIST += $(SRCFOLDER)/$(DRIVESFOLDER)/drivecode-common.inc
|
||||||
|
ZIPLIST += $(SRCFOLDER)/$(DRIVESFOLDER)/drivecode1541.s
|
||||||
|
ZIPLIST += $(SRCFOLDER)/$(DRIVESFOLDER)/drivecode1571.s
|
||||||
|
ZIPLIST += $(SRCFOLDER)/$(DRIVESFOLDER)/drivecode1581.s
|
||||||
|
ZIPLIST += $(SRCFOLDER)/$(HALFOLDER)/hal.inc
|
||||||
|
ZIPLIST += $(SRCFOLDER)/$(HALFOLDER)/hal-c64-c128.inc
|
||||||
|
ZIPLIST += $(SRCFOLDER)/$(HALFOLDER)/hal-c16.inc
|
||||||
|
ZIPLIST += $(SRCFOLDER)/install.s
|
||||||
|
ZIPLIST += $(SRCFOLDER)/resident.s
|
||||||
|
ZIPLIST += $(SRCFOLDER)/customdrivecode.s
|
||||||
|
ZIPLIST += $(SRCFOLDER)/save.s
|
||||||
|
|
||||||
|
ZIPLIST += $(INCFOLDER)/config.inc
|
||||||
|
ZIPLIST += $(INCFOLDER)/loader.inc
|
||||||
|
|
||||||
|
BENCHMARKFOLDER = benchmark
|
||||||
|
CC65FOLDER = cc65
|
||||||
|
DRIVECODEFOLDER = drivecode
|
||||||
|
MINEXAMPLEFOLDER = minexample
|
||||||
|
RESOURCESFOLDER = resources
|
||||||
|
SAVEFOLDER = save
|
||||||
|
STANDALONEFOLDER = standalone
|
||||||
|
TESTFOLDER = test
|
||||||
|
TURNDISKFOLDER = turndisk
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(BENCHMARKFOLDER)/Makefile
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(BENCHMARKFOLDER)/benchmark.s
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(BENCHMARKFOLDER)/loaderconfig.inc
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(BENCHMARKFOLDER)/benchmark-bitfire.mon
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(BENCHMARKFOLDER)/benchmark-spindle.mon
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(BENCHMARKFOLDER)/make-tex-graph-bitfire.lua
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(BENCHMARKFOLDER)/make-tex-graph-spindle-code.lua
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(BENCHMARKFOLDER)/make-tex-graph-spindle-graphics.lua
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(CC65FOLDER)/Makefile
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(CC65FOLDER)/c-program.c
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(CC65FOLDER)/Linkfile
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(CC65FOLDER)/loaderconfig.inc
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(DRIVECODEFOLDER)/Makefile
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(DRIVECODEFOLDER)/drivecode.s
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(DRIVECODEFOLDER)/loaderconfig.inc
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(MINEXAMPLEFOLDER)/Makefile
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(MINEXAMPLEFOLDER)/minexample.s
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(MINEXAMPLEFOLDER)/loaderconfig.inc
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(RESOURCESFOLDER)/pic1.bin
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(RESOURCESFOLDER)/pic2.bin
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(RESOURCESFOLDER)/bootblock.bin
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(RESOURCESFOLDER)/oxyron_oneder.prg
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(RESOURCESFOLDER)/doom_c128.prg
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(RESOURCESFOLDER)/threeve.prg
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(RESOURCESFOLDER)/skew1.prg
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(RESOURCESFOLDER)/test
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(RESOURCESFOLDER)/a
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(RESOURCESFOLDER)/b
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(RESOURCESFOLDER)/c
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(RESOURCESFOLDER)/d
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(RESOURCESFOLDER)/e
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(RESOURCESFOLDER)/f
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(RESOURCESFOLDER)/g
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(RESOURCESFOLDER)/h
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(RESOURCESFOLDER)/i
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(RESOURCESFOLDER)/j
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(RESOURCESFOLDER)/k
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(RESOURCESFOLDER)/l
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(RESOURCESFOLDER)/m
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(RESOURCESFOLDER)/n
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(RESOURCESFOLDER)/o
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(RESOURCESFOLDER)/p
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(RESOURCESFOLDER)/q
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(RESOURCESFOLDER)/r
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(RESOURCESFOLDER)/x
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(RESOURCESFOLDER)/y
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(SAVEFOLDER)/Makefile
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(SAVEFOLDER)/save.s
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(SAVEFOLDER)/loaderconfig.inc
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(STANDALONEFOLDER)/Makefile
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(STANDALONEFOLDER)/Linkfile-c64
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(STANDALONEFOLDER)/Linkfile-c128
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(STANDALONEFOLDER)/Linkfile-c16
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(STANDALONEFOLDER)/standalone.s
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(STANDALONEFOLDER)/loaderconfig.inc
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(TESTFOLDER)/Makefile
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(TESTFOLDER)/Linkfile
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(TESTFOLDER)/test.s
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(TURNDISKFOLDER)/Makefile
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(TURNDISKFOLDER)/Linkfile
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(TURNDISKFOLDER)/turndisk.s
|
||||||
|
ZIPLIST += $(SAMPLESFOLDER)/$(TURNDISKFOLDER)/loaderconfig.inc
|
||||||
|
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/compressedfileconverter.pl
|
||||||
|
|
||||||
|
CC1541FOLDER = cc1541
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(CC1541FOLDER)/LICENSE.txt
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(CC1541FOLDER)/README.md
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(CC1541FOLDER)/Makefile
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(CC1541FOLDER)/cc1541.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(CC1541FOLDER)/cc1541.1.txt.in
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(CC1541FOLDER)/cc1541.sln
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(CC1541FOLDER)/cc1541.vcxproj
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(CC1541FOLDER)/cc1541.vcxproj.filters
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(CC1541FOLDER)/test_cc1541.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(CC1541FOLDER)/test_cc1541.vcxproj
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(CC1541FOLDER)/test_cc1541.vcxproj.filters
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(CC1541FOLDER)/transwarp\ v0.84.prg
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(CC1541FOLDER)/transwarp\ v0.86.prg
|
||||||
|
|
||||||
|
B2FOLDER = b2
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(B2FOLDER)/Makefile
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(B2FOLDER)/bb.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(B2FOLDER)/bb.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(B2FOLDER)/cruncher.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(B2FOLDER)/cruncher.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(B2FOLDER)/file.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(B2FOLDER)/file.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(B2FOLDER)/Decruncher.inc
|
||||||
|
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/bitnax-07a8c67/lz.c
|
||||||
|
|
||||||
|
DOYNAXLZFOLDER = doynamite1.1
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(DOYNAXLZFOLDER)/readme.txt
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(DOYNAXLZFOLDER)/decrunch.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(DOYNAXLZFOLDER)/lz.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(DOYNAXLZFOLDER)/sfx.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(DOYNAXLZFOLDER)/test.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(DOYNAXLZFOLDER)/simple/decrunch.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(DOYNAXLZFOLDER)/simple/lz.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(DOYNAXLZFOLDER)/krill/doynaxdecomp.s
|
||||||
|
|
||||||
|
EXOFOLDER = exomizer-3.1
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/changelog.txt
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/exo20info.txt
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/exo31info.txt
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/exobasic10b2.txt
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/Makefile
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/Makefile.test
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/Makefile.testP16
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/6502emu.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/6502emu.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/areatrace.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/areatrace.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/asm.tab.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/asm.tab.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/asm.y
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/asm.yy
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/b2buf.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/bas_main.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/bprg_actions.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/bprg_link_patch.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/bprg_renumber.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/bprg_trampoline.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/bprg.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/bprg.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/buf_io.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/buf_io.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/buf.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/buf.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/callback.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/chunkpool.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/chunkpool.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/common.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/desfx.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/desfx.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/exo_helper.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/exo_helper.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/exo_main.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/exo_raw.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/exo_util.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/exo_util.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/exodec.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/exodec.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/expr.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/expr.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/flags.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/getflag.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/getflag.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/int.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/lex.yy.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/log.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/log.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/map.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/map.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/match.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/match.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/named_buffer.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/named_buffer.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/optimal.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/optimal.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/output.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/output.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/parse.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/parse.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/pc.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/pc.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/perf.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/perf.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/progress.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/progress.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/radix.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/radix.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/search.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/search.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/vec.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/vec.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/table.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/table.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/src/sfxdecr.s
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/exodecrs/Makefile
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/exodecrs/README_exo3.txt
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/exodecrs/c64.cfg
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/exodecrs/data.bin
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/exodecrs/exodecrunch.s
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/exodecrs/exostreamdecr1.s
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/exodecrs/exostreamdecr2.s
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/exodecrs/main.s
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/exodecrs/main1.s
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/exodecrs/main2.s
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/exodecrs/testrun.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/exodecrs/acme/Makefile
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/exodecrs/acme/exodecrunch.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/exodecrs/acme/main.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/exodecrs/acme/split/Makefile
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/exodecrs/acme/split/main.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/exodecrs/acme/split/data.asm.template
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/exodecrs/dasm/Makefile
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/exodecrs/dasm/exodecrunch.s
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/exodecrs/dasm/main.s
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/exodecrs/dasm/split/Makefile
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/exodecrs/dasm/split/main.s
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/exodecrs/dasm/split/data.s.template
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/exodecrs/perf/Makefile
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/exodecrs/perf/data.raw
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/exodecrs/split/Makefile
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/exodecrs/split/main.s
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/exodecrs/split/data.s.template
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/Makefile
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/exodecr.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/exodecr.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/exodecrunch.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/exodecrunch.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/main.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/main2.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/test1.bin
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/test2.bin
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/test3.bin
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/test4.bin
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/6809/exo2_final.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/6809/exo2_puls.txt
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/6809/README_exo3.txt
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/8080/P43/deexo.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/8080/P43E/deexo.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/8080/P47T4/deexo.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/8080/README.txt
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/8086/P47/deexo.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/8086/README.txt
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/thumb2/speed.S
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/thumb2/universal.S
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/thumb2/README.txt
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/z80/deexoopt_b0.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/z80/deexoopt_b1.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/z80/deexoopt_b2.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/z80/deexoopt_b3.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/z80/deexoopt_b4.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/z80/deexoopt_f0.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/z80/deexoopt_f1.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/z80/deexoopt_f2.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/z80/deexoopt_f3.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/z80/deexoopt_f4.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/z80/deexoopt.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/z80/readme.txt
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/rawdecrs/z80/lgpl-2.1.txt
|
||||||
|
#ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/win32/exobasic.exe
|
||||||
|
#ZIPLIST += $(TOOLSFOLDER)/$(EXOFOLDER)/win32/exomizer.exe
|
||||||
|
|
||||||
|
LZSAFOLDER = lzsa
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/Makefile
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/README.md
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/.gitignore
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/BlockFormat_LZSA1.md
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/BlockFormat_LZSA2.md
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/LICENSE
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/LICENSE.cc0.md
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/LICENSE.zlib.md
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/StreamFormat.md
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/pareto_graph.png
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/lzsa.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/matchfinder.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/matchfinder.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/shrink_block_v1.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/shrink_block_v1.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/shrink_block_v2.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/shrink_block_v2.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/shrink_block_v2_zx0_encoding.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/shrink_context.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/shrink_context.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/shrink_inmem.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/shrink_inmem.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/shrink_streaming.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/shrink_streaming.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/stream.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/stream.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/dictionary.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/dictionary.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/expand_block_v1.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/expand_block_v1.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/expand_block_v2.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/expand_block_v2.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/expand_context.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/expand_context.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/expand_inmem.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/expand_inmem.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/expand_streaming.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/expand_streaming.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/format.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/frame.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/frame.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/lib.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/libdivsufsort/.gitignore
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/libdivsufsort/CHANGELOG.md
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/libdivsufsort/CMakeLists.txt
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/libdivsufsort/CMakeModules
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/libdivsufsort/CMakeModules/AppendCompilerFlags.cmake
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/libdivsufsort/CMakeModules/CheckFunctionKeywords.cmake
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/libdivsufsort/CMakeModules/CheckLFS.cmake
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/libdivsufsort/CMakeModules/ProjectCPack.cmake
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/libdivsufsort/CMakeModules/cmake_uninstall.cmake.in
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/libdivsufsort/LICENSE
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/libdivsufsort/README.md
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/libdivsufsort/VERSION.cmake
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/libdivsufsort/examples/CMakeLists.txt
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/libdivsufsort/examples/bwt.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/libdivsufsort/examples/mksary.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/libdivsufsort/examples/sasearch.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/libdivsufsort/examples/suftest.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/libdivsufsort/examples/unbwt.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/libdivsufsort/include/CMakeLists.txt
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/libdivsufsort/include/config.h.cmake
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/libdivsufsort/include/divsufsort.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/libdivsufsort/include/divsufsort.h.cmake
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/libdivsufsort/include/divsufsort_config.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/libdivsufsort/include/divsufsort_private.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/libdivsufsort/include/lfs.h.cmake
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/libdivsufsort/lib/CMakeLists.txt
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/libdivsufsort/lib/divsufsort.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/libdivsufsort/lib/divsufsort_utils.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/libdivsufsort/lib/sssort.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/libdivsufsort/lib/trsort.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/libdivsufsort/pkgconfig/CMakeLists.txt
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/src/libdivsufsort/pkgconfig/libdivsufsort.pc.cmake
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/VS2017/.gitignore
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/VS2017/lzsa.sln
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/VS2017/lzsa.vcxproj
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/VS2017/lzsa.vcxproj.filters
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/VS2017/lzsa.vcxproj.user
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/Xcode/lzsa.xcodeproj
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/Xcode/lzsa.xcodeproj/project.pbxproj
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/asm/6502
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/asm/6502/decompress_fast_v1.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/asm/6502/decompress_fast_v2.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/asm/6502/decompress_faster_v1.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/asm/6502/decompress_faster_v2.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/asm/6502/decompress_small_v1.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/asm/6502/decompress_small_v2.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/asm/65816/decompress_v1.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/asm/65816/decompress_v2.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/asm/6809/unlzsa1-6309.s
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/asm/6809/unlzsa1.s
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/asm/6809/unlzsa1b-6309.s
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/asm/6809/unlzsa1b.s
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/asm/6809/unlzsa2-6309.s
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/asm/6809/unlzsa2.s
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/asm/6809/unlzsa2b-6309.s
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/asm/6809/unlzsa2b.s
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/asm/8088/LZSA1FTA.ASM
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/asm/8088/LZSA1JMP.ASM
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/asm/8088/LZSA2FTA.ASM
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/asm/8088/decompress_small_v1.S
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/asm/8088/decompress_small_v2.S
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/asm/8088/decompress_speed_v1.S
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/asm/8088/decompress_speed_v2.S
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/asm/x86/decompress_small_v1.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/asm/x86/decompress_small_v2.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/asm/z80/unlzsa1_fast.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/asm/z80/unlzsa1_small.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/asm/z80/unlzsa2_fast.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(LZSAFOLDER)/asm/z80/unlzsa2_small.asm
|
||||||
|
|
||||||
|
NCFOLDER = nucrunch-1.0.1
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(NCFOLDER)/Makefile
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(NCFOLDER)/MANIFEST
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(NCFOLDER)/Cargo.toml
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(NCFOLDER)/readme.txt
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(NCFOLDER)/decrunch.a65
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(NCFOLDER)/rdecrunch.a65
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(NCFOLDER)/boot.s
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(NCFOLDER)/sboot.s
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(NCFOLDER)/decrunch.s
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(NCFOLDER)/rdecrunch.s
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(NCFOLDER)/srdecrunch.s
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(NCFOLDER)/src/boot.rs
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(NCFOLDER)/src/lib.rs
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(NCFOLDER)/src/main.rs
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(NCFOLDER)/test/Makefile
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(NCFOLDER)/test/cbmcat
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(NCFOLDER)/test/crc8.py
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(NCFOLDER)/test/mkrings.py
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(NCFOLDER)/test/gentest.py
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(NCFOLDER)/test/testbed_ca65.s
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(NCFOLDER)/test/testbed.a65
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(NCFOLDER)/test/rtestbed.a65
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(NCFOLDER)/test/sea_test.s
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(NCFOLDER)/test/startaddr
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(NCFOLDER)/test/endaddr
|
||||||
|
|
||||||
|
PUFOLDER = pucrunch
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(PUFOLDER)/Makefile
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(PUFOLDER)/smakefile
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(PUFOLDER)/pucrunch.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(PUFOLDER)/pucrunch.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(PUFOLDER)/uncrunch.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(PUFOLDER)/uncrunch-z80.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(PUFOLDER)/sa_uncrunch.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(PUFOLDER)/cbmcombine.c
|
||||||
|
|
||||||
|
SUBSIZERFOLDER = subsizer-0.7pre1
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/README.txt
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/LICENSE.txt
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/Makefile
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/bitfunc.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/bitfunc.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/bits-base.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/bits-base.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/buffer.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/buffer.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/crunch_normal.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/crunch_normal.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/global.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/global.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/histogram.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/histogram.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/match.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/match.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/memory.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/memory.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/message.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/message.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/params.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/params.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/pathfinder.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/pathfinder.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/subsizer.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/universal.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/universal.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/utils.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/utils.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/sfx/Makefile
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/sfx/decrunch_normal_dirty.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/sfx/decrunch_normal.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/sfx/decrunchers_data.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/sfx/decrunchers.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/sfx/detect_start.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/sfx/detect_start.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/sfx/fold.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/sfx/fold.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/sfx/generate_sfx.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/sfx/generate_sfx.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/sfx/mach_c64.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/sfx/mach_c64.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src/sfx/ops6502.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(SUBSIZERFOLDER)/standalone/decrunch_normal.asm
|
||||||
|
|
||||||
|
TCFOLDER = tinycrunch_v1.2
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(TCFOLDER)/Makefile
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(TCFOLDER)/readme.txt
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(TCFOLDER)/bmp.bin
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(TCFOLDER)/bmp.prg
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(TCFOLDER)/tc_boot.prg
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(TCFOLDER)/tc_boot.s
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(TCFOLDER)/tc_decode.s
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(TCFOLDER)/tc_decode_f.s
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(TCFOLDER)/tc_encode.py
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(TCFOLDER)/test/cbmcat
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(TCFOLDER)/test/mkbmp.py
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(TCFOLDER)/test/test.s
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(TCFOLDER)/test/testbin.s
|
||||||
|
|
||||||
|
TSCRUNCHFOLDER = tscrunch
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(TSCRUNCHFOLDER)/decrunch.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(TSCRUNCHFOLDER)/decrunch_extreme.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(TSCRUNCHFOLDER)/decrunch_small.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(TSCRUNCHFOLDER)/readme.txt
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(TSCRUNCHFOLDER)/tscrunch.go
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(TSCRUNCHFOLDER)/tscrunch.py
|
||||||
|
|
||||||
|
WCRUSHFOLDER = wcrush
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(WCRUSHFOLDER)/Makefile
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(WCRUSHFOLDER)/LICENSE.TXT
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(WCRUSHFOLDER)/README.TXT
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(WCRUSHFOLDER)/decrush/decrush.tas
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(WCRUSHFOLDER)/wca/main.cpp
|
||||||
|
#ZIPLIST += $(TOOLSFOLDER)/$(WCRUSHFOLDER)/wca/wca.exe
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(WCRUSHFOLDER)/wcrush/main.cpp
|
||||||
|
#ZIPLIST += $(TOOLSFOLDER)/$(WCRUSHFOLDER)/wcrush/wcrush.exe
|
||||||
|
|
||||||
|
ZX0FOLDER = dali
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/Makefile
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/dali.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/depack.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/dzx0_dali.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/dzx0_orig_zx0_v1.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/dzx0_orig_zx0_v2.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/sfx_fast.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/sfx_small.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/sfx.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/testfile.lz
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/Makefile
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/LICENSE
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/LICENSE.cc0.md
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/LICENSE.zlib.md
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/README.md
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/asm/6502/zx0_6502.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/asm/8088/unzx0_8088.S
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/asm/68000/unzx0_68000.S
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/asm/HuC6280/unpack-zx0.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/asm/Z80/unzx0v1_fast.asm
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/salvador.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/shrink.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/expand.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/matchfinder.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/matchfinder.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libsalvador.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/format.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/shrink.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/expand.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/lib
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/lib/sssort.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/lib/trsort.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/lib/divsufsort.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/lib/divsufsort_utils.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/lib/CMakeLists.txt
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/CHANGELOG.md
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/pkgconfig
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/pkgconfig/CMakeLists.txt
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/pkgconfig/libdivsufsort.pc.cmake
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/CMakeModules
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/CMakeModules/ProjectCPack.cmake
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/CMakeModules/CheckFunctionKeywords.cmake
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/CMakeModules/cmake_uninstall.cmake.in
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/CMakeModules/AppendCompilerFlags.cmake
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/CMakeModules/CheckLFS.cmake
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/README.md
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/CMakeLists.txt
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/examples
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/examples/suftest.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/examples/unbwt.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/examples/mksary.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/examples/sasearch.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/examples/CMakeLists.txt
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/examples/bwt.c
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/LICENSE
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/include
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/include/divsufsort_config.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/include/divsufsort_private.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/include/lfs.h.cmake
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/include/config.h.cmake
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/include/CMakeLists.txt
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/include/divsufsort.h.cmake
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/include/divsufsort.h
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/src/libdivsufsort/VERSION.cmake
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/VS2019
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/VS2019/salvador.vcxproj.user
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/VS2019/salvador.vcxproj
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/VS2019/salvador.sln
|
||||||
|
ZIPLIST += $(TOOLSFOLDER)/$(ZX0FOLDER)/salvador/VS2019/salvador.vcxproj.filters
|
||||||
|
|
||||||
|
|
||||||
|
DISKIMAGES = $(BUILDFOLDER)/loadertest-c64.d64
|
||||||
|
DISKIMAGES += $(BUILDFOLDER)/loadertest-c64.d71
|
||||||
|
DISKIMAGES += $(BUILDFOLDER)/loadertest-c64.d81
|
||||||
|
DISKIMAGES += $(BUILDFOLDER)/loader-c64.prg
|
||||||
|
DISKIMAGES += $(BUILDFOLDER)/install-c64.prg
|
||||||
|
DISKIMAGES += $(BUILDFOLDER)/loadersymbols-c64.inc
|
||||||
|
|
||||||
|
DISKIMAGES += $(BUILDFOLDER)/loadertest-c128.d64
|
||||||
|
DISKIMAGES += $(BUILDFOLDER)/loadertest-c128.d71
|
||||||
|
DISKIMAGES += $(BUILDFOLDER)/loadertest-c128.d81
|
||||||
|
DISKIMAGES += $(BUILDFOLDER)/loader-c128.prg
|
||||||
|
DISKIMAGES += $(BUILDFOLDER)/install-c128.prg
|
||||||
|
DISKIMAGES += $(BUILDFOLDER)/loadersymbols-c128.inc
|
||||||
|
|
||||||
|
DISKIMAGES += $(BUILDFOLDER)/loadertest-c16.d64
|
||||||
|
DISKIMAGES += $(BUILDFOLDER)/loadertest-c16.d71
|
||||||
|
DISKIMAGES += $(BUILDFOLDER)/loadertest-c16.d81
|
||||||
|
DISKIMAGES += $(BUILDFOLDER)/loader-c16.prg
|
||||||
|
DISKIMAGES += $(BUILDFOLDER)/install-c16.prg
|
||||||
|
DISKIMAGES += $(BUILDFOLDER)/loadersymbols-c16.inc
|
||||||
|
|
||||||
|
ZIPLIST += $(DISKIMAGES)
|
||||||
|
|
||||||
|
|
||||||
|
default: prg
|
||||||
|
|
||||||
|
loader:
|
||||||
|
$(MAKE) -C src
|
||||||
|
|
||||||
|
prg bin binary:
|
||||||
|
$(MAKE) -C src prg
|
||||||
|
|
||||||
|
lib library:
|
||||||
|
$(MAKE) -C src lib
|
||||||
|
|
||||||
|
prg-c64:
|
||||||
|
$(MAKE) -C src PLATFORM=c64 prg
|
||||||
|
|
||||||
|
prg-c128:
|
||||||
|
$(MAKE) -C src PLATFORM=c128 prg
|
||||||
|
|
||||||
|
prg-c16:
|
||||||
|
$(MAKE) -C src PLATFORM=c16 prg
|
||||||
|
|
||||||
|
run:
|
||||||
|
$(CD) ..; $(MAKE) -C $(SAMPLESFOLDER)/$(TESTFOLDER) run
|
||||||
|
|
||||||
|
$(BUILDFOLDER)/loadertest-c64.d64:
|
||||||
|
$(CD) ..; $(MAKE) -C $(SAMPLESFOLDER)/$(TESTFOLDER) all
|
||||||
|
|
||||||
|
$(BUILDFOLDER)/loadertest-c128.d64:
|
||||||
|
$(CD) ..; $(MAKE) -C $(SAMPLESFOLDER)/$(TESTFOLDER) PLATFORM=c128 all
|
||||||
|
|
||||||
|
$(BUILDFOLDER)/loadertest-c16.d64:
|
||||||
|
$(CD) ..; $(MAKE) -C $(SAMPLESFOLDER)/$(TESTFOLDER) PLATFORM=c16 all
|
||||||
|
|
||||||
|
zip: prg-c64 prg-c128 prg-c16 $(BUILDFOLDER)/loadertest-c64.d64 $(BUILDFOLDER)/loadertest-c128.d64 $(BUILDFOLDER)/loadertest-c16.d64 version.inc
|
||||||
|
$(CD) ..; $(ZIP) $(ZIPFILE) $(ZIPLIST)
|
||||||
|
|
||||||
|
loadertest: $(BUILDFOLDER)/loadertest-c64.d64 $(BUILDFOLDER)/loadertest-c128.d64 $(BUILDFOLDER)/loadertest-c16.d64 version.inc
|
||||||
|
$(CD) ..; $(ZIP_NO_PATHS) $(LOADERTEST) $(DISKIMAGES)
|
||||||
|
|
||||||
|
.PHONY: tools cc1541 bitnax b2 doynax exomizer levelcrush lzsa2 nucrunch pucrunch subsizer zx0
|
||||||
|
tools: cc1541 bitnax b2 doynax exomizer levelcrush lzsa2 nucrunch pucrunch subsizer zx0
|
||||||
|
|
||||||
|
bitnax:
|
||||||
|
$(CC) ../$(TOOLSFOLDER)/bitnax-07a8c67/lz.c -o tools/bitnax-07a8c67/lz
|
||||||
|
|
||||||
|
b2:
|
||||||
|
$(MAKE) -C ../$(TOOLSFOLDER)/$(B2FOLDER)
|
||||||
|
|
||||||
|
doynax:
|
||||||
|
$(CC) ../$(TOOLSFOLDER)/$(DOYNAXLZFOLDER)/lz.c -o ../$(TOOLSFOLDER)/$(DOYNAXLZFOLDER)/lz
|
||||||
|
|
||||||
|
exomizer:
|
||||||
|
$(MAKE) -C ../$(TOOLSFOLDER)/$(EXOFOLDER)/src
|
||||||
|
|
||||||
|
levelcrush:
|
||||||
|
$(MAKE) -C ../$(TOOLSFOLDER)/$(WCRUSHFOLDER)
|
||||||
|
|
||||||
|
lzsa2:
|
||||||
|
$(MAKE) -C ../$(TOOLSFOLDER)/$(LZSAFOLDER)
|
||||||
|
|
||||||
|
nucrunch:
|
||||||
|
$(MAKE) -C ../$(TOOLSFOLDER)/$(NCFOLDER)
|
||||||
|
|
||||||
|
pucrunch:
|
||||||
|
$(MAKE) -C ../$(TOOLSFOLDER)/$(PUFOLDER)
|
||||||
|
|
||||||
|
subsizer:
|
||||||
|
$(MAKE) -C ../$(TOOLSFOLDER)/$(SUBSIZERFOLDER)/src
|
||||||
|
|
||||||
|
zx0:
|
||||||
|
$(MAKE) -C ../$(TOOLSFOLDER)/$(ZX0FOLDER)
|
||||||
|
|
||||||
|
cc1541:
|
||||||
|
$(MAKE) -C ../$(TOOLSFOLDER)/$(CC1541FOLDER)
|
||||||
|
|
||||||
|
ifeq ($(NOWORKINGCOPY),0)
|
||||||
|
version.inc: ../.svn/entries
|
||||||
|
$(PRINTF) '.define REPOSITORY_VERSION ' > $@
|
||||||
|
-$(PRINTF) '%d' $(VERSION) >> $@
|
||||||
|
$(PRINTF) '\n' >> $@
|
||||||
|
$(PRINTF) '.define REPOSITORY_VERSION_STRING "' >> $@
|
||||||
|
$(PRINTF) '%s' $(VERSION) >> $@
|
||||||
|
$(PRINTF) '"\n' >> $@
|
||||||
|
endif
|
||||||
604
loader/README
Normal file
|
|
@ -0,0 +1,604 @@
|
||||||
|
Krill's loader
|
||||||
|
|
||||||
|
November 2022
|
||||||
|
Krill@Plush.de
|
||||||
|
|
||||||
|
|
||||||
|
What it is
|
||||||
|
----------
|
||||||
|
This is an easy-to-use arbitrarily interruptible flexible general-purpose
|
||||||
|
file-based disk loader system with optional decompression and limited
|
||||||
|
save-with-replace capability, aiming to provide maximum loading speed while
|
||||||
|
retaining full standard Commodore DOS format compatibility and also having a
|
||||||
|
reasonably small memory footprint.
|
||||||
|
Being fully standard DOS format compatible, disks and disk images may be
|
||||||
|
written by numerous available third-party copy, transfer, and disk image
|
||||||
|
manipulation programs.
|
||||||
|
The selection of byte-stream based compression algorithms includes many popular
|
||||||
|
crunchers.
|
||||||
|
Natively supported drives include all variants of the classic Commodore drive
|
||||||
|
families of 1541, 1570/71, 1581, as well as CMD FD drives, and 1541U.
|
||||||
|
Using the KERNAL fallback option, devices like SD2IEC (slow), IDE64 (fast), and
|
||||||
|
netload are supported non-natively.
|
||||||
|
Both PAL and NTSC video systems are supported.
|
||||||
|
The drive's CPU may run custom code provided by the user.
|
||||||
|
|
||||||
|
|
||||||
|
What it isn't
|
||||||
|
-------------
|
||||||
|
Simply put, anything that's not a read-only disk driver (with limited saving
|
||||||
|
capabilities).
|
||||||
|
Although any of the following features and functionality may be built on top of
|
||||||
|
it, it is not:
|
||||||
|
- a DOS: it cannot save to newly-created files, format disks, provide random
|
||||||
|
access below file level, or otherwise organise data on a disk
|
||||||
|
- a framework of any kind: it's only active when you tell it to, it does not do
|
||||||
|
anything in the background by itself, and the machine is fully yours when the
|
||||||
|
loader is idle
|
||||||
|
- a memory expansion server: files are not cached in REU, GeoRAM, RAMLink,
|
||||||
|
RAMDrive, or similar devices
|
||||||
|
- loading in an interrupt handler or another mainline thread: this can easily
|
||||||
|
and flexibly be implemented by the user
|
||||||
|
|
||||||
|
|
||||||
|
Features
|
||||||
|
--------
|
||||||
|
- maximum raw loading speed of 7.7 kB/s (~20x) on 1541, typical speed is around
|
||||||
|
7 kB/s (~18x)
|
||||||
|
- resident size: $01f9 bytes for combined load+depack using ZX0 (fits in
|
||||||
|
$0200..$03f8), $01fb bytes with TSCrunch (fits in $0200..$03fa), $e0 bytes
|
||||||
|
load-raw only
|
||||||
|
- IRQ/NMI/DMA/sprites/badlines are allowed without restrictions
|
||||||
|
- 2bit+ATN protocol (72 cycles per byte), multiple drives on the bus are
|
||||||
|
allowed, but loading only from the primary drive
|
||||||
|
- supported crunchers: Bitnax, Byteboozer2, Doynax-LZ, Exomizer, Levelcrush,
|
||||||
|
LZSA2, NuCrunch, Pucrunch, Subsizer, tinycrunch, TSCrunch, ZX0
|
||||||
|
- depacking fully in-place using Bitnax, LZSA2, tinycrunch, TSCrunch or ZX0,
|
||||||
|
no clobbered bytes beyond unpacked data
|
||||||
|
- loading files in arbitrary order via directory with 0-terminated filename
|
||||||
|
strings
|
||||||
|
- loadnext functionality for sequential loading without specifying subsequent
|
||||||
|
filenames
|
||||||
|
- load address override for raw and crunched files
|
||||||
|
- PAL/NTSC support, NTSC is optional
|
||||||
|
- returns status codes for error checking and multiple disk handling
|
||||||
|
- optional loading and decompression to RAM at $d000..$dfff
|
||||||
|
- optional saving to pre-existing save-slot files
|
||||||
|
- optional memory decompression without loading
|
||||||
|
- optional loading via shadow directory for unrestricted dir-art
|
||||||
|
- custom drive code API facilitating co-processing on the drive's CPU
|
||||||
|
- full on-the-fly block GCR read+decode+checksumming
|
||||||
|
- native interleave at 100% CPU for loading uncompressed files is 3 revolutions
|
||||||
|
per track on tracks 18+, 4 on tracks 1-17, and 4 for all tracks for
|
||||||
|
compressed files
|
||||||
|
- implements Shrydar stepping for minimised seek time to an adjacent track
|
||||||
|
- free relocation of install routine, resident/transient portions and zeropage
|
||||||
|
variables
|
||||||
|
|
||||||
|
|
||||||
|
Folder structure overview
|
||||||
|
-------------------------
|
||||||
|
- loader this
|
||||||
|
- build output files
|
||||||
|
- docs documentation
|
||||||
|
- include include files
|
||||||
|
- src source code
|
||||||
|
- decompress decrunch routines
|
||||||
|
- drives drive-side code
|
||||||
|
- hal hardware abstraction layer implementations
|
||||||
|
- samples example projects
|
||||||
|
- benchmark benchmark using Bitfire/Sparkle corpus
|
||||||
|
- cc65 using the loader from a C program
|
||||||
|
- drivecode running custom code in the drive
|
||||||
|
- minexample minimum example
|
||||||
|
- resources graphics and other binaries
|
||||||
|
- save overwriting data in save-slot files
|
||||||
|
- standalone use loader from BASIC prompt
|
||||||
|
- test test application
|
||||||
|
- turndisk disk change handling
|
||||||
|
- tools utilities
|
||||||
|
- b2 Byteboozer2
|
||||||
|
- bitnax-07a8c67 Bitnax
|
||||||
|
- cc1541 use cc1541 for optimised disk images
|
||||||
|
- dali ZX0
|
||||||
|
- doynamite1.1 Doynax-LZ
|
||||||
|
- exomizer-3.1 Exomizer
|
||||||
|
- lzsa LZSA(2)
|
||||||
|
- nucrunch-1.0.1 NuCrunch
|
||||||
|
- pucrunch Pucrunch
|
||||||
|
- subsizer-0.7pre1 Subsizer
|
||||||
|
- tinycrunch_v1.2 tinycrunch
|
||||||
|
- tscrunch TSCrunch
|
||||||
|
- wcrush LevelCrush
|
||||||
|
- shared miscellaneous include files
|
||||||
|
|
||||||
|
|
||||||
|
Building the binaries
|
||||||
|
---------------------
|
||||||
|
Prebuilt binaries (install-c64.prg, loader-c64.prg and loadersymbols-c64.inc)
|
||||||
|
can be found in loader/build.
|
||||||
|
|
||||||
|
To build them, prerequisites are ca65 (see https://www.cc65.org,
|
||||||
|
https://cc65.github.io, or https://github.com/cc65/cc65), make, and perl.
|
||||||
|
In loader or loader/src, run
|
||||||
|
|
||||||
|
$ make prg
|
||||||
|
|
||||||
|
This will produce (and overwrite) install-c64.prg, loader-c64.prg, and
|
||||||
|
loadersymbols-c64.inc in loader/build.
|
||||||
|
|
||||||
|
To specify zeropage, install and resident addresses, run, e.g.,
|
||||||
|
|
||||||
|
$ make prg ZP=e8 INSTALL=1000 RESIDENT=ce00
|
||||||
|
|
||||||
|
which will produce binaries using zeropage addresses $e8 and up, with the
|
||||||
|
install routine located at $1000 and the resident portion at $ce00.
|
||||||
|
|
||||||
|
The two .prg files are regular C-64 program files with 2 bytes load address and
|
||||||
|
can be linked statically using .incbin or similar features of any 6502
|
||||||
|
assembler/linker.
|
||||||
|
The symbols file is a text file defining the call addresses and zeropage
|
||||||
|
variables in canonical 6502 assembler syntax and is intended to be included from
|
||||||
|
assembly source code.
|
||||||
|
|
||||||
|
|
||||||
|
Configuration
|
||||||
|
-------------
|
||||||
|
The main configuration file is loader/include/config.inc. The individual
|
||||||
|
settings of the options are evaluated at build time and directly control various
|
||||||
|
aspects of the loader's functionality and its memory footprint.
|
||||||
|
This include file can be overridden by setting the EXTCONFIGPATH environment
|
||||||
|
variable to a folder containing a file named loaderconfig.inc.
|
||||||
|
|
||||||
|
Note that NTSC support is optional, and disabled in the pre-built binaries. This
|
||||||
|
is because it slightly reduces PAL performance. However, resident portion
|
||||||
|
incarnations with and without NTSC support can be selected at run-time in order
|
||||||
|
to achieve maximum performance for both PAL and NTSC.
|
||||||
|
|
||||||
|
Refer to loader/samples for various example projects using different individual
|
||||||
|
external configuration files.
|
||||||
|
|
||||||
|
|
||||||
|
Basic operation
|
||||||
|
---------------
|
||||||
|
Before the loader can operate, its drive-side code portion(s) must be installed
|
||||||
|
in the drive(s). This is done by
|
||||||
|
|
||||||
|
jsr install; subsequent loader calls will only work on the active drive as
|
||||||
|
; denoted by FA = $ae
|
||||||
|
bcs error
|
||||||
|
; loader installed successfully
|
||||||
|
|
||||||
|
On error, the carry flag is set and an error code is returned in the accu. As
|
||||||
|
the install routine calls various KERNAL routines, the KERNAL ROM must be
|
||||||
|
enabled (e.g., $01 set to $36 or $37).
|
||||||
|
Note that the KERNAL routines also perform SEI and CLI, so it's advisable to set
|
||||||
|
up any custom interrupt handlers or enable sprites only after installing the
|
||||||
|
loader.
|
||||||
|
Also note that some variables in lowmem ($0200..$03ff) will be overwritten by
|
||||||
|
some KERNAL routines the install routine is calling. Thus, if the resident
|
||||||
|
portion resides in memory below $0400, make sure to copy it there only after
|
||||||
|
installing the loader.
|
||||||
|
Furthermore, in additon to FA = $ae, some more zeropage variables must have
|
||||||
|
valid values. See the bottom of loader/include/loader.inc for details. This list
|
||||||
|
may not be complete.
|
||||||
|
The drive-side portion remains resident in the drive. After successful
|
||||||
|
installation, the install routine is not needed any more and may be overwritten.
|
||||||
|
The KERNAL ROM may be disabled and zeropage variables clobbered.
|
||||||
|
|
||||||
|
With the installed loader, files can only be loaded from the active drive, which
|
||||||
|
cannot be changed, and all other drives will remain inert:
|
||||||
|
|
||||||
|
ldx #<filename
|
||||||
|
ldy #>filename
|
||||||
|
jsr loadraw; load without decompression
|
||||||
|
bcs error; accu contains error code when carry is set after loading
|
||||||
|
; unpacked file loaded successfully
|
||||||
|
|
||||||
|
ldx #<packed
|
||||||
|
ldy #>packed
|
||||||
|
jsr loadcompd; load with decompression
|
||||||
|
bcs error; accu contains error code when carry is set after loading
|
||||||
|
; packed file loaded successfully
|
||||||
|
|
||||||
|
[...]
|
||||||
|
|
||||||
|
filename:
|
||||||
|
.petscii "unpacked"
|
||||||
|
.byte 0
|
||||||
|
|
||||||
|
packed:
|
||||||
|
.petscii "packed"
|
||||||
|
.byte 0
|
||||||
|
|
||||||
|
Note that the filename strings are 0-terminated.
|
||||||
|
|
||||||
|
While loading using filenames with wildcards ("?" and "*") is not possible,
|
||||||
|
subsequent files following the previously-loaded file can be loaded via a
|
||||||
|
zero-length filename:
|
||||||
|
|
||||||
|
ldx #<nextfile
|
||||||
|
ldy #>nextfile
|
||||||
|
jsr loadraw; or loadcompd
|
||||||
|
bcs error
|
||||||
|
|
||||||
|
[...]
|
||||||
|
|
||||||
|
nextfile:
|
||||||
|
.byte 0
|
||||||
|
|
||||||
|
The first file to be loaded by the loader must be loaded via its actual
|
||||||
|
filename. Any subsequent files may then be loaded using the loadnext feature.
|
||||||
|
|
||||||
|
It is strongly recommended to always check the carry flag for errors and handle
|
||||||
|
them.
|
||||||
|
|
||||||
|
The loader code is completely inert when the loader is idle. Thus, the resident
|
||||||
|
code portion can be buffered away, overwritten, and copied back without any
|
||||||
|
problems. It is also possible to have different incarnations of the resident
|
||||||
|
code portion, such as with and without decompression, or with different
|
||||||
|
decompression routines.
|
||||||
|
|
||||||
|
See loader/samples/minexample for a minimal loader usage example.
|
||||||
|
|
||||||
|
Refer to loader/include/loader.inc for the definition of the error codes and
|
||||||
|
various ca65-syntax convenience macros illustrating usage of the various loader
|
||||||
|
calls.
|
||||||
|
|
||||||
|
|
||||||
|
Setting the VIC bank
|
||||||
|
--------------------
|
||||||
|
The VIC bank may be set by writing to $dd00 at any time after installing the
|
||||||
|
loader, including setting it from an interrupt handler while loading. However,
|
||||||
|
the upper 6 bits must always be set to 0. This means that no masking of the
|
||||||
|
value read from $dd00 must be performed, and setting the VIC bank is as simple
|
||||||
|
as
|
||||||
|
|
||||||
|
lda #vicbank; 4 legal values: $00, $01, $02 and $03
|
||||||
|
sta $dd00
|
||||||
|
|
||||||
|
The 4 values are not inverted, i.e., $03 is the lowmost VIC bank at
|
||||||
|
$0000..$3fff, as usual.
|
||||||
|
|
||||||
|
When $dd00 is buffered and later restored, the value written back must also be
|
||||||
|
restricted to 0..3.
|
||||||
|
|
||||||
|
lda $dd00
|
||||||
|
and #$03
|
||||||
|
sta dd00buffer
|
||||||
|
|
||||||
|
[...]
|
||||||
|
|
||||||
|
lda dd00buffer
|
||||||
|
sta $dd00
|
||||||
|
|
||||||
|
Refer to loader/include/loader.inc for a ca65-syntax convenience macro to set
|
||||||
|
the VIC bank.
|
||||||
|
|
||||||
|
|
||||||
|
Zeropage usage
|
||||||
|
--------------
|
||||||
|
The loader's zeropage variables may be overwritten while it's idle. While
|
||||||
|
loading, the addresses from loader_zp_first up to and including loader_zp_last
|
||||||
|
as denoted in loadersymbols-c64.inc must not be written to.
|
||||||
|
|
||||||
|
|
||||||
|
Handling disk changes
|
||||||
|
---------------------
|
||||||
|
Waiting for a specific disk to be inserted is done by enabling the
|
||||||
|
FILE_EXISTS_API, then determining whether a specific disk is inserted by
|
||||||
|
checking in a loop whether a file that only exists on that disk is found.
|
||||||
|
The loop would look like this:
|
||||||
|
|
||||||
|
retry:
|
||||||
|
ldx #<filename
|
||||||
|
ldy #>filename
|
||||||
|
jsr fileexists
|
||||||
|
bcs retry; branch on file not found or error
|
||||||
|
; file exists
|
||||||
|
|
||||||
|
Once the file is found, it (or another file expected on the inserted disk) can
|
||||||
|
be loaded.
|
||||||
|
|
||||||
|
Without the FILE_EXISTS_API, an alternative way to handle disk changes is to try
|
||||||
|
to load a file that only exists on that disk in a loop until the file (or its
|
||||||
|
first byte) is loaded successfully.
|
||||||
|
Thus, it is sufficient to perform
|
||||||
|
|
||||||
|
retry:
|
||||||
|
ldx #<filename
|
||||||
|
ldy #>filename
|
||||||
|
jsr loadraw; or loadcompd
|
||||||
|
bcs retry; branch on error
|
||||||
|
; file loaded successfully
|
||||||
|
|
||||||
|
The detection whether the file exists on the currently inserted disk can be sped
|
||||||
|
up by having the file be merely one block big, or by resetting loadaddrhi to 0
|
||||||
|
before loading and then polling it for change from an interrupt handler.
|
||||||
|
|
||||||
|
Refer to loader/samples/turndisk for an example.
|
||||||
|
|
||||||
|
|
||||||
|
Compressing files
|
||||||
|
-----------------
|
||||||
|
Generally, files need to be compressed (and decompressed) in forward (memory
|
||||||
|
address ascending) direction, and the compressed file's load address should be
|
||||||
|
set so that the end of the compressed data aligns with the end of its
|
||||||
|
uncompressed counterpart, such that in-place decompression can be performed.
|
||||||
|
|
||||||
|
Refer to the Makefile in loader/ for the "tools" target to build all the
|
||||||
|
crunchers:
|
||||||
|
|
||||||
|
$ make tools
|
||||||
|
|
||||||
|
Also refer to loader/samples/benchmark/Makefile or loader/samples/test/Makefile
|
||||||
|
for the corresponding command line arguments for each of the supported crunchers.
|
||||||
|
|
||||||
|
|
||||||
|
Synchronisation
|
||||||
|
---------------
|
||||||
|
For linearly loading and executing productions like demos, the general practice
|
||||||
|
is to tie events such as loading files (and subsequently executing them) to
|
||||||
|
specific music frame counts.
|
||||||
|
A music frame usually coincides with a video frame, as the player is called once
|
||||||
|
a frame, such that a frame count may be updated with calling the player.
|
||||||
|
As loading generally does not take a well-determined period of time to finish
|
||||||
|
(there is quite some deviation between different disks, same-model drives, and
|
||||||
|
also loads from the same disk using the same drive), it is a good practice to
|
||||||
|
sync to a minimum value of the frame count rather than an exact one:
|
||||||
|
|
||||||
|
wait:
|
||||||
|
lda framecountlo
|
||||||
|
cmp nextloadlo
|
||||||
|
lda framecounthi
|
||||||
|
sbc nextloadhi
|
||||||
|
bcc wait; branch if framecount < nextload
|
||||||
|
; load next file
|
||||||
|
|
||||||
|
This way, given enough headroom between loads, after a delayed loading-finished
|
||||||
|
event, the next file would be loaded immediately, with the chain of events
|
||||||
|
eventually catching up with the desired synchronisation.
|
||||||
|
|
||||||
|
|
||||||
|
Dir-art
|
||||||
|
-------
|
||||||
|
Changing the amount of file blocks in the directory is strongly discouraged, as
|
||||||
|
this would disturb speculative loading and either slow down loading or cause
|
||||||
|
data to be loaded beyond the file's dedicated memory areas.
|
||||||
|
|
||||||
|
However, there are a few ways to have an artful directory without interfering
|
||||||
|
with the loading scheme:
|
||||||
|
|
||||||
|
Program files are recognised by the loader regardless of their apparent type, so
|
||||||
|
anything else than PRG is allowed, including deleted PRG files.
|
||||||
|
|
||||||
|
For non-files, set their starting track to 0, such that they would not
|
||||||
|
needlessly occupy space in the drive-side directory buffer, and also for the
|
||||||
|
loadnext feature to work correctly.
|
||||||
|
|
||||||
|
In order to only have only the first few characters of filenames be significant
|
||||||
|
for identification, set the FILENAME_MAXLENGTH option in the configuration file
|
||||||
|
to the amount of desired chars, e.g. 1, such that chars in the directory-listed
|
||||||
|
filenames beyond the first are ignored, and loading is effectively by names
|
||||||
|
like "1*", "A*", etc.
|
||||||
|
|
||||||
|
For full freedom with the directory, including manipulating the amount of file
|
||||||
|
blocks listed, set DIRTRACK in the configuration file to anything else than 18
|
||||||
|
(recommended is 17 or 19 to minimise seek times to and from the shadow directory
|
||||||
|
track), such that a shadow directory is used on that track by the loader. This
|
||||||
|
shadow directory would list the files normally, but be hidden and separate from
|
||||||
|
the normal directory listing, which can then be manipulated freely.
|
||||||
|
|
||||||
|
Consider using cc1541 in loader/tools/cc1541 for creating disk images with a
|
||||||
|
shadow directory.
|
||||||
|
|
||||||
|
|
||||||
|
Optimising for speed
|
||||||
|
--------------------
|
||||||
|
To get closer to the maximum speed, a few rules can be followed. These include
|
||||||
|
but are not limited to:
|
||||||
|
|
||||||
|
The fewer and the bigger files are required to load a set of data, the faster
|
||||||
|
the data is loaded. Thus, it can be beneficial to pad gaps between loaded data,
|
||||||
|
or to re-arrange data, and merge files, minimising the number of files loaded.
|
||||||
|
|
||||||
|
For better decrunch performance while loading, it may also be beneficial to
|
||||||
|
have the most compressible data at the beginning and progressively less
|
||||||
|
compressible data towards the end of a file.
|
||||||
|
|
||||||
|
Generally, it's advisable to store sequentially-loaded files on ascending
|
||||||
|
tracks rather than alternatingly around the directory track 18.
|
||||||
|
|
||||||
|
Loading uncompressed files, the loader's native interleave is 4 revolutions for
|
||||||
|
tracks 1-17, and 3 revolutions for tracks 18+. Thus, the highest raw throughput
|
||||||
|
is obtained on tracks 18-24, then 25-30, then 31+, and finally 1-17.
|
||||||
|
|
||||||
|
Loading compressed files, the loader's native interleave is 4 revolutions
|
||||||
|
across the entire disk. Thus, the highest throughput is obtained on tracks 1-17
|
||||||
|
then progressively decreasing with higher track numbers.
|
||||||
|
|
||||||
|
The loader's speculative loading detects interleaves. However, the expected
|
||||||
|
block allocation does not follow the same rules as saving with the drive's
|
||||||
|
native DOS.
|
||||||
|
|
||||||
|
This means that when adding the interleave on the current sector number in order
|
||||||
|
to obtain the next one, and there is a wrap (next sector >= number of sectors on
|
||||||
|
this track), then the new sector after wrap is a simple modulo on the number of
|
||||||
|
sectors the track can hold. I.e.,
|
||||||
|
|
||||||
|
sector = (sector + interleave) % number_of_sectors[track];
|
||||||
|
|
||||||
|
The DOS, instead, performs
|
||||||
|
|
||||||
|
sector += interleave;
|
||||||
|
if (sector >= number_of_sectors[track]) {
|
||||||
|
sector -= number_of_sectors[track];
|
||||||
|
if (sector > 0) {
|
||||||
|
--sector;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
While loading to the RAM under the I/O registers at $d000-$dfff is optionally
|
||||||
|
possible, it may slow down loading and increases the size of the resident
|
||||||
|
loader portion. Avoiding this option and working around loading to $d000-$dfff
|
||||||
|
by copying after loading or decompressing to that range only after loading may
|
||||||
|
speed up general loader operation.
|
||||||
|
|
||||||
|
Consider using cc1541 in loader/tools/cc1541 for creating disk images with
|
||||||
|
optimised layouts.
|
||||||
|
|
||||||
|
|
||||||
|
Loading in the background
|
||||||
|
-------------------------
|
||||||
|
The loader normally loads in the mainline thread. If it shall load within a
|
||||||
|
periodically-executed interrupt handler, i.e., in another mainline thread, the
|
||||||
|
context must be switched accordingly. That is, stack pointer, registers and
|
||||||
|
condition flags must be buffered when switching from the current thread, and the
|
||||||
|
context of the thread being switched to must be restored. This can be
|
||||||
|
implemented on top of the loader and is orthogonal to its functionality.
|
||||||
|
|
||||||
|
|
||||||
|
Saving files
|
||||||
|
------------
|
||||||
|
To build the loader with file-save functionality, run, e.g.,
|
||||||
|
|
||||||
|
$ make save ZP=e8 INSTALL=1000 RESIDENT=cd00 TRANSIENT=2000
|
||||||
|
|
||||||
|
in loader or loader/src.
|
||||||
|
|
||||||
|
Additionally to install-c64.prg, loader-c64.prg, and loadersymbols-c64.inc, this
|
||||||
|
will produce save-c64.prg in loader/build, assembled to the TRANSIENT memory
|
||||||
|
region.
|
||||||
|
|
||||||
|
Files can be saved like so:
|
||||||
|
|
||||||
|
ldx #<saveparams
|
||||||
|
ldy #>saveparams
|
||||||
|
jsr save
|
||||||
|
bcs error
|
||||||
|
; file was saved successfully
|
||||||
|
|
||||||
|
[...]
|
||||||
|
|
||||||
|
saveparams:
|
||||||
|
.word filename
|
||||||
|
.word $2000; from
|
||||||
|
.word $0123; length in bytes
|
||||||
|
.word $2000; loadaddress
|
||||||
|
.word $8000; drive-code buffer, $0800 bytes to scratch
|
||||||
|
|
||||||
|
filename:
|
||||||
|
.petscii "hiscores"
|
||||||
|
.byte 0
|
||||||
|
|
||||||
|
The file to save must exist on disk prior to saving. I.e., it is overwritten
|
||||||
|
in its entirety, replacing the original file.
|
||||||
|
|
||||||
|
Note that save-c64.prg need not be resident in computer memory, and can be
|
||||||
|
loaded, used and then overwritten again.
|
||||||
|
|
||||||
|
Refer to loader/samples/save for an example.
|
||||||
|
|
||||||
|
|
||||||
|
Limitations
|
||||||
|
-----------
|
||||||
|
Internally, the loader's drive-side directory buffer stores 16-bit hash values
|
||||||
|
of filenames. There is a certain chance of collision, such that two files with
|
||||||
|
different filenames may have the same filename hash and thus appear as the same
|
||||||
|
file to the loader, and it would "randomly" load either file without reporting
|
||||||
|
an error. Using cc1541 in loader/tools/cc1541, hash collisions are detected and
|
||||||
|
can then be worked around by renaming files or changing the loader's
|
||||||
|
FILENAME_MAXLENGTH configuration setting, which must be reflected with cc1541's
|
||||||
|
-M option.
|
||||||
|
|
||||||
|
There must always be at least 2 file entries in the directory.
|
||||||
|
|
||||||
|
The final directory block must begin with 00 ff. Some custom disk image creation
|
||||||
|
tools produce an erroneous final directory block, such that its first bytes are
|
||||||
|
00 00. This is an invalid block length, and the loader rejects blocks with
|
||||||
|
invalid track/sector links or block sizes. In the case of an invalid directory
|
||||||
|
block, the loader keeps retrying to read it, effectively locking up.
|
||||||
|
|
||||||
|
As mentioned in the dir-art section, the number of file blocks listed in the
|
||||||
|
directory must not be changed, unless having a shadow directory (with the actual
|
||||||
|
number of file blocks).
|
||||||
|
|
||||||
|
If the loader is given extremely little raster time for loading, or even starved
|
||||||
|
for multiple video frames, it's adviseable to enable the DISABLE_WATCHDOG option
|
||||||
|
in loader/include/loader.inc. This will disengage the watchdog interrupt in the
|
||||||
|
drive-side code portion, which is otherwise triggering on protocol breaches and
|
||||||
|
would reset the drive on unexpected errors, such as the computer crashing or
|
||||||
|
resetting during loading, or cartridge freeze. The rationale is that the drive
|
||||||
|
would become accessible normally without the need to power-cycle or manually
|
||||||
|
reset it.
|
||||||
|
|
||||||
|
If not using Bitnax, LZSA2, tinycrunch, TSCrunch or ZX0, compressed files will
|
||||||
|
usually go a few bytes beyond their corresponding uncompressed data. This means
|
||||||
|
that some bytes directly after the uncompressed files' range in memory are
|
||||||
|
overwritten. This can be worked around by not using those areas while loading.
|
||||||
|
|
||||||
|
However, when crunched files are larger than their uncompressed counterparts,
|
||||||
|
data before the uncompressed memory region may be overwritten. To work around
|
||||||
|
this, add some padding at the end of the uncompressed files.
|
||||||
|
|
||||||
|
|
||||||
|
License
|
||||||
|
-------
|
||||||
|
TL;DR: Please give credit, thanks.
|
||||||
|
|
||||||
|
When using this software or a derivative thereof in own works, please give
|
||||||
|
appropriate credit, e.g., "Loader by Krill".
|
||||||
|
This does not need to be on prominent display within the actual running
|
||||||
|
production itself, but at least in an accompanying note, readme, info file,
|
||||||
|
directory, or a similar means of attribution contained in the official release
|
||||||
|
archive or disk images.
|
||||||
|
Exclusively external credits on websites or online forums are no such instances.
|
||||||
|
|
||||||
|
Copyright 2022 Gunnar Ruthenberg
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice in
|
||||||
|
an appropriate form, e.g., "Loader by Krill" displayed anywhere in the actual
|
||||||
|
production itself and/or accompanying documentation contained in the official
|
||||||
|
release archive or disk images.
|
||||||
|
|
||||||
|
3. Neither the name of the copyright holder nor the names of its contributors
|
||||||
|
may be used to endorse or promote products derived from this software without
|
||||||
|
specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||||
|
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
Third-party software (particularly in loader/tools and loader/samples/resources)
|
||||||
|
and its derivatives (particularly in loader/src/decompress) are not affected and
|
||||||
|
retain their original licenses.
|
||||||
|
|
||||||
|
|
||||||
|
Thanks
|
||||||
|
------
|
||||||
|
For extensive beta-testing, i thank, in alphabetical order:
|
||||||
|
|
||||||
|
Adder, Algorithm, ChristopherJam, Dr. Science, Jojeli, Mr Ammo, Nomistake,
|
||||||
|
Perplex, q0w, root42, willymanilly.
|
||||||
|
|
||||||
|
For some extra-extensive testing effort, i thank, again:
|
||||||
|
|
||||||
|
q0w and Dr. Science.
|
||||||
|
|
||||||
|
Special thanks to Bitbreaker for coming up with the partial overlap GCR decoding
|
||||||
|
trick that has made the 124-cycle read loop possible, and to ChristopherJam aka
|
||||||
|
Shrydar, again, for some valuable ideas and input, and the concentric circles
|
||||||
|
bitmap.
|
||||||
BIN
loader/build/install-c128.prg
Normal file
BIN
loader/build/install-c16.prg
Normal file
BIN
loader/build/install-c64.prg
Normal file
17
loader/build/intermediate/binary.link
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
MEMORY
|
||||||
|
{
|
||||||
|
ZPRAM: start = $2, size = $fe;
|
||||||
|
ZPRAM2: start = $2, size = $fe;
|
||||||
|
INSTALLRAM: start = $17fe, size = $e802, file = "../build/install-c64.prg";
|
||||||
|
RESIDENTRAM: start = $16fe, size = $e902, file = "../build/loader-c64.prg";
|
||||||
|
TRANSIENTRAM: start = $3ffe, size = $c002, file = "../build/transient-c64.prg";
|
||||||
|
}
|
||||||
|
|
||||||
|
SEGMENTS
|
||||||
|
{
|
||||||
|
DISKIO_ZP: load = ZPRAM, type = zp;
|
||||||
|
DISKIO_PLUGIN_ZP: load = ZPRAM2, type = zp, optional = yes;
|
||||||
|
DISKIO: load = RESIDENTRAM;
|
||||||
|
DISKIO_PLUGIN: load = TRANSIENTRAM, optional = yes;
|
||||||
|
DISKIO_INSTALL: load = INSTALLRAM;
|
||||||
|
}
|
||||||
BIN
loader/build/intermediate/install-nonreloc-c64.o
Normal file
267
loader/build/intermediate/loader-c64.map
Normal file
|
|
@ -0,0 +1,267 @@
|
||||||
|
Modules list:
|
||||||
|
-------------
|
||||||
|
loader-nonreloc-c64.o:
|
||||||
|
CODE Offs=000000 Size=000000 Align=00001 Fill=0000
|
||||||
|
RODATA Offs=000000 Size=000000 Align=00001 Fill=0000
|
||||||
|
BSS Offs=000000 Size=000000 Align=00001 Fill=0000
|
||||||
|
DATA Offs=000000 Size=000000 Align=00001 Fill=0000
|
||||||
|
ZEROPAGE Offs=000000 Size=000000 Align=00001 Fill=0000
|
||||||
|
NULL Offs=000000 Size=000000 Align=00001 Fill=0000
|
||||||
|
DISKIO_ZP Offs=000000 Size=000005 Align=00001 Fill=0000
|
||||||
|
DISKIO Offs=000000 Size=0000E2 Align=00001 Fill=0000
|
||||||
|
install-nonreloc-c64.o:
|
||||||
|
CODE Offs=000000 Size=000000 Align=00001 Fill=0000
|
||||||
|
RODATA Offs=000000 Size=000000 Align=00001 Fill=0000
|
||||||
|
BSS Offs=000000 Size=000000 Align=00001 Fill=0000
|
||||||
|
DATA Offs=000000 Size=000000 Align=00001 Fill=0000
|
||||||
|
ZEROPAGE Offs=000000 Size=000000 Align=00001 Fill=0000
|
||||||
|
NULL Offs=000000 Size=000000 Align=00001 Fill=0000
|
||||||
|
DISKIO_INSTALL Offs=000000 Size=001B55 Align=00001 Fill=0000
|
||||||
|
|
||||||
|
|
||||||
|
Segment list:
|
||||||
|
-------------
|
||||||
|
Name Start End Size Align
|
||||||
|
----------------------------------------------------
|
||||||
|
BSS 000000 000000 000000 00001
|
||||||
|
CODE 000000 000000 000000 00001
|
||||||
|
DATA 000000 000000 000000 00001
|
||||||
|
NULL 000000 000000 000000 00001
|
||||||
|
RODATA 000000 000000 000000 00001
|
||||||
|
ZEROPAGE 000000 000000 000000 00001
|
||||||
|
DISKIO_ZP 000002 000006 000005 00001
|
||||||
|
DISKIO 0016FE 0017DF 0000E2 00001
|
||||||
|
DISKIO_INSTALL 0017FE 003352 001B55 00001
|
||||||
|
|
||||||
|
|
||||||
|
Exports list by name:
|
||||||
|
---------------------
|
||||||
|
BLOCKBUFFER41 000100 EA BLOCKBUFFER71 000700 EA
|
||||||
|
BLOCKBUFFER81 000B00 EA BLOCKDESTLO 000004 LZ
|
||||||
|
CLEARSECTORLINKTABLE71 00000A EZ CURRTRACK41 00007A EZ
|
||||||
|
CURRTRACK71 000000 EZ CUSTOMPARAM81 000017 EZ
|
||||||
|
CUSTOMRECEIVE81 001FD7 EA CUSTOMUPLOADSIZE71 0000DD EZ
|
||||||
|
CUSTOMZPBUFFER71 000037 EZ DECOMPRESSOR_NONE 000000 EZ
|
||||||
|
DECOMPVARS 000007 LZ DIRBUFFSIZE71 000013 EZ
|
||||||
|
DIRBUFFSIZE81 000058 EZ DIRSECTORS71 000074 EZ
|
||||||
|
DIRTRACKS81 0007A0 EA DRVCODEND81 0007A0 EA
|
||||||
|
FILENAME41 0000EF EZ FILENAME71 000037 EZ
|
||||||
|
FILESECTOR41 000076 EZ GETBYTE_CLOCK_ATN_HI 000006 LZ
|
||||||
|
ID041 000059 EZ LEDSTATE41 0000ED EZ
|
||||||
|
LEDSTATE71 000002 EZ LINKSECTOR41 00007F EZ
|
||||||
|
LINKSECTOR71 000008 EZ LINKTRACK41 0000B8 EZ
|
||||||
|
LINKTRACK71 00000D EZ NUMFILES41 000078 EZ
|
||||||
|
REQUESTEDSECTOR41 0000EE EZ SECTORLINKTABLE41 00003E EZ
|
||||||
|
SECTORLINKTABLE71 00001F EZ V1B41 000007 EZ
|
||||||
|
V2B41 00000F EZ bsetv2b71 0000F6 LZ
|
||||||
|
bsyledon81 000429 LA cmdfdfix0 0005B3 RLA
|
||||||
|
cmdfdfix1 000373 REA cmdfdfix2 000374 REA
|
||||||
|
cmdfdfix3 000702 REA cmdfdfix4 000704 REA
|
||||||
|
config_ALLOW_2_MHZ_ON_C128 000000 EZ config_DECOMPRESSOR 000000 EZ
|
||||||
|
config_DIRTRACK 000012 EZ config_DIRTRACK81 000028 EZ
|
||||||
|
config_END_ADDRESS_API 000000 EZ config_FILENAME_MAXLENGTH 000010 EZ
|
||||||
|
config_FILE_EXISTS_API 000000 EZ config_INTERNAL 000000 EZ
|
||||||
|
config_LOAD_COMPD_API 000000 EZ config_LOAD_RAW_API 000001 EZ
|
||||||
|
config_LOAD_TO_API 000000 EZ config_LOAD_UNDER_D000_DFFF 000000 EZ
|
||||||
|
config_LOAD_VIA_KERNAL_FALLBACK 000000 EZ config_MEM_DECOMP_API 000000 EZ
|
||||||
|
config_MEM_DECOMP_TO_API 000000 EZ config_NTSC_COMPATIBILITY 000000 EZ
|
||||||
|
config_ONLY_1541_AND_COMPATIBLE 000000 EZ config_PREFER_SPEED_OVER_SIZE 000000 EZ
|
||||||
|
config_UNINSTALL_API 000000 EZ dcodinit81 00074C LA
|
||||||
|
enablwdg81 0003AF LA filename81 00031B LA
|
||||||
|
findfile41 000523 EA findfile71 000432 EA
|
||||||
|
findfile81 0004D4 EA getblock41 000381 LA
|
||||||
|
getblock71 0002CF LA getblock81 0003CD LA
|
||||||
|
getbyte41 0004FD EA getbytecmp41 00050A LA
|
||||||
|
getbyterts41 00050F EA getbytewdog41 0004F4 EA
|
||||||
|
idleloop41 0004E3 LA idleloop71 0003FC LA
|
||||||
|
idxloop41 000424 LA idxloop71 00065C LA
|
||||||
|
initcntr81 0003F3 LA initlink41 00027B LA
|
||||||
|
initlink71 000192 LA initwdog81 000397 LA
|
||||||
|
install 001800 LA loadaddrhi 000003 LZ
|
||||||
|
loadaddrlo 000002 RLZ loader_zp_first 000002 EZ
|
||||||
|
loader_zp_last 000006 EZ loadfile41 0005BA LA
|
||||||
|
loadfile71 0004E1 LA loadfile81 000596 LA
|
||||||
|
loadraw 001700 LA onemhz71 0000DF LZ
|
||||||
|
sertoraw41 000216 LA setbv2b41 0002AD LA
|
||||||
|
status_DEVICE_INCOMPATIBLE 0000FB EZ status_DEVICE_NOT_PRESENT 0000FE EZ
|
||||||
|
status_FILE_NOT_FOUND 0000FF EZ status_GENERIC_KERNAL_ERROR 0000FD EZ
|
||||||
|
status_OK 000000 EZ status_TOO_MANY_DEVICES 0000FC EZ
|
||||||
|
swapzp81 000343 LA topofstack41 000106 EA
|
||||||
|
topofstack71 0001D4 EA trkseek41 00022C LA
|
||||||
|
trkseek71 000111 LA wdogentr41 0004C4 LA
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Exports list by value:
|
||||||
|
----------------------
|
||||||
|
config_END_ADDRESS_API 000000 EZ CURRTRACK71 000000 EZ
|
||||||
|
DECOMPRESSOR_NONE 000000 EZ config_UNINSTALL_API 000000 EZ
|
||||||
|
config_PREFER_SPEED_OVER_SIZE 000000 EZ config_ONLY_1541_AND_COMPATIBLE 000000 EZ
|
||||||
|
config_NTSC_COMPATIBILITY 000000 EZ config_MEM_DECOMP_TO_API 000000 EZ
|
||||||
|
config_MEM_DECOMP_API 000000 EZ config_LOAD_VIA_KERNAL_FALLBACK 000000 EZ
|
||||||
|
config_LOAD_UNDER_D000_DFFF 000000 EZ status_OK 000000 EZ
|
||||||
|
config_LOAD_TO_API 000000 EZ config_LOAD_COMPD_API 000000 EZ
|
||||||
|
config_INTERNAL 000000 EZ config_FILE_EXISTS_API 000000 EZ
|
||||||
|
config_ALLOW_2_MHZ_ON_C128 000000 EZ config_DECOMPRESSOR 000000 EZ
|
||||||
|
config_LOAD_RAW_API 000001 EZ loader_zp_first 000002 EZ
|
||||||
|
loadaddrlo 000002 RLZ LEDSTATE71 000002 EZ
|
||||||
|
loadaddrhi 000003 LZ BLOCKDESTLO 000004 LZ
|
||||||
|
loader_zp_last 000006 EZ GETBYTE_CLOCK_ATN_HI 000006 LZ
|
||||||
|
V1B41 000007 EZ DECOMPVARS 000007 LZ
|
||||||
|
LINKSECTOR71 000008 EZ CLEARSECTORLINKTABLE71 00000A EZ
|
||||||
|
LINKTRACK71 00000D EZ V2B41 00000F EZ
|
||||||
|
config_FILENAME_MAXLENGTH 000010 EZ config_DIRTRACK 000012 EZ
|
||||||
|
DIRBUFFSIZE71 000013 EZ CUSTOMPARAM81 000017 EZ
|
||||||
|
SECTORLINKTABLE71 00001F EZ config_DIRTRACK81 000028 EZ
|
||||||
|
CUSTOMZPBUFFER71 000037 EZ FILENAME71 000037 EZ
|
||||||
|
SECTORLINKTABLE41 00003E EZ DIRBUFFSIZE81 000058 EZ
|
||||||
|
ID041 000059 EZ DIRSECTORS71 000074 EZ
|
||||||
|
FILESECTOR41 000076 EZ NUMFILES41 000078 EZ
|
||||||
|
CURRTRACK41 00007A EZ LINKSECTOR41 00007F EZ
|
||||||
|
LINKTRACK41 0000B8 EZ CUSTOMUPLOADSIZE71 0000DD EZ
|
||||||
|
onemhz71 0000DF LZ LEDSTATE41 0000ED EZ
|
||||||
|
REQUESTEDSECTOR41 0000EE EZ FILENAME41 0000EF EZ
|
||||||
|
bsetv2b71 0000F6 LZ status_DEVICE_INCOMPATIBLE 0000FB EZ
|
||||||
|
status_TOO_MANY_DEVICES 0000FC EZ status_GENERIC_KERNAL_ERROR 0000FD EZ
|
||||||
|
status_DEVICE_NOT_PRESENT 0000FE EZ status_FILE_NOT_FOUND 0000FF EZ
|
||||||
|
BLOCKBUFFER41 000100 EA topofstack41 000106 EA
|
||||||
|
trkseek71 000111 LA initlink71 000192 LA
|
||||||
|
topofstack71 0001D4 EA sertoraw41 000216 LA
|
||||||
|
trkseek41 00022C LA initlink41 00027B LA
|
||||||
|
setbv2b41 0002AD LA getblock71 0002CF LA
|
||||||
|
filename81 00031B LA swapzp81 000343 LA
|
||||||
|
cmdfdfix1 000373 REA cmdfdfix2 000374 REA
|
||||||
|
getblock41 000381 LA initwdog81 000397 LA
|
||||||
|
enablwdg81 0003AF LA getblock81 0003CD LA
|
||||||
|
initcntr81 0003F3 LA idleloop71 0003FC LA
|
||||||
|
idxloop41 000424 LA bsyledon81 000429 LA
|
||||||
|
findfile71 000432 EA wdogentr41 0004C4 LA
|
||||||
|
findfile81 0004D4 EA loadfile71 0004E1 LA
|
||||||
|
idleloop41 0004E3 LA getbytewdog41 0004F4 EA
|
||||||
|
getbyte41 0004FD EA getbytecmp41 00050A LA
|
||||||
|
getbyterts41 00050F EA findfile41 000523 EA
|
||||||
|
loadfile81 000596 LA cmdfdfix0 0005B3 RLA
|
||||||
|
loadfile41 0005BA LA idxloop71 00065C LA
|
||||||
|
BLOCKBUFFER71 000700 EA cmdfdfix3 000702 REA
|
||||||
|
cmdfdfix4 000704 REA dcodinit81 00074C LA
|
||||||
|
DRVCODEND81 0007A0 EA DIRTRACKS81 0007A0 EA
|
||||||
|
BLOCKBUFFER81 000B00 EA loadraw 001700 LA
|
||||||
|
install 001800 LA CUSTOMRECEIVE81 001FD7 EA
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Imports list:
|
||||||
|
-------------
|
||||||
|
BLOCKBUFFER41 (install-nonreloc-c64.o):
|
||||||
|
BLOCKBUFFER71 (install-nonreloc-c64.o):
|
||||||
|
BLOCKBUFFER81 (install-nonreloc-c64.o):
|
||||||
|
BLOCKDESTLO (loader-nonreloc-c64.o):
|
||||||
|
CLEARSECTORLINKTABLE71 (install-nonreloc-c64.o):
|
||||||
|
CURRTRACK41 (install-nonreloc-c64.o):
|
||||||
|
CURRTRACK71 (install-nonreloc-c64.o):
|
||||||
|
CUSTOMPARAM81 (install-nonreloc-c64.o):
|
||||||
|
CUSTOMRECEIVE81 (install-nonreloc-c64.o):
|
||||||
|
CUSTOMUPLOADSIZE71 (install-nonreloc-c64.o):
|
||||||
|
CUSTOMZPBUFFER71 (install-nonreloc-c64.o):
|
||||||
|
DECOMPRESSOR_NONE (loader-nonreloc-c64.o):
|
||||||
|
DECOMPVARS (loader-nonreloc-c64.o):
|
||||||
|
DIRBUFFSIZE71 (install-nonreloc-c64.o):
|
||||||
|
DIRBUFFSIZE81 (install-nonreloc-c64.o):
|
||||||
|
DIRSECTORS71 (install-nonreloc-c64.o):
|
||||||
|
DIRTRACKS81 (install-nonreloc-c64.o):
|
||||||
|
DRVCODEND81 (install-nonreloc-c64.o):
|
||||||
|
FILENAME41 (install-nonreloc-c64.o):
|
||||||
|
FILENAME71 (install-nonreloc-c64.o):
|
||||||
|
FILESECTOR41 (install-nonreloc-c64.o):
|
||||||
|
GETBYTE_CLOCK_ATN_HI (loader-nonreloc-c64.o):
|
||||||
|
ID041 (install-nonreloc-c64.o):
|
||||||
|
LEDSTATE41 (install-nonreloc-c64.o):
|
||||||
|
LEDSTATE71 (install-nonreloc-c64.o):
|
||||||
|
LINKSECTOR41 (install-nonreloc-c64.o):
|
||||||
|
LINKSECTOR71 (install-nonreloc-c64.o):
|
||||||
|
LINKTRACK41 (install-nonreloc-c64.o):
|
||||||
|
LINKTRACK71 (install-nonreloc-c64.o):
|
||||||
|
NUMFILES41 (install-nonreloc-c64.o):
|
||||||
|
REQUESTEDSECTOR41 (install-nonreloc-c64.o):
|
||||||
|
SECTORLINKTABLE41 (install-nonreloc-c64.o):
|
||||||
|
SECTORLINKTABLE71 (install-nonreloc-c64.o):
|
||||||
|
V1B41 (install-nonreloc-c64.o):
|
||||||
|
V2B41 (install-nonreloc-c64.o):
|
||||||
|
bsetv2b71 (install-nonreloc-c64.o):
|
||||||
|
bsyledon81 (install-nonreloc-c64.o):
|
||||||
|
cmdfdfix0 (install-nonreloc-c64.o):
|
||||||
|
install-nonreloc-c64.o install.s(29)
|
||||||
|
cmdfdfix1 (install-nonreloc-c64.o):
|
||||||
|
install-nonreloc-c64.o install.s(30)
|
||||||
|
cmdfdfix2 (install-nonreloc-c64.o):
|
||||||
|
install-nonreloc-c64.o install.s(31)
|
||||||
|
cmdfdfix3 (install-nonreloc-c64.o):
|
||||||
|
install-nonreloc-c64.o install.s(33)
|
||||||
|
cmdfdfix4 (install-nonreloc-c64.o):
|
||||||
|
install-nonreloc-c64.o install.s(34)
|
||||||
|
config_ALLOW_2_MHZ_ON_C128 (install-nonreloc-c64.o):
|
||||||
|
config_DECOMPRESSOR (install-nonreloc-c64.o):
|
||||||
|
config_DIRTRACK (install-nonreloc-c64.o):
|
||||||
|
config_DIRTRACK81 (install-nonreloc-c64.o):
|
||||||
|
config_END_ADDRESS_API (install-nonreloc-c64.o):
|
||||||
|
config_FILENAME_MAXLENGTH (install-nonreloc-c64.o):
|
||||||
|
config_FILE_EXISTS_API (install-nonreloc-c64.o):
|
||||||
|
config_INTERNAL (install-nonreloc-c64.o):
|
||||||
|
config_LOAD_COMPD_API (install-nonreloc-c64.o):
|
||||||
|
config_LOAD_RAW_API (install-nonreloc-c64.o):
|
||||||
|
config_LOAD_TO_API (install-nonreloc-c64.o):
|
||||||
|
config_LOAD_UNDER_D000_DFFF (install-nonreloc-c64.o):
|
||||||
|
config_LOAD_VIA_KERNAL_FALLBACK (install-nonreloc-c64.o):
|
||||||
|
config_MEM_DECOMP_API (install-nonreloc-c64.o):
|
||||||
|
config_MEM_DECOMP_TO_API (install-nonreloc-c64.o):
|
||||||
|
config_NTSC_COMPATIBILITY (install-nonreloc-c64.o):
|
||||||
|
config_ONLY_1541_AND_COMPATIBLE (install-nonreloc-c64.o):
|
||||||
|
config_PREFER_SPEED_OVER_SIZE (install-nonreloc-c64.o):
|
||||||
|
config_UNINSTALL_API (install-nonreloc-c64.o):
|
||||||
|
dcodinit81 (install-nonreloc-c64.o):
|
||||||
|
enablwdg81 (install-nonreloc-c64.o):
|
||||||
|
filename81 (install-nonreloc-c64.o):
|
||||||
|
findfile41 (install-nonreloc-c64.o):
|
||||||
|
findfile71 (install-nonreloc-c64.o):
|
||||||
|
findfile81 (install-nonreloc-c64.o):
|
||||||
|
getblock41 (install-nonreloc-c64.o):
|
||||||
|
getblock71 (install-nonreloc-c64.o):
|
||||||
|
getblock81 (install-nonreloc-c64.o):
|
||||||
|
getbyte41 (install-nonreloc-c64.o):
|
||||||
|
getbytecmp41 (install-nonreloc-c64.o):
|
||||||
|
getbyterts41 (install-nonreloc-c64.o):
|
||||||
|
getbytewdog41 (install-nonreloc-c64.o):
|
||||||
|
idleloop41 (install-nonreloc-c64.o):
|
||||||
|
idleloop71 (install-nonreloc-c64.o):
|
||||||
|
idxloop41 (install-nonreloc-c64.o):
|
||||||
|
idxloop71 (install-nonreloc-c64.o):
|
||||||
|
initcntr81 (install-nonreloc-c64.o):
|
||||||
|
initlink41 (install-nonreloc-c64.o):
|
||||||
|
initlink71 (install-nonreloc-c64.o):
|
||||||
|
initwdog81 (install-nonreloc-c64.o):
|
||||||
|
install (install-nonreloc-c64.o):
|
||||||
|
loadaddrhi (loader-nonreloc-c64.o):
|
||||||
|
loadaddrlo (loader-nonreloc-c64.o):
|
||||||
|
install-nonreloc-c64.o ./../include/loader.inc(441)
|
||||||
|
loader_zp_first (loader-nonreloc-c64.o):
|
||||||
|
loader_zp_last (loader-nonreloc-c64.o):
|
||||||
|
loadfile41 (install-nonreloc-c64.o):
|
||||||
|
loadfile71 (install-nonreloc-c64.o):
|
||||||
|
loadfile81 (install-nonreloc-c64.o):
|
||||||
|
loadraw (loader-nonreloc-c64.o):
|
||||||
|
onemhz71 (install-nonreloc-c64.o):
|
||||||
|
sertoraw41 (install-nonreloc-c64.o):
|
||||||
|
setbv2b41 (install-nonreloc-c64.o):
|
||||||
|
status_DEVICE_INCOMPATIBLE (install-nonreloc-c64.o):
|
||||||
|
status_DEVICE_NOT_PRESENT (install-nonreloc-c64.o):
|
||||||
|
status_FILE_NOT_FOUND (install-nonreloc-c64.o):
|
||||||
|
status_GENERIC_KERNAL_ERROR (install-nonreloc-c64.o):
|
||||||
|
status_OK (install-nonreloc-c64.o):
|
||||||
|
status_TOO_MANY_DEVICES (install-nonreloc-c64.o):
|
||||||
|
swapzp81 (install-nonreloc-c64.o):
|
||||||
|
topofstack41 (install-nonreloc-c64.o):
|
||||||
|
topofstack71 (install-nonreloc-c64.o):
|
||||||
|
trkseek41 (install-nonreloc-c64.o):
|
||||||
|
trkseek71 (install-nonreloc-c64.o):
|
||||||
|
wdogentr41 (install-nonreloc-c64.o):
|
||||||
|
|
||||||
BIN
loader/build/intermediate/loader-nonreloc-c64.o
Normal file
BIN
loader/build/intermediate/minexample-uncompressed-c64.prg
Normal file
BIN
loader/build/loader-c64.prg
Normal file
44
loader/build/loadersymbols-c128.inc
Normal file
|
|
@ -0,0 +1,44 @@
|
||||||
|
; repository version 194, built on Thu, 24 Nov 2022 10:56:24 +0100 for project "loader" using
|
||||||
|
; make PLATFORM=c128 prg INSTALL=1000 RESIDENT=0200 ZP=e0 PROJECT=
|
||||||
|
|
||||||
|
; configuration
|
||||||
|
config_ALLOW_2_MHZ_ON_C128 = 0
|
||||||
|
config_DECOMPRESSOR = 12; ZX0
|
||||||
|
config_DIRTRACK = 18
|
||||||
|
config_DIRTRACK81 = 40
|
||||||
|
config_END_ADDRESS_API = 0
|
||||||
|
config_FILENAME_MAXLENGTH = 16
|
||||||
|
config_FILE_EXISTS_API = 0
|
||||||
|
config_INTERNAL = 0
|
||||||
|
config_LOAD_COMPD_API = 1
|
||||||
|
config_LOAD_RAW_API = 1
|
||||||
|
config_LOAD_TO_API = 0
|
||||||
|
config_LOAD_UNDER_D000_DFFF = 0
|
||||||
|
config_LOAD_VIA_KERNAL_FALLBACK = 0
|
||||||
|
config_MEM_DECOMP_API = 0
|
||||||
|
config_MEM_DECOMP_TO_API = 0
|
||||||
|
config_NTSC_COMPATIBILITY = 0
|
||||||
|
config_ONLY_1541_AND_COMPATIBLE = 0
|
||||||
|
config_PREFER_SPEED_OVER_SIZE = 0
|
||||||
|
config_UNINSTALL_API = 0
|
||||||
|
|
||||||
|
; status codes
|
||||||
|
status_OK = $00
|
||||||
|
status_DEVICE_INCOMPATIBLE = $fb
|
||||||
|
status_TOO_MANY_DEVICES = $fc
|
||||||
|
status_GENERIC_KERNAL_ERROR = $fd
|
||||||
|
status_DEVICE_NOT_PRESENT = $fe
|
||||||
|
status_FILE_NOT_FOUND = $ff
|
||||||
|
|
||||||
|
; zeropage $e0-$f0
|
||||||
|
loader_zp_first = $e0
|
||||||
|
loadaddrlo = $e0
|
||||||
|
loadaddrhi = $e1
|
||||||
|
loader_zp_last = $ef
|
||||||
|
|
||||||
|
; install $1000-$2c38
|
||||||
|
install = $1000
|
||||||
|
|
||||||
|
; resident $0200-$0472
|
||||||
|
loadraw = $0200
|
||||||
|
loadcompd = $020e
|
||||||
43
loader/build/loadersymbols-c16.inc
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
; repository version 194, built on Thu, 24 Nov 2022 10:56:24 +0100 for project "loader" using
|
||||||
|
; make PLATFORM=c16 prg INSTALL=1000 RESIDENT=0200 ZP=e0 PROJECT=
|
||||||
|
|
||||||
|
; configuration
|
||||||
|
config_DECOMPRESSOR = 12; ZX0
|
||||||
|
config_DIRTRACK = 18
|
||||||
|
config_DIRTRACK81 = 40
|
||||||
|
config_END_ADDRESS_API = 0
|
||||||
|
config_FILENAME_MAXLENGTH = 16
|
||||||
|
config_FILE_EXISTS_API = 0
|
||||||
|
config_INTERNAL = 0
|
||||||
|
config_LOAD_COMPD_API = 1
|
||||||
|
config_LOAD_RAW_API = 1
|
||||||
|
config_LOAD_TO_API = 0
|
||||||
|
config_LOAD_UNDER_D000_DFFF = 0
|
||||||
|
config_LOAD_VIA_KERNAL_FALLBACK = 0
|
||||||
|
config_MEM_DECOMP_API = 0
|
||||||
|
config_MEM_DECOMP_TO_API = 0
|
||||||
|
config_NTSC_COMPATIBILITY = 0
|
||||||
|
config_ONLY_1541_AND_COMPATIBLE = 0
|
||||||
|
config_PREFER_SPEED_OVER_SIZE = 0
|
||||||
|
config_UNINSTALL_API = 0
|
||||||
|
|
||||||
|
; status codes
|
||||||
|
status_OK = $00
|
||||||
|
status_DEVICE_INCOMPATIBLE = $fb
|
||||||
|
status_TOO_MANY_DEVICES = $fc
|
||||||
|
status_GENERIC_KERNAL_ERROR = $fd
|
||||||
|
status_DEVICE_NOT_PRESENT = $fe
|
||||||
|
status_FILE_NOT_FOUND = $ff
|
||||||
|
|
||||||
|
; zeropage $e0-$ef
|
||||||
|
loader_zp_first = $e0
|
||||||
|
loadaddrlo = $e0
|
||||||
|
loadaddrhi = $e1
|
||||||
|
loader_zp_last = $ee
|
||||||
|
|
||||||
|
; install $1000-$2b93
|
||||||
|
install = $1000
|
||||||
|
|
||||||
|
; resident $0200-$0464
|
||||||
|
loadraw = $0200
|
||||||
|
loadcompd = $020e
|
||||||
43
loader/build/loadersymbols-c64.inc
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
; repository version 194, built on Wed, 12 Nov 2025 15:49:37 +0300 for project "loader" using
|
||||||
|
; make PLATFORM=c64 prg INSTALL=1800 RESIDENT=1700 ZP=02 PROJECT=
|
||||||
|
|
||||||
|
; configuration
|
||||||
|
config_ALLOW_2_MHZ_ON_C128 = 0
|
||||||
|
config_DECOMPRESSOR = 0; NONE
|
||||||
|
config_DIRTRACK = 18
|
||||||
|
config_DIRTRACK81 = 40
|
||||||
|
config_END_ADDRESS_API = 0
|
||||||
|
config_FILENAME_MAXLENGTH = 16
|
||||||
|
config_FILE_EXISTS_API = 0
|
||||||
|
config_INTERNAL = 0
|
||||||
|
config_LOAD_COMPD_API = 0
|
||||||
|
config_LOAD_RAW_API = 1
|
||||||
|
config_LOAD_TO_API = 0
|
||||||
|
config_LOAD_UNDER_D000_DFFF = 0
|
||||||
|
config_LOAD_VIA_KERNAL_FALLBACK = 0
|
||||||
|
config_MEM_DECOMP_API = 0
|
||||||
|
config_MEM_DECOMP_TO_API = 0
|
||||||
|
config_NTSC_COMPATIBILITY = 0
|
||||||
|
config_ONLY_1541_AND_COMPATIBLE = 0
|
||||||
|
config_PREFER_SPEED_OVER_SIZE = 0
|
||||||
|
config_UNINSTALL_API = 0
|
||||||
|
|
||||||
|
; status codes
|
||||||
|
status_OK = $00
|
||||||
|
status_DEVICE_INCOMPATIBLE = $fb
|
||||||
|
status_TOO_MANY_DEVICES = $fc
|
||||||
|
status_GENERIC_KERNAL_ERROR = $fd
|
||||||
|
status_DEVICE_NOT_PRESENT = $fe
|
||||||
|
status_FILE_NOT_FOUND = $ff
|
||||||
|
|
||||||
|
; zeropage $02-$07
|
||||||
|
loader_zp_first = $02
|
||||||
|
loadaddrlo = $02
|
||||||
|
loadaddrhi = $03
|
||||||
|
loader_zp_last = $06
|
||||||
|
|
||||||
|
; install $1800-$3353
|
||||||
|
install = $1800
|
||||||
|
|
||||||
|
; resident $1700-$17e0
|
||||||
|
loadraw = $1700
|
||||||
BIN
loader/build/loadertest-c128.d64
Normal file
BIN
loader/build/loadertest-c128.d71
Normal file
BIN
loader/build/loadertest-c128.d81
Normal file
BIN
loader/build/loadertest-c16.d64
Normal file
BIN
loader/build/loadertest-c16.d71
Normal file
BIN
loader/build/loadertest-c16.d81
Normal file
BIN
loader/build/loadertest-c64.d64
Normal file
BIN
loader/build/loadertest-c64.d71
Normal file
BIN
loader/build/loadertest-c64.d81
Normal file
BIN
loader/build/minexample-c64.d64
Normal file
0
loader/build/transient-c64.prg
Normal file
27
loader/docs/Prerequisites.txt
Executable file
|
|
@ -0,0 +1,27 @@
|
||||||
|
|
||||||
|
Path, loader only:
|
||||||
|
Name Source Remarks
|
||||||
|
|
||||||
|
ca65 https://cc65.github.io set path to <cc65path>/bin
|
||||||
|
ld65 https://www.cc65.org/ set path to <cc65path>/bin
|
||||||
|
ar65 https://www.cc65.org/ set path to <cc65path>/bin
|
||||||
|
|
||||||
|
make https://www.gnu.org/software/make/
|
||||||
|
gcc https://gcc.gnu.org/ needed to build cc1541 and most of the compressors
|
||||||
|
|
||||||
|
perl https://www.perl.org/ needed to generate a symbols file for the make prg target in loader/src and
|
||||||
|
to run the compressed file converter for Taboo Levelcrush
|
||||||
|
python https://www.python.org/ needed to run tinycrunch's tc_encode.py
|
||||||
|
rust https://www.rust-lang.org/ needed to build NuCrunch
|
||||||
|
zip needed to make a loader binary archive for the make prg target in loader/src
|
||||||
|
|
||||||
|
|
||||||
|
Path, samples folder:
|
||||||
|
Name Source Remarks
|
||||||
|
|
||||||
|
lua https://www.lua.org/ needed to run the benchmarks
|
||||||
|
|
||||||
|
c1541 https://vice-emu.sourceforge.net/
|
||||||
|
vice https://vice-emu.sourceforge.net/
|
||||||
|
plus4emu https://plus4emu.sourceforge.net/ needed if not using the USE_VICE=1 make run switch on Plus/4 and MAC OS X
|
||||||
|
Yape/YapeWin64 http://yape.homeserver.hu/ needed if not using the USE_VICE=1 make run switch on Plus/4 and Windows
|
||||||
77
loader/docs/Protocol.txt
Executable file
|
|
@ -0,0 +1,77 @@
|
||||||
|
Two bits + ATN loader protocol
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
<---------------------------- initiate loading ---------------------->|
|
||||||
|
|<--------- send name loop --------->|
|
||||||
|
| |
|
||||||
|
idle request | wait for | send filename chars to the drive | clear | busy
|
||||||
|
service | drive ready | | |
|
||||||
|
| | | |
|
||||||
|
Host DATA IN 0 _____ ... ____|¯¯¯¯|¯ ... ¯¯¯¯¯¯¯|¯¯|___|¯¯¯|___|¯¯¯|___|¯¯¯|___|¯¯¯¯¯|¯¯¯¯¯¯¯¯¯¯¯|¯¯¯¯¯¯¯¯¯|¯¯ 1
|
||||||
|
| | __ __ __ __ __ __ __ __ | | |
|
||||||
|
Host CLK IN 0 _____ ... _________|_ ... ___|¯¯¯|...D0..D1..D2..D3..D4..D5..D6..D7...|......¯¯¯¯¯|¯¯¯¯|____|__ 0
|
||||||
|
| | | | |
|
||||||
|
Host DATA OUT 1 ¯¯¯¯¯ ... ¯¯¯¯|____|_ ... _______|__|¯¯¯|___|¯¯¯|___|¯¯¯|___|¯¯¯|_____|___________|_________|__ 0
|
||||||
|
| | | | |
|
||||||
|
Host CLK OUT 1 ¯¯¯¯¯ ... ¯¯¯¯|____|_ ... _______|...D0..D1..D2..D3..D4..D5..D6..D7...|......_____|_________|__ 0
|
||||||
|
| | | | |
|
||||||
|
Host ATN OUT 1 ¯¯¯¯¯ ... ¯¯¯¯¯¯¯¯¯|¯ ... ¯¯¯¯¯¯¯|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|¯¯¯¯¯¯¯¯¯¯¯|¯¯¯¯¯¯¯¯¯|¯¯ 1
|
||||||
|
| | | | |
|
||||||
|
| | | | |
|
||||||
|
Drive ATN IN 1 ¯¯¯¯¯ ... ¯¯¯¯¯¯¯¯¯|¯ ... ¯¯¯¯¯¯¯|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|¯¯¯¯¯¯¯¯¯¯¯|¯¯¯¯¯¯¯¯¯|¯¯ 1
|
||||||
|
| | | | |
|
||||||
|
Drive ATNA OUT 1 ¯¯¯¯¯ ... ¯¯¯¯¯¯¯¯¯|¯ ... ¯¯¯¯¯¯¯|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|¯¯¯¯¯¯¯¯¯¯¯|¯¯¯¯¯¯¯¯¯|¯¯ 1
|
||||||
|
| | | | |
|
||||||
|
Drive CLK OUT 1 ¯¯¯¯¯ ... ¯¯¯¯¯¯¯¯¯|¯ ... ¯¯¯|___|____________________________________|___________|____|¯¯¯¯|¯¯ 1
|
||||||
|
| | | | |
|
||||||
|
Drive CLK IN 1 ¯¯¯¯¯ ... ¯¯¯¯¯¯¯¯¯|¯ ... ¯¯¯|___|...D0..D1..D2..D3..D4..D5..D6..D7...|......_____|____|¯¯¯¯|¯¯ 1
|
||||||
|
| | | | |
|
||||||
|
Drive DATA OUT 0 _____ ... _________|_ ... _______|____________________________________|___________|_________|__ 0
|
||||||
|
| | | | |
|
||||||
|
Drive DATA IN 1 ¯¯¯¯¯ ... ¯¯¯¯|____|_ ... _______|__|¯¯¯|___|¯¯¯|___|¯¯¯|___|¯¯¯|_____|___________|_________|__ 0
|
||||||
|
| | | | |
|
||||||
|
host: DATA | drive: ack | host: clock out bits with CLK OUT | host: | drive: |
|
||||||
|
OUT 1 -> 0, | by CLK OUT | as data, DATA OUT as clock, | CLK | busy by |
|
||||||
|
CLK OUT | 1 -> 0 | filename is FILENAME_MAXLENGTH | OUT = 0 | CLK OUT |
|
||||||
|
1 -> 0 | | chars or 0-terminated if fewer | | 0 -> 1 |
|
||||||
|
|
||||||
|
|
||||||
|
|<-------------------- fetch block or status (looped) -------------------->|
|
||||||
|
| |<-- get block loop -->| |
|
||||||
|
| | | |
|
||||||
|
busy | wait for | send block | get a byte from | drive | ack | acknowledge | idle
|
||||||
|
| the drive's | start signal | the drive | busy | block | file transfer |
|
||||||
|
| response | to the drive | | | | |
|
||||||
|
| | | | | | |
|
||||||
|
Host DATA IN 1 ¯¯¯¯¯¯|¯ ... ¯¯¯|_____|_______________|..D1...D3...D5...D7...|......¯¯¯¯¯|¯¯¯|___|_______________|__ 0
|
||||||
|
| | | | | | |
|
||||||
|
Host CLK IN 0 ______|_ ... _____|¯¯¯|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|..D0...D2...D4...D6...|......_____|_______|_______________|__ 0
|
||||||
|
| | | | | | |
|
||||||
|
Host DATA OUT 0 ______|_ ... _________|_______________|______________________|___________|_______|_______|¯¯¯¯¯¯¯|¯¯ 1
|
||||||
|
| | | | | | |
|
||||||
|
Host CLK OUT 0 ______|_ ... _________|_______________|______________________|___________|_______|_______|¯¯¯¯¯¯¯|¯¯ 1
|
||||||
|
| | | | | | |
|
||||||
|
Host ATN OUT 1 ¯¯¯¯¯¯|¯ ... ¯¯¯¯¯¯¯¯¯|¯¯¯¯¯¯¯|_______|_____|¯¯¯¯|____|¯¯¯¯|_|___________|___|¯¯¯|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|¯¯ 1
|
||||||
|
| | | | | | |
|
||||||
|
| | | | | | |
|
||||||
|
Drive ATN IN 1 ¯¯¯¯¯¯|¯ ... ¯¯¯¯¯¯¯¯¯|¯¯¯¯¯¯¯|_______|_____|¯¯¯¯|____|¯¯¯¯|_|___________|___|¯¯¯|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|¯¯ 1
|
||||||
|
| | | | | | |
|
||||||
|
Drive ATNA OUT 1 ¯¯¯¯¯¯|¯ ... ¯¯¯|_XXXX|XXXXXXXXXXXXXXX|¯|____|¯¯¯¯|____|¯¯¯¯¯|¯¯¯¯¯¯¯¯¯¯¯|¯¯¯¯¯¯¯|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|¯¯ 1
|
||||||
|
| | | __ __ __ __ | | | |
|
||||||
|
Drive CLK OUT 1 ¯¯¯¯¯¯|¯ ... ¯¯¯¯¯|___|_______________|..D0...D2...D4...D6...|......¯¯¯¯¯|¯¯¯¯¯¯¯|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|¯¯ 1
|
||||||
|
| | | __ __ __ __ | | | |
|
||||||
|
Drive CLK IN 1 ¯¯¯¯¯¯|¯ ... ¯¯¯¯¯|___|_______________|..D0...D2...D4...D6...|......¯¯¯¯¯|¯¯¯¯¯¯¯|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|¯¯ 1
|
||||||
|
| | | __ __ __ __ | | | |
|
||||||
|
Drive DATA OUT 0 ______|_ ... ___|¯¯¯¯¯|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|..D1...D3...D5...D7...|......_____|_______|_______________|__ 0
|
||||||
|
| | | __ __ __ __ | | | |
|
||||||
|
Drive DATA IN 0 ______|_ ... ___|¯¯¯¯¯|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|..D1...D3...D5...D7...|......_____|_______|_______|¯¯¯¯¯¯¯|¯¯ 1
|
||||||
|
| | | | | | |
|
||||||
|
| drive: signal | host: ATN | host: clock in | drive: | host: | host: ack by |
|
||||||
|
| ready by DATA | OUT 1 -> 0 | bit pairs with | DATA | ATN | DATA OUT |
|
||||||
|
| OUT 0 -> 1, | | ATN OUT as clock, | OUT = 0, | OUT | and CLK OUT |
|
||||||
|
| CLK OUT 1->0, | | last bit pair | CLK | 0->1 | 0 -> 1: enter |
|
||||||
|
| then, if host | | acknowledged with | OUT = 1 | | idle mode = |
|
||||||
|
| DATA IN is | | ATN OUT 1 -> 0 | | | host ATN, CLK |
|
||||||
|
| set to 1, the | | | | | and DATA OUT |
|
||||||
|
| drive is not | | | | | = 1, drive |
|
||||||
|
| present | | | | | ATNA OUT = 1 |
|
||||||
131
loader/include/config.inc
Executable file
|
|
@ -0,0 +1,131 @@
|
||||||
|
|
||||||
|
; configuration
|
||||||
|
; set .defines to non-0 to enable the corresponding features
|
||||||
|
|
||||||
|
; see loader.inc for function calls and convenience macros
|
||||||
|
|
||||||
|
; parameters
|
||||||
|
|
||||||
|
.ifndef PLATFORM
|
||||||
|
PLATFORM = diskio::platform::COMMODORE_64; available are COMMODORE_64, COMMODORE_128 and COMMODORE_16
|
||||||
|
.endif
|
||||||
|
|
||||||
|
; parameter, this changes the host-side code only
|
||||||
|
|
||||||
|
DECOMPRESSOR = DECOMPRESSORS::ZX0; available are NONE, BITNAX (recommended for demos), BYTEBOOZER2, DOYNAX_LZ, EXOMIZER (not recommended for demos), LEVELCRUSH, LZSA2 (recommended for demos), NUCRUNCH, PUCRUNCH, SUBSIZER, TINYCRUNCH (recommended for demos), TSCRUNCH (strongly recommended for demos), ZX0 (strongly recommended for demos)
|
||||||
|
|
||||||
|
|
||||||
|
; features
|
||||||
|
|
||||||
|
; following settings are independent from the installed drive code, several host-side
|
||||||
|
; resident binaries with different features may be used with the same installed drive code
|
||||||
|
|
||||||
|
|
||||||
|
; basic features, different settings can be run with the same installed drive code, increase host-side code size
|
||||||
|
|
||||||
|
.define LOAD_COMPD_API 1 ; include the loadcompd routine to load and depack compressed files on the fly
|
||||||
|
; requires DECOMPRESSOR != DECOMPRESSORS::NONE
|
||||||
|
|
||||||
|
.define LOAD_RAW_API 1 ; include the loadraw routine to load files without decompressing
|
||||||
|
|
||||||
|
.define NTSC_COMPATIBILITY 0 ; C-64/128 only: be able to run on both PAL and NTSC machines, this slightly decreases loading speed on PAL,
|
||||||
|
; note that PAL vs. NTSC is not detected by the install routine, and no error is returned when running on an
|
||||||
|
; NTSC machine with the NTSC_COMPATIBILITY option disabled: detect, then select either of both incarnations
|
||||||
|
; of the resident portion (with and without NTSC support) for maximum speed with NTSC and PAL
|
||||||
|
|
||||||
|
.define PREFER_SPEED_OVER_SIZE 0 ; For TSCrunch or ZX0, use a bigger but potentially faster decompression routine
|
||||||
|
|
||||||
|
.define UNINSTALL_API 0 ; include an uninstallation routine
|
||||||
|
|
||||||
|
|
||||||
|
; extended features, different settings can be run with the same installed drive code, increase host-side code size
|
||||||
|
|
||||||
|
.define FILE_EXISTS_API 0 ; include the fileexists routine for simple multi-disk handling
|
||||||
|
|
||||||
|
.define LOAD_UNDER_D000_DFFF 0 ; C-64/128: enable loading (and decompression) to the RAM at $D000..$DFFF,
|
||||||
|
; note that this does not slow down loading when not loading to RAM at $D000..$DFFF,
|
||||||
|
; as there are two separate routines to load data (one regular, the other to RAM at $D000..$DFFF).
|
||||||
|
; the IRQ handlers will need to change $01 ($FF00 on C-128) to enable the I/O registers at $D000..$DFFF,
|
||||||
|
; so make sure the IRQ handlers restore the $01 status on C-64 to the value as when they are called.
|
||||||
|
; the IRQs must run via $FFFE/F, since the ROM is disabled when accessing the RAM at $D000-$DFFF
|
||||||
|
; this is not needed when only memdecompressing to $D000..$DFFF (simply set $01 to $30 on C-64 and jsr memdecomp in that case)
|
||||||
|
|
||||||
|
.define ALLOW_2_MHZ_ON_C128 0 ; C-64 only: allow 2 MHz usage on C-128 in C-64 mode,
|
||||||
|
; this does not increase raw loading speed but increases combined loading + decompression speed using loadcompd.
|
||||||
|
; the clock is temporarily switched to 1 MHz while loading,
|
||||||
|
; interrupt handlers changing the clock speed must restore it upon return to the mainline thread.
|
||||||
|
|
||||||
|
.define MEM_DECOMP_API 0 ; include a routine for memory decompression, that is, loading and decompression can be separated.
|
||||||
|
; C-64: decompression to $D000..$DFFF need not have LOAD_UNDER_D000_DFFF enabled,
|
||||||
|
; just enable 64 kB of RAM before jsr memdecomp.
|
||||||
|
; requires DECOMPRESSOR != DECOMPRESSORS::NONE
|
||||||
|
; this option does not implicitly turn on the LOAD_RAW_API
|
||||||
|
|
||||||
|
.define MEM_DECOMP_TO_API 0 ; if carry is set on decompression, the decompressor will use the address set in decdestlo/decdesthi as
|
||||||
|
; decompression destination address and ignore the file's decompression address.
|
||||||
|
; requires MEM_DECOMP_API != 0
|
||||||
|
|
||||||
|
.define LOAD_TO_API 0 ; if the carry flag is set on load, override load and decompression destination addresses.
|
||||||
|
; load raw files: use the address set in loadaddrlo/loadaddrhi as absolute loading address
|
||||||
|
; load compressed files: use relative loading address offset in loadaddroffslo/loadaddroffshi, it is added to the load/depack addresses
|
||||||
|
|
||||||
|
.define END_ADDRESS_API 0 ; during and after loading, the file's current and then final end address (address of last file byte + 1) is stored in
|
||||||
|
; endaddrlo and endaddrhi. for loading compressed files using loadcompd, the end address of the compressed data is stored.
|
||||||
|
; the file's loading address can be found in loadaddrlo/loadaddrhi during and after loading, so polling the current
|
||||||
|
; difference of endaddrlo/hi and loadaddrlo/hi can be used to implement progress displays (take care for update race conditions).
|
||||||
|
|
||||||
|
.define LOAD_VIA_KERNAL_FALLBACK 0 ; loads via the KERNAL API if drive code installation was not successful
|
||||||
|
; (i.e., if it cannot installed due to an incompatible drive - possible if it is not
|
||||||
|
; a 1541, 1541-C, 1541-II, 1541U, 1570, 1571, 1571CR, 1581, or FD2000/4000),
|
||||||
|
; or true drive emulation being disabled.
|
||||||
|
; note that this does not necessarily mean slow or non-IRQ loading, as custom KERNALs like JiffyDOS or IDEDOS
|
||||||
|
; use the original KERNAL API as well.
|
||||||
|
; the IRQ handlers can be delayed for some rasterlines up to several frames due to KERNAL routines
|
||||||
|
; temporarily disabling IRQ (but that is unlikely for devices not using the serial bus).
|
||||||
|
; for the sake of compatibility, only disable this option if the space is really needed.
|
||||||
|
; C-64:
|
||||||
|
; Attention: KERNAL, BASIC, and possible cartridge ROMs are enabled, so IRQ handlers are not
|
||||||
|
; allowed in the ranges $8000..$BFFF and $D000..$FFFF.
|
||||||
|
; Attention: KERNAL routines may execute CLI, so make sure to have valid IRQ vectors and handlers,
|
||||||
|
; or disable all IRQ sources (not via SEI), also make sure to correctly handle the different
|
||||||
|
; IRQ conditions when called via KERNAL vector ($0314) vs. non-KERNAL vector ($FFFE), both are possible -
|
||||||
|
; best have KERNAL and BASIC enabled before calling the loader, so only the KERNAL vector IRQ handler is
|
||||||
|
; needed (please note that the handler code is delayed a little when called via $0314 rather than $FFFE).
|
||||||
|
; C-128:
|
||||||
|
; Attention: System ROM is enabled, so IRQ handlers are not allowed in the range $C000..$FFFF.
|
||||||
|
; Attention: KERNAL routines may execute CLI, so make sure to have valid IRQ vectors and handlers,
|
||||||
|
; or disable all IRQ sources (not via SEI), also make sure to correctly handle the different
|
||||||
|
; IRQ conditions when called via KERNAL vector ($0314) vs. non-KERNAL vector ($FFFE) - best have System ROM
|
||||||
|
; enabled before calling the loader, so only the KERNAL vector IRQ handler is needed (please note that
|
||||||
|
; the handler code is delayed a little when called via $0314 rather than $FFFE).
|
||||||
|
; C-64/128:
|
||||||
|
; Attention: KERNAL routines use CIA1 timer A ($DC04/5).
|
||||||
|
; Plus/4:
|
||||||
|
; Attention: The ROM space in the upper memory half is enabled, so IRQ handlers are not allowed
|
||||||
|
; in the range $8000..$FFFF.
|
||||||
|
; Attention: The ROM routines may execute CLI, so make sure to have valid IRQ vectors and handlers,
|
||||||
|
; or disable all IRQ sources (not via SEI), also make sure to correctly handle the different
|
||||||
|
; IRQ conditions when called via ROM vector ($0314) vs. non-ROM vector ($FFFE) - best have ROM enabled
|
||||||
|
; before calling the loader, so only the ROM vector IRQ handler is needed (please note that
|
||||||
|
; the handler code is delayed a little when being called via $0314 rather than $FFFE).
|
||||||
|
; requires ONLY_1541_AND_COMPATIBLE = 0
|
||||||
|
|
||||||
|
.define CLOSE_FILE_API 0 ; include the closefile call to close an open file
|
||||||
|
|
||||||
|
|
||||||
|
; these options change drive-side code
|
||||||
|
|
||||||
|
.define DIRTRACK 18 ; actual directory track, this can be changed to have a shadow directory so that the
|
||||||
|
; normal directory does not list the files and can be used entirely for bootstrap and dir-art
|
||||||
|
.define DIRTRACK81 40 ; (i.e., the loader's directory can be relocated to hide it from the normal directory command).
|
||||||
|
; DIRTRACK must be 18 when LOAD_VIA_KERNAL_FALLBACK != 0
|
||||||
|
; DIRTRACK81 must be 40 when LOAD_VIA_KERNAL_FALLBACK != 0
|
||||||
|
|
||||||
|
.define FILENAME_MAXLENGTH 16 ; maximum length of filename, if a directory is capable of holding longer names, extra characters are ignored,
|
||||||
|
; to facilitate dir-art, set to, e.g., 2, then load files as "01*", "02*", etc.
|
||||||
|
|
||||||
|
|
||||||
|
; this option reduces host-side install code
|
||||||
|
|
||||||
|
.define ONLY_1541_AND_COMPATIBLE 0 ; reduces host-side install code by omitting any native custom drive code for non-1541 compatible
|
||||||
|
; drives, treats any drive as 1541, using an incompatible drive will cause undefined behaviour
|
||||||
707
loader/include/loader.inc
Executable file
|
|
@ -0,0 +1,707 @@
|
||||||
|
|
||||||
|
.ifndef _LOADER_INC_
|
||||||
|
_LOADER_INC_ = 1
|
||||||
|
|
||||||
|
DISABLE_WATCHDOG = 0 ; disable the drive-side watchdog - the watchdog will reset the drive safely when the host resets at any point,
|
||||||
|
; however, the drive hardware (1541 and 1571) only allows for a maximum time-out period of 65536 cycles: this means
|
||||||
|
; that letting the loader starve for a few video frames (about 1.5 frames with a 1571 running at 2 MHz) will reset
|
||||||
|
; the drive, which can be prevented using this option.
|
||||||
|
|
||||||
|
; C-128 only: for burst transfers, use the CLK line for the incoming data-sent signal rather than the
|
||||||
|
; SERIAL_IRQ flag in CIA1_ICR ($dc0d) in order to avoid interference by CIA1 interrupt handlers,
|
||||||
|
; note that this slows down transfer speed
|
||||||
|
ASYNCHRONOUS_BURST_HANDSHAKE = 0
|
||||||
|
|
||||||
|
; set to 0 if loading via KERNAL fallback is problematic with non-standard KERNALs, VICE virtual drives, IEEE-488 interfaces or devices like IDE64
|
||||||
|
KERNAL_FALLBACK_SEI_WORKAROUNDS = 1
|
||||||
|
KERNAL_FALLBACK_OPEN_SEI_WORKAROUNDS = 0; this does not work with VICE virtual device traps
|
||||||
|
|
||||||
|
CONFIG_INTERNAL = ((KERNAL_FALLBACK_SEI_WORKAROUNDS = 0) << 3) | (KERNAL_FALLBACK_OPEN_SEI_WORKAROUNDS << 2) | (ASYNCHRONOUS_BURST_HANDSHAKE << 1) | DISABLE_WATCHDOG
|
||||||
|
|
||||||
|
.pushseg
|
||||||
|
|
||||||
|
.segment "CODE"; import symbols as absolute by default
|
||||||
|
|
||||||
|
.scope diskio
|
||||||
|
|
||||||
|
.scope platform
|
||||||
|
COMMODORE_64 = 64
|
||||||
|
COMMODORE_128 = 128
|
||||||
|
COMMODORE_16 = 16
|
||||||
|
.endscope; platform
|
||||||
|
|
||||||
|
.scope drivetype
|
||||||
|
DRIVES_1541 = $00
|
||||||
|
DRIVES_157X = $10
|
||||||
|
DRIVES_1581_CMD = $20
|
||||||
|
DRIVES_MASK = $f0
|
||||||
|
|
||||||
|
DRIVE_1541 = $01
|
||||||
|
DRIVE_1541_C = $02
|
||||||
|
DRIVE_1541_II = $03
|
||||||
|
DRIVE_1541U = $04
|
||||||
|
DRIVE_1570 = $15
|
||||||
|
DRIVE_1571 = $16
|
||||||
|
DRIVE_1571CR = $17
|
||||||
|
DRIVE_1581 = $28
|
||||||
|
DRIVE_CMD_FD_2000 = $29
|
||||||
|
DRIVE_CMD_FD_4000 = $2a
|
||||||
|
DRIVE_CMD_HD = $2b
|
||||||
|
|
||||||
|
DRIVE_GENERIC_SERIAL = $fc ; -4
|
||||||
|
DRIVE_GENERIC_BURST = $fd ; -3
|
||||||
|
DRIVE_GENERIC_PARALLEL = $fe ; -2
|
||||||
|
DEVICE_NONE = $ff ; -1
|
||||||
|
.endscope; drivetype
|
||||||
|
|
||||||
|
.scope status
|
||||||
|
OK = 0
|
||||||
|
|
||||||
|
FILE_TOO_LARGE = $f7 ; -9
|
||||||
|
FILE_ON_DISK_TOO_SMALL = $f8 ; -8
|
||||||
|
FILE_ON_DISK_TOO_LARGE = $f9 ; -7
|
||||||
|
WRITE_PROTECT_ON = $fa ; -6
|
||||||
|
|
||||||
|
DEVICE_INCOMPATIBLE = $fb ; -5, cannot upload loader drive code to active device, if LOAD_VIA_KERNAL_FALLBACK != 0, do not regard this as an error
|
||||||
|
TOO_MANY_DEVICES = $fc ; -4, a device on the bus other than the active device is not compatible, if LOAD_VIA_KERNAL_FALLBACK != 0, do not regard this as an error
|
||||||
|
GENERIC_KERNAL_ERROR = $fd ; -3, an error occured during installation or while loading without installed drive code via KERNAL fallback, check the x register for further information
|
||||||
|
DEVICE_NOT_PRESENT = $fe ; -2
|
||||||
|
FILE_NOT_FOUND = $ff ; -1
|
||||||
|
.endscope; status
|
||||||
|
|
||||||
|
.endscope; diskio
|
||||||
|
|
||||||
|
.enum DECOMPRESSORS
|
||||||
|
|
||||||
|
BITNAX = 1 ; Doynax and Bitbreaker's Bitnax
|
||||||
|
BYTEBOOZER2 = 2 ; HCL/Booze Design's ByteBoozer2
|
||||||
|
DOYNAX_LZ = 3 ; Doynax LZ, aka Doynamite
|
||||||
|
EXOMIZER = 4 ; Magnus Lind's Exomizer
|
||||||
|
LEVELCRUSH = 5 ; Taboo Levelcrush
|
||||||
|
LZSA2 = 6 ; Emmanuel Marty's LZSA2 with modifications by Bitbreaker
|
||||||
|
NUCRUNCH = 7 ; ChristopherJam aka Shrydar's NuCrunch
|
||||||
|
PUCRUNCH = 8 ; Pasi Ojala's Pucrunch
|
||||||
|
SUBSIZER = 9 ; tlr's Subsizer
|
||||||
|
TINYCRUNCH = 10 ; ChristopherJam aka Shrydar's tinycrunch
|
||||||
|
TSCRUNCH = 11 ; Antonio Savona's TSCrunch
|
||||||
|
ZX0 = 12 ; Einar Saukas' ZX0/Salvador with Dali modifications by Bitbreaker
|
||||||
|
|
||||||
|
NONE = 0
|
||||||
|
|
||||||
|
.endenum
|
||||||
|
|
||||||
|
|
||||||
|
.ifdef EXTCONFIGPATH
|
||||||
|
.include "loaderconfig.inc"
|
||||||
|
.else
|
||||||
|
.include "config.inc"
|
||||||
|
.endif; !EXTCONFIGPATH
|
||||||
|
|
||||||
|
.if .defined(FORCE_ASYNCHRONOUS_BURST_HANDSHAKE)
|
||||||
|
USE_ASYNCHRONOUS_BURST_HANDSHAKE = 1
|
||||||
|
.else
|
||||||
|
USE_ASYNCHRONOUS_BURST_HANDSHAKE = ASYNCHRONOUS_BURST_HANDSHAKE
|
||||||
|
.endif
|
||||||
|
|
||||||
|
|
||||||
|
.ifndef __NO_LOADER_SYMBOLS_IMPORT
|
||||||
|
.ifndef install
|
||||||
|
|
||||||
|
.if PLATFORM <> diskio::platform::COMMODORE_16
|
||||||
|
; Set the VIC bank
|
||||||
|
; in: a - VIC bank (0..3)
|
||||||
|
; out: undefined
|
||||||
|
.macro SET_VIC_BANK bank
|
||||||
|
lda #bank & 3
|
||||||
|
sta CIA2_PRA
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; allow for arbitrary $DD00 writes ($00-$FF) when the loader is idle,
|
||||||
|
; good for raster routines with LDA #value:STA $D018:STA $DD00, e.g.
|
||||||
|
|
||||||
|
; call after load
|
||||||
|
.macro ENTER_BUS_LOCK
|
||||||
|
; nothing to do
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; call before load
|
||||||
|
.macro LEAVE_BUS_LOCK
|
||||||
|
; when the loader is idle, the user is
|
||||||
|
; allowed to write anything to CIA2_DDRA ($DD00) -
|
||||||
|
; set it to a known and valid state here.
|
||||||
|
;php; without these, there's a race condition and thus a small
|
||||||
|
;sei; chance for video glitches, but with these, there's a
|
||||||
|
INIT_CLEAR_ATN_OUT_CLEAR_CLK_OUT_CLEAR_DATA_OUT
|
||||||
|
;plp; chance for actual crashes with stable raster routines
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.if ALLOW_2_MHZ_ON_C128 | (PLATFORM = diskio::platform::COMMODORE_128)
|
||||||
|
; For 2 MHz in interrupt handlers during loading,
|
||||||
|
; to be run at the start of every IRQ handler
|
||||||
|
.macro LOADER_IRQ_HANDLER_PROLOGUE
|
||||||
|
; buffer clock setting and continue at 2 MHz
|
||||||
|
lda VIC2_C128_CLOCK
|
||||||
|
pha
|
||||||
|
lda #C128_TWO_MHZ
|
||||||
|
sta VIC2_C128_CLOCK
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; For 2 MHz in interrupt handlers during loading,
|
||||||
|
; to be run at the end of every IRQ handler
|
||||||
|
.macro LOADER_IRQ_HANDLER_EPILOGUE
|
||||||
|
pla
|
||||||
|
sta VIC2_C128_CLOCK
|
||||||
|
.endmacro
|
||||||
|
.endif
|
||||||
|
.else
|
||||||
|
; To be run at the start of every IRQ handler
|
||||||
|
.macro LOADER_IRQ_HANDLER_PROLOGUE
|
||||||
|
; buffer force single clock flag
|
||||||
|
; and allow double clock
|
||||||
|
lda TED_CHARGEN_ADDR
|
||||||
|
pha
|
||||||
|
and #255 - FORCE_SINGLE_CLOCK
|
||||||
|
sta TED_CHARGEN_ADDR
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; To be run at the end of every IRQ handler
|
||||||
|
.macro LOADER_IRQ_HANDLER_EPILOGUE
|
||||||
|
; restore force single clock flag
|
||||||
|
.local fast
|
||||||
|
|
||||||
|
pla
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
lda TED_CHARGEN_ADDR
|
||||||
|
and #255 - FORCE_SINGLE_CLOCK
|
||||||
|
bcc fast
|
||||||
|
ora #FORCE_SINGLE_CLOCK
|
||||||
|
fast: sta TED_CHARGEN_ADDR
|
||||||
|
.endmacro
|
||||||
|
.endif
|
||||||
|
|
||||||
|
|
||||||
|
; Install the loader
|
||||||
|
; note: KERNAL ROM must be enabled, and the I flag will be cleared (CLI)
|
||||||
|
; in: nothing
|
||||||
|
; out: c - set on error
|
||||||
|
; a - status
|
||||||
|
; x - drive type (one of diskio::drivetypes)
|
||||||
|
; y - if status is diskio::status::OK, zeropage address of version string address
|
||||||
|
.import install
|
||||||
|
.macro LOADER_INSTALL
|
||||||
|
jsr install
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.if LOAD_RAW_API
|
||||||
|
; Load a file without decompression
|
||||||
|
; in: x/y - x: lo, y: hi to 0-terminated filename string,
|
||||||
|
; zero-length file name will load next file
|
||||||
|
; c - if LOAD_TO_API != 0, c = 0: load to address as stored in the file
|
||||||
|
; c = 1: load to caller-specified address (loadaddrlo/hi)
|
||||||
|
; out: c - set on error
|
||||||
|
; a - status
|
||||||
|
.import loadraw
|
||||||
|
.macro LOADRAW name
|
||||||
|
.if LOAD_TO_API
|
||||||
|
clc
|
||||||
|
.endif
|
||||||
|
ldx #<(name)
|
||||||
|
ldy #>(name)
|
||||||
|
jsr loadraw
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro LOADNEXTRAW
|
||||||
|
lda #0
|
||||||
|
LOADRAW * - 1
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.if LOAD_TO_API
|
||||||
|
.macro LOADRAW_LOADTO name, dest
|
||||||
|
sec
|
||||||
|
lda #<(dest)
|
||||||
|
sta loadaddrlo
|
||||||
|
lda #>(dest)
|
||||||
|
sta loadaddrhi
|
||||||
|
ldx #<(name)
|
||||||
|
ldy #>(name)
|
||||||
|
jsr loadraw
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro LOADNEXTRAW_LOADTO dest
|
||||||
|
lda #0
|
||||||
|
LOADRAW_LOADTO * - 1, dest
|
||||||
|
.endmacro
|
||||||
|
.endif; LOAD_TO_API
|
||||||
|
.endif; LOAD_RAW_API
|
||||||
|
|
||||||
|
.if LOAD_COMPD_API
|
||||||
|
; Load a compressed file
|
||||||
|
; in: x/y - x: lo, y: hi to 0-terminated filename string,
|
||||||
|
; zero-length file name will load next file
|
||||||
|
; c - if DECOMPLOAD_TO_API != 0, c = 0: load to address as stored in the file
|
||||||
|
; c = 1: load with caller-specified address offset (loadaddroffslo/hi)*
|
||||||
|
; out: c - set on error
|
||||||
|
; a - status
|
||||||
|
; x/y - if DECOMPRESSOR = DECOMPRESSORS::PUCRUNCH, x: lo, y: hi of the loaded file's execution address
|
||||||
|
|
||||||
|
; * this is an offset rather than an absolute destination, as the original destination address required for calculating this offset is
|
||||||
|
; stored in the file, but to retrieve it, the first file block would have to be loaded first to the original load address or to an extra buffer
|
||||||
|
|
||||||
|
.import loadcompd
|
||||||
|
.import loadcompdopen
|
||||||
|
.import loadcompdexecute
|
||||||
|
.macro LOADCOMPD name
|
||||||
|
ldx #<(name)
|
||||||
|
ldy #>(name)
|
||||||
|
jsr loadcompd
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro LOADNEXTCOMPD
|
||||||
|
lda #0
|
||||||
|
LOADCOMPD * - 1
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.if LOAD_TO_API
|
||||||
|
.macro LOADCOMPD_RELTO name, load_address_offset
|
||||||
|
sec
|
||||||
|
lda #<(load_address_offset)
|
||||||
|
sta loadaddroffslo
|
||||||
|
lda #>(load_address_offset)
|
||||||
|
sta loadaddroffshi
|
||||||
|
ldx #<(name)
|
||||||
|
ldy #>(name)
|
||||||
|
jsr loadcompd
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro LOADNEXTCOMPD_RELTO dest_lo, dest_hi
|
||||||
|
lda #0
|
||||||
|
LOADCOMPD_RELTO #<(* - 1), #>(* - 1), dest_lo, dest_hi
|
||||||
|
.endmacro
|
||||||
|
.endif; LOAD_TO_API
|
||||||
|
.endif; LOAD_COMPD_API
|
||||||
|
|
||||||
|
.if FILE_EXISTS_API
|
||||||
|
; Check if file exists
|
||||||
|
; in: x/y - x: lo, y: hi to 0-terminated filename string
|
||||||
|
; out: c - set on file not found or error
|
||||||
|
; a - status
|
||||||
|
.import fileexists
|
||||||
|
.macro FILEEXISTS name
|
||||||
|
ldx #<(name)
|
||||||
|
ldy #>(name)
|
||||||
|
jsr fileexists
|
||||||
|
.endmacro
|
||||||
|
.endif; FILE_EXISTS_API
|
||||||
|
|
||||||
|
.if MEM_DECOMP_API
|
||||||
|
; Decompress a compressed file from memory
|
||||||
|
; in: x/y - x: lo, y: hi of compressed file in memory
|
||||||
|
; c - if MEMDECOMP_TO_API != 0, c = 0: decompress to address as stored in the file
|
||||||
|
; c = 1: decompress to caller-specified address (loadaddrlo/hi)
|
||||||
|
; out: x/y - if DECOMPRESSOR = DECOMPRESSORS::PUCRUNCH, x: lo, y: hi of the file's execution address
|
||||||
|
.import memdecomp
|
||||||
|
.macro MEMDECOMP source_lo, source_hi
|
||||||
|
.if MEM_DECOMP_TO_API
|
||||||
|
clc
|
||||||
|
.endif
|
||||||
|
ldx source_lo
|
||||||
|
ldy source_hi
|
||||||
|
jsr memdecomp
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.if MEM_DECOMP_TO_API
|
||||||
|
.macro MEMDECOMP_TO source_lo, source_hi, dest
|
||||||
|
sec
|
||||||
|
lda #<(dest)
|
||||||
|
sta decdestlo
|
||||||
|
lda #>(dest)
|
||||||
|
sta decdesthi
|
||||||
|
ldx source_lo
|
||||||
|
ldy source_hi
|
||||||
|
jsr memdecomp
|
||||||
|
.endmacro
|
||||||
|
.endif; MEM_DECOMP_TO_API
|
||||||
|
.endif; MEM_DECOMP_API
|
||||||
|
|
||||||
|
.endif; !install
|
||||||
|
.endif; !__NO_LOADER_SYMBOLS_IMPORT
|
||||||
|
|
||||||
|
.struct drivecode
|
||||||
|
entry .word; drive
|
||||||
|
to .word; drive
|
||||||
|
length .word; bytes
|
||||||
|
from .word; host
|
||||||
|
.endstruct
|
||||||
|
|
||||||
|
.struct swapparams
|
||||||
|
buffer .word; $0800 bytes for swapped loader drive code
|
||||||
|
|
||||||
|
drivecode41 .tag drivecode
|
||||||
|
.if ONLY_1541_AND_COMPATIBLE = 0
|
||||||
|
drivecode71 .tag drivecode
|
||||||
|
drivecode81 .tag drivecode
|
||||||
|
.endif; ONLY_1541_AND_COMPATIBLE = 0
|
||||||
|
.endstruct
|
||||||
|
|
||||||
|
.ifndef __NO_CUSTOMDRIVECODE_SYMBOLS_IMPORT
|
||||||
|
.ifndef swapdrvcod
|
||||||
|
.import swapdrvcod
|
||||||
|
.import restoreldr
|
||||||
|
.endif; !swapdrvcod
|
||||||
|
|
||||||
|
; Execute custom code in the drive, buffer loader code on host side before
|
||||||
|
; in: x/y - x: lo, y: hi of swapparams structure
|
||||||
|
; out: c - set on error
|
||||||
|
; a - status
|
||||||
|
.macro SWAP_DRIVECODE params
|
||||||
|
ldx #<(params)
|
||||||
|
ldy #>(params)
|
||||||
|
jsr swapdrvcod
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; Restore drive-side loader code
|
||||||
|
; in: nothing
|
||||||
|
; out: undefined
|
||||||
|
.macro RESTORE_LOADER
|
||||||
|
jsr restoreldr
|
||||||
|
.endmacro
|
||||||
|
.endif; !__NO_CUSTOMDRIVECODE_SYMBOLS_IMPORT
|
||||||
|
|
||||||
|
.struct saveparams
|
||||||
|
filename .word; existing file to overwrite, pointer to 0-terminated filename string
|
||||||
|
from .word; pointer to file data
|
||||||
|
length .word; length of file data in bytes
|
||||||
|
loadaddress .word; usually same as from
|
||||||
|
buffer .word; pointer to $0800 bytes for swapped loader drive code
|
||||||
|
.endstruct
|
||||||
|
|
||||||
|
.ifndef __NO_SAVE_SYMBOLS_IMPORT
|
||||||
|
.ifndef save
|
||||||
|
|
||||||
|
.import save
|
||||||
|
; Save a file by overwriting an existing file of the same block-size
|
||||||
|
; in: x/y - x: lo, y: hi of saveparams structure
|
||||||
|
; out: c - set on error
|
||||||
|
; a - status
|
||||||
|
.macro SAVE_OVERWRITE params
|
||||||
|
ldx #<(params)
|
||||||
|
ldy #>(params)
|
||||||
|
jsr save
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.endif; !save
|
||||||
|
.endif; !__NO_SAVE_SYMBOLS_IMPORT
|
||||||
|
|
||||||
|
.ifndef __NO_LOADER_SYMBOLS_IMPORT
|
||||||
|
|
||||||
|
.if UNINSTALL_API
|
||||||
|
; Uninstall the loader
|
||||||
|
; in: nothing
|
||||||
|
; out: undefined
|
||||||
|
.import uninstall
|
||||||
|
.macro LOADER_UNINSTALL
|
||||||
|
jsr uninstall
|
||||||
|
.endmacro
|
||||||
|
.endif; UNINSTALL_API
|
||||||
|
|
||||||
|
.if CLOSE_FILE_API
|
||||||
|
; Close an open file
|
||||||
|
; in: nothing
|
||||||
|
; out: undefined
|
||||||
|
.import closefile
|
||||||
|
.endif; CLOSE_FILE_API
|
||||||
|
|
||||||
|
|
||||||
|
; linker-generated loader segments symbols
|
||||||
|
|
||||||
|
.import __DISKIO_ZP_START__
|
||||||
|
.import __DISKIO_ZP_END__
|
||||||
|
.import __DISKIO_ZP_LOAD__
|
||||||
|
.import __DISKIO_ZP_RUN__
|
||||||
|
.import __DISKIO_ZP_SIZE__
|
||||||
|
|
||||||
|
.import __DISKIO_INSTALL_START__
|
||||||
|
.import __DISKIO_INSTALL_END__
|
||||||
|
.import __DISKIO_INSTALL_LOAD__
|
||||||
|
.import __DISKIO_INSTALL_RUN__
|
||||||
|
.import __DISKIO_INSTALL_SIZE__
|
||||||
|
|
||||||
|
.import __DISKIO_START__
|
||||||
|
.import __DISKIO_END__
|
||||||
|
.import __DISKIO_LOAD__
|
||||||
|
.import __DISKIO_RUN__
|
||||||
|
.import __DISKIO_SIZE__
|
||||||
|
|
||||||
|
.endif; !__NO_LOADER_SYMBOLS_IMPORT
|
||||||
|
|
||||||
|
|
||||||
|
.ifndef __NOIMPORTVARS
|
||||||
|
.ifndef loadaddrlo
|
||||||
|
.importzp loadaddrlo
|
||||||
|
.importzp loadaddrhi
|
||||||
|
|
||||||
|
.importzp loadaddroffslo
|
||||||
|
.importzp loadaddroffshi
|
||||||
|
|
||||||
|
.importzp decdestlo
|
||||||
|
.importzp decdesthi
|
||||||
|
|
||||||
|
.importzp endaddrlo
|
||||||
|
.importzp endaddrhi
|
||||||
|
|
||||||
|
.importzp bytesloadedlo
|
||||||
|
.importzp bytesloadedhi
|
||||||
|
.endif; !loadaddrlo
|
||||||
|
.endif; !__NOIMPORTVARS
|
||||||
|
|
||||||
|
.if PLATFORM <> diskio::platform::COMMODORE_16
|
||||||
|
.macro INIT_CLEAR_ATN_OUT_CLEAR_CLK_OUT_CLEAR_DATA_OUT
|
||||||
|
; this is executed during install and LEAVE_BUS_LOCK,
|
||||||
|
; hence it accesses the port register rather than the data direction register
|
||||||
|
lda #3
|
||||||
|
and CIA2_PRA
|
||||||
|
sta CIA2_PRA
|
||||||
|
.endmacro
|
||||||
|
.endif
|
||||||
|
|
||||||
|
; custom drive code API
|
||||||
|
|
||||||
|
.ifndef ID041
|
||||||
|
|
||||||
|
.importzp ID041
|
||||||
|
.importzp CURRTRACK41
|
||||||
|
.importzp NUMFILES41
|
||||||
|
.importzp SECTORLINKTABLE41
|
||||||
|
|
||||||
|
.import topofstack41
|
||||||
|
.import idleloop41
|
||||||
|
.import getbytecmp41
|
||||||
|
.import BLOCKBUFFER41
|
||||||
|
|
||||||
|
.importzp V1B41
|
||||||
|
.importzp V2B41
|
||||||
|
.importzp LEDSTATE41
|
||||||
|
.importzp FILESECTOR41
|
||||||
|
.importzp FILENAME41
|
||||||
|
.importzp LINKTRACK41
|
||||||
|
.importzp LINKSECTOR41
|
||||||
|
.importzp REQUESTEDSECTOR41
|
||||||
|
.import trkseek41
|
||||||
|
.import initlink41
|
||||||
|
.import sertoraw41
|
||||||
|
.import getbytewdog41
|
||||||
|
.import getbyte41
|
||||||
|
.import getbyterts41
|
||||||
|
.import setbv2b41
|
||||||
|
.import getblock41
|
||||||
|
.import idxloop41
|
||||||
|
.import wdogentr41
|
||||||
|
.import findfile41
|
||||||
|
.import loadfile41
|
||||||
|
|
||||||
|
.endif
|
||||||
|
|
||||||
|
; Return-to-loader macros
|
||||||
|
; upon execution, i-flag must be set, ATN must be asserted, DATA and CLK must be cleared
|
||||||
|
|
||||||
|
.macro RETURNTOLOADER41 hook
|
||||||
|
.scope
|
||||||
|
.assert * >= $0100, error, "Return to 1541 loader code too low in memory"
|
||||||
|
|
||||||
|
lda #$1a; ATNA_OUT | CLK_OUT | DATA_OUT
|
||||||
|
sta $1800; VIA1_PRB
|
||||||
|
|
||||||
|
lda $1800; VIA1_PRB
|
||||||
|
and #$60; DEVICE_NUMBER
|
||||||
|
ora #$94; ATN_IN | ATNA_OUT | CLK_IN
|
||||||
|
sta compare + 1
|
||||||
|
ldx #0
|
||||||
|
|
||||||
|
lda #$10; ATNA_OUT
|
||||||
|
sta $1800; VIA1_PRB
|
||||||
|
|
||||||
|
ldy $1800; VIA1_PRB
|
||||||
|
getbyte: lda #$80
|
||||||
|
getbit: cpy $1800; VIA1_PRB
|
||||||
|
beq getbit
|
||||||
|
ldy $1800; VIA1_PRB
|
||||||
|
compare: cpy #0
|
||||||
|
ror
|
||||||
|
bcc getbit
|
||||||
|
sta $00,x
|
||||||
|
inx
|
||||||
|
bne getbyte
|
||||||
|
|
||||||
|
hook
|
||||||
|
|
||||||
|
jmp $00da
|
||||||
|
|
||||||
|
.assert * <= $0800, error, "Return to 1541 loader code too high in memory"
|
||||||
|
.endscope
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.ifndef NUMFILES71
|
||||||
|
|
||||||
|
.importzp CURRTRACK71
|
||||||
|
.importzp LEDSTATE71
|
||||||
|
.importzp CLEARSECTORLINKTABLE71
|
||||||
|
.importzp FILENAME71
|
||||||
|
.importzp LINKTRACK71
|
||||||
|
.importzp LINKSECTOR71
|
||||||
|
.importzp SECTORLINKTABLE71
|
||||||
|
.importzp DIRSECTORS71
|
||||||
|
.importzp CUSTOMZPBUFFER71
|
||||||
|
.importzp CUSTOMUPLOADSIZE71
|
||||||
|
.importzp getbytrt71
|
||||||
|
.importzp CUSTOMPARAM71
|
||||||
|
|
||||||
|
.importzp bsetv2b71
|
||||||
|
.importzp trkseek71
|
||||||
|
.import initlink71
|
||||||
|
.import onemhz71
|
||||||
|
.import topofstack71
|
||||||
|
.import getblock71
|
||||||
|
.import idleloop71
|
||||||
|
.import findfile71
|
||||||
|
.import loadfile71
|
||||||
|
.import idxloop71
|
||||||
|
.import BLOCKBUFFER71
|
||||||
|
|
||||||
|
.endif
|
||||||
|
|
||||||
|
.macro RETURNTOLOADER71 hook
|
||||||
|
.scope
|
||||||
|
.assert * >= $0100, error, "Return to 1571 loader code too low in memory"
|
||||||
|
|
||||||
|
ldx #0
|
||||||
|
|
||||||
|
lda #$10; ATNA_OUT
|
||||||
|
sta $1800
|
||||||
|
|
||||||
|
ldy $1800; VIA1_PRB
|
||||||
|
getbyte: lda #$80
|
||||||
|
getbit: cpy $1800; VIA1_PRB
|
||||||
|
beq getbit
|
||||||
|
ldy $1800; VIA1_PRB
|
||||||
|
cpy #$94; ATN_IN | ATNA_OUT | CLK_IN
|
||||||
|
ror
|
||||||
|
bcc getbit
|
||||||
|
sta $00,x
|
||||||
|
inx
|
||||||
|
bne getbyte
|
||||||
|
|
||||||
|
hook
|
||||||
|
|
||||||
|
jmp $0037
|
||||||
|
|
||||||
|
.assert * <= $0800, error, "Return to 1571 loader code too high in memory"
|
||||||
|
.endscope
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.ifndef dcodinit81
|
||||||
|
|
||||||
|
.importzp CUSTOMPARAM81
|
||||||
|
|
||||||
|
.import dcodinit81
|
||||||
|
.import DRVCODEND81
|
||||||
|
.import BLOCKBUFFER81
|
||||||
|
.import CUSTOMRECEIVE81
|
||||||
|
.import filename81
|
||||||
|
.import swapzp81
|
||||||
|
.import getblock81
|
||||||
|
.import initwdog81
|
||||||
|
.import enablwdg81
|
||||||
|
.import initcntr81
|
||||||
|
.import bsyledon81
|
||||||
|
.import findfile81
|
||||||
|
.import loadfile81
|
||||||
|
.import DIRTRACKS81
|
||||||
|
|
||||||
|
.endif
|
||||||
|
|
||||||
|
.macro RETURNTOLOADER81 hook
|
||||||
|
.scope
|
||||||
|
.assert * >= DRVCODEND81, error, "Return to 1581 loader code too low in memory"
|
||||||
|
|
||||||
|
ldy #0
|
||||||
|
sty $4001; CIA_PRB
|
||||||
|
getbyte: lda #$80
|
||||||
|
getbit: pha
|
||||||
|
lda $4001; CIA_PRB
|
||||||
|
waitbit: cmp $4001; CIA_PRB
|
||||||
|
beq waitbit
|
||||||
|
lda $4001; CIA_PRB
|
||||||
|
and #$04; CLK_IN
|
||||||
|
cmp #$04; CLK_IN
|
||||||
|
pla
|
||||||
|
ror
|
||||||
|
bcc getbit
|
||||||
|
restore: sta $0300 & $ff00,y
|
||||||
|
iny
|
||||||
|
bne :+
|
||||||
|
inc restore + 2
|
||||||
|
: cpy #<DRVCODEND81
|
||||||
|
bne getbyte
|
||||||
|
lda restore + 2
|
||||||
|
cmp #>DRVCODEND81
|
||||||
|
bne getbyte
|
||||||
|
|
||||||
|
hook
|
||||||
|
|
||||||
|
waitrun: lda $4001; CIA_PRB
|
||||||
|
lsr
|
||||||
|
bcc waitrun
|
||||||
|
jmp dcodinit81
|
||||||
|
|
||||||
|
.endscope
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.popseg
|
||||||
|
|
||||||
|
.if (ALLOW_2_MHZ_ON_C128 & (PLATFORM = diskio::platform::COMMODORE_64)) | (PLATFORM = diskio::platform::COMMODORE_128)
|
||||||
|
USE_2_MHZ = 1
|
||||||
|
.else
|
||||||
|
USE_2_MHZ = 0
|
||||||
|
.endif
|
||||||
|
|
||||||
|
.if LOAD_VIA_KERNAL_FALLBACK
|
||||||
|
.if DIRTRACK <> 18
|
||||||
|
.error "***** Option LOAD_VIA_KERNAL_FALLBACK requires DIRTRACK to be 18 *****"
|
||||||
|
.endif
|
||||||
|
.if DIRTRACK81 <> 40
|
||||||
|
.error "***** Option LOAD_VIA_KERNAL_FALLBACK requires DIRTRACK81 to be 40 *****"
|
||||||
|
.endif
|
||||||
|
|
||||||
|
.if (PLATFORM = diskio::platform::COMMODORE_128) & ASYNCHRONOUS_BURST_HANDSHAKE
|
||||||
|
.error "***** Option LOAD_VIA_KERNAL_FALLBACK requires ASYNCHRONOUS_BURST_HANDSHAKE = 0 *****"
|
||||||
|
.endif
|
||||||
|
|
||||||
|
.macro CHECK_LOADER_ZP_ADDRESSES
|
||||||
|
.assert (loader_zp_first > STATUS) || (loader_zp_last < STATUS), error, "Loader zeropage variables cross KERNAL STATUS register at $90"
|
||||||
|
.assert (loader_zp_first > C3PO) || (loader_zp_last < C3PO), error, "Loader zeropage variables cross KERNAL serial buffer output char buffered flag C3PO at $94"
|
||||||
|
.assert (loader_zp_first > BSOUR) || (loader_zp_last < BSOUR), error, "Loader zeropage variables cross KERNAL serial buffer byte BSOUR at $95"
|
||||||
|
|
||||||
|
.if PLATFORM = diskio::platform::COMMODORE_16
|
||||||
|
.assert (loader_zp_first > LDTND) || (loader_zp_last < LDTND), error, "Loader zeropage variables cross KERNAL logical file index/open files count at $97"
|
||||||
|
.assert (loader_zp_first > DFLTN) || (loader_zp_last < DFLTN), error, "Loader zeropage variables cross KERNAL input device variable DFLTN at $98"
|
||||||
|
.assert (loader_zp_first > DFLTO) || (loader_zp_last < DFLTO), error, "Loader zeropage variables cross KERNAL output device variable DFLTO at $99"
|
||||||
|
.assert (loader_zp_first > R2D2) || (loader_zp_last < R2D2), error, "Loader zeropage variables cross KERNAL serial bus EOI flag R2D2 at $a6"
|
||||||
|
.assert (loader_zp_first > BSOUR1) || (loader_zp_last < BSOUR1), error, "Loader zeropage variables cross KERNAL serial bus shift counter BSOUR1 at $a8"
|
||||||
|
.assert (loader_zp_first > COUNT) || (loader_zp_last < COUNT), error, "Loader zeropage variables cross KERNAL serial bus counter COUNT at $aa"
|
||||||
|
.assert (loader_zp_first > USE4DY) || (loader_zp_last < USE4DY), error, "Loader zeropage variables cross KERNAL parallel drive state register USE4DY at $f9"
|
||||||
|
.else; PLATFORM <> diskio::platform::COMMODORE_16
|
||||||
|
.assert (loader_zp_first > LDTND) || (loader_zp_last < LDTND), error, "Loader zeropage variables cross KERNAL logical file index/open files count at $98"
|
||||||
|
.assert (loader_zp_first > DFLTN) || (loader_zp_last < DFLTN), error, "Loader zeropage variables cross KERNAL input device variable DFLTN at $99"
|
||||||
|
.assert (loader_zp_first > DFLTO) || (loader_zp_last < DFLTO), error, "Loader zeropage variables cross KERNAL output device variable DFLTO at $9a"
|
||||||
|
.assert (loader_zp_first > R2D2) || (loader_zp_last < R2D2), error, "Loader zeropage variables cross KERNAL serial bus EOI flag R2D2 at $a3"
|
||||||
|
.assert (loader_zp_first > BSOUR1) || (loader_zp_last < BSOUR1), error, "Loader zeropage variables cross KERNAL serial bus shift counter BSOUR1 at $a4"
|
||||||
|
.assert (loader_zp_first > COUNT) || (loader_zp_last < COUNT), error, "Loader zeropage variables cross KERNAL serial bus counter COUNT at $a5"
|
||||||
|
.endif; PLATFORM <> diskio::platform::COMMODORE_16
|
||||||
|
.endmacro
|
||||||
|
.else
|
||||||
|
.macro CHECK_LOADER_ZP_ADDRESSES
|
||||||
|
.endmacro
|
||||||
|
.endif
|
||||||
|
|
||||||
|
.endif; _LOADER_INC_
|
||||||
319
loader/samples/benchmark/Makefile
Normal file
|
|
@ -0,0 +1,319 @@
|
||||||
|
|
||||||
|
NAME = benchmark
|
||||||
|
BENCH ?= BITFIRE
|
||||||
|
LOADERCPU ?= 100
|
||||||
|
ALIGNED ?= 0
|
||||||
|
_PLATFORM_ = c64
|
||||||
|
|
||||||
|
export LOG
|
||||||
|
|
||||||
|
BUILDDIR = ../../build
|
||||||
|
DISKIMAGE = $(BUILDDIR)/$(NAME)-$(LOADERCPU)-$(_PLATFORM_).d64
|
||||||
|
|
||||||
|
default: $(DISKIMAGE)
|
||||||
|
|
||||||
|
run_bitfire:
|
||||||
|
make run BENCH=BITFIRE
|
||||||
|
|
||||||
|
run_spindle_code:
|
||||||
|
make run BENCH=SPINDLE_CODE
|
||||||
|
|
||||||
|
run_spindle_graphics:
|
||||||
|
make run BENCH=SPINDLE_GRAPHICS
|
||||||
|
|
||||||
|
perfbench_bitfire:
|
||||||
|
make perfbench BENCH=BITFIRE
|
||||||
|
|
||||||
|
perfbench_spindle_code:
|
||||||
|
make perfbench BENCH=SPINDLE_CODE
|
||||||
|
|
||||||
|
perfbench_spindle_graphics:
|
||||||
|
make perfbench BENCH=SPINDLE_GRAPHICS
|
||||||
|
|
||||||
|
perfbench: LOG=1
|
||||||
|
perfbench:
|
||||||
|
rm -f benchmark.log
|
||||||
|
make clean
|
||||||
|
make run LOADERCPU=100
|
||||||
|
make run LOADERCPU=90
|
||||||
|
make run LOADERCPU=80
|
||||||
|
make run LOADERCPU=70
|
||||||
|
make run LOADERCPU=60
|
||||||
|
make run LOADERCPU=50
|
||||||
|
make run LOADERCPU=40
|
||||||
|
make run LOADERCPU=30
|
||||||
|
make run LOADERCPU=20
|
||||||
|
make run LOADERCPU=10
|
||||||
|
$(MAKE_TEX) < benchmark.log
|
||||||
|
|
||||||
|
perftest: LOG=1
|
||||||
|
perftest:
|
||||||
|
rm -f benchmark.log
|
||||||
|
make clean
|
||||||
|
make run LOADERCPU=100
|
||||||
|
$(MAKE_TEX) < benchmark.log
|
||||||
|
|
||||||
|
ifeq "$(BENCH)" "BITFIRE"
|
||||||
|
MONCOMMANDS := benchmark-bitfire.mon
|
||||||
|
MAKE_TEX := ./make-tex-graph-bitfire.lua
|
||||||
|
else
|
||||||
|
MONCOMMANDS := benchmark-spindle.mon
|
||||||
|
ifeq "$(BENCH)" "SPINDLE_CODE"
|
||||||
|
MAKE_TEX := ./make-tex-graph-spindle-code.lua
|
||||||
|
else
|
||||||
|
MAKE_TEX := ./make-tex-graph-spindle-graphics.lua
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq "$(LOG)" "1"
|
||||||
|
VICE = x64sc +saveres -warp -minimized -autostartprgmode 1 +cart -debugcart -monlogname benchmark.log -moncommands $(MONCOMMANDS)
|
||||||
|
else
|
||||||
|
VICE = x64sc
|
||||||
|
endif
|
||||||
|
EMU = $(VICE) -drive8type 1541 -drive9type 0 -8
|
||||||
|
EMU71 = $(VICE) -drive8type 1571 -drive9type 0 -8
|
||||||
|
EMU81 = $(VICE) -drive8type 1581 -drive9type 0 -8
|
||||||
|
|
||||||
|
AS = cl65
|
||||||
|
AS_FLAGS = -Wa -I../../build -u __EXEHDR__
|
||||||
|
|
||||||
|
CC1541 = ../../tools/cc1541/cc1541 -v
|
||||||
|
#CC1541 = ../../tools/cc1541/repo4/cc1541/cc1541 -v
|
||||||
|
CC1541_SOURCE = ../../tools/cc1541
|
||||||
|
|
||||||
|
B2 = ../../tools/b2/b2.exe
|
||||||
|
B2_SOURCE = ../../tools/b2
|
||||||
|
|
||||||
|
BITNAX = ../../tools/bitnax-07a8c67/lz
|
||||||
|
|
||||||
|
DOYNAX_LZ = ../../tools/doynamite1.1/lz
|
||||||
|
|
||||||
|
EXO = ../../tools/exomizer-3.1/src/exomizer
|
||||||
|
EXO_SOURCE = ../../tools/exomizer-3.1/src
|
||||||
|
|
||||||
|
LC = ../../tools/wcrush/wcrush/wcrush
|
||||||
|
LCSPEED = 6
|
||||||
|
LC_SOURCE = ../../tools/wcrush
|
||||||
|
|
||||||
|
LZSA2 = ../../tools/lzsa/lzsa
|
||||||
|
LZSA2_SOURCE = ../../tools/lzsa
|
||||||
|
|
||||||
|
NC = ../../tools/nucrunch-1.0.1/target/release/nucrunch
|
||||||
|
NC_SOURCE = ../../tools/nucrunch-1.0.1
|
||||||
|
|
||||||
|
PU = ../../tools/pucrunch/pucrunch
|
||||||
|
PU_SOURCE = ../../tools/pucrunch
|
||||||
|
|
||||||
|
SUBSIZER = ../../tools/subsizer-0.7pre1/subsizer
|
||||||
|
SUBSIZER_SRC = ../../tools/subsizer-0.7pre1/src
|
||||||
|
|
||||||
|
TC = python ../../tools/tinycrunch_v1.2/tc_encode.py
|
||||||
|
|
||||||
|
TS_ENCODER = ../../tools/tscrunch/tscrunch.py
|
||||||
|
TS = python3 $(TS_ENCODER)
|
||||||
|
|
||||||
|
ZX0 = ../../tools/dali/dali
|
||||||
|
ZX0_SRC = ../../tools/dali
|
||||||
|
|
||||||
|
CONV = ../../tools/compressedfileconverter.pl
|
||||||
|
|
||||||
|
RM = rm -f
|
||||||
|
CP = cp
|
||||||
|
MV = mv
|
||||||
|
|
||||||
|
INTERMDIR = ../../build/intermediate
|
||||||
|
LOADER_SRC = ../../src
|
||||||
|
LOADER = $(BUILDDIR)/loader-$(_PLATFORM_).prg
|
||||||
|
|
||||||
|
RESOURCESDIR = ../resources
|
||||||
|
TEST = $(RESOURCESDIR)/test.prg
|
||||||
|
|
||||||
|
SOURCE = $(NAME).s
|
||||||
|
LOADERCFG = loaderconfig.inc
|
||||||
|
ASSEMBLE = $(INTERMDIR)/$(NAME)-$(LOADERCPU)-uncompressed-$(_PLATFORM_).prg
|
||||||
|
DISKIMAGE81 = $(BUILDDIR)/$(NAME)-$(_PLATFORM_).d81
|
||||||
|
|
||||||
|
EXTENSION_NONE := prg
|
||||||
|
EXTENSION_BITNAX := bnx
|
||||||
|
EXTENSION_BYTEBOOZER2 := b2
|
||||||
|
EXTENSION_DOYNAX_LZ := dnx
|
||||||
|
EXTENSION_EXOMIZER := exo
|
||||||
|
EXTENSION_LEVELCRUSH := lc
|
||||||
|
EXTENSION_LZSA2 := lzsa2
|
||||||
|
EXTENSION_NUCRUNCH := nc
|
||||||
|
EXTENSION_PUCRUNCH := pu
|
||||||
|
EXTENSION_SUBSIZER := ssz
|
||||||
|
EXTENSION_TINYCRUNCH := tc
|
||||||
|
EXTENSION_TSCRUNCH := ts
|
||||||
|
EXTENSION_ZX0 := zx0
|
||||||
|
|
||||||
|
COMPRESSOR := $(shell grep -m 1 'DECOMPRESSORS::' $(LOADERCFG) | sed 's/.*DECOMPRESSORS::\([^; ]*\).*/\1/')
|
||||||
|
COMPEXT := $(EXTENSION_$(COMPRESSOR))
|
||||||
|
|
||||||
|
BENCH_IDX_BITFIRE = 0
|
||||||
|
FILENAMES_BITFIRE = test a b c d e f g h i j k l m n o p q r
|
||||||
|
MINTRACKS_BITFIRE = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||||
|
INTERLEAVES_BITFIRE = 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
|
||||||
|
#INTERLEAVES_BITFIRE = -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4
|
||||||
|
#INTERLEAVES_BITFIRE = -4 -4 -4 -4 -4 -4 -4 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3
|
||||||
|
|
||||||
|
BENCH_IDX_SPINDLE_CODE = 1
|
||||||
|
FILENAMES_SPINDLE_CODE = test x0 x1 x2 x3 x4 x5 x6 x7
|
||||||
|
MINTRACKS_SPINDLE_CODE = 1 1 1 1 1 1 1 1 1
|
||||||
|
INTERLEAVES_SPINDLE_CODE = 4 4 4 4 4 4 4 4 4
|
||||||
|
|
||||||
|
BENCH_IDX_SPINDLE_GRAPHICS = 2
|
||||||
|
FILENAMES_SPINDLE_GRAPHICS = test y0 y1 y2 y3 y4 y5 y6 y7
|
||||||
|
MINTRACKS_SPINDLE_GRAPHICS = 1 1 1 1 1 1 1 1 1
|
||||||
|
INTERLEAVES_SPINDLE_GRAPHICS = 4 4 4 4 4 4 4 4 4
|
||||||
|
|
||||||
|
FILES = $(patsubst %, $(INTERMDIR)/%.$(COMPEXT), $(FILENAMES_$(BENCH)))
|
||||||
|
IMAGEFILES__ = $(foreach filename, $(FILENAMES_$(BENCH)),$(patsubst %,^-f^"%",$(filename).$(COMPEXT))$(patsubst %,^-w^$(INTERMDIR)/%.$(COMPEXT),$(filename)))
|
||||||
|
IMAGEFILES_ = $(subst "test.$(COMPEXT)","test", $(IMAGEFILES__))
|
||||||
|
IMAGEFILES = $(subst ^, ,$(join $(addprefix -r^,$(MINTRACKS_$(BENCH))),$(join $(addprefix ^-S^,$(INTERLEAVES_$(BENCH))),$(patsubst %,^%,$(IMAGEFILES_)))))
|
||||||
|
IMAGEFILES81 = $(subst ^, ,$(join $(addprefix -r^,$(MINTRACKS_$(BENCH))),$(patsubst %,^%,$(IMAGEFILES_))))
|
||||||
|
|
||||||
|
ifeq "$(COMPRESSOR)" "NONE"
|
||||||
|
$(DISKIMAGE): $(ASSEMBLE) $(FILES) $(CC1541)
|
||||||
|
$(RM) $@
|
||||||
|
$(CC1541) -n "normal is boring" -i plush -4 \
|
||||||
|
$(IMAGEFILES) \
|
||||||
|
-f test-loopfile -l test \
|
||||||
|
-f test-loopfile2 -l test \
|
||||||
|
$@
|
||||||
|
else
|
||||||
|
$(DISKIMAGE): $(ASSEMBLE) $(FILES) $(CC1541)
|
||||||
|
$(RM) $@
|
||||||
|
$(CC1541) -n "normal is boring" -i plush \
|
||||||
|
$(IMAGEFILES) \
|
||||||
|
-f test-loopfile -l test \
|
||||||
|
-S 4 -r 29 -e -f $(NAME) -w $< \
|
||||||
|
-g $(basename $@).g64 \
|
||||||
|
$@
|
||||||
|
endif
|
||||||
|
# -w $(RESOURCESDIR)/room_0031.prg \
|
||||||
|
# -w $(RESOURCESDIR)/0031.zx0.prg \
|
||||||
|
# -w $(RESOURCESDIR)/zb \
|
||||||
|
|
||||||
|
$(DISKIMAGE81): $(ASSEMBLE) $(FILES) $(CC1541)
|
||||||
|
$(RM) $@
|
||||||
|
$(CC1541) -n "normal is boring" -i plush \
|
||||||
|
-r 39 -f $(NAME) -w $< \
|
||||||
|
$(IMAGEFILES81) \
|
||||||
|
$@
|
||||||
|
|
||||||
|
$(ASSEMBLE): $(SOURCE) $(LOADER)
|
||||||
|
$(AS) $(AS_FLAGS) -C c64-asm.cfg -Wa -DPLATFORM=64 -Wa -DBENCHMARK=$(BENCH_IDX_$(BENCH)) -Wa -DLOADERCPU=$(LOADERCPU) -o $@ $<
|
||||||
|
|
||||||
|
$(LOADER): $(LOADERCFG)
|
||||||
|
make -C $(LOADER_SRC) EXTCONFIGPATH=../samples/$(NAME) PLATFORM=$(_PLATFORM_) PROJECT=$(NAME) INSTALL=0f00 RESIDENT=0a00 ZP=02 prg
|
||||||
|
|
||||||
|
run: $(DISKIMAGE)
|
||||||
|
ifeq "$(ALIGNED)" "0"
|
||||||
|
$(EMU) $(realpath $^) $(ASSEMBLE)
|
||||||
|
else
|
||||||
|
$(EMU) $(basename $(realpath $^)).g64 $(ASSEMBLE)
|
||||||
|
endif
|
||||||
|
|
||||||
|
run71 run70: $(DISKIMAGE)
|
||||||
|
$(EMU71) $(realpath $^) $(ASSEMBLE)
|
||||||
|
|
||||||
|
run81: $(DISKIMAGE81)
|
||||||
|
$(EMU81) $(realpath $^) $(ASSEMBLE)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
-$(RM) *.o $(ASSEMBLE) $(DISKIMAGE) $(BUILDDIR)/loadersymbols-c64.prg $(BUILDDIR)/install-c64.prg $(BUILDDIR)/loader-c64.prg \
|
||||||
|
$(INTERMDIR)/test.prg \
|
||||||
|
$(INTERMDIR)/*.b2 $(INTERMDIR)/*.bnx $(INTERMDIR)/*.dnx $(INTERMDIR)/*.exo $(INTERMDIR)/*.lc $(INTERMDIR)/*.lzsa2 $(INTERMDIR)/*.nc $(INTERMDIR)/*.pu $(INTERMDIR)/*.ssz $(INTERMDIR)/*.tc $(INTERMDIR)/*.ts $(INTERMDIR)/*.zx0
|
||||||
|
|
||||||
|
|
||||||
|
$(CC1541): $(CC1541_SOURCE)/cc1541.c
|
||||||
|
$(MAKE) -C $(CC1541_SOURCE) cc1541
|
||||||
|
|
||||||
|
|
||||||
|
$(INTERMDIR)/%.prg: $(RESOURCESDIR)/%
|
||||||
|
$(CP) $^ $@
|
||||||
|
|
||||||
|
EXTENSIONS := prg bnx b2 dnx exo lc lzsa2 nc pu ssz tc ts zx0
|
||||||
|
|
||||||
|
define COPY
|
||||||
|
$(INTERMDIR)/x%.$(1): $(INTERMDIR)/x.$(1)
|
||||||
|
$(CP) $$^ $$@
|
||||||
|
|
||||||
|
$(INTERMDIR)/y%.$(1): $(INTERMDIR)/y.$(1)
|
||||||
|
$(CP) $$^ $$@
|
||||||
|
endef
|
||||||
|
|
||||||
|
$(foreach extension,$(EXTENSIONS),$(eval $(call COPY,$(extension))))
|
||||||
|
|
||||||
|
$(INTERMDIR)/%.b2: $(INTERMDIR)/%.prg $(B2)
|
||||||
|
$(B2) $<
|
||||||
|
$(MV) $<.b2 $@
|
||||||
|
|
||||||
|
$(INTERMDIR)/%.bnx: $(INTERMDIR)/%.prg $(BITNAX)
|
||||||
|
$(BITNAX) --bitfire -o $@ $<
|
||||||
|
|
||||||
|
$(INTERMDIR)/%.dnx: $(INTERMDIR)/%.prg $(DOYNAX_LZ)
|
||||||
|
$(DOYNAX_LZ) -o $@ $<
|
||||||
|
$(CONV) dnx $< $@ $@
|
||||||
|
|
||||||
|
$(INTERMDIR)/%.exo: $(INTERMDIR)/%.prg $(EXO)
|
||||||
|
$(EXO) mem -f $< -o $@
|
||||||
|
|
||||||
|
$(INTERMDIR)/%.lc: $(INTERMDIR)/%.prg $(LC)
|
||||||
|
$(LC) $(LCSPEED) $< $@
|
||||||
|
$(CONV) lc $< $@ $@
|
||||||
|
|
||||||
|
$(INTERMDIR)/%.lzsa2: $(INTERMDIR)/%.prg $(LZSA2)
|
||||||
|
$(LZSA2) -f 2 $< $@
|
||||||
|
|
||||||
|
$(INTERMDIR)/%.nc: $(INTERMDIR)/%.prg $(NC)
|
||||||
|
$(NC) $< --auto -o $@
|
||||||
|
|
||||||
|
$(INTERMDIR)/%.pu: $(INTERMDIR)/%.prg $(PU)
|
||||||
|
$(PU) -c0 -x 0 $< $@
|
||||||
|
|
||||||
|
$(INTERMDIR)/%.ssz: $(INTERMDIR)/%.prg $(SUBSIZER)
|
||||||
|
$(SUBSIZER) -m -f -o $@ $<
|
||||||
|
|
||||||
|
$(INTERMDIR)/%.tc: $(INTERMDIR)/%.prg
|
||||||
|
$(TC) --inPlace $< $@
|
||||||
|
|
||||||
|
$(INTERMDIR)/%.ts: $(INTERMDIR)/%.prg $(TS_ENCODER)
|
||||||
|
$(TS) -i $< $@
|
||||||
|
|
||||||
|
$(INTERMDIR)/%.zx0: $(INTERMDIR)/%.prg $(ZX0)
|
||||||
|
$(ZX0) -o $@ $<
|
||||||
|
|
||||||
|
$(BITNAX):
|
||||||
|
$(CC) $@.c -o $@
|
||||||
|
|
||||||
|
$(B2):
|
||||||
|
$(MAKE) -C $(B2_SOURCE)
|
||||||
|
|
||||||
|
$(DOYNAX_LZ):
|
||||||
|
$(CC) $@.c -o $@
|
||||||
|
|
||||||
|
$(EXO):
|
||||||
|
$(MAKE) -C $(EXO_SOURCE)
|
||||||
|
|
||||||
|
$(LC):
|
||||||
|
$(MAKE) -C $(LC_SOURCE)
|
||||||
|
|
||||||
|
$(LZSA2):
|
||||||
|
$(MAKE) -C $(LZSA2_SOURCE)
|
||||||
|
|
||||||
|
$(NC):
|
||||||
|
$(MAKE) -C $(NC_SOURCE)
|
||||||
|
|
||||||
|
$(PU):
|
||||||
|
$(MAKE) -C $(PU_SOURCE)
|
||||||
|
|
||||||
|
$(SUBSIZER):
|
||||||
|
$(MAKE) -C $(SUBSIZER_SRC)
|
||||||
|
|
||||||
|
$(TS):
|
||||||
|
$(BUILD_TS)
|
||||||
|
|
||||||
|
$(ZX0):
|
||||||
|
$(MAKE) -C $(ZX0_SRC)
|
||||||
2
loader/samples/benchmark/benchmark-bitfire.mon
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
watch store d7fe
|
||||||
|
command 1 "log on;m fd ff;log off;x"
|
||||||
2
loader/samples/benchmark/benchmark-spindle.mon
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
watch store d7fe
|
||||||
|
command 1 "log on;m 0428 0428;m 0429 0438;log off;x"
|
||||||
310
loader/samples/benchmark/benchmark.s
Normal file
|
|
@ -0,0 +1,310 @@
|
||||||
|
|
||||||
|
; all measurements are done with video frame granularity on PAL
|
||||||
|
|
||||||
|
.ifndef LOADERCPU
|
||||||
|
LOADERCPU = 100; per cent
|
||||||
|
.endif
|
||||||
|
|
||||||
|
OVERALL = (BENCHMARK = BITFIRE)
|
||||||
|
|
||||||
|
.enum
|
||||||
|
BITFIRE = 0; throughput is 185526 * 50 / <printed value> = X B/s
|
||||||
|
SPINDLE_CODE = 1; throughput is $4000 * 50 / <median of printed values> = X B/s
|
||||||
|
SPINDLE_GRAPHICS = 2; throughput is $4400 * 50 / <median of printed values> = X B/s
|
||||||
|
.endenum
|
||||||
|
|
||||||
|
VERIFY = 0
|
||||||
|
NONSEQUENTIAL = 0
|
||||||
|
|
||||||
|
FILECOUNT = $fc
|
||||||
|
LOADER_CPU = $fd
|
||||||
|
FRAMECOUNT = $fe
|
||||||
|
|
||||||
|
.include "loadersymbols-c64.inc"
|
||||||
|
|
||||||
|
.ifdef loadcompd
|
||||||
|
LOAD = loadcompd
|
||||||
|
.else
|
||||||
|
LOAD = loadraw
|
||||||
|
.endif
|
||||||
|
|
||||||
|
.org $080d
|
||||||
|
|
||||||
|
lda #$7f
|
||||||
|
sta $dc0d
|
||||||
|
|
||||||
|
jsr install
|
||||||
|
|
||||||
|
ldx #<test
|
||||||
|
ldy #>test
|
||||||
|
jsr LOAD
|
||||||
|
bcc :+
|
||||||
|
|
||||||
|
error: inc $d021
|
||||||
|
sta $d021
|
||||||
|
jmp error
|
||||||
|
|
||||||
|
: lda #$35
|
||||||
|
sta $01
|
||||||
|
|
||||||
|
lda numfiles
|
||||||
|
sta FILECOUNT
|
||||||
|
lda #LOADERCPU
|
||||||
|
sta LOADER_CPU
|
||||||
|
sta $0428
|
||||||
|
lda #0
|
||||||
|
ldx #38
|
||||||
|
: sta $0429,x
|
||||||
|
dex
|
||||||
|
bpl :-
|
||||||
|
|
||||||
|
.if LOADERCPU < 100
|
||||||
|
|
||||||
|
lda #<irq
|
||||||
|
sta $fffe
|
||||||
|
lda #>irq
|
||||||
|
sta $ffff
|
||||||
|
|
||||||
|
lda #$1b
|
||||||
|
sta $d011
|
||||||
|
lda #$33
|
||||||
|
sta $d012
|
||||||
|
|
||||||
|
lda #$01
|
||||||
|
sta $d01a
|
||||||
|
sta $d019
|
||||||
|
|
||||||
|
.endif
|
||||||
|
lda #<((312 * 63) - 1); PAL
|
||||||
|
sta $dc04
|
||||||
|
lda #>((312 * 63) - 1); PAL
|
||||||
|
sta $dc05
|
||||||
|
lda #$ff
|
||||||
|
sta $dc06
|
||||||
|
sta $dc07
|
||||||
|
.if OVERALL
|
||||||
|
.else
|
||||||
|
loadnext:
|
||||||
|
.endif
|
||||||
|
lda #$51
|
||||||
|
sta $dc0f
|
||||||
|
sta $dc0e
|
||||||
|
.if OVERALL
|
||||||
|
loadnext:
|
||||||
|
.endif
|
||||||
|
|
||||||
|
.if NONSEQUENTIAL
|
||||||
|
lda filenames
|
||||||
|
inc * - 2
|
||||||
|
sta filename
|
||||||
|
ldx #<filename
|
||||||
|
ldy #>filename
|
||||||
|
.else
|
||||||
|
ldx #<next
|
||||||
|
ldy #>next
|
||||||
|
.endif
|
||||||
|
jsr LOAD
|
||||||
|
.if LOADERCPU < 100
|
||||||
|
bcs error
|
||||||
|
.endif
|
||||||
|
.if OVERALL
|
||||||
|
.else
|
||||||
|
;lda #0
|
||||||
|
sta $dc0e
|
||||||
|
ldx #0
|
||||||
|
inc * - 1
|
||||||
|
sec
|
||||||
|
lda #$ff
|
||||||
|
sbc $dc06
|
||||||
|
sta $0429,x
|
||||||
|
lda #$ff
|
||||||
|
sbc $dc07
|
||||||
|
sta $0429 + 8,x
|
||||||
|
.endif
|
||||||
|
.if VERIFY
|
||||||
|
jsr checksum
|
||||||
|
.endif
|
||||||
|
dec FILECOUNT
|
||||||
|
bne loadnext
|
||||||
|
|
||||||
|
.if OVERALL
|
||||||
|
;lda #0
|
||||||
|
sta $dc0e
|
||||||
|
sec
|
||||||
|
lda #$ff
|
||||||
|
sbc $dc06
|
||||||
|
tay
|
||||||
|
lda #$ff
|
||||||
|
sbc $dc07
|
||||||
|
tax
|
||||||
|
tya
|
||||||
|
.else
|
||||||
|
clc
|
||||||
|
lda #0
|
||||||
|
tax
|
||||||
|
ldy numfiles
|
||||||
|
dey
|
||||||
|
: adc $0429,y
|
||||||
|
bcc :+
|
||||||
|
inx
|
||||||
|
clc
|
||||||
|
: dey
|
||||||
|
bpl :--
|
||||||
|
.endif
|
||||||
|
sta FRAMECOUNT + 0
|
||||||
|
stx FRAMECOUNT + 1
|
||||||
|
|
||||||
|
jsr prntfrmcnt
|
||||||
|
|
||||||
|
lda #0
|
||||||
|
sta $d7fe
|
||||||
|
sta $d7ff
|
||||||
|
|
||||||
|
done: inc $d020
|
||||||
|
jmp done
|
||||||
|
|
||||||
|
prntfrmcnt: ldx #1
|
||||||
|
ldy #0
|
||||||
|
jsr :+
|
||||||
|
dex
|
||||||
|
: lda FRAMECOUNT,x
|
||||||
|
pha
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
jsr :+
|
||||||
|
pla
|
||||||
|
and #$0f
|
||||||
|
: clc
|
||||||
|
adc #'0'
|
||||||
|
cmp #'9' + 1
|
||||||
|
bcc :+
|
||||||
|
sbc #'9'
|
||||||
|
: sta $0400,y
|
||||||
|
iny
|
||||||
|
rts
|
||||||
|
|
||||||
|
.if LOADERCPU < 100
|
||||||
|
|
||||||
|
irq: pha
|
||||||
|
txa
|
||||||
|
pha
|
||||||
|
tya
|
||||||
|
pha
|
||||||
|
|
||||||
|
lda $d020
|
||||||
|
pha
|
||||||
|
ldx #<(312 * (100 - LOADERCPU) / 100); PAL
|
||||||
|
ldy #>(312 * (100 - LOADERCPU) / 100); PAL
|
||||||
|
: lda $d012
|
||||||
|
: inc $d020
|
||||||
|
cmp $d012
|
||||||
|
beq :-
|
||||||
|
dex
|
||||||
|
bne :--
|
||||||
|
dey
|
||||||
|
bpl :--
|
||||||
|
pla
|
||||||
|
sta $d020
|
||||||
|
|
||||||
|
pla
|
||||||
|
tay
|
||||||
|
pla
|
||||||
|
tax
|
||||||
|
pla
|
||||||
|
inc $d019
|
||||||
|
rti
|
||||||
|
|
||||||
|
.endif
|
||||||
|
|
||||||
|
numfiles:
|
||||||
|
.if BENCHMARK = BITFIRE
|
||||||
|
.byte 18
|
||||||
|
.else
|
||||||
|
.byte 8
|
||||||
|
.endif
|
||||||
|
test: .asciiz "test"
|
||||||
|
.if NONSEQUENTIAL
|
||||||
|
filename: .asciiz " .tc"
|
||||||
|
filenames: .byte "abcdefghijklmnopqr"
|
||||||
|
.else
|
||||||
|
next = * - 1
|
||||||
|
.endif
|
||||||
|
|
||||||
|
.if VERIFY
|
||||||
|
|
||||||
|
OFFSET = 0; $e9
|
||||||
|
|
||||||
|
checksum: ldy #0
|
||||||
|
lda verify,y
|
||||||
|
sec
|
||||||
|
sbc #<OFFSET
|
||||||
|
sta checkloop + 1
|
||||||
|
lda verify + 1,y
|
||||||
|
sbc #>OFFSET
|
||||||
|
sta checkloop + 2
|
||||||
|
sec
|
||||||
|
lda verify + 2,y
|
||||||
|
sbc verify,y
|
||||||
|
tax
|
||||||
|
lda verify + 3,y
|
||||||
|
sbc verify + 1,y
|
||||||
|
tay
|
||||||
|
clc
|
||||||
|
txa
|
||||||
|
eor #$ff
|
||||||
|
adc #1
|
||||||
|
tax
|
||||||
|
tya
|
||||||
|
eor #$ff
|
||||||
|
adc #0
|
||||||
|
tay
|
||||||
|
clc
|
||||||
|
lda #0
|
||||||
|
checkloop: adc $ff00
|
||||||
|
inc checkloop + 1
|
||||||
|
bne :+
|
||||||
|
inc checkloop + 2
|
||||||
|
: inx
|
||||||
|
bne checkloop
|
||||||
|
iny
|
||||||
|
bne checkloop
|
||||||
|
ldy checksum + 1
|
||||||
|
ldx verify + 4,y
|
||||||
|
cmp verify + 4,y
|
||||||
|
bne chksumfail
|
||||||
|
tya
|
||||||
|
clc
|
||||||
|
adc #6
|
||||||
|
sta checksum + 1
|
||||||
|
rts
|
||||||
|
|
||||||
|
chksumfail: .byte 2
|
||||||
|
|
||||||
|
verify: .word $a800, $b4f2, $f4; a
|
||||||
|
.word $2800, $bf80, $24; b
|
||||||
|
.word $7400, $bd00, $af; c
|
||||||
|
.word $2f80, $4900, $8d; d
|
||||||
|
.word $2800, $6600, $9d; e
|
||||||
|
.word $2800, $4396, $69; f
|
||||||
|
.word $5c00, $62d5, $7e; g
|
||||||
|
.word $2800, $2d00, $e9; h
|
||||||
|
.word $2900, $4500, $50; i
|
||||||
|
.word $4800, $6358, $b0; j
|
||||||
|
.word $2800, $6200, $39; k
|
||||||
|
.word $6100, $7300, $45; l
|
||||||
|
.word $2800, $67a1, $9c; m
|
||||||
|
.word $b900, $bef7, $f8; n
|
||||||
|
.word $6600, $8000, $a3; o
|
||||||
|
.word $9000, $af00, $d4; p
|
||||||
|
.word $2800, $666b, $b8; q
|
||||||
|
.word $8000, $a800, $58; r
|
||||||
|
|
||||||
|
.endif; VERIFY
|
||||||
|
|
||||||
|
.res LOAD - *
|
||||||
|
.incbin "../../build/loader-c64.prg", 2
|
||||||
|
|
||||||
|
.res install - *
|
||||||
|
.incbin "../../build/install-c64.prg", 2
|
||||||
131
loader/samples/benchmark/loaderconfig.inc
Normal file
|
|
@ -0,0 +1,131 @@
|
||||||
|
|
||||||
|
; configuration
|
||||||
|
; set .defines to non-0 to enable the corresponding features
|
||||||
|
|
||||||
|
; see loader.inc for function calls and convenience macros
|
||||||
|
|
||||||
|
; parameters
|
||||||
|
|
||||||
|
.ifndef PLATFORM
|
||||||
|
PLATFORM = diskio::platform::COMMODORE_64; available are COMMODORE_64, COMMODORE_128 and COMMODORE_16
|
||||||
|
.endif
|
||||||
|
|
||||||
|
; parameter, this changes the host-side code only
|
||||||
|
|
||||||
|
DECOMPRESSOR = DECOMPRESSORS::TSCRUNCH; available are NONE, BITNAX (recommended for demos), BYTEBOOZER2, DOYNAX_LZ, EXOMIZER (not recommended for demos), LEVELCRUSH, LZSA2 (recommended for demos), NUCRUNCH, PUCRUNCH, SUBSIZER, TINYCRUNCH (recommended for demos), TSCRUNCH (strongly recommended for demos), ZX0 (strongly recommended for demos)
|
||||||
|
|
||||||
|
|
||||||
|
; features
|
||||||
|
|
||||||
|
; following settings are independent from the installed drive code, several host-side
|
||||||
|
; resident binaries with different features may be used with the same installed drive code
|
||||||
|
|
||||||
|
|
||||||
|
; basic features, different settings can be run with the same installed drive code, increase host-side code size
|
||||||
|
|
||||||
|
.define LOAD_COMPD_API 1 ; include the loadcompd routine to load and depack compressed files on the fly
|
||||||
|
; requires DECOMPRESSOR != DECOMPRESSORS::NONE
|
||||||
|
|
||||||
|
.define LOAD_RAW_API 0 ; include the loadraw routine to load files without decompressing
|
||||||
|
|
||||||
|
.define NTSC_COMPATIBILITY 0 ; C-64/128 only: be able to run on both PAL and NTSC machines, this slightly decreases loading speed on PAL,
|
||||||
|
; note that PAL vs. NTSC is not detected by the install routine, and no error is returned when running on an
|
||||||
|
; NTSC machine with the NTSC_COMPATIBILITY option disabled: detect, then select either of both incarnations
|
||||||
|
; of the resident portion (with and without NTSC support) for maximum speed with NTSC and PAL
|
||||||
|
|
||||||
|
.define PREFER_SPEED_OVER_SIZE 1 ; For TSCrunch or ZX0, use a bigger but potentially faster decompression routine
|
||||||
|
|
||||||
|
.define UNINSTALL_API 0 ; include an uninstallation routine
|
||||||
|
|
||||||
|
|
||||||
|
; extended features, different settings can be run with the same installed drive code, increase host-side code size
|
||||||
|
|
||||||
|
.define FILE_EXISTS_API 0 ; include the fileexists routine for simple multi-disk handling
|
||||||
|
|
||||||
|
.define LOAD_UNDER_D000_DFFF 0 ; C-64/128: enable loading (and decompression) to the RAM at $D000..$DFFF,
|
||||||
|
; note that this does not slow down loading when not loading to RAM at $D000..$DFFF,
|
||||||
|
; as there are two separate routines to load data (one regular, the other to RAM at $D000..$DFFF).
|
||||||
|
; the IRQ handlers will need to change $01 ($FF00 on C-128) to enable the I/O registers at $D000..$DFFF,
|
||||||
|
; so make sure the IRQ handlers restore the $01 status on C-64 to the value as when they are called.
|
||||||
|
; the IRQs must run via $FFFE/F, since the ROM is disabled when accessing the RAM at $D000-$DFFF
|
||||||
|
; this is not needed when only memdecompressing to $D000..$DFFF (simply set $01 to $30 on C-64 and jsr memdecomp in that case)
|
||||||
|
|
||||||
|
.define ALLOW_2_MHZ_ON_C128 0 ; C-64 only: allow 2 MHz usage on C-128 in C-64 mode,
|
||||||
|
; this does not increase raw loading speed but increases combined loading + decompression speed using loadcompd.
|
||||||
|
; the clock is temporarily switched to 1 MHz while loading,
|
||||||
|
; interrupt handlers changing the clock speed must restore it upon return to the mainline thread.
|
||||||
|
|
||||||
|
.define MEM_DECOMP_API 0 ; include a routine for memory decompression, that is, loading and decompression can be separated.
|
||||||
|
; C-64: decompression to $D000..$DFFF need not have LOAD_UNDER_D000_DFFF enabled,
|
||||||
|
; just enable 64 kB of RAM before jsr memdecomp.
|
||||||
|
; requires DECOMPRESSOR != DECOMPRESSORS::NONE
|
||||||
|
; this option does not implicitly turn on the LOAD_RAW_API
|
||||||
|
|
||||||
|
.define MEM_DECOMP_TO_API 0 ; if carry is set on decompression, the decompressor will use the address set in decdestlo/decdesthi as
|
||||||
|
; decompression destination address and ignore the file's decompression address.
|
||||||
|
; requires MEM_DECOMP_API != 0
|
||||||
|
|
||||||
|
.define LOAD_TO_API 0 ; if the carry flag is set on load, override load and decompression destination addresses.
|
||||||
|
; load raw files: use the address set in loadaddrlo/loadaddrhi as absolute loading address
|
||||||
|
; load compressed files: use relative loading address offset in loadaddroffslo/loadaddroffshi, it is added to the load/depack addresses
|
||||||
|
|
||||||
|
.define END_ADDRESS_API 0 ; during and after loading, the file's current and then final end address (address of last file byte + 1) is stored in
|
||||||
|
; endaddrlo and endaddrhi. for loading compressed files using loadcompd, the end address of the compressed data is stored.
|
||||||
|
; the file's loading address can be found in loadaddrlo/loadaddrhi during and after loading, so polling the current
|
||||||
|
; difference of endaddrlo/hi and loadaddrlo/hi can be used to implement progress displays.
|
||||||
|
|
||||||
|
.define LOAD_VIA_KERNAL_FALLBACK 0 ; loads via the KERNAL API if drive code installation was not successful
|
||||||
|
; (i.e., if it cannot installed due to an incompatible drive - possible if it is not
|
||||||
|
; a 1541, 1541-C, 1541-II, 1541U, 1570, 1571, 1571CR, 1581, or FD2000/4000),
|
||||||
|
; or true drive emulation being disabled.
|
||||||
|
; note that this does not necessarily mean slow or non-IRQ loading, as custom KERNALs like JiffyDOS or IDEDOS
|
||||||
|
; use the original KERNAL API as well.
|
||||||
|
; the IRQ handlers can be delayed for some rasterlines up to several frames due to KERNAL routines
|
||||||
|
; temporarily disabling IRQ (but that is unlikely for devices not using the serial bus).
|
||||||
|
; for the sake of compatibility, only disable this option if the space is really needed.
|
||||||
|
; C-64:
|
||||||
|
; Attention: KERNAL, BASIC, and possible cartridge ROMs are enabled, so IRQ handlers are not
|
||||||
|
; allowed in the ranges $8000..$BFFF and $D000..$FFFF.
|
||||||
|
; Attention: KERNAL routines may execute CLI, so make sure to have valid IRQ vectors and handlers,
|
||||||
|
; or disable all IRQ sources (not via SEI), also make sure to correctly handle the different
|
||||||
|
; IRQ conditions when called via KERNAL vector ($0314) vs. non-KERNAL vector ($FFFE), both are possible -
|
||||||
|
; best have KERNAL and BASIC enabled before calling the loader, so only the KERNAL vector IRQ handler is
|
||||||
|
; needed (please note that the handler code is delayed a little when called via $0314 rather than $FFFE).
|
||||||
|
; C-128:
|
||||||
|
; Attention: System ROM is enabled, so IRQ handlers are not allowed in the range $C000..$FFFF.
|
||||||
|
; Attention: KERNAL routines may execute CLI, so make sure to have valid IRQ vectors and handlers,
|
||||||
|
; or disable all IRQ sources (not via SEI), also make sure to correctly handle the different
|
||||||
|
; IRQ conditions when called via KERNAL vector ($0314) vs. non-KERNAL vector ($FFFE) - best have System ROM
|
||||||
|
; enabled before calling the loader, so only the KERNAL vector IRQ handler is needed (please note that
|
||||||
|
; the handler code is delayed a little when called via $0314 rather than $FFFE).
|
||||||
|
; C-64/128:
|
||||||
|
; Attention: KERNAL routines use CIA1 timer A ($DC04/5).
|
||||||
|
; Plus/4:
|
||||||
|
; Attention: The ROM space in the upper memory half is enabled, so IRQ handlers are not allowed
|
||||||
|
; in the range $8000..$FFFF.
|
||||||
|
; Attention: The ROM routines may execute CLI, so make sure to have valid IRQ vectors and handlers,
|
||||||
|
; or disable all IRQ sources (not via SEI), also make sure to correctly handle the different
|
||||||
|
; IRQ conditions when called via ROM vector ($0314) vs. non-ROM vector ($FFFE) - best have ROM enabled
|
||||||
|
; before calling the loader, so only the ROM vector IRQ handler is needed (please note that
|
||||||
|
; the handler code is delayed a little when being called via $0314 rather than $FFFE).
|
||||||
|
; requires ONLY_1541_AND_COMPATIBLE = 0
|
||||||
|
|
||||||
|
.define CLOSE_FILE_API 0 ; include the closefile call to close an open file
|
||||||
|
|
||||||
|
|
||||||
|
; these options change drive-side code
|
||||||
|
|
||||||
|
.define DIRTRACK 18 ; actual directory track, this can be changed to have a shadow directory so that the
|
||||||
|
; normal directory does not list the files and can be used entirely for bootstrap and dir-art
|
||||||
|
.define DIRTRACK81 40 ; (i.e., the loader's directory can be relocated to hide it from the normal directory command).
|
||||||
|
; DIRTRACK must be 18 when LOAD_VIA_KERNAL_FALLBACK != 0
|
||||||
|
; DIRTRACK81 must be 40 when LOAD_VIA_KERNAL_FALLBACK != 0
|
||||||
|
|
||||||
|
.define FILENAME_MAXLENGTH 16 ; maximum length of filename, if a directory is capable of holding longer names, extra characters are ignored,
|
||||||
|
; to facilitate dir-art, set to, e.g., 2, then load files as "01*", "02*", etc.
|
||||||
|
|
||||||
|
|
||||||
|
; this reduces host-side install code
|
||||||
|
|
||||||
|
.define ONLY_1541_AND_COMPATIBLE 0 ; reduces host-side install code by omitting any native custom drive code for non-1541 compatible
|
||||||
|
; drives, treats any drive as 1541, using an incompatible drive will cause undefined behaviour
|
||||||
12
loader/samples/benchmark/make-tex-graph-bitfire.lua
Executable file
|
|
@ -0,0 +1,12 @@
|
||||||
|
#! /usr/bin/env lua
|
||||||
|
|
||||||
|
for line in io.stdin:lines() do
|
||||||
|
local loader_cpu, frames_lo, frames_hi = line:match("^%S+%s*(%x+)%s*(%x+)%s*(%x+)")
|
||||||
|
|
||||||
|
loader_cpu = tonumber("0x"..loader_cpu)
|
||||||
|
frames = tonumber("0x"..frames_lo) + (256 * tonumber("0x"..frames_hi))
|
||||||
|
|
||||||
|
throughput = 185526 * 50 / frames;
|
||||||
|
|
||||||
|
print(("(%d, %.f)"):format(loader_cpu, throughput))
|
||||||
|
end
|
||||||
35
loader/samples/benchmark/make-tex-graph-spindle-code.lua
Executable file
|
|
@ -0,0 +1,35 @@
|
||||||
|
#! /usr/bin/env lua
|
||||||
|
|
||||||
|
local lines = {}
|
||||||
|
|
||||||
|
for line in io.stdin:lines() do
|
||||||
|
lines[#lines + 1] = line
|
||||||
|
end
|
||||||
|
|
||||||
|
local loader_cpu
|
||||||
|
|
||||||
|
for k, v in pairs(lines) do
|
||||||
|
if k % 2 == 1 then
|
||||||
|
loader_cpu = v:match("^%S+%s*(%x+)")
|
||||||
|
else
|
||||||
|
local f1l,f2l,f3l,f4l,f5l,f6l,f7l,f8l, f1h,f2h,f3h,f4h,f5h,f6h,f7h,f8h = v:match("^%S+%s*(%x+)%s*(%x+)%s*(%x+)%s*(%x+)%s*(%x+)%s*(%x+)%s*(%x+)%s*(%x+)%s*(%x+)%s*(%x+)%s*(%x+)%s*(%x+)%s*(%x+)%s*(%x+)%s*(%x+)%s*(%x+)")
|
||||||
|
|
||||||
|
loader_cpu = tonumber("0x"..loader_cpu)
|
||||||
|
|
||||||
|
local frames = {}
|
||||||
|
frames[1] = tonumber("0x"..f1l) + (256 * tonumber("0x"..f1h))
|
||||||
|
frames[2] = tonumber("0x"..f2l) + (256 * tonumber("0x"..f2h))
|
||||||
|
frames[3] = tonumber("0x"..f3l) + (256 * tonumber("0x"..f3h))
|
||||||
|
frames[4] = tonumber("0x"..f4l) + (256 * tonumber("0x"..f4h))
|
||||||
|
frames[5] = tonumber("0x"..f5l) + (256 * tonumber("0x"..f5h))
|
||||||
|
frames[6] = tonumber("0x"..f6l) + (256 * tonumber("0x"..f6h))
|
||||||
|
frames[7] = tonumber("0x"..f7l) + (256 * tonumber("0x"..f7h))
|
||||||
|
frames[8] = tonumber("0x"..f8l) + (256 * tonumber("0x"..f8h))
|
||||||
|
|
||||||
|
table.sort(frames)
|
||||||
|
|
||||||
|
throughput = 0x4000 * 50 / ((frames[4] + frames[5]) / 2);
|
||||||
|
|
||||||
|
print(("(%d, %.f)"):format(loader_cpu, throughput))
|
||||||
|
end
|
||||||
|
end
|
||||||
35
loader/samples/benchmark/make-tex-graph-spindle-graphics.lua
Executable file
|
|
@ -0,0 +1,35 @@
|
||||||
|
#! /usr/bin/env lua
|
||||||
|
|
||||||
|
local lines = {}
|
||||||
|
|
||||||
|
for line in io.stdin:lines() do
|
||||||
|
lines[#lines + 1] = line
|
||||||
|
end
|
||||||
|
|
||||||
|
local loader_cpu
|
||||||
|
|
||||||
|
for k, v in pairs(lines) do
|
||||||
|
if k % 2 == 1 then
|
||||||
|
loader_cpu = v:match("^%S+%s*(%x+)")
|
||||||
|
else
|
||||||
|
local f1l,f2l,f3l,f4l,f5l,f6l,f7l,f8l, f1h,f2h,f3h,f4h,f5h,f6h,f7h,f8h = v:match("^%S+%s*(%x+)%s*(%x+)%s*(%x+)%s*(%x+)%s*(%x+)%s*(%x+)%s*(%x+)%s*(%x+)%s*(%x+)%s*(%x+)%s*(%x+)%s*(%x+)%s*(%x+)%s*(%x+)%s*(%x+)%s*(%x+)")
|
||||||
|
|
||||||
|
loader_cpu = tonumber("0x"..loader_cpu)
|
||||||
|
|
||||||
|
local frames = {}
|
||||||
|
frames[1] = tonumber("0x"..f1l) + (256 * tonumber("0x"..f1h))
|
||||||
|
frames[2] = tonumber("0x"..f2l) + (256 * tonumber("0x"..f2h))
|
||||||
|
frames[3] = tonumber("0x"..f3l) + (256 * tonumber("0x"..f3h))
|
||||||
|
frames[4] = tonumber("0x"..f4l) + (256 * tonumber("0x"..f4h))
|
||||||
|
frames[5] = tonumber("0x"..f5l) + (256 * tonumber("0x"..f5h))
|
||||||
|
frames[6] = tonumber("0x"..f6l) + (256 * tonumber("0x"..f6h))
|
||||||
|
frames[7] = tonumber("0x"..f7l) + (256 * tonumber("0x"..f7h))
|
||||||
|
frames[8] = tonumber("0x"..f8l) + (256 * tonumber("0x"..f8h))
|
||||||
|
|
||||||
|
table.sort(frames)
|
||||||
|
|
||||||
|
throughput = 0x4400 * 50 / ((frames[4] + frames[5]) / 2);
|
||||||
|
|
||||||
|
print(("(%d, %.f)"):format(loader_cpu, throughput))
|
||||||
|
end
|
||||||
|
end
|
||||||
50
loader/samples/cc65/Linkfile
Normal file
|
|
@ -0,0 +1,50 @@
|
||||||
|
FEATURES {
|
||||||
|
STARTADDRESS: default = $0801;
|
||||||
|
}
|
||||||
|
SYMBOLS {
|
||||||
|
__LOADADDR__: type = import;
|
||||||
|
__EXEHDR__: type = import;
|
||||||
|
__STACKSIZE__: type = weak, value = $0800; # 2k stack
|
||||||
|
__HIMEM__: type = weak, value = $D000;
|
||||||
|
}
|
||||||
|
MEMORY {
|
||||||
|
ZP: file = "", define = yes, start = $0002, size = $001F;
|
||||||
|
ZP2: file = "", define = yes, start = $00FB, size = $0005;
|
||||||
|
LOADADDR: file = %O, start = %S - 2, size = $0002;
|
||||||
|
HEADER: file = %O, define = yes, start = %S, size = $000D;
|
||||||
|
MAIN: file = %O, define = yes, start = __HEADER_LAST__, size = __HIMEM__ - __HEADER_LAST__;
|
||||||
|
BSS: file = "", start = __ONCE_RUN__, size = __HIMEM__ - __STACKSIZE__ - __ONCE_RUN__;
|
||||||
|
}
|
||||||
|
SEGMENTS {
|
||||||
|
ZEROPAGE: load = ZP, type = zp;
|
||||||
|
LOADADDR: load = LOADADDR, type = ro;
|
||||||
|
EXEHDR: load = HEADER, type = ro;
|
||||||
|
STARTUP: load = MAIN, type = ro;
|
||||||
|
LOWCODE: load = MAIN, type = ro, optional = yes;
|
||||||
|
CODE: load = MAIN, type = ro;
|
||||||
|
|
||||||
|
DISKIO_ZP: load = ZP, type = zp;
|
||||||
|
DISKIO: load = MAIN, type = ro;
|
||||||
|
DISKIO_INSTALL: load = MAIN, type = ro;
|
||||||
|
|
||||||
|
RODATA: load = MAIN, type = ro;
|
||||||
|
DATA: load = MAIN, type = rw;
|
||||||
|
INIT: load = MAIN, type = rw;
|
||||||
|
ONCE: load = MAIN, type = ro, define = yes;
|
||||||
|
BSS: load = BSS, type = bss, define = yes;
|
||||||
|
}
|
||||||
|
FEATURES {
|
||||||
|
CONDES: type = constructor,
|
||||||
|
label = __CONSTRUCTOR_TABLE__,
|
||||||
|
count = __CONSTRUCTOR_COUNT__,
|
||||||
|
segment = ONCE;
|
||||||
|
CONDES: type = destructor,
|
||||||
|
label = __DESTRUCTOR_TABLE__,
|
||||||
|
count = __DESTRUCTOR_COUNT__,
|
||||||
|
segment = RODATA;
|
||||||
|
CONDES: type = interruptor,
|
||||||
|
label = __INTERRUPTOR_TABLE__,
|
||||||
|
count = __INTERRUPTOR_COUNT__,
|
||||||
|
segment = RODATA,
|
||||||
|
import = __CALLIRQ__;
|
||||||
|
}
|
||||||
46
loader/samples/cc65/Makefile
Normal file
|
|
@ -0,0 +1,46 @@
|
||||||
|
|
||||||
|
NAME = c-program
|
||||||
|
_PLATFORM_ = c64
|
||||||
|
|
||||||
|
EMU = x64sc
|
||||||
|
C1541 = c1541
|
||||||
|
|
||||||
|
PRINTF = printf
|
||||||
|
|
||||||
|
CAT = cat
|
||||||
|
|
||||||
|
BUILDDIR = ../../build
|
||||||
|
INTERMDIR = ../../build/intermediate
|
||||||
|
LOADERSRC = ../../src
|
||||||
|
LOADER = $(BUILDDIR)/loader-$(_PLATFORM_).lib
|
||||||
|
|
||||||
|
COMPILE = $(INTERMDIR)/$(NAME)-uncompressed-$(_PLATFORM_).prg
|
||||||
|
DISKIMAGE = $(BUILDDIR)/$(NAME)-$(_PLATFORM_).d64
|
||||||
|
|
||||||
|
RESOURCESDIR = ../resources
|
||||||
|
PIC1 = $(INTERMDIR)/pic1.prg
|
||||||
|
PIC2 = $(INTERMDIR)/pic2.prg
|
||||||
|
|
||||||
|
SOURCE = $(NAME).c
|
||||||
|
|
||||||
|
$(LOADER):
|
||||||
|
$(MAKE) -C $(LOADERSRC) EXTCONFIGPATH=../samples/cc65 lib
|
||||||
|
|
||||||
|
$(COMPILE): $(SOURCE) $(LOADER)
|
||||||
|
cl65 -t $(_PLATFORM_) -C ./Linkfile -o $@ $^
|
||||||
|
|
||||||
|
$(DISKIMAGE): $(COMPILE) $(PIC1) $(PIC2)
|
||||||
|
$(C1541) -format "normal is boring,+h" d64 $@
|
||||||
|
$(C1541) -attach $@ \
|
||||||
|
-write $(COMPILE) "$(NAME)" \
|
||||||
|
-write $(PIC1) "pic1" \
|
||||||
|
-write $(PIC2) "pic2"
|
||||||
|
|
||||||
|
$(INTERMDIR)/%.prg: $(RESOURCESDIR)/%.bin
|
||||||
|
$(PRINTF) '\000\140' | $(CAT) - $? > $@ # octal 140 = hex 60
|
||||||
|
|
||||||
|
run: $(DISKIMAGE)
|
||||||
|
$(EMU) $(realpath $^)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
-$(RM) *.o $(PIC1) $(PIC2) $(COMPILE) $(DISKIMAGE) $(LOADER)
|
||||||
98
loader/samples/cc65/c-program.c
Normal file
|
|
@ -0,0 +1,98 @@
|
||||||
|
|
||||||
|
#include <6502.h>
|
||||||
|
#include <c64.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
static unsigned char irq_stack[64];
|
||||||
|
|
||||||
|
static void *COLOURS = (void *) 0x5c00;
|
||||||
|
static void *BITMAP = (void *) 0x6000;
|
||||||
|
|
||||||
|
static char status;
|
||||||
|
|
||||||
|
static void
|
||||||
|
install_loader(void)
|
||||||
|
{
|
||||||
|
asm("jsr install");
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
load_file(const char *filename)
|
||||||
|
{
|
||||||
|
static char lo;
|
||||||
|
static char hi;
|
||||||
|
|
||||||
|
lo = (int) filename;
|
||||||
|
hi = ((int) filename) >> 8;
|
||||||
|
|
||||||
|
asm("ldx %v\n" /* lo */
|
||||||
|
"ldy %v\n" /* hi */
|
||||||
|
"jsr loadraw\n"
|
||||||
|
"bcs err\n"
|
||||||
|
"lda #0\n"
|
||||||
|
"err:\n"
|
||||||
|
"sta %v\n" /* status */
|
||||||
|
, lo, hi, status);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned char
|
||||||
|
handle_irq(void)
|
||||||
|
{
|
||||||
|
++VIC.bordercolor;
|
||||||
|
--VIC.bordercolor;
|
||||||
|
|
||||||
|
VIC.irr = 1;
|
||||||
|
|
||||||
|
return IRQ_HANDLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
init(void)
|
||||||
|
{
|
||||||
|
memset(COLOURS, 0xfb, 25 * 40);
|
||||||
|
memset(BITMAP, 0, 25 * 40 * 8);
|
||||||
|
|
||||||
|
CIA1.icr = 0x7f;
|
||||||
|
|
||||||
|
CIA2.pra = 2;
|
||||||
|
|
||||||
|
set_irq(&handle_irq, irq_stack, sizeof irq_stack);
|
||||||
|
|
||||||
|
VIC.ctrl1 = 0x3b;
|
||||||
|
VIC.addr = 0x78;
|
||||||
|
VIC.rasterline = 0x20;
|
||||||
|
|
||||||
|
VIC.irr = 1;
|
||||||
|
VIC.imr = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
error(void)
|
||||||
|
{
|
||||||
|
do {
|
||||||
|
++VIC.bordercolor;
|
||||||
|
VIC.bordercolor = status;
|
||||||
|
} while (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
install_loader();
|
||||||
|
|
||||||
|
init();
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (load_file("pic1") != 0) {
|
||||||
|
error();
|
||||||
|
}
|
||||||
|
++VIC.bordercolor;
|
||||||
|
|
||||||
|
if (load_file("pic2") != 0) {
|
||||||
|
error();
|
||||||
|
}
|
||||||
|
++VIC.bordercolor;
|
||||||
|
} while (1);
|
||||||
|
}
|
||||||
131
loader/samples/cc65/loaderconfig.inc
Normal file
|
|
@ -0,0 +1,131 @@
|
||||||
|
|
||||||
|
; configuration
|
||||||
|
; set .defines to non-0 to enable the corresponding features
|
||||||
|
|
||||||
|
; see loader.inc for function calls and convenience macros
|
||||||
|
|
||||||
|
; parameters
|
||||||
|
|
||||||
|
.ifndef PLATFORM
|
||||||
|
PLATFORM = diskio::platform::COMMODORE_64; available are COMMODORE_64, COMMODORE_128 and COMMODORE_16
|
||||||
|
.endif
|
||||||
|
|
||||||
|
; parameter, this changes the host-side code only
|
||||||
|
|
||||||
|
DECOMPRESSOR = DECOMPRESSORS::NONE; available are NONE, BITNAX (recommended for demos), BYTEBOOZER2, DOYNAX_LZ, EXOMIZER (not recommended for demos), LEVELCRUSH, LZSA2 (recommended for demos), NUCRUNCH, PUCRUNCH, SUBSIZER, TINYCRUNCH (recommended for demos), TSCRUNCH (strongly recommended for demos), ZX0 (strongly recommended for demos)
|
||||||
|
|
||||||
|
|
||||||
|
; features
|
||||||
|
|
||||||
|
; following settings are independent from the installed drive code, several host-side
|
||||||
|
; resident binaries with different features may be used with the same installed drive code
|
||||||
|
|
||||||
|
|
||||||
|
; basic features, different settings can be run with the same installed drive code, increase host-side code size
|
||||||
|
|
||||||
|
.define LOAD_COMPD_API 0 ; include the loadcompd routine to load and depack compressed files on the fly
|
||||||
|
; requires DECOMPRESSOR != DECOMPRESSORS::NONE
|
||||||
|
|
||||||
|
.define LOAD_RAW_API 1 ; include the loadraw routine to load files without decompressing
|
||||||
|
|
||||||
|
.define NTSC_COMPATIBILITY 0 ; C-64/128 only: be able to run on both PAL and NTSC machines, this slightly decreases loading speed on PAL,
|
||||||
|
; note that PAL vs. NTSC is not detected by the install routine, and no error is returned when running on an
|
||||||
|
; NTSC machine with the NTSC_COMPATIBILITY option disabled: detect, then select either of both incarnations
|
||||||
|
; of the resident portion (with and without NTSC support) for maximum speed with NTSC and PAL
|
||||||
|
|
||||||
|
.define PREFER_SPEED_OVER_SIZE 0 ; For TSCrunch or ZX0, use a bigger but potentially faster decompression routine
|
||||||
|
|
||||||
|
.define UNINSTALL_API 0 ; include an uninstallation routine
|
||||||
|
|
||||||
|
|
||||||
|
; extended features, different settings can be run with the same installed drive code, increase host-side code size
|
||||||
|
|
||||||
|
.define FILE_EXISTS_API 0 ; include the fileexists routine for simple multi-disk handling
|
||||||
|
|
||||||
|
.define LOAD_UNDER_D000_DFFF 0 ; C-64/128: enable loading (and decompression) to the RAM at $D000..$DFFF,
|
||||||
|
; note that this does not slow down loading when not loading to RAM at $D000..$DFFF,
|
||||||
|
; as there are two separate routines to load data (one regular, the other to RAM at $D000..$DFFF).
|
||||||
|
; the IRQ handlers will need to change $01 ($FF00 on C-128) to enable the I/O registers at $D000..$DFFF,
|
||||||
|
; so make sure the IRQ handlers restore the $01 status on C-64 to the value as when they are called.
|
||||||
|
; the IRQs must run via $FFFE/F, since the ROM is disabled when accessing the RAM at $D000-$DFFF
|
||||||
|
; this is not needed when only memdecompressing to $D000..$DFFF (simply set $01 to $30 on C-64 and jsr memdecomp in that case)
|
||||||
|
|
||||||
|
.define ALLOW_2_MHZ_ON_C128 0 ; C-64 only: allow 2 MHz usage on C-128 in C-64 mode,
|
||||||
|
; this does not increase raw loading speed but increases combined loading + decompression speed using loadcompd.
|
||||||
|
; the clock is temporarily switched to 1 MHz while loading,
|
||||||
|
; interrupt handlers changing the clock speed must restore it upon return to the mainline thread.
|
||||||
|
|
||||||
|
.define MEM_DECOMP_API 0 ; include a routine for memory decompression, that is, loading and decompression can be separated.
|
||||||
|
; C-64: decompression to $D000..$DFFF need not have LOAD_UNDER_D000_DFFF enabled,
|
||||||
|
; just enable 64 kB of RAM before jsr memdecomp.
|
||||||
|
; requires DECOMPRESSOR != DECOMPRESSORS::NONE
|
||||||
|
; this option does not implicitly turn on the LOAD_RAW_API
|
||||||
|
|
||||||
|
.define MEM_DECOMP_TO_API 0 ; if carry is set on decompression, the decompressor will use the address set in decdestlo/decdesthi as
|
||||||
|
; decompression destination address and ignore the file's decompression address.
|
||||||
|
; requires MEM_DECOMP_API != 0
|
||||||
|
|
||||||
|
.define LOAD_TO_API 0 ; if the carry flag is set on load, override load and decompression destination addresses.
|
||||||
|
; load raw files: use the address set in loadaddrlo/loadaddrhi as absolute loading address
|
||||||
|
; load compressed files: use relative loading address offset in loadaddroffslo/loadaddroffshi, it is added to the load/depack addresses
|
||||||
|
|
||||||
|
.define END_ADDRESS_API 0 ; during and after loading, the file's current and then final end address (address of last file byte + 1) is stored in
|
||||||
|
; endaddrlo and endaddrhi. for loading compressed files using loadcompd, the end address of the compressed data is stored.
|
||||||
|
; the file's loading address can be found in loadaddrlo/loadaddrhi during and after loading, so polling the current
|
||||||
|
; difference of endaddrlo/hi and loadaddrlo/hi can be used to implement progress displays.
|
||||||
|
|
||||||
|
.define LOAD_VIA_KERNAL_FALLBACK 0 ; loads via the KERNAL API if drive code installation was not successful
|
||||||
|
; (i.e., if it cannot installed due to an incompatible drive - possible if it is not
|
||||||
|
; a 1541, 1541-C, 1541-II, 1541U, 1570, 1571, 1571CR, 1581, or FD2000/4000),
|
||||||
|
; or true drive emulation being disabled.
|
||||||
|
; note that this does not necessarily mean slow or non-IRQ loading, as custom KERNALs like JiffyDOS or IDEDOS
|
||||||
|
; use the original KERNAL API as well.
|
||||||
|
; the IRQ handlers can be delayed for some rasterlines up to several frames due to KERNAL routines
|
||||||
|
; temporarily disabling IRQ (but that is unlikely for devices not using the serial bus).
|
||||||
|
; for the sake of compatibility, only disable this option if the space is really needed.
|
||||||
|
; C-64:
|
||||||
|
; Attention: KERNAL, BASIC, and possible cartridge ROMs are enabled, so IRQ handlers are not
|
||||||
|
; allowed in the ranges $8000..$BFFF and $D000..$FFFF.
|
||||||
|
; Attention: KERNAL routines may execute CLI, so make sure to have valid IRQ vectors and handlers,
|
||||||
|
; or disable all IRQ sources (not via SEI), also make sure to correctly handle the different
|
||||||
|
; IRQ conditions when called via KERNAL vector ($0314) vs. non-KERNAL vector ($FFFE), both are possible -
|
||||||
|
; best have KERNAL and BASIC enabled before calling the loader, so only the KERNAL vector IRQ handler is
|
||||||
|
; needed (please note that the handler code is delayed a little when called via $0314 rather than $FFFE).
|
||||||
|
; C-128:
|
||||||
|
; Attention: System ROM is enabled, so IRQ handlers are not allowed in the range $C000..$FFFF.
|
||||||
|
; Attention: KERNAL routines may execute CLI, so make sure to have valid IRQ vectors and handlers,
|
||||||
|
; or disable all IRQ sources (not via SEI), also make sure to correctly handle the different
|
||||||
|
; IRQ conditions when called via KERNAL vector ($0314) vs. non-KERNAL vector ($FFFE) - best have System ROM
|
||||||
|
; enabled before calling the loader, so only the KERNAL vector IRQ handler is needed (please note that
|
||||||
|
; the handler code is delayed a little when called via $0314 rather than $FFFE).
|
||||||
|
; C-64/128:
|
||||||
|
; Attention: KERNAL routines use CIA1 timer A ($DC04/5).
|
||||||
|
; Plus/4:
|
||||||
|
; Attention: The ROM space in the upper memory half is enabled, so IRQ handlers are not allowed
|
||||||
|
; in the range $8000..$FFFF.
|
||||||
|
; Attention: The ROM routines may execute CLI, so make sure to have valid IRQ vectors and handlers,
|
||||||
|
; or disable all IRQ sources (not via SEI), also make sure to correctly handle the different
|
||||||
|
; IRQ conditions when called via ROM vector ($0314) vs. non-ROM vector ($FFFE) - best have ROM enabled
|
||||||
|
; before calling the loader, so only the ROM vector IRQ handler is needed (please note that
|
||||||
|
; the handler code is delayed a little when being called via $0314 rather than $FFFE).
|
||||||
|
; requires ONLY_1541_AND_COMPATIBLE = 0
|
||||||
|
|
||||||
|
.define CLOSE_FILE_API 0 ; include the closefile call to close an open file
|
||||||
|
|
||||||
|
|
||||||
|
; these options change drive-side code
|
||||||
|
|
||||||
|
.define DIRTRACK 18 ; actual directory track, this can be changed to have a shadow directory so that the
|
||||||
|
; normal directory does not list the files and can be used entirely for bootstrap and dir-art
|
||||||
|
.define DIRTRACK81 40 ; (i.e., the loader's directory can be relocated to hide it from the normal directory command).
|
||||||
|
; DIRTRACK must be 18 when LOAD_VIA_KERNAL_FALLBACK != 0
|
||||||
|
; DIRTRACK81 must be 40 when LOAD_VIA_KERNAL_FALLBACK != 0
|
||||||
|
|
||||||
|
.define FILENAME_MAXLENGTH 16 ; maximum length of filename, if a directory is capable of holding longer names, extra characters are ignored,
|
||||||
|
; to facilitate dir-art, set to, e.g., 2, then load files as "01*", "02*", etc.
|
||||||
|
|
||||||
|
|
||||||
|
; this reduces host-side install code
|
||||||
|
|
||||||
|
.define ONLY_1541_AND_COMPATIBLE 1 ; reduces host-side install code by omitting any native custom drive code for non-1541 compatible
|
||||||
|
; drives, treats any drive as 1541, using an incompatible drive will cause undefined behaviour
|
||||||
68
loader/samples/drivecode/Makefile
Normal file
|
|
@ -0,0 +1,68 @@
|
||||||
|
|
||||||
|
NAME = drivecode
|
||||||
|
_PLATFORM_ = c64
|
||||||
|
|
||||||
|
VICE = x64sc
|
||||||
|
EMU = $(VICE) -drive8type 1541 -drive9type 0 -autostart
|
||||||
|
EMU71 = $(VICE) -drive8type 1571 -drive9type 0 -autostart
|
||||||
|
EMU81 = $(VICE) -drive8type 1581 -drive9type 0 -autostart
|
||||||
|
|
||||||
|
AS = cl65
|
||||||
|
AS_FLAGS = -Wa -I../../build -Wa -I../../include -u __EXEHDR__
|
||||||
|
|
||||||
|
CC1541 = ../../tools/cc1541/cc1541 -v
|
||||||
|
CC1541_SOURCE = ../../tools/cc1541
|
||||||
|
|
||||||
|
PRINTF = printf
|
||||||
|
|
||||||
|
RM = rm -f
|
||||||
|
CP = cp
|
||||||
|
MV = mv
|
||||||
|
CAT = cat
|
||||||
|
|
||||||
|
BUILDDIR = ../../build
|
||||||
|
INTERMDIR = ../../build/intermediate
|
||||||
|
LOADER_SRC = ../../src
|
||||||
|
LOADER = $(BUILDDIR)/customdrivecode-$(_PLATFORM_).prg
|
||||||
|
|
||||||
|
RESOURCESDIR = ../resources
|
||||||
|
TEST = $(RESOURCESDIR)/test.prg
|
||||||
|
PIC1 = $(INTERMDIR)/pic1.prg
|
||||||
|
|
||||||
|
SOURCE = $(NAME).s
|
||||||
|
LOADERCFG = loaderconfig.inc
|
||||||
|
ASSEMBLE = $(INTERMDIR)/$(NAME)-uncompressed-$(_PLATFORM_).prg
|
||||||
|
DISKIMAGE = $(BUILDDIR)/$(NAME)-$(_PLATFORM_).d64
|
||||||
|
DISKIMAGE81 = $(BUILDDIR)/$(NAME)-$(_PLATFORM_).d81
|
||||||
|
|
||||||
|
$(DISKIMAGE) $(DISKIMAGE81): $(ASSEMBLE) $(PIC1) $(CC1541)
|
||||||
|
$(RM) $@
|
||||||
|
$(CC1541) -n "normal is boring" -i plush \
|
||||||
|
-f $(NAME) -w $< \
|
||||||
|
-f "pic1" -w $(PIC1) \
|
||||||
|
$@
|
||||||
|
|
||||||
|
$(ASSEMBLE): $(SOURCE) $(LOADER)
|
||||||
|
$(AS) $(AS_FLAGS) -C c64-asm.cfg -Wa -DPLATFORM=64 -o $@ $<
|
||||||
|
|
||||||
|
$(LOADER): $(LOADERCFG)
|
||||||
|
make -C $(LOADER_SRC) EXTCONFIGPATH=../samples/$(NAME) PLATFORM=$(_PLATFORM_) PROJECT=$(NAME) INSTALL=0d00 RESIDENT=0900 ZP=04 TRANSIENT=0a00 ZP=04 customdrivecode
|
||||||
|
|
||||||
|
$(INTERMDIR)/%.prg: $(RESOURCESDIR)/%.bin
|
||||||
|
$(PRINTF) '\000\140' | $(CAT) - $? > $@ # octal 140 = hex 60
|
||||||
|
|
||||||
|
run: $(DISKIMAGE)
|
||||||
|
$(EMU) $(realpath $^)
|
||||||
|
|
||||||
|
run71: $(DISKIMAGE)
|
||||||
|
$(EMU71) $(realpath $^)
|
||||||
|
|
||||||
|
run81: $(DISKIMAGE81)
|
||||||
|
$(EMU81) $(realpath $^)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
-$(RM) *.o $(PIC1) $(ASSEMBLE) $(DISKIMAGE) $(BUILDDIR)/loadersymbols-c64.prg $(BUILDDIR)/install-c64.prg $(BUILDDIR)/loader-c64.prg $(BUILDDIR)/customdrivecode-c64.prg
|
||||||
|
|
||||||
|
|
||||||
|
$(CC1541): $(CC1541_SOURCE)/cc1541.c
|
||||||
|
$(MAKE) -C $(CC1541_SOURCE) cc1541
|
||||||
77
loader/samples/drivecode/drivecode.s
Normal file
|
|
@ -0,0 +1,77 @@
|
||||||
|
|
||||||
|
.include "loadersymbols-c64.inc"
|
||||||
|
|
||||||
|
.include "loader.inc"
|
||||||
|
|
||||||
|
.org $080d
|
||||||
|
|
||||||
|
jsr install
|
||||||
|
|
||||||
|
loop: inc $d020
|
||||||
|
|
||||||
|
ldx #<swapparams
|
||||||
|
ldy #>swapparams
|
||||||
|
jsr swapdrvcod
|
||||||
|
|
||||||
|
inc $d020
|
||||||
|
|
||||||
|
wait: bit $dd00
|
||||||
|
bpl wait
|
||||||
|
|
||||||
|
inc $d020
|
||||||
|
|
||||||
|
jsr restoreldr
|
||||||
|
|
||||||
|
inc $d020
|
||||||
|
|
||||||
|
ldx #<filename
|
||||||
|
ldy #>filename
|
||||||
|
jsr loadraw
|
||||||
|
bcc loop
|
||||||
|
|
||||||
|
error: sta $d021
|
||||||
|
inc $d021
|
||||||
|
jmp error
|
||||||
|
|
||||||
|
swapparams: .word $8000; buffer
|
||||||
|
.word drvcoderun; entry
|
||||||
|
.word drvcoderun; to
|
||||||
|
.word drivecoded - drivecode; length
|
||||||
|
.word drivecode; from
|
||||||
|
|
||||||
|
filename: .byte "pic1", 0
|
||||||
|
|
||||||
|
drivecode:
|
||||||
|
.org $0200
|
||||||
|
|
||||||
|
drvcoderun: lda #$12; ATNA_OUT | DATA_OUT
|
||||||
|
sta $1800; busy
|
||||||
|
|
||||||
|
drvcodloop: lda #$08
|
||||||
|
eor $1c00
|
||||||
|
sta $1c00
|
||||||
|
lda #0
|
||||||
|
: dex
|
||||||
|
bne :-
|
||||||
|
: dey
|
||||||
|
bne :-
|
||||||
|
clc
|
||||||
|
adc #1
|
||||||
|
bne :--
|
||||||
|
lda #6
|
||||||
|
dec * - 1
|
||||||
|
bne drvcodloop
|
||||||
|
|
||||||
|
RETURNTOLOADER41
|
||||||
|
|
||||||
|
.org * - (drvcoderun - drivecode)
|
||||||
|
drivecoded:
|
||||||
|
|
||||||
|
.res loadraw - *
|
||||||
|
.incbin "../../build/loader-c64.prg", 2
|
||||||
|
|
||||||
|
.res swapdrvcod - *
|
||||||
|
.incbin "../../build/customdrivecode-c64.prg", 2
|
||||||
|
|
||||||
|
.res install - *
|
||||||
|
.incbin "../../build/install-c64.prg", 2
|
||||||
131
loader/samples/drivecode/loaderconfig.inc
Normal file
|
|
@ -0,0 +1,131 @@
|
||||||
|
|
||||||
|
; configuration
|
||||||
|
; set .defines to non-0 to enable the corresponding features
|
||||||
|
|
||||||
|
; see loader.inc for function calls and convenience macros
|
||||||
|
|
||||||
|
; parameters
|
||||||
|
|
||||||
|
.ifndef PLATFORM
|
||||||
|
PLATFORM = diskio::platform::COMMODORE_64; available are COMMODORE_64, COMMODORE_128 and COMMODORE_16
|
||||||
|
.endif
|
||||||
|
|
||||||
|
; parameter, this changes the host-side code only
|
||||||
|
|
||||||
|
DECOMPRESSOR = DECOMPRESSORS::NONE; available are NONE, BITNAX (recommended for demos), BYTEBOOZER2, DOYNAX_LZ, EXOMIZER (not recommended for demos), LEVELCRUSH, LZSA2 (recommended for demos), NUCRUNCH, PUCRUNCH, SUBSIZER, TINYCRUNCH (recommended for demos), TSCRUNCH (recommended for demos), ZX0 (strongly recommended for demos)
|
||||||
|
|
||||||
|
|
||||||
|
; features
|
||||||
|
|
||||||
|
; following settings are independent from the installed drive code, several host-side
|
||||||
|
; resident binaries with different features may be used with the same installed drive code
|
||||||
|
|
||||||
|
|
||||||
|
; basic features, different settings can be run with the same installed drive code, increase host-side code size
|
||||||
|
|
||||||
|
.define LOAD_COMPD_API 0 ; include the loadcompd routine to load and depack compressed files on the fly
|
||||||
|
; requires DECOMPRESSOR != DECOMPRESSORS::NONE
|
||||||
|
|
||||||
|
.define LOAD_RAW_API 1 ; include the loadraw routine to load files without decompressing
|
||||||
|
|
||||||
|
.define NTSC_COMPATIBILITY 0 ; C-64/128 only: be able to run on both PAL and NTSC machines, this slightly decreases loading speed on PAL,
|
||||||
|
; note that PAL vs. NTSC is not detected by the install routine, and no error is returned when running on an
|
||||||
|
; NTSC machine with the NTSC_COMPATIBILITY option disabled: detect, then select either of both incarnations
|
||||||
|
; of the resident portion (with and without NTSC support) for maximum speed with NTSC and PAL
|
||||||
|
|
||||||
|
.define PREFER_SPEED_OVER_SIZE 0 ; For TSCrunch or ZX0, use a bigger but potentially faster decompression routine
|
||||||
|
|
||||||
|
.define UNINSTALL_API 0 ; include an uninstallation routine
|
||||||
|
|
||||||
|
|
||||||
|
; extended features, different settings can be run with the same installed drive code, increase host-side code size
|
||||||
|
|
||||||
|
.define FILE_EXISTS_API 0 ; include the fileexists routine for simple multi-disk handling
|
||||||
|
|
||||||
|
.define LOAD_UNDER_D000_DFFF 0 ; C-64/128: enable loading (and decompression) to the RAM at $D000..$DFFF,
|
||||||
|
; note that this does not slow down loading when not loading to RAM at $D000..$DFFF,
|
||||||
|
; as there are two separate routines to load data (one regular, the other to RAM at $D000..$DFFF).
|
||||||
|
; the IRQ handlers will need to change $01 ($FF00 on C-128) to enable the I/O registers at $D000..$DFFF,
|
||||||
|
; so make sure the IRQ handlers restore the $01 status on C-64 to the value as when they are called.
|
||||||
|
; the IRQs must run via $FFFE/F, since the ROM is disabled when accessing the RAM at $D000-$DFFF
|
||||||
|
; this is not needed when only memdecompressing to $D000..$DFFF (simply set $01 to $30 on C-64 and jsr memdecomp in that case)
|
||||||
|
|
||||||
|
.define ALLOW_2_MHZ_ON_C128 0 ; C-64 only: allow 2 MHz usage on C-128 in C-64 mode,
|
||||||
|
; this does not increase raw loading speed but increases combined loading + decompression speed using loadcompd.
|
||||||
|
; the clock is temporarily switched to 1 MHz while loading,
|
||||||
|
; interrupt handlers changing the clock speed must restore it upon return to the mainline thread.
|
||||||
|
|
||||||
|
.define MEM_DECOMP_API 0 ; include a routine for memory decompression, that is, loading and decompression can be separated.
|
||||||
|
; C-64: decompression to $D000..$DFFF need not have LOAD_UNDER_D000_DFFF enabled,
|
||||||
|
; just enable 64 kB of RAM before jsr memdecomp.
|
||||||
|
; requires DECOMPRESSOR != DECOMPRESSORS::NONE
|
||||||
|
; this option does not implicitly turn on the LOAD_RAW_API
|
||||||
|
|
||||||
|
.define MEM_DECOMP_TO_API 0 ; if carry is set on decompression, the decompressor will use the address set in decdestlo/decdesthi as
|
||||||
|
; decompression destination address and ignore the file's decompression address.
|
||||||
|
; requires MEM_DECOMP_API != 0
|
||||||
|
|
||||||
|
.define LOAD_TO_API 0 ; if the carry flag is set on load, override load and decompression destination addresses.
|
||||||
|
; load raw files: use the address set in loadaddrlo/loadaddrhi as absolute loading address
|
||||||
|
; load compressed files: use relative loading address offset in loadaddroffslo/loadaddroffshi, it is added to the load/depack addresses
|
||||||
|
|
||||||
|
.define END_ADDRESS_API 0 ; during and after loading, the file's current and then final end address (address of last file byte + 1) is stored in
|
||||||
|
; endaddrlo and endaddrhi. for loading compressed files using loadcompd, the end address of the compressed data is stored.
|
||||||
|
; the file's loading address can be found in loadaddrlo/loadaddrhi during and after loading, so polling the current
|
||||||
|
; difference of endaddrlo/hi and loadaddrlo/hi can be used to implement progress displays.
|
||||||
|
|
||||||
|
.define LOAD_VIA_KERNAL_FALLBACK 0 ; loads via the KERNAL API if drive code installation was not successful
|
||||||
|
; (i.e., if it cannot installed due to an incompatible drive - possible if it is not
|
||||||
|
; a 1541, 1541-C, 1541-II, 1541U, 1570, 1571, 1571CR, 1581, or FD2000/4000),
|
||||||
|
; or true drive emulation being disabled.
|
||||||
|
; note that this does not necessarily mean slow or non-IRQ loading, as custom KERNALs like JiffyDOS or IDEDOS
|
||||||
|
; use the original KERNAL API as well.
|
||||||
|
; the IRQ handlers can be delayed for some rasterlines up to several frames due to KERNAL routines
|
||||||
|
; temporarily disabling IRQ (but that is unlikely for devices not using the serial bus).
|
||||||
|
; for the sake of compatibility, only disable this option if the space is really needed.
|
||||||
|
; C-64:
|
||||||
|
; Attention: KERNAL, BASIC, and possible cartridge ROMs are enabled, so IRQ handlers are not
|
||||||
|
; allowed in the ranges $8000..$BFFF and $D000..$FFFF.
|
||||||
|
; Attention: KERNAL routines may execute CLI, so make sure to have valid IRQ vectors and handlers,
|
||||||
|
; or disable all IRQ sources (not via SEI), also make sure to correctly handle the different
|
||||||
|
; IRQ conditions when called via KERNAL vector ($0314) vs. non-KERNAL vector ($FFFE), both are possible -
|
||||||
|
; best have KERNAL and BASIC enabled before calling the loader, so only the KERNAL vector IRQ handler is
|
||||||
|
; needed (please note that the handler code is delayed a little when called via $0314 rather than $FFFE).
|
||||||
|
; C-128:
|
||||||
|
; Attention: System ROM is enabled, so IRQ handlers are not allowed in the range $C000..$FFFF.
|
||||||
|
; Attention: KERNAL routines may execute CLI, so make sure to have valid IRQ vectors and handlers,
|
||||||
|
; or disable all IRQ sources (not via SEI), also make sure to correctly handle the different
|
||||||
|
; IRQ conditions when called via KERNAL vector ($0314) vs. non-KERNAL vector ($FFFE) - best have System ROM
|
||||||
|
; enabled before calling the loader, so only the KERNAL vector IRQ handler is needed (please note that
|
||||||
|
; the handler code is delayed a little when called via $0314 rather than $FFFE).
|
||||||
|
; C-64/128:
|
||||||
|
; Attention: KERNAL routines use CIA1 timer A ($DC04/5).
|
||||||
|
; Plus/4:
|
||||||
|
; Attention: The ROM space in the upper memory half is enabled, so IRQ handlers are not allowed
|
||||||
|
; in the range $8000..$FFFF.
|
||||||
|
; Attention: The ROM routines may execute CLI, so make sure to have valid IRQ vectors and handlers,
|
||||||
|
; or disable all IRQ sources (not via SEI), also make sure to correctly handle the different
|
||||||
|
; IRQ conditions when called via ROM vector ($0314) vs. non-ROM vector ($FFFE) - best have ROM enabled
|
||||||
|
; before calling the loader, so only the ROM vector IRQ handler is needed (please note that
|
||||||
|
; the handler code is delayed a little when being called via $0314 rather than $FFFE).
|
||||||
|
; requires ONLY_1541_AND_COMPATIBLE = 0
|
||||||
|
|
||||||
|
.define CLOSE_FILE_API 0 ; include the closefile call to close an open file
|
||||||
|
|
||||||
|
|
||||||
|
; these options change drive-side code
|
||||||
|
|
||||||
|
.define DIRTRACK 18 ; actual directory track, this can be changed to have a shadow directory so that the
|
||||||
|
; normal directory does not list the files and can be used entirely for bootstrap and dir-art
|
||||||
|
.define DIRTRACK81 40 ; (i.e., the loader's directory can be relocated to hide it from the normal directory command).
|
||||||
|
; DIRTRACK must be 18 when LOAD_VIA_KERNAL_FALLBACK != 0
|
||||||
|
; DIRTRACK81 must be 40 when LOAD_VIA_KERNAL_FALLBACK != 0
|
||||||
|
|
||||||
|
.define FILENAME_MAXLENGTH 16 ; maximum length of filename, if a directory is capable of holding longer names, extra characters are ignored,
|
||||||
|
; to facilitate dir-art, set to, e.g., 2, then load files as "01*", "02*", etc.
|
||||||
|
|
||||||
|
|
||||||
|
; this reduces host-side install code
|
||||||
|
|
||||||
|
.define ONLY_1541_AND_COMPATIBLE 1 ; reduces host-side install code by omitting any native custom drive code for non-1541 compatible
|
||||||
|
; drives, treats any drive as 1541, using an incompatible drive will cause undefined behaviour
|
||||||
194
loader/samples/minexample/Makefile
Normal file
|
|
@ -0,0 +1,194 @@
|
||||||
|
|
||||||
|
ifeq ($(PLATFORM),)
|
||||||
|
_PLATFORM_ = c64
|
||||||
|
else ifeq ($(PLATFORM),c116)
|
||||||
|
_PLATFORM_ = c16
|
||||||
|
else ifeq ($(PLATFORM),plus4)
|
||||||
|
_PLATFORM_ = c16
|
||||||
|
else
|
||||||
|
_PLATFORM_ = $(PLATFORM)
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(NO_VICE),)
|
||||||
|
NO_VICE = 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
ifneq ($(_PLATFORM_),c64)
|
||||||
|
ifneq ($(_PLATFORM_),c128)
|
||||||
|
ifneq ($(_PLATFORM_),c16)
|
||||||
|
$(error invalid platform $(_PLATFORM_) specified)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
ARCH = $(shell uname | tr "[a-z]" "[A-Z]" | tr -c -d "[A-Z]")
|
||||||
|
|
||||||
|
ifneq ($(findstring CYGWINNT,$(ARCH)),)
|
||||||
|
ifeq (CYGWINNT,$(ARCH))
|
||||||
|
ARCH = WIN32
|
||||||
|
else
|
||||||
|
ARCH = WIN64
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
ifneq ($(findstring DARWIN,$(ARCH)),)
|
||||||
|
ARCH = MACOSX
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
ifeq ($(_PLATFORM_),c16)
|
||||||
|
ifneq ($(NO_VICE),0)
|
||||||
|
ifneq ($(findstring WIN,$(ARCH)),)
|
||||||
|
USE_PLUS4EMU = 0
|
||||||
|
USE_YAPE = 1
|
||||||
|
else
|
||||||
|
USE_PLUS4EMU = 1
|
||||||
|
USE_YAPE = 0
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
USE_PLUS4EMU = 0
|
||||||
|
USE_YAPE = 0
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
USE_PLUS4EMU = 0
|
||||||
|
USE_YAPE = 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
ifeq ($(_PLATFORM_),c16)
|
||||||
|
ifeq ($(ARCH),MACOSX)
|
||||||
|
# MacOSX, these programs must be installed as applications
|
||||||
|
VICE = xplus4
|
||||||
|
PLUS4EMU = open /Applications/plus4emu.app --args
|
||||||
|
else
|
||||||
|
VICE = xplus4
|
||||||
|
PLUS4EMU = plus4emu
|
||||||
|
ifeq ($(ARCH),WIN64)
|
||||||
|
YAPE = YapeWin64
|
||||||
|
else
|
||||||
|
YAPE = Yape
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
ifeq ($(_PLATFORM_),c128)
|
||||||
|
VICE = x128
|
||||||
|
USE_VICE = 1
|
||||||
|
else
|
||||||
|
VICE = x64
|
||||||
|
USE_VICE = 1
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(USE_VICE),1)
|
||||||
|
EMU = $(VICE) -drive8type 1541 -drive9type 0 -autostart
|
||||||
|
EMU71 = $(VICE) -drive8type 1571 -drive9type 0 -autostart
|
||||||
|
else
|
||||||
|
EMU = $(PLUS4EMU) -disk
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
ECHO = echo
|
||||||
|
PRINTF = printf
|
||||||
|
|
||||||
|
AS = cl65
|
||||||
|
LD = ld65
|
||||||
|
C1541 = c1541
|
||||||
|
CC1541 = ../../tools/cc1541/cc1541
|
||||||
|
|
||||||
|
MKDIR = mkdir -p
|
||||||
|
RM = rm -f
|
||||||
|
ifeq ($(ARCH),MACOSX)
|
||||||
|
RMDIR = rmdir # XXX TODO xargs to remove .DS_Store
|
||||||
|
else
|
||||||
|
RMDIR = rmdir
|
||||||
|
endif
|
||||||
|
CAT = cat
|
||||||
|
|
||||||
|
|
||||||
|
.PHONY: default loader assemble diskimage run clean distclean wipe
|
||||||
|
.PHONY: tellarch
|
||||||
|
|
||||||
|
|
||||||
|
BUILDDIR = ../../build
|
||||||
|
INTERMDIR = ../../build/intermediate
|
||||||
|
LOADER_SRC = ../../src
|
||||||
|
LOADER = $(BUILDDIR)/loader-$(_PLATFORM_).prg
|
||||||
|
|
||||||
|
RESOURCESDIR = ../resources
|
||||||
|
|
||||||
|
NAME = minexample
|
||||||
|
|
||||||
|
SOURCE = $(NAME).s
|
||||||
|
LOADERCFG = loaderconfig.inc
|
||||||
|
ASSEMBLE = $(INTERMDIR)/$(NAME)-uncompressed-$(_PLATFORM_).prg
|
||||||
|
DISKIMAGE = $(BUILDDIR)/$(NAME)-$(_PLATFORM_).d64
|
||||||
|
|
||||||
|
AS_FLAGS = -Wa -I../../../shared -I ../../include -u __EXEHDR__
|
||||||
|
|
||||||
|
|
||||||
|
default: diskimage
|
||||||
|
|
||||||
|
|
||||||
|
tellarch:
|
||||||
|
@$(ECHO) $(ARCH)
|
||||||
|
|
||||||
|
|
||||||
|
loader: $(LOADER)
|
||||||
|
|
||||||
|
$(LOADER): $(LOADERCFG)
|
||||||
|
make -C $(LOADER_SRC) EXTCONFIGPATH=../samples/$(NAME) PLATFORM=$(_PLATFORM_) INSTALL=1800 RESIDENT=1700 ZP=02 prg
|
||||||
|
|
||||||
|
|
||||||
|
assemble: $(ASSEMBLE)
|
||||||
|
|
||||||
|
$(ASSEMBLE): $(SOURCE) $(LOADER) $(LOADERCFG)
|
||||||
|
$(MKDIR) $(BUILDDIR)
|
||||||
|
$(MKDIR) $(INTERMDIR)
|
||||||
|
ifeq ($(_PLATFORM_),c64)
|
||||||
|
$(AS) $(AS_FLAGS) -C c64-asm.cfg -Wa -DPLATFORM=64 -o $@ $<
|
||||||
|
else ifeq ($(_PLATFORM_),c128)
|
||||||
|
$(AS) $(AS_FLAGS) -t c128 -Wa -DPLATFORM=128 -o $@ $<
|
||||||
|
else
|
||||||
|
$(AS) $(AS_FLAGS) -t c16 -Wa -DPLATFORM=16 -o $@ $<
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
diskimage: $(DISKIMAGE)
|
||||||
|
|
||||||
|
$(DISKIMAGE): $(ASSEMBLE)
|
||||||
|
$(RM) $@
|
||||||
|
$(CC1541) -n "ys2 intro" -i test \
|
||||||
|
-f $(NAME) -w $< \
|
||||||
|
-f "sid" -w sid.bin \
|
||||||
|
-f "badguy" -w badguy.zx0.prg \
|
||||||
|
$@
|
||||||
|
|
||||||
|
|
||||||
|
ifneq ($(USE_YAPE),0)
|
||||||
|
run: $(DISKIMAGE)
|
||||||
|
$(YAPE) "..\..\build\$^"
|
||||||
|
else
|
||||||
|
run: $(DISKIMAGE)
|
||||||
|
$(EMU) $(realpath $^)
|
||||||
|
|
||||||
|
run71: $(DISKIMAGE)
|
||||||
|
$(EMU71) $(realpath $^)
|
||||||
|
endif
|
||||||
|
|
||||||
|
$(INTERMDIR)/%.prg: $(RESOURCESDIR)/%.bin
|
||||||
|
$(PRINTF) '\000\140' | $(CAT) - $? > $@ # octal 140 = hex 60
|
||||||
|
|
||||||
|
|
||||||
|
clean:
|
||||||
|
-$(RM) *.o $(ASSEMBLE) $(DISKIMAGE)
|
||||||
|
-$(RM) -rf $(INTERMDIR)
|
||||||
|
-$(RM) $(BUILDDIR)/loader-c64.prg
|
||||||
|
-$(RM) $(BUILDDIR)/loader-c128.prg
|
||||||
|
-$(RM) $(BUILDDIR)/loader-c16.prg
|
||||||
|
-$(RMDIR) $(BUILDDIR)
|
||||||
|
|
||||||
|
distclean:
|
||||||
|
-$(MAKE) -C $(LOADER_SRC) clean
|
||||||
|
|
||||||
|
wipe: distclean clean
|
||||||
77
loader/samples/minexample/anim2cus.py
Normal file
|
|
@ -0,0 +1,77 @@
|
||||||
|
import sys
|
||||||
|
f = list(open(sys.argv[1], "rb").read())[2:]
|
||||||
|
|
||||||
|
out = f[:(0x4711-0x2000)]
|
||||||
|
|
||||||
|
a = open(sys.argv[2],"r").read().split("\n")
|
||||||
|
a = [x for x in a if x != ""]
|
||||||
|
a = [x.split(",")[1] for x in a[:-1]]
|
||||||
|
|
||||||
|
frame = []
|
||||||
|
frame_dict = {}
|
||||||
|
|
||||||
|
cnt = 0
|
||||||
|
def append_frame(frame):
|
||||||
|
global cnt
|
||||||
|
if cnt < len(a):
|
||||||
|
filename_csv = a[cnt]
|
||||||
|
if filename_csv not in frame_dict:
|
||||||
|
frame_dict[filename_csv] = []
|
||||||
|
for d in frame:
|
||||||
|
if d not in frame_dict[filename_csv]:
|
||||||
|
frame_dict[filename_csv].append(d)
|
||||||
|
else:
|
||||||
|
print(cnt, len(a))
|
||||||
|
cnt += 1
|
||||||
|
|
||||||
|
ptr = 0x4711-0x2000
|
||||||
|
while ptr < len(f):
|
||||||
|
num_chars = f[ptr]
|
||||||
|
#print(ptr,len(f),num_chars)
|
||||||
|
ptr += 1
|
||||||
|
if num_chars == 0:
|
||||||
|
delay = f[ptr]
|
||||||
|
ptr += 1
|
||||||
|
append_frame(frame)
|
||||||
|
frame = []
|
||||||
|
continue
|
||||||
|
elif num_chars == 0xFF:
|
||||||
|
append_frame(frame)
|
||||||
|
break
|
||||||
|
bitmap = (f[ptr]|(f[ptr+1]<<8))+0x2000
|
||||||
|
ptr += 2
|
||||||
|
screen = (f[ptr]|(f[ptr+1]<<8))+0x400
|
||||||
|
cram = (f[ptr]|(f[ptr+1]<<8))+0xd800
|
||||||
|
ptr += 2
|
||||||
|
for i in range(num_chars):
|
||||||
|
frame.append([bitmap,f[ptr:ptr+8]])
|
||||||
|
ptr += 8
|
||||||
|
frame.append([screen,f[ptr]])
|
||||||
|
frame.append([cram,f[ptr+1]])
|
||||||
|
ptr += 2
|
||||||
|
bitmap += 8
|
||||||
|
screen += 1
|
||||||
|
cram += 1
|
||||||
|
|
||||||
|
out_pat_addr = len(out)
|
||||||
|
out.extend([0]*(len(a)*3))
|
||||||
|
|
||||||
|
frame_dict_offs = []
|
||||||
|
for i in frame_dict:
|
||||||
|
frame_dict_offs.append(len(out))
|
||||||
|
sort_dict = sorted([x for x in frame_dict[i]], key=lambda x : x[0])
|
||||||
|
print(sort_dict)
|
||||||
|
for j in sort_dict:
|
||||||
|
out.append(j[0]&0xff)
|
||||||
|
out.append(j[0]>>8&0xff)
|
||||||
|
if type(j[1]) == list:
|
||||||
|
out.extend(j[1])
|
||||||
|
else:
|
||||||
|
out.append(j[1])
|
||||||
|
|
||||||
|
#print(out)
|
||||||
|
|
||||||
|
print(hex(0x2000+len(out)))
|
||||||
|
f = open(sys.argv[3],"wb")
|
||||||
|
f.write(bytearray(out))
|
||||||
|
f.close()
|
||||||
BIN
loader/samples/minexample/badguy.bin
Normal file
BIN
loader/samples/minexample/badguy.prg
Normal file
BIN
loader/samples/minexample/badguy.zx0
Normal file
BIN
loader/samples/minexample/badguy.zx0.prg
Normal file
BIN
loader/samples/minexample/badguy_bi.bin
Normal file
BIN
loader/samples/minexample/badguy_no_prg.bin
Normal file
BIN
loader/samples/minexample/badguys_new.bin
Normal file
BIN
loader/samples/minexample/badguys_new.bin.bak
Executable file
4
loader/samples/minexample/c1541
Executable file
|
|
@ -0,0 +1,4 @@
|
||||||
|
#!/bin/bash
|
||||||
|
export VICE_INITIAL_CWD="$(pwd)"
|
||||||
|
export PROGRAM="c1541"
|
||||||
|
"/Applications/vice-arm64-gtk3-3.9/VICE.app/Contents/Resources/script" "$@"
|
||||||
3
loader/samples/minexample/conv_zx0.sh
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
zx02/zx02 badguys_new.bin badguy.zx0
|
||||||
|
printf "\x00\xe0" > badguy.zx0.prg
|
||||||
|
cat badguy.zx0 >> badguy.zx0.prg
|
||||||
BIN
loader/samples/minexample/libopencbm.dylib
Normal file
131
loader/samples/minexample/loaderconfig.inc
Normal file
|
|
@ -0,0 +1,131 @@
|
||||||
|
|
||||||
|
; configuration
|
||||||
|
; set .defines to non-0 to enable the corresponding features
|
||||||
|
|
||||||
|
; see loader.inc for function calls and convenience macros
|
||||||
|
|
||||||
|
; parameters
|
||||||
|
|
||||||
|
.ifndef PLATFORM
|
||||||
|
PLATFORM = diskio::platform::COMMODORE_64; available are COMMODORE_64, COMMODORE_128 and COMMODORE_16
|
||||||
|
.endif
|
||||||
|
|
||||||
|
; parameter, this changes the host-side code only
|
||||||
|
|
||||||
|
DECOMPRESSOR = DECOMPRESSORS::NONE; available are NONE, BITNAX (recommended for demos), BYTEBOOZER2, DOYNAX_LZ, EXOMIZER (not recommended for demos), LEVELCRUSH, LZSA2 (recommended for demos), NUCRUNCH, PUCRUNCH, SUBSIZER, TINYCRUNCH (recommended for demos), TSCRUNCH (strongly recommended for demos), ZX0 (strongly recommended for demos)
|
||||||
|
|
||||||
|
|
||||||
|
; features
|
||||||
|
|
||||||
|
; following settings are independent from the installed drive code, several host-side
|
||||||
|
; resident binaries with different features may be used with the same installed drive code
|
||||||
|
|
||||||
|
|
||||||
|
; basic features, different settings can be run with the same installed drive code, increase host-side code size
|
||||||
|
|
||||||
|
.define LOAD_COMPD_API 0 ; include the loadcompd routine to load and depack compressed files on the fly
|
||||||
|
; requires DECOMPRESSOR != DECOMPRESSORS::NONE
|
||||||
|
|
||||||
|
.define LOAD_RAW_API 1 ; include the loadraw routine to load files without decompressing
|
||||||
|
|
||||||
|
.define NTSC_COMPATIBILITY 0 ; C-64/128 only: be able to run on both PAL and NTSC machines, this slightly decreases loading speed on PAL,
|
||||||
|
; note that PAL vs. NTSC is not detected by the install routine, and no error is returned when running on an
|
||||||
|
; NTSC machine with the NTSC_COMPATIBILITY option disabled: detect, then select either of both incarnations
|
||||||
|
; of the resident portion (with and without NTSC support) for maximum speed with NTSC and PAL
|
||||||
|
|
||||||
|
.define PREFER_SPEED_OVER_SIZE 0 ; For TSCrunch or ZX0, use a bigger but potentially faster decompression routine
|
||||||
|
|
||||||
|
.define UNINSTALL_API 0 ; include an uninstallation routine
|
||||||
|
|
||||||
|
|
||||||
|
; extended features, different settings can be run with the same installed drive code, increase host-side code size
|
||||||
|
|
||||||
|
.define FILE_EXISTS_API 0 ; include the fileexists call for simple multi-disk handling
|
||||||
|
|
||||||
|
.define LOAD_UNDER_D000_DFFF 0 ; C-64/128: enable loading (and decompression) to the RAM at $D000..$DFFF,
|
||||||
|
; note that this does not slow down loading when not loading to RAM at $D000..$DFFF,
|
||||||
|
; as there are two separate routines to load data (one regular, the other to RAM at $D000..$DFFF).
|
||||||
|
; the IRQ handlers will need to change $01 ($FF00 on C-128) to enable the I/O registers at $D000..$DFFF,
|
||||||
|
; so make sure the IRQ handlers restore the $01 status on C-64 to the value as when they are called.
|
||||||
|
; the IRQs must run via $FFFE/F, since the ROM is disabled when accessing the RAM at $D000-$DFFF
|
||||||
|
; this is not needed when only memdecompressing to $D000..$DFFF (simply set $01 to $30 on C-64 and jsr memdecomp in that case)
|
||||||
|
|
||||||
|
.define ALLOW_2_MHZ_ON_C128 0 ; C-64 only: allow 2 MHz usage on C-128 in C-64 mode,
|
||||||
|
; this does not increase raw loading speed but increases combined loading + decompression speed using loadcompd.
|
||||||
|
; the clock is temporarily switched to 1 MHz while loading,
|
||||||
|
; interrupt handlers changing the clock speed must restore it upon return to the mainline thread.
|
||||||
|
|
||||||
|
.define MEM_DECOMP_API 0 ; include a routine for memory decompression, that is, loading and decompression can be separated.
|
||||||
|
; C-64: decompression to $D000..$DFFF need not have LOAD_UNDER_D000_DFFF enabled,
|
||||||
|
; just enable 64 kB of RAM before jsr memdecomp.
|
||||||
|
; requires DECOMPRESSOR != DECOMPRESSORS::NONE
|
||||||
|
; this option does not implicitly turn on the LOAD_RAW_API
|
||||||
|
|
||||||
|
.define MEM_DECOMP_TO_API 0 ; if carry is set on decompression, the decompressor will use the address set in decdestlo/decdesthi as
|
||||||
|
; decompression destination address and ignore the file's decompression address.
|
||||||
|
; requires MEM_DECOMP_API != 0
|
||||||
|
|
||||||
|
.define LOAD_TO_API 0 ; if the carry flag is set on load, override load and decompression destination addresses.
|
||||||
|
; load raw files: use the address set in loadaddrlo/loadaddrhi as absolute loading address
|
||||||
|
; load compressed files: use relative loading address offset in loadaddroffslo/loadaddroffshi, it is added to the load/depack addresses
|
||||||
|
|
||||||
|
.define END_ADDRESS_API 0 ; during and after loading, the file's current and then final end address (address of last file byte + 1) is stored in
|
||||||
|
; endaddrlo and endaddrhi. for loading compressed files using loadcompd, the end address of the compressed data is stored.
|
||||||
|
; the file's loading address can be found in loadaddrlo/loadaddrhi during and after loading, so polling the current
|
||||||
|
; difference of endaddrlo/hi and loadaddrlo/hi can be used to implement progress displays.
|
||||||
|
|
||||||
|
.define LOAD_VIA_KERNAL_FALLBACK 0 ; loads via the KERNAL API if drive code installation was not successful
|
||||||
|
; (i.e., if it cannot installed due to an incompatible drive - possible if it is not
|
||||||
|
; a 1541, 1541-C, 1541-II, 1541U, 1570, 1571, 1571CR, 1581, or FD2000/4000),
|
||||||
|
; or true drive emulation being disabled.
|
||||||
|
; note that this does not necessarily mean slow or non-IRQ loading, as custom KERNALs like JiffyDOS or IDEDOS
|
||||||
|
; use the original KERNAL API as well.
|
||||||
|
; the IRQ handlers can be delayed for some rasterlines up to several frames due to KERNAL routines
|
||||||
|
; temporarily disabling IRQ (but that is unlikely for devices not using the serial bus).
|
||||||
|
; for the sake of compatibility, only disable this option if the space is really needed.
|
||||||
|
; C-64:
|
||||||
|
; Attention: KERNAL, BASIC, and possible cartridge ROMs are enabled, so IRQ handlers are not
|
||||||
|
; allowed in the ranges $8000..$BFFF and $D000..$FFFF.
|
||||||
|
; Attention: KERNAL routines may execute CLI, so make sure to have valid IRQ vectors and handlers,
|
||||||
|
; or disable all IRQ sources (not via SEI), also make sure to correctly handle the different
|
||||||
|
; IRQ conditions when called via KERNAL vector ($0314) vs. non-KERNAL vector ($FFFE), both are possible -
|
||||||
|
; best have KERNAL and BASIC enabled before calling the loader, so only the KERNAL vector IRQ handler is
|
||||||
|
; needed (please note that the handler code is delayed a little when called via $0314 rather than $FFFE).
|
||||||
|
; C-128:
|
||||||
|
; Attention: System ROM is enabled, so IRQ handlers are not allowed in the range $C000..$FFFF.
|
||||||
|
; Attention: KERNAL routines may execute CLI, so make sure to have valid IRQ vectors and handlers,
|
||||||
|
; or disable all IRQ sources (not via SEI), also make sure to correctly handle the different
|
||||||
|
; IRQ conditions when called via KERNAL vector ($0314) vs. non-KERNAL vector ($FFFE) - best have System ROM
|
||||||
|
; enabled before calling the loader, so only the KERNAL vector IRQ handler is needed (please note that
|
||||||
|
; the handler code is delayed a little when called via $0314 rather than $FFFE).
|
||||||
|
; C-64/128:
|
||||||
|
; Attention: KERNAL routines use CIA1 timer A ($DC04/5).
|
||||||
|
; Plus/4:
|
||||||
|
; Attention: The ROM space in the upper memory half is enabled, so IRQ handlers are not allowed
|
||||||
|
; in the range $8000..$FFFF.
|
||||||
|
; Attention: The ROM routines may execute CLI, so make sure to have valid IRQ vectors and handlers,
|
||||||
|
; or disable all IRQ sources (not via SEI), also make sure to correctly handle the different
|
||||||
|
; IRQ conditions when called via ROM vector ($0314) vs. non-ROM vector ($FFFE) - best have ROM enabled
|
||||||
|
; before calling the loader, so only the ROM vector IRQ handler is needed (please note that
|
||||||
|
; the handler code is delayed a little when being called via $0314 rather than $FFFE).
|
||||||
|
; requires ONLY_1541_AND_COMPATIBLE = 0
|
||||||
|
|
||||||
|
.define CLOSE_FILE_API 0 ; include the closefile call to close an open file
|
||||||
|
|
||||||
|
|
||||||
|
; these options change drive-side code
|
||||||
|
|
||||||
|
.define DIRTRACK 18 ; actual directory track, this can be changed to have a shadow directory so that the
|
||||||
|
; normal directory does not list the files and can be used entirely for bootstrap and dir-art
|
||||||
|
.define DIRTRACK81 40 ; (i.e., the loader's directory can be relocated to hide it from the normal directory command).
|
||||||
|
; DIRTRACK must be 18 when LOAD_VIA_KERNAL_FALLBACK != 0
|
||||||
|
; DIRTRACK81 must be 40 when LOAD_VIA_KERNAL_FALLBACK != 0
|
||||||
|
|
||||||
|
.define FILENAME_MAXLENGTH 16 ; maximum length of filename, if a directory is capable of holding longer names, extra characters are ignored,
|
||||||
|
; to facilitate dir-art, set to, e.g., 2, then load files as "01*", "02*", etc.
|
||||||
|
|
||||||
|
|
||||||
|
; this reduces host-side install code
|
||||||
|
|
||||||
|
.define ONLY_1541_AND_COMPATIBLE 0 ; reduces host-side install code by omitting any native custom drive code for non-1541 compatible
|
||||||
|
; drives, treats any drive as 1541, using an incompatible drive will cause undefined behaviour
|
||||||
76
loader/samples/minexample/main.asm
Normal file
|
|
@ -0,0 +1,76 @@
|
||||||
|
.feature c_comments
|
||||||
|
|
||||||
|
.zeropage
|
||||||
|
|
||||||
|
.segment "CODE"
|
||||||
|
|
||||||
|
.org $080D
|
||||||
|
main:
|
||||||
|
sei
|
||||||
|
lda #$35
|
||||||
|
sta $01
|
||||||
|
|
||||||
|
lda #127
|
||||||
|
sta $dc0d
|
||||||
|
|
||||||
|
and $d011
|
||||||
|
sta $d011
|
||||||
|
|
||||||
|
lda $dc0d
|
||||||
|
lda $dd0d
|
||||||
|
|
||||||
|
lda #<irq
|
||||||
|
sta $fffe
|
||||||
|
lda #>irq
|
||||||
|
sta $ffff
|
||||||
|
|
||||||
|
lda #$0b
|
||||||
|
sta $d011
|
||||||
|
lda #$00
|
||||||
|
sta $d012
|
||||||
|
|
||||||
|
lda #0
|
||||||
|
sta $d01a
|
||||||
|
|
||||||
|
lda #$63; <(985248/100)
|
||||||
|
sta $dc04
|
||||||
|
lda #$26;>(985248/100)
|
||||||
|
sta $dc05
|
||||||
|
|
||||||
|
lda $dc0d
|
||||||
|
and #$81
|
||||||
|
sta $dc0d
|
||||||
|
|
||||||
|
lda #$40
|
||||||
|
sta $dc0c
|
||||||
|
|
||||||
|
lda #$81
|
||||||
|
sta $dc0d
|
||||||
|
|
||||||
|
lda #0
|
||||||
|
jsr $1000
|
||||||
|
cli
|
||||||
|
jmp *
|
||||||
|
|
||||||
|
irq_music:
|
||||||
|
pha
|
||||||
|
txa
|
||||||
|
pha
|
||||||
|
tya
|
||||||
|
pha
|
||||||
|
|
||||||
|
inc $d020
|
||||||
|
jsr $1003
|
||||||
|
dec $d020
|
||||||
|
|
||||||
|
pla
|
||||||
|
tay
|
||||||
|
pla
|
||||||
|
tax
|
||||||
|
pla
|
||||||
|
;rti
|
||||||
|
jmp $dc0c
|
||||||
|
|
||||||
|
|
||||||
|
.res $1000-*
|
||||||
|
.incbin "ys2_sid.sid", $7e+($1000-$ff6)
|
||||||
BIN
loader/samples/minexample/minexample.o
Normal file
346
loader/samples/minexample/minexample.s
Normal file
|
|
@ -0,0 +1,346 @@
|
||||||
|
.feature c_comments
|
||||||
|
.include "../../build/loadersymbols-c64.inc"
|
||||||
|
|
||||||
|
.ZEROPAGE
|
||||||
|
.org $10
|
||||||
|
bmp_delay: .res 1
|
||||||
|
bmp_addr: .res 2
|
||||||
|
bmp_ptr: .res 2
|
||||||
|
scr_ptr_lo: .res 1
|
||||||
|
scr_ptr: .res 2
|
||||||
|
cram_ptr: .res 2
|
||||||
|
chr_count: .res 1
|
||||||
|
vbl: .res 1
|
||||||
|
frame: .res 1
|
||||||
|
cur_frame: .res 1
|
||||||
|
frame_delay: .res 1
|
||||||
|
frame_until: .res 1
|
||||||
|
|
||||||
|
.segment "CODE"
|
||||||
|
|
||||||
|
ZP=$e0
|
||||||
|
offset = ZP+0
|
||||||
|
ZX0_src = ZP+2
|
||||||
|
ZX0_dst = ZP+4
|
||||||
|
bitr = ZP+6
|
||||||
|
pntr = ZP+7
|
||||||
|
|
||||||
|
|
||||||
|
.org $080d
|
||||||
|
jsr install
|
||||||
|
|
||||||
|
sei
|
||||||
|
lda #$35
|
||||||
|
sta $01
|
||||||
|
|
||||||
|
lda #0
|
||||||
|
sta ZX0_dst+0
|
||||||
|
|
||||||
|
ldx #<badguy
|
||||||
|
ldy #>badguy
|
||||||
|
jsr loadraw
|
||||||
|
|
||||||
|
lda #0
|
||||||
|
sta ZX0_src
|
||||||
|
lda #$e0
|
||||||
|
sta ZX0_src+1
|
||||||
|
lda #0
|
||||||
|
sta ZX0_dst
|
||||||
|
lda #$20
|
||||||
|
jsr zx02
|
||||||
|
|
||||||
|
lda #127
|
||||||
|
sta $dc0d
|
||||||
|
|
||||||
|
and $d011
|
||||||
|
sta $d011
|
||||||
|
|
||||||
|
lda $dc0d
|
||||||
|
lda $dd0d
|
||||||
|
|
||||||
|
lda #<irq_badguy
|
||||||
|
sta $fffe
|
||||||
|
lda #>irq_badguy
|
||||||
|
sta $ffff
|
||||||
|
|
||||||
|
lda #$1b
|
||||||
|
sta $d011
|
||||||
|
lda #$80
|
||||||
|
sta $d012
|
||||||
|
|
||||||
|
lda #1
|
||||||
|
sta $d01a
|
||||||
|
sta bmp_delay
|
||||||
|
jsr init_bmp
|
||||||
|
|
||||||
|
lda #0
|
||||||
|
sta vbl
|
||||||
|
|
||||||
|
cli
|
||||||
|
|
||||||
|
lda #7
|
||||||
|
sta frame_until
|
||||||
|
jsr wait_frame_until
|
||||||
|
|
||||||
|
lda #50*5
|
||||||
|
sta frame_delay
|
||||||
|
jsr wait_loop
|
||||||
|
|
||||||
|
lda #$0d
|
||||||
|
sta frame_until
|
||||||
|
jsr wait_frame_until
|
||||||
|
|
||||||
|
lda #50*5
|
||||||
|
sta frame_delay
|
||||||
|
jsr wait_loop
|
||||||
|
|
||||||
|
lda #50*5
|
||||||
|
sta frame_delay
|
||||||
|
jsr wait_loop
|
||||||
|
|
||||||
|
lda #26
|
||||||
|
sta frame_until
|
||||||
|
jsr wait_frame_until
|
||||||
|
jmp *
|
||||||
|
|
||||||
|
wait_loop:
|
||||||
|
loop2:
|
||||||
|
lda vbl
|
||||||
|
beq loop2
|
||||||
|
|
||||||
|
lda #0
|
||||||
|
sta vbl
|
||||||
|
|
||||||
|
jsr sfx_play
|
||||||
|
|
||||||
|
dec frame_delay
|
||||||
|
lda frame_delay
|
||||||
|
beq :+
|
||||||
|
jmp loop2
|
||||||
|
:
|
||||||
|
rts
|
||||||
|
|
||||||
|
wait_frame_until:
|
||||||
|
loop:
|
||||||
|
lda vbl
|
||||||
|
beq loop
|
||||||
|
|
||||||
|
lda #0
|
||||||
|
sta vbl
|
||||||
|
|
||||||
|
lda cur_frame
|
||||||
|
cmp #2
|
||||||
|
bcc :+
|
||||||
|
jsr sfx_play
|
||||||
|
:
|
||||||
|
|
||||||
|
dec bmp_delay
|
||||||
|
bpl :+
|
||||||
|
jsr update_bmp
|
||||||
|
:
|
||||||
|
|
||||||
|
lda cur_frame
|
||||||
|
cmp frame_until
|
||||||
|
beq :+
|
||||||
|
|
||||||
|
jmp loop
|
||||||
|
:
|
||||||
|
rts
|
||||||
|
|
||||||
|
init_bmp:
|
||||||
|
lda #$3b
|
||||||
|
sta $d011
|
||||||
|
lda #$19
|
||||||
|
sta $d018
|
||||||
|
lda #$d8
|
||||||
|
sta $d016
|
||||||
|
|
||||||
|
lda $4710
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
sta $d020
|
||||||
|
|
||||||
|
lda $4710
|
||||||
|
and #$0f
|
||||||
|
sta $d021
|
||||||
|
|
||||||
|
lda #0
|
||||||
|
sta cur_frame
|
||||||
|
sta bmp_delay
|
||||||
|
|
||||||
|
lda #$11
|
||||||
|
sta bmp_addr
|
||||||
|
lda #$47
|
||||||
|
sta bmp_addr+1
|
||||||
|
|
||||||
|
ldx #0
|
||||||
|
:
|
||||||
|
.repeat 4, I
|
||||||
|
lda $3f40+(I*250), x
|
||||||
|
sta $400+(I*250), x
|
||||||
|
lda $4328+(I*250), x
|
||||||
|
sta $d800+(I*250), x
|
||||||
|
.endrepeat
|
||||||
|
inx
|
||||||
|
cpx #250
|
||||||
|
bne :-
|
||||||
|
rts
|
||||||
|
|
||||||
|
inc_bmp_addr:
|
||||||
|
inc bmp_addr
|
||||||
|
bne :+
|
||||||
|
inc bmp_addr+1
|
||||||
|
:
|
||||||
|
rts
|
||||||
|
|
||||||
|
update_bmp:
|
||||||
|
ldy #0
|
||||||
|
sty scr_ptr
|
||||||
|
sty cram_ptr
|
||||||
|
lda (bmp_addr), y
|
||||||
|
jsr inc_bmp_addr
|
||||||
|
sta chr_count
|
||||||
|
cmp #0 ; tfw flags update in inc_bmp_addr
|
||||||
|
bne @skip_frame_end
|
||||||
|
lda (bmp_addr), y
|
||||||
|
jsr inc_bmp_addr
|
||||||
|
sta bmp_delay
|
||||||
|
inc cur_frame
|
||||||
|
lda cur_frame
|
||||||
|
cmp #2
|
||||||
|
bne :+
|
||||||
|
lda #0
|
||||||
|
jsr sfx_init
|
||||||
|
:
|
||||||
|
rts
|
||||||
|
@skip_frame_end:
|
||||||
|
|
||||||
|
lda (bmp_addr), y
|
||||||
|
sta bmp_ptr
|
||||||
|
iny
|
||||||
|
lda (bmp_addr), y
|
||||||
|
clc
|
||||||
|
adc #$20
|
||||||
|
sta bmp_ptr+1
|
||||||
|
|
||||||
|
iny
|
||||||
|
lda (bmp_addr), y
|
||||||
|
sta scr_ptr_lo
|
||||||
|
iny
|
||||||
|
lda (bmp_addr), y
|
||||||
|
clc
|
||||||
|
adc #$04
|
||||||
|
sta scr_ptr+1
|
||||||
|
clc
|
||||||
|
adc #$d8-$04
|
||||||
|
sta cram_ptr+1
|
||||||
|
|
||||||
|
ldy #0
|
||||||
|
lda bmp_addr
|
||||||
|
clc
|
||||||
|
adc #4
|
||||||
|
sta bmp_addr
|
||||||
|
bcc :+
|
||||||
|
inc bmp_addr+1
|
||||||
|
:
|
||||||
|
|
||||||
|
ldx #0
|
||||||
|
@loop:
|
||||||
|
ldy #0
|
||||||
|
lda (bmp_addr), y
|
||||||
|
sta (bmp_ptr), y
|
||||||
|
iny
|
||||||
|
lda (bmp_addr), y
|
||||||
|
sta (bmp_ptr), y
|
||||||
|
iny
|
||||||
|
lda (bmp_addr), y
|
||||||
|
sta (bmp_ptr), y
|
||||||
|
iny
|
||||||
|
lda (bmp_addr), y
|
||||||
|
sta (bmp_ptr), y
|
||||||
|
iny
|
||||||
|
lda (bmp_addr), y
|
||||||
|
sta (bmp_ptr), y
|
||||||
|
iny
|
||||||
|
lda (bmp_addr), y
|
||||||
|
sta (bmp_ptr), y
|
||||||
|
iny
|
||||||
|
lda (bmp_addr), y
|
||||||
|
sta (bmp_ptr), y
|
||||||
|
iny
|
||||||
|
lda (bmp_addr), y
|
||||||
|
sta (bmp_ptr), y
|
||||||
|
|
||||||
|
lda bmp_ptr
|
||||||
|
clc
|
||||||
|
adc #8
|
||||||
|
sta bmp_ptr
|
||||||
|
bcc :+
|
||||||
|
inc bmp_ptr+1
|
||||||
|
:
|
||||||
|
lda bmp_addr
|
||||||
|
clc
|
||||||
|
adc #8
|
||||||
|
sta bmp_addr
|
||||||
|
bcc :+
|
||||||
|
inc bmp_addr+1
|
||||||
|
:
|
||||||
|
|
||||||
|
ldy #0
|
||||||
|
lda (bmp_addr), y
|
||||||
|
ldy scr_ptr_lo
|
||||||
|
sta (scr_ptr), y
|
||||||
|
|
||||||
|
ldy #1
|
||||||
|
lda (bmp_addr), y
|
||||||
|
ldy scr_ptr_lo
|
||||||
|
sta (cram_ptr), y
|
||||||
|
|
||||||
|
inc scr_ptr_lo
|
||||||
|
bne :+
|
||||||
|
inc scr_ptr+1
|
||||||
|
inc cram_ptr+1
|
||||||
|
:
|
||||||
|
|
||||||
|
lda bmp_addr
|
||||||
|
clc
|
||||||
|
adc #2
|
||||||
|
sta bmp_addr
|
||||||
|
bcc :+
|
||||||
|
inc bmp_addr+1
|
||||||
|
:
|
||||||
|
|
||||||
|
dec chr_count
|
||||||
|
ldx chr_count
|
||||||
|
bne @loop
|
||||||
|
jmp update_bmp
|
||||||
|
|
||||||
|
irq_badguy:
|
||||||
|
pha
|
||||||
|
txa
|
||||||
|
pha
|
||||||
|
tya
|
||||||
|
pha
|
||||||
|
|
||||||
|
inc vbl
|
||||||
|
|
||||||
|
asl $d019
|
||||||
|
pla
|
||||||
|
tay
|
||||||
|
pla
|
||||||
|
tax
|
||||||
|
pla
|
||||||
|
rti
|
||||||
|
|
||||||
|
badguy: .byte "badguy",0
|
||||||
|
|
||||||
|
.include "sfx.asm"
|
||||||
|
.include "zx02.asm"
|
||||||
|
|
||||||
|
.res loadraw - *
|
||||||
|
.incbin "../../build/loader-c64.prg", 2
|
||||||
|
|
||||||
|
.res install - *
|
||||||
|
.incbin "../../build/install-c64.prg", 2
|
||||||
BIN
loader/samples/minexample/png2prg 2/01_badguys.prg
Normal file
29
loader/samples/minexample/png2prg 2/01_badguyz_cut.csv
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
100,ys2/01_badguyz/koala/png/00.png
|
||||||
|
3,ys2/01_badguyz/koala/png/01.png
|
||||||
|
3,ys2/01_badguyz/koala/png/02.png
|
||||||
|
3,ys2/01_badguyz/koala/png/03.png
|
||||||
|
3,ys2/01_badguyz/koala/png/04.png
|
||||||
|
3,ys2/01_badguyz/koala/png/05.png
|
||||||
|
50,ys2/01_badguyz/koala/png/06.png
|
||||||
|
15,ys2/01_badguyz/koala/png/07.png
|
||||||
|
15,ys2/01_badguyz/koala/png/08.png
|
||||||
|
15,ys2/01_badguyz/koala/png/09.png
|
||||||
|
15,ys2/01_badguyz/koala/png/10.png
|
||||||
|
15,ys2/01_badguyz/koala/png/11.png
|
||||||
|
100,ys2/01_badguyz/koala/png/12.png
|
||||||
|
15,ys2/01_badguyz/koala/png/10.png
|
||||||
|
15,ys2/01_badguyz/koala/png/09.png
|
||||||
|
15,ys2/01_badguyz/koala/png/08.png
|
||||||
|
15,ys2/01_badguyz/koala/png/07.png
|
||||||
|
100,ys2/01_badguyz/koala/png/06.png
|
||||||
|
3,ys2/01_badguyz/koala/png/13.png
|
||||||
|
3,ys2/01_badguyz/koala/png/14.png
|
||||||
|
3,ys2/01_badguyz/koala/png/15.png
|
||||||
|
3,ys2/01_badguyz/koala/png/16.png
|
||||||
|
3,ys2/01_badguyz/koala/png/17.png
|
||||||
|
3,ys2/01_badguyz/koala/png/18.png
|
||||||
|
3,ys2/01_badguyz/koala/png/19.png
|
||||||
|
100,ys2/01_badguyz/koala/png/00.png
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
20
loader/samples/minexample/png2prg 2/03_tower.csv
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
100,ys2/03_tower/koala/png/01.png
|
||||||
|
3,ys2/03_tower/koala/png/02.png
|
||||||
|
3,ys2/03_tower/koala/png/03.png
|
||||||
|
3,ys2/03_tower/koala/png/04.png
|
||||||
|
3,ys2/03_tower/koala/png/05.png
|
||||||
|
3,ys2/03_tower/koala/png/06.png
|
||||||
|
3,ys2/03_tower/koala/png/03.png
|
||||||
|
50,ys2/03_tower/koala/png/01.png
|
||||||
|
10,ys2/03_tower/koala/png/07.png
|
||||||
|
10,ys2/03_tower/koala/png/08.png
|
||||||
|
10,ys2/03_tower/koala/png/09.png
|
||||||
|
10,ys2/03_tower/koala/png/10.png
|
||||||
|
10,ys2/03_tower/koala/png/11.png
|
||||||
|
10,ys2/03_tower/koala/png/12.png
|
||||||
|
10,ys2/03_tower/koala/png/13.png
|
||||||
|
10,ys2/03_tower/koala/png/14.png
|
||||||
|
150,ys2/03_tower/koala/png/15.png
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
BIN
loader/samples/minexample/png2prg 2/03_tower.prg
Normal file
40
loader/samples/minexample/png2prg 2/04_tower_beam.csv
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
50,ys2/04_tower_beam/koala/png/01.png
|
||||||
|
5,ys2/04_tower_beam/koala/png/02.png
|
||||||
|
5,ys2/04_tower_beam/koala/png/03.png
|
||||||
|
3,ys2/04_tower_beam/koala/png/04.png
|
||||||
|
3,ys2/04_tower_beam/koala/png/05.png
|
||||||
|
3,ys2/04_tower_beam/koala/png/06.png
|
||||||
|
3,ys2/04_tower_beam/koala/png/07.png
|
||||||
|
3,ys2/04_tower_beam/koala/png/08.png
|
||||||
|
3,ys2/04_tower_beam/koala/png/09.png
|
||||||
|
3,ys2/04_tower_beam/koala/png/10.png
|
||||||
|
3,ys2/04_tower_beam/koala/png/11.png
|
||||||
|
3,ys2/04_tower_beam/koala/png/12.png
|
||||||
|
3,ys2/04_tower_beam/koala/png/13.png
|
||||||
|
|
||||||
|
3,ys2/04_tower_beam/koala/png/11.png
|
||||||
|
3,ys2/04_tower_beam/koala/png/12.png
|
||||||
|
3,ys2/04_tower_beam/koala/png/13.png
|
||||||
|
|
||||||
|
3,ys2/04_tower_beam/koala/png/11.png
|
||||||
|
3,ys2/04_tower_beam/koala/png/12.png
|
||||||
|
3,ys2/04_tower_beam/koala/png/13.png
|
||||||
|
|
||||||
|
3,ys2/04_tower_beam/koala/png/11.png
|
||||||
|
3,ys2/04_tower_beam/koala/png/12.png
|
||||||
|
3,ys2/04_tower_beam/koala/png/13.png
|
||||||
|
|
||||||
|
3,ys2/04_tower_beam/koala/png/11.png
|
||||||
|
3,ys2/04_tower_beam/koala/png/12.png
|
||||||
|
3,ys2/04_tower_beam/koala/png/13.png
|
||||||
|
|
||||||
|
3,ys2/04_tower_beam/koala/png/11.png
|
||||||
|
3,ys2/04_tower_beam/koala/png/12.png
|
||||||
|
3,ys2/04_tower_beam/koala/png/13.png
|
||||||
|
|
||||||
|
3,ys2/04_tower_beam/koala/png/11.png
|
||||||
|
3,ys2/04_tower_beam/koala/png/12.png
|
||||||
|
3,ys2/04_tower_beam/koala/png/13.png
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
BIN
loader/samples/minexample/png2prg 2/04_tower_beam.prg
Normal file
69
loader/samples/minexample/png2prg 2/05_field.csv
Normal file
|
|
@ -0,0 +1,69 @@
|
||||||
|
3,ys2/05_field/koala/png/01.png
|
||||||
|
3,ys2/05_field/koala/png/02.png
|
||||||
|
3,ys2/05_field/koala/png/03.png
|
||||||
|
3,ys2/05_field/koala/png/04.png
|
||||||
|
3,ys2/05_field/koala/png/05.png
|
||||||
|
3,ys2/05_field/koala/png/06.png
|
||||||
|
3,ys2/05_field/koala/png/07.png
|
||||||
|
3,ys2/05_field/koala/png/08.png
|
||||||
|
|
||||||
|
3,ys2/05_field/koala/png/01.png
|
||||||
|
3,ys2/05_field/koala/png/02.png
|
||||||
|
3,ys2/05_field/koala/png/03.png
|
||||||
|
3,ys2/05_field/koala/png/04.png
|
||||||
|
3,ys2/05_field/koala/png/05.png
|
||||||
|
3,ys2/05_field/koala/png/06.png
|
||||||
|
3,ys2/05_field/koala/png/07.png
|
||||||
|
3,ys2/05_field/koala/png/08.png
|
||||||
|
|
||||||
|
3,ys2/05_field/koala/png/01.png
|
||||||
|
3,ys2/05_field/koala/png/02.png
|
||||||
|
3,ys2/05_field/koala/png/03.png
|
||||||
|
3,ys2/05_field/koala/png/04.png
|
||||||
|
3,ys2/05_field/koala/png/05.png
|
||||||
|
3,ys2/05_field/koala/png/06.png
|
||||||
|
3,ys2/05_field/koala/png/07.png
|
||||||
|
3,ys2/05_field/koala/png/08.png
|
||||||
|
|
||||||
|
3,ys2/05_field/koala/png/01.png
|
||||||
|
3,ys2/05_field/koala/png/02.png
|
||||||
|
3,ys2/05_field/koala/png/03.png
|
||||||
|
3,ys2/05_field/koala/png/04.png
|
||||||
|
3,ys2/05_field/koala/png/05.png
|
||||||
|
3,ys2/05_field/koala/png/06.png
|
||||||
|
3,ys2/05_field/koala/png/07.png
|
||||||
|
3,ys2/05_field/koala/png/08.png
|
||||||
|
|
||||||
|
3,ys2/05_field/koala/png/01.png
|
||||||
|
3,ys2/05_field/koala/png/02.png
|
||||||
|
3,ys2/05_field/koala/png/03.png
|
||||||
|
3,ys2/05_field/koala/png/04.png
|
||||||
|
3,ys2/05_field/koala/png/05.png
|
||||||
|
3,ys2/05_field/koala/png/06.png
|
||||||
|
3,ys2/05_field/koala/png/07.png
|
||||||
|
3,ys2/05_field/koala/png/08.png
|
||||||
|
|
||||||
|
3,ys2/05_field/koala/png/09.png
|
||||||
|
3,ys2/05_field/koala/png/10.png
|
||||||
|
3,ys2/05_field/koala/png/11.png
|
||||||
|
3,ys2/05_field/koala/png/12.png
|
||||||
|
3,ys2/05_field/koala/png/13.png
|
||||||
|
3,ys2/05_field/koala/png/14.png
|
||||||
|
3,ys2/05_field/koala/png/15.png
|
||||||
|
3,ys2/05_field/koala/png/16.png
|
||||||
|
3,ys2/05_field/koala/png/17.png
|
||||||
|
3,ys2/05_field/koala/png/18.png
|
||||||
|
3,ys2/05_field/koala/png/19.png
|
||||||
|
3,ys2/05_field/koala/png/20.png
|
||||||
|
3,ys2/05_field/koala/png/21.png
|
||||||
|
3,ys2/05_field/koala/png/22.png
|
||||||
|
3,ys2/05_field/koala/png/23.png
|
||||||
|
3,ys2/05_field/koala/png/24.png
|
||||||
|
3,ys2/05_field/koala/png/25.png
|
||||||
|
3,ys2/05_field/koala/png/26.png
|
||||||
|
3,ys2/05_field/koala/png/27.png
|
||||||
|
3,ys2/05_field/koala/png/28.png
|
||||||
|
3,ys2/05_field/koala/png/29.png
|
||||||
|
3,ys2/05_field/koala/png/30.png
|
||||||
|
|
||||||
|
|
||||||
|
BIN
loader/samples/minexample/png2prg 2/05_field.prg
Normal file
38
loader/samples/minexample/png2prg 2/06_falling_star.csv
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
50,ys2/06_falling_star/koala/png/01.png
|
||||||
|
5,ys2/06_falling_star/koala/png/02.png
|
||||||
|
5,ys2/06_falling_star/koala/png/03.png
|
||||||
|
5,ys2/06_falling_star/koala/png/04.png
|
||||||
|
5,ys2/06_falling_star/koala/png/05.png
|
||||||
|
5,ys2/06_falling_star/koala/png/06.png
|
||||||
|
5,ys2/06_falling_star/koala/png/07.png
|
||||||
|
5,ys2/06_falling_star/koala/png/08.png
|
||||||
|
5,ys2/06_falling_star/koala/png/09.png
|
||||||
|
5,ys2/06_falling_star/koala/png/10.png
|
||||||
|
5,ys2/06_falling_star/koala/png/11.png
|
||||||
|
5,ys2/06_falling_star/koala/png/12.png
|
||||||
|
5,ys2/06_falling_star/koala/png/13.png
|
||||||
|
5,ys2/06_falling_star/koala/png/14.png
|
||||||
|
5,ys2/06_falling_star/koala/png/15.png
|
||||||
|
5,ys2/06_falling_star/koala/png/16.png
|
||||||
|
5,ys2/06_falling_star/koala/png/17.png
|
||||||
|
5,ys2/06_falling_star/koala/png/18.png
|
||||||
|
5,ys2/06_falling_star/koala/png/19.png
|
||||||
|
|
||||||
|
5,ys2/06_falling_star/koala/png/18.png
|
||||||
|
5,ys2/06_falling_star/koala/png/19.png
|
||||||
|
|
||||||
|
5,ys2/06_falling_star/koala/png/18.png
|
||||||
|
5,ys2/06_falling_star/koala/png/19.png
|
||||||
|
|
||||||
|
5,ys2/06_falling_star/koala/png/18.png
|
||||||
|
5,ys2/06_falling_star/koala/png/19.png
|
||||||
|
|
||||||
|
5,ys2/06_falling_star/koala/png/18.png
|
||||||
|
5,ys2/06_falling_star/koala/png/19.png
|
||||||
|
|
||||||
|
5,ys2/06_falling_star/koala/png/18.png
|
||||||
|
5,ys2/06_falling_star/koala/png/19.png
|
||||||
|
|
||||||
|
5,ys2/06_falling_star/koala/png/18.png
|
||||||
|
5,ys2/06_falling_star/koala/png/19.png
|
||||||
|
|
||||||
|
BIN
loader/samples/minexample/png2prg 2/06_falling_star.prg
Normal file
BIN
loader/samples/minexample/png2prg 2/07_lilia.prg
Normal file
BIN
loader/samples/minexample/png2prg 2/08_lilia_hero.prg
Normal file
66
loader/samples/minexample/png2prg 2/11_lilia_final.csv
Normal file
|
|
@ -0,0 +1,66 @@
|
||||||
|
7,ys2/11_lilia_final/koala/png/01.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/02.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/03.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/02.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/01.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/02.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/03.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/02.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/01.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/02.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/03.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/02.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/01.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/02.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/03.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/02.png
|
||||||
|
50,ys2/11_lilia_final/koala/png/01.png
|
||||||
|
|
||||||
|
20,ys2/11_lilia_final/koala/png/04.png
|
||||||
|
3,ys2/11_lilia_final/koala/png/05.png
|
||||||
|
3,ys2/11_lilia_final/koala/png/06.png
|
||||||
|
3,ys2/11_lilia_final/koala/png/07.png
|
||||||
|
3,ys2/11_lilia_final/koala/png/06.png
|
||||||
|
3,ys2/11_lilia_final/koala/png/05.png
|
||||||
|
3,ys2/11_lilia_final/koala/png/04.png
|
||||||
|
|
||||||
|
7,ys2/11_lilia_final/koala/png/01.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/02.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/03.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/02.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/01.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/02.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/03.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/02.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/01.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/02.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/03.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/02.png
|
||||||
|
|
||||||
|
3,ys2/11_lilia_final/koala/png/08.png
|
||||||
|
3,ys2/11_lilia_final/koala/png/09.png
|
||||||
|
3,ys2/11_lilia_final/koala/png/10.png
|
||||||
|
3,ys2/11_lilia_final/koala/png/11.png
|
||||||
|
3,ys2/11_lilia_final/koala/png/10.png
|
||||||
|
3,ys2/11_lilia_final/koala/png/09.png
|
||||||
|
3,ys2/11_lilia_final/koala/png/08.png
|
||||||
|
|
||||||
|
7,ys2/11_lilia_final/koala/png/01.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/02.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/03.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/02.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/01.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/02.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/03.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/02.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/01.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/02.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/03.png
|
||||||
|
7,ys2/11_lilia_final/koala/png/02.png
|
||||||
|
50,ys2/11_lilia_final/koala/png/01.png
|
||||||
|
|
||||||
|
3,ys2/11_lilia_final/koala/png/12.png
|
||||||
|
3,ys2/11_lilia_final/koala/png/13.png
|
||||||
|
3,ys2/11_lilia_final/koala/png/14.png
|
||||||
|
3,ys2/11_lilia_final/koala/png/15.png
|
||||||
|
200,ys2/11_lilia_final/koala/png/16.png
|
||||||
|
BIN
loader/samples/minexample/png2prg 2/11_lilia_final.prg
Normal file
BIN
loader/samples/minexample/png2prg 2/examples.d64
Normal file
9
loader/samples/minexample/png2prg 2/lilia.csv
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
50,ys2/07_lilia/lilia1.png
|
||||||
|
4,ys2/07_lilia/lilia2.png
|
||||||
|
4,ys2/07_lilia/lilia3.png
|
||||||
|
4,ys2/07_lilia/lilia4.png
|
||||||
|
4,ys2/07_lilia/lilia5.png
|
||||||
|
4,ys2/07_lilia/lilia6.png
|
||||||
|
4,ys2/07_lilia/lilia7.png
|
||||||
|
4,ys2/07_lilia/lilia8.png
|
||||||
|
150,ys2/07_lilia/lilia9.png
|
||||||
|
BIN
loader/samples/minexample/png2prg 2/lilia.prg
Normal file
BIN
loader/samples/minexample/png2prg 2/png2prg_darwin_arm64
Executable file
BIN
loader/samples/minexample/png2prg 2/png2prg_win_x86.exe
Normal file
687
loader/samples/minexample/png2prg 2/readme.md
Normal file
|
|
@ -0,0 +1,687 @@
|
||||||
|
# PNG2PRG 1.12 by burg
|
||||||
|
|
||||||
|
Png2prg converts a 320x200 image (png/gif/jpeg) to a c64 hires or
|
||||||
|
multicolor bitmap, charset, petscii, ecm or sprites prg. It will find the best
|
||||||
|
matching palette and background/bitpair-colors automatically, no need to modify
|
||||||
|
your source images or configure a palette.
|
||||||
|
|
||||||
|
Vice screenshots with default borders (384x272) are automatically cropped.
|
||||||
|
Vice's main screen offset is at x=32, y=35.
|
||||||
|
Quite a few people (and possibly tools too) use the incorrect 32,36 offset.
|
||||||
|
Use the -alt-offset or -ao flag to use 32,36 as offset.
|
||||||
|
Images in sprite dimensions will be converted to sprites.
|
||||||
|
|
||||||
|
The resulting .prg includes the 2-byte start address and optional displayer.
|
||||||
|
The displayers can optionally play a .sid tune.
|
||||||
|
|
||||||
|
This tool can be used in all buildchains on all common platforms.
|
||||||
|
|
||||||
|
## What Is New
|
||||||
|
|
||||||
|
Png2prg 1.12 introduces animation.csv support for custom delays per frame.
|
||||||
|
See 'Animation csv' below for details.
|
||||||
|
The -no-loop flag causes animations to only display once.
|
||||||
|
|
||||||
|
This release contains an important bugfix related to mixedcharsets,
|
||||||
|
where in some cases, png2prg would require more unique chars than necessary.
|
||||||
|
There were more issues with png2prg 1.10, which were hotfixed in 1.10.1.
|
||||||
|
It is best to delete any 1.10 version and upgrade to 1.12.
|
||||||
|
|
||||||
|
ECM conversion has been improved, now png2prg also searches for potential
|
||||||
|
char reduction by searching for invertable characters.
|
||||||
|
|
||||||
|
Trident added [devcontainer files](https://github.com/staD020/png2prg/commit/6cb6c48a2804fa5210cf704e0af4cff3313398fe) for setting up a Docker
|
||||||
|
development environment to compile png2prg directly from within VSCode.
|
||||||
|
|
||||||
|
See 'Changes for version 1.12' below for more features and details.
|
||||||
|
|
||||||
|
## What it is *not*
|
||||||
|
|
||||||
|
Png2prg is not a tool to wire fullcolor images. It needs input images to
|
||||||
|
already be compliant with c64 color and size restrictions.
|
||||||
|
In verbose mode (-v) it outputs locations of color clashes, if any.
|
||||||
|
|
||||||
|
If you do need to wire fullcolor images, check out Youth's [Retropixels](https://www.micheldebree.nl/retropixels/).
|
||||||
|
|
||||||
|
## Supported Graphics Modes
|
||||||
|
|
||||||
|
koala: multicolor bitmap (max 4 colors per char)
|
||||||
|
hires: singlecolor bitmap (max 2 colors per char)
|
||||||
|
mixedcharset: multicolor charset (max 4 colors per char (fixed bgcol, d022, d023))
|
||||||
|
mccharset: multicolor charset (max 4 colors)
|
||||||
|
sccharset: singlecolor charset (max 2 colors per char (fixed bgcol))
|
||||||
|
petscii: singlecolor rom charset (max 2 colors per char (fixed bgcol))
|
||||||
|
ecm: singlecolor charset (max 2 colors per char (4 fixed bgcolors), max 64 chars)
|
||||||
|
mcsprites: multicolor sprites (max 4 colors)
|
||||||
|
scsprites: singlecolor sprites (max 2 colors)
|
||||||
|
mcibitmap: 320x200 multicolor interlace bitmap (max 4 colors per char/frame)
|
||||||
|
|
||||||
|
Png2prg is mostly able to autodetect the correct graphics mode, but you can
|
||||||
|
also force a specific graphics mode with the -mode flag:
|
||||||
|
|
||||||
|
./png2prg -m koala image.png
|
||||||
|
|
||||||
|
## Koala or Hires Bitmap
|
||||||
|
|
||||||
|
Bitmap: $2000 - $3f3f
|
||||||
|
Screen: $3f40 - $4327
|
||||||
|
D020: $4328 (singlecolor only)
|
||||||
|
D800: $4328 - $470f (multicolor only)
|
||||||
|
D021: $4710 (multicolor only, low-nibble)
|
||||||
|
D020: $4710 (multicolor only, high-nibble)
|
||||||
|
|
||||||
|
## Multicolor Interlace Bitmap
|
||||||
|
|
||||||
|
You can supply one 320x200 multicolor image with max 4 colors per 8x8 pixel
|
||||||
|
char per frame of which at least 2 are shared (the D021 and D800 colors).
|
||||||
|
|
||||||
|
Or supply both frames in regular koala specs (-interlace flag required).
|
||||||
|
When making screenshots in vice, please disable the d016 pixel shift manually.
|
||||||
|
|
||||||
|
./png2prg -i testdata/madonna/frame_0.png testdata/madonna/frame_1.png
|
||||||
|
|
||||||
|
### Drazlace (shared screenram and colorram for both frames)
|
||||||
|
|
||||||
|
./png2prg testdata/madonna/cjam_pure_madonna.png
|
||||||
|
|
||||||
|
D800: $5800 - $5be7
|
||||||
|
Screen: $5c00 - $5fe7
|
||||||
|
Bitmap1: $6000 - $7f3f
|
||||||
|
D021: $7f40 (low-nibble)
|
||||||
|
D020: $7f40 (high-nibble)
|
||||||
|
D016Offset: $7f42
|
||||||
|
Bitmap2: $8000 - $9f3f
|
||||||
|
|
||||||
|
### Multicolor Interlace (shared colorram, true paint .mci format)
|
||||||
|
|
||||||
|
./png2prg -i -d016 1 testdata/mcinterlace/parriot?.png
|
||||||
|
|
||||||
|
Screen1: $9c00 - $9fe7
|
||||||
|
D021: $9fe8 (low-nibble)
|
||||||
|
D020: $9fe8 (high-nibble)
|
||||||
|
D016Offset: $9fe9
|
||||||
|
Bitmap1: $a000 - $bf3f
|
||||||
|
Bitmap2: $c000 - $df3f
|
||||||
|
Screen2: $e000 - $e3e7
|
||||||
|
D800: $e400 - $e7e7
|
||||||
|
|
||||||
|
## Singlecolor, PETSCII or ECM Charset (individual d800 colors)
|
||||||
|
|
||||||
|
By default charsets are packed, they only contain unique characters.
|
||||||
|
If you do not want charpacking, eg for a 1x1 charset, please use -no-pack.
|
||||||
|
|
||||||
|
With ECM -bitpair-colors can be used to force d021-d024 colors.
|
||||||
|
|
||||||
|
NB: individual d800 colors are not supported with -no-pack.
|
||||||
|
|
||||||
|
./png2prg -m sccharset testdata/hirescharset/ohno_logo.png
|
||||||
|
./png2prg -m petscii testdata/petscii/hein_hibiscus.png
|
||||||
|
./png2prg -m ecm testdata/ecm/xpardey.png
|
||||||
|
./png2prg -m ecm testdata/ecm/shampoo.png
|
||||||
|
./png2prg -m ecm -bpc 2,7,14,0 testdata/ecm/orion.png
|
||||||
|
|
||||||
|
Charset: $2000-$27ff (omitted for petscii)
|
||||||
|
Screen: $2800-$2be7
|
||||||
|
D800: $2c00-$2fe7
|
||||||
|
D020: $2fe8
|
||||||
|
D021: $2fe9
|
||||||
|
D022: $2fea (ecm only)
|
||||||
|
D023: $2feb (ecm only)
|
||||||
|
D024: $2fec (ecm only)
|
||||||
|
|
||||||
|
## Mixed Multi/Singlecolor Charset (individual d800 colors)
|
||||||
|
|
||||||
|
Png2prg tries to figure out the right -bitpair-colors and auto-corrects
|
||||||
|
where it can, but there still are edge-cases like the ones below.
|
||||||
|
If an impossible color is found, an error will be displayed.
|
||||||
|
Swap some -bpc colors around and retry.
|
||||||
|
There can also be cases where manual -bpc colors can influence char-count or
|
||||||
|
packed size.
|
||||||
|
|
||||||
|
You may want to add the -brute-force flag so most color options will be tried.
|
||||||
|
The best packed result wins, not necessarily the version with the least amount
|
||||||
|
of chars.
|
||||||
|
|
||||||
|
./png2prg -m mixedcharset testdata/mixedcharset/hein_neo.png
|
||||||
|
./png2prg -m mixedcharset testdata/mixedcharset/huntress.gif
|
||||||
|
./png2prg -m mixedcharset -bpc 3 testdata/mixedcharset/shine.png
|
||||||
|
./png2prg -m mixedcharset -bpc 0 testdata/mixedcharset/charsetcompo.png
|
||||||
|
|
||||||
|
Charset: $2000-$27ff
|
||||||
|
Screen: $2800-$2be7
|
||||||
|
D800: $2c00-$2fe7
|
||||||
|
D020: $2fe8
|
||||||
|
D021: $2fe9
|
||||||
|
D022: $2fea
|
||||||
|
D023: $2feb
|
||||||
|
|
||||||
|
## Single or Multicolor Sprites
|
||||||
|
|
||||||
|
If the source image size is a multiple of a 24x21 pixel sprite,
|
||||||
|
the image is considered to contain sprites.
|
||||||
|
|
||||||
|
The image will be converted from left to right, top to bottom.
|
||||||
|
|
||||||
|
./png2prg image.png
|
||||||
|
./png2prg -m scsprites image.png
|
||||||
|
./png2prg -m mcsprites image.png
|
||||||
|
|
||||||
|
Sprite 1: $2000-$203f
|
||||||
|
Sprite 2: $2040-$207f
|
||||||
|
...
|
||||||
|
|
||||||
|
## Bitpair Colors
|
||||||
|
|
||||||
|
By default, png2prg guesses bitpair colors by itself. In most cases you
|
||||||
|
don't need to configure anything. It will provide a mostly normalized image
|
||||||
|
which should yield good pack results, but your miles may vary.
|
||||||
|
|
||||||
|
To give you more control, you can force/prefer a specific bitpair
|
||||||
|
color-order. Use c64 colors, so 0 for black, 1 for white, 2 for red, etc.
|
||||||
|
|
||||||
|
The following example will force background color 0 for bitpair 00 and
|
||||||
|
prefer colors 6,14,3 for bitpairs 01,10,11:
|
||||||
|
|
||||||
|
./png2prg -bitpair-colors 0,6,14,3 image.png
|
||||||
|
|
||||||
|
It's also possible to explicitly skip certain bitpair preferences with -1:
|
||||||
|
|
||||||
|
./png2prg -bitpair-colors 0,-1,-1,3 image.png
|
||||||
|
|
||||||
|
## Animations
|
||||||
|
|
||||||
|
When multiple files are added, they are treated as animation frames.
|
||||||
|
You can also supply an animated .gif.
|
||||||
|
|
||||||
|
## Sprite Animation
|
||||||
|
|
||||||
|
Each frame will be concatenated in the output .prg.
|
||||||
|
|
||||||
|
## Bitmap Animation (only koala and hires)
|
||||||
|
|
||||||
|
Note that png2prg uses a rather simple generic diff approach, where small
|
||||||
|
changes frame by frame work well. Trying to change large areas at once
|
||||||
|
is not advised.
|
||||||
|
Use the -no-fade flag if you run out of memory.
|
||||||
|
|
||||||
|
The first image will be exported with all framedata appended.
|
||||||
|
Koala animation frames start at $4711, hires at $4329.
|
||||||
|
|
||||||
|
The frame files are following this format.
|
||||||
|
Each frame consists of 1 or more chunks. A chunk looks like this:
|
||||||
|
|
||||||
|
.byte $03 // number of chars in this chunk
|
||||||
|
// $00 marks end of frame
|
||||||
|
// $ff marks end of all frames
|
||||||
|
.word bitmap // bitmap address of this chunk (the high byte is <$20)
|
||||||
|
.word screen // screenram address (the high byte is <$04)
|
||||||
|
|
||||||
|
For each char in this chunk:
|
||||||
|
|
||||||
|
.byte 0,31,15,7,8,34,0,128 // pixels
|
||||||
|
.byte $64 // screenram colors
|
||||||
|
.byte $01 // colorram color (koala only)
|
||||||
|
... // next char(s)
|
||||||
|
|
||||||
|
... // next chunks
|
||||||
|
.byte 0 // end of frame
|
||||||
|
.byte 6 // wait for 6 frames
|
||||||
|
... // next frame(s)
|
||||||
|
.byte $ff // end of all frames
|
||||||
|
|
||||||
|
## PETSCII and Charset Animation
|
||||||
|
|
||||||
|
Only petscii and sccharset modes support different background and
|
||||||
|
bordercolors per frame.
|
||||||
|
All chars used in all frames must fit into a single 256 char charset.
|
||||||
|
|
||||||
|
Each frame consists of 1 or more chunks. A chunk looks like this:
|
||||||
|
|
||||||
|
.byte $xy // $y = bgcol, $x = bordercol (only for petscii/sccharset)
|
||||||
|
.byte $03 // number of chars in this chunk
|
||||||
|
// $00 marks end of frame
|
||||||
|
// $ff marks end of all frames
|
||||||
|
.word screen // screenram address (the high byte is <$04)
|
||||||
|
|
||||||
|
For each char in this chunk:
|
||||||
|
|
||||||
|
.byte $03 // character
|
||||||
|
.byte $01 // colorram color
|
||||||
|
... // next char(s)
|
||||||
|
|
||||||
|
... // next chunks
|
||||||
|
.byte 0 // end of frame
|
||||||
|
.byte 6 // wait for 6 frames
|
||||||
|
... // next frame(s)
|
||||||
|
.byte $ff // end of all frames
|
||||||
|
|
||||||
|
## Animation csv
|
||||||
|
|
||||||
|
Since version 1.12 animation.csv support has been added to give more
|
||||||
|
freedom to users wanting to create animation displayers.
|
||||||
|
It is now possible to use a custom frame-delay per frame.
|
||||||
|
|
||||||
|
The csv should contain rows of frame delay value and image, where the
|
||||||
|
delay can be any value from 0 till 255. The highest delay is a little
|
||||||
|
over 5 seconds on PAL systems.
|
||||||
|
If you want longer delays, just copy a row.
|
||||||
|
|
||||||
|
10,frame0.png
|
||||||
|
50,frame1.png
|
||||||
|
10,frame2.png
|
||||||
|
|
||||||
|
Examples can be found here: [Évoluer by The Sarge](https://github.com/staD020/png2prg/blob/master/testdata/evoluer/evoluer.csv) and [Rose by Sander](https://github.com/staD020/png2prg/blob/master/testdata/petscii/anim/rose.csv)
|
||||||
|
|
||||||
|
png2prg -d -o evoluer.prg -sid testdata/evoluer/Evoluer.sid testdata/evoluer/evoluer.csv
|
||||||
|
png2prg -d -o rose.prg testdata/petscii/anim/rose.csv
|
||||||
|
|
||||||
|
## Displayer
|
||||||
|
|
||||||
|
The -d or -display flag will link displayer code infront of the picture.
|
||||||
|
By default it will also crunch the resulting file with Antonio Savona's
|
||||||
|
[TSCrunch](https://github.com/tonysavon/TSCrunch/) with a couple of changes in my own [fork](https://github.com/staD020/TSCrunch/).
|
||||||
|
|
||||||
|
All displayers except for sprites support adding a .sid.
|
||||||
|
Multispeed sids are supported as long as the .sid initializes the CIA timers
|
||||||
|
correctly.
|
||||||
|
|
||||||
|
You can use sids located from $0e00-$1fff or $e000+ in the displayers.
|
||||||
|
More areas may be free depending on graphics type.
|
||||||
|
A memory usage map is shown on error and in -vv (very verbose) mode.
|
||||||
|
|
||||||
|
If needed, you can relocate most sids using lft's [sidreloc](http://www.linusakesson.net/software/sidreloc/index.php).
|
||||||
|
|
||||||
|
Zeropages $08-$0f are used in the animation displayers, while none are used
|
||||||
|
in hires/koala displayers, increasing sid compatibility.
|
||||||
|
|
||||||
|
## Brute Force Mode and Pack Optimization
|
||||||
|
|
||||||
|
By default png2prg 1.8 does a pretty good job at optimizing the resulting prg
|
||||||
|
for crunchers and packers. It is not enough to beat [SPOT 1.3](https://csdb.dk/release/?id=242492).
|
||||||
|
|
||||||
|
The optimization techniques used by png2prg are also responsible for cleaning
|
||||||
|
up the bitmap, making it ideal for animations and color effects.
|
||||||
|
|
||||||
|
### -brute-force (-bf)
|
||||||
|
|
||||||
|
Iterates are over many -bitpair-colors permutations automatically, packs
|
||||||
|
with the built in TSCrunch and selects the shortest.
|
||||||
|
|
||||||
|
./png2prg -bf image.png
|
||||||
|
|
||||||
|
The -brute-force mode can be used in combination with additional flags.
|
||||||
|
|
||||||
|
### -no-bitpair-counters (-nbc)
|
||||||
|
|
||||||
|
Disable counting of bitpairs per color to guess a bitpair for a color.
|
||||||
|
|
||||||
|
./png2prg -bf -nbc image.png
|
||||||
|
|
||||||
|
### -no-prev-char-colors (-npcc)
|
||||||
|
|
||||||
|
Disable lookback to previous char's charcolors to guess a bitpair for a color.
|
||||||
|
|
||||||
|
./png2prg -bf -npcc image.png
|
||||||
|
|
||||||
|
Since TSCrunch is optimized for speed, packing with Dali can give varying
|
||||||
|
results. This is also the reason for not including these options in the
|
||||||
|
brute force permutations automatically.
|
||||||
|
|
||||||
|
## Benchmark
|
||||||
|
|
||||||
|
The [koala otpimizing thread](https://csdb.dk/forums/?roomid=13&topicid=38311&showallposts=1) on csdb has gained some interest in the scene.
|
||||||
|
Since Sparta released [SPOT](https://csdb.dk/release/?id=242492) it has been the best optimizer available.
|
||||||
|
|
||||||
|
Png2prg 1.8 has improved optimization techniques but requires -brute-force
|
||||||
|
mode to beat SPOT 1.3. Manual flags can optimize even better in some cases.
|
||||||
|
|
||||||
|
All koalas are packed with [Dali 0.3.2](https://csdb.dk/release/?id=223584).
|
||||||
|
|
||||||
|
+---------+--------+----------+------------+--------+
|
||||||
|
| spot1.3 | p2p1.8 | p2p1.8bf | p2p1.8best | p2p1.6 |
|
||||||
|
+---------+--------+----------+------------+--------+
|
||||||
|
| 7332 | 7372 | 7332 | 7324 | 7546 | Untitled/Floris
|
||||||
|
| 5136 | 5190 | 5149 | bf | 5464 | Song of the Sunset/Mermaid
|
||||||
|
| 5968 | 5998 | 5963 | bf | 6155 | Short Circuit/Karen Davies
|
||||||
|
| 3618 | 3647 | 3616 | 3589 | 3830 | Portrait L+D/Sander
|
||||||
|
| 5094 | 5080 | 5083 | 5078 | 5320 | Weee/Mermaid
|
||||||
|
| 7497 | 7471 | 7458 | bf | 7612 | Deadlock/Robin Levy
|
||||||
|
| 8068 | 8097 | 8046 | 8038 | 8227 | Room with a view/Veto
|
||||||
|
| 7445 | 7490 | 7432 | bf | 7582 | Vangelis/Talent
|
||||||
|
| 6759 | 6739 | 6737 | bf | 6963 | Temple of Tears/Hend
|
||||||
|
| 7859 | 7848 | 7839 | 7821 | 7998 | Thanos/JonEgg
|
||||||
|
| 4859 | 4849 | 4782 | bf | 4983 | Solar-Sonar/Leon
|
||||||
|
| 5640 | 5671 | 5613 | bf | 5869 | Cisco Heat/Alan Grier
|
||||||
|
| 6243 | 6286 | 6228 | bf | 6430 | Daylight/Sulevi
|
||||||
|
| 2850 | 2884 | 2848 | bf | 3092 | Yie Ar Kung Fu/Steve Wahid
|
||||||
|
| 6727 | 6721 | 6730 | 6711 | 6901 | Lee/The Sarge
|
||||||
|
| 7837 | 7828 | 7798 | bf | 7960 | Parrot/Mirage
|
||||||
|
| 4559 | 4536 | 4494 | bf | 4821 | Dragon's Lair
|
||||||
|
| 4275 | 4324 | 4292 | 4284 | 4519 | Scorpion/SIR'88
|
||||||
|
| 5562 | 5558 | 5506 | bf | 5668 | Hatching/Joe
|
||||||
|
+---------+--------+----------+------------+--------+
|
||||||
|
| 113328 | 113589 | 112946 | 112853 | 116940 | Total
|
||||||
|
+---------+--------+----------+------------+--------+
|
||||||
|
|
||||||
|
- p2p1.8: default png2prg result w/o options
|
||||||
|
- p2p1.8bf: -brute-force mode
|
||||||
|
- p2p1.8best: hand-picked -bitpair-colors, or bruteforced with -npcc and/or -nbc flags
|
||||||
|
- p2p1.6: default png2prg 1.6 result w/o options
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
This release contains examples with all assets included for you to test with.
|
||||||
|
Also included are the assets of [Évoluer](https://csdb.dk/release/?id=220170) by The Sarge and Flotsam.
|
||||||
|
A larger set of testdata can be found in the [github repo](https://github.com/staD020/png2prg/tree/master/testdata).
|
||||||
|
|
||||||
|
## Install from source
|
||||||
|
|
||||||
|
Png2prg was built on Linux, building on Mac should work out of the box.
|
||||||
|
For Windows, try out Windows Subsystem Linux (WSL), works pretty well.
|
||||||
|
However, natively building on Windows should be easy enough, look at
|
||||||
|
Compiling without Make below.
|
||||||
|
|
||||||
|
The compiled displayer prgs are included in the repo to ease building
|
||||||
|
and importing png2prg as a library. Java is only required to build
|
||||||
|
the displayers with KickAssembler (included in the repo).
|
||||||
|
|
||||||
|
But first [install Go 1.20 or higher](https://go.dev/dl/).
|
||||||
|
|
||||||
|
### Simple install
|
||||||
|
|
||||||
|
go install -v github.com/staD020/png2prg@master
|
||||||
|
|
||||||
|
### Compiling with Make (recommended)
|
||||||
|
|
||||||
|
git clone https://github.com/staD020/png2prg.git
|
||||||
|
cd png2prg
|
||||||
|
make -j
|
||||||
|
|
||||||
|
Build for all common targets:
|
||||||
|
|
||||||
|
make all -j
|
||||||
|
|
||||||
|
### Compiling without Make
|
||||||
|
|
||||||
|
go build ./cmd/png2prg
|
||||||
|
|
||||||
|
## Install and use as library
|
||||||
|
|
||||||
|
In your Go project's path, go get the library:
|
||||||
|
|
||||||
|
go get github.com/staD020/png2prg
|
||||||
|
|
||||||
|
In essence png2prg implements the [io.WriterTo](https://pkg.go.dev/io#WriterTo) interface.
|
||||||
|
Typical usage could look like below. A more complex example can be found
|
||||||
|
in the [source](https://github.com/staD020/png2prg/blob/master/cmd/png2prg/main.go) of the cli tool.
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"github.com/staD020/png2prg"
|
||||||
|
)
|
||||||
|
|
||||||
|
func convertPNG(w io.Writer, png io.Reader) (int64, error) {
|
||||||
|
p, err := png2prg.New(png2prg.Options{}, png)
|
||||||
|
if err != nil {
|
||||||
|
return 0, fmt.Errorf("png2prg.New failed: %w", err)
|
||||||
|
}
|
||||||
|
return p.WriteTo(w)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Changes for version 1.12
|
||||||
|
|
||||||
|
- Bugfix: Fix regression with handling mixedcharsets that was increasing
|
||||||
|
char usage count in some cases (thanks Shine).
|
||||||
|
- Feature: Press CBM key in petscii (animation) displayers to switch
|
||||||
|
charset case.
|
||||||
|
- Feature: Add -brute-force support to all charset modes.
|
||||||
|
- Feature: Improve ECM handling by searching for invertable characters to
|
||||||
|
reduce char usage.
|
||||||
|
- Feature: Add animation.csv support to allow for custom delays per frame.
|
||||||
|
- Feature: Add -no-loop support for animations (thanks jab).
|
||||||
|
- Feature: Add -no-fade support to other displayers (thanks Shine).
|
||||||
|
- Feature: Disable repeating color optimization for koala & hires anims.
|
||||||
|
This reduces animation size & runtime processing at the cost of initial
|
||||||
|
image optimization.
|
||||||
|
- Feature: Allow sids to use all memory below $0400 (thanks kbs).
|
||||||
|
- Feature: VSCode Docker build support for a devcontainer was added by
|
||||||
|
Trident (thanks!).
|
||||||
|
- Experimental: Add secondary+tertiary preferred bitpair colors with -bpc2
|
||||||
|
and -bpc3 (thanks Fungus).
|
||||||
|
|
||||||
|
## Changes for version 1.10.1
|
||||||
|
|
||||||
|
- Play NTSC .sid tunes at the right speed (thanks Acrouzet).
|
||||||
|
- Bugfix: palette detection must detect all hires colors, also on odd pixels.
|
||||||
|
- Bugfix: dont look at border area to determine hires pixels.
|
||||||
|
- Bugfix: fix -frame-delay for charset anim displayers.
|
||||||
|
|
||||||
|
## Changes for version 1.10
|
||||||
|
|
||||||
|
- Add gfxmode to .sym files and display in terminal output (thanks Spider-J).
|
||||||
|
- Add petscii animation support.
|
||||||
|
- Add background and bordercolor to each petscii or sccharset animation frame.
|
||||||
|
- Add -no-anim flag disable sc/mccharset animations and store frames as separate
|
||||||
|
screens.
|
||||||
|
- Add -no-fade flag for koala, hires, petscii and sccharset animation
|
||||||
|
displayers, this frees up a lot of RAM for animation data and sid.
|
||||||
|
- Code refactor, standardizing color and bitpair code, separated palettes in
|
||||||
|
palettes.yaml and more.
|
||||||
|
- Bugfix: repair -force-border-color.
|
||||||
|
- Bugfix: handle blank ECM images as well as ECM images using few bg colors
|
||||||
|
(thanks Brush).
|
||||||
|
- Typofix: fix simple install docs (thanks IcePic).
|
||||||
|
- Added another weird palette (thanks Fungus).
|
||||||
|
|
||||||
|
## Changes for version 1.8
|
||||||
|
|
||||||
|
- Improve crunchiness by re-using the previous char's bitpair-colors.
|
||||||
|
- Add -no-prev-char-colors flag to disable re-use of the previous char's
|
||||||
|
bitpair-colors, in some cases this optimization causes worse pack results.
|
||||||
|
- Add -brute-force mode to find bitpair color combinations with better
|
||||||
|
crunchiness. Burns some CPU for a couple seconds.
|
||||||
|
- Add -no-bitpair-counters flag to disable using bitpair counters per color
|
||||||
|
for color guessing.
|
||||||
|
- Added multi-frame support for mccharset, where all frames use the same
|
||||||
|
charset.
|
||||||
|
- Add support for any centered fullscreen image resolution bigger than
|
||||||
|
320x200 and other than 384x272.
|
||||||
|
- Add support for Marq's PETSCII tool .png resolution 352x232 (thanks jab).
|
||||||
|
- Bugfix: docs fixes related to installation from source (thanks jab).
|
||||||
|
- Bugfix: hide findECMColors log behind -verbose mode (thanks jab).
|
||||||
|
- Docs fix: add a bit more info for sprites (thanks fungus).
|
||||||
|
|
||||||
|
## Changes for version 1.6
|
||||||
|
|
||||||
|
- Added -mode mixedcharset for mixed multicolor/singlecolor and
|
||||||
|
individual d800 colors per char.
|
||||||
|
- Modified -mode sccharset to use individual d800 colors per char.
|
||||||
|
- Added -mode petscii.
|
||||||
|
- Added -mode ecm.
|
||||||
|
- Added -no-pack-empty to skip packing empty chars to filled chars to re-use
|
||||||
|
for different colors. Only for mixed and ecm charsets.
|
||||||
|
- Added -force-pack-empty for singlecolor and multicolor charset, may save
|
||||||
|
a char, but usually pack-ratio is worse due to increased d800 color usage.
|
||||||
|
- Improved auto-detection of graphics modes, including various charset modes.
|
||||||
|
- Added sid support to charset displayers.
|
||||||
|
- Added fullscreen fade in/out to charset displayers.
|
||||||
|
- Bug Fix: -force-border-color for singlecolor charset (thanks Raistlin).
|
||||||
|
- Bug Fix: do not write empty .prg file on error.
|
||||||
|
- Standardized d02x colors in output.prg for charset modes.
|
||||||
|
|
||||||
|
## Changes for version 1.4
|
||||||
|
|
||||||
|
- Support for even more far-out palette ranges (thanks Perplex).
|
||||||
|
- Now throws an error if the palette can't be detected properly, this should
|
||||||
|
never happen. Please let me know if you run into this error.
|
||||||
|
- Separated library and cli tool.
|
||||||
|
- Library supports the standard [io.Reader](https://pkg.go.dev/io#Reader) and [io.Writer](https://pkg.go.dev/io#Writer) interfaces.
|
||||||
|
- Patched [TSCrunch](https://github.com/staD020/TSCrunch/) further to increase crunch speed and use less memory.
|
||||||
|
- Added -parallel and -worker flags to treat each input file as standalone
|
||||||
|
and convert all files in parallel. Gifs with multiple frames are still
|
||||||
|
treated as animations.
|
||||||
|
- Stop relying on .gif filename extension, detect it.
|
||||||
|
- Add -alt-offset flag to force screenshot offset 32, 36), used by a few
|
||||||
|
graphicians. Though, please switch to the correct 32, 35.
|
||||||
|
- Add -symbols flag to write symbols to a .sym file.
|
||||||
|
- Interlace support for mcibitmap (drazlace and truepaint).
|
||||||
|
- Bugfix: allow blank images input (thanks Spider-J).
|
||||||
|
- Allow colors not present in the image as -bitpair-colors (thanks Map).
|
||||||
|
|
||||||
|
## Changes for version 1.2
|
||||||
|
|
||||||
|
- Added displayer for koala animations.
|
||||||
|
- Added displayer for hires animations.
|
||||||
|
- Added -frame-delay flag for animation displayers.
|
||||||
|
- Added -wait-seconds flag for animation displayers.
|
||||||
|
- Fixed bug in koala/hires displayers not allowing sids to overlap $c000-$c7ff.
|
||||||
|
- Expanding wildcards: using pic??.png or pic*.png now also works on Windows.
|
||||||
|
- Set bank via $dd00 in displayers.
|
||||||
|
|
||||||
|
## Changes for version 1.0
|
||||||
|
|
||||||
|
- Added fullscreen fade in/out to koala and hires displayers.
|
||||||
|
- Added optional .sid support for koala and hires displayers.
|
||||||
|
- Added optional crunching for all displayers using TSCrunch.
|
||||||
|
|
||||||
|
## Credits
|
||||||
|
|
||||||
|
Png2prg was created by Burglar, using the following third-party libraries:
|
||||||
|
|
||||||
|
[TSCrunch 1.3](https://github.com/tonysavon/TSCrunch/) by Antonio Savona for optional crunching when exporting
|
||||||
|
an image with a displayer.
|
||||||
|
|
||||||
|
[Colfade Doc](https://csdb.dk/release/?id=132276) by Veto for the color fade tables used in the displayers.
|
||||||
|
|
||||||
|
[Kick Assembler](http://www.theweb.dk/KickAssembler/) by Slammer to compile the displayers.
|
||||||
|
|
||||||
|
[Go](https://go.dev/) by The Go Authors is the programming language used to create png2prg.
|
||||||
|
|
||||||
|
### Thanks to
|
||||||
|
|
||||||
|
Apollyon, Spider-J, Brush, The Sarge, Fungus, Jab, Shine, Raistlin, Perplex,
|
||||||
|
Map, Youth, IcePic, Sander, Guinea Pig, Krill, Christopher Jam, Sparta,
|
||||||
|
Acrouzet, Trident, Worrior1 and Antonio Savona.
|
||||||
|
|
||||||
|
## Options
|
||||||
|
|
||||||
|
```
|
||||||
|
-alt-offset
|
||||||
|
use alternate screenshot offset with x,y = 32,36
|
||||||
|
-ao
|
||||||
|
alt-offset
|
||||||
|
-bf
|
||||||
|
brute-force
|
||||||
|
-bitpair-colors string
|
||||||
|
prefer these colors in 2bit space, eg 0,6,14,3
|
||||||
|
-bpc string
|
||||||
|
bitpair-colors
|
||||||
|
-bpc2 string
|
||||||
|
secondary bitpair colors eg 0,2,10,7
|
||||||
|
-bpc3 string
|
||||||
|
tertiary bitpair colors eg 0,11,12,15
|
||||||
|
-brute-force
|
||||||
|
brute force bitpair-colors
|
||||||
|
-cpuprofile file
|
||||||
|
write cpu profile to file
|
||||||
|
-d display
|
||||||
|
-d016 int
|
||||||
|
d016offset (default 1)
|
||||||
|
-d016offset int
|
||||||
|
number of pixels to shift with d016 when using interlace (default 1)
|
||||||
|
-display
|
||||||
|
include displayer
|
||||||
|
-force-border-color int
|
||||||
|
force border color (default -1)
|
||||||
|
-force-pack-empty
|
||||||
|
optimize packing empty chars (only for sccharset)
|
||||||
|
-fpe
|
||||||
|
force-pack-empty
|
||||||
|
-frame-delay int
|
||||||
|
frames to wait before displaying next animation frame (default 6)
|
||||||
|
-h help
|
||||||
|
-help
|
||||||
|
help
|
||||||
|
-i interlace
|
||||||
|
-interlace
|
||||||
|
when you supply 2 frames, specify -interlace to treat the images as such
|
||||||
|
-m string
|
||||||
|
mode
|
||||||
|
-memprofile file
|
||||||
|
write memory profile to file (only in -parallel mode)
|
||||||
|
-mode string
|
||||||
|
force graphics mode to koala, hires, mixedcharset, sccharset, mccharset (4col), scsprites or mcsprites
|
||||||
|
-na
|
||||||
|
no-anim
|
||||||
|
-nbc
|
||||||
|
no-bitpair-counters
|
||||||
|
-nc
|
||||||
|
no-crunch
|
||||||
|
-nf
|
||||||
|
no-fade
|
||||||
|
-ng
|
||||||
|
no-guess
|
||||||
|
-nl
|
||||||
|
no-loop
|
||||||
|
-no-anim
|
||||||
|
disable charset animations and store frames as separate screens
|
||||||
|
-no-bitpair-counters
|
||||||
|
do not use c64color bitpar counters optimization
|
||||||
|
-no-crunch
|
||||||
|
do not TSCrunch displayer
|
||||||
|
-no-fade
|
||||||
|
do not use fade in/out and free up a lot of memory
|
||||||
|
-no-guess
|
||||||
|
do not guess preferred bitpair-colors
|
||||||
|
-no-loop
|
||||||
|
play animations only once
|
||||||
|
-no-pack
|
||||||
|
do not pack chars (only for sc/mc charset)
|
||||||
|
-no-pack-empty
|
||||||
|
do not optimize packing empty chars (only for mc/mixed/ecm charset)
|
||||||
|
-no-prev-char-colors
|
||||||
|
do not look at the previous char's bitpair-colors, in some cases this optimization causes worse pack results
|
||||||
|
-np
|
||||||
|
no-pack
|
||||||
|
-npcc
|
||||||
|
no-prev-char-colors
|
||||||
|
-npe
|
||||||
|
no-pack-empty
|
||||||
|
-o string
|
||||||
|
out
|
||||||
|
-out string
|
||||||
|
specify outfile.prg, by default it changes extension to .prg
|
||||||
|
-p parallel
|
||||||
|
-parallel
|
||||||
|
run number of workers in parallel for fast conversion, treat each image as a standalone, not to be used for animations, unless an anim.csv is used
|
||||||
|
-q quiet
|
||||||
|
-quiet
|
||||||
|
quiet, only display errors
|
||||||
|
-sid string
|
||||||
|
include .sid in displayer (see -help for free memory locations)
|
||||||
|
-sym
|
||||||
|
symbols
|
||||||
|
-symbols
|
||||||
|
export symbols to .sym
|
||||||
|
-targetdir string
|
||||||
|
specify targetdir
|
||||||
|
-td string
|
||||||
|
targetdir
|
||||||
|
-trd
|
||||||
|
has side effect of enforcing screenram bitpair colors in level area
|
||||||
|
-v verbose
|
||||||
|
-verbose
|
||||||
|
verbose output
|
||||||
|
-vv
|
||||||
|
very verbose, show memory usage map in most cases and implies -verbose
|
||||||
|
-w int
|
||||||
|
workers (default 12)
|
||||||
|
-wait-seconds int
|
||||||
|
seconds to wait before animation starts
|
||||||
|
-workers int
|
||||||
|
number of concurrent workers in -parallel or -brute-force mode (default 12)
|
||||||
|
```
|
||||||
|
|
||||||
BIN
loader/samples/minexample/png2prg 2/title_ifli.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
loader/samples/minexample/png2prg 2/title_ifli_i1.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
loader/samples/minexample/png2prg 2/title_ifli_i1_2x.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
loader/samples/minexample/png2prg 2/title_ifli_i2.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
loader/samples/minexample/png2prg 2/title_ifli_i2_2x.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
29
loader/samples/minexample/png2prg 2/ys2.csv
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
|
||||||
|
5,ys2/01_badguyz/koala/png/01.png
|
||||||
|
5,ys2/01_badguyz/koala/png/02.png
|
||||||
|
5,ys2/01_badguyz/koala/png/03.png
|
||||||
|
5,ys2/01_badguyz/koala/png/04.png
|
||||||
|
5,ys2/01_badguyz/koala/png/05.png
|
||||||
|
50,ys2/01_badguyz/koala/png/06.png
|
||||||
|
15,ys2/01_badguyz/koala/png/07.png
|
||||||
|
15,ys2/01_badguyz/koala/png/08.png
|
||||||
|
15,ys2/01_badguyz/koala/png/09.png
|
||||||
|
15,ys2/01_badguyz/koala/png/10.png
|
||||||
|
15,ys2/01_badguyz/koala/png/11.png
|
||||||
|
100,ys2/01_badguyz/koala/png/12.png
|
||||||
|
15,ys2/01_badguyz/koala/png/10.png
|
||||||
|
15,ys2/01_badguyz/koala/png/09.png
|
||||||
|
15,ys2/01_badguyz/koala/png/08.png
|
||||||
|
15,ys2/01_badguyz/koala/png/07.png
|
||||||
|
100,ys2/01_badguyz/koala/png/06.png
|
||||||
|
5,ys2/01_badguyz/koala/png/13.png
|
||||||
|
5,ys2/01_badguyz/koala/png/14.png
|
||||||
|
5,ys2/01_badguyz/koala/png/15.png
|
||||||
|
5,ys2/01_badguyz/koala/png/16.png
|
||||||
|
5,ys2/01_badguyz/koala/png/17.png
|
||||||
|
5,ys2/01_badguyz/koala/png/18.png
|
||||||
|
5,ys2/01_badguyz/koala/png/19.png
|
||||||
|
100,ys2/01_badguyz/koala/png/00.png
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
BIN
loader/samples/minexample/png2prg 2/ys2.prg
Normal file
BIN
loader/samples/minexample/png2prg 2/ys2/01_badguyz/00.bmp
Normal file
|
After Width: | Height: | Size: 175 KiB |
BIN
loader/samples/minexample/png2prg 2/ys2/01_badguyz/01.bmp
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
loader/samples/minexample/png2prg 2/ys2/01_badguyz/02.bmp
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
loader/samples/minexample/png2prg 2/ys2/01_badguyz/03.bmp
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
loader/samples/minexample/png2prg 2/ys2/01_badguyz/04.bmp
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
loader/samples/minexample/png2prg 2/ys2/01_badguyz/05.bmp
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
loader/samples/minexample/png2prg 2/ys2/01_badguyz/06.bmp
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
loader/samples/minexample/png2prg 2/ys2/01_badguyz/07.bmp
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
loader/samples/minexample/png2prg 2/ys2/01_badguyz/08.bmp
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
loader/samples/minexample/png2prg 2/ys2/01_badguyz/09.bmp
Normal file
|
After Width: | Height: | Size: 29 KiB |