├── .gitignore ├── Firmware ├── BlankDriveWithFirmware.po ├── Firmware.asm ├── Firmware.bin ├── Firmware.lst ├── GamesWithFirmware.po ├── Warning.asm ├── Warning.lst └── assemble.sh ├── Hardware ├── Apple II Expansion Edge Connector.kicad_mod ├── BOM.csv ├── ProDOS ROM-Drive Back.jpg ├── ProDOS ROM-Drive Front.jpg ├── ProDOS ROM-Drive-B_Cu.gbr ├── ProDOS ROM-Drive-B_Mask.gbr ├── ProDOS ROM-Drive-B_Silkscreen.gbr ├── ProDOS ROM-Drive-Edge_Cuts.gbr ├── ProDOS ROM-Drive-F_Cu.gbr ├── ProDOS ROM-Drive-F_Mask.gbr ├── ProDOS ROM-Drive-F_Silkscreen.gbr ├── ProDOS ROM-Drive-NPTH.drl ├── ProDOS ROM-Drive-PTH.drl ├── ProDOS ROM-Drive-cache.lib ├── ProDOS ROM-Drive.kicad_pcb ├── ProDOS ROM-Drive.kicad_prl ├── ProDOS ROM-Drive.kicad_pro ├── ProDOS ROM-Drive.kicad_sch ├── ProDOS ROM-Drive.pdf ├── ProDOS ROM-Drive.svg └── fp-info-cache ├── LICENSE └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | *-bak 2 | *.o 3 | *.DS_Store 4 | *-backups 5 | -------------------------------------------------------------------------------- /Firmware/BlankDriveWithFirmware.po: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tjboldt/ProDOS-ROM-Drive/35df9b0dd8a18d8f62cb2f2fbd8cbed274cb1634/Firmware/BlankDriveWithFirmware.po -------------------------------------------------------------------------------- /Firmware/Firmware.asm: -------------------------------------------------------------------------------- 1 | ;i/o ports to write to 2 | writeLatchHigh = $C081 3 | writeLatchLow = $C080 4 | 5 | ;ProDOS defines 6 | command = $42 ;ProDOS command 7 | unit = $43 ;7=drive 6-4=slot 3-0=not used 8 | buflo = $44 ;low address of buffer 9 | bufhi = $45 ;hi address of buffer 10 | blklo = $46 ;low block 11 | blkhi = $47 ;hi block 12 | ioerr = $27 ;I/O error code 13 | nodev = $28 ;no device connected 14 | wperr = $2B ;write protect error 15 | 16 | ;for relocatable code 17 | ioAddressLo = $FA 18 | ioAddressHi = $FB 19 | tempY = $FC 20 | blockHalfCounter = $FD 21 | lowLatch = $FE 22 | highLatch = $FF 23 | knownRts = $FF58 24 | 25 | ;autostart ROM next card 26 | sloop = $FABA 27 | keyboard = $C000 28 | clearKeyboard = $C010 29 | 30 | .org $C700 31 | ;code is relocatable 32 | ; but set to $c700 for 33 | ; readability 34 | 35 | ;ID bytes for booting and drive detection 36 | cpx #$20 ;ID bytes for ProDOS and the 37 | ldy #$00 ; Apple Autostart ROM 38 | cpx #$03 ; 39 | cpx #$3C ;this one for older II's 40 | 41 | ;check for ESC key and if so, jump to next slot in autostart 42 | lda keyboard 43 | cmp #$9B 44 | bne start 45 | jmp sloop 46 | 47 | ;zero out block numbers and buffer address 48 | start: 49 | sty buflo 50 | sty blklo 51 | sty blkhi 52 | iny ;set command = 1 for read block 53 | sty command 54 | jsr knownRts ;jump to known RTS to get our address from the stack 55 | tsx 56 | lda $0100,x ;this for example would be $C7 in slot 7 57 | sta bufhi ;keep the slot here 58 | asl 59 | asl 60 | asl 61 | asl 62 | sta unit 63 | 64 | ;display copyright message 65 | ldy #B 1 -500 -400 200 R 50 50 1 0 I 95 | X GND 10 0 -800 200 U 50 50 1 0 W 96 | X B7 11 500 -200 200 L 50 50 1 0 T 97 | X B6 12 500 -100 200 L 50 50 1 0 T 98 | X B5 13 500 0 200 L 50 50 1 0 T 99 | X B4 14 500 100 200 L 50 50 1 0 T 100 | X B3 15 500 200 200 L 50 50 1 0 T 101 | X B2 16 500 300 200 L 50 50 1 0 T 102 | X B1 17 500 400 200 L 50 50 1 0 T 103 | X B0 18 500 500 200 L 50 50 1 0 T 104 | X CE 19 -500 -500 200 R 50 50 1 0 I I 105 | X A0 2 -500 500 200 R 50 50 1 0 T 106 | X VCC 20 0 800 200 D 50 50 1 0 W 107 | X A1 3 -500 400 200 R 50 50 1 0 T 108 | X A2 4 -500 300 200 R 50 50 1 0 T 109 | X A3 5 -500 200 200 R 50 50 1 0 T 110 | X A4 6 -500 100 200 R 50 50 1 0 T 111 | X A5 7 -500 0 200 R 50 50 1 0 T 112 | X A6 8 -500 -100 200 R 50 50 1 0 T 113 | X A7 9 -500 -200 200 R 50 50 1 0 T 114 | ENDDRAW 115 | ENDDEF 116 | # 117 | # 74xx_74LS32 118 | # 119 | DEF 74xx_74LS32 U 0 40 Y Y 5 L N 120 | F0 "U" 0 50 50 H V C CNN 121 | F1 "74xx_74LS32" 0 -50 50 H V C CNN 122 | F2 "" 0 0 50 H I C CNN 123 | F3 "" 0 0 50 H I C CNN 124 | $FPLIST 125 | DIP?14* 126 | $ENDFPLIST 127 | DRAW 128 | A -360 0 258 354 -354 1 1 10 N -150 150 -150 -150 129 | A -47 -52 204 150 837 1 1 10 f 150 0 -24 150 130 | A -47 52 204 -150 -837 1 1 10 f 150 0 -24 -150 131 | A -360 0 258 354 -354 2 1 10 N -150 150 -150 -150 132 | A -47 -52 204 150 837 2 1 10 f 150 0 -24 150 133 | A -47 52 204 -150 -837 2 1 10 f 150 0 -24 -150 134 | A -360 0 258 354 -354 3 1 10 N -150 150 -150 -150 135 | A -47 -52 204 150 837 3 1 10 f 150 0 -24 150 136 | A -47 52 204 -150 -837 3 1 10 f 150 0 -24 -150 137 | A -360 0 258 354 -354 4 1 10 N -150 150 -150 -150 138 | A -47 -52 204 150 837 4 1 10 f 150 0 -24 150 139 | A -47 52 204 -150 -837 4 1 10 f 150 0 -24 -150 140 | A 0 0 150 -899 899 1 2 10 f 0 -150 0 150 141 | A 0 0 150 -899 899 2 2 10 f 0 -150 0 150 142 | A 0 0 150 -899 899 3 2 10 f 0 -150 0 150 143 | A 0 0 150 -899 899 4 2 10 f 0 -150 0 150 144 | S -200 300 200 -300 5 1 10 f 145 | P 2 1 1 10 -150 -150 -25 -150 f 146 | P 2 1 1 10 -150 150 -25 150 f 147 | P 12 1 1 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f 148 | P 2 2 1 10 -150 -150 -25 -150 f 149 | P 2 2 1 10 -150 150 -25 150 f 150 | P 12 2 1 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f 151 | P 2 3 1 10 -150 -150 -25 -150 f 152 | P 2 3 1 10 -150 150 -25 150 f 153 | P 12 3 1 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f 154 | P 2 4 1 10 -150 -150 -25 -150 f 155 | P 2 4 1 10 -150 150 -25 150 f 156 | P 12 4 1 -1000 -25 150 -150 150 -150 150 -140 134 -119 89 -106 41 -103 -10 -109 -59 -125 -107 -150 -150 -150 -150 -25 -150 f 157 | P 4 1 2 10 0 150 -150 150 -150 -150 0 -150 f 158 | P 4 2 2 10 0 150 -150 150 -150 -150 0 -150 f 159 | P 4 3 2 10 0 150 -150 150 -150 -150 0 -150 f 160 | P 4 4 2 10 0 150 -150 150 -150 -150 0 -150 f 161 | X VCC 14 0 500 200 D 50 50 5 0 W 162 | X GND 7 0 -500 200 U 50 50 5 0 W 163 | X ~ 1 -300 100 170 R 50 50 1 1 I 164 | X ~ 2 -300 -100 170 R 50 50 1 1 I 165 | X ~ 3 300 0 150 L 50 50 1 1 O 166 | X ~ 4 -300 100 170 R 50 50 2 1 I 167 | X ~ 5 -300 -100 170 R 50 50 2 1 I 168 | X ~ 6 300 0 150 L 50 50 2 1 O 169 | X ~ 10 -300 -100 170 R 50 50 3 1 I 170 | X ~ 8 300 0 150 L 50 50 3 1 O 171 | X ~ 9 -300 100 170 R 50 50 3 1 I 172 | X ~ 11 300 0 150 L 50 50 4 1 O 173 | X ~ 12 -300 100 170 R 50 50 4 1 I 174 | X ~ 13 -300 -100 170 R 50 50 4 1 I 175 | X ~ 1 -300 100 150 R 50 50 1 2 I I 176 | X ~ 2 -300 -100 150 R 50 50 1 2 I I 177 | X ~ 3 300 0 150 L 50 50 1 2 O I 178 | X ~ 4 -300 100 150 R 50 50 2 2 I I 179 | X ~ 5 -300 -100 150 R 50 50 2 2 I I 180 | X ~ 6 300 0 150 L 50 50 2 2 O I 181 | X ~ 10 -300 -100 150 R 50 50 3 2 I I 182 | X ~ 8 300 0 150 L 50 50 3 2 O I 183 | X ~ 9 -300 100 150 R 50 50 3 2 I I 184 | X ~ 11 300 0 150 L 50 50 4 2 O I 185 | X ~ 12 -300 100 150 R 50 50 4 2 I I 186 | X ~ 13 -300 -100 150 R 50 50 4 2 I I 187 | ENDDRAW 188 | ENDDEF 189 | # 190 | # 74xx_74LS374 191 | # 192 | DEF 74xx_74LS374 U 0 20 Y Y 1 F N 193 | F0 "U" -300 650 50 H V C CNN 194 | F1 "74xx_74LS374" -300 -650 50 H V C CNN 195 | F2 "" 0 0 50 H I C CNN 196 | F3 "" 0 0 50 H I C CNN 197 | ALIAS 74HC374 74HCT374 74AHC374 74AHCT374 198 | $FPLIST 199 | DIP?20* 200 | SOIC?20* 201 | SO?20* 202 | $ENDFPLIST 203 | DRAW 204 | S -300 600 300 -600 1 1 10 f 205 | X OE 1 -500 -500 200 R 50 50 1 0 I I 206 | X GND 10 0 -800 200 U 50 50 1 0 W 207 | X Cp 11 -500 -400 200 R 50 50 1 0 I C 208 | X O4 12 500 100 200 L 50 50 1 0 T 209 | X D4 13 -500 100 200 R 50 50 1 0 I 210 | X D5 14 -500 0 200 R 50 50 1 0 I 211 | X O5 15 500 0 200 L 50 50 1 0 T 212 | X O6 16 500 -100 200 L 50 50 1 0 T 213 | X D6 17 -500 -100 200 R 50 50 1 0 I 214 | X D7 18 -500 -200 200 R 50 50 1 0 I 215 | X O7 19 500 -200 200 L 50 50 1 0 T 216 | X O0 2 500 500 200 L 50 50 1 0 T 217 | X VCC 20 0 800 200 D 50 50 1 0 W 218 | X D0 3 -500 500 200 R 50 50 1 0 I 219 | X D1 4 -500 400 200 R 50 50 1 0 I 220 | X O1 5 500 400 200 L 50 50 1 0 T 221 | X O2 6 500 300 200 L 50 50 1 0 T 222 | X D2 7 -500 300 200 R 50 50 1 0 I 223 | X D3 8 -500 200 200 R 50 50 1 0 I 224 | X O3 9 500 200 200 L 50 50 1 0 T 225 | ENDDRAW 226 | ENDDEF 227 | # 228 | # Connector_Generic_Conn_02x25_Counter_Clockwise 229 | # 230 | DEF Connector_Generic_Conn_02x25_Counter_Clockwise J 0 40 Y N 1 F N 231 | F0 "J" 50 1300 50 H V C CNN 232 | F1 "Connector_Generic_Conn_02x25_Counter_Clockwise" 50 -1300 50 H V C CNN 233 | F2 "" 0 0 50 H I C CNN 234 | F3 "" 0 0 50 H I C CNN 235 | $FPLIST 236 | Connector*:*_2x??_* 237 | $ENDFPLIST 238 | DRAW 239 | S -50 -1195 0 -1205 1 1 6 N 240 | S -50 -1095 0 -1105 1 1 6 N 241 | S -50 -995 0 -1005 1 1 6 N 242 | S -50 -895 0 -905 1 1 6 N 243 | S -50 -795 0 -805 1 1 6 N 244 | S -50 -695 0 -705 1 1 6 N 245 | S -50 -595 0 -605 1 1 6 N 246 | S -50 -495 0 -505 1 1 6 N 247 | S -50 -395 0 -405 1 1 6 N 248 | S -50 -295 0 -305 1 1 6 N 249 | S -50 -195 0 -205 1 1 6 N 250 | S -50 -95 0 -105 1 1 6 N 251 | S -50 5 0 -5 1 1 6 N 252 | S -50 105 0 95 1 1 6 N 253 | S -50 205 0 195 1 1 6 N 254 | S -50 305 0 295 1 1 6 N 255 | S -50 405 0 395 1 1 6 N 256 | S -50 505 0 495 1 1 6 N 257 | S -50 605 0 595 1 1 6 N 258 | S -50 705 0 695 1 1 6 N 259 | S -50 805 0 795 1 1 6 N 260 | S -50 905 0 895 1 1 6 N 261 | S -50 1005 0 995 1 1 6 N 262 | S -50 1105 0 1095 1 1 6 N 263 | S -50 1205 0 1195 1 1 6 N 264 | S -50 1250 150 -1250 1 1 10 f 265 | S 150 -1195 100 -1205 1 1 6 N 266 | S 150 -1095 100 -1105 1 1 6 N 267 | S 150 -995 100 -1005 1 1 6 N 268 | S 150 -895 100 -905 1 1 6 N 269 | S 150 -795 100 -805 1 1 6 N 270 | S 150 -695 100 -705 1 1 6 N 271 | S 150 -595 100 -605 1 1 6 N 272 | S 150 -495 100 -505 1 1 6 N 273 | S 150 -395 100 -405 1 1 6 N 274 | S 150 -295 100 -305 1 1 6 N 275 | S 150 -195 100 -205 1 1 6 N 276 | S 150 -95 100 -105 1 1 6 N 277 | S 150 5 100 -5 1 1 6 N 278 | S 150 105 100 95 1 1 6 N 279 | S 150 205 100 195 1 1 6 N 280 | S 150 305 100 295 1 1 6 N 281 | S 150 405 100 395 1 1 6 N 282 | S 150 505 100 495 1 1 6 N 283 | S 150 605 100 595 1 1 6 N 284 | S 150 705 100 695 1 1 6 N 285 | S 150 805 100 795 1 1 6 N 286 | S 150 905 100 895 1 1 6 N 287 | S 150 1005 100 995 1 1 6 N 288 | S 150 1105 100 1095 1 1 6 N 289 | S 150 1205 100 1195 1 1 6 N 290 | X Pin_1 1 -200 1200 150 R 50 50 1 1 P 291 | X Pin_10 10 -200 300 150 R 50 50 1 1 P 292 | X Pin_11 11 -200 200 150 R 50 50 1 1 P 293 | X Pin_12 12 -200 100 150 R 50 50 1 1 P 294 | X Pin_13 13 -200 0 150 R 50 50 1 1 P 295 | X Pin_14 14 -200 -100 150 R 50 50 1 1 P 296 | X Pin_15 15 -200 -200 150 R 50 50 1 1 P 297 | X Pin_16 16 -200 -300 150 R 50 50 1 1 P 298 | X Pin_17 17 -200 -400 150 R 50 50 1 1 P 299 | X Pin_18 18 -200 -500 150 R 50 50 1 1 P 300 | X Pin_19 19 -200 -600 150 R 50 50 1 1 P 301 | X Pin_2 2 -200 1100 150 R 50 50 1 1 P 302 | X Pin_20 20 -200 -700 150 R 50 50 1 1 P 303 | X Pin_21 21 -200 -800 150 R 50 50 1 1 P 304 | X Pin_22 22 -200 -900 150 R 50 50 1 1 P 305 | X Pin_23 23 -200 -1000 150 R 50 50 1 1 P 306 | X Pin_24 24 -200 -1100 150 R 50 50 1 1 P 307 | X Pin_25 25 -200 -1200 150 R 50 50 1 1 P 308 | X Pin_26 26 300 -1200 150 L 50 50 1 1 P 309 | X Pin_27 27 300 -1100 150 L 50 50 1 1 P 310 | X Pin_28 28 300 -1000 150 L 50 50 1 1 P 311 | X Pin_29 29 300 -900 150 L 50 50 1 1 P 312 | X Pin_3 3 -200 1000 150 R 50 50 1 1 P 313 | X Pin_30 30 300 -800 150 L 50 50 1 1 P 314 | X Pin_31 31 300 -700 150 L 50 50 1 1 P 315 | X Pin_32 32 300 -600 150 L 50 50 1 1 P 316 | X Pin_33 33 300 -500 150 L 50 50 1 1 P 317 | X Pin_34 34 300 -400 150 L 50 50 1 1 P 318 | X Pin_35 35 300 -300 150 L 50 50 1 1 P 319 | X Pin_36 36 300 -200 150 L 50 50 1 1 P 320 | X Pin_37 37 300 -100 150 L 50 50 1 1 P 321 | X Pin_38 38 300 0 150 L 50 50 1 1 P 322 | X Pin_39 39 300 100 150 L 50 50 1 1 P 323 | X Pin_4 4 -200 900 150 R 50 50 1 1 P 324 | X Pin_40 40 300 200 150 L 50 50 1 1 P 325 | X Pin_41 41 300 300 150 L 50 50 1 1 P 326 | X Pin_42 42 300 400 150 L 50 50 1 1 P 327 | X Pin_43 43 300 500 150 L 50 50 1 1 P 328 | X Pin_44 44 300 600 150 L 50 50 1 1 P 329 | X Pin_45 45 300 700 150 L 50 50 1 1 P 330 | X Pin_46 46 300 800 150 L 50 50 1 1 P 331 | X Pin_47 47 300 900 150 L 50 50 1 1 P 332 | X Pin_48 48 300 1000 150 L 50 50 1 1 P 333 | X Pin_49 49 300 1100 150 L 50 50 1 1 P 334 | X Pin_5 5 -200 800 150 R 50 50 1 1 P 335 | X Pin_50 50 300 1200 150 L 50 50 1 1 P 336 | X Pin_6 6 -200 700 150 R 50 50 1 1 P 337 | X Pin_7 7 -200 600 150 R 50 50 1 1 P 338 | X Pin_8 8 -200 500 150 R 50 50 1 1 P 339 | X Pin_9 9 -200 400 150 R 50 50 1 1 P 340 | ENDDRAW 341 | ENDDEF 342 | # 343 | # Device_C_Small 344 | # 345 | DEF Device_C_Small C 0 10 N N 1 F N 346 | F0 "C" 10 70 50 H V L CNN 347 | F1 "Device_C_Small" 10 -80 50 H V L CNN 348 | F2 "" 0 0 50 H I C CNN 349 | F3 "" 0 0 50 H I C CNN 350 | $FPLIST 351 | C_* 352 | $ENDFPLIST 353 | DRAW 354 | P 2 0 1 13 -60 -20 60 -20 N 355 | P 2 0 1 12 -60 20 60 20 N 356 | X ~ 1 0 100 80 D 50 50 1 1 P 357 | X ~ 2 0 -100 80 U 50 50 1 1 P 358 | ENDDRAW 359 | ENDDEF 360 | # 361 | # Memory_EPROM_27C080 362 | # 363 | DEF Memory_EPROM_27C080 U 0 20 Y Y 1 F N 364 | F0 "U" -300 1250 50 H V C CNN 365 | F1 "Memory_EPROM_27C080" 100 -1250 50 H V L CNN 366 | F2 "" 0 0 50 H I C CNN 367 | F3 "" 0 0 50 H I C CNN 368 | $FPLIST 369 | DIP*W15.24mm* 370 | PLCC* 371 | $ENDFPLIST 372 | DRAW 373 | S -300 1200 300 -1200 1 1 10 f 374 | X A19 1 -400 -800 100 R 50 50 1 1 I 375 | X A2 10 -400 900 100 R 50 50 1 1 I 376 | X A1 11 -400 1000 100 R 50 50 1 1 I 377 | X A0 12 -400 1100 100 R 50 50 1 1 I 378 | X D0 13 400 1100 100 L 50 50 1 1 T 379 | X D1 14 400 1000 100 L 50 50 1 1 T 380 | X D2 15 400 900 100 L 50 50 1 1 T 381 | X GND 16 0 -1300 100 U 50 50 1 1 W 382 | X D3 17 400 800 100 L 50 50 1 1 T 383 | X D4 18 400 700 100 L 50 50 1 1 T 384 | X D5 19 400 600 100 L 50 50 1 1 T 385 | X A16 2 -400 -500 100 R 50 50 1 1 I 386 | X D6 20 400 500 100 L 50 50 1 1 T 387 | X D7 21 400 400 100 L 50 50 1 1 T 388 | X ~CE 22 -400 -1000 100 R 50 50 1 1 I 389 | X A10 23 -400 100 100 R 50 50 1 1 I 390 | X ~OE 24 -400 -1100 100 R 50 50 1 1 I 391 | X A11 25 -400 0 100 R 50 50 1 1 I 392 | X A9 26 -400 200 100 R 50 50 1 1 I 393 | X A8 27 -400 300 100 R 50 50 1 1 I 394 | X A13 28 -400 -200 100 R 50 50 1 1 I 395 | X A14 29 -400 -300 100 R 50 50 1 1 I 396 | X A15 3 -400 -400 100 R 50 50 1 1 I 397 | X A17 30 -400 -600 100 R 50 50 1 1 I 398 | X A18 31 -400 -700 100 R 50 50 1 1 I 399 | X VCC 32 0 1300 100 D 50 50 1 1 W 400 | X A12 4 -400 -100 100 R 50 50 1 1 I 401 | X A7 5 -400 400 100 R 50 50 1 1 I 402 | X A6 6 -400 500 100 R 50 50 1 1 I 403 | X A5 7 -400 600 100 R 50 50 1 1 I 404 | X A4 8 -400 700 100 R 50 50 1 1 I 405 | X A3 9 -400 800 100 R 50 50 1 1 I 406 | ENDDRAW 407 | ENDDEF 408 | # 409 | # power_+5V 410 | # 411 | DEF power_+5V #PWR 0 0 Y Y 1 F P 412 | F0 "#PWR" 0 -150 50 H I C CNN 413 | F1 "power_+5V" 0 140 50 H V C CNN 414 | F2 "" 0 0 50 H I C CNN 415 | F3 "" 0 0 50 H I C CNN 416 | DRAW 417 | P 2 0 1 0 -30 50 0 100 N 418 | P 2 0 1 0 0 0 0 100 N 419 | P 2 0 1 0 0 100 30 50 N 420 | X +5V 1 0 0 0 U 50 50 1 1 W N 421 | ENDDRAW 422 | ENDDEF 423 | # 424 | # power_GND 425 | # 426 | DEF power_GND #PWR 0 0 Y Y 1 F P 427 | F0 "#PWR" 0 -250 50 H I C CNN 428 | F1 "power_GND" 0 -150 50 H V C CNN 429 | F2 "" 0 0 50 H I C CNN 430 | F3 "" 0 0 50 H I C CNN 431 | DRAW 432 | P 6 0 1 0 0 0 0 -50 50 -50 0 -100 -50 -50 0 -50 N 433 | X GND 1 0 0 0 D 50 50 1 1 W N 434 | ENDDRAW 435 | ENDDEF 436 | # 437 | #End Library 438 | -------------------------------------------------------------------------------- /Hardware/ProDOS ROM-Drive.kicad_prl: -------------------------------------------------------------------------------- 1 | { 2 | "board": { 3 | "active_layer": 36, 4 | "active_layer_preset": "", 5 | "auto_track_width": true, 6 | "hidden_nets": [], 7 | "high_contrast_mode": 0, 8 | "net_color_mode": 1, 9 | "opacity": { 10 | "pads": 1.0, 11 | "tracks": 1.0, 12 | "vias": 1.0, 13 | "zones": 0.6 14 | }, 15 | "ratsnest_display_mode": 0, 16 | "selection_filter": { 17 | "dimensions": true, 18 | "footprints": true, 19 | "graphics": true, 20 | "keepouts": true, 21 | "lockedItems": true, 22 | "otherItems": true, 23 | "pads": true, 24 | "text": true, 25 | "tracks": true, 26 | "vias": true, 27 | "zones": true 28 | }, 29 | "visible_items": [ 30 | 0, 31 | 1, 32 | 2, 33 | 3, 34 | 4, 35 | 5, 36 | 8, 37 | 9, 38 | 10, 39 | 11, 40 | 12, 41 | 13, 42 | 14, 43 | 15, 44 | 16, 45 | 17, 46 | 18, 47 | 19, 48 | 20, 49 | 21, 50 | 22, 51 | 23, 52 | 24, 53 | 25, 54 | 26, 55 | 27, 56 | 28, 57 | 29, 58 | 30, 59 | 32, 60 | 33, 61 | 34, 62 | 35, 63 | 36 64 | ], 65 | "visible_layers": "00010f0_80000001", 66 | "zone_display_mode": 0 67 | }, 68 | "meta": { 69 | "filename": "ProDOS ROM-Drive.kicad_prl", 70 | "version": 3 71 | }, 72 | "project": { 73 | "files": [] 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /Hardware/ProDOS ROM-Drive.kicad_pro: -------------------------------------------------------------------------------- 1 | { 2 | "board": { 3 | "design_settings": { 4 | "defaults": { 5 | "board_outline_line_width": 0.15, 6 | "copper_line_width": 0.19999999999999998, 7 | "copper_text_italic": false, 8 | "copper_text_size_h": 1.5, 9 | "copper_text_size_v": 1.5, 10 | "copper_text_thickness": 0.3, 11 | "copper_text_upright": false, 12 | "courtyard_line_width": 0.049999999999999996, 13 | "dimension_precision": 4, 14 | "dimension_units": 3, 15 | "dimensions": { 16 | "arrow_length": 1270000, 17 | "extension_offset": 500000, 18 | "keep_text_aligned": true, 19 | "suppress_zeroes": false, 20 | "text_position": 0, 21 | "units_format": 1 22 | }, 23 | "fab_line_width": 0.09999999999999999, 24 | "fab_text_italic": false, 25 | "fab_text_size_h": 1.0, 26 | "fab_text_size_v": 1.0, 27 | "fab_text_thickness": 0.15, 28 | "fab_text_upright": false, 29 | "other_line_width": 0.09999999999999999, 30 | "other_text_italic": false, 31 | "other_text_size_h": 1.0, 32 | "other_text_size_v": 1.0, 33 | "other_text_thickness": 0.15, 34 | "other_text_upright": false, 35 | "pads": { 36 | "drill": 0.889, 37 | "height": 1.6, 38 | "width": 1.6 39 | }, 40 | "silk_line_width": 0.15, 41 | "silk_text_italic": false, 42 | "silk_text_size_h": 1.0, 43 | "silk_text_size_v": 1.0, 44 | "silk_text_thickness": 0.15, 45 | "silk_text_upright": false, 46 | "zones": { 47 | "45_degree_only": false, 48 | "min_clearance": 0.508 49 | } 50 | }, 51 | "diff_pair_dimensions": [ 52 | { 53 | "gap": 0.0, 54 | "via_gap": 0.0, 55 | "width": 0.0 56 | } 57 | ], 58 | "drc_exclusions": [], 59 | "meta": { 60 | "filename": "board_design_settings.json", 61 | "version": 2 62 | }, 63 | "rule_severities": { 64 | "annular_width": "error", 65 | "clearance": "error", 66 | "copper_edge_clearance": "error", 67 | "courtyards_overlap": "error", 68 | "diff_pair_gap_out_of_range": "error", 69 | "diff_pair_uncoupled_length_too_long": "error", 70 | "drill_out_of_range": "error", 71 | "duplicate_footprints": "warning", 72 | "extra_footprint": "warning", 73 | "footprint_type_mismatch": "error", 74 | "hole_clearance": "error", 75 | "hole_near_hole": "error", 76 | "invalid_outline": "error", 77 | "item_on_disabled_layer": "error", 78 | "items_not_allowed": "error", 79 | "length_out_of_range": "error", 80 | "malformed_courtyard": "error", 81 | "microvia_drill_out_of_range": "error", 82 | "missing_courtyard": "ignore", 83 | "missing_footprint": "warning", 84 | "net_conflict": "warning", 85 | "npth_inside_courtyard": "ignore", 86 | "padstack": "error", 87 | "pth_inside_courtyard": "ignore", 88 | "shorting_items": "error", 89 | "silk_over_copper": "warning", 90 | "silk_overlap": "warning", 91 | "skew_out_of_range": "error", 92 | "through_hole_pad_without_hole": "error", 93 | "too_many_vias": "error", 94 | "track_dangling": "warning", 95 | "track_width": "error", 96 | "tracks_crossing": "error", 97 | "unconnected_items": "error", 98 | "unresolved_variable": "error", 99 | "via_dangling": "warning", 100 | "zone_has_empty_net": "error", 101 | "zones_intersect": "error" 102 | }, 103 | "rule_severitieslegacy_courtyards_overlap": true, 104 | "rule_severitieslegacy_no_courtyard_defined": false, 105 | "rules": { 106 | "allow_blind_buried_vias": false, 107 | "allow_microvias": false, 108 | "max_error": 0.005, 109 | "min_clearance": 0.0, 110 | "min_copper_edge_clearance": 0.075, 111 | "min_hole_clearance": 0.25, 112 | "min_hole_to_hole": 0.25, 113 | "min_microvia_diameter": 0.19999999999999998, 114 | "min_microvia_drill": 0.09999999999999999, 115 | "min_silk_clearance": 0.0, 116 | "min_through_hole_diameter": 0.3, 117 | "min_track_width": 0.17779999999999999, 118 | "min_via_annular_width": 0.049999999999999996, 119 | "min_via_diameter": 0.39999999999999997, 120 | "use_height_for_length_calcs": true 121 | }, 122 | "track_widths": [ 123 | 0.0 124 | ], 125 | "via_dimensions": [ 126 | { 127 | "diameter": 0.0, 128 | "drill": 0.0 129 | } 130 | ], 131 | "zones_allow_external_fillets": false, 132 | "zones_use_no_outline": true 133 | }, 134 | "layer_presets": [] 135 | }, 136 | "boards": [], 137 | "cvpcb": { 138 | "equivalence_files": [] 139 | }, 140 | "erc": { 141 | "erc_exclusions": [], 142 | "meta": { 143 | "version": 0 144 | }, 145 | "pin_map": [ 146 | [ 147 | 0, 148 | 0, 149 | 0, 150 | 0, 151 | 0, 152 | 0, 153 | 1, 154 | 0, 155 | 0, 156 | 0, 157 | 0, 158 | 2 159 | ], 160 | [ 161 | 0, 162 | 2, 163 | 0, 164 | 1, 165 | 0, 166 | 0, 167 | 1, 168 | 0, 169 | 2, 170 | 2, 171 | 2, 172 | 2 173 | ], 174 | [ 175 | 0, 176 | 0, 177 | 0, 178 | 0, 179 | 0, 180 | 0, 181 | 1, 182 | 0, 183 | 1, 184 | 0, 185 | 1, 186 | 2 187 | ], 188 | [ 189 | 0, 190 | 1, 191 | 0, 192 | 0, 193 | 0, 194 | 0, 195 | 1, 196 | 1, 197 | 2, 198 | 1, 199 | 1, 200 | 2 201 | ], 202 | [ 203 | 0, 204 | 0, 205 | 0, 206 | 0, 207 | 0, 208 | 0, 209 | 1, 210 | 0, 211 | 0, 212 | 0, 213 | 0, 214 | 2 215 | ], 216 | [ 217 | 0, 218 | 0, 219 | 0, 220 | 0, 221 | 0, 222 | 0, 223 | 0, 224 | 0, 225 | 0, 226 | 0, 227 | 0, 228 | 2 229 | ], 230 | [ 231 | 1, 232 | 1, 233 | 1, 234 | 1, 235 | 1, 236 | 0, 237 | 1, 238 | 1, 239 | 1, 240 | 1, 241 | 1, 242 | 2 243 | ], 244 | [ 245 | 0, 246 | 0, 247 | 0, 248 | 1, 249 | 0, 250 | 0, 251 | 1, 252 | 0, 253 | 0, 254 | 0, 255 | 0, 256 | 2 257 | ], 258 | [ 259 | 0, 260 | 2, 261 | 1, 262 | 2, 263 | 0, 264 | 0, 265 | 1, 266 | 0, 267 | 2, 268 | 2, 269 | 2, 270 | 2 271 | ], 272 | [ 273 | 0, 274 | 2, 275 | 0, 276 | 1, 277 | 0, 278 | 0, 279 | 1, 280 | 0, 281 | 2, 282 | 0, 283 | 0, 284 | 2 285 | ], 286 | [ 287 | 0, 288 | 2, 289 | 1, 290 | 1, 291 | 0, 292 | 0, 293 | 1, 294 | 0, 295 | 2, 296 | 0, 297 | 0, 298 | 2 299 | ], 300 | [ 301 | 2, 302 | 2, 303 | 2, 304 | 2, 305 | 2, 306 | 2, 307 | 2, 308 | 2, 309 | 2, 310 | 2, 311 | 2, 312 | 2 313 | ] 314 | ], 315 | "rule_severities": { 316 | "bus_definition_conflict": "error", 317 | "bus_entry_needed": "error", 318 | "bus_label_syntax": "error", 319 | "bus_to_bus_conflict": "error", 320 | "bus_to_net_conflict": "error", 321 | "different_unit_footprint": "error", 322 | "different_unit_net": "error", 323 | "duplicate_reference": "error", 324 | "duplicate_sheet_names": "error", 325 | "extra_units": "error", 326 | "global_label_dangling": "warning", 327 | "hier_label_mismatch": "error", 328 | "label_dangling": "error", 329 | "lib_symbol_issues": "warning", 330 | "multiple_net_names": "warning", 331 | "net_not_bus_member": "warning", 332 | "no_connect_connected": "warning", 333 | "no_connect_dangling": "warning", 334 | "pin_not_connected": "error", 335 | "pin_not_driven": "error", 336 | "pin_to_pin": "warning", 337 | "power_pin_not_driven": "error", 338 | "similar_labels": "warning", 339 | "unannotated": "error", 340 | "unit_value_mismatch": "error", 341 | "unresolved_variable": "error", 342 | "wire_dangling": "error" 343 | } 344 | }, 345 | "libraries": { 346 | "pinned_footprint_libs": [], 347 | "pinned_symbol_libs": [] 348 | }, 349 | "meta": { 350 | "filename": "ProDOS ROM-Drive.kicad_pro", 351 | "version": 1 352 | }, 353 | "net_settings": { 354 | "classes": [ 355 | { 356 | "bus_width": 12.0, 357 | "clearance": 0.1778, 358 | "diff_pair_gap": 0.25, 359 | "diff_pair_via_gap": 0.25, 360 | "diff_pair_width": 0.2, 361 | "line_style": 0, 362 | "microvia_diameter": 0.3, 363 | "microvia_drill": 0.1, 364 | "name": "Default", 365 | "pcb_color": "rgba(0, 0, 0, 0.000)", 366 | "schematic_color": "rgba(0, 0, 0, 0.000)", 367 | "track_width": 0.1778, 368 | "via_diameter": 0.762, 369 | "via_drill": 0.50038, 370 | "wire_width": 6.0 371 | }, 372 | { 373 | "bus_width": 12.0, 374 | "clearance": 0.254, 375 | "diff_pair_gap": 0.25, 376 | "diff_pair_via_gap": 0.25, 377 | "diff_pair_width": 0.2, 378 | "line_style": 0, 379 | "microvia_diameter": 0.3, 380 | "microvia_drill": 0.1, 381 | "name": "Ground", 382 | "nets": [ 383 | "GND" 384 | ], 385 | "pcb_color": "rgba(0, 0, 0, 0.000)", 386 | "schematic_color": "rgba(0, 0, 0, 0.000)", 387 | "track_width": 0.8128, 388 | "via_diameter": 0.762, 389 | "via_drill": 0.7112, 390 | "wire_width": 6.0 391 | }, 392 | { 393 | "bus_width": 12.0, 394 | "clearance": 0.254, 395 | "diff_pair_gap": 0.25, 396 | "diff_pair_via_gap": 0.25, 397 | "diff_pair_width": 0.2, 398 | "line_style": 0, 399 | "microvia_diameter": 0.3, 400 | "microvia_drill": 0.1, 401 | "name": "Power", 402 | "nets": [ 403 | "+5V" 404 | ], 405 | "pcb_color": "rgba(0, 0, 0, 0.000)", 406 | "schematic_color": "rgba(0, 0, 0, 0.000)", 407 | "track_width": 0.8128, 408 | "via_diameter": 0.762, 409 | "via_drill": 0.7112, 410 | "wire_width": 6.0 411 | } 412 | ], 413 | "meta": { 414 | "version": 2 415 | }, 416 | "net_colors": null 417 | }, 418 | "pcbnew": { 419 | "last_paths": { 420 | "gencad": "", 421 | "idf": "", 422 | "netlist": "ProDOS ROM-Drive 3.0.net", 423 | "specctra_dsn": "", 424 | "step": "", 425 | "vrml": "" 426 | }, 427 | "page_layout_descr_file": "" 428 | }, 429 | "schematic": { 430 | "annotate_start_num": 0, 431 | "drawing": { 432 | "default_line_thickness": 6.0, 433 | "default_text_size": 50.0, 434 | "field_names": [], 435 | "intersheets_ref_own_page": false, 436 | "intersheets_ref_prefix": "", 437 | "intersheets_ref_short": false, 438 | "intersheets_ref_show": false, 439 | "intersheets_ref_suffix": "", 440 | "junction_size_choice": 3, 441 | "label_size_ratio": 0.25, 442 | "pin_symbol_size": 0.0, 443 | "text_offset_ratio": 0.08 444 | }, 445 | "legacy_lib_dir": "", 446 | "legacy_lib_list": [], 447 | "meta": { 448 | "version": 1 449 | }, 450 | "net_format_name": "Pcbnew", 451 | "ngspice": { 452 | "fix_include_paths": true, 453 | "fix_passive_vals": false, 454 | "meta": { 455 | "version": 0 456 | }, 457 | "model_mode": 0, 458 | "workbook_filename": "" 459 | }, 460 | "page_layout_descr_file": "", 461 | "plot_directory": "", 462 | "spice_adjust_passive_values": false, 463 | "spice_external_command": "spice \"%I\"", 464 | "subpart_first_id": 65, 465 | "subpart_id_separator": 0 466 | }, 467 | "sheets": [ 468 | [ 469 | "aa2ea573-3f20-43c1-aa99-1f9c6031a9aa", 470 | "" 471 | ] 472 | ], 473 | "text_variables": {} 474 | } 475 | -------------------------------------------------------------------------------- /Hardware/ProDOS ROM-Drive.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tjboldt/ProDOS-ROM-Drive/35df9b0dd8a18d8f62cb2f2fbd8cbed274cb1634/Hardware/ProDOS ROM-Drive.pdf -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 1998-2019 Terence J. Boldt 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # v4.0 2 | This is a new revision of the hardware, incompatible with previous firmware and drive image before v3. If you have a v2.5 board, see the v2.5 tag [here](https://github.com/tjboldt/ProDOS-ROM-Drive/tree/v2.5). Note that all of v2.1, v2.5 and v3.0 have a small design mistake that didn't properly buffer the data bus the way it was intended in the original v1.0 version. This has been fixed for v4.0. 3 | 4 | # ProDOS ROM-Drive 5 | This is a peripheral card for the Apple ][ series computers that acts as a read-only solid state disk drive (SSD) all in EPROM. Although it won't run DOS, it is fully ProDOS compatible and will appear as a read-only hard drive even when booting from another drive. It holds 1024 KB of disk data with the 256 byte firmware stored in block 0001 where the SOS boot loader normally resides. The drive boots ProDOS and into BASIC in under 1.5 seconds. 6 | 7 | ![Image of Board](/Hardware/ProDOS%20ROM-Drive%20Front.jpg) 8 | 9 | You can order blank circuit boards from [PCBWay](https://www.pcbway.com/project/shareproject/ProDOS_ROM_Drive_v4_4fe0794f.html) or upload the provided gerber and drill files to any PCB manufacturer. 10 | 11 | ## History 12 | 13 | My first Apple computer was an Apple //e that my brother bought in early 1984. Countless hours were spent playing games which developed my interest in building games. This also led to the creation of various utilities to help organize disks or just to see what could be done while programming. 14 | 15 | As time passed, I obtained other machines far more powerful and eventually my once loved Apple IIe got used less and less. I did still pull it out of storage every few months to play some classic games or see what I could accomplish with greater programming skills. The problem was connecting up disk drives, looking for disks and hoping that the disks still worked. To make life simpler, I decided I needed to come up with some way to permanently store the files inside the computer without needing to plug in anything but the power and video connectors. This is where the idea for a solid-state drive began. 16 | 17 | In the summer of 1998 I did some research in my own Apple II library for information on building peripheral cards. I drew up some designs in September 1998 and started building a prototype on a solderless breadboard with the wires jumpered over from a dead parallel card which I had cut the traces on. The rough idea at the time was to have two EPROMs. One would hold the 256 bytes of code in the $Cs00 - $CsFF space (where s is the slot number) and the second EPROM would get accessed through the 16 byte port space for the slot. To access more than 16 bytes, I would have a couple latch chips where you could program in the address of the disk EPROM and then read it one byte at a time through the ports. Originally I was going to make my own modified version of DOS 3.3 but before I got too far, David Wilson from Australia convinced me that it was much easier to build it for ProDOS since it supported many types of drives natively. 18 | 19 | By November 1998 I had a prototype on the solderless breadboard that could read data from the EPROM but it had no driver code, didn't boot and was very unreliable. In December I managed to have the two EPROM based system running but it would fail to boot about 80% of the time with various read errors. Shortening the length of wires, cleaning up the layout and a new design helped but it was still unreliable. I finally gave up on the second design but as it turns out, it could have been fixed quite easily. 20 | 21 | By mid-May of 1999 I finally got around to building a third design. This time I reduced the chip count and made the firmware for the drive reside in the top two blocks of the virtual disk EPROM. It still was somewhat unreliable in slot one but it was progressively worse as it was placed into higher slot numbers. By slot seven the card was completely unuseable. I then discovered that adding a 104 ceramic capacitor to each chip made the problem disappear. It was suddenly fully reliable. 22 | 23 | To build actual circuit boards, I tried making some by hand with marker, etching solution and copper on fibreglass boards but this proved to be far too difficult. I then learned the wonders of gerber files which can be created with a variety of PCB layout software. The files were emailed to a company in Alberta, Canada and three days later in July of 1999 I received a batch of 10 blank boards. These boards did not have the familiar green board look to them, nor were they pre-cut. I had to cut and file them to fit an Apple II slot by hand. Back then it was prohitively expensive for a young hobbiest to make less than 20 or 30 boards with the full solder-masking process due to the set-up fees. 24 | 25 | In 2019, I decided to revisit the original design as I was disappointed that the original didn't have a solder mask and was rather large for what it was. I got the board much smaller but in the process of translating my two decade old hand written notes, I made a mistake on one control line. To actually call this project finished, I had to make another revision. I also noticed the revised board was slightly larger than a credit card so I worked for a couple weeks to optimize the lines and squeeze the two-layer board down to 3.375" x 2.125". (Note that references above to first, second and third design are all the solderless breadboard prototypes leading up to the 1.0 circuit board printed in 1999, 2.0 was never made, 2.1 is the board with the error patched with a jumper wire and 2.2 through 2.4 were never made). 26 | 27 | In 2021, the first ever issue was opened on the project requesting that the firmware be relocatable. I let that issue sit for a few months and then Ralle Palaveev supplied some relocatable firmware as a patch. I quickly realized that this could be placed into the second block on the drive normally reserved for SOS bootloader for the Apple ///, essentially allowing the full EPROM to be used for the drive. I disassembed Ralle's patch, merged it into the existing source code and made a few updates to save a few bytes and add clarity. This change required some differences in wiring for the firmware addressing on the card. The final revision 4.0 was made in 2022 to fix the data buffer wiring but was otherwise the same as 3.0. 28 | 29 | ## Notes 30 | I used to use Ciderpress to copy files onto the drive image but now use my own cross-platform command line tool [ProDOS-Utilities](https://github.com/tjboldt/ProDOS-Utilities) and sometimes make modifications to the image live via an Apple II emulator. I then burn the file to a 27C801 EPROM with a GQ-4x4 USB Programmer. Do NOT overwrite block 0001 in the image as it contains the firmware for the card. 31 | 32 | If you're planning on designing you own card, I highly recommend reading "Interfacing & Digital Experiments with your Apple" by Charles J. Engelisher and Apple's "Apple II Reference Manual" as well as "ProDOS Technical Reference Manual" if you want to build a drive. You also need an EPROM programmer, some chips and a prototyping board. My designs used simple logic gates to decode addresses but if you want to reduce chip count, you'll also need a PAL/GAL logic programmer (which some EPROM programmers can do). 33 | 34 | ## Website 35 | Official website is [apple2.ca](http://apple2.ca/). 36 | 37 | ## Purchasing a ProDOS ROM-Drive 38 | I generally no longer sell these cards but you can buy them online from [Laser](https://www.laser.com/product_info.php/item/ProDOS_ROM_Drive-Apple_II_ProDOS_bootable_1MB_read-only_drive/cPath/288_292/products_id/1984) and other retailers. 39 | 40 | ## Other links 41 | - [Thread about building the card](https://tinkerdifferent.com/threads/building-tjboldts-prodos-rom-drive-for-apple.1249/) 42 | - [Article about the card](https://www.callapple.org/hardware/prodos-rom-drive-version-3/) 43 | - [Alternate version with fewer chips](https://www.ebay.com/itm/374004896438) 44 | --------------------------------------------------------------------------------