init files

This commit is contained in:
AArt1256 2025-11-13 19:07:39 +03:00
commit 8197a022bd
1409 changed files with 139317 additions and 0 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
.DS_Store

2
README.md Normal file
View file

@ -0,0 +1,2 @@
actual code is in `loader/samples/minexample`
Uses Krill's loader

753
loader/Makefile Executable file
View 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
View 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.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View 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;
}

Binary file not shown.

View 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):

Binary file not shown.

BIN
loader/build/loader-c64.prg Normal file

Binary file not shown.

View 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

View 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

View 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

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

27
loader/docs/Prerequisites.txt Executable file
View 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
View 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
View 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
View 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_

View 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)

View file

@ -0,0 +1,2 @@
watch store d7fe
command 1 "log on;m fd ff;log off;x"

View file

@ -0,0 +1,2 @@
watch store d7fe
command 1 "log on;m 0428 0428;m 0429 0438;log off;x"

View 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

View 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

View 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

View 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

View 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

View 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__;
}

View 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)

View 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);
}

View 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

View 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

View 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

View 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

View 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

View 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()

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View 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" "$@"

View file

@ -0,0 +1,3 @@
zx02/zx02 badguys_new.bin badguy.zx0
printf "\x00\xe0" > badguy.zx0.prg
cat badguy.zx0 >> badguy.zx0.prg

Binary file not shown.

View 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

View 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)

Binary file not shown.

View 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

Binary file not shown.

View 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
1 100 ys2/01_badguyz/koala/png/00.png
2 3 ys2/01_badguyz/koala/png/01.png
3 3 ys2/01_badguyz/koala/png/02.png
4 3 ys2/01_badguyz/koala/png/03.png
5 3 ys2/01_badguyz/koala/png/04.png
6 3 ys2/01_badguyz/koala/png/05.png
7 50 ys2/01_badguyz/koala/png/06.png
8 15 ys2/01_badguyz/koala/png/07.png
9 15 ys2/01_badguyz/koala/png/08.png
10 15 ys2/01_badguyz/koala/png/09.png
11 15 ys2/01_badguyz/koala/png/10.png
12 15 ys2/01_badguyz/koala/png/11.png
13 100 ys2/01_badguyz/koala/png/12.png
14 15 ys2/01_badguyz/koala/png/10.png
15 15 ys2/01_badguyz/koala/png/09.png
16 15 ys2/01_badguyz/koala/png/08.png
17 15 ys2/01_badguyz/koala/png/07.png
18 100 ys2/01_badguyz/koala/png/06.png
19 3 ys2/01_badguyz/koala/png/13.png
20 3 ys2/01_badguyz/koala/png/14.png
21 3 ys2/01_badguyz/koala/png/15.png
22 3 ys2/01_badguyz/koala/png/16.png
23 3 ys2/01_badguyz/koala/png/17.png
24 3 ys2/01_badguyz/koala/png/18.png
25 3 ys2/01_badguyz/koala/png/19.png
26 100 ys2/01_badguyz/koala/png/00.png

View 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
1 100 ys2/03_tower/koala/png/01.png
2 3 ys2/03_tower/koala/png/02.png
3 3 ys2/03_tower/koala/png/03.png
4 3 ys2/03_tower/koala/png/04.png
5 3 ys2/03_tower/koala/png/05.png
6 3 ys2/03_tower/koala/png/06.png
7 3 ys2/03_tower/koala/png/03.png
8 50 ys2/03_tower/koala/png/01.png
9 10 ys2/03_tower/koala/png/07.png
10 10 ys2/03_tower/koala/png/08.png
11 10 ys2/03_tower/koala/png/09.png
12 10 ys2/03_tower/koala/png/10.png
13 10 ys2/03_tower/koala/png/11.png
14 10 ys2/03_tower/koala/png/12.png
15 10 ys2/03_tower/koala/png/13.png
16 10 ys2/03_tower/koala/png/14.png
17 150 ys2/03_tower/koala/png/15.png

Binary file not shown.

View 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
1 50 ys2/04_tower_beam/koala/png/01.png
2 5 ys2/04_tower_beam/koala/png/02.png
3 5 ys2/04_tower_beam/koala/png/03.png
4 3 ys2/04_tower_beam/koala/png/04.png
5 3 ys2/04_tower_beam/koala/png/05.png
6 3 ys2/04_tower_beam/koala/png/06.png
7 3 ys2/04_tower_beam/koala/png/07.png
8 3 ys2/04_tower_beam/koala/png/08.png
9 3 ys2/04_tower_beam/koala/png/09.png
10 3 ys2/04_tower_beam/koala/png/10.png
11 3 ys2/04_tower_beam/koala/png/11.png
12 3 ys2/04_tower_beam/koala/png/12.png
13 3 ys2/04_tower_beam/koala/png/13.png
14 3 ys2/04_tower_beam/koala/png/11.png
15 3 ys2/04_tower_beam/koala/png/12.png
16 3 ys2/04_tower_beam/koala/png/13.png
17 3 ys2/04_tower_beam/koala/png/11.png
18 3 ys2/04_tower_beam/koala/png/12.png
19 3 ys2/04_tower_beam/koala/png/13.png
20 3 ys2/04_tower_beam/koala/png/11.png
21 3 ys2/04_tower_beam/koala/png/12.png
22 3 ys2/04_tower_beam/koala/png/13.png
23 3 ys2/04_tower_beam/koala/png/11.png
24 3 ys2/04_tower_beam/koala/png/12.png
25 3 ys2/04_tower_beam/koala/png/13.png
26 3 ys2/04_tower_beam/koala/png/11.png
27 3 ys2/04_tower_beam/koala/png/12.png
28 3 ys2/04_tower_beam/koala/png/13.png
29 3 ys2/04_tower_beam/koala/png/11.png
30 3 ys2/04_tower_beam/koala/png/12.png
31 3 ys2/04_tower_beam/koala/png/13.png

Binary file not shown.

View 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
1 3 ys2/05_field/koala/png/01.png
2 3 ys2/05_field/koala/png/02.png
3 3 ys2/05_field/koala/png/03.png
4 3 ys2/05_field/koala/png/04.png
5 3 ys2/05_field/koala/png/05.png
6 3 ys2/05_field/koala/png/06.png
7 3 ys2/05_field/koala/png/07.png
8 3 ys2/05_field/koala/png/08.png
9 3 ys2/05_field/koala/png/01.png
10 3 ys2/05_field/koala/png/02.png
11 3 ys2/05_field/koala/png/03.png
12 3 ys2/05_field/koala/png/04.png
13 3 ys2/05_field/koala/png/05.png
14 3 ys2/05_field/koala/png/06.png
15 3 ys2/05_field/koala/png/07.png
16 3 ys2/05_field/koala/png/08.png
17 3 ys2/05_field/koala/png/01.png
18 3 ys2/05_field/koala/png/02.png
19 3 ys2/05_field/koala/png/03.png
20 3 ys2/05_field/koala/png/04.png
21 3 ys2/05_field/koala/png/05.png
22 3 ys2/05_field/koala/png/06.png
23 3 ys2/05_field/koala/png/07.png
24 3 ys2/05_field/koala/png/08.png
25 3 ys2/05_field/koala/png/01.png
26 3 ys2/05_field/koala/png/02.png
27 3 ys2/05_field/koala/png/03.png
28 3 ys2/05_field/koala/png/04.png
29 3 ys2/05_field/koala/png/05.png
30 3 ys2/05_field/koala/png/06.png
31 3 ys2/05_field/koala/png/07.png
32 3 ys2/05_field/koala/png/08.png
33 3 ys2/05_field/koala/png/01.png
34 3 ys2/05_field/koala/png/02.png
35 3 ys2/05_field/koala/png/03.png
36 3 ys2/05_field/koala/png/04.png
37 3 ys2/05_field/koala/png/05.png
38 3 ys2/05_field/koala/png/06.png
39 3 ys2/05_field/koala/png/07.png
40 3 ys2/05_field/koala/png/08.png
41 3 ys2/05_field/koala/png/09.png
42 3 ys2/05_field/koala/png/10.png
43 3 ys2/05_field/koala/png/11.png
44 3 ys2/05_field/koala/png/12.png
45 3 ys2/05_field/koala/png/13.png
46 3 ys2/05_field/koala/png/14.png
47 3 ys2/05_field/koala/png/15.png
48 3 ys2/05_field/koala/png/16.png
49 3 ys2/05_field/koala/png/17.png
50 3 ys2/05_field/koala/png/18.png
51 3 ys2/05_field/koala/png/19.png
52 3 ys2/05_field/koala/png/20.png
53 3 ys2/05_field/koala/png/21.png
54 3 ys2/05_field/koala/png/22.png
55 3 ys2/05_field/koala/png/23.png
56 3 ys2/05_field/koala/png/24.png
57 3 ys2/05_field/koala/png/25.png
58 3 ys2/05_field/koala/png/26.png
59 3 ys2/05_field/koala/png/27.png
60 3 ys2/05_field/koala/png/28.png
61 3 ys2/05_field/koala/png/29.png
62 3 ys2/05_field/koala/png/30.png

Binary file not shown.

View 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
1 50 ys2/06_falling_star/koala/png/01.png
2 5 ys2/06_falling_star/koala/png/02.png
3 5 ys2/06_falling_star/koala/png/03.png
4 5 ys2/06_falling_star/koala/png/04.png
5 5 ys2/06_falling_star/koala/png/05.png
6 5 ys2/06_falling_star/koala/png/06.png
7 5 ys2/06_falling_star/koala/png/07.png
8 5 ys2/06_falling_star/koala/png/08.png
9 5 ys2/06_falling_star/koala/png/09.png
10 5 ys2/06_falling_star/koala/png/10.png
11 5 ys2/06_falling_star/koala/png/11.png
12 5 ys2/06_falling_star/koala/png/12.png
13 5 ys2/06_falling_star/koala/png/13.png
14 5 ys2/06_falling_star/koala/png/14.png
15 5 ys2/06_falling_star/koala/png/15.png
16 5 ys2/06_falling_star/koala/png/16.png
17 5 ys2/06_falling_star/koala/png/17.png
18 5 ys2/06_falling_star/koala/png/18.png
19 5 ys2/06_falling_star/koala/png/19.png
20 5 ys2/06_falling_star/koala/png/18.png
21 5 ys2/06_falling_star/koala/png/19.png
22 5 ys2/06_falling_star/koala/png/18.png
23 5 ys2/06_falling_star/koala/png/19.png
24 5 ys2/06_falling_star/koala/png/18.png
25 5 ys2/06_falling_star/koala/png/19.png
26 5 ys2/06_falling_star/koala/png/18.png
27 5 ys2/06_falling_star/koala/png/19.png
28 5 ys2/06_falling_star/koala/png/18.png
29 5 ys2/06_falling_star/koala/png/19.png
30 5 ys2/06_falling_star/koala/png/18.png
31 5 ys2/06_falling_star/koala/png/19.png

Binary file not shown.

Binary file not shown.

View 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
1 7 ys2/11_lilia_final/koala/png/01.png
2 7 ys2/11_lilia_final/koala/png/02.png
3 7 ys2/11_lilia_final/koala/png/03.png
4 7 ys2/11_lilia_final/koala/png/02.png
5 7 ys2/11_lilia_final/koala/png/01.png
6 7 ys2/11_lilia_final/koala/png/02.png
7 7 ys2/11_lilia_final/koala/png/03.png
8 7 ys2/11_lilia_final/koala/png/02.png
9 7 ys2/11_lilia_final/koala/png/01.png
10 7 ys2/11_lilia_final/koala/png/02.png
11 7 ys2/11_lilia_final/koala/png/03.png
12 7 ys2/11_lilia_final/koala/png/02.png
13 7 ys2/11_lilia_final/koala/png/01.png
14 7 ys2/11_lilia_final/koala/png/02.png
15 7 ys2/11_lilia_final/koala/png/03.png
16 7 ys2/11_lilia_final/koala/png/02.png
17 50 ys2/11_lilia_final/koala/png/01.png
18 20 ys2/11_lilia_final/koala/png/04.png
19 3 ys2/11_lilia_final/koala/png/05.png
20 3 ys2/11_lilia_final/koala/png/06.png
21 3 ys2/11_lilia_final/koala/png/07.png
22 3 ys2/11_lilia_final/koala/png/06.png
23 3 ys2/11_lilia_final/koala/png/05.png
24 3 ys2/11_lilia_final/koala/png/04.png
25 7 ys2/11_lilia_final/koala/png/01.png
26 7 ys2/11_lilia_final/koala/png/02.png
27 7 ys2/11_lilia_final/koala/png/03.png
28 7 ys2/11_lilia_final/koala/png/02.png
29 7 ys2/11_lilia_final/koala/png/01.png
30 7 ys2/11_lilia_final/koala/png/02.png
31 7 ys2/11_lilia_final/koala/png/03.png
32 7 ys2/11_lilia_final/koala/png/02.png
33 7 ys2/11_lilia_final/koala/png/01.png
34 7 ys2/11_lilia_final/koala/png/02.png
35 7 ys2/11_lilia_final/koala/png/03.png
36 7 ys2/11_lilia_final/koala/png/02.png
37 3 ys2/11_lilia_final/koala/png/08.png
38 3 ys2/11_lilia_final/koala/png/09.png
39 3 ys2/11_lilia_final/koala/png/10.png
40 3 ys2/11_lilia_final/koala/png/11.png
41 3 ys2/11_lilia_final/koala/png/10.png
42 3 ys2/11_lilia_final/koala/png/09.png
43 3 ys2/11_lilia_final/koala/png/08.png
44 7 ys2/11_lilia_final/koala/png/01.png
45 7 ys2/11_lilia_final/koala/png/02.png
46 7 ys2/11_lilia_final/koala/png/03.png
47 7 ys2/11_lilia_final/koala/png/02.png
48 7 ys2/11_lilia_final/koala/png/01.png
49 7 ys2/11_lilia_final/koala/png/02.png
50 7 ys2/11_lilia_final/koala/png/03.png
51 7 ys2/11_lilia_final/koala/png/02.png
52 7 ys2/11_lilia_final/koala/png/01.png
53 7 ys2/11_lilia_final/koala/png/02.png
54 7 ys2/11_lilia_final/koala/png/03.png
55 7 ys2/11_lilia_final/koala/png/02.png
56 50 ys2/11_lilia_final/koala/png/01.png
57 3 ys2/11_lilia_final/koala/png/12.png
58 3 ys2/11_lilia_final/koala/png/13.png
59 3 ys2/11_lilia_final/koala/png/14.png
60 3 ys2/11_lilia_final/koala/png/15.png
61 200 ys2/11_lilia_final/koala/png/16.png

Binary file not shown.

Binary file not shown.

View 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
1 50 ys2/07_lilia/lilia1.png
2 4 ys2/07_lilia/lilia2.png
3 4 ys2/07_lilia/lilia3.png
4 4 ys2/07_lilia/lilia4.png
5 4 ys2/07_lilia/lilia5.png
6 4 ys2/07_lilia/lilia6.png
7 4 ys2/07_lilia/lilia7.png
8 4 ys2/07_lilia/lilia8.png
9 150 ys2/07_lilia/lilia9.png

Binary file not shown.

Binary file not shown.

View 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)
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View 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
1 5 ys2/01_badguyz/koala/png/01.png
2 5 ys2/01_badguyz/koala/png/02.png
3 5 ys2/01_badguyz/koala/png/03.png
4 5 ys2/01_badguyz/koala/png/04.png
5 5 ys2/01_badguyz/koala/png/05.png
6 50 ys2/01_badguyz/koala/png/06.png
7 15 ys2/01_badguyz/koala/png/07.png
8 15 ys2/01_badguyz/koala/png/08.png
9 15 ys2/01_badguyz/koala/png/09.png
10 15 ys2/01_badguyz/koala/png/10.png
11 15 ys2/01_badguyz/koala/png/11.png
12 100 ys2/01_badguyz/koala/png/12.png
13 15 ys2/01_badguyz/koala/png/10.png
14 15 ys2/01_badguyz/koala/png/09.png
15 15 ys2/01_badguyz/koala/png/08.png
16 15 ys2/01_badguyz/koala/png/07.png
17 100 ys2/01_badguyz/koala/png/06.png
18 5 ys2/01_badguyz/koala/png/13.png
19 5 ys2/01_badguyz/koala/png/14.png
20 5 ys2/01_badguyz/koala/png/15.png
21 5 ys2/01_badguyz/koala/png/16.png
22 5 ys2/01_badguyz/koala/png/17.png
23 5 ys2/01_badguyz/koala/png/18.png
24 5 ys2/01_badguyz/koala/png/19.png
25 100 ys2/01_badguyz/koala/png/00.png

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Some files were not shown because too many files have changed in this diff Show more