xref: /freebsd/contrib/file/magic/Magdir/c64 (revision 7fdf597e96a02165cfe22ff357b857d5fa15ed8a)
1
2#------------------------------------------------------------------------------
3# $File: c64,v 1.16 2024/03/07 22:30:21 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# Update:	Joerg Jenderek
16# Reference: https://vice-emu.sourceforge.io/vice_17.html#SEC391
17#		http://ist.uwaterloo.ca/~schepers/formats/CRT.TTX
18#		http://mark0.net/download/triddefs_xml.7z/defs/c/crt-c64.trid.xml
19# Note:		called "C64 Cartridge image" by TrID and
20#		"CRT C64 Cartridge Image Format" by DROID via PUID fmt/822
21
220	string		C64\40CARTRIDGE
23# skip DROID fmt-822-signature-id-1179.crt with missing packet length
24>0x44	ubelong		>0x10
25>>0	use		c64-crt
26#	display Commodore 64 cartridge information
270	name		c64-crt
28>0	string		x		Commodore 64 cartridge
29#!:mime	application/octet-stream
30!:mime	application/x-commodore-crt
31!:ext	crt
32#		http://mark0.net/download/triddefs_xml.7z/defs/c/car-ccs64.trid.xml
33#!:ext	crt/car
34>0x20	ubyte	0	\b,
35>0x20	ubyte	!0
36# 32-byte null padded cartridge name like: "BUGS BUNNY" "CART64" "EasyFlash" "FINAL CARTRIDGE" "Magic Desk" "VICE CART"
37>>0x20	string/T	x	\b: "%.32s",
38# cartridge hardware type
39>0x16	beshort	0
40# cartridge port EXROM line status
41>>0x18	beshort	0x0000	16 KB game
42>>0x18	beshort	0x0001	8 KB game
43>>0x18	beshort	0x0100	UltiMax mode
44>>0x18	beshort	0x0101	RAM/disabled
45>0x16	beshort	1	Action Replay
46>0x16	beshort	2	KCS Power Cartridge
47>0x16	beshort	3	Final Cartridge III
48>0x16	beshort	4	Simons' BASIC
49>0x16	beshort	5	Ocean type 1
50>0x16	beshort	6	Expert Cartridge
51>0x16	beshort	7	Fun Play, Power Play
52>0x16	beshort	8	Super Games
53>0x16	beshort	9	Atomic Power
54>0x16	beshort	10	Epyx Fastload
55>0x16	beshort	11	Westermann Learning
56>0x16	beshort	12	Rex Utility
57>0x16	beshort	13	Final Cartridge I
58>0x16	beshort	14	Magic Formel
59>0x16	beshort	15	C64 Game System, System 3
60>0x16	beshort	16	Warp Speed
61>0x16	beshort	17	Dinamic
62>0x16	beshort	18	Zaxxon / Super Zaxxon (Sega)
63>0x16	beshort	19	Magic Desk, Domark, HES Australia
64>0x16	beshort	20	Super Snapshot V5
65>0x16	beshort	21	Comal-80
66>0x16	beshort	22	Structured BASIC
67>0x16	beshort	23	Ross
68>0x16	beshort	24	Dela EP64
69>0x16	beshort	25	Dela EP7x8
70>0x16	beshort	26	Dela EP256
71>0x16	beshort	27	Rex EP256
72>0x16	beshort	28	Mikro Assembler
73>0x16	beshort	29	Final Cartridge Plus
74>0x16	beshort	30	Action Replay 4
75>0x16	beshort	31	Stardos
76>0x16	beshort	32	EasyFlash
77>0x16	beshort	33	EasyFlash Xbank
78>0x16	beshort	34	Capture
79>0x16	beshort	35	Action Replay 3
80>0x16	beshort	36
81# cartridge Hardware Revision/Subtype (usually 0) (added in v1.01)
82>>0x1A	ubyte	1	Nordic Replay
83>>0x1A	ubyte	!1	Retro Replay
84>0x16	beshort	37	MMC64
85>0x16	beshort	38	MMC Replay
86>0x16	beshort	39	IDE64
87>0x16	beshort	40	Super Snapshot V4
88>0x16	beshort	41	IEEE-488
89>0x16	beshort	42	Game Killer
90>0x16	beshort	43	Prophet64
91>0x16	beshort	44	EXOS
92>0x16	beshort	45	Freeze Frame
93>0x16	beshort	46	Freeze Machine
94>0x16	beshort	47	Snapshot64
95>0x16	beshort	48	Super Explode V5.0
96>0x16	beshort	49	Magic Voice
97>0x16	beshort	50	Action Replay 2
98>0x16	beshort	51	MACH 5
99>0x16	beshort	52	Diashow-Maker
100>0x16	beshort	53	Pagefox
101>0x16	beshort	54	Kingsoft
102>0x16	beshort	55	Silverrock 128K Cartridge
103>0x16	beshort	56	Formel 64
104>0x16	beshort	57
105>>0x1A	ubyte	1	Hucky
106>>0x1A	ubyte	!1	RGCD
107>0x16	beshort	58	RR-Net MK3
108>0x16	beshort	59	EasyCalc
109>0x16	beshort	60	GMod2
110>0x16	beshort	61	MAX Basic
111>0x16	beshort	62	GMod3
112>0x16	beshort	63	ZIPP-CODE 48
113>0x16	beshort	64	Blackbox V8
114>0x16	beshort	65	Blackbox V3
115>0x16	beshort	66	Blackbox V4
116>0x16	beshort	67	REX RAM-Floppy
117>0x16	beshort	68	BIS-Plus
118>0x16	beshort	69	SD-BOX
119>0x16	beshort	70	MultiMAX
120>0x16	beshort	71	Blackbox V9
121>0x16	beshort	72	Lt. Kernal Host Adaptor
122>0x16	beshort	73	RAMLink
123>0x16	beshort	74	H.E.R.O.
124>0x16	beshort	75	IEEE Flash! 64
125>0x16	beshort	76	Turtle Graphics II
126>0x16	beshort	77	Freeze Frame MK2
127>0x16	beshort	78	Partner 64
128# cartridge hardware type: (0-78)
129>0x16	ubeshort >78	unknown type %#x
130# Cartridge Hardware Revision/Subtype (usually 0 added in v1.01)
131>>0x1A	ubyte	>0	revision %#x
132# padded with 3 space characters for CRT but for CCS64 Cartridge (*.CAR) maybe different according to TrID
133>14	ubeshort	!0x2020	\b, at 14 %#x
134# file header length like: 20h (reported wrong) 40h (default and minimum)
135>0x10	ubelong	!0x40	\b, header length %#x
136# cartridge version like: 1.0 1.1 (adds CRT sub type/hardware revision) 2.0 (introduces VIC20, PLUS4, C128, CBM2)
137>0x14	ubeshort	!0x0100
138>>0x14	ubyte		x	\b, version %u
139>>0x15	ubyte		x	\b.%u
140# cartridge content start with ROM signature which must be CHIP
141>0x40	ubelong	!0x43484950	\b, invalid ROM signature
142>>0x40	string	x		"%0.4s"
143# total packet length (length of ROM image size and header combined) like: 2010h 4010h
144>0x44	ubelong	x	\b, packet length %#x
145
1460	string		C128\40CARTRIDGE	Commodore 128 cartridge
147>0x20	ubyte	0	\b,
148>0x20	ubyte	!0
149>>0x20	string/T	x	\b: "%.32s",
150>0x16	beshort	0	generic cartridge
151>0x16	beshort	1	Warpspeed128
152>>0x1A	ubyte	1	\b, REU support
153>>0x1A	ubyte	2	\b, REU support, with I/O and ROM banking
154
1550	string		CBM2\40CARTRIDGE	Commodore CBM-II cartridge
156>0x20	ubyte	!0
157>>0x20	string/T	x	\b: "%.32s"
158
1590	string		VIC20\40CARTRIDGE	Commodore VIC-20 cartridge
160>0x20	ubyte	0	\b,
161>0x20	ubyte	!0
162>>0x20	string/T	x	\b: "%.32s",
163>0x16	beshort	0	generic cartridge
164>0x16	beshort	1	Mega-Cart
165>0x16	beshort	2	Behr Bonz
166>0x16	beshort	3	Vic Flash Plugin
167>0x16	beshort	4	UltiMem
168>0x16	beshort	5	Final Expansion
169
1700	string		PLUS4\40CARTRIDGE	Commodore 16/Plus4 cartridge
171>0x20	ubyte	!0
172>>0x20	string/T	x	\b: "%.32s"
173
174
175# DreamLoad archives see:
176# https://www.lemon64.com/forum/viewtopic.php?t=37415\
177# &sid=494dc2ca91289e05dadf80a7f8a968fe (at the bottom).
178# https://www.c64-wiki.com/wiki/DreamLoad.
179# Example HVSC Commodore 64 music collection:
180# https://kohina.duckdns.org/HVSC/C64Music/10_Years_HVSC.dfi
181
1820	byte	0
183>1	string	DREAMLOAD\40FILE\40ARCHIVE
184>>0x17	byte	0	DFI Image
185>>>0x1a	leshort	x	version: %d.
186>>>0x18	leshort	x	\b%d
187>>>0x1c	lelong	x	tracks: %d
188
1890	string		GCR-1541	GCR Image
190>8	byte		x		version: %i
191>9	byte		x		tracks: %i
192
1939	string		PSUR		ARC archive (c64)
1942	string		-LH1-		LHA archive (c64)
195
1960	string		C64File		PC64 Emulator file
197>8	string		>\0		"%s"
1980	string		C64Image	PC64 Freezer Image
199
2000	beshort		0x38CD		C64 PCLink Image
2010	string		CBM\144\0\0	Power 64 C64 Emulator Snapshot
202
2030	belong		0xFF424CFF	WRAptor packer (c64)
204
205# URL:		http://fileformats.archiveteam.org/wiki/T64
206# Reference:	http://ist.uwaterloo.ca/~schepers/formats/T64.TXT
207#		https://vice-emu.sourceforge.io/vice_16.html#SEC394
208#		https://www.infinite-loop.at/Power64/Documentation/Power64-ReadMe/AE-File_Formats.html
209#		http://mark0.net/download/triddefs_xml.7z/defs/e/emu-t64.trid.xml
210# Note:		called "Commodore 64 Tape container" by TrID, "T64 Tape Image Format" by DROID via PUID fmt/820 and
211# 		"T64 tape Image" by ./c64,v 1.14
212#		verified by command like `deark -m t64 -l -d2 Caitan_the_Demo.t64` and
213#		`cbmconvert -v2 -t -D4 ironmanoffroad.d64 ironmanoffroad.t64`
214# 32 byte signature starting like C64S\x20tape\x20file
215# C64\x20tape\x20image\x20file\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0
216# C64S\x20tape\x20image\x20file\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0
2170	string/b	C64
218# skip raw Commodore TAPe by check for unsed areas (\0 filled) and valid low (40h+m*20h; m=0-FFffh) offset
219>0x46	ubequad&0xFFff1F00C0ffFFff	0	Commodore Tape image
220#!:mime	application/octet-stream
221#!:mime	application/x-commodore-tape
222!:ext	t64
223# version like: 0100h (examples found) 0101h 0200h (no examples)
224>>32	leshort		x		Version:%#x
225#>>32	leshort		!0x0100		Version:%#x
226# number of used directory entries like: 0 1 2 5
227>>36	leshort		!0		Entries:%i
228# tape container name, 24 characters (padded with 20h but with A0h for DirMaster created samples) like:
229# ->ZYRON'S PD<- IMAGETAPE MY-T64-TEST\240\240\240 OPERATIONWOLF+3-711.T64
230>>40	string/24/Tb	>\040		Name:%.24s
231# MaxFiles; maximal directory entries like: 0 1 2 5 30 (=1Eh some emulators expect exactly this value) 31 32
232>>34	uleshort	x		MaxFiles:%u
233# 1st C64 filetype: 0~free 1~normal tape file 2~tape file with header 3~memory snapshot 4~tape block 5~digitized stream 6-255~reserved
234>>0x40	ubyte		!1		\b, C64 file type %#x
235# 1st start address or load address of first entry like: 0000 (empty|snapshot) 04a0h (ironmanoffroad.t64) 0801h (typically) 1201h (3501_quizmaster_program_s1.t64)
236>>0x42	uleshort	!0x0801		\b, load address %#4.4x
237# 1st actual end address in memory
238>>0x44	uleshort	x		\b, end address %#4.4x
239# reserved; must be 0
240>>0x26	ubeshort	!0		\b, at +0x26 %#x
241# not used like: 0 (examples found and according to TrID)
242>>0x46	ubeshort	!0		\b, at 0x46 %#4.4x
243# not used like: 0 (examples found and according to TrID)
244>>0x4c	ubelong		!0		\b, at 0x4C %#8.8x
245# offset (=64+32*m) into 1st container file like: 0 (empty) 60h 80h E0h 400h 440h ...
246>>0x48	ulelong		>0		\b, at %#x
247# 1st filename (in PETASCII, padded with 20h, not A0h) like: "DRILLINSTR. /HTL" "WIZBALL+        " ...
248>>>0x50	string/16/bT	x		"%0.16s"
249# https://www.lyonlabs.org/commodore/onrequest/Inside_Commodore_Dos.pdf
250# file type like: 0~Scratched 1~SEQunclosed 81h~SEQ 82h~PRG C2h~PRGlocked ...
251>>>0x41	ubyte		x
252>>>>0x41	ubyte	=0x00		Scratched type
253>>>>0x41	ubyte	=0x01		SEQ unclosed type
254#>>>>0x41	ubyte	=0x44		foo type
255>>>>0x41	ubyte	=0x80		DEL type
256>>>>0x41	ubyte	=0x81		SEQ type
257>>>>0x41	ubyte	=0x82		PRG type
258>>>>0x41	ubyte	=0x83		USR type
259>>>>0x41	ubyte	=0x84		REL type
260>>>>0x41	ubyte	=0xC2		PRG locked type
261# other 	unusual file type
262>>>>0x41	default	x
263>>>>>0x41	ubyte	x		%#2.2x type
264# inspect 1st entry content (often Commodore C64 BASIC program *.PRG) without load adress
265#>>(0x48.l)	ubequad		x	\b, 1st data %16.16llx...
266
267# Raw tape file format (.tap files)
268# Esa Hyyti <esa@netlab.tkk.fi>
269# Update:	Joerg Jenderek
270# URL:		http://fileformats.archiveteam.org/wiki/Tap_file
271#		https://vice-emu.sourceforge.io/vice_16.html#SEC392
272# Reference:	http://ist.uwaterloo.ca/~schepers/formats/TAP.TXT
273# Note:		called "TAP (Commodore 64)" by DROID via PUID fmt/802
274#		a variant starting with C16-TAPE-RAW should exist, but no examples found
2750	string/b	C64-TAPE-RAW	Commodore raw Tape image (platform
276#0	string		C64-TAPE-RAW	C64 Raw Tape File (.tap),
277#!:mime	application/octet-stream
278!:mime	application/x-commodore-tape
279!:ext	tap
280# According to TrID als raw suffix, but no such samples found
281#!:ext	tap/raw
282# computer platform like: 0~C64 1~VIC-20 2~C16 Plus/4 3~PET 4~C5x0 5~C6x0 C7x0
283>0xD	ubyte		0		C64
284>0xD	ubyte		1		VIC-20
285>0xD	ubyte		2		C16 Plus/4
286>0xD	ubyte		3		PET
287>0xD	ubyte		4		C5x0
288>0xD	ubyte		5		C6x0 C7x0
289# this should not happen!
290>0xD	ubyte		>5		%#2.2x
291>0xD	ubyte		x		\b),
292# Reference:	http://mark0.net/download/triddefs_xml.7z/defs/t/tap.trid.xml
293#		http://mark0.net/download/triddefs_xml.7z/defs/t/tap-1.trid.xml
294# Note:		called "C64 Tape image format" (v0-original) (v1-updated)" by TrID
295# TAP version like: 0~OriginalLayout 1~Updated (often)
296>0x0c	byte		x		Version:%u,
297# file data size (not including header)
298>0x10	lelong		x		Length:%u cycles
299# video standard like: 0~PAL 1~NTSC 2~OLD NTSC 3~PALN
300>0xE	ubyte		x    		\b, video
301>0xE	ubyte		0		PAL
302>0xE	ubyte		1		NTSC
303>0xE	ubyte		2		old NTSC
304>0xE	ubyte		3		PALN
305# this should not happen!
306>0xE	ubyte		>3		%#2.2x
307# reserved for future expansion like: 0
308>0xF	ubyte		!0		\b, at 0xF %#2.2x
309# file data
310#>014	ubequad		x		\b, data %16.16llx
311
312# magic for Goattracker2, http://covertbitops.c64.org/
313# from Alex Myczko <alex@aiei.ch>
3140	string		GTS5		GoatTracker 2 song
315>4	string		>\0		\b, "%s"
316>36	string		>\0		\b by %s
317>68	string		>\0		\b (C) %s
318>100	byte		>0		\b, %u subsong(s)
319
320# CBM BASIC (cc65 compiled)
321# Summary:	binary executable or Basic program for Commodore C64 computers
322# Update:	Joerg Jenderek
323# URL:		http://fileformats.archiveteam.org/wiki/Commodore_BASIC_tokenized_file
324# Reference:	https://www.c64-wiki.com/wiki/BASIC_token
325#		https://github.com/thezerobit/bastext/blob/master/bastext.doc
326#		http://mark0.net/download/triddefs_xml.7z/defs/p/prg-c64.trid.xml
327# TODO:		unify Commodore BASIC/program sub routines
328# Note:		"PUCrunch archive data" moved from ./archive and merged with c64-exe
3290	leshort		0x0801
330# display Commodore C64 BASIC program (strength=50) after "Lynx archive" (strength=330) handled by ./archive
331#!:strength +0
332# if first token is not SYS this implies BASIC program in most cases
333>6		ubyte		!0x9e
334# but sELF-ExTRACTING-zIP executable unzp6420.prg contains SYS token at end of second BASIC line (at 0x35)
335>>23		search/30	\323ELF-E\330TRACTING-\332IP
336>>>0		use		c64-exe
337>>23		default		x
338>>>0		use		c64-prg
339# if first token is SYS this implies binary executable
340>6		ubyte		=0x9e
341>>0		use		c64-exe
342# display information about C64 binary executable (memory address, line number, token)
3430	name	c64-exe
344>0		uleshort	x	Commodore C64
345# http://a1bert.kapsi.fi/Dev/pucrunch/
346# start address 0801h; next offset 080bh; BASIC line number is 239=00EFh; BASIC instruction is SYS 2061
347# the above combination appartly also occur for other Commodore programs like: gunzip111.c64.prg
348# and there exist PUCrunch archive for other machines like C16 with other magics
349>0		string	\x01\x08\x0b\x08\xef\x00\x9e\x32\x30\x36\x31	program, probably PUCrunch archive data
350!:mime	application/x-compress-pucrunch
351!:ext	prg/pck
352>0		string	!\x01\x08\x0b\x08\xef\x00\x9e\x32\x30\x36\x31	program
353!:mime	application/x-commodore-exec
354!:ext	prg/
355# start address like: 801h
356>0		uleshort	!0x0801	\b, start address %#4.4x
357# 1st BASIC fragment
358>2		use		basic-line
359# jump to 1 byte before next BASIC fragment; this must be zero-byte marking the end of line
360>(2.s-0x800)	ubyte		x
361>>&-1		ubyte		!0	\b, no EOL=%#x
362# valid 2nd BASIC fragment found only in sELF-ExTRACTING-zIP executable unzp6420.prg
363>>23		search/30	\323ELF-E\330TRACTING-\332IP
364# jump again from beginning
365>>>(2.s-0x800)	ubyte		x
366>>>>&0		use		basic-line
367# Zero-byte marking the end of the BASIC line
368>-3		ubyte		!0	\b, 3 last bytes %#2.2x
369# Two zero-bytes in place of the pointer to next BASIC line indicates the end of the program
370>>-2		ubeshort	x	\b%4.4x
371# display information about tokenized C64 BASIC program (memory address, line number, token)
3720	name	c64-prg
373>0		uleshort	x	Commodore C64 BASIC program
374!:mime	application/x-commodore-basic
375# Tokenized BASIC programs were stored by Commodore as file type program "PRG" in separate field in directory structures.
376# So file name can have no suffix like in saveroms; When transferring to other platforms, they are often saved with .prg extensions.
377# BAS suffix is typically used for the BASIC source but also found in program pods.bas
378!:ext	prg/bas/
379# start address like: 801h
380>0		uleshort	!0x0801	\b, start address %#4.4x
381# 1st BASIC fragment
382>2		use		basic-line
383# jump to 1 byte before next BASIC fragment; this must be zero-byte marking the end of line
384>(2.s-0x0800)	ubyte		x
385>>&-1		ubyte		!0	\b, no EOL=%#x
386# 2nd BASIC fragment
387>>&0		use		basic-line
388# zero-byte marking the end of the BASIC line
389>-3		ubyte		!0	\b, 3 last bytes %#2.2x
390# Two zero-bytes in place of the pointer to next BASIC line indicates the end of the program
391>>-2		ubeshort	x	\b%4.4x
392# Summary:	binary executable or Basic program for Commodore C128 computers
393# URL:		https://en.wikipedia.org/wiki/Commodore_128
394# Reference:	http://mark0.net/download/triddefs_xml.7z/defs/p/prg-c128.trid.xml
395# From:		Joerg Jenderek
396# Note:		Commodore 128 BASIC 7.0 variant; there exist varaints with different start addresses
3970		leshort		0x1C01
398!:strength	+1
399# 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
400# probably skip SVr3 curses images with "invalid high" second line offset
401>2		uleshort	<0x1D02
402# skip foo with "invalid low" second line offset
403>>2		uleshort	>0x1C06
404# if first token is not SYS this implies BASIC program
405>>>6		ubyte		!0x9e
406>>>>0			use	c128-prg
407# if first token is SYS this implies binary executable
408>>>6		ubyte		=0x9e
409>>>>0		use		c128-exe
410# Summary:	binary executable or Basic program for Commodore C128 computers
411# Note:		Commodore 128 BASIC 7.1 extension by Rick Simon
412# start adress 132Dh
413#0		leshort		0x132D	THIS_IS_C128_7.1
414#>0			use	c128-prg
415# Summary:	binary executable or Basic program for Commodore C128 computers
416# Note:		Commodore 128 BASIC 7.0 saved with graphics mode enabled
417# start adress 4001h
418#0		leshort		0x4001	THIS_IS_C128_GRAPHIC
419#>0			use	c128-prg
420# display information about tokenized C128 BASIC program (memory address, line number, token)
4210	name	c128-prg
422>0		uleshort	x	Commodore C128 BASIC program
423!:mime	application/x-commodore-basic
424!:ext	prg
425# start address like: 1C01h
426>0		uleshort	!0x1C01	\b, start address %#4.4x
427# 1st BASIC fragment
428>2		use		basic-line
429# jump to 1 byte before next BASIC fragment; this must be zero-byte marking the end of line
430>(2.s-0x1C00)	ubyte		x
431>>&-1		ubyte		!0	\b, no EOL=%#x
432# 2nd BASIC fragment
433>>&0		use		basic-line
434# Zero-byte marking the end of the BASIC line
435>-3		ubyte		!0	\b, 3 last bytes %#2.2x
436# Two zero-bytes in place of the pointer to next BASIC line indicates the end of the program
437>>-2		ubeshort	x	\b%4.4x
438# display information about C128 program (memory address, line number, token)
4390	name	c128-exe
440>0		uleshort	x	Commodore C128 program
441!:mime	application/x-commodore-exec
442!:ext	prg/
443# start address like: 1C01h
444>0		uleshort	!0x1C01	\b, start address %#4.4x
445# 1st BASIC fragment
446>2		use		basic-line
447# jump to 1 byte before next BASIC fragment; this must be zero-byte marking the end of line
448>(2.s-0x1C00)	ubyte		x
449>>&-1		ubyte		!0	\b, no EOL=%#x
450# no valid 2nd BASIC fragment in Commodore executables
451#>>&0		use		basic-line
452# Zero-byte marking the end of the BASIC line
453>-3		ubyte		!0	\b, 3 last bytes %#2.2x
454# Two zero-bytes in place of the pointer to next BASIC line indicates the end of the program
455>>-2		ubeshort	x	\b%4.4x
456# Summary:	binary executable or Basic program for Commodore C16/VIC-20/Plus4 computers
457# URL:		https://en.wikipedia.org/wiki/Commodore_Plus/4
458# Reference:	http://mark0.net/download/triddefs_xml.7z/defs/p/prg-vic20.trid.xml
459#		defs/p/prg-plus4.trid.xml
460# From:		Joerg Jenderek
461# Note:		there exist VIC-20 variants with different start address
462# GRR: line below is too generic because it matches Novell LANalyzer capture
463# with regular trace header record handled by ./sniffer
4640		leshort		0x1001
465# skip regular Novell LANalyzer capture (novell-2.tr1 novell-lanalyzer.tr1 novell-win10.tr1) with "invalid low" token value 54h
466>6		ubyte		>0x7F
467# skip regular Novell LANalyzer capture (novell-2.tr1 novell-lanalyzer.tr1 novell-win10.tr1) with "invalid low" second line offset 4Ch
468#>>2		uleshort	>0x1006	OFFSET_NOT_TOO_LOW
469# skip foo with "invalid high" second line offset but not for 0x123b (Minefield.prg)
470#>>>2		uleshort	<0x1102	OFFSET_NOT_TOO_HIGH
471# if first token is not SYS this implies BASIC program
472>>6		ubyte		!0x9e
473# valid second end of line separator implies BASIC program
474>>>(2.s-0x1000)		ubyte	=0
475>>>>0			use	c16-prg
476# invalid second end of line separator !=0 implies binary executable like: Minefield.prg
477>>>(2.s-0x1000)		ubyte	!0
478>>>>0			use	c16-exe
479# if first token is SYS this implies binary executable
480>>6		ubyte		=0x9e
481>>>0		use		c16-exe
482# display information about C16 program (memory address, line number, token)
4830	name	c16-exe
484>0		uleshort	x	Commodore C16/VIC-20/Plus4 program
485!:mime	application/x-commodore-exec
486!:ext	prg/
487# start address like: 1001h
488>0		uleshort	!0x1001	\b, start address %#4.4x
489# 1st BASIC fragment
490>2		use		basic-line
491# jump to 1 byte before next BASIC fragment; this must be zero-byte marking the end of line
492>(2.s-0x1000)	ubyte		x
493>>&-1		ubyte		!0	\b, no EOL=%#x
494# no valid 2nd BASIC fragment in excutables
495#>>&0		use		basic-line
496# Zero-byte marking the end of the BASIC line
497>-3		ubyte		!0	\b, 3 last bytes %#2.2x
498# Two zero-bytes in place of the pointer to next BASIC line indicates the end of the program
499>>-2		ubeshort	x	\b%4.4x
500# display information about tokenized C16 BASIC program (memory address, line number, token)
5010	name	c16-prg
502>0		uleshort	x	Commodore C16/VIC-20/Plus4 BASIC program
503!:mime	application/x-commodore-basic
504!:ext	prg
505# start address like: 1001h
506>0		uleshort	!0x1001	\b, start address %#4.4x
507# 1st BASIC fragment
508>2		use		basic-line
509# jump to 1 byte before next BASIC fragment; this must be zero-byte marking the end of line
510>(2.s-0x1000)	ubyte		x
511>>&-1		ubyte		!0	\b, no EOL=%#x
512# 2nd BASIC fragment
513>>&0		use		basic-line
514# Zero-byte marking the end of the BASIC line
515>-3		ubyte		!0	\b, 3 last bytes %#2.2x
516# Two zero-bytes in place of the pointer to next BASIC line indicates the end of the program
517>>-2		ubeshort	x	\b%4.4x
518# Summary:	binary executable or Basic program for Commodore VIC-20 computer with 8K RAM expansion
519# URL:		https://en.wikipedia.org/wiki/VIC-20
520# Reference:	http://mark0.net/download/triddefs_xml.7z/defs/p/prg-vic20-8k.trid.xml
521# From:		Joerg Jenderek
522# Note:		Basic v2.0 with Basic v4.0 extension (VIC20); there exist VIC-20 variants with different start addresses
523# start adress 1201h
5240		leshort		0x1201
525# if first token is not SYS this implies BASIC program
526>6		ubyte		!0x9e
527>>0		use		vic-prg
528# if first token is SYS this implies binary executable
529>6		ubyte		=0x9e
530>>0		use		vic-exe
531# display information about Commodore VIC-20 BASIC+8K program (memory address, line number, token)
5320	name	vic-prg
533>0		uleshort	x	Commodore VIC-20 +8K BASIC program
534!:mime	application/x-commodore-basic
535!:ext	prg
536# start address like: 1201h
537>0		uleshort	!0x1201	\b, start address %#4.4x
538# 1st BASIC fragment
539>2		use		basic-line
540# jump to 1 byte before next BASIC fragment; this must be zero-byte marking the end of line
541>(2.s-0x1200)	ubyte		x
542>>&-1		ubyte		!0	\b, no EOL=%#x
543# 2nd BASIC fragment
544>>&0		use		basic-line
545# Zero-byte marking the end of the BASIC line
546>-3		ubyte		!0	\b, 3 last bytes %#2.2x
547# Two zero-bytes in place of the pointer to next BASIC line indicates the end of the program
548>>-2		ubeshort	x	\b%4.4x
549# display information about Commodore VIC-20 +8K program (memory address, line number, token)
5500	name	vic-exe
551>0		uleshort	x	Commodore VIC-20 +8K program
552!:mime	application/x-commodore-exec
553!:ext	prg/
554# start address like: 1201h
555>0		uleshort	!0x1201	\b, start address %#4.4x
556# 1st BASIC fragment
557>2		use		basic-line
558# jump to 1 byte before next BASIC fragment; this must be zero-byte marking the end of line
559>(2.s-0x0400)	ubyte		x
560>>&-1		ubyte		!0	\b, no EOL=%#x
561# no valid 2nd BASIC fragment in excutables
562#>>&0		use		basic-line
563# Zero-byte marking the end of the BASIC line
564>-3		ubyte		!0	\b, 3 last bytes %#2.2x
565# Two zero-bytes in place of the pointer to next BASIC line indicates the end of the program
566>>-2		ubeshort	x	\b%4.4x
567# Summary:	binary executable or Basic program for Commodore PET computers
568# URL:		https://en.wikipedia.org/wiki/Commodore_PET
569# Reference:	http://mark0.net/download/triddefs_xml.7z/defs/p/prg-pet.trid.xml
570# From:		Joerg Jenderek
571# start adress 0401h
5720		leshort		0x0401
573!:strength	+1
574# GRR: line above with strength 51 (50+1) is too generic because it matches TTComp archive data, ASCII, 1K dictionary
575# (strength=48=50-2) handled by ./archive and shared library (strength=50) handled by ./ibm6000
576# skip TTComp archive data, ASCII, 1K dictionary ttcomp-ascii-1k.bin with "invalid high" second line offset 4162h
577>2		uleshort	<0x0502
578# skip foo with "invalid low" second line offset
579#>>2		uleshort	>0x0406	OFFSET_NOT_TOO_LOW
580# skip bar with "invalid end of line"
581#>>>(2.s-0x0400)	ubyte		=0	END_OF_LINE_OK
582# if first token is not SYS this implies BASIC program
583>>6		ubyte		!0x9e
584>>>0		use		pet-prg
585# if first token is SYS this implies binary executable
586>>6		ubyte		=0x9e
587>>>0		use		pet-exe
588# display information about Commodore PET BASIC program (memory address, line number, token)
5890	name	pet-prg
590>0		uleshort	x	Commodore PET BASIC program
591!:mime	application/x-commodore-basic
592!:ext	prg
593# start address like: 0401h
594>0		uleshort	!0x0401	\b, start address %#4.4x
595# 1st BASIC fragment
596>2		use		basic-line
597# jump to 1 byte before next BASIC fragment; this must be zero-byte marking the end of line
598>(2.s-0x0400)	ubyte		x
599# 2nd BASIC fragment
600>>&0		use		basic-line
601# zero-byte marking the end of the BASIC line
602>-3		ubyte		!0	\b, 3 last bytes %#2.2x
603# Two zero-bytes in place of the pointer to next BASIC line indicates the end of the program
604>>-2		ubeshort	x	\b%4.4x
605# display information about Commodore PET program (memory address, line number, token)
6060	name	pet-exe
607>0		uleshort	x	Commodore PET program
608!:mime	application/x-commodore-exec
609!:ext	prg/
610# start address like: 0401h
611>0		uleshort	!0x0401	\b, start address %#4.4x
612# 1st BASIC fragment
613>2		use		basic-line
614# jump to 1 byte before next BASIC fragment; this must be zero-byte marking the end of line
615>(2.s-0x0400)	ubyte		x
616>>&-1		ubyte		!0	\b, no EOL=%#x
617# no valid 2nd BASIC fragment in excutables
618#>>&0		use		basic-line
619# Zero-byte marking the end of the BASIC line
620>-3		ubyte		!0	\b, 3 last bytes %#2.2x
621# Two zero-bytes in place of the pointer to next BASIC line indicates the end of the program
622>>-2		ubeshort	x	\b%4.4x
623# display information about tokenized BASIC line (memory address, line number, Token)
6240	name	basic-line
625# pointer to memory address of beginning of "next" BASIC line
626# greater then previous offset but maximal 100h difference
627>0		uleshort	x	\b, offset %#4.4x
628# offset 0x0000 indicates the end of BASIC program; so bytes afterwards may be some other data
629>0		uleshort	0
630# not line number but first 2 data bytes
631>>2		ubeshort	x	\b, data %#4.4x
632# not token but next 2 data bytes
633>>4		ubeshort	x	\b%4.4x
634# not token arguments but next data bytes
635>>6		ubequad		x 	\b%16.16llx
636>>14		ubequad		x 	\b%16.16llx...
637# like 0x0d20352020204c594e5820495820204259205749 "\r 5   LYNX IX  BY WILL CORLEY" for LyNX archive Darkon.lnx handled by ./archive
638#>>3		string		x 	"%-0.30s"
639>0		uleshort	>0
640# BASIC line number with range from 0 to 65520; practice to increment numbers by some value (5, 10 or 100)
641>>2		uleshort	x	\b, line %u
642# https://www.c64-wiki.com/wiki/BASIC_token
643# The "high-bit" bytes from #128-#254 stood for the various BASIC commands and mathematical operators
644>>4		ubyte		x	\b, token (%#x)
645# https://www.c64-wiki.com/wiki/REM
646>>4		string		\x8f	REM
647# remark string like: ** SYNTHESIZER BY RICOCHET **
648>>>5		string		>\0	%s
649#>>>>&1		uleshort	x	\b, NEXT OFFSET %#4.4x
650# https://www.c64-wiki.com/wiki/PRINT
651>>4		string		\x99	PRINT
652# string like: "Hello world" "\021 \323ELF-E\330TRACTING-\332IP (64 ONLY)\016\231":\2362141
653>>>5		string		x	%s
654#>>>>&0		ubequad		x	AFTER_PRINT=%#16.16llx
655# https://www.c64-wiki.com/wiki/POKE
656>>4		string		\x97	POKE
657# <Memory address>,<number>
658>>>5		regex		\^[0-9,\040]+	%s
659# BASIC command delimiter colon (:=3Ah)
660>>>>&-2		ubyte		=0x3A
661# after BASIC command delimiter colon remaining (<255) other tokenized BASIC commands
662>>>>>&0		string		x		"%s"
663# https://www.c64-wiki.com/wiki/SYS	0x9e=\236
664>>4		string		\x9e	SYS
665# SYS <Address> parameter is a 16-bit unsigned integer; in the range 0 - 65535
666>>>5		regex		\^[0-9]{1,5}	%s
667# maybe followed by spaces, "control-characters" or colon (:) followed by next commnds or in victracker.prg
668# (\302(43)\252256\254\302(44)\25236) /T.L.R/
669#>>>5		string		x	SYS_STRING="%s"
670# https://www.c64-wiki.com/wiki/GOSUB
671>>4		string		\x8d	GOSUB
672# <line>
673>>>5		string		>\0	%s
674