1 2 ;LST OFF 3 ORG $0800 4 5 ******************************** 6 * * 7 * Beautiful Boot (part 1) * 8 * for Pseudo-Disk ][ * 9 * Version 20090131 * 10 * By Deckard * 11 * * 12 ******************************** 13 14 * WARNING: assume ROM = BOOT.MMC (ProDOS mode) 15 16 * In: UNIT = DSSS0000 17 * X = DSSS0000 (e.g. $40=slot 4, drive 1) 18 19 *------------------------------- 20 * Device driver parameters 21 *------------------------------- 22 23 P_CMD EQU $42 ; ProDOS 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 address of I/O buffer (Buffer: $0A00-$0BFF) 26 P_BUFH EQU $45 ; High 27 P_BLKL EQU $46 ; Low block number 28 P_BLKH EQU $47 ; High 29 30 *------------------------------- 31 * Zero page 32 *------------------------------- 33 34 ENTRY_LO EQU $48 ; Low pointer: pseudodisk I/O vector 35 ENTRY_HI EQU $49 ; High 36 37 *------------------------------- 38 * User ram 39 *------------------------------- 40 41 BOOT2 EQU $0A00 ; $0A00-$14FF(max) 42 SIMPDD EQU $6006 ; simulation: PD8 ProDOS Device Driver 43 44 *------------------------------- 45 * Rom 46 *------------------------------- 47 48 HOME EQU $FC58 49 COUT1 EQU $FDF0 ; output acc 50 MONZ EQU $FF69 ; call-151 51 52 *------------------------------- 53 * Device command code 54 *------------------------------- 55 56 P_STAT = 0 57 P_READ = 1 58 P_WRITE = 2 59 P_FMT = 3 60 61 *------------------------------- 62 * Flags 63 *------------------------------- 64 65 SIMUL = 0 ; 0=PD8 plugged, 1=no PD8 66 67 ******************************** 68 0800: 01 69 DFB 1 ; don't use the boot stored in AVR 70 71 *------------------------------- 72 * Exec boot1 (load & run boot2) 73 *------------------------------- 74 0801: 8A 75 BOOT1 TXA ; acc=DSSS0000, boot from drive 1 (D=0) 0802: 4A 76 LSR 0803: 4A 77 LSR 0804: 4A 78 LSR 0805: 4A 79 LSR ; Get slot # (DSSS) 0806: 09 C0 80 ORA #$C0 ; $Cslot (eg: acc=#$C4 for slot 4) 0808: 85 49 81 STA ENTRY_HI 080A: A0 FF 82 LDY #$FF ; retrieve last byte from ROM (ProDOS convention) 080C: 84 48 83 STY ENTRY_LO ; = low driver addr 080E: C8 84 INY ; Y=0 080F: B1 48 85 LDA (ENTRY_LO),Y ; $CxFF. acc points to driver entry 0811: 85 48 86 STA ENTRY_LO ; ok, pointer set 87 88 * Load the remaining blocks of the Beautiful Boot 89 0813: CE FE 09 90 :2 DEC NB_BLK ; -1 block 0816: F0 38 91 BEQ :1 ; it was the last one 92 0818: E6 45 93 INC P_BUFH ; next buffer of 512 bytes 081A: E6 45 94 INC P_BUFH ; because in BOOT.MMC, DO_READ does a "DEC P_BUFH" 081C: E6 46 95 INC P_BLKL ; next block 081E: A9 01 96 LDA #P_READ ; ProDOS Read command 0820: 85 42 97 STA P_CMD 98 0822: 20 53 08 99 JSR DO_CALL ; Read block 0825: 90 EC 100 BCC :2 ; no err 101 0827: 20 58 FC 102 JSR HOME 082A: 20 57 08 103 JSR DSP_TXT_STR ; sorry, I can't load the Beautiful Boot 082D: C3 E1 EE 104 ASC "Can't load the Beautiful Boot!" 0830: A7 F4 A0 EC 0834: EF E1 E4 A0 0838: F4 E8 E5 A0 083C: C2 E5 E1 F5 0840: F4 E9 E6 F5 0844: EC A0 C2 EF 0848: EF F4 A1 084B: 8D 00 105 DFB $8D,0 106 084D: 4C 69 FF 107 JMP MONZ ; end 108 0850: 4C 00 0A 109 :1 JMP BOOT2 ; run boot2 110 111 112 *------------------------------- 113 * Run Pseudo-Disk ][ ProDOS 114 * device driver with parameters 115 *------------------------------- 116 117 DO_CALL 118 DO SIMUL 119 JMP SIMPDD ; work without pseudodisk 120 ELSE 0853: 6C 48 00 121 JMP (ENTRY_LO) 122 FIN 0856: 60 123 RTS 124 125 126 *------------------------------- 127 * Print string on TXT screen 128 *------------------------------- 129 130 DSP_TXT_STR 0857: 68 131 PLA ; restore ptr-1 on the string 0858: 85 08 132 STA $08 085A: 68 133 PLA 085B: 85 09 134 STA $09 135 085D: 98 136 TYA ; save Y and X registers 085E: 48 137 PHA 085F: 8A 138 TXA 0860: 48 139 PHA 140 0861: A0 00 141 LDY #0 0863: E6 08 142 :1 INC $08 ; next character of the string (or 1st one) 0865: D0 02 143 BNE :2 ; low only 144 0867: E6 09 145 INC $09 ; high 146 0869: B1 08 147 :2 LDA ($08),Y ; get character 086B: F0 06 148 BEQ :3 ; end of string 149 086D: 20 F0 FD 150 JSR COUT1 0870: 4C 63 08 151 JMP :1 ; next character 152 0873: 68 153 :3 PLA ; restore X and Y registers 0874: AA 154 TAX 0875: 68 155 PLA 0876: A8 156 TAY 157 0877: A5 09 158 LDA $09 ; ptr (after string) on stack 0879: 48 159 PHA 087A: A5 08 160 LDA $08 087C: 48 161 PHA 087D: 60 162 RTS ; return to sender 163 164 165 *------------------------------- 166 * Addresses of each line of the 167 * HGR2 screen 168 *------------------------------- 169 170 * Low address 171 172 173 HGR2_DATAL 087E: 00 00 00 174 HEX 0000000000000000 0881: 00 00 00 00 0885: 00 175 0886: 80 80 80 176 HEX 8080808080808080 0889: 80 80 80 80 088D: 80 088E: 00 00 00 177 HEX 0000000000000000 0891: 00 00 00 00 0895: 00 0896: 80 80 80 178 HEX 8080808080808080 0899: 80 80 80 80 089D: 80 089E: 00 00 00 179 HEX 0000000000000000 08A1: 00 00 00 00 08A5: 00 08A6: 80 80 80 180 HEX 8080808080808080 08A9: 80 80 80 80 08AD: 80 08AE: 00 00 00 181 HEX 0000000000000000 08B1: 00 00 00 00 08B5: 00 08B6: 80 80 80 182 HEX 8080808080808080 08B9: 80 80 80 80 08BD: 80 08BE: 28 28 28 183 HEX 2828282828282828 08C1: 28 28 28 28 08C5: 28 08C6: A8 A8 A8 184 HEX A8A8A8A8A8A8A8A8 08C9: A8 A8 A8 A8 08CD: A8 08CE: 28 28 28 185 HEX 2828282828282828 08D1: 28 28 28 28 08D5: 28 08D6: A8 A8 A8 186 HEX A8A8A8A8A8A8A8A8 08D9: A8 A8 A8 A8 08DD: A8 08DE: 28 28 28 187 HEX 2828282828282828 08E1: 28 28 28 28 08E5: 28 08E6: A8 A8 A8 188 HEX A8A8A8A8A8A8A8A8 08E9: A8 A8 A8 A8 08ED: A8 08EE: 28 28 28 189 HEX 2828282828282828 08F1: 28 28 28 28 08F5: 28 08F6: A8 A8 A8 190 HEX A8A8A8A8A8A8A8A8 08F9: A8 A8 A8 A8 08FD: A8 08FE: 50 50 50 191 HEX 5050505050505050 0901: 50 50 50 50 0905: 50 0906: D0 D0 D0 192 HEX D0D0D0D0D0D0D0D0 0909: D0 D0 D0 D0 090D: D0 090E: 50 50 50 193 HEX 5050505050505050 0911: 50 50 50 50 0915: 50 0916: D0 D0 D0 194 HEX D0D0D0D0D0D0D0D0 0919: D0 D0 D0 D0 091D: D0 091E: 50 50 50 195 HEX 5050505050505050 0921: 50 50 50 50 0925: 50 0926: D0 D0 D0 196 HEX D0D0D0D0D0D0D0D0 0929: D0 D0 D0 D0 092D: D0 092E: 50 50 50 197 HEX 5050505050505050 0931: 50 50 50 50 0935: 50 0936: D0 D0 D0 198 HEX D0D0D0D0D0D0D0D0 0939: D0 D0 D0 D0 093D: D0 199 200 * High address 201 202 203 HGR2_DATAH 093E: 40 44 48 204 HEX 4044484C5054585C 0941: 4C 50 54 58 0945: 5C 205 0946: 40 44 48 206 HEX 4044484C5054585C 0949: 4C 50 54 58 094D: 5C 094E: 41 45 49 207 HEX 4145494D5155595D 0951: 4D 51 55 59 0955: 5D 0956: 41 45 49 208 HEX 4145494D5155595D 0959: 4D 51 55 59 095D: 5D 095E: 42 46 4A 209 HEX 42464A4E52565A5E 0961: 4E 52 56 5A 0965: 5E 0966: 42 46 4A 210 HEX 42464A4E52565A5E 0969: 4E 52 56 5A 096D: 5E 096E: 43 47 4B 211 HEX 43474B4F53575B5F 0971: 4F 53 57 5B 0975: 5F 0976: 43 47 4B 212 HEX 43474B4F53575B5F 0979: 4F 53 57 5B 097D: 5F 097E: 40 44 48 213 HEX 4044484C5054585C 0981: 4C 50 54 58 0985: 5C 0986: 40 44 48 214 HEX 4044484C5054585C 0989: 4C 50 54 58 098D: 5C 098E: 41 45 49 215 HEX 4145494D5155595D 0991: 4D 51 55 59 0995: 5D 0996: 41 45 49 216 HEX 4145494D5155595D 0999: 4D 51 55 59 099D: 5D 099E: 42 46 4A 217 HEX 42464A4E52565A5E 09A1: 4E 52 56 5A 09A5: 5E 09A6: 42 46 4A 218 HEX 42464A4E52565A5E 09A9: 4E 52 56 5A 09AD: 5E 09AE: 43 47 4B 219 HEX 43474B4F53575B5F 09B1: 4F 53 57 5B 09B5: 5F 09B6: 43 47 4B 220 HEX 43474B4F53575B5F 09B9: 4F 53 57 5B 09BD: 5F 09BE: 40 44 48 221 HEX 4044484C5054585C 09C1: 4C 50 54 58 09C5: 5C 09C6: 40 44 48 222 HEX 4044484C5054585C 09C9: 4C 50 54 58 09CD: 5C 09CE: 41 45 49 223 HEX 4145494D5155595D 09D1: 4D 51 55 59 09D5: 5D 09D6: 41 45 49 224 HEX 4145494D5155595D 09D9: 4D 51 55 59 09DD: 5D 09DE: 42 46 4A 225 HEX 42464A4E52565A5E 09E1: 4E 52 56 5A 09E5: 5E 09E6: 42 46 4A 226 HEX 42464A4E52565A5E 09E9: 4E 52 56 5A 09ED: 5E 09EE: 43 47 4B 227 HEX 43474B4F53575B5F 09F1: 4F 53 57 5B 09F5: 5F 09F6: 43 47 4B 228 HEX 43474B4F53575B5F 09F9: 4F 53 57 5B 09FD: 5F 229 230 *------------------------------- 231 09FE: 06 232 NB_BLK DFB 6 ; number of blocks+1 (512 bytes each) 233 234 *------------------------------- 235 09FF: 00 236 DS \,0 237 238 DO SIMUL 239 SAV SD1S.STARFIELD 240 ELSE 241 SAV SD1.STARFIELD Object saved as SD1.STARFIELD,A$0800,L$0200,BIN 242 FIN --End assembly, 512 bytes, Errors: 0 Symbol table - alphabetical order: ? BOOT1 =$0801 BOOT2 =$0A00 COUT1 =$FDF0 DO_CALL =$0853 DSP_TXT_STR=$0857 ENTRY_HI=$49 ENTRY_LO=$48 ? HGR2_DATAH=$093E ? HGR2_DATAL=$087E HOME =$FC58 MONZ =$FF69 NB_BLK =$09FE ? P_BLKH =$47 P_BLKL =$46 P_BUFH =$45 ? P_BUFL =$44 P_CMD =$42 ? P_FMT =$03 P_READ =$01 ? P_STAT =$00 ? P_UNIT =$43 ? P_WRITE =$02 ? SIMPDD =$6006 SIMUL =$00 Symbol table - numerical order: ? P_STAT =$00 SIMUL =$00 P_READ =$01 ? P_WRITE =$02 ? P_FMT =$03 P_CMD =$42 ? P_UNIT =$43 ? P_BUFL =$44 P_BUFH =$45 P_BLKL =$46 ? P_BLKH =$47 ENTRY_LO=$48 ENTRY_HI=$49 ? BOOT1 =$0801 DO_CALL =$0853 DSP_TXT_STR=$0857 ? HGR2_DATAL=$087E ? HGR2_DATAH=$093E NB_BLK =$09FE BOOT2 =$0A00 ? SIMPDD =$6006 HOME =$FC58 COUT1 =$FDF0 MONZ =$FF69