A cross-platform command line tool and Go library to manipulate ProDOS hard drive images used by vintage Apple II computers and emulators.
Go to file
2022-12-27 20:35:28 -05:00
.github/workflows Create go.yaml 2022-01-23 17:04:22 -05:00
prodos Add BASIC import (#12) 2022-12-27 17:24:25 -05:00
.gitignore Add file deletion 2021-06-11 22:43:35 -04:00
build.sh Add binaries 2022-01-04 16:10:53 -05:00
go.mod Initial commit with directory read 2021-06-05 23:22:30 -04:00
LICENSE Initial commit 2021-06-04 13:05:32 -04:00
main.go Remove binaries and update version (#13) 2022-12-27 20:35:28 -05:00
readme.go Change to reader/writer instead of file 2022-01-23 16:58:34 -05:00
README.md Add BASIC import (#12) 2022-12-27 17:24:25 -05:00

ProDOS-Utilities

This project is just starting but is intended to be both a command line tool and library to provide access to ProDOS based hard drive images. It is written in Go to be cross platform (Linux, Windows, macOS etc.). Functionality, naming and parameters are subject to change without notice. This project was started so I would be able to automate writing the firmware file into the drive image for one of my other projects Apple2-IO-RPi.

DISCLAIMER

Being a work in progress, be warned that this code is likely to corrupt drive images so be sure to have backups. Also, command line parameters are likely to change significantly in the future.

How to get it

There are binaries here:

Current TODO list

  1. Allow > 128 KB file support
  2. Create/Delete directories
  3. Add file/directory tests
  4. Add rename
  5. Add in-place file/directory moves

Example commands and output

Specify drive image with -d DRIVEIMAGE (default command lists directory, default path is root of volume)

ProDOS-Utilities -d ~/Downloads/Total\ Replay\ v4.01.hdv

/TOTAL.REPLAY

 NAME           TYPE  BLOCKS  MODIFIED          CREATED            ENDFILE  SUBTYPE

 LAUNCHER.SYSTEM SYS      24  2021-FEB-18 01:25 2021-FEB-18 01:25    11416     8192
 TITLE           BIN      17  2019-JUN-29 13:04 2019-JUN-29 13:04     8184     8192
 COVER           BIN      17  2018-MAY-20 15:03 2018-MAY-20 15:03     8184     8192
 HELP            BIN      17  2019-MAY-20 10:24 2019-MAY-20 10:24     8184     8192
 GAMES.CONF      TXT      16  2021-FEB-18 01:12 2021-FEB-18 01:12     7344    32768
 ATTRACT.CONF    TXT      13  2021-FEB-18 01:22 2021-FEB-18 01:22     5748    32768
 FX.CONF         TXT       6  2021-JAN-03 23:00 2021-JAN-03 23:00     2443    32768
 DFX.CONF        TXT       5  2020-MAY-10 15:29 2020-MAY-10 15:29     1981    32768
 PREFS.CONF      TXT       1  2021-FEB-18 01:25 2021-FEB-18 01:25      512    32768
 CREDITS         TXT       1  2021-FEB-18 01:15 2021-FEB-18 01:15      449    32768
 HELPTEXT        TXT       1  2020-JUN-15 11:56 2020-JUN-15 11:56      206    32768
 DECRUNCH        BIN       1  2020-MAR-14 20:35 2020-MAR-14 20:35      303      512
 JOYSTICK        BIN       6  2020-APR-24 23:07 2020-APR-24 23:07     2370     2048
 FINDER.DATA     $C9       3  2020-JUN-27 17:40 2020-JUN-27 17:40      541        0
 FINDER.ROOT     $C9       1  2020-MAY-24 10:56 2020-MAY-24 10:56        9        0
 TITLE.HGR       DIR      23  2021-FEB-18 01:25 2021-FEB-18 01:25    11776        0
 TITLE.DHGR      DIR       4  2021-FEB-18 01:25 2021-FEB-18 01:25     2048        0
 ACTION.HGR      DIR      58  2021-FEB-18 01:25 2021-FEB-18 01:25    29696        0
 ACTION.DHGR     DIR       9  2021-FEB-18 01:25 2021-FEB-18 01:25     4608        0
 ACTION.GR       DIR       1  2021-FEB-18 01:25 2021-FEB-18 01:25      512        0
 ARTWORK.SHR     DIR      17  2021-FEB-18 01:25 2021-FEB-18 01:25     8704        0
 ATTRACT         DIR      26  2021-FEB-18 01:25 2021-FEB-18 01:25    13312        0
 SS              DIR      16  2021-FEB-18 01:25 2021-FEB-18 01:25     8192        0
 DEMO            DIR      15  2021-FEB-18 01:25 2021-FEB-18 01:25     7680        0
 TITLE.ANIMATED  DIR       1  2021-FEB-18 01:25 2021-FEB-18 01:25      512        0
 ICONS           DIR       1  2021-FEB-18 01:25 2021-FEB-18 01:25      512        0
 FX              DIR      16  2021-FEB-18 01:25 2021-FEB-18 01:25     8192        0
 X               DIR      26  2021-FEB-18 01:25 2021-FEB-18 01:25    13312        0
 PRELAUNCH       DIR      27  2021-FEB-18 01:25 2021-FEB-18 01:25    13824        0
 GAMEHELP        DIR      26  2021-FEB-18 01:25 2021-FEB-18 01:25    13312        0

BLOCKS FREE:    15    BLOCKS USED: 65520      TOTAL BLOCKS: 65535

Specifying -p PATHNAME and -c COMMAND

ProDOS-Utilities -d ~/Downloads/Total\ Replay\ v4.01.hdv -c ls -p /total.replay/icons

/TOTAL.REPLAY/ICONS

 NAME           TYPE  BLOCKS  MODIFIED          CREATED            ENDFILE  SUBTYPE

 TR.ICONS        $CA       8  2020-MAY-24 10:56 2020-MAY-24 10:56     3524        0

BLOCKS FREE:    15    BLOCKS USED: 65520      TOTAL BLOCKS: 65535

Create a new ProDOS hard drive image

ProDOS-Utilities -d new.hdv -c create -b 65535

Hex dump a block with command readblock and block number (both decimal and hexadecimal input work)

ProDOS-Utilities -d new.hdv -c readblock -b 0
Block 0x0000 (0):

0000: 01 38 B0 03 4C 1C 09 78 86 43 C9 03 08 8A 29 70 .80.L..x.CI...)p
0010: 4A 4A 4A 4A 09 C0 85 49 A0 FF 84 48 28 C8 B1 48 JJJJ.@.I ..H(H1H
0020: D0 3A B0 0E A9 03 8D 00 08 E6 3D A5 49 48 A9 5B P:0.)....f=%IH)[
0030: 48 60 85 40 85 48 A0 5E B1 48 99 94 09 C8 C0 EB H`.@.H ^1H...H@k
0040: D0 F6 A2 06 BC 32 09 BD 39 09 99 F2 09 BD 40 09 Pv".<2.=9..r.=@.
0050: 9D 7F 0A CA 10 EE A9 09 85 49 A9 86 A0 00 C9 F9 ...J.n)..I). .Iy
0060: B0 2F 85 48 84 60 84 4A 84 4C 84 4E 84 47 C8 84 0/.H.`.J.L.N.GH.
0070: 42 C8 84 46 A9 0C 85 61 85 4B 20 27 09 B0 66 E6 BH.F)..a.K '.0ff
0080: 61 E6 61 E6 46 A5 46 C9 06 90 EF AD 00 0C 0D 01 afafF%FI..o-....
0090: 0C D0 52 A9 04 D0 02 A5 4A 18 6D 23 0C A8 90 0D .PR).P.%J.m#.(..
00A0: E6 4B A5 4B 4A B0 06 C9 0A F0 71 A0 04 84 4A AD fK%KJ0.I.pq ..J-
00B0: 20 09 29 0F A8 B1 4A D9 20 09 D0 DB 88 10 F6 A0  .).(1JY .P[..v 
00C0: 16 B1 4A 4A 6D 1F 09 8D 1F 09 A0 11 B1 4A 85 46 .1JJm..... .1J.F
00D0: C8 B1 4A 85 47 A9 00 85 4A A0 1E 84 4B 84 61 C8 H1J.G)..J ..K.aH
00E0: 84 4D 20 27 09 B0 35 E6 61 E6 61 A4 4E E6 4E B1 .M '.05fafa$NfN1
00F0: 4A 85 46 B1 4C 85 47 11 4A D0 18 A2 01 A9 00 A8 J.F1L.G.JP.".).(
0100: 91 60 C8 D0 FB E6 61 EA EA CA 10 F4 CE 1F 09 F0 .`HP{fajjJ.tN..p
0110: 07 D0 D8 CE 1F 09 D0 CA 58 4C 00 20 4C 47 09 02 .PXN..PJXL. LG..
0120: 26 50 52 4F 44 4F 53 A5 60 85 44 A5 61 85 45 6C &PRODOS%`.D%a.El
0130: 48 00 08 1E 24 3F 45 47 76 F4 D7 D1 B6 4B B4 AC H...$?EGvtWQ6K4,
0140: A6 2B 18 60 4C BC 09 20 58 FC A0 14 B9 58 09 99 &+.`L<. X| .9X..
0150: B1 05 88 10 F7 4C 55 09 D5 CE C1 C2 CC C5 A0 D4 1...wLU.UNABLE T
0160: CF A0 CC CF C1 C4 A0 D0 D2 CF C4 CF D3 A5 53 29 O LOAD PRODOS%S)
0170: 03 2A 05 2B AA BD 80 C0 A9 2C A2 11 CA D0 FD E9 .*.+*=.@),".JP}i
0180: 01 D0 F7 A6 2B 60 A5 46 29 07 C9 04 29 03 08 0A .Pw&+`%F).I.)...
0190: 28 2A 85 3D A5 47 4A A5 46 6A 4A 4A 85 41 0A 85 (*.=%GJ%FjJJ.A..
01A0: 51 A5 45 85 27 A6 2B BD 89 C0 20 BC 09 E6 27 E6 Q%E.'&+=.@ <.f'f
01B0: 3D E6 3D B0 03 20 BC 09 BC 88 C0 60 A5 40 0A 85 =f=0. <.<.@`%@..
01C0: 53 A9 00 85 54 A5 53 85 50 38 E5 51 F0 14 B0 04 S)..T%S.P8eQp.0.
01D0: E6 53 90 02 C6 53 38 20 6D 09 A5 50 18 20 6F 09 fS..FS8 m.%P. o.
01E0: D0 E3 A0 7F 84 52 08 28 38 C6 52 F0 CE 18 08 88 Pc ..R.(8FRpN...
01F0: F0 F5 00 00 00 00 00 00 00 00 00 00 00 00 00 00 pu..............

Export files (using .bas file extension coverts Applesoft to text file)

ProDOS-Utilities -d ../Apple2-IO-RPi/RaspberryPi/Apple2-IO-RPi.hdv -c get -o Update.Firmware.bas -p /APPLE2.IO.RPI/UPDATE.FIRMWARE; cat Update.Firmware.bas
10  HOME 
100  PRINT  CHR$ (4)"BLOAD AT28C64B.BIN,A$2000"
200  PRINT "Program the firmare in slot #"
300  INPUT SL
400 FW = 8192 + 256 * SL: REM  Firmware source 
500 PS = 49287 + SL * 16: REM  Firmware page selection
600 EP = 49152 + SL * 256: REM  EPROM location
900  HOME 
1000  FOR PG = 0 TO 3
1004  PRINT : PRINT 
1005  PRINT "Writing page "PG" to slot "SL"
1006  PRINT "_______________________________________"
1007  PRINT "_______________________________________";
1008  HTAB 1
1010  POKE PS,PG * 16 + 15: REM  Set firmware page
1020  FOR X = 0 TO 255
1030 A =  PEEK (FW + PG * 2048 + X)
1040  POKE EP + X,A
1041 B =  PEEK (EP + X)
1042  IF (B <  > A) THEN  GOTO 1041
1045  HTAB (X / 256) * 39 + 1
1046  INVERSE : PRINT " ";: NORMAL 
1050  NEXT X
1060  NEXT PG
1900  PRINT 
2000  PRINT "Firmware Update Complete"