iobium

Examining the switch matrix scan

Examining the switch matrix scan in WPC and WPC-s is instructive. The routines are almost bytewise identical. However, in the WPC code, the 6809 directly accesses the switch matrix control bits. So it outputs 1,2,4,8,10,20,40 to the control register to scan the rows. In the WPC-S code, the PIC16C57 scans the rows. The 6809 sends the PIC a sequential code to translate to a scan bit. The codes are 16;17;18;19;1A;1B;1C;1D;1E.

To patch this code out, we need to replace 16 with 01; 17 with 02; 17 with 04; 19 with 08 and so on, up to 1E with 40.

To find it. search on 86 16 b7 3f EA. Replace the 16 with 01. Then, look for the sequence E9 C6 xx where xx is the sequence 16 - 1E and substitute for xx. I found it high in the ROM, at 07DDF3 in Medieval Madness.

This patch will return WPC-S code back to the WPC switch matrix scan style. The PIC is no longer needed, and we have to jumper it out.

However, we still have to fix the serial number test code...

WPC Switch Scan CodeWPC with Security
ROM:D937 lda #1 ROM:D939 sta word_3FEA ROM:D93C lda word_3FE8 ROM:D93F sta $1F ROM:D941 cmpa #$FF ROM:D943 beq loc_D958 ROM:D945 eora $27 ROM:D947 tfr a, b ROM:D949 anda $2F ROM:D94B oraa $37 ROM:D94D sta $37 ROM:D94F stb $2F ROM:D951 comb ROM:D952 andb $37 ROM:D954 orab $3F ROM:D956 stb $3F ROM:D958 ROM:D958 loc_D958: ; ROM:D958 lda word_3FE8+1 ROM:D95B ldb #2 ROM:D95D stb word_3FEA ROM:D960 sta $20 ROM:D962 eora $28 ROM:D964 tfr a, b ROM:D966 anda $30 ROM:D968 oraa $38 ROM:D96A sta $38 ROM:D96C stb $30 ROM:D96E comb ROM:D96F andb $38 ROM:D971 orab $40 ROM:D973 stb $40 ROM:D975 lda word_3FE8+1 ROM:D978 ldb #4 ROM:D97A stb word_3FEA ROM:D97D sta $21 ROM:D97F eora $29 ROM:D981 tfr a, b ROM:D983 anda $31 ROM:D985 oraa $39 ROM:D987 sta $39 ROM:D989 stb $31 ROM:D98B comb ROM:D98C andb $39 ROM:D98E orab $41 ROM:D990 stb $41 ROM:D992 lda word_3FE8+1 ROM:D995 ldb #8 ROM:D997 stb word_3FEA ROM:D99A sta $22 ROM:D99C eora $2A ROM:D99E tfr a, b ROM:D9A0 anda $32 ROM:D9A2 oraa $3A ROM:D9A4 sta $3A ROM:D9A6 stb $32 ROM:D9A8 comb ROM:D9A9 andb $3A ROM:D9AB orab $42 ROM:D9AD stb $42 ROM:D9AF lda word_3FE8+1 ROM:D9B2 ldb #$10 ROM:D9B4 stb word_3FEA ROM:D9B7 sta $23 ROM:D9B9 eora $2B ROM:D9BB tfr a, b ROM:D9BD anda $33 ROM:D9BF oraa $3B ROM:D9C1 sta $3B ROM:D9C3 stb $33 ROM:D9C5 comb ROM:D9C6 andb $3B ROM:D9C8 orab $43 ROM:D9CA stb $43 ROM:D9CC lda word_3FE8+1 ROM:D9CF ldb #$20 ; ' ' ROM:D9D1 stb word_3FEA ROM:D9D4 sta $24 ROM:D9D6 eora $2C ROM:D9D8 tfr a, b ROM:D9DA anda $34 ROM:D9DC oraa $3C ROM:D9DE sta $3C ROM:D9E0 stb $34 ROM:D9E2 comb ROM:D9E3 andb $3C ROM:D9E5 orab $44 ROM:D9E7 stb $44 ROM:D9E9 lda word_3FE8+1 ROM:D9EC ldb #$40 ; '@' ROM:D9EE stb word_3FEA ROM:D9F1 sta $25 ROM:D9F3 eora $2D ROM:D9F5 tfr a, b ROM:D9F7 anda $35 ROM:D9F9 oraa $3D ROM:D9FB sta $3D ROM:D9FD stb $35 ROM:D9FF comb ROM:DA00 andb $3D ROM:DA02 orab $45 ROM:DA04 stb $45 ROM:DA06 lda word_3FE8+1 ROM:DA09 sta $26 ROM:DA0B eora $2E ROM:DA0D tfr a, b ROM:DA0F anda $36 ROM:DA11 oraa $3E ROM:DA13 sta $3E ROM:DA15 stb $36 ROM:DA17 comb ROM:DA18 andb $3E ROM:DA1A orab $46 ROM:DA1C stb $46 ROM:DA1E lda $20 ROM:DA20 anda $21 ROM:DA22 anda $22 ROM:DA24 anda $23 ROM:DA26 anda $24 ROM:DA28 anda $25 ROM:DA2A anda $26 ROM:DA2C sta $1D ROM:DA2E coma ROM:DA2F anda $14 ROM:DA31 sta $14 ROM:DA33 ROM:DA33 loc_DA33: ; CODE XREF: ROM:D934 J ROM:DA33 ldb $8B ROM:DA35 cmpb $8A ROM:DA37 beq loc_DA6B ROM:DA39 lda $8C ROM:DA3B beq loc_DA43 ROM:DA3D bmi loc_DA6B ROM:DA3F dec $8C ROM:DA41 bra loc_DA6BROM:DDF3 lda #$16 ROM:DDF5 sta switch_col_sel ROM:DDF8 lda sw_coindoor ROM:DDFB sta byte_1F ROM:DDFD cmpa #$FF ROM:DDFF beq Scan_switches ROM:DE01 eora byte_27 ROM:DE03 tfr a, b ROM:DE05 anda byte_2F ROM:DE07 oraa byte_37 ROM:DE09 sta byte_37 ROM:DE0B stb byte_2F ROM:DE0D comb ROM:DE0E andb byte_37 ROM:DE10 orab byte_3F ROM:DE12 stb byte_3F ROM:DE14 ROM:DE14 Scan_switches: ROM:DE14 lda Sw_row_read ROM:DE17 ldb #$17 ROM:DE19 stb switch_col_sel ROM:DE1C sta byte_20 ROM:DE1E eora byte_28 ROM:DE20 tfr a, b ROM:DE22 anda byte_30 ROM:DE24 oraa byte_38 ROM:DE26 sta byte_38 ROM:DE28 stb byte_30 ROM:DE2A comb ROM:DE2B andb byte_38 ROM:DE2D orab byte_40 ROM:DE2F stb byte_40 ROM:DE31 lda Sw_row_read ROM:DE34 ldb #$18 ROM:DE36 stb switch_col_sel ROM:DE39 sta byte_21 ROM:DE3B eora byte_29 ROM:DE3D tfr a, b ROM:DE3F anda byte_31 ROM:DE41 oraa byte_39 ROM:DE43 sta byte_39 ROM:DE45 stb byte_31 ROM:DE47 comb ROM:DE48 andb byte_39 ROM:DE4A orab byte_41 ROM:DE4C stb byte_41 ROM:DE4E lda Sw_row_read ROM:DE51 ldb #$19 ROM:DE53 stb switch_col_sel ROM:DE56 sta byte_22 ROM:DE58 eora byte_2A ROM:DE5A tfr a, b ROM:DE5C anda byte_32 ROM:DE5E oraa byte_3A ROM:DE60 sta byte_3A ROM:DE62 stb byte_32 ROM:DE64 comb ROM:DE65 andb byte_3A ROM:DE67 orab byte_42 ROM:DE69 stb byte_42 ROM:DE6B lda Sw_row_read ROM:DE6E ldb #$1A ROM:DE70 stb switch_col_sel ROM:DE73 sta byte_23 ROM:DE75 eora byte_2B ROM:DE77 tfr a, b ROM:DE79 anda byte_33 ROM:DE7B oraa byte_3B ROM:DE7D sta byte_3B ROM:DE7F stb byte_33 ROM:DE81 comb ROM:DE82 andb byte_3B ROM:DE84 orab byte_43 ROM:DE86 stb byte_43 ROM:DE88 lda Sw_row_read ROM:DE8B ldb #$1B ROM:DE8D stb switch_col_sel ROM:DE90 sta byte_24 ROM:DE92 eora byte_2C ROM:DE94 tfr a, b ROM:DE96 anda byte_34 ROM:DE98 oraa byte_3C ROM:DE9A sta byte_3C ROM:DE9C stb byte_34 ROM:DE9E comb ROM:DE9F andb byte_3C ROM:DEA1 orab byte_44 ROM:DEA3 stb byte_44 ROM:DEA5 lda Sw_row_read ROM:DEA8 ldb #$1C ROM:DEAA stb switch_col_sel ROM:DEAD sta byte_25 ROM:DEAF eora byte_2D ROM:DEB1 tfr a, b ROM:DEB3 anda byte_35 ROM:DEB5 oraa byte_3D ROM:DEB7 sta byte_3D ROM:DEB9 stb byte_35 ROM:DEBB comb ROM:DEBC andb byte_3D ROM:DEBE orab byte_45 ROM:DEC0 stb byte_45 ROM:DEC2 lda Sw_row_read ROM:DEC5 sta byte_26 ROM:DEC7 eora byte_2E ROM:DEC9 tfr a, b ROM:DECB anda byte_36 ROM:DECD oraa byte_3E ROM:DECF sta byte_3E ROM:DED1 stb byte_36 ROM:DED3 comb ROM:DED4 andb byte_3E ROM:DED6 orab byte_46 ROM:DED8 stb byte_46 ROM:DEDA lda byte_20 ROM:DEDC anda byte_21 ROM:DEDE anda byte_22 ROM:DEE0 anda byte_23 ROM:DEE2 anda byte_24 ROM:DEE4 anda byte_25 ROM:DEE6 anda byte_26 ROM:DEE8 sta byte_1D ROM:DEEA coma ROM:DEEB anda byte_14 ROM:DEED sta byte_14 ROM:DEEF ROM:DEEF loc_DEEF: ; CODE XREF: ROM:DDF0 J ROM:DEEF ldb byte_8B ROM:DEF1 cmpb byte_8A ROM:DEF3 beq loc_DF27 ROM:DEF5 lda byte_8C ROM:DEF7 beq loc_DEFF ROM:DEF9 bmi loc_DF27 ROM:DEFB dec byte_8C ROM:DEFD bra loc_DF27