Skip to content

Instantly share code, notes, and snippets.

@74hc595
Last active January 1, 2024 18:12
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 74hc595/fda8b274179fea633f5333d52513e1f7 to your computer and use it in GitHub Desktop.
Save 74hc595/fda8b274179fea633f5333d52513e1f7 to your computer and use it in GitHub Desktop.
Disassembly of the bootup sequence from a Williams WPC pinball machine
; bootup sequence from a Williams WPC pinball machine ROM
; (Getaway version L-2)
; Last 32K of ROM image in 0x8000-0xFFFF
; Banked ROM in 0x4000-0x7FFF
; RAM is 0x0000-0x1FFF
; Special ASIC registers are 0x3Fxx (e.g. 3FF2 controls LED D20)
; Reset vector is 0x8C9A
dasm09: M6809/H6309/OS9 disassembler V0.1 � 2000 Arto Salmi
; org $8C9A
RESET:
8C9A: 1A 50 ORCC #$50 ;disable interrupts
8C9C: 86 00 LDA #$00
8C9E: B7 3F F2 STA $3FF2 ;diagnostic LED off
8CA1: 10 8E 00 06 LDY #$0006
8CA5: 5F CLRB
8CA6: BE FF EC LDX $FFEC ;read 2-byte checksum "correction" from ROM
8CA9: 8C 00 FF CMPX #$00FF ;if it's 0x00FF, skip ROM/RAM checks
8CAC: 10 27 01 03 LBEQ PASSED ;$8DB3
8CB0: CE 00 3F LDU #$003F
8CB3: CC 00 00 LDD #$0000
8CB6: 1E 03 EXG D,U ;U=0x0000, D=0x003F.
; Compute checksum of all ROM banks and verify
L1:
8CB8: 1F 98 TFR B,A ;bank loop start
8CBA: 43 COMA
8CBB: 85 07 BITA #$07
8CBD: 26 0A BNE $8CC9
8CBF: 43 COMA
8CC0: 4A DECA
8CC1: B7 3F FC STA $3FFC ;store A to bank switch register
8CC4: B1 40 00 CMPA $4000 ;compare A with lowest byte in bank (0x20, 0x21, ...)
8CC7: 26 3E BNE $8D07 ;stop if comparison fails
8CC9: F7 3F FC STB $3FFC ;store B to bank switch register
8CCC: 1E 03 EXG D,U ;bring checksum back to D
8CCE: B7 3F DD STA $3FDD ;sound board something?
8CD1: 8E 40 00 LDX #$4000 ;initialize X pointer to start of bank
L2:
8CD4: EB 84 ADDB ,X ;Add 8 bytes to checksum in D
8CD6: 89 00 ADCA #$00
8CD8: EB 01 ADDB 1,X
8CDA: 89 00 ADCA #$00
8CDC: EB 02 ADDB 2,X
8CDE: 89 00 ADCA #$00
8CE0: EB 03 ADDB 3,X
8CE2: 89 00 ADCA #$00
8CE4: EB 04 ADDB 4,X
8CE6: 89 00 ADCA #$00
8CE8: EB 05 ADDB 5,X
8CEA: 89 00 ADCA #$00
8CEC: EB 06 ADDB 6,X
8CEE: 89 00 ADCA #$00
8CF0: EB 07 ADDB 7,X
8CF2: 89 00 ADCA #$00
8CF4: 1E 20 EXG Y,D
8CF6: F7 3F FF STB $3FFF ;pet the watchdog
8CF9: 1E 20 EXG Y,D
8CFB: 30 08 LEAX 8,X ;advance X 8 bytes
8CFD: 8C 80 00 CMPX #$8000 ;are we at the end of the bank?
8D00: 25 D2 BCS L2;$8CD4 ;if not, check more bytes
8D02: 1E 03 EXG D,U
8D04: 5A DECB ;next bank
8D05: 20 B1 BRA L1 ;$8CB8
8D07: 1E 03 EXG D,U ;bring checksum to D
8D09: B3 FF EE SUBD $FFEE ;compare with stored value at 0xFFEE-0xFFEF
8D0C: 27 02 BEQ $8D10
8D0E: C6 01 LDB #$01 ;if checksum compare fails, set B=1
8D10: 1F 02 TFR D,Y ;low byte of Y is now 0x01 if ROM test failed
; Verify working RAM (leaves adjustments/audits alone)
; Writes 0x55 to 0x0000-0x172F, then verifies,
; then writes 0xAA to 0x0000-0x172F and verifies again
8D12: C6 06 LDB #$06
8D14: 86 B4 LDA #$B4
8D16: B7 3F FD STA $3FFD ;unlock protected memory with magic value 0xB4
8D19: 86 01 LDA #$01
8D1B: B7 3F FE STA $3FFE ;something something memory protection
8D1E: B7 3F FD STA $3FFD
8D21: 86 55 LDA #$55 ;initialize A with 0x55
8D23: 8E 00 00 LDX #$0000 ;initialize X pointer to start of RAM
L3:
8D26: A7 84 STA ,X ;store 0x55 in 4 bytes
8D28: A7 01 STA 1,X
8D2A: A7 02 STA 2,X
8D2C: A7 03 STA 3,X
8D2E: F7 3F FF STB $3FFF ;pet watchdog
8D31: 30 04 LEAX 4,X ;advance X by 4 bytes
8D33: 8C 17 30 CMPX #$1730 ;stop at 0x1730 (start of persistent values?)
8D36: 25 EE BCS L3 ;$8D26
8D38: 8E 00 00 LDX #$0000 ;reset X to start of RAM
L4:
8D3B: A1 84 CMPA ,X ;compare 4 bytes with 0x55
8D3D: 26 21 BNE $8D60 ;if any mismatch, bail
8D3F: A1 01 CMPA 1,X
8D41: 26 1D BNE $8D60
8D43: A1 02 CMPA 2,X
8D45: 26 19 BNE $8D60
8D47: A1 03 CMPA 3,X
8D49: 26 15 BNE $8D60
8D4B: F7 3F FF STB $3FFF ;pet watchdog
8D4E: 30 04 LEAX 4,X ;advance X by 4 bytes
8D50: 8C 17 30 CMPX #$1730 ;stop at 0x1730
8D53: 25 E6 BCS L4 ;$8D3B
8D55: 81 55 CMPA #$55 ;after testing with 0x55,
8D57: 26 03 BNE $8D5C
8D59: 43 COMA ;test again with 0xAA
8D5A: 20 C7 BRA $8D23
8D5C: 1F 20 TFR Y,D ;bring test results in Y back to D
8D5E: 20 04 BRA $8D64
; ram test fail
8D60: 1F 20 TFR Y,D ;bring test results in Y back to D
8D62: CA 02 ORB #$02 ;or with 0x02 if RAM test failed
8D64: 5D TSTB ;if nothing has failed so far,
8D65: 27 4C BEQ PASSED ;$8DB3 ;test has finished
8D67: 1F 03 TFR D,U ;stash D in U
; something has failed, blink diagnostic LED
8D69: 86 80 LDA #$80 ;LED on
8D6B: B7 3F F2 STA $3FF2
8D6E: B7 3F DD STA $3FDD
8D71: 8E FF FF LDX #$FFFF ;initialize delay counter
8D74: 86 06 LDA #$06
DELAY1:
8D76: B7 3F FF STA $3FFF ;pet watchdog
8D79: 30 01 LEAX 1,X ;waste some cycles
8D7B: 30 1F LEAX -1,X
8D7D: 30 1F LEAX -1,X
8D7F: 26 F5 BNE DELAY1 ;$8D76
8D81: 86 00 LDA #$00 ;LED off
8D83: B7 3F F2 STA $3FF2
8D86: 8E FF FF LDX #$FFFF ;initialize delay counter
8D89: 86 06 LDA #$06
DELAY2:
8D8B: B7 3F FF STA $3FFF ;pet watchdog
8D8E: 30 01 LEAX 1,X ;waste some cycles
8D90: 30 1F LEAX -1,X
8D92: 30 1F LEAX -1,X
8D94: 26 F5 BNE DELAY2 ;$8D8B
8D96: 54 LSRB ;shift out a bit from B
8D97: 24 D0 BCC $8D69 ;if C=0 then ROM was good, blink again
; pause
8D99: C6 04 LDB #$04
8D9B: 86 06 LDA #$06
DELAY3:
8D9D: 8E C0 00 LDX #$C000 ;delay loop
DELAY4:
8DA0: B7 3F FF STA $3FFF ;pet watchdog
8DA3: B7 3F DD STA $3FDD
8DA6: 30 1F LEAX -1,X
8DA8: 26 F6 BNE DELAY4 ;$8DA0
8DAA: 5A DECB
8DAB: 26 F0 BNE DELAY3 ;$8D9D
8DAD: 1F 30 TFR U,D
8DAF: C5 02 BITB #$02 ;if bit 1 set in test result byte...
8DB1: 26 FE BNE $8DB1 ;loop forever, watchdog will reset machine
; ROM and RAM tests have passed
; System should boot correctly if we get here
PASSED:
8DB3: 1A 50 ORCC #$50 ;disable interrupts
8DB5: 10 CE 04 00 LDS #$0400 ;initialize stack pointer
8DB9: BD 92 F5 JSR $92F5
8DBC: F7 17 4D STB $174D
8DBF: 7F 17 48 CLR $1748
8DC2: 7F 17 A3 CLR $17A3
8DC5: 7F 17 4A CLR $174A
8DC8: 7F 17 4B CLR $174B
8DCB: 7F 17 4C CLR $174C
8DCE: 20 0E BRA $8DDE
8DD0: 1A 50 ORCC #$50
8DD2: 86 01 LDA #$01
8DD4: B7 17 4C STA $174C
8DD7: 10 CE 04 00 LDS #$0400
8DDB: BD 92 F5 JSR $92F5
8DDE: 10 CE 17 2A LDS #$172A
8DE2: 4F CLRA
8DE3: 1F 8B TFR A,DP
8DE5: 8E 00 00 LDX #$0000
8DE8: 6F 80 CLR ,X+
8DEA: 86 06 LDA #$06
8DEC: B7 3F FF STA $3FFF
8DEF: 8C 17 30 CMPX #$1730
8DF2: 25 F4 BCS $8DE8
8DF4: BD 91 C0 JSR $91C0
8DF7: BD 9E E5 JSR $9EE5
8DFA: BE 17 48 LDX $1748
8DFD: 8C 1A BC CMPX #$1ABC
8E00: 27 1B BEQ $8E1D
8E02: B6 17 4C LDA $174C
8E05: 27 08 BEQ $8E0F
8E07: 7F 17 4A CLR $174A
8E0A: 7F 17 4B CLR $174B
8E0D: 20 1C BRA $8E2B
8E0F: BD 89 04 JSR $8904
8E12: 59 ROLB
8E13: 3E RESET
8E14: 39 RTS
8E15: BD 89 04 JSR $8904
8E18: 55 Invalid
8E19: 55 Invalid
8E1A: 38 Invalid
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment