#------------------------------------------------------------------------------ # $File: c64,v 1.13 2022/11/21 22:25:37 christos Exp $ # c64: file(1) magic for various commodore 64 related files # # From: Dirk Jagdmann 0x16500 belong 0x12014100 D64 Image 0x16500 belong 0x12014180 D71 Image 0x61800 belong 0x28034400 D81 Image 0 belong 0x43154164 X64 Image # C64 (and other CBM) cartridges # Extended by David Korth # Reference: https://vice-emu.sourceforge.io/vice_17.html#SEC391 0 string C64\40CARTRIDGE Commodore 64 cartridge >0x20 ubyte 0 \b, >0x20 ubyte !0 >>0x20 string/T x \b: "%.32s", >0x16 beshort 0 >>0x18 beshort 0x0000 16 KB game >>0x18 beshort 0x0001 8 KB game >>0x18 beshort 0x0100 UltiMax mode >>0x18 beshort 0x0101 RAM/disabled >0x16 beshort 1 Action Replay >0x16 beshort 2 KCS Power Cartridge >0x16 beshort 3 Final Cartridge III >0x16 beshort 4 Simons' BASIC >0x16 beshort 5 Ocean type 1 >0x16 beshort 6 Expert Cartridge >0x16 beshort 7 Fun Play, Power Play >0x16 beshort 8 Super Games >0x16 beshort 9 Atomic Power >0x16 beshort 10 Epyx Fastload >0x16 beshort 11 Westermann Learning >0x16 beshort 12 Rex Utility >0x16 beshort 13 Final Cartridge I >0x16 beshort 14 Magic Formel >0x16 beshort 15 C64 Game System, System 3 >0x16 beshort 16 Warp Speed >0x16 beshort 17 Dinamic >0x16 beshort 18 Zaxxon / Super Zaxxon (Sega) >0x16 beshort 19 Magic Desk, Domark, HES Australia >0x16 beshort 20 Super Snapshot V5 >0x16 beshort 21 Comal-80 >0x16 beshort 22 Structured BASIC >0x16 beshort 23 Ross >0x16 beshort 24 Dela EP64 >0x16 beshort 25 Dela EP7x8 >0x16 beshort 26 Dela EP256 >0x16 beshort 27 Rex EP256 >0x16 beshort 28 Mikro Assembler >0x16 beshort 29 Final Cartridge Plus >0x16 beshort 30 Action Replay 4 >0x16 beshort 31 Stardos >0x16 beshort 32 EasyFlash >0x16 beshort 33 EasyFlash Xbank >0x16 beshort 34 Capture >0x16 beshort 35 Action Replay 3 >0x16 beshort 36 >>0x1A ubyte 1 Nordic Replay >>0x1A ubyte !1 Retro Replay >0x16 beshort 37 MMC64 >0x16 beshort 38 MMC Replay >0x16 beshort 39 IDE64 >0x16 beshort 40 Super Snapshot V4 >0x16 beshort 41 IEEE-488 >0x16 beshort 42 Game Killer >0x16 beshort 43 Prophet64 >0x16 beshort 44 EXOS >0x16 beshort 45 Freeze Frame >0x16 beshort 46 Freeze Machine >0x16 beshort 47 Snapshot64 >0x16 beshort 48 Super Explode V5.0 >0x16 beshort 49 Magic Voice >0x16 beshort 50 Action Replay 2 >0x16 beshort 51 MACH 5 >0x16 beshort 52 Diashow-Maker >0x16 beshort 53 Pagefox >0x16 beshort 54 Kingsoft >0x16 beshort 55 Silverrock 128K Cartridge >0x16 beshort 56 Formel 64 >0x16 beshort 57 >>0x1A ubyte 1 Hucky >>0x1A ubyte !1 RGCD >0x16 beshort 58 RR-Net MK3 >0x16 beshort 59 EasyCalc >0x16 beshort 60 GMod2 >0x16 beshort 61 MAX Basic >0x16 beshort 62 GMod3 >0x16 beshort 63 ZIPP-CODE 48 >0x16 beshort 64 Blackbox V8 >0x16 beshort 65 Blackbox V3 >0x16 beshort 66 Blackbox V4 >0x16 beshort 67 REX RAM-Floppy >0x16 beshort 68 BIS-Plus >0x16 beshort 69 SD-BOX >0x16 beshort 70 MultiMAX >0x16 beshort 71 Blackbox V9 >0x16 beshort 72 Lt. Kernal Host Adaptor >0x16 beshort 73 RAMLink >0x16 beshort 74 H.E.R.O. >0x16 beshort 75 IEEE Flash! 64 >0x16 beshort 76 Turtle Graphics II >0x16 beshort 77 Freeze Frame MK2 0 string C128\40CARTRIDGE Commodore 128 cartridge >0x20 ubyte 0 \b, >0x20 ubyte !0 >>0x20 string/T x \b: "%.32s", >0x16 beshort 0 generic cartridge >0x16 beshort 1 Warpspeed128 >>0x1A ubyte 1 \b, REU support >>0x1A ubyte 2 \b, REU support, with I/O and ROM banking 0 string CBM2\40CARTRIDGE Commodore CBM-II cartridge >0x20 ubyte !0 >>0x20 string/T x \b: "%.32s" 0 string VIC20\40CARTRIDGE Commodore VIC-20 cartridge >0x20 ubyte 0 \b, >0x20 ubyte !0 >>0x20 string/T x \b: "%.32s", >0x16 beshort 0 generic cartridge >0x16 beshort 1 Mega-Cart >0x16 beshort 2 Behr Bonz >0x16 beshort 3 Vic Flash Plugin >0x16 beshort 4 UltiMem >0x16 beshort 5 Final Expansion 0 string PLUS4\40CARTRIDGE Commodore 16/Plus4 cartridge >0x20 ubyte !0 >>0x20 string/T x \b: "%.32s" # DreamLoad archives see: # https://www.lemon64.com/forum/viewtopic.php?t=37415\ # &sid=494dc2ca91289e05dadf80a7f8a968fe (at the bottom). # https://www.c64-wiki.com/wiki/DreamLoad. # Example HVSC Commodore 64 music collection: # https://kohina.duckdns.org/HVSC/C64Music/10_Years_HVSC.dfi 0 byte 0 >1 string DREAMLOAD\40FILE\40ARCHIVE >>0x17 byte 0 DFI Image >>>0x1a leshort x version: %d. >>>0x18 leshort x \b%d >>>0x1c lelong x tracks: %d 0 string GCR-1541 GCR Image >8 byte x version: %i >9 byte x tracks: %i 9 string PSUR ARC archive (c64) 2 string -LH1- LHA archive (c64) 0 string C64File PC64 Emulator file >8 string >\0 "%s" 0 string C64Image PC64 Freezer Image 0 beshort 0x38CD C64 PCLink Image 0 string CBM\144\0\0 Power 64 C64 Emulator Snapshot 0 belong 0xFF424CFF WRAptor packer (c64) 0 string C64S\x20tape\x20file T64 tape Image >32 leshort x Version:%#x >36 leshort !0 Entries:%i >40 string x Name:%.24s 0 string C64\x20tape\x20image\x20file\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0 T64 tape Image >32 leshort x Version:%#x >36 leshort !0 Entries:%i >40 string x Name:%.24s 0 string C64S\x20tape\x20image\x20file\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0 T64 tape Image >32 leshort x Version:%#x >36 leshort !0 Entries:%i >40 string x Name:%.24s # Raw tape file format (.tap files) # Esa Hyyti 0 string C64-TAPE-RAW C64 Raw Tape File (.tap), >0x0c byte x Version:%u, >0x10 lelong x Length:%u cycles # magic for Goattracker2, http://covertbitops.c64.org/ # from Alex Myczko 0 string GTS5 GoatTracker 2 song >4 string >\0 \b, "%s" >36 string >\0 \b by %s >68 string >\0 \b (C) %s >100 byte >0 \b, %u subsong(s) # CBM BASIC (cc65 compiled) # Summary: binary executable or Basic program for Commodore C64 computers # Update: Joerg Jenderek # URL: http://fileformats.archiveteam.org/wiki/Commodore_BASIC_tokenized_file # Reference: https://www.c64-wiki.com/wiki/BASIC_token # https://github.com/thezerobit/bastext/blob/master/bastext.doc # http://mark0.net/download/triddefs_xml.7z/defs/p/prg-c64.trid.xml # TODO: unify Commodore BASIC/program sub routines # Note: "PUCrunch archive data" moved from ./archive and merged with c64-exe 0 leshort 0x0801 # if first token is not SYS this implies BASIC program in most cases >6 ubyte !0x9e # but sELF-ExTRACTING-zIP executable unzp6420.prg contains SYS token at end of second BASIC line (at 0x35) >>23 search/30 \323ELF-E\330TRACTING-\332IP >>>0 use c64-exe >>23 default x >>>0 use c64-prg # if first token is SYS this implies binary executable >6 ubyte =0x9e >>0 use c64-exe # display information about C64 binary executable (memory address, line number, token) 0 name c64-exe >0 uleshort x Commodore C64 # http://a1bert.kapsi.fi/Dev/pucrunch/ # start address 0801h; next offset 080bh; BASIC line number is 239=00EFh; BASIC instruction is SYS 2061 # the above combination appartly also occur for other Commodore programs like: gunzip111.c64.prg # and there exist PUCrunch archive for other machines like C16 with other magics >0 string \x01\x08\x0b\x08\xef\x00\x9e\x32\x30\x36\x31 program, probably PUCrunch archive data !:mime application/x-compress-pucrunch !:ext prg/pck >0 string !\x01\x08\x0b\x08\xef\x00\x9e\x32\x30\x36\x31 program !:mime application/x-commodore-exec !:ext prg/ # start address like: 801h >0 uleshort !0x0801 \b, start address %#4.4x # 1st BASIC fragment >2 use basic-line # jump to 1 byte before next BASIC fragment; this must be zero-byte marking the end of line >(2.s-0x800) ubyte x >>&-1 ubyte !0 \b, no EOL=%#x # valid 2nd BASIC fragment found only in sELF-ExTRACTING-zIP executable unzp6420.prg >>23 search/30 \323ELF-E\330TRACTING-\332IP # jump again from beginning >>>(2.s-0x800) ubyte x >>>>&0 use basic-line # Zero-byte marking the end of the BASIC line >-3 ubyte !0 \b, 3 last bytes %#2.2x # Two zero-bytes in place of the pointer to next BASIC line indicates the end of the program >>-2 ubeshort x \b%4.4x # display information about tokenized C64 BASIC program (memory address, line number, token) 0 name c64-prg >0 uleshort x Commodore C64 BASIC program !:mime application/x-commodore-basic # Tokenized BASIC programs were stored by Commodore as file type program "PRG" in separate field in directory structures. # So file name can have no suffix like in saveroms; When transferring to other platforms, they are often saved with .prg extensions. # BAS suffix is typically used for the BASIC source but also found in program pods.bas !:ext prg/bas/ # start address like: 801h >0 uleshort !0x0801 \b, start address %#4.4x # 1st BASIC fragment >2 use basic-line # jump to 1 byte before next BASIC fragment; this must be zero-byte marking the end of line >(2.s-0x0800) ubyte x >>&-1 ubyte !0 \b, no EOL=%#x # 2nd BASIC fragment >>&0 use basic-line # zero-byte marking the end of the BASIC line >-3 ubyte !0 \b, 3 last bytes %#2.2x # Two zero-bytes in place of the pointer to next BASIC line indicates the end of the program >>-2 ubeshort x \b%4.4x # Summary: binary executable or Basic program for Commodore C128 computers # URL: https://en.wikipedia.org/wiki/Commodore_128 # Reference: http://mark0.net/download/triddefs_xml.7z/defs/p/prg-c128.trid.xml # From: Joerg Jenderek # Note: Commodore 128 BASIC 7.0 variant; there exist varaints with different start addresses 0 leshort 0x1C01 !:strength +1 # 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 # probably skip SVr3 curses images with "invalid high" second line offset >2 uleshort <0x1D02 # skip foo with "invalid low" second line offset >>2 uleshort >0x1C06 # if first token is not SYS this implies BASIC program >>>6 ubyte !0x9e >>>>0 use c128-prg # if first token is SYS this implies binary executable >>>6 ubyte =0x9e >>>>0 use c128-exe # Summary: binary executable or Basic program for Commodore C128 computers # Note: Commodore 128 BASIC 7.1 extension by Rick Simon # start adress 132Dh #0 leshort 0x132D THIS_IS_C128_7.1 #>0 use c128-prg # Summary: binary executable or Basic program for Commodore C128 computers # Note: Commodore 128 BASIC 7.0 saved with graphics mode enabled # start adress 4001h #0 leshort 0x4001 THIS_IS_C128_GRAPHIC #>0 use c128-prg # display information about tokenized C128 BASIC program (memory address, line number, token) 0 name c128-prg >0 uleshort x Commodore C128 BASIC program !:mime application/x-commodore-basic !:ext prg # start address like: 1C01h >0 uleshort !0x1C01 \b, start address %#4.4x # 1st BASIC fragment >2 use basic-line # jump to 1 byte before next BASIC fragment; this must be zero-byte marking the end of line >(2.s-0x1C00) ubyte x >>&-1 ubyte !0 \b, no EOL=%#x # 2nd BASIC fragment >>&0 use basic-line # Zero-byte marking the end of the BASIC line >-3 ubyte !0 \b, 3 last bytes %#2.2x # Two zero-bytes in place of the pointer to next BASIC line indicates the end of the program >>-2 ubeshort x \b%4.4x # display information about C128 program (memory address, line number, token) 0 name c128-exe >0 uleshort x Commodore C128 program !:mime application/x-commodore-exec !:ext prg/ # start address like: 1C01h >0 uleshort !0x1C01 \b, start address %#4.4x # 1st BASIC fragment >2 use basic-line # jump to 1 byte before next BASIC fragment; this must be zero-byte marking the end of line >(2.s-0x1C00) ubyte x >>&-1 ubyte !0 \b, no EOL=%#x # no valid 2nd BASIC fragment in Commodore executables #>>&0 use basic-line # Zero-byte marking the end of the BASIC line >-3 ubyte !0 \b, 3 last bytes %#2.2x # Two zero-bytes in place of the pointer to next BASIC line indicates the end of the program >>-2 ubeshort x \b%4.4x # Summary: binary executable or Basic program for Commodore C16/VIC-20/Plus4 computers # URL: https://en.wikipedia.org/wiki/Commodore_Plus/4 # Reference: http://mark0.net/download/triddefs_xml.7z/defs/p/prg-vic20.trid.xml # defs/p/prg-plus4.trid.xml # From: Joerg Jenderek # Note: there exist VIC-20 variants with different start address # GRR: line below is too generic because it matches Novell LANalyzer capture # with regular trace header record handled by ./sniffer 0 leshort 0x1001 # skip regular Novell LANalyzer capture (novell-2.tr1 novell-lanalyzer.tr1 novell-win10.tr1) with "invalid low" token value 54h >6 ubyte >0x7F # skip regular Novell LANalyzer capture (novell-2.tr1 novell-lanalyzer.tr1 novell-win10.tr1) with "invalid low" second line offset 4Ch #>>2 uleshort >0x1006 OFFSET_NOT_TOO_LOW # skip foo with "invalid high" second line offset but not for 0x123b (Minefield.prg) #>>>2 uleshort <0x1102 OFFSET_NOT_TOO_HIGH # if first token is not SYS this implies BASIC program >>6 ubyte !0x9e # valid second end of line separator implies BASIC program >>>(2.s-0x1000) ubyte =0 >>>>0 use c16-prg # invalid second end of line separator !=0 implies binary executable like: Minefield.prg >>>(2.s-0x1000) ubyte !0 >>>>0 use c16-exe # if first token is SYS this implies binary executable >>6 ubyte =0x9e >>>0 use c16-exe # display information about C16 program (memory address, line number, token) 0 name c16-exe >0 uleshort x Commodore C16/VIC-20/Plus4 program !:mime application/x-commodore-exec !:ext prg/ # start address like: 1001h >0 uleshort !0x1001 \b, start address %#4.4x # 1st BASIC fragment >2 use basic-line # jump to 1 byte before next BASIC fragment; this must be zero-byte marking the end of line >(2.s-0x1000) ubyte x >>&-1 ubyte !0 \b, no EOL=%#x # no valid 2nd BASIC fragment in excutables #>>&0 use basic-line # Zero-byte marking the end of the BASIC line >-3 ubyte !0 \b, 3 last bytes %#2.2x # Two zero-bytes in place of the pointer to next BASIC line indicates the end of the program >>-2 ubeshort x \b%4.4x # display information about tokenized C16 BASIC program (memory address, line number, token) 0 name c16-prg >0 uleshort x Commodore C16/VIC-20/Plus4 BASIC program !:mime application/x-commodore-basic !:ext prg # start address like: 1001h >0 uleshort !0x1001 \b, start address %#4.4x # 1st BASIC fragment >2 use basic-line # jump to 1 byte before next BASIC fragment; this must be zero-byte marking the end of line >(2.s-0x1000) ubyte x >>&-1 ubyte !0 \b, no EOL=%#x # 2nd BASIC fragment >>&0 use basic-line # Zero-byte marking the end of the BASIC line >-3 ubyte !0 \b, 3 last bytes %#2.2x # Two zero-bytes in place of the pointer to next BASIC line indicates the end of the program >>-2 ubeshort x \b%4.4x # Summary: binary executable or Basic program for Commodore VIC-20 computer with 8K RAM expansion # URL: https://en.wikipedia.org/wiki/VIC-20 # Reference: http://mark0.net/download/triddefs_xml.7z/defs/p/prg-vic20-8k.trid.xml # From: Joerg Jenderek # Note: Basic v2.0 with Basic v4.0 extension (VIC20); there exist VIC-20 variants with different start addresses # start adress 1201h 0 leshort 0x1201 # if first token is not SYS this implies BASIC program >6 ubyte !0x9e >>0 use vic-prg # if first token is SYS this implies binary executable >6 ubyte =0x9e >>0 use vic-exe # display information about Commodore VIC-20 BASIC+8K program (memory address, line number, token) 0 name vic-prg >0 uleshort x Commodore VIC-20 +8K BASIC program !:mime application/x-commodore-basic !:ext prg # start address like: 1201h >0 uleshort !0x1201 \b, start address %#4.4x # 1st BASIC fragment >2 use basic-line # jump to 1 byte before next BASIC fragment; this must be zero-byte marking the end of line >(2.s-0x1200) ubyte x >>&-1 ubyte !0 \b, no EOL=%#x # 2nd BASIC fragment >>&0 use basic-line # Zero-byte marking the end of the BASIC line >-3 ubyte !0 \b, 3 last bytes %#2.2x # Two zero-bytes in place of the pointer to next BASIC line indicates the end of the program >>-2 ubeshort x \b%4.4x # display information about Commodore VIC-20 +8K program (memory address, line number, token) 0 name vic-exe >0 uleshort x Commodore VIC-20 +8K program !:mime application/x-commodore-exec !:ext prg/ # start address like: 1201h >0 uleshort !0x1201 \b, start address %#4.4x # 1st BASIC fragment >2 use basic-line # jump to 1 byte before next BASIC fragment; this must be zero-byte marking the end of line >(2.s-0x0400) ubyte x >>&-1 ubyte !0 \b, no EOL=%#x # no valid 2nd BASIC fragment in excutables #>>&0 use basic-line # Zero-byte marking the end of the BASIC line >-3 ubyte !0 \b, 3 last bytes %#2.2x # Two zero-bytes in place of the pointer to next BASIC line indicates the end of the program >>-2 ubeshort x \b%4.4x # Summary: binary executable or Basic program for Commodore PET computers # URL: https://en.wikipedia.org/wiki/Commodore_PET # Reference: http://mark0.net/download/triddefs_xml.7z/defs/p/prg-pet.trid.xml # From: Joerg Jenderek # start adress 0401h 0 leshort 0x0401 !:strength +1 # GRR: line above with strength 51 (50+1) is too generic because it matches TTComp archive data, ASCII, 1K dictionary # (strength=48=50-2) handled by ./archive and shared library (strength=50) handled by ./ibm6000 # skip TTComp archive data, ASCII, 1K dictionary ttcomp-ascii-1k.bin with "invalid high" second line offset 4162h >2 uleshort <0x0502 # skip foo with "invalid low" second line offset #>>2 uleshort >0x0406 OFFSET_NOT_TOO_LOW # skip bar with "invalid end of line" #>>>(2.s-0x0400) ubyte =0 END_OF_LINE_OK # if first token is not SYS this implies BASIC program >>6 ubyte !0x9e >>>0 use pet-prg # if first token is SYS this implies binary executable >>6 ubyte =0x9e >>>0 use pet-exe # display information about Commodore PET BASIC program (memory address, line number, token) 0 name pet-prg >0 uleshort x Commodore PET BASIC program !:mime application/x-commodore-basic !:ext prg # start address like: 0401h >0 uleshort !0x0401 \b, start address %#4.4x # 1st BASIC fragment >2 use basic-line # jump to 1 byte before next BASIC fragment; this must be zero-byte marking the end of line >(2.s-0x0400) ubyte x # 2nd BASIC fragment >>&0 use basic-line # zero-byte marking the end of the BASIC line >-3 ubyte !0 \b, 3 last bytes %#2.2x # Two zero-bytes in place of the pointer to next BASIC line indicates the end of the program >>-2 ubeshort x \b%4.4x # display information about Commodore PET program (memory address, line number, token) 0 name pet-exe >0 uleshort x Commodore PET program !:mime application/x-commodore-exec !:ext prg/ # start address like: 0401h >0 uleshort !0x0401 \b, start address %#4.4x # 1st BASIC fragment >2 use basic-line # jump to 1 byte before next BASIC fragment; this must be zero-byte marking the end of line >(2.s-0x0400) ubyte x >>&-1 ubyte !0 \b, no EOL=%#x # no valid 2nd BASIC fragment in excutables #>>&0 use basic-line # Zero-byte marking the end of the BASIC line >-3 ubyte !0 \b, 3 last bytes %#2.2x # Two zero-bytes in place of the pointer to next BASIC line indicates the end of the program >>-2 ubeshort x \b%4.4x # display information about tokenized BASIC line (memory address, line number, Token) 0 name basic-line # pointer to memory address of beginning of "next" BASIC line # greater then previous offset but maximal 100h difference >0 uleshort x \b, offset %#4.4x # BASIC line number with range from 0 to 65520; practice to increment numbers by some value (5, 10 or 100) >2 uleshort x \b, line %u # https://www.c64-wiki.com/wiki/BASIC_token # The "high-bit" bytes from #128-#254 stood for the various BASIC commands and mathematical operators >4 ubyte x \b, token (%#x) # https://www.c64-wiki.com/wiki/REM >4 string \x8f REM # remark string like: ** SYNTHESIZER BY RICOCHET ** >>5 string >\0 %s #>>>&1 uleshort x \b, NEXT OFFSET %#4.4x # https://www.c64-wiki.com/wiki/PRINT >4 string \x99 PRINT # string like: "Hello world" "\021 \323ELF-E\330TRACTING-\332IP (64 ONLY)\016\231":\2362141 >>5 string x %s #>>>&0 ubequad x AFTER_PRINT=%#16.16llx # https://www.c64-wiki.com/wiki/POKE >4 string \x97 POKE # , >>5 regex \^[0-9,\040]+ %s # https://www.c64-wiki.com/wiki/SYS 0x9e=\236 >4 string \x9e SYS # SYS
parameter is a 16-bit unsigned integer; in the range 0 - 65535 >>5 regex \^[0-9]{1,5} %s # maybe followed by spaces, "control-characters" or colon (:) followed by next commnds or in victracker.prg # (\302(43)\252256\254\302(44)\25236) /T.L.R/ #>>5 string x SYS_STRING="%s" # https://www.c64-wiki.com/wiki/GOSUB >4 string \x8d GOSUB # >>5 string >\0 %s