xref: /freebsd/contrib/file/magic/Magdir/c64 (revision abcdc1b9)
1
2#------------------------------------------------------------------------------
3# $File: c64,v 1.14 2023/06/16 19:24:06 christos Exp $
4# c64:  file(1) magic for various commodore 64 related files
5#
6# From: Dirk Jagdmann <doj@cubic.org>
7
80x16500	belong		0x12014100	D64 Image
90x16500	belong		0x12014180	D71 Image
100x61800 belong		0x28034400	D81 Image
110	belong		0x43154164	X64 Image
12
13# C64 (and other CBM) cartridges
14# Extended by David Korth <gerbilsoft@gerbilsoft.com>
15# Reference: https://vice-emu.sourceforge.io/vice_17.html#SEC391
16
170	string		C64\40CARTRIDGE	Commodore 64 cartridge
18>0x20	ubyte	0	\b,
19>0x20	ubyte	!0
20>>0x20	string/T	x	\b: "%.32s",
21>0x16	beshort	0
22>>0x18	beshort	0x0000	16 KB game
23>>0x18	beshort	0x0001	8 KB game
24>>0x18	beshort	0x0100	UltiMax mode
25>>0x18	beshort	0x0101	RAM/disabled
26>0x16	beshort	1	Action Replay
27>0x16	beshort	2	KCS Power Cartridge
28>0x16	beshort	3	Final Cartridge III
29>0x16	beshort	4	Simons' BASIC
30>0x16	beshort	5	Ocean type 1
31>0x16	beshort	6	Expert Cartridge
32>0x16	beshort	7	Fun Play, Power Play
33>0x16	beshort	8	Super Games
34>0x16	beshort	9	Atomic Power
35>0x16	beshort	10	Epyx Fastload
36>0x16	beshort	11	Westermann Learning
37>0x16	beshort	12	Rex Utility
38>0x16	beshort	13	Final Cartridge I
39>0x16	beshort	14	Magic Formel
40>0x16	beshort	15	C64 Game System, System 3
41>0x16	beshort	16	Warp Speed
42>0x16	beshort	17	Dinamic
43>0x16	beshort	18	Zaxxon / Super Zaxxon (Sega)
44>0x16	beshort	19	Magic Desk, Domark, HES Australia
45>0x16	beshort	20	Super Snapshot V5
46>0x16	beshort	21	Comal-80
47>0x16	beshort	22	Structured BASIC
48>0x16	beshort	23	Ross
49>0x16	beshort	24	Dela EP64
50>0x16	beshort	25	Dela EP7x8
51>0x16	beshort	26	Dela EP256
52>0x16	beshort	27	Rex EP256
53>0x16	beshort	28	Mikro Assembler
54>0x16	beshort	29	Final Cartridge Plus
55>0x16	beshort	30	Action Replay 4
56>0x16	beshort	31	Stardos
57>0x16	beshort	32	EasyFlash
58>0x16	beshort	33	EasyFlash Xbank
59>0x16	beshort	34	Capture
60>0x16	beshort	35	Action Replay 3
61>0x16	beshort	36
62>>0x1A	ubyte	1	Nordic Replay
63>>0x1A	ubyte	!1	Retro Replay
64>0x16	beshort	37	MMC64
65>0x16	beshort	38	MMC Replay
66>0x16	beshort	39	IDE64
67>0x16	beshort	40	Super Snapshot V4
68>0x16	beshort	41	IEEE-488
69>0x16	beshort	42	Game Killer
70>0x16	beshort	43	Prophet64
71>0x16	beshort	44	EXOS
72>0x16	beshort	45	Freeze Frame
73>0x16	beshort	46	Freeze Machine
74>0x16	beshort	47	Snapshot64
75>0x16	beshort	48	Super Explode V5.0
76>0x16	beshort	49	Magic Voice
77>0x16	beshort	50	Action Replay 2
78>0x16	beshort	51	MACH 5
79>0x16	beshort	52	Diashow-Maker
80>0x16	beshort	53	Pagefox
81>0x16	beshort	54	Kingsoft
82>0x16	beshort	55	Silverrock 128K Cartridge
83>0x16	beshort	56	Formel 64
84>0x16	beshort	57
85>>0x1A	ubyte	1	Hucky
86>>0x1A	ubyte	!1	RGCD
87>0x16	beshort	58	RR-Net MK3
88>0x16	beshort	59	EasyCalc
89>0x16	beshort	60	GMod2
90>0x16	beshort	61	MAX Basic
91>0x16	beshort	62	GMod3
92>0x16	beshort	63	ZIPP-CODE 48
93>0x16	beshort	64	Blackbox V8
94>0x16	beshort	65	Blackbox V3
95>0x16	beshort	66	Blackbox V4
96>0x16	beshort	67	REX RAM-Floppy
97>0x16	beshort	68	BIS-Plus
98>0x16	beshort	69	SD-BOX
99>0x16	beshort	70	MultiMAX
100>0x16	beshort	71	Blackbox V9
101>0x16	beshort	72	Lt. Kernal Host Adaptor
102>0x16	beshort	73	RAMLink
103>0x16	beshort	74	H.E.R.O.
104>0x16	beshort	75	IEEE Flash! 64
105>0x16	beshort	76	Turtle Graphics II
106>0x16	beshort	77	Freeze Frame MK2
107
1080	string		C128\40CARTRIDGE	Commodore 128 cartridge
109>0x20	ubyte	0	\b,
110>0x20	ubyte	!0
111>>0x20	string/T	x	\b: "%.32s",
112>0x16	beshort	0	generic cartridge
113>0x16	beshort	1	Warpspeed128
114>>0x1A	ubyte	1	\b, REU support
115>>0x1A	ubyte	2	\b, REU support, with I/O and ROM banking
116
1170	string		CBM2\40CARTRIDGE	Commodore CBM-II cartridge
118>0x20	ubyte	!0
119>>0x20	string/T	x	\b: "%.32s"
120
1210	string		VIC20\40CARTRIDGE	Commodore VIC-20 cartridge
122>0x20	ubyte	0	\b,
123>0x20	ubyte	!0
124>>0x20	string/T	x	\b: "%.32s",
125>0x16	beshort	0	generic cartridge
126>0x16	beshort	1	Mega-Cart
127>0x16	beshort	2	Behr Bonz
128>0x16	beshort	3	Vic Flash Plugin
129>0x16	beshort	4	UltiMem
130>0x16	beshort	5	Final Expansion
131
1320	string		PLUS4\40CARTRIDGE	Commodore 16/Plus4 cartridge
133>0x20	ubyte	!0
134>>0x20	string/T	x	\b: "%.32s"
135
136
137# DreamLoad archives see:
138# https://www.lemon64.com/forum/viewtopic.php?t=37415\
139# &sid=494dc2ca91289e05dadf80a7f8a968fe (at the bottom).
140# https://www.c64-wiki.com/wiki/DreamLoad.
141# Example HVSC Commodore 64 music collection:
142# https://kohina.duckdns.org/HVSC/C64Music/10_Years_HVSC.dfi
143
1440	byte	0
145>1	string	DREAMLOAD\40FILE\40ARCHIVE
146>>0x17	byte	0	DFI Image
147>>>0x1a	leshort	x	version: %d.
148>>>0x18	leshort	x	\b%d
149>>>0x1c	lelong	x	tracks: %d
150
1510	string		GCR-1541	GCR Image
152>8	byte		x		version: %i
153>9	byte		x		tracks: %i
154
1559	string		PSUR		ARC archive (c64)
1562	string		-LH1-		LHA archive (c64)
157
1580	string		C64File		PC64 Emulator file
159>8	string		>\0		"%s"
1600	string		C64Image	PC64 Freezer Image
161
1620	beshort		0x38CD		C64 PCLink Image
1630	string		CBM\144\0\0	Power 64 C64 Emulator Snapshot
164
1650	belong		0xFF424CFF	WRAptor packer (c64)
166
1670	string		C64S\x20tape\x20file	T64 tape Image
168>32	leshort		x		Version:%#x
169>36	leshort		!0		Entries:%i
170>40	string		x		Name:%.24s
171
1720	string		C64\x20tape\x20image\x20file\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0	T64 tape Image
173>32	leshort		x		Version:%#x
174>36	leshort		!0		Entries:%i
175>40	string		x		Name:%.24s
176
1770	string		C64S\x20tape\x20image\x20file\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0	T64 tape Image
178>32	leshort		x		Version:%#x
179>36	leshort		!0		Entries:%i
180>40	string		x		Name:%.24s
181
182# Raw tape file format (.tap files)
183# Esa Hyyti <esa@netlab.tkk.fi>
1840	string		C64-TAPE-RAW	C64 Raw Tape File (.tap),
185>0x0c	byte		x		Version:%u,
186>0x10	lelong		x		Length:%u cycles
187
188# magic for Goattracker2, http://covertbitops.c64.org/
189# from Alex Myczko <alex@aiei.ch>
1900	string		GTS5		GoatTracker 2 song
191>4	string		>\0		\b, "%s"
192>36	string		>\0		\b by %s
193>68	string		>\0		\b (C) %s
194>100	byte		>0		\b, %u subsong(s)
195
196# CBM BASIC (cc65 compiled)
197# Summary:	binary executable or Basic program for Commodore C64 computers
198# Update:	Joerg Jenderek
199# URL:		http://fileformats.archiveteam.org/wiki/Commodore_BASIC_tokenized_file
200# Reference:	https://www.c64-wiki.com/wiki/BASIC_token
201#		https://github.com/thezerobit/bastext/blob/master/bastext.doc
202#		http://mark0.net/download/triddefs_xml.7z/defs/p/prg-c64.trid.xml
203# TODO:		unify Commodore BASIC/program sub routines
204# Note:		"PUCrunch archive data" moved from ./archive and merged with c64-exe
2050	leshort		0x0801
206# display Commodore C64 BASIC program (strength=50) after "Lynx archive" (strength=330) handled by ./archive
207#!:strength +0
208# if first token is not SYS this implies BASIC program in most cases
209>6		ubyte		!0x9e
210# but sELF-ExTRACTING-zIP executable unzp6420.prg contains SYS token at end of second BASIC line (at 0x35)
211>>23		search/30	\323ELF-E\330TRACTING-\332IP
212>>>0		use		c64-exe
213>>23		default		x
214>>>0		use		c64-prg
215# if first token is SYS this implies binary executable
216>6		ubyte		=0x9e
217>>0		use		c64-exe
218# display information about C64 binary executable (memory address, line number, token)
2190	name	c64-exe
220>0		uleshort	x	Commodore C64
221# http://a1bert.kapsi.fi/Dev/pucrunch/
222# start address 0801h; next offset 080bh; BASIC line number is 239=00EFh; BASIC instruction is SYS 2061
223# the above combination appartly also occur for other Commodore programs like: gunzip111.c64.prg
224# and there exist PUCrunch archive for other machines like C16 with other magics
225>0		string	\x01\x08\x0b\x08\xef\x00\x9e\x32\x30\x36\x31	program, probably PUCrunch archive data
226!:mime	application/x-compress-pucrunch
227!:ext	prg/pck
228>0		string	!\x01\x08\x0b\x08\xef\x00\x9e\x32\x30\x36\x31	program
229!:mime	application/x-commodore-exec
230!:ext	prg/
231# start address like: 801h
232>0		uleshort	!0x0801	\b, start address %#4.4x
233# 1st BASIC fragment
234>2		use		basic-line
235# jump to 1 byte before next BASIC fragment; this must be zero-byte marking the end of line
236>(2.s-0x800)	ubyte		x
237>>&-1		ubyte		!0	\b, no EOL=%#x
238# valid 2nd BASIC fragment found only in sELF-ExTRACTING-zIP executable unzp6420.prg
239>>23		search/30	\323ELF-E\330TRACTING-\332IP
240# jump again from beginning
241>>>(2.s-0x800)	ubyte		x
242>>>>&0		use		basic-line
243# Zero-byte marking the end of the BASIC line
244>-3		ubyte		!0	\b, 3 last bytes %#2.2x
245# Two zero-bytes in place of the pointer to next BASIC line indicates the end of the program
246>>-2		ubeshort	x	\b%4.4x
247# display information about tokenized C64 BASIC program (memory address, line number, token)
2480	name	c64-prg
249>0		uleshort	x	Commodore C64 BASIC program
250!:mime	application/x-commodore-basic
251# Tokenized BASIC programs were stored by Commodore as file type program "PRG" in separate field in directory structures.
252# So file name can have no suffix like in saveroms; When transferring to other platforms, they are often saved with .prg extensions.
253# BAS suffix is typically used for the BASIC source but also found in program pods.bas
254!:ext	prg/bas/
255# start address like: 801h
256>0		uleshort	!0x0801	\b, start address %#4.4x
257# 1st BASIC fragment
258>2		use		basic-line
259# jump to 1 byte before next BASIC fragment; this must be zero-byte marking the end of line
260>(2.s-0x0800)	ubyte		x
261>>&-1		ubyte		!0	\b, no EOL=%#x
262# 2nd BASIC fragment
263>>&0		use		basic-line
264# zero-byte marking the end of the BASIC line
265>-3		ubyte		!0	\b, 3 last bytes %#2.2x
266# Two zero-bytes in place of the pointer to next BASIC line indicates the end of the program
267>>-2		ubeshort	x	\b%4.4x
268# Summary:	binary executable or Basic program for Commodore C128 computers
269# URL:		https://en.wikipedia.org/wiki/Commodore_128
270# Reference:	http://mark0.net/download/triddefs_xml.7z/defs/p/prg-c128.trid.xml
271# From:		Joerg Jenderek
272# Note:		Commodore 128 BASIC 7.0 variant; there exist varaints with different start addresses
2730		leshort		0x1C01
274!:strength	+1
275# GRR: line above with strength 51 (50+1) is too generic because it matches SVr3 curses screen image, big-endian with strength (50) handled by ./terminfo
276# probably skip SVr3 curses images with "invalid high" second line offset
277>2		uleshort	<0x1D02
278# skip foo with "invalid low" second line offset
279>>2		uleshort	>0x1C06
280# if first token is not SYS this implies BASIC program
281>>>6		ubyte		!0x9e
282>>>>0			use	c128-prg
283# if first token is SYS this implies binary executable
284>>>6		ubyte		=0x9e
285>>>>0		use		c128-exe
286# Summary:	binary executable or Basic program for Commodore C128 computers
287# Note:		Commodore 128 BASIC 7.1 extension by Rick Simon
288# start adress 132Dh
289#0		leshort		0x132D	THIS_IS_C128_7.1
290#>0			use	c128-prg
291# Summary:	binary executable or Basic program for Commodore C128 computers
292# Note:		Commodore 128 BASIC 7.0 saved with graphics mode enabled
293# start adress 4001h
294#0		leshort		0x4001	THIS_IS_C128_GRAPHIC
295#>0			use	c128-prg
296# display information about tokenized C128 BASIC program (memory address, line number, token)
2970	name	c128-prg
298>0		uleshort	x	Commodore C128 BASIC program
299!:mime	application/x-commodore-basic
300!:ext	prg
301# start address like: 1C01h
302>0		uleshort	!0x1C01	\b, start address %#4.4x
303# 1st BASIC fragment
304>2		use		basic-line
305# jump to 1 byte before next BASIC fragment; this must be zero-byte marking the end of line
306>(2.s-0x1C00)	ubyte		x
307>>&-1		ubyte		!0	\b, no EOL=%#x
308# 2nd BASIC fragment
309>>&0		use		basic-line
310# Zero-byte marking the end of the BASIC line
311>-3		ubyte		!0	\b, 3 last bytes %#2.2x
312# Two zero-bytes in place of the pointer to next BASIC line indicates the end of the program
313>>-2		ubeshort	x	\b%4.4x
314# display information about C128 program (memory address, line number, token)
3150	name	c128-exe
316>0		uleshort	x	Commodore C128 program
317!:mime	application/x-commodore-exec
318!:ext	prg/
319# start address like: 1C01h
320>0		uleshort	!0x1C01	\b, start address %#4.4x
321# 1st BASIC fragment
322>2		use		basic-line
323# jump to 1 byte before next BASIC fragment; this must be zero-byte marking the end of line
324>(2.s-0x1C00)	ubyte		x
325>>&-1		ubyte		!0	\b, no EOL=%#x
326# no valid 2nd BASIC fragment in Commodore executables
327#>>&0		use		basic-line
328# Zero-byte marking the end of the BASIC line
329>-3		ubyte		!0	\b, 3 last bytes %#2.2x
330# Two zero-bytes in place of the pointer to next BASIC line indicates the end of the program
331>>-2		ubeshort	x	\b%4.4x
332# Summary:	binary executable or Basic program for Commodore C16/VIC-20/Plus4 computers
333# URL:		https://en.wikipedia.org/wiki/Commodore_Plus/4
334# Reference:	http://mark0.net/download/triddefs_xml.7z/defs/p/prg-vic20.trid.xml
335#		defs/p/prg-plus4.trid.xml
336# From:		Joerg Jenderek
337# Note:		there exist VIC-20 variants with different start address
338# GRR: line below is too generic because it matches Novell LANalyzer capture
339# with regular trace header record handled by ./sniffer
3400		leshort		0x1001
341# skip regular Novell LANalyzer capture (novell-2.tr1 novell-lanalyzer.tr1 novell-win10.tr1) with "invalid low" token value 54h
342>6		ubyte		>0x7F
343# skip regular Novell LANalyzer capture (novell-2.tr1 novell-lanalyzer.tr1 novell-win10.tr1) with "invalid low" second line offset 4Ch
344#>>2		uleshort	>0x1006	OFFSET_NOT_TOO_LOW
345# skip foo with "invalid high" second line offset but not for 0x123b (Minefield.prg)
346#>>>2		uleshort	<0x1102	OFFSET_NOT_TOO_HIGH
347# if first token is not SYS this implies BASIC program
348>>6		ubyte		!0x9e
349# valid second end of line separator implies BASIC program
350>>>(2.s-0x1000)		ubyte	=0
351>>>>0			use	c16-prg
352# invalid second end of line separator !=0 implies binary executable like: Minefield.prg
353>>>(2.s-0x1000)		ubyte	!0
354>>>>0			use	c16-exe
355# if first token is SYS this implies binary executable
356>>6		ubyte		=0x9e
357>>>0		use		c16-exe
358# display information about C16 program (memory address, line number, token)
3590	name	c16-exe
360>0		uleshort	x	Commodore C16/VIC-20/Plus4 program
361!:mime	application/x-commodore-exec
362!:ext	prg/
363# start address like: 1001h
364>0		uleshort	!0x1001	\b, start address %#4.4x
365# 1st BASIC fragment
366>2		use		basic-line
367# jump to 1 byte before next BASIC fragment; this must be zero-byte marking the end of line
368>(2.s-0x1000)	ubyte		x
369>>&-1		ubyte		!0	\b, no EOL=%#x
370# no valid 2nd BASIC fragment in excutables
371#>>&0		use		basic-line
372# Zero-byte marking the end of the BASIC line
373>-3		ubyte		!0	\b, 3 last bytes %#2.2x
374# Two zero-bytes in place of the pointer to next BASIC line indicates the end of the program
375>>-2		ubeshort	x	\b%4.4x
376# display information about tokenized C16 BASIC program (memory address, line number, token)
3770	name	c16-prg
378>0		uleshort	x	Commodore C16/VIC-20/Plus4 BASIC program
379!:mime	application/x-commodore-basic
380!:ext	prg
381# start address like: 1001h
382>0		uleshort	!0x1001	\b, start address %#4.4x
383# 1st BASIC fragment
384>2		use		basic-line
385# jump to 1 byte before next BASIC fragment; this must be zero-byte marking the end of line
386>(2.s-0x1000)	ubyte		x
387>>&-1		ubyte		!0	\b, no EOL=%#x
388# 2nd BASIC fragment
389>>&0		use		basic-line
390# Zero-byte marking the end of the BASIC line
391>-3		ubyte		!0	\b, 3 last bytes %#2.2x
392# Two zero-bytes in place of the pointer to next BASIC line indicates the end of the program
393>>-2		ubeshort	x	\b%4.4x
394# Summary:	binary executable or Basic program for Commodore VIC-20 computer with 8K RAM expansion
395# URL:		https://en.wikipedia.org/wiki/VIC-20
396# Reference:	http://mark0.net/download/triddefs_xml.7z/defs/p/prg-vic20-8k.trid.xml
397# From:		Joerg Jenderek
398# Note:		Basic v2.0 with Basic v4.0 extension (VIC20); there exist VIC-20 variants with different start addresses
399# start adress 1201h
4000		leshort		0x1201
401# if first token is not SYS this implies BASIC program
402>6		ubyte		!0x9e
403>>0		use		vic-prg
404# if first token is SYS this implies binary executable
405>6		ubyte		=0x9e
406>>0		use		vic-exe
407# display information about Commodore VIC-20 BASIC+8K program (memory address, line number, token)
4080	name	vic-prg
409>0		uleshort	x	Commodore VIC-20 +8K BASIC program
410!:mime	application/x-commodore-basic
411!:ext	prg
412# start address like: 1201h
413>0		uleshort	!0x1201	\b, start address %#4.4x
414# 1st BASIC fragment
415>2		use		basic-line
416# jump to 1 byte before next BASIC fragment; this must be zero-byte marking the end of line
417>(2.s-0x1200)	ubyte		x
418>>&-1		ubyte		!0	\b, no EOL=%#x
419# 2nd BASIC fragment
420>>&0		use		basic-line
421# Zero-byte marking the end of the BASIC line
422>-3		ubyte		!0	\b, 3 last bytes %#2.2x
423# Two zero-bytes in place of the pointer to next BASIC line indicates the end of the program
424>>-2		ubeshort	x	\b%4.4x
425# display information about Commodore VIC-20 +8K program (memory address, line number, token)
4260	name	vic-exe
427>0		uleshort	x	Commodore VIC-20 +8K program
428!:mime	application/x-commodore-exec
429!:ext	prg/
430# start address like: 1201h
431>0		uleshort	!0x1201	\b, start address %#4.4x
432# 1st BASIC fragment
433>2		use		basic-line
434# jump to 1 byte before next BASIC fragment; this must be zero-byte marking the end of line
435>(2.s-0x0400)	ubyte		x
436>>&-1		ubyte		!0	\b, no EOL=%#x
437# no valid 2nd BASIC fragment in excutables
438#>>&0		use		basic-line
439# Zero-byte marking the end of the BASIC line
440>-3		ubyte		!0	\b, 3 last bytes %#2.2x
441# Two zero-bytes in place of the pointer to next BASIC line indicates the end of the program
442>>-2		ubeshort	x	\b%4.4x
443# Summary:	binary executable or Basic program for Commodore PET computers
444# URL:		https://en.wikipedia.org/wiki/Commodore_PET
445# Reference:	http://mark0.net/download/triddefs_xml.7z/defs/p/prg-pet.trid.xml
446# From:		Joerg Jenderek
447# start adress 0401h
4480		leshort		0x0401
449!:strength	+1
450# GRR: line above with strength 51 (50+1) is too generic because it matches TTComp archive data, ASCII, 1K dictionary
451# (strength=48=50-2) handled by ./archive and shared library (strength=50) handled by ./ibm6000
452# skip TTComp archive data, ASCII, 1K dictionary ttcomp-ascii-1k.bin with "invalid high" second line offset 4162h
453>2		uleshort	<0x0502
454# skip foo with "invalid low" second line offset
455#>>2		uleshort	>0x0406	OFFSET_NOT_TOO_LOW
456# skip bar with "invalid end of line"
457#>>>(2.s-0x0400)	ubyte		=0	END_OF_LINE_OK
458# if first token is not SYS this implies BASIC program
459>>6		ubyte		!0x9e
460>>>0		use		pet-prg
461# if first token is SYS this implies binary executable
462>>6		ubyte		=0x9e
463>>>0		use		pet-exe
464# display information about Commodore PET BASIC program (memory address, line number, token)
4650	name	pet-prg
466>0		uleshort	x	Commodore PET BASIC program
467!:mime	application/x-commodore-basic
468!:ext	prg
469# start address like: 0401h
470>0		uleshort	!0x0401	\b, start address %#4.4x
471# 1st BASIC fragment
472>2		use		basic-line
473# jump to 1 byte before next BASIC fragment; this must be zero-byte marking the end of line
474>(2.s-0x0400)	ubyte		x
475# 2nd BASIC fragment
476>>&0		use		basic-line
477# zero-byte marking the end of the BASIC line
478>-3		ubyte		!0	\b, 3 last bytes %#2.2x
479# Two zero-bytes in place of the pointer to next BASIC line indicates the end of the program
480>>-2		ubeshort	x	\b%4.4x
481# display information about Commodore PET program (memory address, line number, token)
4820	name	pet-exe
483>0		uleshort	x	Commodore PET program
484!:mime	application/x-commodore-exec
485!:ext	prg/
486# start address like: 0401h
487>0		uleshort	!0x0401	\b, start address %#4.4x
488# 1st BASIC fragment
489>2		use		basic-line
490# jump to 1 byte before next BASIC fragment; this must be zero-byte marking the end of line
491>(2.s-0x0400)	ubyte		x
492>>&-1		ubyte		!0	\b, no EOL=%#x
493# no valid 2nd BASIC fragment in excutables
494#>>&0		use		basic-line
495# Zero-byte marking the end of the BASIC line
496>-3		ubyte		!0	\b, 3 last bytes %#2.2x
497# Two zero-bytes in place of the pointer to next BASIC line indicates the end of the program
498>>-2		ubeshort	x	\b%4.4x
499# display information about tokenized BASIC line (memory address, line number, Token)
5000	name	basic-line
501# pointer to memory address of beginning of "next" BASIC line
502# greater then previous offset but maximal 100h difference
503>0		uleshort	x	\b, offset %#4.4x
504# offset 0x0000 indicates the end of BASIC program; so bytes afterwards may be some other data
505>0		uleshort	0
506# not line number but first 2 data bytes
507>>2		ubeshort	x	\b, data %#4.4x
508# not token but next 2 data bytes
509>>4		ubeshort	x	\b%4.4x
510# not token arguments but next data bytes
511>>6		ubequad		x 	\b%16.16llx
512>>14		ubequad		x 	\b%16.16llx...
513# like 0x0d20352020204c594e5820495820204259205749 "\r 5   LYNX IX  BY WILL CORLEY" for LyNX archive Darkon.lnx handled by ./archive
514#>>3		string		x 	"%-0.30s"
515>0		uleshort	>0
516# BASIC line number with range from 0 to 65520; practice to increment numbers by some value (5, 10 or 100)
517>>2		uleshort	x	\b, line %u
518# https://www.c64-wiki.com/wiki/BASIC_token
519# The "high-bit" bytes from #128-#254 stood for the various BASIC commands and mathematical operators
520>>4		ubyte		x	\b, token (%#x)
521# https://www.c64-wiki.com/wiki/REM
522>>4		string		\x8f	REM
523# remark string like: ** SYNTHESIZER BY RICOCHET **
524>>>5		string		>\0	%s
525#>>>>&1		uleshort	x	\b, NEXT OFFSET %#4.4x
526# https://www.c64-wiki.com/wiki/PRINT
527>>4		string		\x99	PRINT
528# string like: "Hello world" "\021 \323ELF-E\330TRACTING-\332IP (64 ONLY)\016\231":\2362141
529>>>5		string		x	%s
530#>>>>&0		ubequad		x	AFTER_PRINT=%#16.16llx
531# https://www.c64-wiki.com/wiki/POKE
532>>4		string		\x97	POKE
533# <Memory address>,<number>
534>>>5		regex		\^[0-9,\040]+	%s
535# BASIC command delimiter colon (:=3Ah)
536>>>>&-2		ubyte		=0x3A
537# after BASIC command delimiter colon remaining (<255) other tokenized BASIC commands
538>>>>>&0		string		x		"%s"
539# https://www.c64-wiki.com/wiki/SYS	0x9e=\236
540>>4		string		\x9e	SYS
541# SYS <Address> parameter is a 16-bit unsigned integer; in the range 0 - 65535
542>>>5		regex		\^[0-9]{1,5}	%s
543# maybe followed by spaces, "control-characters" or colon (:) followed by next commnds or in victracker.prg
544# (\302(43)\252256\254\302(44)\25236) /T.L.R/
545#>>>5		string		x	SYS_STRING="%s"
546# https://www.c64-wiki.com/wiki/GOSUB
547>>4		string		\x8d	GOSUB
548# <line>
549>>>5		string		>\0	%s
550