1 2 ; LST OFF 3 ORG $6000 4 5 ******************************** 6 * * 7 * PD8 SIMULATOR * 8 * Version 20090129 * 9 * By Deckard * 10 * * 11 ******************************** 12 13 *------------------------------- 14 * Zero page 15 *------------------------------- 16 17 SLOT16 EQU $2B ; slot * 16 (boot sector relies on this) 18 19 *------------------------------- 20 * Device driver parameters 21 *------------------------------- 22 23 P_CMD EQU $42 ; command: status, read, write 24 P_UNIT EQU $43 ; DSSS0000 D[0=drive 1,1=drive 2], SSS=slot 25 P_BUFL EQU $44 ; low I/O buffer 26 P_BUFH EQU $45 ; high 27 P_BLKL EQU $46 ; low block number 28 P_BLKH EQU $47 ; high 29 30 *------------------------------- 31 * Device command code 32 *------------------------------- 33 34 P_STAT = 0 35 P_READ = 1 36 P_WRITE = 2 37 P_FMT = 3 38 P_CORIG = 8 ; change origin 39 P_ROOTST = $55 ; image_start_sector = puny_root_start 40 P_ZERO = $AA ; image_start_sector = 0 41 42 *------------------------------- 43 * PD8 interface 44 *------------------------------- 45 46 C_BLK = $02 ; set block address 47 C_WBUF = $04 ; write to buffer 48 C_MODPD = $81 ; set ProDOS mode 49 C_READ = $82 ; read block 50 C_WRITE = $A2 ; write block (from buffer) 51 C_DRV = $C0 ; $C0 = drive #1, $C1 = drive #2 52 53 *------------------------------- 54 * ProDOS errors 55 *------------------------------- 56 57 ERR_IO = $27 : I/O error 58 59 *------------------------------- 60 * Ram 61 *------------------------------- 62 63 SDBUFZERO EQU $2000 ; blocks: 1, 2, ... of FAT16 SD CARD 64 SDBUFCAT EQU $2E00 ; blocks: catalog of the FAT16 SD CARD 65 SDBUFBIN EQU $3E00 ; blocks: of the selected bin (HDV or NIB) 66 67 ******************************** 68 6000: 4C 09 60 69 SIMBOOT JMP BOOT 6003: 4C 9C 60 70 SIMAVR JMP AVR 6006: 4C EB 60 71 SIMPDD JMP PDD 72 73 *------------------------------- 74 * Boot 75 *------------------------------- 76 77 BOOT 6009: A9 20 78 LDA #$20 ; $Cx01 = $20 -> unique disk device signature 600B: A2 00 79 LDX #$00 ; $Cx03 = $00 -> ProDOS disk device 600D: A9 03 80 LDA #$03 ; $Cx05 = $03 -> ProDOS disk device 600F: A9 3C 81 LDA #$3C ; $Cx07 = $3C -> ProDOS disk device 82 83 ; X=0 6011: 86 46 84 STX P_BLKL ; prepare block 0 to be read at $0800 6013: 86 47 85 STX P_BLKH 6015: 86 44 86 STX P_BUFL ; #<$0800 6017: 8E E5 60 87 STX A_MODE 88 601A: A9 08 89 LDA #>$0800 601C: 85 45 90 STA P_BUFH 91 ; after sector is read, will return to $0801 with 92 ; X = slot * 16 601E: 48 93 PHA ; return address -1 (high) 601F: 8A 94 TXA 6020: 48 95 PHA ; return address -1 (low) 96 6021: E8 97 INX ; P_READ 6022: 86 42 98 STX P_CMD 99 6024: A9 C7 100 LDA #$C7 ; simulation: PD8 in slot 7 6026: 0A 101 ASL ; *16 6027: 0A 102 ASL 6028: 0A 103 ASL 6029: 0A 104 ASL 602A: AA 105 TAX ; index 602B: 85 2B 106 STA SLOT16 602D: 85 43 107 STA P_UNIT ; same slot, drive 1 108 602F: AD E8 60 109 LDA A_FILE ; boot the selected HDV/NIB? 6032: D0 12 110 BNE :1 ; yes 111 112 * 1st boot: use the 1st block after the MBR 113 6034: A9 81 114 LDA #C_MODPD ; set ProDOS mode 6036: 20 9C 60 115 JSR AVR 116 6039: A9 08 117 LDA #P_CORIG ; AVR command: change origin 603B: 20 9C 60 118 JSR AVR 603E: A9 AA 119 LDA #P_ZERO ; set to the beginning of the SD card 6040: 20 9C 60 120 JSR AVR ; image_start_sector=0 121 6043: 4C EB 60 122 :2 JMP PDD 123 124 * HDV/NIB Boot 125 6046: AD E8 60 126 :1 LDA A_FILE ; insert file letter into the string 6049: 09 80 127 ORA #%10000000 604B: 8D 7D 60 128 STA BINMSGL 129 604E: AD EA 60 130 LDA A_BLKH ; insert high block number 6051: 20 76 61 131 JSR HEXDIGIT 6054: 8D 96 60 132 STA BINMSGD1 6057: 8C 97 60 133 STY BINMSGD2 605A: AD E9 60 134 LDA A_BLKL ; insert low block number 605D: 20 76 61 135 JSR HEXDIGIT 6060: 8D 98 60 136 STA BINMSGD3 6063: 8C 99 60 137 STY BINMSGD4 138 6066: A0 00 139 LDY #0 ; display the string (boot msg) 6068: B9 74 60 140 :3 LDA BIN_MSG,Y 606B: F0 D6 141 BEQ :2 ; terminator 142 606D: 99 00 04 143 STA $0400,Y ; first line of the 40 columns text screen 6070: C8 144 INY 6071: D0 F5 145 BNE :3 146 6073: 00 147 BRK 148 6074: C2 EF EF 149 BIN_MSG ASC "Booting '" 6077: F4 E9 EE E7 607B: A0 A7 607D: 00 150 BINMSGL DFB 0 607E: A7 A0 E6 151 ASC "' from FAT16 CAT block $" 6081: F2 EF ED A0 6085: C6 C1 D4 B1 6089: B6 A0 C3 C1 608D: D4 A0 E2 EC 6091: EF E3 EB A0 6095: A4 6096: 00 152 BINMSGD1 DFB 0 6097: 00 153 BINMSGD2 DFB 0 6098: 00 154 BINMSGD3 DFB 0 6099: 00 155 BINMSGD4 DFB 0 609A: A1 156 ASC "!" 609B: 00 157 DFB 0 158 159 *------------------------------- 160 * AVR simulation 161 *------------------------------- 162 163 AVR 609C: 20 F5 60 164 JSR SAV_ENV 165 609F: AD E5 60 166 LDA A_MODE ; current mode? 60A2: F0 15 167 BEQ :1 ; no current mode: new command 168 169 * Current command: process the parameters 170 60A4: C9 08 171 CMP #P_CORIG ; change origin? 60A6: D0 0E 172 BNE :4 ; no 173 60A8: AD 1F 61 174 LDA SAV_ACC 60AB: 8D E7 60 175 STA A_ORIG ; save origin 176 60AE: A9 00 177 :5 LDA #0 ; set no current mode (no parameter) 60B0: 8D E5 60 178 STA A_MODE 60B3: 4C E1 60 179 JMP :3 180 181 :4 182 ; other command (to do if required) 60B6: 4C AE 60 183 JMP :5 184 185 * New command 186 60B9: AD 1F 61 187 :1 LDA SAV_ACC ; load AVR command 60BC: C9 81 188 CMP #C_MODPD ; mode prodos? 60BE: D0 06 189 BNE :2 ; no 190 60C0: 8D E6 60 191 STA A_OS ; save operating system 60C3: 4C E1 60 192 JMP :3 ; don't save mode because no parameter 193 194 :2 ; file selection? 60C6: C9 41 195 CMP #'A' ; >='A'? 60C8: 90 14 196 BCC :6 ; no 197 60CA: C9 51 198 CMP #'Q' ; <='P'? 60CC: B0 10 199 BCS :6 ; no 200 60CE: 8D E8 60 201 STA A_FILE ; store letter 60D1: A5 46 202 LDA P_BLKL ; save the last block which was read 60D3: 8D E9 60 203 STA A_BLKL 60D6: A5 47 204 LDA P_BLKH 60D8: 8D EA 60 205 STA A_BLKH 60DB: 4C E1 60 206 JMP :3 ; don't save mode because no parameter 207 208 60DE: 8D E5 60 209 :6 STA A_MODE ; save mode 210 60E1: 20 0A 61 211 :3 JSR RST_ENV 60E4: 60 212 RTS 213 60E5: 00 214 A_MODE DFB 0 ; current mode (AVR command) 60E6: 00 215 A_OS DFB 0 ; operating system 60E7: 00 216 A_ORIG DFB 0 ; byte for origin 60E8: 00 217 A_FILE DFB 0 ; ['A'..'P'] 60E9: 00 218 A_BLKL DFB 0 ; low current FAT16 CAT block 60EA: 00 219 A_BLKH DFB 0 ; high 220 221 *------------------------------- 222 * PD8 ProDOS device driver sim 223 *------------------------------- 224 225 PDD 60EB: 20 F5 60 226 JSR SAV_ENV 60EE: 20 26 61 227 JSR ENTRY 60F1: 20 0A 61 228 JSR RST_ENV 60F4: 60 229 RTS 230 231 232 *------------------------------- 233 * Save environment 234 *------------------------------- 235 236 SAV_ENV 60F5: 8D 1F 61 237 STA SAV_ACC 60F8: 8E 20 61 238 STX SAV_X 60FB: 8C 21 61 239 STY SAV_Y 240 60FE: A0 03 241 LDY #3 6100: B9 EC 00 242 :1 LDA $EC,Y 6103: 99 22 61 243 STA SAV_ZP,Y 6106: 88 244 DEY 6107: 10 F7 245 BPL :1 246 6109: 60 247 RTS 248 249 250 *------------------------------- 251 * Restore environment 252 *------------------------------- 253 254 RST_ENV 610A: A0 03 255 LDY #3 610C: B9 22 61 256 :1 LDA SAV_ZP,Y 610F: 99 EC 00 257 STA $EC,Y 6112: 88 258 DEY 6113: 10 F7 259 BPL :1 260 6115: AD 1F 61 261 LDA SAV_ACC 6118: AE 20 61 262 LDX SAV_X 611B: AC 21 61 263 LDY SAV_Y 264 611E: 60 265 RTS 266 267 268 *------------------------------- 269 * Saved valued 270 *------------------------------- 271 611F: 00 272 SAV_ACC DFB 0 6120: 00 273 SAV_X DFB 0 6121: 00 274 SAV_Y DFB 0 6122: 00 00 00 275 SAV_ZP DS 4,0 6125: 00 276 277 278 *==============================* 279 * * 280 * PRODOS ENTRY POINT * 281 * * 282 *==============================* 283 284 ENTRY 285 286 * Calc memory offset for the source of datas 287 6126: A9 00 288 LDA #0 ; low mem address where the block is stored 6128: 85 EC 289 STA $EC 290 612A: A5 46 291 LDA P_BLKL ; low block*2 612C: 0A 292 ASL 612D: 85 ED 293 STA $ED 294 612F: AD E8 60 295 LDA A_FILE ; file selected? 6132: D0 0D 296 BNE :2 ; yes 297 6134: AD E7 60 298 LDA A_ORIG ; origin 6137: C9 AA 299 CMP #P_ZERO ; =1st block after MBR? 6139: D0 03 300 BNE :1 ; no -> FAT16 301 302 ; +beginning of the storage location 613B: A9 20 303 LDA #>SDBUFZERO ; first blocks of the SD card 613D: 2C 304 DFB $2C ; bit 613E: A9 2E 305 :1 LDA #>SDBUFCAT ; first blocks of the FAT16 catalog 6140: 2C 306 DFB $2C ; bit 6141: A9 3E 307 :2 LDA #>SDBUFBIN ; first blocks of the selected bin (HDV/NIB) 308 6143: 18 309 CLC 6144: 65 ED 310 ADC $ED 6146: 85 ED 311 STA $ED ; high mem address where the block is stored 312 313 * Dispatch ProDOS command 314 6148: 18 315 CLC ; default return flag (device ready) 6149: A4 42 316 LDY P_CMD ; get ProDOS command 614B: F0 0D 317 BEQ DO_STAT ; P_STAT 318 614D: 88 319 DEY 614E: F0 10 320 BEQ DO_READ ; P_READ 321 6150: 88 322 DEY ; P_WRITE? 6151: D0 03 323 BNE DO_ERR ; sorry man, no format cmd! 324 325 326 *==============================* 327 * * 328 * WRITE REQUEST * 329 * * 330 *==============================* 331 332 * Out: carry = 0 : no err 333 * carry = 1 : err & acc=err number 334 335 DO_WRITE 6153: 4C 56 61 336 JMP DO_ERR ; not supported 337 338 339 *==============================* 340 * * 341 * ERRORS * 342 * * 343 *==============================* 344 345 DO_ERR 6156: A9 27 346 LDA #ERR_IO ; I/O err 6158: 38 347 SEC 6159: 60 348 RTS ; return to ProDOS 349 350 351 *==============================* 352 * * 353 * STATUS REQUEST * 354 * * 355 *==============================* 356 615A: 98 357 DO_STAT TYA ; acc=0 615B: A2 FF 358 LDX #$FF ; low blocks available 615D: A0 FF 359 LDY #$FF ; high blocks available 615F: 60 360 RTS ; carry=0 361 362 363 *==============================* 364 * * 365 * READ REQUEST * 366 * * 367 *==============================* 368 369 * Out: carry = 0 : no err 370 * carry = 1 : err & acc=err number 371 372 DO_READ 373 374 * Read 256 bytes 375 6160: B1 EC 376 :1 LDA ($EC),Y ; fetch sector data 6162: 91 44 377 STA (P_BUFL),Y 6164: C8 378 INY 6165: D0 F9 379 BNE :1 380 381 * Read 256 bytes 382 6167: E6 ED 383 INC $ED 6169: E6 45 384 INC P_BUFH ; next page of memory 385 ; Y=0 616B: B1 EC 386 :2 LDA ($EC),Y 616D: 91 44 387 STA (P_BUFL),Y 616F: C8 388 INY 6170: D0 F9 389 BNE :2 390 6172: C6 45 391 DEC P_BUFH ; restore previous user value 392 6174: 18 393 CLC ; no err 6175: 60 394 RTS 395 396 397 *------------------------------- 398 * Convert an hexa value into 399 * 2 digits 400 *------------------------------- 401 402 * In : Acc = hex value 403 * Out: Acc = high "digit" 404 * Y = low "digit" 405 6176: 48 406 HEXDIGIT PHA ; save it 6177: 29 0F 407 AND #%00001111 6179: 18 408 CLC 617A: 69 B0 409 ADC #"0" 617C: A8 410 TAY ; low 411 617D: 68 412 PLA ; restore it 617E: 4A 413 LSR 617F: 4A 414 LSR 6180: 4A 415 LSR 6181: 4A 416 LSR 6182: 18 417 CLC 6183: 69 B0 418 ADC #"0" ; high 6185: 60 419 RTS 420 421 6186: 00 00 00 422 DS \,0 6189: 00 00 00 00 618D: 00 00 00 00 6191: 00 00 00 00 6195: 00 00 00 00 6199: 00 00 00 00 619D: 00 00 00 00 61A1: 00 00 00 00 61A5: 00 00 00 00 61A9: 00 00 00 00 61AD: 00 00 00 00 61B1: 00 00 00 00 61B5: 00 00 00 00 61B9: 00 00 00 00 61BD: 00 00 00 00 61C1: 00 00 00 00 61C5: 00 00 00 00 61C9: 00 00 00 00 61CD: 00 00 00 00 61D1: 00 00 00 00 61D5: 00 00 00 00 61D9: 00 00 00 00 61DD: 00 00 00 00 61E1: 00 00 00 00 61E5: 00 00 00 00 61E9: 00 00 00 00 61ED: 00 00 00 00 61F1: 00 00 00 00 61F5: 00 00 00 00 61F9: 00 00 00 00 61FD: 00 00 00 423 424 SAV PD8.SIMUL Object saved as PD8.SIMUL,A$6000,L$0200,BIN --End assembly, 512 bytes, Errors: 0 Symbol table - alphabetical order: AVR =$609C A_BLKH =$60EA A_BLKL =$60E9 A_FILE =$60E8 A_MODE =$60E5 A_ORIG =$60E7 A_OS =$60E6 BINMSGD1=$6096 BINMSGD2=$6097 BINMSGD3=$6098 BINMSGD4=$6099 BINMSGL =$607D BIN_MSG =$6074 BOOT =$6009 ? C_BLK =$02 ? C_DRV =$C0 C_MODPD =$81 ? C_READ =$82 ? C_WBUF =$04 ? C_WRITE =$A2 DO_ERR =$6156 DO_READ =$6160 DO_STAT =$615A ? DO_WRITE=$6153 ENTRY =$6126 ERR_IO =$27 HEXDIGIT=$6176 PDD =$60EB P_BLKH =$47 P_BLKL =$46 P_BUFH =$45 P_BUFL =$44 P_CMD =$42 P_CORIG =$08 ? P_FMT =$03 ? P_READ =$01 ? P_ROOTST=$55 ? P_STAT =$00 P_UNIT =$43 ? P_WRITE =$02 P_ZERO =$AA RST_ENV =$610A SAV_ACC =$611F SAV_ENV =$60F5 SAV_X =$6120 SAV_Y =$6121 SAV_ZP =$6122 SDBUFBIN=$3E00 SDBUFCAT=$2E00 SDBUFZERO=$2000 ? SIMAVR =$6003 ? SIMBOOT =$6000 ? SIMPDD =$6006 SLOT16 =$2B Symbol table - numerical order: ? P_STAT =$00 ? P_READ =$01 ? P_WRITE =$02 ? C_BLK =$02 ? P_FMT =$03 ? C_WBUF =$04 P_CORIG =$08 ERR_IO =$27 SLOT16 =$2B P_CMD =$42 P_UNIT =$43 P_BUFL =$44 P_BUFH =$45 P_BLKL =$46 P_BLKH =$47 ? P_ROOTST=$55 C_MODPD =$81 ? C_READ =$82 ? C_WRITE =$A2 P_ZERO =$AA ? C_DRV =$C0 SDBUFZERO=$2000 SDBUFCAT=$2E00 SDBUFBIN=$3E00 ? SIMBOOT =$6000 ? SIMAVR =$6003 ? SIMPDD =$6006 BOOT =$6009 BIN_MSG =$6074 BINMSGL =$607D BINMSGD1=$6096 BINMSGD2=$6097 BINMSGD3=$6098 BINMSGD4=$6099 AVR =$609C A_MODE =$60E5 A_OS =$60E6 A_ORIG =$60E7 A_FILE =$60E8 A_BLKL =$60E9 A_BLKH =$60EA PDD =$60EB SAV_ENV =$60F5 RST_ENV =$610A SAV_ACC =$611F SAV_X =$6120 SAV_Y =$6121 SAV_ZP =$6122 ENTRY =$6126 ? DO_WRITE=$6153 DO_ERR =$6156 DO_STAT =$615A DO_READ =$6160 HEXDIGIT=$6176