:asm 1 2 ; LST OFF 3 ORG $1F00 4 5 USE EDD.PAGE0 8 ******************************** 9 * * 10 * ESSENTIAL DATA DUPLICATOR * 11 * VERSION 4.8 STANDARD/PLUS * 12 * 6502 ASSEMBLY SOURCE CODE * 13 * COPYRIGHT (C) 1987 * 14 * ALL RIGHTS RESERVED * 15 * UTILICO MICROWARE * 16 * DONALD ANTHONY SCHNAPP * 17 * PRINTED OCTOBER 28, 1987 * 18 * * 19 ******************************** 20 21 * 2008/02/10 - Deckard 22 23 * Steps of the anti-Wildcard protection scheme: 24 * 25 * (1) During the boot 2 process of the original disk, call 26 * a routine (H1F0F) which captures computer informations 27 * (disk II cards mapping, computer model, slot 3 and ram). 28 * These datas are stored in memory and are used as 29 * reference. 30 * 31 * (2) A pirate uses his copy board and takes a snapshot 32 * of EDD when the program is loaded and the menu 33 * displayed on the screen. 34 * He creates a bootable resurrect disk also called 35 * a wildcard bootstrap disk (to have a 16 sectors disk 36 * he can easily copy with tools such as Locksmith Fast 37 * Copy, Disk Muncher, ...) 38 * And he gives copies to his friends. Copies don't 39 * have anymore the original boot 2 (which is lost). 40 * 41 * (3) A friend boots up one copy. And he has a different 42 * apple II configuration. 43 * 44 * (4) EDD has traps: it checks (comparaison) that the 45 * current computer informations are equal to the 46 * stored datas (boot 2 references). If 1 difference 47 * is found, EDD knows that the running program isn't 48 * an original disk and a crash occurs. 49 * The entry point of the check routine is H1F0C and 50 * is called CHECKMEM. 51 52 *------------------------------- 53 54 ZEROPAGE_PGM EQU $0080 ; location of program in zero page 55 BEGPAGE2 EQU $0800 ; beginning of text page 2 56 BEGSPRSE EQU $0C00 ; byte after text page 2 (sparse) 57 58 *------------------------------- 59 1F00: A5 72 60 H1F00 LDA $72 ; code not used??? 1F02: A0 34 61 LDY #$34 1F04: 20 36 20 62 JSR H2036 1F07: A4 18 63 LDY $18 1F09: 20 25 20 64 JSR GET_MACH_INFO 65 66 *------------------------------- 67 * Check the current computer 68 *------------------------------- 69 70 H1F0C 1F0C: 4C 27 1F 71 CHECKMEM JMP DO_CHECKMEM 72 73 *------------------------------- 74 * Capture computer informations 75 * (called by EDD's boot2) 76 *------------------------------- 77 78 EDD_CCI 1F0F: 20 4F 1F 79 H1F0F JSR SEARCH_DISKII ; get disk II map 1F12: 8D 10 1F 80 STA H1F0F+1 ; NOW KILL THE JSR (=hide the call) with the 81 ; retrieved value 82 ; after that: H1F0F JSR $1F40 83 ; ($1F10) = $40 <=> slot 6 1F15: 8D 8A 1F 84 STA DISKII_MAP ; store disk II mapping 85 1F18: 20 91 1F 86 H1F18 JSR GET_MI_IN_ZP ; put the GET_MACH_INFO routine in zero page 1F1B: 8C 19 1F 87 STY H1F18+1 ; NOW KILL THE JSR (=hide the call) 88 ; after that: H1F18 JSR $1F80 89 1F1E: 20 80 00 90 JSR ZEROPAGE_PGM ; exec GET_MACH_INFO (store ref values) 1F21: 86 90 91 STX $90 1F23: 8E 37 20 92 STX H2036+1 ; hide the BOOT_ROM_ID location 1F26: 60 93 RTS 94 95 *------------------------------- 96 * Exec check memory routine 97 *------------------------------- 98 99 DO_CHECKMEM 1F27: 20 4F 1F 100 JSR SEARCH_DISKII ; get disk II mapping 1F2A: CD 8A 1F 101 CMP DISKII_MAP ; same as boot process? 1F2D: D0 1C 102 BNE PIRATE ; no => pirate!!! 103 104 ; Y=$80 1F2F: 20 98 1F 105 JSR CMP_MI_IN_ZP ; copy check routine in zero page 1F32: 20 80 00 106 JSR ZEROPAGE_PGM ; exec check routine and get flag result 1F35: B0 14 107 BCS PIRATE ; not the same values => pirate!!! 108 109 * Kill 1st page of bank 2 110 * WHY TO DO THAT HERE???? Not clear... 111 * Is it really the original code??? 112 1F37: AD 83 C0 113 LDA $C083 ; read/write bank 2 1F3A: AD 83 C0 114 LDA $C083 1F3D: A0 00 115 LDY #0 116 1F3F: 98 117 H1F3F TYA 1F40: 99 00 D0 118 STA $D000,Y ; $D000-$D0FF filled with increasing values 1F43: C8 119 INY 1F44: D0 F9 120 BNE H1F3F 121 1F46: AD 82 C0 122 LDA $C082 ; rom only 1F49: 60 123 RTS 124 1F4A: 60 125 RTS 126 127 H1F4B 1F4B: AD 82 C0 128 PIRATE LDA $C082 ; rom only 1F4E: EA 129 NOP ; was DFB $02 <=> CRASH (EDD 4.2 crack only) 130 ; replaced by NOP in cracked version (=no crash but 131 ; run the SEARCH_DISK II again) 132 133 *------------------------------- 134 * Slotscan : search for disk II 135 * controller 136 *------------------------------- 137 138 * Out: acc = disk II map (0, 1 or more cards) 139 * 00000000 = no card 140 * If only 1 card (otherwise ORA values) 141 * 00000010 = slot 1 142 * 00000100 = slot 2 143 * 00001000 = slot 3 144 * 00010000 = slot 4 145 * 00100000 = slot 5 146 * 01000000 = slot 6 147 * 10000000 = slot 7 148 * Y = $80 149 150 H1F4F 151 SEARCH_DISKII 1F4F: A9 C7 152 LDA #>$C700 ; high : begin with slot 7 1F51: 85 01 153 STA W1H 1F53: A9 00 154 LDA #<$C700 ; low ($00) 1F55: 85 00 155 STA W1L 1F57: 8D 86 1F 156 STA DISKII_ROMID ; init map 157 158 * Search for a disk II interface card 159 * <=> check 4 bytes id 160 1F5A: A0 07 161 H1F5A LDY #7 ; Y=[7,5,3,1] 1F5C: B1 00 162 H1F5C LDA (W1L),Y 1F5E: D9 86 1F 163 CMP DISKII_ROMID,Y ; check rom byte 1F61: D0 17 164 BNE H1F7A ; not a disk II controller 165 166 ; byte ok 1F63: 88 167 DEY ; check another 1 1F64: 88 168 DEY 1F65: 10 F5 169 BPL H1F5C ; continue checking... 170 171 ; ok disk II controller found 1F67: A5 01 172 LDA W1H ; $Cslot 1F69: 29 07 173 AND #%00000111 ; get slot [1,7] 1F6B: A8 174 TAY ; in Y register 1F6C: A9 01 175 LDA #1 ; init mask 1F6E: D0 01 176 BNE H1F71 ; always 177 1F70: 0A 178 H1F70 ASL ; shift byte according to Y reg 179 1F71: 88 180 H1F71 DEY 1F72: 10 FC 181 BPL H1F70 ; >=0 182 1F74: 0D 86 1F 183 ORA DISKII_ROMID ; if more than 1 disk II card 1F77: 8D 86 1F 184 STA DISKII_ROMID ; set map 185 186 *------------------------------- 187 1F7A: C6 01 188 H1F7A DEC W1H ; previous slot 1F7C: A5 01 189 LDA W1H 1F7E: C9 C0 190 CMP #$C0 ; is it slot 0? 1F80: D0 D8 191 H1F80 BNE H1F5A ; no, do this slot 192 ; no disk II controller in slot 0!!! 193 194 ; end of scan 1F82: AD 86 1F 195 LDA DISKII_ROMID ; retrieve disk II map 1F85: 60 196 RTS 197 198 *------------------------------- 199 * Disk II controller rom id 200 *------------------------------- 201 202 H1F86 203 DISKII_ROMID 1F86: 40 204 HEX 40 1F87: 20 205 HEX 20 ; $Cn01 (LDX #$20) 1F88: FF 206 HEX FF 1F89: 00 207 HEX 00 ; $Cn03 (LDY #$00) 1F8A: 40 208 DISKII_MAP DFB %01000000 ; =disk II in slot 6 1F8B: 03 209 HEX 03 ; $Cn05 (LDX #$03) 1F8C: FF 210 HEX FF 1F8D: 3C 211 HEX 3C ; $Cn07 (STX $3C) 212 213 *------------------------------- 214 * Machine Id 215 *------------------------------- 216 217 * Contains the values when an ORIGINAL 218 * EDD is booted. 219 220 * EDD 4.2 crack: values= $77 $77 $77 221 * EDD 4.9 crack: values= $EA $77 $00 222 * SST : values= $06 $00 $81 223 1F8E: 06 224 BOOT_ROM_ID HEX 06 ; initial ROM_VERSION 225 ; $06 = apple IIe or //c or IIGS 226 ; $38 = apple ][ 227 ; $EA = ][+ or /// (emulation) 1F8F: 00 228 BOOT_SC3ROM HEX 00 ; initial SLOTC3ROM 1F90: 81 229 BOOT_RAM HEX 81 ; initial ram status 230 ; bit 0 [0=48k, 1=64k] 231 ; bit 7 [0=no aux, 1=aux] 232 ; $81 = aux ram & 64k (or more) 233 234 *------------------------------- 235 * Put GET_MACH_INFO in zero page 236 *------------------------------- 237 238 GET_MI_IN_ZP 1F91: A9 20 239 LDA #>GET_MACH_INFO 1F93: A2 25 240 LDX #CMP_MACH_INFO 1F9A: A2 AB 249 LDX # pirate!!! 280 1FB5: C9 06 281 CMP #$06 ; rom version $06 (IIe or //c or IIGS)? 1FB7: D0 45 282 BNE H1FFE ; no: ][, ][+ or /// (emulation) 283 ; default for these machines is "no aux ram" 284 285 * IIe or //c or IIGS 286 287 * 288 * Check card in auxiliary slot 289 * 290 1FB9: AD 17 C0 291 LDA $C017 ; read SLOTC3ROM 1FBC: 29 80 292 AND #%10000000 ; keep bit 7 1FBE: CD 8F 1F 293 CMP BOOT_SC3ROM ; check original SLOTC3ROM 1FC1: D0 5A 294 BNE SET_PIRATE ; no=> pirate!!! 295 1FC3: A8 296 TAY 1FC4: 30 38 297 BMI H1FFE ; bit 7=1 => card in slot 3 (use it, no aux) 298 299 ; bit 7=0 => use card in aux slot 300 * Aux mem or not? 301 302 ; main(BEGSPRSE) 1FC6: AD 00 0C 303 LDA BEGSPRSE ; same content in princ and aux mem? 1FC9: 8D 03 C0 304 STA AUXREAD 1FCC: 8D 05 C0 305 STA AUXWRT 1FCF: CD 00 0C 306 CMP BEGSPRSE ; compare with value written by GET_MACH_INFO!!! 307 308 * Aux : main(BEGSPRSE)=aux(BEGSPRSE) IF ORIGINAL DISK 309 * or 128k resurrect disk 310 1FD2: F0 1B 311 BEQ H1FEF ; aux memory 312 313 * >> No aux mem << 314 1FD4: A8 315 TAY ; save it 1FD5: 49 FF 316 EOR #$FF 1FD7: CD 00 0C 317 CMP BEGSPRSE ; try the eored value 1FDA: D0 41 318 BNE SET_PIRATE ; ha ha ha, got you 319 1FDC: CD 00 08 320 CMP BEGPAGE2 321 * No aux: BEGPAGE2 = BEGSPRSE 1FDF: D0 3C 322 BNE SET_PIRATE ; you're dead man!!! 323 1FE1: 8C 00 08 324 STY BEGPAGE2 1FE4: CC 00 0C 325 CPY BEGSPRSE 326 * No aux: test mirror effect 1FE7: D0 34 327 BNE SET_PIRATE ; doesn't work -> killed!! 328 1FE9: 8D 00 08 329 STA BEGPAGE2 1FEC: 38 330 SEC 1FED: B0 09 331 BCS H1FF8 ; always 332 333 * >> Aux mem << 334 1FEF: 49 FF 335 H1FEF EOR #$FF 1FF1: CD 00 08 336 CMP BEGPAGE2 337 * Aux: main(BEGSPRSE) = aux(BEGPAGE2) EOR #$FF 1FF4: D0 27 338 BNE SET_PIRATE 339 1FF6: A2 80 340 LDX #$80 ; prepare mask for comparaison (aux set in flag) 341 1FF8: 8D 02 C0 342 H1FF8 STA MAINREAD ; R/W main 1FFB: 8D 04 C0 343 STA MAINWRT 344 345 * 346 * Check language card 347 * 348 349 * Compare page filled with increasing values written by 350 * boot 2 process 351 1FFE: AD 80 C0 352 H1FFE LDA $C080 ; read bank 2 2001: A0 00 353 LDY #$00 2003: 98 354 H2003 TYA 2004: D9 00 D0 355 CMP $D000,Y 2007: D0 03 356 BNE H200C ; no language card -> acc=0 357 2009: C8 358 INY 200A: D0 F7 359 BNE H2003 360 ; beq 361 200C: 08 362 H200C PHP ; save result 200D: AD 82 C0 363 LDA $C082 ; rom 2010: 8A 364 TXA ; retrieve bit 7 (flag) 2011: 28 365 PLP ; retrieve result 2012: D0 02 366 BNE H2016 ; no language card 367 2014: 09 01 368 ORA #$01 ; 64k 2016: CD 90 1F 369 H2016 CMP BOOT_RAM ; compare with ref 2019: D0 02 370 BNE SET_PIRATE ; no wildcard allowed with different config!!! 371 201B: 18 372 CLC ; original disk! 201C: 60 373 RTS 374 201D: 38 375 SET_PIRATE SEC ; PIRATE!!! 201E: 8D 02 C0 376 STA MAINREAD 2021: 8D 04 C0 377 STA MAINWRT 2024: 60 378 RTS 379 380 *------------------------------- 381 * Get apple II informations 382 * (boot 2, original EDD disk) 383 *------------------------------- 384 385 ; ORG $0080 386 387 GET_MACH_INFO 2025: 8D 02 C0 388 STA MAINREAD ; R/W main 2028: 8D 04 C0 389 STA MAINWRT 202B: AD 82 C0 390 LDA $C082 ; rom only 391 202E: A9 00 392 LDA #$00 ; default=48k 2030: 8D 90 1F 393 STA BOOT_RAM 394 2033: AD B3 FB 395 LDA ROM_VERSION ; get apple II model 2036: 8D 8E 1F 396 H2036 STA BOOT_ROM_ID 397 ; after killing STX: STA H1F80 2039: C9 06 398 CMP #$06 ; apple IIe or //c or IIGS? 203B: D0 30 399 BNE H206D ; no: ][ or ][+ or /// (emulation). No aux ram. 400 401 * IIe or //c or IIGS 402 203D: AD 17 C0 403 LDA $C017 ; read SLOTC3ROM 2040: 29 80 404 AND #%10000000 ; keep only bit 7 2042: 8D 8F 1F 405 STA BOOT_SC3ROM ; save reference 2045: 30 26 406 BMI H206D ; bit 7=1 : a card located in slot 3 (use it, no aux) 407 408 * 409 * Check the ram card in auxiliary slot. 410 * 411 412 * Run in the safe aera not affected by bank-switching 413 * the main and aux ram (=zero page). 414 * 415 * Read Apple II Technical Notes MISC#2: 416 * 417 * "Stores a value at $0800 and sees if the same value 418 * appears at $0C00. If so, no auxiliary memory is 419 * present (the non-extended 80-column card has sparse 420 * memory mapping which causes $0800 and $0C00 to be the 421 * same location". 422 * 423 * TESTS: 424 * ===== 425 * 426 * >>>>> If no aux mem (mirror $0800/$0C00) 427 *
428 * BEGSPRSE = acc 429 * BEGPAGE2 = acc 430 * BEGPAGE2 = acc EOR #$FF (mirror=>BEGSPRSE=acc EOR #$FF) 431 * and BEGSPRSE = BEGPAGE2 432 * 433 * >>>>> If aux mem 434 *
435 * BEGSPRSE = acc 436 * BEGPAGE2 = acc 437 * BEGSPRSE = acc 438 * BEGPAGE2 = acc EOR #$FF 439 * and BEGSPRSE <> BEGPAGE2 in aux 440 * 441 * Summary: 442 * 443 * => No aux mem 444 * BEGPAGE2 = BEGSPRSE 445 * 446 * => Aux mem 447 * main(BEGSPRSE) = main(BEGPAGE2) 448 * aux (BEGSPRSE) <> aux (BEGPAGE2) 449 * main(BEGSPRSE) = aux (BEGSPRSE) 450 * main(BEGPAGE2) = aux (BEGPAGE2) EOR #$FF 451 2047: AD 00 0C 452 LDA BEGSPRSE 204A: 8D 00 08 453 STA BEGPAGE2 204D: 8D 03 C0 454 STA AUXREAD ; switch on if there is an aux memory 2050: 8D 05 C0 455 STA AUXWRT 2053: 8D 00 0C 456 STA BEGSPRSE 2056: A2 80 457 LDX #%10000000 ; init aux flag 2058: 49 FF 458 EOR #$FF ; alter value 205A: 8D 00 08 459 STA BEGPAGE2 205D: CD 00 0C 460 CMP BEGSPRSE 2060: 8D 02 C0 461 STA MAINREAD ; R/W main 2063: 8D 04 C0 462 STA MAINWRT 2066: D0 02 463 BNE H206A ; aux mem detected 464 2068: A2 00 465 LDX #$00 ; no aux 206A: 8E 90 1F 466 H206A STX BOOT_RAM 467 468 * 469 * Test for presence of language card (48k=no, 64k=yes) 470 * 471 206D: AD 83 C0 472 H206D LDA $C083 ; force in language card 2070: AD 83 C0 473 LDA $C083 ; bank 2 2073: A0 00 474 LDY #0 ; fill a page with increasing values 2075: 98 475 H2075 TYA 2076: 99 00 D0 476 STA $D000,Y ; $D000=$00, $D001=$01, ..., $D0FF=$FF 2079: C8 477 INY 207A: D0 F9 478 BNE H2075 479 ; Y=0 480 ; and now compare that the value are always here 207C: 98 481 H207C TYA 207D: D9 00 D0 482 CMP $D000,Y 2080: D0 03 483 BNE H2085 ; not same value => 48k 484 2082: C8 485 INY ; continue: test the full page 2083: D0 F7 486 BNE H207C 487 ; beq 488 2085: 08 489 H2085 PHP ; save result 2086: AD 82 C0 490 LDA $C082 ; rom 2089: 28 491 PLP ; retrieve result 208A: D0 08 492 BNE H2094 ; read and write different => no language card 493 208C: A9 01 494 LDA #%00000001 ; 64k 208E: 0D 90 1F 495 ORA BOOT_RAM ; mix with aux bit 2091: 8D 90 1F 496 STA BOOT_RAM ; store result 2094: 60 497 H2094 RTS 498 2095: 00 00 00 499 DS \,0 2098: 00 00 00 00 209C: 00 00 00 00 20A0: 00 00 00 00 20A4: 00 00 00 00 20A8: 00 00 00 00 20AC: 00 00 00 00 20B0: 00 00 00 00 20B4: 00 00 00 00 20B8: 00 00 00 00 20BC: 00 00 00 00 20C0: 00 00 00 00 20C4: 00 00 00 00 20C8: 00 00 00 00 20CC: 00 00 00 00 20D0: 00 00 00 00 20D4: 00 00 00 00 20D8: 00 00 00 00 20DC: 00 00 00 00 20E0: 00 00 00 00 20E4: 00 00 00 00 20E8: 00 00 00 00 20EC: 00 00 00 00 20F0: 00 00 00 00 20F4: 00 00 00 00 20F8: 00 00 00 00 20FC: 00 00 00 00 500 501 SAV OBJ/DECKARD/EDD.CHECKMEM Object saved as OBJ/DECKARD/EDD.CHECKMEM,A$1F00,L$0200,BIN --End assembly, 512 bytes, Errors: 0 Symbol table - alphabetical order: AUXREAD =$C003 AUXWRT =$C005 ? BASIC =$E000 BEGPAGE2=$0800 BEGSPRSE=$0C00 BOOT_RAM=$1F90 BOOT_ROM_ID=$1F8E BOOT_SC3ROM=$1F8F ? CDRV =$11 ? CH =$24 ? CHECKMEM=$1F0C CMP_MACH_INFO=$1FAB CMP_MI_IN_ZP=$1F98 ? COUT =$FDED ? COUT1 =$FDF0 ? CSLT =$10 ? CSWH =$37 ? CSWL =$36 ? CTRK =$12 ? CV =$25 ? CWRK =$13 ? DCF =$14 DISKII_MAP=$1F8A DISKII_ROMID=$1F86 DO_CHECKMEM=$1F27 ? EDD_CCI =$1F0F GET_MACH_INFO=$2025 GET_MI_IN_ZP=$1F91 ? H1F00 =$1F00 ? H1F0C =$1F0C H1F0F =$1F0F H1F18 =$1F18 H1F3F =$1F3F ? H1F4B =$1F4B ? H1F4F =$1F4F H1F5A =$1F5A H1F5C =$1F5C H1F70 =$1F70 H1F71 =$1F71 H1F7A =$1F7A ? H1F80 =$1F80 ? H1F86 =$1F86 H1FA2 =$1FA2 ? H1FAB =$1FAB H1FEF =$1FEF H1FF8 =$1FF8 H1FFE =$1FFE H2003 =$2003 H200C =$200C H2016 =$2016 H2036 =$2036 H206A =$206A H206D =$206D H2075 =$2075 H207C =$207C H2085 =$2085 H2094 =$2094 ? HC088 =$C088 ? HC089 =$C089 ? HC08A =$C08A ? HC08B =$C08B ? HC08C =$C08C ? HC08D =$C08D ? HC08E =$C08E ? HC08F =$C08F ? HC0EC =$C0EC ? HDCF =$18 ? HHXH =$1A ? HHXL =$19 ? HIRES =$C057 ? HISCR =$C055 ? HOME =$FC58 ? HXF =$15 ? HXH =$17 ? HXL =$16 ? KEY =$C000 ? LDCF =$1B ? LHXH =$1D ? LHXL =$1C ? LOWSCR =$C054 MAINREAD=$C002 MAINWRT =$C004 ? MIXCLR =$C052 ? OLDRST =$FF59 ? PHASEOFF=$C080 PIRATE =$1F4B ? ROM =$C081 ROM_VERSION=$FBB3 ? SAH =$0D ? SAL =$0C ? SCHP =$0B ? SCVP =$0A SEARCH_DISKII=$1F4F ? SETKBD =$FE89 ? SETVID =$FE93 SET_PIRATE=$201D ? SPKR =$C030 STORE_ZP=$1F9C ? STROBE =$C010 ? TXTCLR =$C050 ? TXTSET =$C051 ? VMODE =$20 ? VTAB =$FC22 W1H =$01 W1L =$00 ? W2H =$03 ? W2L =$02 ? W3H =$05 ? W3L =$04 ? W4H =$07 ? W4L =$06 ? W5H =$09 ? W5L =$08 ? WNDTOP =$22 ? WZPAGE1 =$0E ? WZPAGE2 =$0F ZEROPAGE_PGM=$80 Symbol table - numerical order: W1L =$00 W1H =$01 ? W2L =$02 ? W2H =$03 ? W3L =$04 ? W3H =$05 ? W4L =$06 ? W4H =$07 ? W5L =$08 ? W5H =$09 ? SCVP =$0A ? SCHP =$0B ? SAL =$0C ? SAH =$0D ? WZPAGE1 =$0E ? WZPAGE2 =$0F ? CSLT =$10 ? CDRV =$11 ? CTRK =$12 ? CWRK =$13 ? DCF =$14 ? HXF =$15 ? HXL =$16 ? HXH =$17 ? HDCF =$18 ? HHXL =$19 ? HHXH =$1A ? LDCF =$1B ? LHXL =$1C ? LHXH =$1D ? VMODE =$20 ? WNDTOP =$22 ? CH =$24 ? CV =$25 ? CSWL =$36 ? CSWH =$37 ZEROPAGE_PGM=$80 BEGPAGE2=$0800 BEGSPRSE=$0C00 ? H1F00 =$1F00 ? H1F0C =$1F0C ? CHECKMEM=$1F0C ? EDD_CCI =$1F0F H1F0F =$1F0F H1F18 =$1F18 DO_CHECKMEM=$1F27 H1F3F =$1F3F ? H1F4B =$1F4B PIRATE =$1F4B ? H1F4F =$1F4F SEARCH_DISKII=$1F4F H1F5A =$1F5A H1F5C =$1F5C H1F70 =$1F70 H1F71 =$1F71 H1F7A =$1F7A ? H1F80 =$1F80 ? H1F86 =$1F86 DISKII_ROMID=$1F86 DISKII_MAP=$1F8A BOOT_ROM_ID=$1F8E BOOT_SC3ROM=$1F8F BOOT_RAM=$1F90 GET_MI_IN_ZP=$1F91 CMP_MI_IN_ZP=$1F98 STORE_ZP=$1F9C H1FA2 =$1FA2 ? H1FAB =$1FAB CMP_MACH_INFO=$1FAB H1FEF =$1FEF H1FF8 =$1FF8 H1FFE =$1FFE H2003 =$2003 H200C =$200C H2016 =$2016 SET_PIRATE=$201D GET_MACH_INFO=$2025 H2036 =$2036 H206A =$206A H206D =$206D H2075 =$2075 H207C =$207C H2085 =$2085 H2094 =$2094 ? KEY =$C000 MAINREAD=$C002 AUXREAD =$C003 MAINWRT =$C004 AUXWRT =$C005 ? STROBE =$C010 ? SPKR =$C030 ? TXTCLR =$C050 ? TXTSET =$C051 ? MIXCLR =$C052 ? LOWSCR =$C054 ? HISCR =$C055 ? HIRES =$C057 ? PHASEOFF=$C080 ? ROM =$C081 ? HC088 =$C088 ? HC089 =$C089 ? HC08A =$C08A ? HC08B =$C08B ? HC08C =$C08C ? HC08D =$C08D ? HC08E =$C08E ? HC08F =$C08F ? HC0EC =$C0EC ? BASIC =$E000 ROM_VERSION=$FBB3 ? VTAB =$FC22 ? HOME =$FC58 ? COUT =$FDED ? COUT1 =$FDF0 ? SETKBD =$FE89 ? SETVID =$FE93 ? OLDRST =$FF59