;********************************************************************** ; RADIO SHACK SPEECH / SOUND PROGRAM PAK (TMS7000 family, 4K ROM at F000) ; Commented listing. Register names are DECIMAL (R36 = $24); immediates are hex. ; ; OVERVIEW ; Host (CoCo) bytes arrive on Port A (INT3) and go into a FIFO. The main loop ; (F007) runs three jobs: host command parser (F051), AY-3-8910 sound ; sequencer (F2AF) and the text-to-speech translator (F3F0). The SP0256 is fed ; allophones from INT1 (F21C); a timer tick (INT2, F033) times sound events. ; ; PORTS ; P0 IOCNT0 (bit5 INT3 clr, bit4 INT3 enb, bit3 INT2 clr, bit2 INT2 enb, ; bit1 INT1 clr, bit0 INT1 enb) P2/P3 Timer 1 data/control ; P4 Port A data from host P6 Port B RAM address A7-A0 ; P8 Port C control (below) P10/P11 Port D data bus / direction ; Port C (inferred from the code, check the schematic): ; b7 handshake to host (low-to-high pulse = byte taken) ; b6 AY select (low) b5 SP0256 ALD* (low pulse loads an allophone) ; b4 RAM CE* (low) b3 RAM R/W* (high = read) / AY BC1 (low = asserted) ; b2-b0 RAM A10-A8 / b0 also AY BDIR (low = asserted) ; ; RAM (2K, external) ; Upper 1K ($EC-$EF): four 256-byte FIFOs, pointers in registers: ; queue 0 host bytes R8 rd / R9 wr queue 1 speech text R10 / R11 ; queue 2 allophones R12 / R13 queue 3 sound playlist R14 / R15 ; Lower 1K ($E8-$EB): 16 blocks of 64 bytes. Blocks chain to the next block ; unless command bit 4 is set; chaining never crosses 7->8 or 15->16. ; Blocks 0-7: stored text or allophone strings. 8-15: AY sound data. ; ; HOST COMMANDS (first byte, R7 holds multi-byte state) ; $00 reset $C7 stop speech $CF stop sound $01-$7F ASCII text (CR gets a space first) ; $80-$87,$90-$97 store text in block n, ends with CR ; $88-$8E,$98-$9F store AY sound events in block 8-15, ends with FF descriptor ; $8F next byte = timer 1 reload $AF direct AY writes (reg,value pairs, reg $FF ends) ; $A0-$A7,$B0-$B7 store allophone string, ends with $FF ; $A8-$AE,$B8-$BF store AY (reg,value) pairs, reg $FF ends ; $C0-$C7,$D0-$D7 speak stored text block (0-7) ; $C8-$CE,$D8-$DF play sound block (8-15) on all channels ; $E0-$E7,$F0-$F7 speak stored allophone block (0-7) ; $E8-$EF,$F8-$FF load AY registers from block 8-15 ; (low nibble = block, bit 4 = do not chain; $C7/$CF/$8F/$AF are taken by other commands) ; ; SOUND EVENTS (per channel 1-5: tone A, B, C, envelope, noise) ; tone: desc (ccc a aaaa) period-high period-low duration (4 bytes) ; envelope: desc = %011s ssss (shape), period-high period-low duration ; noise: desc = 1cca aaaa, period (bit 7 = leave amplitude), duration (3 bytes) ; All channels read the same block and skip events that are not theirs. ; ; TEXT-TO-SPEECH: NRL-style letter-to-sound rules (F811-FFB0), decoded below. ; Tokens in context: $09 # $0A . $0B % $0C & $0D @ $0E ^ $0F + $10 : $11 * ; $12 $ (O/U) $13 word boundary $14 two or more vowels; others are letter-$20. ; ; TRAPS: 4 queue op (int-safe) 5 block op (int-safe) 6 queue op 7 AY write (int-safe) ; 8 AY write 9 letter class 10 fetch char 11 cursor step 12 block op ; 13 translate char 14 classify char 15 match context 16 skip to marked byte ; 17 last context token? 18 skip class run 19 cursor step back ; ; NOTES (things that look odd, please check against the ROM) ; 1. F82B default rule makes F82E-F83D unreachable ; 2. F759/F768: compares with codes ($23,$34,$33) but TRAP 10 returns ASCII ; 3. F327: R14 stays relative to R15; queue 3 full test looks wrong ; 4. ISRs share R3/R4/R18/R33-R35 with main code without saving them ; 5. Text context checks assume upper-case input (TRAP 10 is raw) ;********************************************************************** F000: 52 4A MOV %>4A,B ; B = $4A, the initial stack pointer value F002: 0D LDSP ; SP = $4A. Stack grows upward from $4B; R0-R73 are variables F003: 8E F0 AE CALL $F0AE ; Init Port/timer setup, FIFOs, AY-3-8910, SP0256 (returns after "stop all sound") F006: 05 EINT ; Enable interrupts (INT1/2/3 enable bits were set by the init code) F007: 8E F0 51 CALL $F051 ; MAIN LOOP: process host bytes waiting in queue 0 F00A: 8E F2 AF CALL $F2AF ; run the AY-3-8910 sound sequencer (5 channels) F00D: 8E F3 F0 CALL $F3F0 ; translate queued text into SP0256 allophones F010: E0 F5 JMP $F007 ; loop forever ;********************************************************************** ; INT3: byte from host -> queue 0 ;********************************************************************** F012: B8 PUSH A ; save A F013: C8 PUSH B ; save B F014: D8 11 PUSH R17 ; save R17 (TRAP 6 argument) F016: D8 10 PUSH R16 ; save R16 (TRAP 6 argument) F018: 80 04 MOVP P4,A ; A = byte latched from the host (Port A) F01A: 88 FF 00 11 MOVD %>FF00,R17 ; R16=$FF (put), R17=$00 (queue 0 = host byte FIFO) F01E: F9 TRAP 6 ; TRAP 6: put A into queue 0. C=1 if the FIFO was full F01F: E7 05 JL $F026 ; JL = jump if C=0: byte was stored, so acknowledge the host F021: A3 05 00 ANDP %>05,P0 ; FIFO full: disable INT3 (P0 &= $05). No ack is sent, so the host is held off. Main loop re-enables INT3 at F051 F024: E0 06 JMP $F02C ; restore registers and RETI F026: A3 7F 08 ANDP %>7F,P8 ; C7 = 0 F029: A4 80 08 ORP %>80,P8 ; C7 = 1. The low-to-high pulse on C7 tells the host the byte was taken / CPU is ready (host-side latch is presumably edge-triggered) F02C: D9 10 POP R16 ; restore registers F02E: D9 11 POP R17 ; restore R17 F030: C9 POP B ; restore B F031: B9 POP A ; restore A F032: 0B RETI ; return from interrupt ;********************************************************************** ; INT2 (Timer 1): per-channel tick counters, set ready bits in R59 ;********************************************************************** F033: B8 PUSH A ; save A F034: C8 PUSH B ; save B F035: 52 05 MOV %>5,B ; B = channel number, 5 down to 1 F037: 72 10 47 MOV %>10,R71 ; R71 = channel bit mask in R59 ($10 = ch5 ... $01 = ch1) F03A: AA 00 26 LDA @>0026(B) ; A = tick counter of channel B (counters live at $27-$2B) F03D: B2 DEC A ; count down one tick F03E: E3 07 JHS $F047 ; JHS: no borrow (counter was >= 1): just store the new count F040: 46 47 3B 06 BTJO R71,R59,$F04A ; counter was 0: skip if the channel's "ready" bit is already set F044: 44 47 3B OR R71,R59 ; set the channel's ready bit in R59 (event duration has elapsed) F047: AB 00 26 STA @>0026(B) ; store counter (note: if it expired just now A=$FF is stored) F04A: DC 47 RR R71 ; rotate mask to next channel F04C: CA EC DJNZ B,$F03A ; next channel F04E: C9 POP B ; restore B F04F: B9 POP A ; restore A F050: 0B RETI ; return from interrupt ;********************************************************************** ; HOST COMMAND PARSER: takes one byte from queue 0 ;********************************************************************** F051: A4 10 00 ORP %>10,P0 ; Re-enable INT3 (P0 |= $10) in case the FIFO-full path in the ISR disabled it F054: 4D 08 09 CMP R8,R9 ; queue 0: read pointer R8 vs write pointer R9 F057: E2 54 JEQ $F0AD ; empty: return F059: 88 00 00 11 MOVD %>0000,R17 ; R16=$00 (get), R17=$00 (queue 0) F05D: FB TRAP 4 ; TRAP 4: A = next host byte (interrupt-safe) F05E: 7D AF 07 CMP %>AF,R7 ; R7 = $AF? (AY direct-write mode in progress) F061: E2 20 JEQ $F083 ; yes: handle (register,value) byte at F083 F063: 7D 00 07 CMP %>0,R7 ; R7 = 0? (no multi-byte command in progress) F066: E2 03 JEQ $F06B ; yes: this byte starts a new command F068: 8C F1 57 BR $F157 ; no: this byte continues a multi-byte command (F157) F06B: 2D 00 CMP %>0,A ; NEW COMMAND. $00 = software reset F06D: E2 91 JEQ $F000 ; -> reset F06F: 2D C7 CMP %>C7,A ; $C7 = stop speech F071: E2 7A JEQ $F0ED ; equal: -> F0ED F073: 2D CF CMP %>CF,A ; $CF = stop sound F075: E2 53 JEQ $F0CA ; equal: -> F0CA F077: 2D 80 CMP %>80,A ; A < $80: plain ASCII text for the speech engine F079: E1 20 JN $F09B ; (JN: A - $80 is negative) F07B: D0 07 MOV A,R7 ; R7 = command byte (remembered for multi-byte commands) F07D: 27 40 2D BTJZ %>40,A,$F0AD ; bit 6 clear ($80-$BF): loader command, data bytes follow; return F080: 8C F1 BF BR $F1BF ; bit 6 set ($C0-$FF): single-byte command, see F1BF F083: 76 01 16 0C BTJO %>1,R22,$F093 ; AY direct mode: R22 bit 0 clear = this byte is a register number (BTJO jumps if bit set) F087: 2D FF CMP %>FF,A ; register number $FF ends direct mode F089: E6 03 JNZ $F08E ; not equal: -> F08E F08B: 8C F1 AF BR $F1AF ; -> end command (F1AF) F08E: D0 3F MOV A,R63 ; R63 = AY register number F090: D4 16 INV R22 ; toggle R22: next byte is the value F092: 0A RETS ; return F093: D0 3C MOV A,R60 ; value byte -> R60 F095: 12 3F MOV R63,A ; A = register number F097: F8 TRAP 7 ; TRAP 7: AY[A] = R60 F098: D5 16 CLR R22 ; R22 = 0: next byte is a register number again F09A: 0A RETS ; return F09B: 2D 0D CMP %>D,A ; text byte: carriage return? F09D: E6 09 JNZ $F0A8 ; not equal: -> F0A8 F09F: 22 20 MOV %>20,A ; CR: first queue a space so the last word is terminated F0A1: 88 FF 02 11 MOVD %>FF02,R17 ; R16=$FF (put), R17=$02 (queue 1 = text FIFO) F0A5: FB TRAP 4 ; TRAP 4: put the space F0A6: 22 0D MOV %>D,A ; then queue the CR itself F0A8: 88 FF 02 11 MOVD %>FF02,R17 ; R16=$FF (put), R17=$02 (queue 1 = text FIFO) F0AC: FB TRAP 4 ; TRAP 4: put A (char or CR) into the text FIFO F0AD: 0A RETS ; return ;********************************************************************** ; Initialize peripherals, FIFOs, AY, SP0256 ;********************************************************************** F0AE: A2 3C 00 MOVP %>3C,P0 ; P0 = IOCNT0. $3C = INT3+INT2 clear/enable, INT1 off, single-chip mode. F0B1: A2 7F 08 MOVP %>7F,P8 ; P8 = $7F: all selects inactive, C7 = 0 F0B4: A2 FF 09 MOVP %>FF,P9 ; P9 = $FF: Port C is all outputs F0B7: A2 FF 08 MOVP %>FF,P8 ; P8 = $FF: everything deselected, C7 = 1 F0BA: A2 FF 02 MOVP %>FF,P2 ; Timer 1 reload = $FF F0BD: A2 9F 03 MOVP %>9F,P3 ; Timer 1 control = $9F: start, internal clock, prescale reload $1F (divide by 32) F0C0: 8E F1 AF CALL $F1AF ; clear host-command state (R7, R22, R23, R21) F0C3: D5 08 CLR R8 ; R8 = 0: queue 0 read pointer F0C5: D5 09 CLR R9 ; R9 = 0: queue 0 write pointer (queue empty) F0C7: 8E F0 ED CALL $F0ED ; stop speech (also clears queues 1 and 2), then fall into stop-sound F0CA: B5 CLR A ; STOP ALL SOUND: A = 0 F0CB: 52 17 MOV %>17,B ; B = $17 F0CD: AB 00 25 STA @>0025(B) ; clear $26-$3C: R38, tick counters, offsets, queue-3 read pointers, block numbers, R59, R60 F0D0: CA FB DJNZ B,$F0CD ; decrement, loop while not zero: -> F0CD F0D2: 22 08 MOV %>8,A ; A = 8: AY amplitude A F0D4: F7 TRAP 8 ; TRAP 8: AY[8] = R60 (= 0). Note TRAP 8 leaves A = R60 F0D5: 22 09 MOV %>9,A ; (A = R60 = 0 here) F0D7: F7 TRAP 8 ; A = 9: AY amplitude B F0D8: 22 0A MOV %>A,A ; TRAP 8: volume 0 F0DA: F7 TRAP 8 ; A = $0A: AY amplitude C F0DB: 52 07 MOV %>7,B ; B = 7 F0DD: B4 INV A ; A = ~A = $FF (A was 0 after TRAP 8) F0DE: AB 00 35 STA @>0035(B) ; $36-$3C = $FF: block number of every channel = $FF (idle); R59 = $FF (all channels ready); R60 = $FF F0E1: CA FB DJNZ B,$F0DE ; decrement, loop while not zero: -> F0DE F0E3: D5 0E CLR R14 ; R14 = 0: queue 3 read pointer F0E5: D5 0F CLR R15 ; R15 = 0: queue 3 write pointer (queue empty) F0E7: D5 43 CLR R67 ; R67 = 0 (R67 is not used anywhere else) F0E9: 22 07 MOV %>7,A ; A = 7: AY mixer register F0EB: F7 TRAP 8 ; TRAP 8: AY[7] = R60 = $FF: all tones and noise off F0EC: 0A RETS ; return F0ED: D5 0A CLR R10 ; STOP SPEECH: R10 = 0, text FIFO (queue 1) read pointer F0EF: D5 0B CLR R11 ; R11 = 0, text FIFO write pointer F0F1: D5 0C CLR R12 ; R12 = 0, phoneme FIFO (queue 2) read pointer F0F3: D5 0D CLR R13 ; R13 = 0, phoneme FIFO write pointer F0F5: D5 49 CLR R73 ; R73 = 0: stored-text offset F0F7: 72 FF 05 MOV %>FF,R5 ; R5 = $FF: SP0256 phonemes come from the FIFO, not from a stored block F0FA: A2 FF 0B MOVP %>FF,P11 ; P11 = $FF: data bus (Port D) is output F0FD: A2 00 0A MOVP %>00,P10 ; P10 = $00: allophone 0 (PA1, pause) on the bus F100: A2 08 08 MOVP %>08,P8 ; P8 = $08: all active-low selects asserted at once with bus = $00. Net effect: ALD* pulse loads PA1 into the SP0256 (silences it) and C7 goes low F103: A2 FF 08 MOVP %>FF,P8 ; P8 = $FF: deselect everything (C7 back high) F106: 0A RETS ; return ;********************************************************************** ; TRAP 4: TRAP 6 with interrupts off ;********************************************************************** F107: 06 DINT ; TRAP 4: interrupt-safe queue access. Interrupts off F108: F9 TRAP 6 ; TRAP 6: queue get/put F109: 05 EINT ; interrupts on F10A: 0A RETS ; return ;********************************************************************** ; TRAP 6: queue access. R16 $FF = put A, $00 = get -> A. ; R17 = queue*2. C=1 if full/empty. Pointers: even reg = read, odd = write ;********************************************************************** F10B: 77 FF 10 08 BTJZ %>FF,R16,$F117 ; put (R16=$FF) or get (R16=$00)? BTJZ jumps if R16 == 0 F10F: 7D 04 11 CMP %>4,R17 ; queue 2 (phoneme FIFO)? F112: E6 03 JNZ $F117 ; no F114: A4 03 00 ORP %>03,P0 ; put to the phoneme FIFO: enable and clear INT1 (SP0256 load request) so speech starts F117: C0 MOV A,B ; B = data byte (for a put) F118: 88 00 09 23 MOVD %>0009,R35 ; R34:R35 = $0009: address of the odd pointer register R9 F11C: 48 11 23 ADD R17,R35 ; R35 = $09 + R17: R9, R11, R13 or R15 (write pointer of queue R17/2) F11F: 9A 23 LDA *R35 ; A = write pointer F121: 77 FF 10 01 BTJZ %>FF,R16,$F126 ; get? skip F125: B3 INC A ; put: A = write pointer + 1 F126: D2 23 DEC R35 ; R35 -> even register R8/R10/R12/R14 (read pointer) F128: 9D 23 CMPA *R35 ; compare A with the read pointer F12A: E2 2A JEQ $F156 ; equal: put = FIFO full, get = FIFO empty. Return with C=1 F12C: 77 FF 10 04 BTJZ %>FF,R16,$F134 ; get? go to F134 F130: D3 23 INC R35 ; put: R35 -> write pointer again F132: E0 03 JMP $F137 ; -> F137 F134: 9A 23 LDA *R35 ; get: A = read pointer F136: B3 INC A ; A = read pointer + 1 F137: 9B 23 STA *R35 ; store the advanced pointer F139: 82 06 MOVP A,P6 ; Port B (RAM A7-A0) = the new index F13B: DC 11 RR R17 ; R17 = queue number 0-3 F13D: 78 EC 11 ADD %>EC,R17 ; + $EC: $EC-$EF = RAM CE* low, R/W* high, A10=1, A9:A8 = queue F140: 12 11 MOV R17,A ; R17,A F142: 82 08 MOVP A,P8 ; Port C: select the queue page F144: 12 10 MOV R16,A ; R16 = $FF (output) or $00 (input) F146: 82 0B MOVP A,P11 ; Port D direction F148: 80 0A MOVP P10,A ; read the data bus (get) F14A: 77 FF 10 05 BTJZ %>FF,R16,$F153 ; get? skip the write F14E: 92 0A MOVP B,P10 ; put: drive the data byte F150: A3 F7 08 ANDP %>F7,P8 ; R/W* low: write the RAM byte F153: A2 FF 08 MOVP %>FF,P8 ; deselect everything. C=0 (success) F156: 0A RETS ; return ;********************************************************************** ; Multi-byte command continuation (R7 = command) ;********************************************************************** F157: 7D 8F 07 CMP %>8F,R7 ; continuing a multi-byte command. R7 = $8F? F15A: E6 04 JNZ $F160 ; not equal: -> F160 F15C: 82 02 MOVP A,P2 ; $8F: A = new timer 1 reload value F15E: E0 4F JMP $F1AF ; -> end command F160: 72 FF 13 MOV %>FF,R19 ; R19 = terminator value, default $FF F163: 76 20 07 07 BTJO %>20,R7,$F16E ; command bit 5 set ($A0-$BF): terminator stays $FF F167: 76 08 07 05 BTJO %>8,R7,$F170 ; bit 3 set ($88-$9F sound data): terminator stays $FF F16B: 72 0D 13 MOV %>D,R19 ; $80-$87/$90-$97 (stored text): terminator = $0D (CR) F16E: D4 16 INV R22 ; toggle R22 (text and $A0-$BF commands never run the init at F175) F170: 7D 00 16 CMP %>0,R22 ; R22 = 0? (only the first byte of a sound-data upload) F173: E6 0A JNZ $F17F ; not equal: -> F17F F175: 72 04 15 MOV %>4,R21 ; R21 = 4 F178: D3 16 INC R22 ; R22 = 1: init done F17A: B0 CLRC ; test A (CLRC also sets N from A) F17B: E1 02 JN $F17F ; first byte has bit 7 set (3-byte noise event): R21 stays 4 F17D: D3 15 INC R21 ; tone event (4 bytes): R21 = 5. R21 = bytes until the next event descriptor F17F: D0 3C MOV A,R60 ; R60 = data byte to store F181: 42 07 04 MOV R7,R4 ; R4 = R7: block number and flags F184: 72 FF 10 MOV %>FF,R16 ; R16 = $FF: write F187: 42 17 12 MOV R23,R18 ; R18 = R23: offset in block F18A: FA TRAP 5 ; TRAP 5: store R60 at (block R4, offset R18) F18B: 7D 00 03 CMP %>0,R3 ; R3 = 0? (stored OK) F18E: E6 05 JNZ $F195 ; no: block full, byte dropped F190: D3 17 INC R23 ; advance offset F192: 42 04 07 MOV R4,R7 ; R7 = R4 (block may have chained to the next one) F195: DA 15 20 DJNZ R21,$F1B8 ; R21 -= 1; not zero: more bytes before the next terminator check F198: 1D 13 CMP R19,A ; record boundary: does this byte equal the terminator? F19A: E2 13 JEQ $F1AF ; yes: upload finished F19C: 77 08 07 13 BTJZ %>8,R7,$F1B3 ; bit 3 clear (text or $A0-$A7/$B0-$B7 phoneme string): next byte is a new record of 1 F1A0: 72 02 15 MOV %>2,R21 ; R21 = 2 F1A3: 76 20 07 0F BTJO %>20,R7,$F1B6 ; bit 5 set ($A8-$BF AY register/value pairs): pairs, R21 = 2 F1A7: D3 15 INC R21 ; sound data: R21 = 3 F1A9: B0 CLRC ; test A: this byte is the next event's descriptor F1AA: E1 0C JN $F1B8 ; bit 7 set (3-byte event): 3 bytes until the next descriptor F1AC: D3 15 INC R21 ; tone event (4 bytes): R21 = 4 F1AE: 0A RETS ; return F1AF: D5 07 CLR R7 ; END OF COMMAND: R7 = 0 (idle) F1B1: D5 17 CLR R23 ; R23 = 0: offset F1B3: 72 01 15 MOV %>1,R21 ; R21 = 1 F1B6: D5 16 CLR R22 ; R22 = 0 F1B8: 77 20 07 02 BTJZ %>20,R7,$F1BE ; bit 5 clear: return F1BC: D5 16 CLR R22 ; bit 5 set: R22 = 0 F1BE: 0A RETS ; return ;********************************************************************** ; Single-byte commands $C0-$FF ;********************************************************************** F1BF: 23 1F AND %>1F,A ; SINGLE-BYTE COMMAND $C0-$FF. A = low 5 bits (block number / code) F1C1: 88 FF 02 11 MOVD %>FF02,R17 ; R16=$FF (put), R17=$02 (queue 1, text FIFO) F1C5: 77 20 07 04 BTJZ %>20,R7,$F1CD ; bit 5 clear: keep queue 1 F1C9: 24 80 OR %>80,A ; bit 5 set: tag the entry with bit 7 F1CB: DE 11 RL R17 ; and use queue 2 (phoneme FIFO) instead (R17 = 4) F1CD: 77 08 07 07 BTJZ %>8,R7,$F1D8 ; bit 3 clear ($C0-$C7,$D0-$D7,$E0-$E7,$F0-$F7): queue it as is F1D1: 76 20 07 06 BTJO %>20,R7,$F1DB ; bit 3 and bit 5 set ($E8-$EF,$F8-$FF): load AY registers from a block (F1DB) F1D5: 78 04 11 ADD %>4,R17 ; bit 3 set, bit 5 clear ($C8-$DF): queue 3 (sound playlist) F1D8: FB TRAP 4 ; TRAP 4: put A. $C0-$D7 = speak text block; $C8-$DF = play sound block; $E0-$F7 = speak phoneme block F1D9: E0 D4 JMP $F1AF ; end command F1DB: 42 07 04 MOV R7,R4 ; AY LOAD FROM BLOCK: R4 = R7 (block and flags) F1DE: 42 17 12 MOV R23,R18 ; R18 = R23 (offset) F1E1: D5 10 CLR R16 ; R16 = 0: read F1E3: FA TRAP 5 ; TRAP 5: A = next byte of the block F1E4: 7D 00 03 CMP %>0,R3 ; R3 != 0: end of block F1E7: E6 C6 JNZ $F1AF ; not equal: -> F1AF F1E9: 2D FF CMP %>FF,A ; $FF = end marker F1EB: E2 C2 JEQ $F1AF ; equal: -> F1AF F1ED: D0 3F MOV A,R63 ; R63 = AY register number F1EF: FA TRAP 5 ; TRAP 5: A = value F1F0: 7D 00 03 CMP %>0,R3 ; compare %>0,R3 F1F3: E6 BA JNZ $F1AF ; not equal: -> F1AF F1F5: 78 02 17 ADD %>2,R23 ; offset += 2 (R18 already advanced by TRAP 5) F1F8: 42 04 07 MOV R4,R7 ; R7 = R4 (block may have chained) F1FB: D0 3C MOV A,R60 ; R60 = value F1FD: 12 3F MOV R63,A ; A = register number F1FF: F8 TRAP 7 ; TRAP 7: AY[A] = R60 F200: E0 D9 JMP $F1DB ; next pair ;********************************************************************** ; TRAP 7 / TRAP 8: write AY register A with R60 ;********************************************************************** F202: 06 DINT ; TRAP 7: interrupt-safe AY write. Interrupts off F203: F7 TRAP 8 ; TRAP 8: AY[A] = R60 F204: 05 EINT ; interrupts on F205: 0A RETS ; return F206: A2 FF 0B MOVP %>FF,P11 ; TRAP 8: AY[A] = R60 (A = register). Port D is an output F209: 82 0A MOVP A,P10 ; address on the bus F20B: A2 BF 08 MOVP %>BF,P8 ; Port C = $BF: AY selected, BC1 and BDIR both inactive (bits 3,0 = 1) F20E: A2 B6 08 MOVP %>B6,P8 ; $B6: bits 3,0 = 0: BC1 and BDIR both asserted = latch address F211: 12 3C MOV R60,A ; A = R60 (also leaves A = R60 on return) F213: 82 0A MOVP A,P10 ; value on the bus F215: A2 BE 08 MOVP %>BE,P8 ; $BE: bit 0 = 0: BDIR only = write data F218: A2 FF 08 MOVP %>FF,P8 ; $FF: deselect F21B: 0A RETS ; return ;********************************************************************** ; INT1: SP0256 load request -> next allophone ;********************************************************************** F21C: B8 PUSH A ; INT1: SP0256 load request (LRQ), ready for another allophone. Save A F21D: C8 PUSH B ; save B F21E: D8 11 PUSH R17 ; save R17 F220: D8 10 PUSH R16 ; save R16 F222: 7D FF 05 CMP %>FF,R5 ; R5 = $FF? (phonemes come from the FIFO) F225: E6 1F JNZ $F246 ; no: reading a stored phoneme block, F246 F227: 88 00 04 11 MOVD %>0004,R17 ; R16=0 (get), R17=4 (queue 2, phoneme FIFO) F22B: F9 TRAP 6 ; TRAP 6: A = next allophone F22C: E3 32 JHS $F260 ; empty: stop INT1 (F260) F22E: 26 80 0E BTJO %>80,A,$F23F ; bit 7 set = "play stored block" token F231: A2 FF 0B MOVP %>FF,P11 ; Port D = output F234: 82 0A MOVP A,P10 ; allophone on the bus F236: A2 DF 08 MOVP %>DF,P8 ; P8 = $DF: ALD* (bit 5) low, loads the SP0256 F239: A2 FF 08 MOVP %>FF,P8 ; release F23C: 8C F0 2C BR $F02C ; restore and RETI F23F: D0 05 MOV A,R5 ; token: R5 = $80 | block id F241: D5 06 CLR R6 ; R6 = 0: read offset in that block F243: 8C F0 2C BR $F02C ; restore and RETI (next INT1 starts reading the block) F246: D5 10 CLR R16 ; R16 = 0: read F248: 42 05 04 MOV R5,R4 ; R4 = R5 (bit 4 = no-chain; bit 7 ignored by TRAP 12) F24B: 42 06 12 MOV R6,R18 ; R18 = R6 F24E: D3 06 INC R6 ; R6 += 1 F250: F3 TRAP 12 ; TRAP 12: A = next byte of the phoneme block F251: 7D 00 03 CMP %>0,R3 ; R3 != 0: end of chain F254: E6 07 JNZ $F25D ; not equal: -> F25D F256: 42 04 05 MOV R4,R5 ; R5 = R4 (block may have chained) F259: 2D FF CMP %>FF,A ; not $FF: send it to the SP0256 F25B: E6 D4 JNZ $F231 ; not equal: -> F231 F25D: 72 FF 05 MOV %>FF,R5 ; end of stored phrase: back to FIFO mode F260: A3 14 00 ANDP %>14,P0 ; P0 &= $14: disable and clear INT1 (re-enabled when a phoneme is queued, F114) F263: 8C F0 2C BR $F02C ; restore and RETI ;********************************************************************** ; TRAP 5 / TRAP 12: RAM block access ;********************************************************************** F266: 06 DINT ; TRAP 5: interrupt-safe TRAP 12. Interrupts off F267: F3 TRAP 12 ; TRAP 12 F268: 05 EINT ; interrupts on F269: 0A RETS ; return F26A: D5 03 CLR R3 ; TRAP 12: RAM block read/write. In: R4 block|flags, R18 offset, R16 ($FF = write R60, 0 = read). Out: A, R3 (0 ok, $FF end), R18+1. R3 = 0 F26C: 32 04 MOV R4,B ; B = block F26E: 53 0F AND %>F,B ; B = block number 0-15 F270: 73 3F 12 AND %>3F,R18 ; offset 0-63 F273: 7D 3F 12 CMP %>3F,R18 ; offset = $3F (last byte of the block)? F276: E1 13 JN $F28B ; no: normal access F278: 76 10 04 30 BTJO %>10,R4,$F2AC ; bit 4 of R4 = no chaining: error F27C: D3 04 INC R4 ; chain: next block F27E: D1 21 MOV B,R33 ; B (old block) vs new block F280: 45 04 21 XOR R4,R33 ; xor R4,R33 F283: 77 08 21 04 BTJZ %>8,R33,$F28B ; same 8-block bank (0-7 or 8-15): ok, accept F287: D2 04 DEC R4 ; crossing banks: undo F289: E0 21 JMP $F2AC ; error F28B: 5C 40 MPY %>40,B ; B * 64: A = bits 9:8 of address, B = low F28D: 28 E8 ADD %>E8,A ; A = $E8 + A: RAM selected, read, A10 = 0, A9:A8 = block / 4 F28F: 38 12 ADD R18,B ; B = (block & 3)*64 + offset F291: 92 06 MOVP B,P6 ; Port B = address low F293: 82 08 MOVP A,P8 ; Port C = RAM page select F295: D3 12 INC R18 ; offset += 1 F297: 12 10 MOV R16,A ; direction from R16 F299: 82 0B MOVP A,P11 ; Port D direction F29B: 80 0A MOVP P10,A ; read the byte F29D: 77 FF 10 07 BTJZ %>FF,R16,$F2A8 ; read mode: done F2A1: 12 3C MOV R60,A ; write mode: A = R60 F2A3: 82 0A MOVP A,P10 ; drive the bus F2A5: A3 F7 08 ANDP %>F7,P8 ; R/W* low: write F2A8: A2 FF 08 MOVP %>FF,P8 ; deselect F2AB: 0A RETS ; return F2AC: D4 03 INV R3 ; error: R3 = $FF F2AE: 0A RETS ; return ;********************************************************************** ; SOUND SEQUENCER (called every main loop pass) ;********************************************************************** F2AF: 72 05 18 MOV %>5,R24 ; SOUND SEQUENCER. R24 = channel 5..1 (1-3 tone A-C, 4 envelope, 5 noise) F2B2: 88 00 2B 1A MOVD %>002B,R26 ; R26 -> tick counters ($2B-$27) F2B6: 88 00 35 20 MOVD %>0035,R32 ; R32 -> queue 3 read pointers per channel ($35-$31) F2BA: 88 00 3A 1C MOVD %>003A,R28 ; R28 -> current block per channel ($3A-$36) F2BE: 88 00 30 1E MOVD %>0030,R30 ; R30 -> offset in block per channel ($30-$2C) F2C2: 72 10 46 MOV %>10,R70 ; R70 = channel mask F2C5: 47 46 3B 43 BTJZ R70,R59,$F30C ; channel's ready bit in R59 clear: skip it F2C9: 8E F3 2E CALL $F32E ; fetch the next event into R60,R36-R38 F2CC: 7D 00 03 CMP %>0,R3 ; got one? F2CF: E2 19 JEQ $F2EA ; yes: execute F2D1: 88 00 06 11 MOVD %>0006,R17 ; no event: R16=0, R17=6 (queue 3) F2D5: 9A 20 LDA *R32 ; R14 = this channel's read pointer F2D7: D0 0E MOV A,R14 ; A,R14 F2D9: 4D 0E 0F CMP R14,R15 ; nothing queued for this channel F2DC: E2 2E JEQ $F30C ; equal: -> F30C F2DE: FB TRAP 4 ; TRAP 4: A = next block number to play F2DF: 9B 1C STA *R28 ; channel block = A F2E1: B5 CLR A ; offset = 0 F2E2: 9B 1E STA *R30 ; store A *R30 F2E4: 12 0E MOV R14,A ; save advanced read pointer F2E6: 9B 20 STA *R32 ; store A *R32 F2E8: E0 DF JMP $F2C9 ; try the new block F2EA: 12 3C MOV R60,A ; A = event descriptor F2EC: 7D 04 18 CMP %>4,R24 ; channel 4 (envelope)? F2EF: E6 06 JNZ $F2F7 ; not equal: -> F2F7 F2F1: 23 60 AND %>60,A ; bits 6:5 of descriptor F2F3: 2D 60 CMP %>60,A ; = 11? F2F5: E2 12 JEQ $F309 ; yes: ours F2F7: 7D 05 18 CMP %>5,R24 ; channel 5 (noise)? F2FA: E6 04 JNZ $F300 ; not equal: -> F300 F2FC: 76 80 3C 09 BTJO %>80,R60,$F309 ; descriptor bit 7 = noise event: ours F300: 23 E0 AND %>E0,A ; channel field = bits 7:5 F302: B7 SWAP A ; swap nibbles of A F303: BC RR A ; rotate right A F304: B3 INC A ; +1 = channel number F305: 1D 18 CMP R24,A ; not this channel: skip event, fetch the next F307: E6 C0 JNZ $F2C9 ; not equal: -> F2C9 F309: 8E F3 6D CALL $F36D ; apply the event to the AY F30C: DB 1A DECD R26 ; next channel's pointers F30E: DB 20 DECD R32 ; 16-bit decrement R32 F310: DB 1C DECD R28 ; 16-bit decrement R28 F312: DB 1E DECD R30 ; 16-bit decrement R30 F314: DC 46 RR R70 ; next channel mask F316: DA 18 AC DJNZ R24,$F2C5 ; loop over 5 channels F319: 52 06 MOV %>6,B ; B = 6 pointers F31B: 88 00 35 20 MOVD %>0035,R32 ; R32 -> $35 F31F: 9A 20 LDA *R32 ; A = pointer F321: 1A 0F SUB R15,A ; A -= R15 (write pointer) F323: 1D 0E CMP R14,A ; smaller than R14? F325: E4 02 JP $F329 ; positive: -> F329 F327: D0 0E MOV A,R14 ; R14 = smallest (oldest) distance. NOTE: stays relative to R15; TRAP 6 full test uses R14 as absolute, looks suspicious F329: DB 20 DECD R32 ; next pointer F32B: CA F2 DJNZ B,$F31F ; decrement, loop while not zero: -> F31F F32D: 0A RETS ; return ;********************************************************************** ; Fetch next event of channel into R60, R36-R38 ;********************************************************************** F32E: 9A 1C LDA *R28 ; FETCH EVENT. A = channel's block F330: 2D FF CMP %>FF,A ; $FF = idle F332: E2 0D JEQ $F341 ; equal: -> F341 F334: D0 04 MOV A,R4 ; R4 = block F336: 9A 1E LDA *R30 ; A = offset F338: D0 12 MOV A,R18 ; R18 = offset F33A: D5 10 CLR R16 ; R16 = 0: read F33C: FA TRAP 5 ; TRAP 5: A = descriptor F33D: 2D FF CMP %>FF,A ; $FF = end marker F33F: E6 03 JNZ $F344 ; not equal: -> F344 F341: 72 FF 03 MOV %>FF,R3 ; R3 = $FF: no event F344: 7D 00 03 CMP %>0,R3 ; error? F347: E6 23 JNZ $F36C ; yes: return F349: D0 3C MOV A,R60 ; R60 = descriptor F34B: 72 02 40 MOV %>2,R64 ; R64 = 2 parameter bytes F34E: 26 80 02 BTJO %>80,A,$F353 ; bit 7 set: noise event, 2 parameters F351: D3 40 INC R64 ; tone/envelope event: 3 parameters F353: 88 00 24 42 MOVD %>0024,R66 ; R66 -> R36 F357: FA TRAP 5 ; TRAP 5: parameter byte F358: 7D 00 03 CMP %>0,R3 ; compare %>0,R3 F35B: E6 0F JNZ $F36C ; not equal: -> F36C F35D: 9B 42 STA *R66 ; store into R36, R37, (R38) F35F: D3 42 INC R66 ; increment R66 F361: DA 40 F3 DJNZ R64,$F357 ; decrement, loop while not zero: -> F357 F364: 12 04 MOV R4,A ; save block (may have chained) F366: 9B 1C STA *R28 ; store A *R28 F368: 12 12 MOV R18,A ; save offset F36A: 9B 1E STA *R30 ; store A *R30 F36C: 0A RETS ; return ;********************************************************************** ; Apply event to the AY (R60 desc, R36-R38 params) ;********************************************************************** F36D: 12 3C MOV R60,A ; APPLY EVENT. A = descriptor & $60 F36F: 23 60 AND %>60,A F371: 2D 60 CMP %>60,A ; = $60: envelope event F373: E2 4A JEQ $F3BF ; yes F375: B7 SWAP A ; channel bits to 0-2 F376: BC RR A ; rotate right A F377: B3 INC A ; +1: AY channel 1-3 F378: B8 PUSH A ; save channel F379: 72 80 22 MOV %>80,R34 ; R34 = mixer mask seed F37C: 77 80 3C 07 BTJZ %>80,R60,$F387 ; bit 7 clear: tone event F380: 72 04 22 MOV %>4,R34 ; noise event: mask seed = 4 F383: 76 80 24 03 BTJO %>80,R36,$F38A ; R36 bit 7 set: leave amplitude alone F387: 28 07 ADD %>7,A ; A = channel + 7: amplitude register 8-10 F389: F8 TRAP 7 ; TRAP 7: amplitude = R60 (descriptor low 5 bits) F38A: B9 POP A ; A = channel F38B: DE 22 RL R34 ; R34 rotated: tone bit 1/2/4 (noise: 8/16/32) F38D: BA FC DJNZ A,$F38B ; decrement, loop while not zero: -> F38B F38F: 06 DINT ; interrupts off F390: A2 FF 0B MOVP %>FF,P11 ; bus = output F393: A2 07 0A MOVP %>07,P10 ; register 7 (mixer) F396: A2 BF 08 MOVP %>BF,P8 ; latch address F399: A2 B6 08 MOVP %>B6,P8 F39C: A2 00 0B MOVP %>00,P11 ; bus = input F39F: A2 B7 08 MOVP %>B7,P8 ; $B7: BC1 only = read F3A2: 80 0A MOVP P10,A ; A = mixer F3A4: A2 FF 08 MOVP %>FF,P8 ; deselect F3A7: 05 EINT ; interrupts on F3A8: 32 3C MOV R60,B ; B = amplitude field F3AA: 53 1F AND %>1F,B F3AC: 5D 00 CMP %>0,B ; zero? F3AE: E2 06 JEQ $F3B6 ; yes: disable channel F3B0: D4 22 INV R34 ; invert mask F3B2: 13 22 AND R34,A ; clear bit = enable channel F3B4: E0 02 JMP $F3B8 ; -> F3B8 F3B6: 14 22 OR R34,A ; set bit = disable channel F3B8: D0 3C MOV A,R60 ; R60 = new mixer F3BA: 22 07 MOV %>7,A ; A = 7 F3BC: F8 TRAP 7 ; TRAP 7: write mixer F3BD: E0 03 JMP $F3C2 ; -> F3C2 F3BF: 22 0D MOV %>D,A ; envelope: A = 13 (shape register) F3C1: F8 TRAP 7 ; TRAP 7: shape = R60 (descriptor) F3C2: 32 18 MOV R24,B ; B = channel F3C4: AA F3 EA LDA @>F3EA(B) ; A = coarse period register for the channel (table at F3EB) F3C7: D0 3F MOV A,R63 ; R63 = register F3C9: 42 24 3C MOV R36,R60 ; R60 = R36 (coarse) F3CC: F8 TRAP 7 ; TRAP 7: write F3CD: 42 25 3C MOV R37,R60 ; R60 = R37 (fine; noise: duration) F3D0: 7D 05 18 CMP %>5,R24 ; noise has no fine register F3D3: E2 08 JEQ $F3DD ; equal: -> F3DD F3D5: D2 3F DEC R63 ; fine register = coarse - 1 F3D7: 12 3F MOV R63,A ; R63,A F3D9: F8 TRAP 7 ; TRAP 7 F3DA: 42 26 3C MOV R38,R60 ; R60 = R38 (duration) F3DD: 9A 1A LDA *R26 ; (dummy read) F3DF: 12 3C MOV R60,A ; A = duration (noise: R37) F3E1: 9B 1A STA *R26 ; load tick counter F3E3: D4 46 INV R70 ; clear ready bit: mask inverted F3E5: 43 46 3B AND R70,R59 F3E8: D4 46 INV R70 ; invert R70 F3EA: 0A RETS ; return ; TABLE AY register per channel (indexed by channel 1-5 at F3C4) F3EB: 01 FCB $01 ; PSG coarse-period register ch1 (tone A) F3EC: 03 FCB $03 ; ch2 (tone B) F3ED: 05 FCB $05 ; ch3 (tone C) F3EE: 0c FCB $0c ; ch4 envelope coarse (fine = $0B) F3EF: 06 FCB $06 ; ch5 noise period ;********************************************************************** ; SPEECH TRANSLATOR: text -> allophones in queue 2 ;********************************************************************** F3F0: 4D 0A 0B CMP R10,R11 ; SPEECH TRANSLATOR. Text FIFO empty? F3F3: E2 56 JEQ $F44B ; yes: done F3F5: 12 0C MOV R12,A ; phoneme FIFO R12 - R13 F3F7: 1A 0D SUB R13,A F3F9: E1 06 JN $F401 ; negative / lower: -> F401 F3FB: E2 04 JEQ $F401 ; equal: -> F401 F3FD: 2D 32 CMP %>32,A ; compare %>32,A F3FF: E1 4A JN $F44B ; fewer than 50 bytes free: wait F401: 72 00 21 MOV %>0,R33 ; R33 = 0 (never read) F404: 88 00 02 11 MOVD %>0002,R17 ; R16=0, R17=2 (queue 1) F408: FB TRAP 4 ; TRAP 4: peek next text byte F409: D2 0A DEC R10 ; un-get (peek only) F40B: 2D 18 CMP %>18,A ; printable ($18 and up)? F40D: E1 04 JN $F413 ; control code: F413 F40F: 8E F4 51 CALL $F451 ; translate the FIFO text F412: 0A RETS ; return F413: 2D 0D CMP %>D,A ; CR? F415: E2 F8 JEQ $F40F ; yes: translate F417: 72 FF 21 MOV %>FF,R33 ; control code: R33 = $FF (never read) F41A: D3 0A INC R10 ; consume it F41C: D0 20 MOV A,R32 ; R32 = block (code $00-$07 / $10-$17) F41E: D5 48 CLR R72 ; R72 = 0: read text from a block F420: 7D 00 07 CMP %>0,R7 ; no host command in progress? F423: E2 05 JEQ $F42A ; equal: -> F42A F425: 76 08 07 01 BTJO %>8,R7,$F42A ; or loading sound data: ok F429: 0A RETS ; else wait F42A: 72 00 10 MOV %>0,R16 ; SPEAK STORED TEXT: R16 = 0 F42D: 42 49 1F MOV R73,R31 ; R31 = text position F430: 42 20 04 MOV R32,R4 ; R4 = block F433: 42 49 12 MOV R73,R18 ; R18 = offset F436: FA TRAP 5 ; TRAP 5: A = char F437: 42 04 20 MOV R4,R32 ; R32 = block (chained) F43A: 7D FF 03 CMP %>FF,R3 ; end of chain? F43D: E2 0C JEQ $F44B ; equal: -> F44B F43F: 2D 0D CMP %>D,A ; CR = end of text F441: E2 08 JEQ $F44B ; equal: -> F44B F443: F2 TRAP 13 ; TRAP 13: translate F444: 42 1F 49 MOV R31,R73 ; R73 = position F447: D3 49 INC R73 ; next char F449: E0 DF JMP $F42A ; -> F42A F44B: 72 01 48 MOV %>1,R72 ; end: R72 = 1 (FIFO mode) F44E: D5 49 CLR R73 ; R73 = 0 F450: 0A RETS ; return ;********************************************************************** ; Translate queued text when a word is complete ;********************************************************************** F451: 4D 0A 0B CMP R10,R11 ; TRANSLATE FIFO TEXT. Queue 1 empty? F454: E2 28 JEQ $F47E ; equal: -> F47E F456: 72 01 48 MOV %>1,R72 ; R72 = 1: text comes from the FIFO F459: D8 0A PUSH R10 ; save R10 F45B: 42 0B 0A MOV R11,R10 ; R10 = R11 - 1 F45E: D2 0A DEC R10 ; decrement R10 F460: 88 00 02 11 MOVD %>0002,R17 ; R16=0, R17=2 F464: FB TRAP 4 ; TRAP 4: A = last queued char F465: D9 0A POP R10 ; restore R10 F467: F1 TRAP 14 ; TRAP 14: classify F468: 7D 04 19 CMP %>4,R25 ; last char is a delimiter (class 4)? F46B: E6 11 JNZ $F47E ; no: wait for the end of the word F46D: 88 00 02 11 MOVD %>0002,R17 ; R16=0, R17=2 F471: FB TRAP 4 ; TRAP 4: next char F472: 42 0A 1F MOV R10,R31 ; R31 = its position F475: F2 TRAP 13 ; TRAP 13: translate F476: 42 1F 0A MOV R31,R10 ; R10 = position after what was consumed F479: 7D 04 19 CMP %>4,R25 ; continue until a delimiter was translated F47C: E6 D3 JNZ $F451 ; not equal: -> F451 F47E: D5 19 CLR R25 ; R25 = 0 F480: 0A RETS ; return ;********************************************************************** ; TRAP 14: classify a character, pick the rule list ;********************************************************************** F481: 2D 30 CMP %>30,A ; TRAP 14: classify A. R25 = 1 letter, 4 other. R62 = rule list. Digit does not set R25 F483: E5 02 JPZ $F487 ; >= '0'? F485: E0 31 JMP $F4B8 ; no: other F487: 2D 3A CMP %>3A,A ; >= ':'? F489: E5 06 JPZ $F491 ; >= : -> F491 F48B: 88 FF 4B 3E MOVD %>FF4B,R62 ; digit: rules at $FF4B F48F: E0 26 JMP $F4B7 ; -> F4B7 F491: 2D 41 CMP %>41,A ; >= 'A'? F493: E5 02 JPZ $F497 ; >= : -> F497 F495: E0 21 JMP $F4B8 ; -> F4B8 F497: 2D 5B CMP %>5B,A ; >= '['? F499: E5 09 JPZ $F4A4 ; >= : -> F4A4 F49B: 88 F8 3E 3E MOVD %>F83E,R62 ; upper-case letter F49F: 72 01 19 MOV %>1,R25 ; R25 = 1 F4A2: E0 13 JMP $F4B7 ; -> F4B7 F4A4: 2D 61 CMP %>61,A ; >= 'a'? F4A6: E5 02 JPZ $F4AA ; >= : -> F4AA F4A8: E0 0E JMP $F4B8 ; -> F4B8 F4AA: 2D 7B CMP %>7B,A ; >= '{'? F4AC: E5 0A JPZ $F4B8 ; >= : -> F4B8 F4AE: 2A 20 SUB %>20,A ; lower case to upper F4B0: 88 F8 3E 3E MOVD %>F83E,R62 F4B4: 72 01 19 MOV %>1,R25 ; R25 = 1 F4B7: 0A RETS ; return F4B8: 72 04 19 MOV %>4,R25 ; other: R25 = 4 F4BB: 88 F8 11 3E MOVD %>F811,R62 ; punctuation rules at $F811 F4BF: E0 F6 JMP $F4B7 ; -> F4B7 ;********************************************************************** ; TRAP 13: apply the rules to one character ;********************************************************************** F4C1: F1 TRAP 14 ; TRAP 13: translate char at R31 using rules. Out: phonemes to queue 2, R31 advanced F4C2: 7D 01 19 CMP %>1,R25 ; letter? F4C5: E6 11 JNZ $F4D8 ; not equal: -> F4D8 F4C7: C5 CLR B ; B = 0 F4C8: 2A 41 SUB %>41,A ; A - 'A' F4CA: 2C 02 MPY %>2,A ; x 2 F4CC: 58 02 ADD %>2,B ; +2 (table at $FF79) F4CE: AA FF 79 LDA @>FF79(B) ; high byte of the rule pointer F4D1: D0 3D MOV A,R61 ; R61 F4D3: AA FF 7A LDA @>FF7A(B) ; low byte F4D6: D0 3E MOV A,R62 ; R62 F4D8: 8E F5 34 CALL $F534 ; skip left context to the match string F4DB: 8E F5 5A CALL $F55A ; compare match string F4DE: E3 43 JHS $F523 ; mismatch: next rule F4E0: D5 1E CLR R30 ; forward F4E2: F0 TRAP 15 ; TRAP 15: right context F4E3: E3 3E JHS $F523 ; carry set: -> F523 F4E5: 8E F7 9B CALL $F79B ; back to the start of the match string F4E8: 72 01 1E MOV %>1,R30 ; backward F4EB: 42 1F 18 MOV R31,R24 ; cursor = char position F4EE: F0 TRAP 15 ; TRAP 15: left context F4EF: E3 3D JHS $F52E ; mismatch: next rule F4F1: 7D 00 1B CMP %>0,R27 ; R27 = extra letters matched F4F4: E2 06 JEQ $F4FC ; equal: -> F4FC F4F6: D2 1B DEC R27 ; decrement R27 F4F8: D3 1F INC R31 ; advance position F4FA: E0 F5 JMP $F4F1 ; -> F4F1 F4FC: 52 02 MOV %>2,B ; skip to the phonemes F4FE: EF TRAP 16 ; TRAP 16 F4FF: 9A 3E LDA *R62 ; first phoneme F501: 2D FF CMP %>FF,A ; $FF = no output F503: E6 01 JNZ $F506 ; not equal: -> F506 F505: 0A RETS ; return F506: D5 1C CLR R28 ; R28 = 0 F508: 9A 3E LDA *R62 ; load A *R62 F50A: 27 80 03 BTJZ %>80,A,$F510 ; bit 7 = last phoneme F50D: 72 01 1C MOV %>1,R28 ; R28 = 1 F510: 23 3F AND %>3F,A ; 6-bit allophone F512: 88 FF 04 11 MOVD %>FF04,R17 ; R16=$FF, R17=4 (queue 2) F516: FB TRAP 4 ; TRAP 4: put allophone F517: D3 3E INC R62 ; next byte F519: E7 02 JL $F51D ; carry clear: -> F51D F51B: D3 3D INC R61 ; increment R61 F51D: 7D 01 1C CMP %>1,R28 ; last one? F520: E6 E4 JNZ $F506 ; not equal: -> F506 F522: 0A RETS ; return F523: D3 3E INC R62 ; right context failed: skip past this rule F525: E7 02 JL $F529 ; carry clear: -> F529 F527: D3 3D INC R61 ; increment R61 F529: 52 02 MOV %>2,B ; 2nd marked byte = next rule's match F52B: EF TRAP 16 ; TRAP 16 F52C: E0 AD JMP $F4DB ; try it F52E: 52 03 MOV %>3,B ; left context failed F530: EF TRAP 16 ; 3rd marked byte F531: E0 A8 JMP $F4DB ; -> F4DB F533: 0A RETS ; (unused) ;********************************************************************** ; Rule helpers: skip, TRAP 16, match string ;********************************************************************** F534: 9A 3E LDA *R62 ; SKIP LEFT CONTEXT: find first byte with bit 6 F536: 27 40 01 BTJZ %>40,A,$F53A F539: 0A RETS ; return F53A: D3 3E INC R62 ; next byte F53C: E7 02 JL $F540 ; carry clear: -> F540 F53E: D3 3D INC R61 ; increment R61 F540: E0 F2 JMP $F534 ; -> F534 F542: 0A RETS ; (unused) F543: D5 1C CLR R28 ; TRAP 16: advance R62 to the B-th byte with bit 6 set F545: 9A 3E LDA *R62 ; load A *R62 F547: 27 40 07 BTJZ %>40,A,$F551 F54A: D3 1C INC R28 ; increment R28 F54C: 3D 1C CMP R28,B ; compare R28,B F54E: E4 01 JP $F551 ; positive: -> F551 F550: 0A RETS ; return F551: D3 3E INC R62 ; next byte F553: E7 02 JL $F557 ; carry clear: -> F557 F555: D3 3D INC R61 ; increment R61 F557: E0 EC JMP $F545 ; -> F545 F559: 0A RETS ; (unused) F55A: D5 1D CLR R29 ; COMPARE MATCH STRING. R29 = 0, R27 = 0 F55C: D5 1B CLR R27 ; clear R27 F55E: 42 1F 18 MOV R31,R24 ; R24 = text position F561: 9A 3E LDA *R62 ; rule byte F563: 2D FF CMP %>FF,A ; $FF = empty match (key letter only) F565: E6 02 JNZ $F569 ; not equal: -> F569 F567: B0 CLRC ; match F568: 0A RETS ; return F569: 7D 01 19 CMP %>1,R25 ; letter rules: skip the key letter F56C: E6 02 JNZ $F570 ; not equal: -> F570 F56E: D3 18 INC R24 ; count the key letter F570: F5 TRAP 10 ; TRAP 10: text char F571: 2D 61 CMP %>61,A ; upper-case F573: E1 02 JN $F577 ; negative / lower: -> F577 F575: 2A 20 SUB %>20,A F577: 2A 20 SUB %>20,A ; char - $20 F579: C0 MOV A,B ; B = char code F57A: 53 3F AND %>3F,B F57C: 9A 3E LDA *R62 ; rule byte F57E: 27 80 03 BTJZ %>80,A,$F584 ; bit 7 = last char of the string F581: 72 01 1D MOV %>1,R29 ; R29 = 1 F584: 23 3F AND %>3F,A F586: 3D 00 CMP R0,B ; equal? F588: E2 04 JEQ $F58E ; equal: -> F58E F58A: D5 1B CLR R27 ; mismatch: R27 = 0 F58C: 07 SETC ; C = 1 F58D: 0A RETS ; return F58E: 7D 01 19 CMP %>1,R25 ; letters: count it F591: E6 02 JNZ $F595 ; not equal: -> F595 F593: D3 1B INC R27 ; increment R27 F595: 7D 01 1D CMP %>1,R29 ; last char matched F598: E6 02 JNZ $F59C ; not equal: -> F59C F59A: B0 CLRC ; C = 0: match F59B: 0A RETS ; return F59C: D3 3E INC R62 ; next rule byte F59E: E7 02 JL $F5A2 ; carry clear: -> F5A2 F5A0: D3 3D INC R61 ; increment R61 F5A2: 9A 3E LDA *R62 ; load A *R62 F5A4: E0 C8 JMP $F56E ; compare next char F5A6: 0A RETS ; (unused) F5A7: D3 3E INC R62 ; PEEK: is the next rule byte the end of the context? R29 F5A9: E7 02 JL $F5AD ; carry clear: -> F5AD F5AB: D3 3D INC R61 ; increment R61 F5AD: 9A 3E LDA *R62 ; load A *R62 F5AF: 27 40 06 BTJZ %>40,A,$F5B8 ; bit 6 = end F5B2: 72 01 1D MOV %>1,R29 ; R29 = 1 F5B5: DB 3E DECD R62 ; restore R62 F5B7: 0A RETS ; return F5B8: D5 1D CLR R29 ; R29 = 0 F5BA: DB 3E DECD R62 ; restore R62 F5BC: 0A RETS ; return ;********************************************************************** ; TRAP 9: class flags of the char under the cursor ;********************************************************************** F5BD: C8 PUSH B ; TRAP 9: class flags of the text char at the cursor. Save B F5BE: C5 CLR B ; B = 0 F5BF: F5 TRAP 10 ; TRAP 10 F5C0: 2D 61 CMP %>61,A ; upper-case F5C2: E1 02 JN $F5C6 ; negative / lower: -> F5C6 F5C4: 2A 20 SUB %>20,A F5C6: 2A 41 SUB %>41,A ; A - 'A' F5C8: 68 ADD B,A F5C9: C0 MOV A,B ; B = index F5CA: 5D 1A CMP %>1A,B ; more than 25? F5CC: E4 09 JP $F5D7 ; not a letter F5CE: 5D 00 CMP %>0,B ; compare %>0,B F5D0: E1 05 JN $F5D7 ; negative / lower: -> F5D7 F5D2: AA F7 F6 LDA @>F7F6(B) ; A = flags from table at $F7F6 F5D5: C9 POP B ; restore B F5D6: 0A RETS ; return F5D7: B5 CLR A ; not a letter: A = 0 F5D8: C9 POP B ; restore B F5D9: 0A RETS ; return F5DA: D3 18 INC R24 ; SKIP RUN: step cursor F5DC: F6 TRAP 9 ; TRAP 9 F5DD: 66 FB BTJO B,A,$F5DA ; class matches mask B: continue F5DF: D2 18 DEC R24 ; back to the last matching char F5E1: EE TRAP 17 ; TRAP 17 F5E2: 0A RETS ; (unused) F5E3: 8C F7 0E BR $F70E ; TOKEN $09 '#' dispatch table (BR per token $09-$14, 3 bytes each) F5E6: 8C F7 20 BR $F720 ; $0A '.' F5E9: 8C F6 CE BR $F6CE ; $0B '%' F5EC: 8C F7 42 BR $F742 ; $0C '&' F5EF: 8C F7 54 BR $F754 ; $0D '@' F5F2: 8C F7 30 BR $F730 ; $0E '^' F5F5: 8C F7 36 BR $F736 ; $0F '+' F5F8: 8C F6 B3 BR $F6B3 ; $10 ':' F5FB: 8C F6 88 BR $F688 ; $11 '*' F5FE: 8C F7 3C BR $F73C ; $12 '$' F601: 8C F6 72 BR $F672 ; $13 word boundary F604: 8C F6 9A BR $F69A ; $14 two or more vowels ;********************************************************************** ; TRAP 15: context matching and token handlers ;********************************************************************** F607: 7D 00 1E CMP %>0,R30 ; TRAP 15: match context pattern. R30 = 0 right (forward), 1 left (backward). Forward? F60A: E6 0A JNZ $F616 ; not equal: -> F616 F60C: 52 40 MOV %>40,B ; forward: terminator bit is 6 F60E: D3 3E INC R62 ; next rule byte F610: E7 02 JL $F614 ; carry clear: -> F614 F612: D3 3D INC R61 ; increment R61 F614: E0 04 JMP $F61A ; -> F61A F616: 52 80 MOV %>80,B ; backward: terminator bit is 7 F618: DB 3E DECD R62 ; previous rule byte F61A: 9A 3E LDA *R62 ; rule byte F61C: 67 11 BTJZ B,A,$F62F ; terminator bit missing: it is a pattern token F61E: 7D 00 1E CMP %>0,R30 ; end of context reached F621: E6 04 JNZ $F627 ; not equal: -> F627 F623: DB 3E DECD R62 ; forward: step back F625: E0 06 JMP $F62D ; -> F62D F627: D3 3E INC R62 ; backward: step back F629: E7 02 JL $F62D ; carry clear: -> F62D F62B: D3 3D INC R61 ; increment R61 F62D: B0 CLRC ; success: C = 0 F62E: 0A RETS ; return F62F: F4 TRAP 11 ; move text cursor F630: F5 TRAP 10 ; TRAP 10: char F631: 2D 61 CMP %>61,A ; upper-case F633: E1 02 JN $F637 ; negative / lower: -> F637 F635: 2A 20 SUB %>20,A F637: 2A 20 SUB %>20,A ; code = char - $20 F639: D0 1A MOV A,R26 ; R26 = code F63B: 7D 00 1E CMP %>0,R30 ; backward only: F63E: E2 0D JEQ $F64D ; equal: -> F64D F640: 7D 21 18 CMP %>21,R24 ; cursor at $21 (treated as start of text)? F643: E6 08 JNZ $F64D ; not equal: -> F64D F645: 22 13 MOV %>13,A ; only a boundary token matches there F647: 9D 3E CMPA *R62 F649: E2 E2 JEQ $F62D ; equal: -> F62D F64B: 07 SETC ; fail F64C: 0A RETS ; return F64D: 9A 3E LDA *R62 ; rule byte F64F: 2D 15 CMP %>15,A ; token < $15: pattern class F651: E1 13 JN $F666 ; negative / lower: -> F666 F653: D5 1D CLR R29 ; literal letter. R29 = 0 F655: 4D 00 1A CMP R0,R26 ; equal to text code? F658: E2 02 JEQ $F65C ; equal: -> F65C F65A: 07 SETC ; fail F65B: 0A RETS ; return F65C: EE TRAP 17 ; TRAP 17: last token? F65D: 7D 01 1D CMP %>1,R29 ; compare %>1,R29 F660: E2 02 JEQ $F664 ; equal: -> F664 F662: E0 A3 JMP $F607 ; next token F664: B0 CLRC ; success F665: 0A RETS ; return F666: 2D 07 CMP %>7,A ; token $07 (apostrophe) is a literal F668: E2 E9 JEQ $F653 ; equal: -> F653 F66A: C0 MOV A,B ; dispatch on token $09-$14 F66B: 5A 09 SUB %>9,B F66D: 5C 03 MPY %>3,B ; x 3 (size of a BR) F66F: AC F5 E3 BR @>F5E3(B) ; branch through the table at F5E3 F672: 7D 21 1A CMP %>21,R26 ; TOKEN $13 word boundary: fails on a letter F675: E1 07 JN $F67E ; negative / lower: -> F67E F677: 7D 3A 1A CMP %>3A,R26 ; compare %>3A,R26 F67A: E4 02 JP $F67E ; positive: -> F67E F67C: 07 SETC ; fail F67D: 0A RETS ; return F67E: EE TRAP 17 ; TRAP 17 F67F: 7D 01 1D CMP %>1,R29 ; compare %>1,R29 F682: E2 02 JEQ $F686 ; equal: -> F686 F684: E0 DC JMP $F662 ; -> F662 F686: B0 CLRC ; success F687: 0A RETS ; return F688: F6 TRAP 9 ; TOKEN $11 '*': one or more consonants F689: 26 08 02 BTJO %>8,A,$F68E F68C: 07 SETC ; fail F68D: 0A RETS ; return F68E: 52 08 MOV %>8,B ; mask 8 = consonant F690: ED TRAP 18 ; TRAP 18: skip the run F691: 7D 01 1D CMP %>1,R29 ; compare %>1,R29 F694: E2 02 JEQ $F698 ; equal: -> F698 F696: E0 CA JMP $F662 ; -> F662 F698: B0 CLRC ; success F699: 0A RETS ; return F69A: F6 TRAP 9 ; TOKEN $14: two or more vowels. First a vowel F69B: 26 80 02 BTJO %>80,A,$F6A0 F69E: 07 SETC ; fail F69F: 0A RETS ; return F6A0: F4 TRAP 11 ; next char F6A1: F6 TRAP 9 ; TRAP 9 F6A2: 26 80 02 BTJO %>80,A,$F6A7 ; second vowel F6A5: 07 SETC ; fail F6A6: 0A RETS ; return F6A7: 52 80 MOV %>80,B ; mask $80 = vowel F6A9: ED TRAP 18 ; TRAP 18: skip the rest F6AA: 7D 01 1D CMP %>1,R29 ; compare %>1,R29 F6AD: E2 02 JEQ $F6B1 ; equal: -> F6B1 F6AF: E0 B1 JMP $F662 ; -> F662 F6B1: B0 CLRC ; success F6B2: 0A RETS ; return F6B3: F6 TRAP 9 ; TOKEN $10 ':' zero or more consonants F6B4: 26 08 0B BTJO %>8,A,$F6C2 F6B7: EE TRAP 17 ; none here: TRAP 17 F6B8: 7D 01 1D CMP %>1,R29 ; compare %>1,R29 F6BB: E2 03 JEQ $F6C0 ; equal: -> F6C0 F6BD: EC TRAP 19 ; undo the cursor step F6BE: E0 A2 JMP $F662 ; next token F6C0: B0 CLRC ; success F6C1: 0A RETS ; return F6C2: 52 08 MOV %>8,B ; consonant run F6C4: ED TRAP 18 ; TRAP 18 F6C5: 7D 01 1D CMP %>1,R29 ; compare %>1,R29 F6C8: E2 02 JEQ $F6CC ; equal: -> F6CC F6CA: E0 F2 JMP $F6BE ; -> F6BE F6CC: B0 CLRC ; success F6CD: 0A RETS ; return F6CE: F6 TRAP 9 ; TOKEN $0B '%': suffix E, ER, ES, ED, ELY, ING. Is it an E? F6CF: 26 01 15 BTJO %>1,A,$F6E7 F6D2: F5 TRAP 10 ; not E: must be I F6D3: 2D 49 CMP %>49,A ; compare %>49,A F6D5: E2 02 JEQ $F6D9 ; equal: -> F6D9 F6D7: 07 SETC ; fail F6D8: 0A RETS ; return F6D9: F4 TRAP 11 ; next char F6DA: F5 TRAP 10 ; call TRAP vector F6DB: 2D 4E CMP %>4E,A ; N? F6DD: E6 F8 JNZ $F6D7 ; not equal: -> F6D7 F6DF: F4 TRAP 11 ; next char F6E0: F5 TRAP 10 ; call TRAP vector F6E1: 2D 47 CMP %>47,A ; G? F6E3: E2 21 JEQ $F706 ; ING: check word end F6E5: 07 SETC ; fail F6E6: 0A RETS ; return F6E7: F4 TRAP 11 ; after E: next char F6E8: F5 TRAP 10 ; call TRAP vector F6E9: 2D 52 CMP %>52,A ; R? F6EB: E2 19 JEQ $F706 ; equal: -> F706 F6ED: 2D 53 CMP %>53,A ; S? F6EF: E2 15 JEQ $F706 ; equal: -> F706 F6F1: 2D 44 CMP %>44,A ; D? F6F3: E2 11 JEQ $F706 ; equal: -> F706 F6F5: 2D 4C CMP %>4C,A ; L? F6F7: E2 03 JEQ $F6FC ; equal: -> F6FC F6F9: EC TRAP 19 ; plain E: step back F6FA: E0 0A JMP $F706 ; -> F706 F6FC: F4 TRAP 11 ; ELY: next char F6FD: F5 TRAP 10 ; call TRAP vector F6FE: 2D 59 CMP %>59,A ; Y? F700: E2 04 JEQ $F706 ; equal: -> F706 F702: EC TRAP 19 ; not ELY: step back twice F703: EC TRAP 19 ; call TRAP vector F704: E0 20 JMP $F726 ; -> F726 F706: F4 TRAP 11 ; suffix must be followed by a space: next char F707: F5 TRAP 10 ; call TRAP vector F708: 2D 20 CMP %>20,A ; compare %>20,A F70A: E2 1A JEQ $F726 ; equal: -> F726 F70C: 07 SETC ; fail F70D: 0A RETS ; return F70E: F6 TRAP 9 ; TOKEN $09 '#': one or more vowels F70F: 26 80 02 BTJO %>80,A,$F714 F712: 07 SETC ; fail F713: 0A RETS ; return F714: 52 80 MOV %>80,B ; mask $80 F716: ED TRAP 18 ; TRAP 18 F717: 7D 01 1D CMP %>1,R29 ; compare %>1,R29 F71A: E2 02 JEQ $F71E ; equal: -> F71E F71C: E0 AC JMP $F6CA ; -> F6CA F71E: B0 CLRC ; success F71F: 0A RETS ; return F720: F6 TRAP 9 ; TOKEN $0A '.': one voiced consonant F721: 26 40 02 BTJO %>40,A,$F726 F724: 07 SETC ; fail F725: 0A RETS ; return F726: EE TRAP 17 ; single class char matched: TRAP 17 F727: 7D 01 1D CMP %>1,R29 ; compare %>1,R29 F72A: E2 02 JEQ $F72E ; equal: -> F72E F72C: E0 EE JMP $F71C ; -> F71C F72E: B0 CLRC ; success F72F: 0A RETS ; return F730: F6 TRAP 9 ; TOKEN $0E '^': one consonant F731: 26 08 F2 BTJO %>8,A,$F726 F734: 07 SETC ; fail F735: 0A RETS ; return F736: F6 TRAP 9 ; TOKEN $0F '+': front vowel (E I Y) F737: 26 04 EC BTJO %>4,A,$F726 F73A: 07 SETC ; fail F73B: 0A RETS ; return F73C: F6 TRAP 9 ; TOKEN $12 '$': O or U F73D: 26 02 E6 BTJO %>2,A,$F726 F740: 07 SETC ; fail F741: 0A RETS ; return F742: F6 TRAP 9 ; TOKEN $0C '&': sibilant run F743: 26 20 02 BTJO %>20,A,$F748 F746: 07 SETC ; fail F747: 0A RETS ; return F748: 52 20 MOV %>20,B ; mask $20 F74A: ED TRAP 18 ; TRAP 18 F74B: 7D 01 1D CMP %>1,R29 ; compare %>1,R29 F74E: E2 02 JEQ $F752 ; equal: -> F752 F750: E0 CA JMP $F71C ; -> F71C F752: B0 CLRC ; success F753: 0A RETS ; return F754: F6 TRAP 9 ; TOKEN $0D '@': T S R D L Z N J, plus TH CH SH. In class? F755: 26 10 0F BTJO %>10,A,$F767 F758: F5 TRAP 10 ; not in class: char F759: 2D 23 CMP %>23,A ; compare with $23. NOTE: TRAP 10 returns raw ASCII, so this never matches (looks like a latent bug) F75B: E2 02 JEQ $F75F ; equal: -> F75F F75D: 07 SETC ; fail F75E: 0A RETS ; return F75F: F4 TRAP 11 ; next char F760: F5 TRAP 10 ; call TRAP vector F761: 2D 48 CMP %>48,A ; H? F763: E2 C1 JEQ $F726 ; equal: -> F726 F765: 07 SETC ; fail F766: 0A RETS ; return F767: F5 TRAP 10 ; in class: char F768: 2D 34 CMP %>34,A ; compare with $34. NOTE: same raw ASCII issue F76A: E2 04 JEQ $F770 ; equal: -> F770 F76C: 2D 33 CMP %>33,A ; compare with $33 F76E: E6 B6 JNZ $F726 ; not equal: -> F726 F770: F4 TRAP 11 ; next char F771: F5 TRAP 10 ; call TRAP vector F772: 2D 48 CMP %>48,A ; H? F774: E2 01 JEQ $F777 ; equal: -> F777 F776: EC TRAP 19 ; no: step back F777: E0 D7 JMP $F750 ; -> F750 F779: 0A RETS ; (unused) F77A: 07 SETC ; (unused) F77B: 0A RETS ; return ;********************************************************************** ; TRAP 10: fetch char at cursor R24 ;********************************************************************** F77C: C8 PUSH B ; TRAP 10: char at cursor R24. Save B F77D: 7D 00 48 CMP %>0,R72 ; R72 = 0: text block F780: E6 09 JNZ $F78B ; not equal: -> F78B F782: 42 20 04 MOV R32,R4 ; R4 = block R32 F785: 42 18 12 MOV R24,R18 ; R18 = cursor F788: FA TRAP 5 ; TRAP 5: A = char F789: C9 POP B ; restore B F78A: 0A RETS ; return F78B: D8 0A PUSH R10 ; FIFO mode: save R10 F78D: 42 18 0A MOV R24,R10 ; R10 = cursor - 1 F790: D2 0A DEC R10 ; decrement R10 F792: 88 00 02 11 MOVD %>0002,R17 ; R16=0, R17=2 F796: FB TRAP 4 ; TRAP 4: A = char F797: D9 0A POP R10 ; restore R10 F799: C9 POP B ; restore B F79A: 0A RETS ; return F79B: 9A 3E LDA *R62 ; BACK to the match string: bit 6 set? F79D: 27 40 01 BTJZ %>40,A,$F7A1 F7A0: 0A RETS ; return F7A1: DB 3E DECD R62 ; step back F7A3: E0 F6 JMP $F79B ; -> F79B F7A5: 0A RETS ; (unused) ;********************************************************************** ; TRAP 17 / 18 / 11 / 19: context helpers ;********************************************************************** F7A6: 7D 00 1E CMP %>0,R30 ; TRAP 17: is the current token the last one? R29. Forward? F7A9: E6 04 JNZ $F7AF ; not equal: -> F7AF F7AB: 8E F5 A7 CALL $F5A7 ; call F5A7 F7AE: 0A RETS ; return F7AF: DB 3E DECD R62 ; backward: previous byte F7B1: 9A 3E LDA *R62 ; load A *R62 F7B3: 27 80 0A BTJZ %>80,A,$F7C0 ; bit 7 = end F7B6: 72 01 1D MOV %>1,R29 ; R29 = 1 F7B9: D3 3E INC R62 ; restore F7BB: E7 02 JL $F7BF ; carry clear: -> F7BF F7BD: D3 3D INC R61 ; increment R61 F7BF: 0A RETS ; return F7C0: D5 1D CLR R29 ; R29 = 0 F7C2: D3 3E INC R62 ; restore F7C4: E7 02 JL $F7C8 ; carry clear: -> F7C8 F7C6: D3 3D INC R61 ; increment R61 F7C8: 0A RETS ; return F7C9: 7D 00 1E CMP %>0,R30 ; TRAP 18: skip a run of chars whose class matches mask B. Forward? F7CC: E6 04 JNZ $F7D2 ; not equal: -> F7D2 F7CE: 8E F5 DA CALL $F5DA ; call F5DA F7D1: 0A RETS ; return F7D2: D2 18 DEC R24 ; backward: step F7D4: 7D 21 18 CMP %>21,R24 ; start-of-text sentinel $21? F7D7: E2 03 JEQ $F7DC ; equal: -> F7DC F7D9: F6 TRAP 9 ; TRAP 9 F7DA: 66 F6 BTJO B,A,$F7D2 ; class matches: continue F7DC: D3 18 INC R24 ; back to the last match F7DE: EE TRAP 17 ; TRAP 17 F7DF: 0A RETS ; return F7E0: 7D 00 1E CMP %>0,R30 ; TRAP 11: advance the cursor in the scan direction F7E3: E6 03 JNZ $F7E8 ; not equal: -> F7E8 F7E5: D3 18 INC R24 ; forward: +1 F7E7: 0A RETS ; return F7E8: D2 18 DEC R24 ; backward: -1 F7EA: 0A RETS ; return F7EB: 7D 00 1E CMP %>0,R30 ; TRAP 19: undo one cursor step F7EE: E6 03 JNZ $F7F3 ; not equal: -> F7F3 F7F0: D2 18 DEC R24 ; decrement R24 F7F2: 0A RETS ; return F7F3: D3 18 INC R24 ; increment R24 F7F5: 0A RETS ; return ; TABLE Letter class flags A-Z (TRAP 9). $80 vowel, $40 voiced, $20 sibilant, $10 T/S/R/D/L/Z/N/J, $08 consonant, $04 front vowel, $02 O/U, $01 E F7F6: 80 FCB $80 ; A: vowel(#) F7F7: 48 FCB $48 ; B: voiced cons.(.), consonant(^) F7F8: 68 FCB $68 ; C: voiced cons.(.), sibilant(&), consonant(^) F7F9: 58 FCB $58 ; D: voiced cons.(.), T/S/R/D/L/Z/N/J(@), consonant(^) F7FA: 85 FCB $85 ; E: vowel(#), front vowel(+), E (suffix %) F7FB: 08 FCB $08 ; F: consonant(^) F7FC: 68 FCB $68 ; G: voiced cons.(.), sibilant(&), consonant(^) F7FD: 28 FCB $28 ; H: sibilant(&), consonant(^) F7FE: 84 FCB $84 ; I: vowel(#), front vowel(+) F7FF: 78 FCB $78 ; J: voiced cons.(.), sibilant(&), T/S/R/D/L/Z/N/J(@), consonant(^) F800: 08 FCB $08 ; K: consonant(^) F801: 58 FCB $58 ; L: voiced cons.(.), T/S/R/D/L/Z/N/J(@), consonant(^) F802: 48 FCB $48 ; M: voiced cons.(.), consonant(^) F803: 58 FCB $58 ; N: voiced cons.(.), T/S/R/D/L/Z/N/J(@), consonant(^) F804: 82 FCB $82 ; O: vowel(#), O/U($) F805: 08 FCB $08 ; P: consonant(^) F806: 08 FCB $08 ; Q: consonant(^) F807: 58 FCB $58 ; R: voiced cons.(.), T/S/R/D/L/Z/N/J(@), consonant(^) F808: 38 FCB $38 ; S: sibilant(&), T/S/R/D/L/Z/N/J(@), consonant(^) F809: 18 FCB $18 ; T: T/S/R/D/L/Z/N/J(@), consonant(^) F80A: 82 FCB $82 ; U: vowel(#), O/U($) F80B: 48 FCB $48 ; V: voiced cons.(.), consonant(^) F80C: 48 FCB $48 ; W: voiced cons.(.), consonant(^) F80D: 28 FCB $28 ; X: sibilant(&), consonant(^) F80E: 84 FCB $84 ; Y: vowel(#), front vowel(+) F80F: 78 FCB $78 ; Z: voiced cons.(.), sibilant(&), T/S/R/D/L/Z/N/J(@), consonant(^) F810: FF FCB $FF ; sentinel (bit 7 set) ends the backward left-context scan of the first punctuation rule ; TABLE Letter-to-sound rules. Pointer table at FF79 (punct, A-Z). Per rule: left ctx | match (first byte bit 6, last bit 7) | right ctx | phonemes (first bit 6, last bit 7) F811: C0 FCB $C0 ; match: ' ' F812: C1 FCB $C1 ; phoneme PA2 ; RULE [-] = PA1 F813: CD FCB $CD ; match: '-' F814: C0 FCB $C0 ; phoneme PA1 ; RULE .['S] = ZZ F815: 0A FCB $0A ; left context: . (voiced cons.) F816: 47 FCB $47 ; match: ''' (first) F817: B3 FCB $B3 ; match: 'S' (last) F818: EB FCB $EB ; phoneme ZZ ; RULE #:.E['S] = ZZ F819: 09 FCB $09 ; left context: # (1+ vowels) F81A: 10 FCB $10 ; left context: : (0+ consonants) F81B: 0A FCB $0A ; left context: . (voiced cons.) F81C: 25 FCB $25 ; left context: 'E' F81D: 47 FCB $47 ; match: ''' (first) F81E: B3 FCB $B3 ; match: 'S' (last) F81F: EB FCB $EB ; phoneme ZZ ; RULE #['S] = ZZ F820: 09 FCB $09 ; left context: # (1+ vowels) F821: 47 FCB $47 ; match: ''' (first) F822: B3 FCB $B3 ; match: 'S' (last) F823: EB FCB $EB ; phoneme ZZ ; RULE ['S] = SS F824: 47 FCB $47 ; match: ''' (first) F825: B3 FCB $B3 ; match: 'S' (last) F826: F7 FCB $F7 ; phoneme SS ; RULE ['] = (nothing) F827: C7 FCB $C7 ; match: ''' F828: FF FCB $FF ; phonemes: none ; RULE [,] = PA4 F829: CC FCB $CC ; match: ',' F82A: C3 FCB $C3 ; phoneme PA4 ; RULE [] = PA5 PA5 F82B: FF FCB $FF ; match: any char (default rule) F82C: 44 FCB $44 ; phoneme PA5 F82D: 84 FCB $84 ; phoneme PA5 (end) ; NOTE The rules from here to F83D are unreachable: the default rule at F82B matches any character first F82E: DF FCB $DF ; match: '?' F82F: 44 FCB $44 ; phoneme PA5 F830: 84 FCB $84 ; phoneme PA5 (end) ; RULE [;] = PA4 F831: DB FCB $DB ; match: ';' F832: C3 FCB $C3 ; phoneme PA4 ; RULE ["] = (nothing) F833: C2 FCB $C2 ; match: '"' F834: FF FCB $FF ; phonemes: none ; RULE [!] = PA5 PA5 F835: C1 FCB $C1 ; match: '!' F836: 44 FCB $44 ; phoneme PA5 F837: 84 FCB $84 ; phoneme PA5 (end) ; RULE [(] = PA5 F838: C8 FCB $C8 ; match: '(' F839: C4 FCB $C4 ; phoneme PA5 ; RULE [)] = PA5 F83A: C9 FCB $C9 ; match: ')' F83B: C4 FCB $C4 ; phoneme PA5 ; RULE [:] = PA5 F83C: DA FCB $DA ; match: ':' F83D: C4 FCB $C4 ; phoneme PA5 ; RULE _[A]_ = EY F83E: 13 FCB $13 ; left context: _ (non-letter / word boundary) F83F: FF FCB $FF ; match: empty (key letter only) F840: 13 FCB $13 ; right context: _ (non-letter / word boundary) F841: D4 FCB $D4 ; phoneme EY ; RULE [A]_ = AX F842: FF FCB $FF ; match: empty (key letter only) F843: 13 FCB $13 ; right context: _ (non-letter / word boundary) F844: CF FCB $CF ; phoneme AX ; RULE _[ARE]_ = AR F845: 13 FCB $13 ; left context: _ (non-letter / word boundary) F846: 72 FCB $72 ; match: 'R' (first) F847: A5 FCB $A5 ; match: 'E' (last) F848: 13 FCB $13 ; right context: _ (non-letter / word boundary) F849: FB FCB $FB ; phoneme AR ; RULE _[AR]O = AX RR2 F84A: 13 FCB $13 ; left context: _ (non-letter / word boundary) F84B: F2 FCB $F2 ; match: 'R' F84C: 2F FCB $2F ; right context: 'O' F84D: 4F FCB $4F ; phoneme AX F84E: A7 FCB $A7 ; phoneme RR2 (end) ; RULE _[A]^R = AX F84F: 13 FCB $13 ; left context: _ (non-letter / word boundary) F850: FF FCB $FF ; match: empty (key letter only) F851: 0E FCB $0E ; right context: ^ (1 consonant) F852: 32 FCB $32 ; right context: 'R' F853: CF FCB $CF ; phoneme AX ; RULE [AR]# = XR F854: F2 FCB $F2 ; match: 'R' F855: 09 FCB $09 ; right context: # (1+ vowels) F856: EF FCB $EF ; phoneme XR ; RULE _:[ANY] = EH NN1 IY F857: 13 FCB $13 ; left context: _ (non-letter / word boundary) F858: 10 FCB $10 ; left context: : (0+ consonants) F859: 6E FCB $6E ; match: 'N' (first) F85A: B9 FCB $B9 ; match: 'Y' (last) F85B: 47 FCB $47 ; phoneme EH F85C: 0B FCB $0B ; phoneme NN1 F85D: 93 FCB $93 ; phoneme IY (end) ; RULE [AGAIN] = AX PA2 GG2 EH EH NN1 F85E: 67 FCB $67 ; match: 'G' (first) F85F: 21 FCB $21 ; match: 'A' F860: 29 FCB $29 ; match: 'I' F861: AE FCB $AE ; match: 'N' (last) F862: 4F FCB $4F ; phoneme AX F863: 01 FCB $01 ; phoneme PA2 F864: 3D FCB $3D ; phoneme GG2 F865: 07 FCB $07 ; phoneme EH F866: 07 FCB $07 ; phoneme EH F867: 8B FCB $8B ; phoneme NN1 (end) ; RULE _[A]^# = AX F868: 13 FCB $13 ; left context: _ (non-letter / word boundary) F869: FF FCB $FF ; match: empty (key letter only) F86A: 0E FCB $0E ; right context: ^ (1 consonant) F86B: 09 FCB $09 ; right context: # (1+ vowels) F86C: CF FCB $CF ; phoneme AX ; RULE ^[AS]# = EY SS F86D: 0E FCB $0E ; left context: ^ (1 consonant) F86E: F3 FCB $F3 ; match: 'S' F86F: 09 FCB $09 ; right context: # (1+ vowels) F870: 54 FCB $54 ; phoneme EY F871: B7 FCB $B7 ; phoneme SS (end) ; RULE [A]WA = AX F872: FF FCB $FF ; match: empty (key letter only) F873: 37 FCB $37 ; right context: 'W' F874: 21 FCB $21 ; right context: 'A' F875: CF FCB $CF ; phoneme AX ; RULE [AW] = AO AO F876: F7 FCB $F7 ; match: 'W' F877: 57 FCB $57 ; phoneme AO F878: 97 FCB $97 ; phoneme AO (end) ; RULE [A]^+# = EY F879: FF FCB $FF ; match: empty (key letter only) F87A: 0E FCB $0E ; right context: ^ (1 consonant) F87B: 0F FCB $0F ; right context: + (front vowel E I Y) F87C: 09 FCB $09 ; right context: # (1+ vowels) F87D: D4 FCB $D4 ; phoneme EY ; RULE #:[AG]E = IH PA2 JH F87E: 09 FCB $09 ; left context: # (1+ vowels) F87F: 10 FCB $10 ; left context: : (0+ consonants) F880: E7 FCB $E7 ; match: 'G' F881: 25 FCB $25 ; right context: 'E' F882: 4C FCB $4C ; phoneme IH F883: 01 FCB $01 ; phoneme PA2 F884: 8A FCB $8A ; phoneme JH (end) ; RULE [A]^% = EY F885: FF FCB $FF ; match: empty (key letter only) F886: 0E FCB $0E ; right context: ^ (1 consonant) F887: 0B FCB $0B ; right context: % (suffix E/ER/ES/ED/ELY/ING) F888: D4 FCB $D4 ; phoneme EY ; RULE [A]^+:# = AE F889: FF FCB $FF ; match: empty (key letter only) F88A: 0E FCB $0E ; right context: ^ (1 consonant) F88B: 0F FCB $0F ; right context: + (front vowel E I Y) F88C: 10 FCB $10 ; right context: : (0+ consonants) F88D: 09 FCB $09 ; right context: # (1+ vowels) F88E: DA FCB $DA ; phoneme AE ; RULE [ARR] = AE RR2 F88F: 72 FCB $72 ; match: 'R' (first) F890: B2 FCB $B2 ; match: 'R' (last) F891: 5A FCB $5A ; phoneme AE F892: A7 FCB $A7 ; phoneme RR2 (end) ; RULE _:[AR]_ = AR F893: 13 FCB $13 ; left context: _ (non-letter / word boundary) F894: 10 FCB $10 ; left context: : (0+ consonants) F895: F2 FCB $F2 ; match: 'R' F896: 13 FCB $13 ; right context: _ (non-letter / word boundary) F897: FB FCB $FB ; phoneme AR ; RULE [AR]_ = ER1 F898: F2 FCB $F2 ; match: 'R' F899: 13 FCB $13 ; right context: _ (non-letter / word boundary) F89A: F3 FCB $F3 ; phoneme ER1 ; RULE [AR] = AR F89B: F2 FCB $F2 ; match: 'R' F89C: FB FCB $FB ; phoneme AR ; RULE [AIR] = EH XR F89D: 69 FCB $69 ; match: 'I' (first) F89E: B2 FCB $B2 ; match: 'R' (last) F89F: 47 FCB $47 ; phoneme EH F8A0: AF FCB $AF ; phoneme XR (end) ; RULE [AI] = EY F8A1: E9 FCB $E9 ; match: 'I' F8A2: D4 FCB $D4 ; phoneme EY ; RULE [AY] = EY F8A3: F9 FCB $F9 ; match: 'Y' F8A4: D4 FCB $D4 ; phoneme EY ; RULE [AU] = AO F8A5: F5 FCB $F5 ; match: 'U' F8A6: D7 FCB $D7 ; phoneme AO ; RULE #:[AL]_ = EL F8A7: 09 FCB $09 ; left context: # (1+ vowels) F8A8: 10 FCB $10 ; left context: : (0+ consonants) F8A9: EC FCB $EC ; match: 'L' F8AA: 13 FCB $13 ; right context: _ (non-letter / word boundary) F8AB: FE FCB $FE ; phoneme EL ; RULE #:[ALS]_ = EL ZZ F8AC: 09 FCB $09 ; left context: # (1+ vowels) F8AD: 10 FCB $10 ; left context: : (0+ consonants) F8AE: 6C FCB $6C ; match: 'L' (first) F8AF: B3 FCB $B3 ; match: 'S' (last) F8B0: 13 FCB $13 ; right context: _ (non-letter / word boundary) F8B1: 7E FCB $7E ; phoneme EL F8B2: AB FCB $AB ; phoneme ZZ (end) ; RULE [ALK] = AO PA3 KK2 F8B3: 6C FCB $6C ; match: 'L' (first) F8B4: AB FCB $AB ; match: 'K' (last) F8B5: 57 FCB $57 ; phoneme AO F8B6: 02 FCB $02 ; phoneme PA3 F8B7: A9 FCB $A9 ; phoneme KK2 (end) ; RULE [AL]^ = AO LL F8B8: EC FCB $EC ; match: 'L' F8B9: 0E FCB $0E ; right context: ^ (1 consonant) F8BA: 57 FCB $57 ; phoneme AO F8BB: AD FCB $AD ; phoneme LL (end) ; RULE _:[ABLE] = EY PA2 BB2 EL F8BC: 13 FCB $13 ; left context: _ (non-letter / word boundary) F8BD: 10 FCB $10 ; left context: : (0+ consonants) F8BE: 62 FCB $62 ; match: 'B' (first) F8BF: 2C FCB $2C ; match: 'L' F8C0: A5 FCB $A5 ; match: 'E' (last) F8C1: 54 FCB $54 ; phoneme EY F8C2: 01 FCB $01 ; phoneme PA2 F8C3: 3F FCB $3F ; phoneme BB2 F8C4: BE FCB $BE ; phoneme EL (end) ; RULE [ANG]+ = EY NN1 PA2 JH F8C5: 6E FCB $6E ; match: 'N' (first) F8C6: A7 FCB $A7 ; match: 'G' (last) F8C7: 0F FCB $0F ; right context: + (front vowel E I Y) F8C8: 54 FCB $54 ; phoneme EY F8C9: 0B FCB $0B ; phoneme NN1 F8CA: 01 FCB $01 ; phoneme PA2 F8CB: 8A FCB $8A ; phoneme JH (end) ; RULE [A] = AE F8CC: FF FCB $FF ; match: empty (key letter only) F8CD: DA FCB $DA ; phoneme AE ; RULE _[B]_ = PA2 BB2 IY F8CE: 13 FCB $13 ; left context: _ (non-letter / word boundary) F8CF: FF FCB $FF ; match: empty (key letter only) F8D0: 13 FCB $13 ; right context: _ (non-letter / word boundary) F8D1: 41 FCB $41 ; phoneme PA2 F8D2: 3F FCB $3F ; phoneme BB2 F8D3: 93 FCB $93 ; phoneme IY (end) ; RULE _[BE]^# = PA2 BB2 IY F8D4: 13 FCB $13 ; left context: _ (non-letter / word boundary) F8D5: E5 FCB $E5 ; match: 'E' F8D6: 0E FCB $0E ; right context: ^ (1 consonant) F8D7: 09 FCB $09 ; right context: # (1+ vowels) F8D8: 41 FCB $41 ; phoneme PA2 F8D9: 3F FCB $3F ; phoneme BB2 F8DA: 93 FCB $93 ; phoneme IY (end) ; RULE _[BEEN]_ = BB2 IH NN1 F8DB: 13 FCB $13 ; left context: _ (non-letter / word boundary) F8DC: 65 FCB $65 ; match: 'E' (first) F8DD: 25 FCB $25 ; match: 'E' F8DE: AE FCB $AE ; match: 'N' (last) F8DF: 13 FCB $13 ; right context: _ (non-letter / word boundary) F8E0: 7F FCB $7F ; phoneme BB2 F8E1: 0C FCB $0C ; phoneme IH F8E2: 8B FCB $8B ; phoneme NN1 (end) ; RULE [BEING] = PA2 BB2 IY IH NG F8E3: 65 FCB $65 ; match: 'E' (first) F8E4: 29 FCB $29 ; match: 'I' F8E5: 2E FCB $2E ; match: 'N' F8E6: A7 FCB $A7 ; match: 'G' (last) F8E7: 41 FCB $41 ; phoneme PA2 F8E8: 3F FCB $3F ; phoneme BB2 F8E9: 13 FCB $13 ; phoneme IY F8EA: 0C FCB $0C ; phoneme IH F8EB: AC FCB $AC ; phoneme NG (end) ; RULE _[BOTH]_ = PA2 BB2 OW TH F8EC: 13 FCB $13 ; left context: _ (non-letter / word boundary) F8ED: 6F FCB $6F ; match: 'O' (first) F8EE: 34 FCB $34 ; match: 'T' F8EF: A8 FCB $A8 ; match: 'H' (last) F8F0: 13 FCB $13 ; right context: _ (non-letter / word boundary) F8F1: 41 FCB $41 ; phoneme PA2 F8F2: 3F FCB $3F ; phoneme BB2 F8F3: 35 FCB $35 ; phoneme OW F8F4: 9D FCB $9D ; phoneme TH (end) ; RULE _[BUS]# = PA2 BB2 IH ZZ F8F5: 13 FCB $13 ; left context: _ (non-letter / word boundary) F8F6: 75 FCB $75 ; match: 'U' (first) F8F7: B3 FCB $B3 ; match: 'S' (last) F8F8: 09 FCB $09 ; right context: # (1+ vowels) F8F9: 41 FCB $41 ; phoneme PA2 F8FA: 3F FCB $3F ; phoneme BB2 F8FB: 0C FCB $0C ; phoneme IH F8FC: AB FCB $AB ; phoneme ZZ (end) ; RULE [BUIL] = PA2 BB2 IH IH LL F8FD: 75 FCB $75 ; match: 'U' (first) F8FE: 29 FCB $29 ; match: 'I' F8FF: AC FCB $AC ; match: 'L' (last) F900: 41 FCB $41 ; phoneme PA2 F901: 3F FCB $3F ; phoneme BB2 F902: 0C FCB $0C ; phoneme IH F903: 0C FCB $0C ; phoneme IH F904: AD FCB $AD ; phoneme LL (end) ; RULE [B]B = (nothing) F905: FF FCB $FF ; match: empty (key letter only) F906: 22 FCB $22 ; right context: 'B' F907: FF FCB $FF ; phonemes: none ; RULE [B]_ = PA2 BB1 F908: FF FCB $FF ; match: empty (key letter only) F909: 13 FCB $13 ; right context: _ (non-letter / word boundary) F90A: 41 FCB $41 ; phoneme PA2 F90B: 9C FCB $9C ; phoneme BB1 (end) ; RULE [B]S = PA2 BB1 F90C: FF FCB $FF ; match: empty (key letter only) F90D: 33 FCB $33 ; right context: 'S' F90E: 41 FCB $41 ; phoneme PA2 F90F: 9C FCB $9C ; phoneme BB1 (end) ; RULE _[B]^ = PA2 BB1 F910: 13 FCB $13 ; left context: _ (non-letter / word boundary) F911: FF FCB $FF ; match: empty (key letter only) F912: 0E FCB $0E ; right context: ^ (1 consonant) F913: 41 FCB $41 ; phoneme PA2 F914: 9C FCB $9C ; phoneme BB1 (end) ; RULE [B] = PA2 BB2 F915: FF FCB $FF ; match: empty (key letter only) F916: 41 FCB $41 ; phoneme PA2 F917: BF FCB $BF ; phoneme BB2 (end) ; RULE _[C]_ = SS SS IY F918: 13 FCB $13 ; left context: _ (non-letter / word boundary) F919: FF FCB $FF ; match: empty (key letter only) F91A: 13 FCB $13 ; right context: _ (non-letter / word boundary) F91B: 77 FCB $77 ; phoneme SS F91C: 37 FCB $37 ; phoneme SS F91D: 93 FCB $93 ; phoneme IY (end) ; RULE _[CH]^ = PA3 KK1 F91E: 13 FCB $13 ; left context: _ (non-letter / word boundary) F91F: E8 FCB $E8 ; match: 'H' F920: 0E FCB $0E ; right context: ^ (1 consonant) F921: 42 FCB $42 ; phoneme PA3 F922: AA FCB $AA ; phoneme KK1 (end) ; RULE ^E[CH] = PA3 KK1 F923: 0E FCB $0E ; left context: ^ (1 consonant) F924: 25 FCB $25 ; left context: 'E' F925: E8 FCB $E8 ; match: 'H' F926: 42 FCB $42 ; phoneme PA3 F927: AA FCB $AA ; phoneme KK1 (end) ; RULE [CH] = PA3 CH F928: E8 FCB $E8 ; match: 'H' F929: 42 FCB $42 ; phoneme PA3 F92A: B2 FCB $B2 ; phoneme CH (end) ; RULE S[CI]# = SS SS AY F92B: 33 FCB $33 ; left context: 'S' F92C: E9 FCB $E9 ; match: 'I' F92D: 09 FCB $09 ; right context: # (1+ vowels) F92E: 77 FCB $77 ; phoneme SS F92F: 37 FCB $37 ; phoneme SS F930: 86 FCB $86 ; phoneme AY (end) ; RULE [CI]# = SH F931: E9 FCB $E9 ; match: 'I' F932: 09 FCB $09 ; right context: # (1+ vowels) F933: E5 FCB $E5 ; phoneme SH ; RULE [C]+ = SS SS F934: FF FCB $FF ; match: empty (key letter only) F935: 0F FCB $0F ; right context: + (front vowel E I Y) F936: 77 FCB $77 ; phoneme SS F937: B7 FCB $B7 ; phoneme SS (end) ; RULE C[C] = (nothing) F938: 23 FCB $23 ; left context: 'C' F939: FF FCB $FF ; match: empty (key letter only) F93A: FF FCB $FF ; phonemes: none ; RULE [CK]# = PA3 KK1 F93B: EB FCB $EB ; match: 'K' F93C: 09 FCB $09 ; right context: # (1+ vowels) F93D: 42 FCB $42 ; phoneme PA3 F93E: AA FCB $AA ; phoneme KK1 (end) ; RULE [CK] = PA3 KK2 F93F: EB FCB $EB ; match: 'K' F940: 42 FCB $42 ; phoneme PA3 F941: A9 FCB $A9 ; phoneme KK2 (end) ; RULE [C]_ = PA3 KK2 F942: FF FCB $FF ; match: empty (key letter only) F943: 13 FCB $13 ; right context: _ (non-letter / word boundary) F944: 42 FCB $42 ; phoneme PA3 F945: A9 FCB $A9 ; phoneme KK2 (end) ; RULE [C]S = PA3 KK2 F946: FF FCB $FF ; match: empty (key letter only) F947: 33 FCB $33 ; right context: 'S' F948: 42 FCB $42 ; phoneme PA3 F949: A9 FCB $A9 ; phoneme KK2 (end) ; RULE [C]$ = PA3 KK3 F94A: FF FCB $FF ; match: empty (key letter only) F94B: 12 FCB $12 ; right context: $ (O or U) F94C: 42 FCB $42 ; phoneme PA3 F94D: 88 FCB $88 ; phoneme KK3 (end) ; RULE [C] = PA3 KK1 F94E: FF FCB $FF ; match: empty (key letter only) F94F: 42 FCB $42 ; phoneme PA3 F950: AA FCB $AA ; phoneme KK1 (end) ; RULE _[D]_ = PA2 DD2 IY F951: 13 FCB $13 ; left context: _ (non-letter / word boundary) F952: FF FCB $FF ; match: empty (key letter only) F953: 13 FCB $13 ; right context: _ (non-letter / word boundary) F954: 41 FCB $41 ; phoneme PA2 F955: 21 FCB $21 ; phoneme DD2 F956: 93 FCB $93 ; phoneme IY (end) ; RULE [D]D = (nothing) F957: FF FCB $FF ; match: empty (key letter only) F958: 24 FCB $24 ; right context: 'D' F959: FF FCB $FF ; phonemes: none ; RULE #:[DED]_ = PA2 DD2 IH PA2 DD1 F95A: 09 FCB $09 ; left context: # (1+ vowels) F95B: 10 FCB $10 ; left context: : (0+ consonants) F95C: 65 FCB $65 ; match: 'E' (first) F95D: A4 FCB $A4 ; match: 'D' (last) F95E: 13 FCB $13 ; right context: _ (non-letter / word boundary) F95F: 41 FCB $41 ; phoneme PA2 F960: 21 FCB $21 ; phoneme DD2 F961: 0C FCB $0C ; phoneme IH F962: 01 FCB $01 ; phoneme PA2 F963: 95 FCB $95 ; phoneme DD1 (end) ; RULE .E[D]_ = PA2 DD1 F964: 0A FCB $0A ; left context: . (voiced cons.) F965: 25 FCB $25 ; left context: 'E' F966: FF FCB $FF ; match: empty (key letter only) F967: 13 FCB $13 ; right context: _ (non-letter / word boundary) F968: 41 FCB $41 ; phoneme PA2 F969: 95 FCB $95 ; phoneme DD1 (end) ; RULE #*E[D]_ = PA3 TT2 F96A: 09 FCB $09 ; left context: # (1+ vowels) F96B: 11 FCB $11 ; left context: * (1+ consonants) F96C: 25 FCB $25 ; left context: 'E' F96D: FF FCB $FF ; match: empty (key letter only) F96E: 13 FCB $13 ; right context: _ (non-letter / word boundary) F96F: 42 FCB $42 ; phoneme PA3 F970: 8D FCB $8D ; phoneme TT2 (end) ; RULE _[DE]^# = PA2 DD2 IH F971: 13 FCB $13 ; left context: _ (non-letter / word boundary) F972: E5 FCB $E5 ; match: 'E' F973: 0E FCB $0E ; right context: ^ (1 consonant) F974: 09 FCB $09 ; right context: # (1+ vowels) F975: 41 FCB $41 ; phoneme PA2 F976: 21 FCB $21 ; phoneme DD2 F977: 8C FCB $8C ; phoneme IH (end) ; RULE [DO]_ = PA2 DD2 UW2 F978: EF FCB $EF ; match: 'O' F979: 13 FCB $13 ; right context: _ (non-letter / word boundary) F97A: 41 FCB $41 ; phoneme PA2 F97B: 21 FCB $21 ; phoneme DD2 F97C: 9F FCB $9F ; phoneme UW2 (end) ; RULE [DOES] = PA2 DD2 AX ZZ F97D: 6F FCB $6F ; match: 'O' (first) F97E: 25 FCB $25 ; match: 'E' F97F: B3 FCB $B3 ; match: 'S' (last) F980: 41 FCB $41 ; phoneme PA2 F981: 21 FCB $21 ; phoneme DD2 F982: 0F FCB $0F ; phoneme AX F983: AB FCB $AB ; phoneme ZZ (end) ; RULE [DOING] = PA2 DD2 UW2 IH NG F984: 6F FCB $6F ; match: 'O' (first) F985: 29 FCB $29 ; match: 'I' F986: 2E FCB $2E ; match: 'N' F987: A7 FCB $A7 ; match: 'G' (last) F988: 41 FCB $41 ; phoneme PA2 F989: 21 FCB $21 ; phoneme DD2 F98A: 1F FCB $1F ; phoneme UW2 F98B: 0C FCB $0C ; phoneme IH F98C: AC FCB $AC ; phoneme NG (end) ; RULE #[DU]:A = PA2 JH UW1 F98D: 09 FCB $09 ; left context: # (1+ vowels) F98E: F5 FCB $F5 ; match: 'U' F98F: 10 FCB $10 ; right context: : (0+ consonants) F990: 21 FCB $21 ; right context: 'A' F991: 41 FCB $41 ; phoneme PA2 F992: 0A FCB $0A ; phoneme JH F993: 96 FCB $96 ; phoneme UW1 (end) ; RULE [DG] = PA2 JH F994: E7 FCB $E7 ; match: 'G' F995: 41 FCB $41 ; phoneme PA2 F996: 8A FCB $8A ; phoneme JH (end) ; RULE [DJ] = PA2 JH F997: EA FCB $EA ; match: 'J' F998: 41 FCB $41 ; phoneme PA2 F999: 8A FCB $8A ; phoneme JH (end) ; RULE [D]_ = PA2 DD1 F99A: FF FCB $FF ; match: empty (key letter only) F99B: 13 FCB $13 ; right context: _ (non-letter / word boundary) F99C: 41 FCB $41 ; phoneme PA2 F99D: 95 FCB $95 ; phoneme DD1 (end) ; RULE [D]S = PA2 DD1 F99E: FF FCB $FF ; match: empty (key letter only) F99F: 33 FCB $33 ; right context: 'S' F9A0: 41 FCB $41 ; phoneme PA2 F9A1: 95 FCB $95 ; phoneme DD1 (end) ; RULE [D] = PA2 DD2 F9A2: FF FCB $FF ; match: empty (key letter only) F9A3: 41 FCB $41 ; phoneme PA2 F9A4: A1 FCB $A1 ; phoneme DD2 (end) ; RULE _[E]_ = IY F9A5: 13 FCB $13 ; left context: _ (non-letter / word boundary) F9A6: FF FCB $FF ; match: empty (key letter only) F9A7: 13 FCB $13 ; right context: _ (non-letter / word boundary) F9A8: D3 FCB $D3 ; phoneme IY ; RULE #:[E]_ = (nothing) F9A9: 09 FCB $09 ; left context: # (1+ vowels) F9AA: 10 FCB $10 ; left context: : (0+ consonants) F9AB: FF FCB $FF ; match: empty (key letter only) F9AC: 13 FCB $13 ; right context: _ (non-letter / word boundary) F9AD: FF FCB $FF ; phonemes: none ; RULE '*[E]_ = (nothing) F9AE: 07 FCB $07 ; left context: ' F9AF: 11 FCB $11 ; left context: * (1+ consonants) F9B0: FF FCB $FF ; match: empty (key letter only) F9B1: 13 FCB $13 ; right context: _ (non-letter / word boundary) F9B2: FF FCB $FF ; phonemes: none ; RULE _:[E]_ = IY F9B3: 13 FCB $13 ; left context: _ (non-letter / word boundary) F9B4: 10 FCB $10 ; left context: : (0+ consonants) F9B5: FF FCB $FF ; match: empty (key letter only) F9B6: 13 FCB $13 ; right context: _ (non-letter / word boundary) F9B7: D3 FCB $D3 ; phoneme IY ; RULE #[ED]_ = PA2 DD1 F9B8: 09 FCB $09 ; left context: # (1+ vowels) F9B9: E4 FCB $E4 ; match: 'D' F9BA: 13 FCB $13 ; right context: _ (non-letter / word boundary) F9BB: 41 FCB $41 ; phoneme PA2 F9BC: 95 FCB $95 ; phoneme DD1 (end) ; RULE #:[E]D_ = (nothing) F9BD: 09 FCB $09 ; left context: # (1+ vowels) F9BE: 10 FCB $10 ; left context: : (0+ consonants) F9BF: FF FCB $FF ; match: empty (key letter only) F9C0: 24 FCB $24 ; right context: 'D' F9C1: 13 FCB $13 ; right context: _ (non-letter / word boundary) F9C2: FF FCB $FF ; phonemes: none ; RULE [EV]ER = EH VV F9C3: F6 FCB $F6 ; match: 'V' F9C4: 25 FCB $25 ; right context: 'E' F9C5: 32 FCB $32 ; right context: 'R' F9C6: 47 FCB $47 ; phoneme EH F9C7: A3 FCB $A3 ; phoneme VV (end) ; RULE [ERI]# = YR IY F9C8: 72 FCB $72 ; match: 'R' (first) F9C9: A9 FCB $A9 ; match: 'I' (last) F9CA: 09 FCB $09 ; right context: # (1+ vowels) F9CB: 7C FCB $7C ; phoneme YR F9CC: 93 FCB $93 ; phoneme IY (end) ; RULE #:[ER]# = ER1 F9CD: 09 FCB $09 ; left context: # (1+ vowels) F9CE: 10 FCB $10 ; left context: : (0+ consonants) F9CF: F2 FCB $F2 ; match: 'R' F9D0: 09 FCB $09 ; right context: # (1+ vowels) F9D1: F3 FCB $F3 ; phoneme ER1 ; RULE [ER]# = EH XR F9D2: F2 FCB $F2 ; match: 'R' F9D3: 09 FCB $09 ; right context: # (1+ vowels) F9D4: 47 FCB $47 ; phoneme EH F9D5: AF FCB $AF ; phoneme XR (end) ; RULE [E]^% = IY F9D6: FF FCB $FF ; match: empty (key letter only) F9D7: 0E FCB $0E ; right context: ^ (1 consonant) F9D8: 0B FCB $0B ; right context: % (suffix E/ER/ES/ED/ELY/ING) F9D9: D3 FCB $D3 ; phoneme IY ; RULE [ERI] = EH EH RR1 IH F9DA: 72 FCB $72 ; match: 'R' (first) F9DB: A9 FCB $A9 ; match: 'I' (last) F9DC: 47 FCB $47 ; phoneme EH F9DD: 07 FCB $07 ; phoneme EH F9DE: 0E FCB $0E ; phoneme RR1 F9DF: 8C FCB $8C ; phoneme IH (end) ; RULE [ER] = ER1 F9E0: F2 FCB $F2 ; match: 'R' F9E1: F3 FCB $F3 ; phoneme ER1 ; RULE _[EVEN]_ = IY VV IH NN1 F9E2: 13 FCB $13 ; left context: _ (non-letter / word boundary) F9E3: 76 FCB $76 ; match: 'V' (first) F9E4: 25 FCB $25 ; match: 'E' F9E5: AE FCB $AE ; match: 'N' (last) F9E6: 13 FCB $13 ; right context: _ (non-letter / word boundary) F9E7: 53 FCB $53 ; phoneme IY F9E8: 23 FCB $23 ; phoneme VV F9E9: 0C FCB $0C ; phoneme IH F9EA: 8B FCB $8B ; phoneme NN1 (end) ; RULE _[EVEN] = IY VV EH EH NN1 F9EB: 13 FCB $13 ; left context: _ (non-letter / word boundary) F9EC: 76 FCB $76 ; match: 'V' (first) F9ED: 25 FCB $25 ; match: 'E' F9EE: AE FCB $AE ; match: 'N' (last) F9EF: 53 FCB $53 ; phoneme IY F9F0: 23 FCB $23 ; phoneme VV F9F1: 07 FCB $07 ; phoneme EH F9F2: 07 FCB $07 ; phoneme EH F9F3: 8B FCB $8B ; phoneme NN1 (end) ; RULE #:[E]W = (nothing) F9F4: 09 FCB $09 ; left context: # (1+ vowels) F9F5: 10 FCB $10 ; left context: : (0+ consonants) F9F6: FF FCB $FF ; match: empty (key letter only) F9F7: 37 FCB $37 ; right context: 'W' F9F8: FF FCB $FF ; phonemes: none ; RULE @[EW] = UW2 F9F9: 0D FCB $0D ; left context: @ (T S R D L Z N J) F9FA: F7 FCB $F7 ; match: 'W' F9FB: DF FCB $DF ; phoneme UW2 ; RULE [EW] = YY1 UW2 F9FC: F7 FCB $F7 ; match: 'W' F9FD: 71 FCB $71 ; phoneme YY1 F9FE: 9F FCB $9F ; phoneme UW2 (end) ; RULE [E]O = IY F9FF: FF FCB $FF ; match: empty (key letter only) FA00: 2F FCB $2F ; right context: 'O' FA01: D3 FCB $D3 ; phoneme IY ; RULE #:&[ES]_ = IH ZZ FA02: 09 FCB $09 ; left context: # (1+ vowels) FA03: 10 FCB $10 ; left context: : (0+ consonants) FA04: 0C FCB $0C ; left context: & (sibilant) FA05: F3 FCB $F3 ; match: 'S' FA06: 13 FCB $13 ; right context: _ (non-letter / word boundary) FA07: 4C FCB $4C ; phoneme IH FA08: AB FCB $AB ; phoneme ZZ (end) ; RULE #:[E]S_ = (nothing) FA09: 09 FCB $09 ; left context: # (1+ vowels) FA0A: 10 FCB $10 ; left context: : (0+ consonants) FA0B: FF FCB $FF ; match: empty (key letter only) FA0C: 33 FCB $33 ; right context: 'S' FA0D: 13 FCB $13 ; right context: _ (non-letter / word boundary) FA0E: FF FCB $FF ; phonemes: none ; RULE #:[ELY]_ = LL IY FA0F: 09 FCB $09 ; left context: # (1+ vowels) FA10: 10 FCB $10 ; left context: : (0+ consonants) FA11: 6C FCB $6C ; match: 'L' (first) FA12: B9 FCB $B9 ; match: 'Y' (last) FA13: 13 FCB $13 ; right context: _ (non-letter / word boundary) FA14: 6D FCB $6D ; phoneme LL FA15: 93 FCB $93 ; phoneme IY (end) ; RULE #:[EMENT] = MM IH NN1 PA3 TT2 FA16: 09 FCB $09 ; left context: # (1+ vowels) FA17: 10 FCB $10 ; left context: : (0+ consonants) FA18: 6D FCB $6D ; match: 'M' (first) FA19: 25 FCB $25 ; match: 'E' FA1A: 2E FCB $2E ; match: 'N' FA1B: B4 FCB $B4 ; match: 'T' (last) FA1C: 50 FCB $50 ; phoneme MM FA1D: 0C FCB $0C ; phoneme IH FA1E: 0B FCB $0B ; phoneme NN1 FA1F: 02 FCB $02 ; phoneme PA3 FA20: 8D FCB $8D ; phoneme TT2 (end) ; RULE [EFUL] = FF UH LL FA21: 66 FCB $66 ; match: 'F' (first) FA22: 35 FCB $35 ; match: 'U' FA23: AC FCB $AC ; match: 'L' (last) FA24: 68 FCB $68 ; phoneme FF FA25: 1E FCB $1E ; phoneme UH FA26: AD FCB $AD ; phoneme LL (end) ; RULE [EER] = YR FA27: 65 FCB $65 ; match: 'E' (first) FA28: B2 FCB $B2 ; match: 'R' (last) FA29: FC FCB $FC ; phoneme YR ; RULE [EE] = IY FA2A: E5 FCB $E5 ; match: 'E' FA2B: D3 FCB $D3 ; phoneme IY ; RULE [EARN] = ER2 NN1 FA2C: 61 FCB $61 ; match: 'A' (first) FA2D: 32 FCB $32 ; match: 'R' FA2E: AE FCB $AE ; match: 'N' (last) FA2F: 74 FCB $74 ; phoneme ER2 FA30: 8B FCB $8B ; phoneme NN1 (end) ; RULE _[EAR]^ = ER2 FA31: 13 FCB $13 ; left context: _ (non-letter / word boundary) FA32: 61 FCB $61 ; match: 'A' (first) FA33: B2 FCB $B2 ; match: 'R' (last) FA34: 0E FCB $0E ; right context: ^ (1 consonant) FA35: F4 FCB $F4 ; phoneme ER2 ; RULE *[EAR] = YR FA36: 11 FCB $11 ; left context: * (1+ consonants) FA37: 61 FCB $61 ; match: 'A' (first) FA38: B2 FCB $B2 ; match: 'R' (last) FA39: FC FCB $FC ; phoneme YR ; RULE [EAD] = EH EH PA2 DD1 FA3A: 61 FCB $61 ; match: 'A' (first) FA3B: A4 FCB $A4 ; match: 'D' (last) FA3C: 47 FCB $47 ; phoneme EH FA3D: 07 FCB $07 ; phoneme EH FA3E: 01 FCB $01 ; phoneme PA2 FA3F: 95 FCB $95 ; phoneme DD1 (end) ; RULE #:[EA]_ = IY AX FA40: 09 FCB $09 ; left context: # (1+ vowels) FA41: 10 FCB $10 ; left context: : (0+ consonants) FA42: E1 FCB $E1 ; match: 'A' FA43: 13 FCB $13 ; right context: _ (non-letter / word boundary) FA44: 53 FCB $53 ; phoneme IY FA45: 8F FCB $8F ; phoneme AX (end) ; RULE [EA]SU = EH FA46: E1 FCB $E1 ; match: 'A' FA47: 33 FCB $33 ; right context: 'S' FA48: 35 FCB $35 ; right context: 'U' FA49: C7 FCB $C7 ; phoneme EH ; RULE [EA] = IY FA4A: E1 FCB $E1 ; match: 'A' FA4B: D3 FCB $D3 ; phoneme IY ; RULE [EIGH] = EY FA4C: 69 FCB $69 ; match: 'I' (first) FA4D: 27 FCB $27 ; match: 'G' FA4E: A8 FCB $A8 ; match: 'H' (last) FA4F: D4 FCB $D4 ; phoneme EY ; RULE [EI] = IY FA50: E9 FCB $E9 ; match: 'I' FA51: D3 FCB $D3 ; phoneme IY ; RULE _[EY] = AY FA52: 13 FCB $13 ; left context: _ (non-letter / word boundary) FA53: F9 FCB $F9 ; match: 'Y' FA54: C6 FCB $C6 ; phoneme AY ; RULE [EY] = IY FA55: F9 FCB $F9 ; match: 'Y' FA56: D3 FCB $D3 ; phoneme IY ; RULE [EU] = UW1 FA57: F5 FCB $F5 ; match: 'U' FA58: D6 FCB $D6 ; phoneme UW1 ; RULE [E] = EH FA59: FF FCB $FF ; match: empty (key letter only) FA5A: C7 FCB $C7 ; phoneme EH ; RULE _[F]_ = EH EH FF FA5B: 13 FCB $13 ; left context: _ (non-letter / word boundary) FA5C: FF FCB $FF ; match: empty (key letter only) FA5D: 13 FCB $13 ; right context: _ (non-letter / word boundary) FA5E: 47 FCB $47 ; phoneme EH FA5F: 07 FCB $07 ; phoneme EH FA60: A8 FCB $A8 ; phoneme FF (end) ; RULE [FUL] = FF UH LL FA61: 75 FCB $75 ; match: 'U' (first) FA62: AC FCB $AC ; match: 'L' (last) FA63: 68 FCB $68 ; phoneme FF FA64: 1E FCB $1E ; phoneme UH FA65: AD FCB $AD ; phoneme LL (end) ; RULE [FOUR] = FF OR FA66: 6F FCB $6F ; match: 'O' (first) FA67: 35 FCB $35 ; match: 'U' FA68: B2 FCB $B2 ; match: 'R' (last) FA69: 68 FCB $68 ; phoneme FF FA6A: BA FCB $BA ; phoneme OR (end) ; RULE [F] = FF FA6B: FF FCB $FF ; match: empty (key letter only) FA6C: E8 FCB $E8 ; phoneme FF ; RULE _[G]_ = PA2 JH IY FA6D: 13 FCB $13 ; left context: _ (non-letter / word boundary) FA6E: FF FCB $FF ; match: empty (key letter only) FA6F: 13 FCB $13 ; right context: _ (non-letter / word boundary) FA70: 41 FCB $41 ; phoneme PA2 FA71: 0A FCB $0A ; phoneme JH FA72: 93 FCB $93 ; phoneme IY (end) ; RULE [GIV] = PA2 GG2 IH VV FA73: 69 FCB $69 ; match: 'I' (first) FA74: B6 FCB $B6 ; match: 'V' (last) FA75: 41 FCB $41 ; phoneme PA2 FA76: 3D FCB $3D ; phoneme GG2 FA77: 0C FCB $0C ; phoneme IH FA78: A3 FCB $A3 ; phoneme VV (end) ; RULE _[G]I^ = PA2 GG2 FA79: 13 FCB $13 ; left context: _ (non-letter / word boundary) FA7A: FF FCB $FF ; match: empty (key letter only) FA7B: 29 FCB $29 ; right context: 'I' FA7C: 0E FCB $0E ; right context: ^ (1 consonant) FA7D: 41 FCB $41 ; phoneme PA2 FA7E: BD FCB $BD ; phoneme GG2 (end) ; RULE [GE]T = PA2 GG2 EH FA7F: E5 FCB $E5 ; match: 'E' FA80: 34 FCB $34 ; right context: 'T' FA81: 41 FCB $41 ; phoneme PA2 FA82: 3D FCB $3D ; phoneme GG2 FA83: 87 FCB $87 ; phoneme EH (end) ; RULE SU[GGES] = PA2 GG1 PA2 JH EH EH SS FA84: 33 FCB $33 ; left context: 'S' FA85: 35 FCB $35 ; left context: 'U' FA86: 67 FCB $67 ; match: 'G' (first) FA87: 25 FCB $25 ; match: 'E' FA88: B3 FCB $B3 ; match: 'S' (last) FA89: 41 FCB $41 ; phoneme PA2 FA8A: 24 FCB $24 ; phoneme GG1 FA8B: 01 FCB $01 ; phoneme PA2 FA8C: 0A FCB $0A ; phoneme JH FA8D: 07 FCB $07 ; phoneme EH FA8E: 07 FCB $07 ; phoneme EH FA8F: B7 FCB $B7 ; phoneme SS (end) ; RULE [GG] = PA2 GG1 FA90: E7 FCB $E7 ; match: 'G' FA91: 41 FCB $41 ; phoneme PA2 FA92: A4 FCB $A4 ; phoneme GG1 (end) ; RULE [G]_ = PA2 GG3 FA93: FF FCB $FF ; match: empty (key letter only) FA94: 13 FCB $13 ; right context: _ (non-letter / word boundary) FA95: 41 FCB $41 ; phoneme PA2 FA96: A2 FCB $A2 ; phoneme GG3 (end) ; RULE _B#[G] = PA2 GG2 FA97: 13 FCB $13 ; left context: _ (non-letter / word boundary) FA98: 22 FCB $22 ; left context: 'B' FA99: 09 FCB $09 ; left context: # (1+ vowels) FA9A: FF FCB $FF ; match: empty (key letter only) FA9B: 41 FCB $41 ; phoneme PA2 FA9C: BD FCB $BD ; phoneme GG2 (end) ; RULE [G]+ = PA2 JH FA9D: FF FCB $FF ; match: empty (key letter only) FA9E: 0F FCB $0F ; right context: + (front vowel E I Y) FA9F: 41 FCB $41 ; phoneme PA2 FAA0: 8A FCB $8A ; phoneme JH (end) ; RULE [GREA] = PA2 GG3 RR2 EY FAA1: 72 FCB $72 ; match: 'R' (first) FAA2: 25 FCB $25 ; match: 'E' FAA3: A1 FCB $A1 ; match: 'A' (last) FAA4: 41 FCB $41 ; phoneme PA2 FAA5: 22 FCB $22 ; phoneme GG3 FAA6: 27 FCB $27 ; phoneme RR2 FAA7: 94 FCB $94 ; phoneme EY (end) ; RULE #[GH] = FF FAA8: 09 FCB $09 ; left context: # (1+ vowels) FAA9: E8 FCB $E8 ; match: 'H' FAAA: E8 FCB $E8 ; phoneme FF ; RULE [GH] = PA2 GG1 FAAB: E8 FCB $E8 ; match: 'H' FAAC: 41 FCB $41 ; phoneme PA2 FAAD: A4 FCB $A4 ; phoneme GG1 (end) ; RULE [G] = PA2 GG1 FAAE: FF FCB $FF ; match: empty (key letter only) FAAF: 41 FCB $41 ; phoneme PA2 FAB0: A4 FCB $A4 ; phoneme GG1 (end) ; RULE _[H]_ = EY PA3 CH FAB1: 13 FCB $13 ; left context: _ (non-letter / word boundary) FAB2: FF FCB $FF ; match: empty (key letter only) FAB3: 13 FCB $13 ; right context: _ (non-letter / word boundary) FAB4: 54 FCB $54 ; phoneme EY FAB5: 02 FCB $02 ; phoneme PA3 FAB6: B2 FCB $B2 ; phoneme CH (end) ; RULE _[HAV] = HH1 AE VV FAB7: 13 FCB $13 ; left context: _ (non-letter / word boundary) FAB8: 61 FCB $61 ; match: 'A' (first) FAB9: B6 FCB $B6 ; match: 'V' (last) FABA: 5B FCB $5B ; phoneme HH1 FABB: 1A FCB $1A ; phoneme AE FABC: A3 FCB $A3 ; phoneme VV (end) ; RULE _[HERE] = HH1 YR FABD: 13 FCB $13 ; left context: _ (non-letter / word boundary) FABE: 65 FCB $65 ; match: 'E' (first) FABF: 32 FCB $32 ; match: 'R' FAC0: A5 FCB $A5 ; match: 'E' (last) FAC1: 5B FCB $5B ; phoneme HH1 FAC2: BC FCB $BC ; phoneme YR (end) ; RULE _[HOUR] = AW ER1 FAC3: 13 FCB $13 ; left context: _ (non-letter / word boundary) FAC4: 6F FCB $6F ; match: 'O' (first) FAC5: 35 FCB $35 ; match: 'U' FAC6: B2 FCB $B2 ; match: 'R' (last) FAC7: 60 FCB $60 ; phoneme AW FAC8: B3 FCB $B3 ; phoneme ER1 (end) ; RULE [HOW] = HH1 AW FAC9: 6F FCB $6F ; match: 'O' (first) FACA: B7 FCB $B7 ; match: 'W' (last) FACB: 5B FCB $5B ; phoneme HH1 FACC: A0 FCB $A0 ; phoneme AW (end) ; RULE [HEAR]T = HH1 AR FACD: 65 FCB $65 ; match: 'E' (first) FACE: 21 FCB $21 ; match: 'A' FACF: B2 FCB $B2 ; match: 'R' (last) FAD0: 34 FCB $34 ; right context: 'T' FAD1: 5B FCB $5B ; phoneme HH1 FAD2: BB FCB $BB ; phoneme AR (end) ; RULE [HY]^N = HH1 IH FAD3: F9 FCB $F9 ; match: 'Y' FAD4: 0E FCB $0E ; right context: ^ (1 consonant) FAD5: 2E FCB $2E ; right context: 'N' FAD6: 5B FCB $5B ; phoneme HH1 FAD7: 8C FCB $8C ; phoneme IH (end) ; RULE [H]$ = HH2 FAD8: FF FCB $FF ; match: empty (key letter only) FAD9: 12 FCB $12 ; right context: $ (O or U) FADA: F9 FCB $F9 ; phoneme HH2 ; RULE [H]# = HH1 FADB: FF FCB $FF ; match: empty (key letter only) FADC: 09 FCB $09 ; right context: # (1+ vowels) FADD: DB FCB $DB ; phoneme HH1 ; RULE [H] = (nothing) FADE: FF FCB $FF ; match: empty (key letter only) FADF: FF FCB $FF ; phonemes: none ; RULE _[IN] = IH NN1 FAE0: 13 FCB $13 ; left context: _ (non-letter / word boundary) FAE1: EE FCB $EE ; match: 'N' FAE2: 4C FCB $4C ; phoneme IH FAE3: 8B FCB $8B ; phoneme NN1 (end) ; RULE [I]_ = AY FAE4: FF FCB $FF ; match: empty (key letter only) FAE5: 13 FCB $13 ; right context: _ (non-letter / word boundary) FAE6: C6 FCB $C6 ; phoneme AY ; RULE [IN]D = AY NN1 FAE7: EE FCB $EE ; match: 'N' FAE8: 24 FCB $24 ; right context: 'D' FAE9: 46 FCB $46 ; phoneme AY FAEA: 8B FCB $8B ; phoneme NN1 (end) ; RULE _:[IED]_ = AY PA2 DD1 FAEB: 13 FCB $13 ; left context: _ (non-letter / word boundary) FAEC: 10 FCB $10 ; left context: : (0+ consonants) FAED: 65 FCB $65 ; match: 'E' (first) FAEE: A4 FCB $A4 ; match: 'D' (last) FAEF: 13 FCB $13 ; right context: _ (non-letter / word boundary) FAF0: 46 FCB $46 ; phoneme AY FAF1: 01 FCB $01 ; phoneme PA2 FAF2: 95 FCB $95 ; phoneme DD1 (end) ; RULE #*[IED]_ = IY PA2 DD1 FAF3: 09 FCB $09 ; left context: # (1+ vowels) FAF4: 11 FCB $11 ; left context: * (1+ consonants) FAF5: 65 FCB $65 ; match: 'E' (first) FAF6: A4 FCB $A4 ; match: 'D' (last) FAF7: 13 FCB $13 ; right context: _ (non-letter / word boundary) FAF8: 53 FCB $53 ; phoneme IY FAF9: 01 FCB $01 ; phoneme PA2 FAFA: 95 FCB $95 ; phoneme DD1 (end) ; RULE [IEN] = IY IH NN1 FAFB: 65 FCB $65 ; match: 'E' (first) FAFC: AE FCB $AE ; match: 'N' (last) FAFD: 53 FCB $53 ; phoneme IY FAFE: 0C FCB $0C ; phoneme IH FAFF: 8B FCB $8B ; phoneme NN1 (end) ; RULE [IE]T = AY IH FB00: E5 FCB $E5 ; match: 'E' FB01: 34 FCB $34 ; right context: 'T' FB02: 46 FCB $46 ; phoneme AY FB03: 8C FCB $8C ; phoneme IH (end) ; RULE _:[I]% = AY FB04: 13 FCB $13 ; left context: _ (non-letter / word boundary) FB05: 10 FCB $10 ; left context: : (0+ consonants) FB06: FF FCB $FF ; match: empty (key letter only) FB07: 0B FCB $0B ; right context: % (suffix E/ER/ES/ED/ELY/ING) FB08: C6 FCB $C6 ; phoneme AY ; RULE [IER] = IY ER1 FB09: 65 FCB $65 ; match: 'E' (first) FB0A: B2 FCB $B2 ; match: 'R' (last) FB0B: 53 FCB $53 ; phoneme IY FB0C: B3 FCB $B3 ; phoneme ER1 (end) ; RULE [I]% = IY FB0D: FF FCB $FF ; match: empty (key letter only) FB0E: 0B FCB $0B ; right context: % (suffix E/ER/ES/ED/ELY/ING) FB0F: D3 FCB $D3 ; phoneme IY ; RULE [IE] = IY FB10: E5 FCB $E5 ; match: 'E' FB11: D3 FCB $D3 ; phoneme IY ; RULE [IR]# = AY ER1 FB12: F2 FCB $F2 ; match: 'R' FB13: 09 FCB $09 ; right context: # (1+ vowels) FB14: 46 FCB $46 ; phoneme AY FB15: B3 FCB $B3 ; phoneme ER1 (end) ; RULE [I]^% = AY FB16: FF FCB $FF ; match: empty (key letter only) FB17: 0E FCB $0E ; right context: ^ (1 consonant) FB18: 0B FCB $0B ; right context: % (suffix E/ER/ES/ED/ELY/ING) FB19: C6 FCB $C6 ; phoneme AY ; RULE [I]^+:# = IH FB1A: FF FCB $FF ; match: empty (key letter only) FB1B: 0E FCB $0E ; right context: ^ (1 consonant) FB1C: 0F FCB $0F ; right context: + (front vowel E I Y) FB1D: 10 FCB $10 ; right context: : (0+ consonants) FB1E: 09 FCB $09 ; right context: # (1+ vowels) FB1F: CC FCB $CC ; phoneme IH ; RULE +^[I]^+ = IH FB20: 0F FCB $0F ; left context: + (front vowel E I Y) FB21: 0E FCB $0E ; left context: ^ (1 consonant) FB22: FF FCB $FF ; match: empty (key letter only) FB23: 0E FCB $0E ; right context: ^ (1 consonant) FB24: 0F FCB $0F ; right context: + (front vowel E I Y) FB25: CC FCB $CC ; phoneme IH ; RULE #*[I]^+ = IH FB26: 09 FCB $09 ; left context: # (1+ vowels) FB27: 11 FCB $11 ; left context: * (1+ consonants) FB28: FF FCB $FF ; match: empty (key letter only) FB29: 0E FCB $0E ; right context: ^ (1 consonant) FB2A: 0F FCB $0F ; right context: + (front vowel E I Y) FB2B: CC FCB $CC ; phoneme IH ; RULE [I]^+ = AY FB2C: FF FCB $FF ; match: empty (key letter only) FB2D: 0E FCB $0E ; right context: ^ (1 consonant) FB2E: 0F FCB $0F ; right context: + (front vowel E I Y) FB2F: C6 FCB $C6 ; phoneme AY ; RULE [IR] = ER2 FB30: F2 FCB $F2 ; match: 'R' FB31: F4 FCB $F4 ; phoneme ER2 ; RULE *[I]ON = YY1 FB32: 11 FCB $11 ; left context: * (1+ consonants) FB33: FF FCB $FF ; match: empty (key letter only) FB34: 2F FCB $2F ; right context: 'O' FB35: 2E FCB $2E ; right context: 'N' FB36: F1 FCB $F1 ; phoneme YY1 ; RULE [IGH] = AY FB37: 67 FCB $67 ; match: 'G' (first) FB38: A8 FCB $A8 ; match: 'H' (last) FB39: C6 FCB $C6 ; phoneme AY ; RULE [ILD] = AY EL PA2 DD1 FB3A: 6C FCB $6C ; match: 'L' (first) FB3B: A4 FCB $A4 ; match: 'D' (last) FB3C: 46 FCB $46 ; phoneme AY FB3D: 3E FCB $3E ; phoneme EL FB3E: 01 FCB $01 ; phoneme PA2 FB3F: 95 FCB $95 ; phoneme DD1 (end) ; RULE [IGN] = AY NN1 FB40: 67 FCB $67 ; match: 'G' (first) FB41: AE FCB $AE ; match: 'N' (last) FB42: 46 FCB $46 ; phoneme AY FB43: 8B FCB $8B ; phoneme NN1 (end) ; RULE [IQUE] = IY PA3 KK2 FB44: 71 FCB $71 ; match: 'Q' (first) FB45: 35 FCB $35 ; match: 'U' FB46: A5 FCB $A5 ; match: 'E' (last) FB47: 53 FCB $53 ; phoneme IY FB48: 02 FCB $02 ; phoneme PA3 FB49: A9 FCB $A9 ; phoneme KK2 (end) ; RULE [I] = IH FB4A: FF FCB $FF ; match: empty (key letter only) FB4B: CC FCB $CC ; phoneme IH ; RULE _[J]_ = PA2 JH EY FB4C: 13 FCB $13 ; left context: _ (non-letter / word boundary) FB4D: FF FCB $FF ; match: empty (key letter only) FB4E: 13 FCB $13 ; right context: _ (non-letter / word boundary) FB4F: 41 FCB $41 ; phoneme PA2 FB50: 0A FCB $0A ; phoneme JH FB51: 94 FCB $94 ; phoneme EY (end) ; RULE [J] = PA2 JH FB52: FF FCB $FF ; match: empty (key letter only) FB53: 41 FCB $41 ; phoneme PA2 FB54: 8A FCB $8A ; phoneme JH (end) ; RULE _[K]_ = PA3 KK1 EY FB55: 13 FCB $13 ; left context: _ (non-letter / word boundary) FB56: FF FCB $FF ; match: empty (key letter only) FB57: 13 FCB $13 ; right context: _ (non-letter / word boundary) FB58: 42 FCB $42 ; phoneme PA3 FB59: 2A FCB $2A ; phoneme KK1 FB5A: 94 FCB $94 ; phoneme EY (end) ; RULE _[K]N = (nothing) FB5B: 13 FCB $13 ; left context: _ (non-letter / word boundary) FB5C: FF FCB $FF ; match: empty (key letter only) FB5D: 2E FCB $2E ; right context: 'N' FB5E: FF FCB $FF ; phonemes: none ; RULE [K]_ = PA3 KK2 FB5F: FF FCB $FF ; match: empty (key letter only) FB60: 13 FCB $13 ; right context: _ (non-letter / word boundary) FB61: 42 FCB $42 ; phoneme PA3 FB62: A9 FCB $A9 ; phoneme KK2 (end) ; RULE [K] = PA3 KK1 FB63: FF FCB $FF ; match: empty (key letter only) FB64: 42 FCB $42 ; phoneme PA3 FB65: AA FCB $AA ; phoneme KK1 (end) ; RULE _[L]_ = EH EH LL FB66: 13 FCB $13 ; left context: _ (non-letter / word boundary) FB67: FF FCB $FF ; match: empty (key letter only) FB68: 13 FCB $13 ; right context: _ (non-letter / word boundary) FB69: 47 FCB $47 ; phoneme EH FB6A: 07 FCB $07 ; phoneme EH FB6B: AD FCB $AD ; phoneme LL (end) ; RULE [LO]C# = LL OW FB6C: EF FCB $EF ; match: 'O' FB6D: 23 FCB $23 ; right context: 'C' FB6E: 09 FCB $09 ; right context: # (1+ vowels) FB6F: 6D FCB $6D ; phoneme LL FB70: B5 FCB $B5 ; phoneme OW (end) ; RULE L[L] = (nothing) FB71: 2C FCB $2C ; left context: 'L' FB72: FF FCB $FF ; match: empty (key letter only) FB73: FF FCB $FF ; phonemes: none ; RULE [LEAD] = LL IY PA2 DD1 FB74: 65 FCB $65 ; match: 'E' (first) FB75: 21 FCB $21 ; match: 'A' FB76: A4 FCB $A4 ; match: 'D' (last) FB77: 6D FCB $6D ; phoneme LL FB78: 13 FCB $13 ; phoneme IY FB79: 01 FCB $01 ; phoneme PA2 FB7A: 95 FCB $95 ; phoneme DD1 (end) ; RULE [LAUGH] = LL AE FF FB7B: 61 FCB $61 ; match: 'A' (first) FB7C: 35 FCB $35 ; match: 'U' FB7D: 27 FCB $27 ; match: 'G' FB7E: A8 FCB $A8 ; match: 'H' (last) FB7F: 6D FCB $6D ; phoneme LL FB80: 1A FCB $1A ; phoneme AE FB81: A8 FCB $A8 ; phoneme FF (end) ; RULE [L] = LL FB82: FF FCB $FF ; match: empty (key letter only) FB83: ED FCB $ED ; phoneme LL ; RULE [MB] = MM FB84: E2 FCB $E2 ; match: 'B' FB85: D0 FCB $D0 ; phoneme MM ; RULE _[M]_ = EH EH MM FB86: 13 FCB $13 ; left context: _ (non-letter / word boundary) FB87: FF FCB $FF ; match: empty (key letter only) FB88: 13 FCB $13 ; right context: _ (non-letter / word boundary) FB89: 47 FCB $47 ; phoneme EH FB8A: 07 FCB $07 ; phoneme EH FB8B: 90 FCB $90 ; phoneme MM (end) ; RULE [MOV] = MM UW2 VV FB8C: 6F FCB $6F ; match: 'O' (first) FB8D: B6 FCB $B6 ; match: 'V' (last) FB8E: 50 FCB $50 ; phoneme MM FB8F: 1F FCB $1F ; phoneme UW2 FB90: A3 FCB $A3 ; phoneme VV (end) ; RULE [M]M = (nothing) FB91: FF FCB $FF ; match: empty (key letter only) FB92: 2D FCB $2D ; right context: 'M' FB93: FF FCB $FF ; phonemes: none ; RULE [M] = MM FB94: FF FCB $FF ; match: empty (key letter only) FB95: D0 FCB $D0 ; phoneme MM ; RULE _[N]_ = EH EH NN1 FB96: 13 FCB $13 ; left context: _ (non-letter / word boundary) FB97: FF FCB $FF ; match: empty (key letter only) FB98: 13 FCB $13 ; right context: _ (non-letter / word boundary) FB99: 47 FCB $47 ; phoneme EH FB9A: 07 FCB $07 ; phoneme EH FB9B: 8B FCB $8B ; phoneme NN1 (end) ; RULE E[NG]+ = NN1 PA2 JH FB9C: 25 FCB $25 ; left context: 'E' FB9D: E7 FCB $E7 ; match: 'G' FB9E: 0F FCB $0F ; right context: + (front vowel E I Y) FB9F: 4B FCB $4B ; phoneme NN1 FBA0: 01 FCB $01 ; phoneme PA2 FBA1: 8A FCB $8A ; phoneme JH (end) ; RULE [NG]R = NG PA2 GG1 FBA2: E7 FCB $E7 ; match: 'G' FBA3: 32 FCB $32 ; right context: 'R' FBA4: 6C FCB $6C ; phoneme NG FBA5: 01 FCB $01 ; phoneme PA2 FBA6: A4 FCB $A4 ; phoneme GG1 (end) ; RULE [NG]# = NG PA2 GG1 FBA7: E7 FCB $E7 ; match: 'G' FBA8: 09 FCB $09 ; right context: # (1+ vowels) FBA9: 6C FCB $6C ; phoneme NG FBAA: 01 FCB $01 ; phoneme PA2 FBAB: A4 FCB $A4 ; phoneme GG1 (end) ; RULE [NGL]% = NG PA2 GG1 EL FBAC: 67 FCB $67 ; match: 'G' (first) FBAD: AC FCB $AC ; match: 'L' (last) FBAE: 0B FCB $0B ; right context: % (suffix E/ER/ES/ED/ELY/ING) FBAF: 6C FCB $6C ; phoneme NG FBB0: 01 FCB $01 ; phoneme PA2 FBB1: 24 FCB $24 ; phoneme GG1 FBB2: BE FCB $BE ; phoneme EL (end) ; RULE [NG] = NG FBB3: E7 FCB $E7 ; match: 'G' FBB4: EC FCB $EC ; phoneme NG ; RULE [NK]_ = NG PA3 KK2 FBB5: EB FCB $EB ; match: 'K' FBB6: 13 FCB $13 ; right context: _ (non-letter / word boundary) FBB7: 6C FCB $6C ; phoneme NG FBB8: 02 FCB $02 ; phoneme PA3 FBB9: A9 FCB $A9 ; phoneme KK2 (end) ; RULE [NK]S = NG PA3 KK2 FBBA: EB FCB $EB ; match: 'K' FBBB: 33 FCB $33 ; right context: 'S' FBBC: 6C FCB $6C ; phoneme NG FBBD: 02 FCB $02 ; phoneme PA3 FBBE: A9 FCB $A9 ; phoneme KK2 (end) ; RULE [NK] = NG PA3 KK1 FBBF: EB FCB $EB ; match: 'K' FBC0: 6C FCB $6C ; phoneme NG FBC1: 02 FCB $02 ; phoneme PA3 FBC2: AA FCB $AA ; phoneme KK1 (end) ; RULE _[NOW]_ = NN1 AW FBC3: 13 FCB $13 ; left context: _ (non-letter / word boundary) FBC4: 6F FCB $6F ; match: 'O' (first) FBC5: B7 FCB $B7 ; match: 'W' (last) FBC6: 13 FCB $13 ; right context: _ (non-letter / word boundary) FBC7: 4B FCB $4B ; phoneme NN1 FBC8: A0 FCB $A0 ; phoneme AW (end) ; RULE N[N] = (nothing) FBC9: 2E FCB $2E ; left context: 'N' FBCA: FF FCB $FF ; match: empty (key letter only) FBCB: FF FCB $FF ; phonemes: none ; RULE #:[NU] = NN1 YY1 UW1 FBCC: 09 FCB $09 ; left context: # (1+ vowels) FBCD: 10 FCB $10 ; left context: : (0+ consonants) FBCE: F5 FCB $F5 ; match: 'U' FBCF: 4B FCB $4B ; phoneme NN1 FBD0: 31 FCB $31 ; phoneme YY1 FBD1: 96 FCB $96 ; phoneme UW1 (end) ; RULE [N]$ = NN2 FBD2: FF FCB $FF ; match: empty (key letter only) FBD3: 12 FCB $12 ; right context: $ (O or U) FBD4: F8 FCB $F8 ; phoneme NN2 ; RULE [N'T] = NN1 PA3 TT2 FBD5: 47 FCB $47 ; match: ''' (first) FBD6: B4 FCB $B4 ; match: 'T' (last) FBD7: 4B FCB $4B ; phoneme NN1 FBD8: 02 FCB $02 ; phoneme PA3 FBD9: 8D FCB $8D ; phoneme TT2 (end) ; RULE [N] = NN1 FBDA: FF FCB $FF ; match: empty (key letter only) FBDB: CB FCB $CB ; phoneme NN1 ; RULE _[O]_ = OW FBDC: 13 FCB $13 ; left context: _ (non-letter / word boundary) FBDD: FF FCB $FF ; match: empty (key letter only) FBDE: 13 FCB $13 ; right context: _ (non-letter / word boundary) FBDF: F5 FCB $F5 ; phoneme OW ; RULE [OF]_ = AX VV FBE0: E6 FCB $E6 ; match: 'F' FBE1: 13 FCB $13 ; right context: _ (non-letter / word boundary) FBE2: 4F FCB $4F ; phoneme AX FBE3: A3 FCB $A3 ; phoneme VV (end) ; RULE #:[OR]_ = ER1 FBE4: 09 FCB $09 ; left context: # (1+ vowels) FBE5: 10 FCB $10 ; left context: : (0+ consonants) FBE6: F2 FCB $F2 ; match: 'R' FBE7: 13 FCB $13 ; right context: _ (non-letter / word boundary) FBE8: F3 FCB $F3 ; phoneme ER1 ; RULE #:[ORS]_ = ER1 ZZ FBE9: 09 FCB $09 ; left context: # (1+ vowels) FBEA: 10 FCB $10 ; left context: : (0+ consonants) FBEB: 72 FCB $72 ; match: 'R' (first) FBEC: B3 FCB $B3 ; match: 'S' (last) FBED: 13 FCB $13 ; right context: _ (non-letter / word boundary) FBEE: 73 FCB $73 ; phoneme ER1 FBEF: AB FCB $AB ; phoneme ZZ (end) ; RULE [OR] = OR FBF0: F2 FCB $F2 ; match: 'R' FBF1: FA FCB $FA ; phoneme OR ; RULE _[ONE] = WW AX NN1 FBF2: 13 FCB $13 ; left context: _ (non-letter / word boundary) FBF3: 6E FCB $6E ; match: 'N' (first) FBF4: A5 FCB $A5 ; match: 'E' (last) FBF5: 6E FCB $6E ; phoneme WW FBF6: 0F FCB $0F ; phoneme AX FBF7: 8B FCB $8B ; phoneme NN1 (end) ; RULE +[ONE] = WW AX NN1 FBF8: 0F FCB $0F ; left context: + (front vowel E I Y) FBF9: 6E FCB $6E ; match: 'N' (first) FBFA: A5 FCB $A5 ; match: 'E' (last) FBFB: 6E FCB $6E ; phoneme WW FBFC: 0F FCB $0F ; phoneme AX FBFD: 8B FCB $8B ; phoneme NN1 (end) ; RULE *[OW]N = AW FBFE: 11 FCB $11 ; left context: * (1+ consonants) FBFF: F7 FCB $F7 ; match: 'W' FC00: 2E FCB $2E ; right context: 'N' FC01: E0 FCB $E0 ; phoneme AW ; RULE [OW] = OW FC02: F7 FCB $F7 ; match: 'W' FC03: F5 FCB $F5 ; phoneme OW ; RULE _[OVER] = OW VV ER1 FC04: 13 FCB $13 ; left context: _ (non-letter / word boundary) FC05: 76 FCB $76 ; match: 'V' (first) FC06: 25 FCB $25 ; match: 'E' FC07: B2 FCB $B2 ; match: 'R' (last) FC08: 75 FCB $75 ; phoneme OW FC09: 23 FCB $23 ; phoneme VV FC0A: B3 FCB $B3 ; phoneme ER1 (end) ; RULE [OV] = AX VV FC0B: F6 FCB $F6 ; match: 'V' FC0C: 4F FCB $4F ; phoneme AX FC0D: A3 FCB $A3 ; phoneme VV (end) ; RULE *[OM] = AX MM FC0E: 11 FCB $11 ; left context: * (1+ consonants) FC0F: ED FCB $ED ; match: 'M' FC10: 4F FCB $4F ; phoneme AX FC11: 90 FCB $90 ; phoneme MM (end) ; RULE [O]^% = OW FC12: FF FCB $FF ; match: empty (key letter only) FC13: 0E FCB $0E ; right context: ^ (1 consonant) FC14: 0B FCB $0B ; right context: % (suffix E/ER/ES/ED/ELY/ING) FC15: F5 FCB $F5 ; phoneme OW ; RULE [O]^EN = OW FC16: FF FCB $FF ; match: empty (key letter only) FC17: 0E FCB $0E ; right context: ^ (1 consonant) FC18: 25 FCB $25 ; right context: 'E' FC19: 2E FCB $2E ; right context: 'N' FC1A: F5 FCB $F5 ; phoneme OW ; RULE [O]^I# = OW FC1B: FF FCB $FF ; match: empty (key letter only) FC1C: 0E FCB $0E ; right context: ^ (1 consonant) FC1D: 29 FCB $29 ; right context: 'I' FC1E: 09 FCB $09 ; right context: # (1+ vowels) FC1F: F5 FCB $F5 ; phoneme OW ; RULE [OL]D = OW LL FC20: EC FCB $EC ; match: 'L' FC21: 24 FCB $24 ; right context: 'D' FC22: 75 FCB $75 ; phoneme OW FC23: AD FCB $AD ; phoneme LL (end) ; RULE [OUGHT] = AO AO PA3 TT2 FC24: 75 FCB $75 ; match: 'U' (first) FC25: 27 FCB $27 ; match: 'G' FC26: 28 FCB $28 ; match: 'H' FC27: B4 FCB $B4 ; match: 'T' (last) FC28: 57 FCB $57 ; phoneme AO FC29: 17 FCB $17 ; phoneme AO FC2A: 02 FCB $02 ; phoneme PA3 FC2B: 8D FCB $8D ; phoneme TT2 (end) ; RULE [OUGH] = AX AX FF FC2C: 75 FCB $75 ; match: 'U' (first) FC2D: 27 FCB $27 ; match: 'G' FC2E: A8 FCB $A8 ; match: 'H' (last) FC2F: 4F FCB $4F ; phoneme AX FC30: 0F FCB $0F ; phoneme AX FC31: A8 FCB $A8 ; phoneme FF (end) ; RULE &[OUR] = OR FC32: 0C FCB $0C ; left context: & (sibilant) FC33: 75 FCB $75 ; match: 'U' (first) FC34: B2 FCB $B2 ; match: 'R' (last) FC35: FA FCB $FA ; phoneme OR ; RULE :[OUR] = AW ER1 FC36: 10 FCB $10 ; left context: : (0+ consonants) FC37: 75 FCB $75 ; match: 'U' (first) FC38: B2 FCB $B2 ; match: 'R' (last) FC39: 60 FCB $60 ; phoneme AW FC3A: B3 FCB $B3 ; phoneme ER1 (end) ; RULE _[OU] = AW FC3B: 13 FCB $13 ; left context: _ (non-letter / word boundary) FC3C: F5 FCB $F5 ; match: 'U' FC3D: E0 FCB $E0 ; phoneme AW ; RULE :[OU]S# = AW FC3E: 10 FCB $10 ; left context: : (0+ consonants) FC3F: F5 FCB $F5 ; match: 'U' FC40: 33 FCB $33 ; right context: 'S' FC41: 09 FCB $09 ; right context: # (1+ vowels) FC42: E0 FCB $E0 ; phoneme AW ; RULE [OUS] = AX SS FC43: 75 FCB $75 ; match: 'U' (first) FC44: B3 FCB $B3 ; match: 'S' (last) FC45: 4F FCB $4F ; phoneme AX FC46: B7 FCB $B7 ; phoneme SS (end) ; RULE [OULD] = UH PA2 DD1 FC47: 75 FCB $75 ; match: 'U' (first) FC48: 2C FCB $2C ; match: 'L' FC49: A4 FCB $A4 ; match: 'D' (last) FC4A: 5E FCB $5E ; phoneme UH FC4B: 01 FCB $01 ; phoneme PA2 FC4C: 95 FCB $95 ; phoneme DD1 (end) ; RULE ^[OU]^L = AX FC4D: 0E FCB $0E ; left context: ^ (1 consonant) FC4E: F5 FCB $F5 ; match: 'U' FC4F: 0E FCB $0E ; right context: ^ (1 consonant) FC50: 2C FCB $2C ; right context: 'L' FC51: CF FCB $CF ; phoneme AX ; RULE [OUP] = UW2 PA3 PP FC52: 75 FCB $75 ; match: 'U' (first) FC53: B0 FCB $B0 ; match: 'P' (last) FC54: 5F FCB $5F ; phoneme UW2 FC55: 02 FCB $02 ; phoneme PA3 FC56: 89 FCB $89 ; phoneme PP (end) ; RULE [OU] = AW FC57: F5 FCB $F5 ; match: 'U' FC58: E0 FCB $E0 ; phoneme AW ; RULE [OY] = OY FC59: F9 FCB $F9 ; match: 'Y' FC5A: C5 FCB $C5 ; phoneme OY ; RULE [OING] = OW IH NG FC5B: 69 FCB $69 ; match: 'I' (first) FC5C: 2E FCB $2E ; match: 'N' FC5D: A7 FCB $A7 ; match: 'G' (last) FC5E: 75 FCB $75 ; phoneme OW FC5F: 0C FCB $0C ; phoneme IH FC60: AC FCB $AC ; phoneme NG (end) ; RULE [OI] = OY FC61: E9 FCB $E9 ; match: 'I' FC62: C5 FCB $C5 ; phoneme OY ; RULE [OOR] = OR FC63: 6F FCB $6F ; match: 'O' (first) FC64: B2 FCB $B2 ; match: 'R' (last) FC65: FA FCB $FA ; phoneme OR ; RULE [OOK]_ = UH PA3 KK2 FC66: 6F FCB $6F ; match: 'O' (first) FC67: AB FCB $AB ; match: 'K' (last) FC68: 13 FCB $13 ; right context: _ (non-letter / word boundary) FC69: 5E FCB $5E ; phoneme UH FC6A: 02 FCB $02 ; phoneme PA3 FC6B: A9 FCB $A9 ; phoneme KK2 (end) ; RULE [OOK]S = UH PA3 KK2 FC6C: 6F FCB $6F ; match: 'O' (first) FC6D: AB FCB $AB ; match: 'K' (last) FC6E: 33 FCB $33 ; right context: 'S' FC6F: 5E FCB $5E ; phoneme UH FC70: 02 FCB $02 ; phoneme PA3 FC71: A9 FCB $A9 ; phoneme KK2 (end) ; RULE [OOK] = UH PA3 KK1 FC72: 6F FCB $6F ; match: 'O' (first) FC73: AB FCB $AB ; match: 'K' (last) FC74: 5E FCB $5E ; phoneme UH FC75: 02 FCB $02 ; phoneme PA3 FC76: AA FCB $AA ; phoneme KK1 (end) ; RULE [OOD]_ = UH PA2 DD1 FC77: 6F FCB $6F ; match: 'O' (first) FC78: A4 FCB $A4 ; match: 'D' (last) FC79: 13 FCB $13 ; right context: _ (non-letter / word boundary) FC7A: 5E FCB $5E ; phoneme UH FC7B: 01 FCB $01 ; phoneme PA2 FC7C: 95 FCB $95 ; phoneme DD1 (end) ; RULE [OO]D = UH FC7D: EF FCB $EF ; match: 'O' FC7E: 24 FCB $24 ; right context: 'D' FC7F: DE FCB $DE ; phoneme UH ; RULE [OO] = UW2 FC80: EF FCB $EF ; match: 'O' FC81: DF FCB $DF ; phoneme UW2 ; RULE [O]E = OW FC82: FF FCB $FF ; match: empty (key letter only) FC83: 25 FCB $25 ; right context: 'E' FC84: F5 FCB $F5 ; phoneme OW ; RULE [O]_ = OW FC85: FF FCB $FF ; match: empty (key letter only) FC86: 13 FCB $13 ; right context: _ (non-letter / word boundary) FC87: F5 FCB $F5 ; phoneme OW ; RULE [OAR] = OR FC88: 61 FCB $61 ; match: 'A' (first) FC89: B2 FCB $B2 ; match: 'R' (last) FC8A: FA FCB $FA ; phoneme OR ; RULE [OA] = OW FC8B: E1 FCB $E1 ; match: 'A' FC8C: F5 FCB $F5 ; phoneme OW ; RULE _[ONLY] = OW NN1 LL IY FC8D: 13 FCB $13 ; left context: _ (non-letter / word boundary) FC8E: 6E FCB $6E ; match: 'N' (first) FC8F: 2C FCB $2C ; match: 'L' FC90: B9 FCB $B9 ; match: 'Y' (last) FC91: 75 FCB $75 ; phoneme OW FC92: 0B FCB $0B ; phoneme NN1 FC93: 2D FCB $2D ; phoneme LL FC94: 93 FCB $93 ; phoneme IY (end) ; RULE _[ONCE] = WW AX NN1 SS FC95: 13 FCB $13 ; left context: _ (non-letter / word boundary) FC96: 6E FCB $6E ; match: 'N' (first) FC97: 23 FCB $23 ; match: 'C' FC98: A5 FCB $A5 ; match: 'E' (last) FC99: 6E FCB $6E ; phoneme WW FC9A: 0F FCB $0F ; phoneme AX FC9B: 0B FCB $0B ; phoneme NN1 FC9C: B7 FCB $B7 ; phoneme SS (end) ; RULE [ON'T] = OW NN1 PA3 TT2 FC9D: 6E FCB $6E ; match: 'N' (first) FC9E: 07 FCB $07 ; match: ''' FC9F: B4 FCB $B4 ; match: 'T' (last) FCA0: 75 FCB $75 ; phoneme OW FCA1: 0B FCB $0B ; phoneme NN1 FCA2: 02 FCB $02 ; phoneme PA3 FCA3: 8D FCB $8D ; phoneme TT2 (end) ; RULE C[O]N = AX FCA4: 23 FCB $23 ; left context: 'C' FCA5: FF FCB $FF ; match: empty (key letter only) FCA6: 2E FCB $2E ; right context: 'N' FCA7: CF FCB $CF ; phoneme AX ; RULE [O]NG = AO FCA8: FF FCB $FF ; match: empty (key letter only) FCA9: 2E FCB $2E ; right context: 'N' FCAA: 27 FCB $27 ; right context: 'G' FCAB: D7 FCB $D7 ; phoneme AO ; RULE _*[O]N = AX FCAC: 13 FCB $13 ; left context: _ (non-letter / word boundary) FCAD: 11 FCB $11 ; left context: * (1+ consonants) FCAE: FF FCB $FF ; match: empty (key letter only) FCAF: 2E FCB $2E ; right context: 'N' FCB0: CF FCB $CF ; phoneme AX ; RULE I[ON] = AX NN1 FCB1: 29 FCB $29 ; left context: 'I' FCB2: EE FCB $EE ; match: 'N' FCB3: 4F FCB $4F ; phoneme AX FCB4: 8B FCB $8B ; phoneme NN1 (end) ; RULE #:[ON]_ = AX NN1 FCB5: 09 FCB $09 ; left context: # (1+ vowels) FCB6: 10 FCB $10 ; left context: : (0+ consonants) FCB7: EE FCB $EE ; match: 'N' FCB8: 13 FCB $13 ; right context: _ (non-letter / word boundary) FCB9: 4F FCB $4F ; phoneme AX FCBA: 8B FCB $8B ; phoneme NN1 (end) ; RULE [O]ST_ = OW FCBB: FF FCB $FF ; match: empty (key letter only) FCBC: 33 FCB $33 ; right context: 'S' FCBD: 34 FCB $34 ; right context: 'T' FCBE: 13 FCB $13 ; right context: _ (non-letter / word boundary) FCBF: F5 FCB $F5 ; phoneme OW ; RULE [OF]^ = AO FF FCC0: E6 FCB $E6 ; match: 'F' FCC1: 0E FCB $0E ; right context: ^ (1 consonant) FCC2: 57 FCB $57 ; phoneme AO FCC3: A8 FCB $A8 ; phoneme FF (end) ; RULE [OTHER] = AX DH2 ER1 FCC4: 74 FCB $74 ; match: 'T' (first) FCC5: 28 FCB $28 ; match: 'H' FCC6: 25 FCB $25 ; match: 'E' FCC7: B2 FCB $B2 ; match: 'R' (last) FCC8: 4F FCB $4F ; phoneme AX FCC9: 36 FCB $36 ; phoneme DH2 FCCA: B3 FCB $B3 ; phoneme ER1 (end) ; RULE [OSS]_ = AO AO SS SS FCCB: 73 FCB $73 ; match: 'S' (first) FCCC: B3 FCB $B3 ; match: 'S' (last) FCCD: 13 FCB $13 ; right context: _ (non-letter / word boundary) FCCE: 57 FCB $57 ; phoneme AO FCCF: 17 FCB $17 ; phoneme AO FCD0: 37 FCB $37 ; phoneme SS FCD1: B7 FCB $B7 ; phoneme SS (end) ; RULE [O] = AA FCD2: FF FCB $FF ; match: empty (key letter only) FCD3: D8 FCB $D8 ; phoneme AA ; RULE [PSYCH] = SS SS AY PA2 KK1 FCD4: 73 FCB $73 ; match: 'S' (first) FCD5: 39 FCB $39 ; match: 'Y' FCD6: 23 FCB $23 ; match: 'C' FCD7: A8 FCB $A8 ; match: 'H' (last) FCD8: 77 FCB $77 ; phoneme SS FCD9: 37 FCB $37 ; phoneme SS FCDA: 06 FCB $06 ; phoneme AY FCDB: 01 FCB $01 ; phoneme PA2 FCDC: AA FCB $AA ; phoneme KK1 (end) ; RULE _[P]_ = PA3 PP IY FCDD: 13 FCB $13 ; left context: _ (non-letter / word boundary) FCDE: FF FCB $FF ; match: empty (key letter only) FCDF: 13 FCB $13 ; right context: _ (non-letter / word boundary) FCE0: 42 FCB $42 ; phoneme PA3 FCE1: 09 FCB $09 ; phoneme PP FCE2: 93 FCB $93 ; phoneme IY (end) ; RULE [PH] = FF FCE3: E8 FCB $E8 ; match: 'H' FCE4: E8 FCB $E8 ; phoneme FF ; RULE [PEOP] = PA3 PP IY PA3 PP FCE5: 65 FCB $65 ; match: 'E' (first) FCE6: 2F FCB $2F ; match: 'O' FCE7: B0 FCB $B0 ; match: 'P' (last) FCE8: 42 FCB $42 ; phoneme PA3 FCE9: 09 FCB $09 ; phoneme PP FCEA: 13 FCB $13 ; phoneme IY FCEB: 02 FCB $02 ; phoneme PA3 FCEC: 89 FCB $89 ; phoneme PP (end) ; RULE [POW] = PA3 PP AW FCED: 6F FCB $6F ; match: 'O' (first) FCEE: B7 FCB $B7 ; match: 'W' (last) FCEF: 42 FCB $42 ; phoneme PA3 FCF0: 09 FCB $09 ; phoneme PP FCF1: A0 FCB $A0 ; phoneme AW (end) ; RULE [PUT]_ = PA3 PP UH PA3 TT2 FCF2: 75 FCB $75 ; match: 'U' (first) FCF3: B4 FCB $B4 ; match: 'T' (last) FCF4: 13 FCB $13 ; right context: _ (non-letter / word boundary) FCF5: 42 FCB $42 ; phoneme PA3 FCF6: 09 FCB $09 ; phoneme PP FCF7: 1E FCB $1E ; phoneme UH FCF8: 02 FCB $02 ; phoneme PA3 FCF9: 8D FCB $8D ; phoneme TT2 (end) ; RULE [P]P = (nothing) FCFA: FF FCB $FF ; match: empty (key letter only) FCFB: 30 FCB $30 ; right context: 'P' FCFC: FF FCB $FF ; phonemes: none ; RULE [P] = PA3 PP FCFD: FF FCB $FF ; match: empty (key letter only) FCFE: 42 FCB $42 ; phoneme PA3 FCFF: 89 FCB $89 ; phoneme PP (end) ; RULE _[Q]_ = PA3 KK1 YY1 UW2 FD00: 13 FCB $13 ; left context: _ (non-letter / word boundary) FD01: FF FCB $FF ; match: empty (key letter only) FD02: 13 FCB $13 ; right context: _ (non-letter / word boundary) FD03: 42 FCB $42 ; phoneme PA3 FD04: 2A FCB $2A ; phoneme KK1 FD05: 31 FCB $31 ; phoneme YY1 FD06: 9F FCB $9F ; phoneme UW2 (end) ; RULE [QUAR] = PA3 KK3 WH OR FD07: 75 FCB $75 ; match: 'U' (first) FD08: 21 FCB $21 ; match: 'A' FD09: B2 FCB $B2 ; match: 'R' (last) FD0A: 42 FCB $42 ; phoneme PA3 FD0B: 08 FCB $08 ; phoneme KK3 FD0C: 30 FCB $30 ; phoneme WH FD0D: BA FCB $BA ; phoneme OR (end) ; RULE [QUE]_ = PA3 KK1 YY1 UW2 FD0E: 75 FCB $75 ; match: 'U' (first) FD0F: A5 FCB $A5 ; match: 'E' (last) FD10: 13 FCB $13 ; right context: _ (non-letter / word boundary) FD11: 42 FCB $42 ; phoneme PA3 FD12: 2A FCB $2A ; phoneme KK1 FD13: 31 FCB $31 ; phoneme YY1 FD14: 9F FCB $9F ; phoneme UW2 (end) ; RULE [QU] = PA3 KK3 WH FD15: F5 FCB $F5 ; match: 'U' FD16: 42 FCB $42 ; phoneme PA3 FD17: 08 FCB $08 ; phoneme KK3 FD18: B0 FCB $B0 ; phoneme WH (end) ; RULE _[R]_ = AR FD19: 13 FCB $13 ; left context: _ (non-letter / word boundary) FD1A: FF FCB $FF ; match: empty (key letter only) FD1B: 13 FCB $13 ; right context: _ (non-letter / word boundary) FD1C: FB FCB $FB ; phoneme AR ; RULE _[RE]^# = RR1 IY FD1D: 13 FCB $13 ; left context: _ (non-letter / word boundary) FD1E: E5 FCB $E5 ; match: 'E' FD1F: 0E FCB $0E ; right context: ^ (1 consonant) FD20: 09 FCB $09 ; right context: # (1+ vowels) FD21: 4E FCB $4E ; phoneme RR1 FD22: 93 FCB $93 ; phoneme IY (end) ; RULE R[R] = (nothing) FD23: 32 FCB $32 ; left context: 'R' FD24: FF FCB $FF ; match: empty (key letter only) FD25: FF FCB $FF ; phonemes: none ; RULE *[R] = RR2 FD26: 11 FCB $11 ; left context: * (1+ consonants) FD27: FF FCB $FF ; match: empty (key letter only) FD28: E7 FCB $E7 ; phoneme RR2 ; RULE [R] = RR1 FD29: FF FCB $FF ; match: empty (key letter only) FD2A: CE FCB $CE ; phoneme RR1 ; RULE _[S]_ = EH EH SS SS FD2B: 13 FCB $13 ; left context: _ (non-letter / word boundary) FD2C: FF FCB $FF ; match: empty (key letter only) FD2D: 13 FCB $13 ; right context: _ (non-letter / word boundary) FD2E: 47 FCB $47 ; phoneme EH FD2F: 07 FCB $07 ; phoneme EH FD30: 37 FCB $37 ; phoneme SS FD31: B7 FCB $B7 ; phoneme SS (end) ; RULE [SH] = SH FD32: E8 FCB $E8 ; match: 'H' FD33: E5 FCB $E5 ; phoneme SH ; RULE #[SION] = ZH AX NN1 FD34: 09 FCB $09 ; left context: # (1+ vowels) FD35: 69 FCB $69 ; match: 'I' (first) FD36: 2F FCB $2F ; match: 'O' FD37: AE FCB $AE ; match: 'N' (last) FD38: 66 FCB $66 ; phoneme ZH FD39: 0F FCB $0F ; phoneme AX FD3A: 8B FCB $8B ; phoneme NN1 (end) ; RULE #[SUR]# = ZH ER1 FD3B: 09 FCB $09 ; left context: # (1+ vowels) FD3C: 75 FCB $75 ; match: 'U' (first) FD3D: B2 FCB $B2 ; match: 'R' (last) FD3E: 09 FCB $09 ; right context: # (1+ vowels) FD3F: 66 FCB $66 ; phoneme ZH FD40: B3 FCB $B3 ; phoneme ER1 (end) ; RULE [SUR]# = SH ER1 FD41: 75 FCB $75 ; match: 'U' (first) FD42: B2 FCB $B2 ; match: 'R' (last) FD43: 09 FCB $09 ; right context: # (1+ vowels) FD44: 65 FCB $65 ; phoneme SH FD45: B3 FCB $B3 ; phoneme ER1 (end) ; RULE #[SU]# = ZH UW1 FD46: 09 FCB $09 ; left context: # (1+ vowels) FD47: F5 FCB $F5 ; match: 'U' FD48: 09 FCB $09 ; right context: # (1+ vowels) FD49: 66 FCB $66 ; phoneme ZH FD4A: 96 FCB $96 ; phoneme UW1 (end) ; RULE #[SSU]# = SH UW1 FD4B: 09 FCB $09 ; left context: # (1+ vowels) FD4C: 73 FCB $73 ; match: 'S' (first) FD4D: B5 FCB $B5 ; match: 'U' (last) FD4E: 09 FCB $09 ; right context: # (1+ vowels) FD4F: 65 FCB $65 ; phoneme SH FD50: 96 FCB $96 ; phoneme UW1 (end) ; RULE #[SED]_ = ZZ PA2 DD1 FD51: 09 FCB $09 ; left context: # (1+ vowels) FD52: 65 FCB $65 ; match: 'E' (first) FD53: A4 FCB $A4 ; match: 'D' (last) FD54: 13 FCB $13 ; right context: _ (non-letter / word boundary) FD55: 6B FCB $6B ; phoneme ZZ FD56: 01 FCB $01 ; phoneme PA2 FD57: 95 FCB $95 ; phoneme DD1 (end) ; RULE [SAID] = SS SS EH EH PA2 DD1 FD58: 61 FCB $61 ; match: 'A' (first) FD59: 29 FCB $29 ; match: 'I' FD5A: A4 FCB $A4 ; match: 'D' (last) FD5B: 77 FCB $77 ; phoneme SS FD5C: 37 FCB $37 ; phoneme SS FD5D: 07 FCB $07 ; phoneme EH FD5E: 07 FCB $07 ; phoneme EH FD5F: 01 FCB $01 ; phoneme PA2 FD60: 95 FCB $95 ; phoneme DD1 (end) ; RULE ^[SION] = SH AX NN1 FD61: 0E FCB $0E ; left context: ^ (1 consonant) FD62: 69 FCB $69 ; match: 'I' (first) FD63: 2F FCB $2F ; match: 'O' FD64: AE FCB $AE ; match: 'N' (last) FD65: 65 FCB $65 ; phoneme SH FD66: 0F FCB $0F ; phoneme AX FD67: 8B FCB $8B ; phoneme NN1 (end) ; RULE .[S]_ = ZZ FD68: 0A FCB $0A ; left context: . (voiced cons.) FD69: FF FCB $FF ; match: empty (key letter only) FD6A: 13 FCB $13 ; right context: _ (non-letter / word boundary) FD6B: EB FCB $EB ; phoneme ZZ ; RULE #:.E[S]_ = ZZ FD6C: 09 FCB $09 ; left context: # (1+ vowels) FD6D: 10 FCB $10 ; left context: : (0+ consonants) FD6E: 0A FCB $0A ; left context: . (voiced cons.) FD6F: 25 FCB $25 ; left context: 'E' FD70: FF FCB $FF ; match: empty (key letter only) FD71: 13 FCB $13 ; right context: _ (non-letter / word boundary) FD72: EB FCB $EB ; phoneme ZZ ; RULE #*4[S]_ = ZZ FD73: 09 FCB $09 ; left context: # (1+ vowels) FD74: 11 FCB $11 ; left context: * (1+ consonants) FD75: 14 FCB $14 ; left context: ## (2+ vowels) FD76: FF FCB $FF ; match: empty (key letter only) FD77: 13 FCB $13 ; right context: _ (non-letter / word boundary) FD78: EB FCB $EB ; phoneme ZZ ; RULE U[S]_ = SS FD79: 35 FCB $35 ; left context: 'U' FD7A: FF FCB $FF ; match: empty (key letter only) FD7B: 13 FCB $13 ; right context: _ (non-letter / word boundary) FD7C: F7 FCB $F7 ; phoneme SS ; RULE _:#[S]_ = ZZ FD7D: 13 FCB $13 ; left context: _ (non-letter / word boundary) FD7E: 10 FCB $10 ; left context: : (0+ consonants) FD7F: 09 FCB $09 ; left context: # (1+ vowels) FD80: FF FCB $FF ; match: empty (key letter only) FD81: 13 FCB $13 ; right context: _ (non-letter / word boundary) FD82: EB FCB $EB ; phoneme ZZ ; RULE _[SCH] = SS SS PA3 KK2 FD83: 13 FCB $13 ; left context: _ (non-letter / word boundary) FD84: 63 FCB $63 ; match: 'C' (first) FD85: A8 FCB $A8 ; match: 'H' (last) FD86: 77 FCB $77 ; phoneme SS FD87: 37 FCB $37 ; phoneme SS FD88: 02 FCB $02 ; phoneme PA3 FD89: A9 FCB $A9 ; phoneme KK2 (end) ; RULE [S]C+ = (nothing) FD8A: FF FCB $FF ; match: empty (key letter only) FD8B: 23 FCB $23 ; right context: 'C' FD8C: 0F FCB $0F ; right context: + (front vowel E I Y) FD8D: FF FCB $FF ; phonemes: none ; RULE #[SM] = ZZ MM FD8E: 09 FCB $09 ; left context: # (1+ vowels) FD8F: ED FCB $ED ; match: 'M' FD90: 6B FCB $6B ; phoneme ZZ FD91: 90 FCB $90 ; phoneme MM (end) ; RULE #[S]N' = ZZ FD92: 09 FCB $09 ; left context: # (1+ vowels) FD93: FF FCB $FF ; match: empty (key letter only) FD94: 2E FCB $2E ; right context: 'N' FD95: 07 FCB $07 ; right context: ' FD96: EB FCB $EB ; phoneme ZZ ; RULE [S] = SS FD97: FF FCB $FF ; match: empty (key letter only) FD98: F7 FCB $F7 ; phoneme SS ; RULE [T]'S = PA3 TT1 FD99: FF FCB $FF ; match: empty (key letter only) FD9A: 07 FCB $07 ; right context: ' FD9B: 33 FCB $33 ; right context: 'S' FD9C: 42 FCB $42 ; phoneme PA3 FD9D: 91 FCB $91 ; phoneme TT1 (end) ; RULE [TCH] = PA3 CH FD9E: 63 FCB $63 ; match: 'C' (first) FD9F: A8 FCB $A8 ; match: 'H' (last) FDA0: 42 FCB $42 ; phoneme PA3 FDA1: B2 FCB $B2 ; phoneme CH (end) ; RULE _[T]_ = PA3 TT2 IY FDA2: 13 FCB $13 ; left context: _ (non-letter / word boundary) FDA3: FF FCB $FF ; match: empty (key letter only) FDA4: 13 FCB $13 ; right context: _ (non-letter / word boundary) FDA5: 42 FCB $42 ; phoneme PA3 FDA6: 0D FCB $0D ; phoneme TT2 FDA7: 93 FCB $93 ; phoneme IY (end) ; RULE _[THE ]# = DH1 IY FDA8: 13 FCB $13 ; left context: _ (non-letter / word boundary) FDA9: 68 FCB $68 ; match: 'H' (first) FDAA: 25 FCB $25 ; match: 'E' FDAB: 80 FCB $80 ; match: ' ' (last) FDAC: 09 FCB $09 ; right context: # (1+ vowels) FDAD: 52 FCB $52 ; phoneme DH1 FDAE: 93 FCB $93 ; phoneme IY (end) ; RULE _[THE]_ = DH1 AX FDAF: 13 FCB $13 ; left context: _ (non-letter / word boundary) FDB0: 68 FCB $68 ; match: 'H' (first) FDB1: A5 FCB $A5 ; match: 'E' (last) FDB2: 13 FCB $13 ; right context: _ (non-letter / word boundary) FDB3: 52 FCB $52 ; phoneme DH1 FDB4: 8F FCB $8F ; phoneme AX (end) ; RULE [TO]_ = PA3 TT2 UW2 FDB5: EF FCB $EF ; match: 'O' FDB6: 13 FCB $13 ; right context: _ (non-letter / word boundary) FDB7: 42 FCB $42 ; phoneme PA3 FDB8: 0D FCB $0D ; phoneme TT2 FDB9: 9F FCB $9F ; phoneme UW2 (end) ; RULE [TODAY] = PA3 TT2 UW2 DD2 EY FDBA: 6F FCB $6F ; match: 'O' (first) FDBB: 24 FCB $24 ; match: 'D' FDBC: 21 FCB $21 ; match: 'A' FDBD: B9 FCB $B9 ; match: 'Y' (last) FDBE: 42 FCB $42 ; phoneme PA3 FDBF: 0D FCB $0D ; phoneme TT2 FDC0: 1F FCB $1F ; phoneme UW2 FDC1: 21 FCB $21 ; phoneme DD2 FDC2: 94 FCB $94 ; phoneme EY (end) ; RULE [THA]^_ = DH1 AE FDC3: 68 FCB $68 ; match: 'H' (first) FDC4: A1 FCB $A1 ; match: 'A' (last) FDC5: 0E FCB $0E ; right context: ^ (1 consonant) FDC6: 13 FCB $13 ; right context: _ (non-letter / word boundary) FDC7: 52 FCB $52 ; phoneme DH1 FDC8: 9A FCB $9A ; phoneme AE (end) ; RULE _[THIS]_ = DH1 IH SS SS FDC9: 13 FCB $13 ; left context: _ (non-letter / word boundary) FDCA: 68 FCB $68 ; match: 'H' (first) FDCB: 29 FCB $29 ; match: 'I' FDCC: B3 FCB $B3 ; match: 'S' (last) FDCD: 13 FCB $13 ; right context: _ (non-letter / word boundary) FDCE: 52 FCB $52 ; phoneme DH1 FDCF: 0C FCB $0C ; phoneme IH FDD0: 37 FCB $37 ; phoneme SS FDD1: B7 FCB $B7 ; phoneme SS (end) ; RULE _[THEY] = DH1 EY FDD2: 13 FCB $13 ; left context: _ (non-letter / word boundary) FDD3: 68 FCB $68 ; match: 'H' (first) FDD4: 25 FCB $25 ; match: 'E' FDD5: B9 FCB $B9 ; match: 'Y' (last) FDD6: 52 FCB $52 ; phoneme DH1 FDD7: 94 FCB $94 ; phoneme EY (end) ; RULE _[THERE] = DH1 XR FDD8: 13 FCB $13 ; left context: _ (non-letter / word boundary) FDD9: 68 FCB $68 ; match: 'H' (first) FDDA: 25 FCB $25 ; match: 'E' FDDB: 32 FCB $32 ; match: 'R' FDDC: A5 FCB $A5 ; match: 'E' (last) FDDD: 52 FCB $52 ; phoneme DH1 FDDE: AF FCB $AF ; phoneme XR (end) ; RULE [THER] = DH2 ER1 FDDF: 68 FCB $68 ; match: 'H' (first) FDE0: 25 FCB $25 ; match: 'E' FDE1: B2 FCB $B2 ; match: 'R' (last) FDE2: 76 FCB $76 ; phoneme DH2 FDE3: B3 FCB $B3 ; phoneme ER1 (end) ; RULE [THEIR] = DH1 XR FDE4: 68 FCB $68 ; match: 'H' (first) FDE5: 25 FCB $25 ; match: 'E' FDE6: 29 FCB $29 ; match: 'I' FDE7: B2 FCB $B2 ; match: 'R' (last) FDE8: 52 FCB $52 ; phoneme DH1 FDE9: AF FCB $AF ; phoneme XR (end) ; RULE _[THEM]: = DH1 EH MM FDEA: 13 FCB $13 ; left context: _ (non-letter / word boundary) FDEB: 68 FCB $68 ; match: 'H' (first) FDEC: 25 FCB $25 ; match: 'E' FDED: AD FCB $AD ; match: 'M' (last) FDEE: 10 FCB $10 ; right context: : (0+ consonants) FDEF: 52 FCB $52 ; phoneme DH1 FDF0: 07 FCB $07 ; phoneme EH FDF1: 90 FCB $90 ; phoneme MM (end) ; RULE [THESE]_ = DH1 IY ZZ FDF2: 68 FCB $68 ; match: 'H' (first) FDF3: 25 FCB $25 ; match: 'E' FDF4: 33 FCB $33 ; match: 'S' FDF5: A5 FCB $A5 ; match: 'E' (last) FDF6: 13 FCB $13 ; right context: _ (non-letter / word boundary) FDF7: 52 FCB $52 ; phoneme DH1 FDF8: 13 FCB $13 ; phoneme IY FDF9: AB FCB $AB ; phoneme ZZ (end) ; RULE _[THEN] = DH1 EH NN1 FDFA: 13 FCB $13 ; left context: _ (non-letter / word boundary) FDFB: 68 FCB $68 ; match: 'H' (first) FDFC: 25 FCB $25 ; match: 'E' FDFD: AE FCB $AE ; match: 'N' (last) FDFE: 52 FCB $52 ; phoneme DH1 FDFF: 07 FCB $07 ; phoneme EH FE00: 8B FCB $8B ; phoneme NN1 (end) ; RULE [THROUGH]_ = TH RR2 UW2 FE01: 68 FCB $68 ; match: 'H' (first) FE02: 32 FCB $32 ; match: 'R' FE03: 2F FCB $2F ; match: 'O' FE04: 35 FCB $35 ; match: 'U' FE05: 27 FCB $27 ; match: 'G' FE06: A8 FCB $A8 ; match: 'H' (last) FE07: 13 FCB $13 ; right context: _ (non-letter / word boundary) FE08: 5D FCB $5D ; phoneme TH FE09: 27 FCB $27 ; phoneme RR2 FE0A: 9F FCB $9F ; phoneme UW2 (end) ; RULE [THOSE] = DH1 OW SS FE0B: 68 FCB $68 ; match: 'H' (first) FE0C: 2F FCB $2F ; match: 'O' FE0D: 33 FCB $33 ; match: 'S' FE0E: A5 FCB $A5 ; match: 'E' (last) FE0F: 52 FCB $52 ; phoneme DH1 FE10: 35 FCB $35 ; phoneme OW FE11: B7 FCB $B7 ; phoneme SS (end) ; RULE [THOUGH]_ = DH1 OW FE12: 68 FCB $68 ; match: 'H' (first) FE13: 2F FCB $2F ; match: 'O' FE14: 35 FCB $35 ; match: 'U' FE15: 27 FCB $27 ; match: 'G' FE16: A8 FCB $A8 ; match: 'H' (last) FE17: 13 FCB $13 ; right context: _ (non-letter / word boundary) FE18: 52 FCB $52 ; phoneme DH1 FE19: B5 FCB $B5 ; phoneme OW (end) ; RULE _[THUS] = DH1 AX SS SS FE1A: 13 FCB $13 ; left context: _ (non-letter / word boundary) FE1B: 68 FCB $68 ; match: 'H' (first) FE1C: 35 FCB $35 ; match: 'U' FE1D: B3 FCB $B3 ; match: 'S' (last) FE1E: 52 FCB $52 ; phoneme DH1 FE1F: 0F FCB $0F ; phoneme AX FE20: 37 FCB $37 ; phoneme SS FE21: B7 FCB $B7 ; phoneme SS (end) ; RULE [THE]_ = DH1 FE22: 68 FCB $68 ; match: 'H' (first) FE23: A5 FCB $A5 ; match: 'E' (last) FE24: 13 FCB $13 ; right context: _ (non-letter / word boundary) FE25: D2 FCB $D2 ; phoneme DH1 ; RULE [TH] = TH FE26: E8 FCB $E8 ; match: 'H' FE27: DD FCB $DD ; phoneme TH ; RULE #:[TED]_ = PA3 TT2 IH PA2 DD1 FE28: 09 FCB $09 ; left context: # (1+ vowels) FE29: 10 FCB $10 ; left context: : (0+ consonants) FE2A: 65 FCB $65 ; match: 'E' (first) FE2B: A4 FCB $A4 ; match: 'D' (last) FE2C: 13 FCB $13 ; right context: _ (non-letter / word boundary) FE2D: 42 FCB $42 ; phoneme PA3 FE2E: 0D FCB $0D ; phoneme TT2 FE2F: 0C FCB $0C ; phoneme IH FE30: 01 FCB $01 ; phoneme PA2 FE31: 95 FCB $95 ; phoneme DD1 (end) ; RULE S[TI]#N = PA3 CH FE32: 33 FCB $33 ; left context: 'S' FE33: E9 FCB $E9 ; match: 'I' FE34: 09 FCB $09 ; right context: # (1+ vowels) FE35: 2E FCB $2E ; right context: 'N' FE36: 42 FCB $42 ; phoneme PA3 FE37: B2 FCB $B2 ; phoneme CH (end) ; RULE [TI]# = SH FE38: E9 FCB $E9 ; match: 'I' FE39: 09 FCB $09 ; right context: # (1+ vowels) FE3A: E5 FCB $E5 ; phoneme SH ; RULE [TUR]# = PA3 CH ER1 FE3B: 75 FCB $75 ; match: 'U' (first) FE3C: B2 FCB $B2 ; match: 'R' (last) FE3D: 09 FCB $09 ; right context: # (1+ vowels) FE3E: 42 FCB $42 ; phoneme PA3 FE3F: 32 FCB $32 ; phoneme CH FE40: B3 FCB $B3 ; phoneme ER1 (end) ; RULE [TU]A = PA3 CH UW1 FE41: F5 FCB $F5 ; match: 'U' FE42: 21 FCB $21 ; right context: 'A' FE43: 42 FCB $42 ; phoneme PA3 FE44: 32 FCB $32 ; phoneme CH FE45: 96 FCB $96 ; phoneme UW1 (end) ; RULE _[TWO] = PA3 TT2 UW2 FE46: 13 FCB $13 ; left context: _ (non-letter / word boundary) FE47: 77 FCB $77 ; match: 'W' (first) FE48: AF FCB $AF ; match: 'O' (last) FE49: 42 FCB $42 ; phoneme PA3 FE4A: 0D FCB $0D ; phoneme TT2 FE4B: 9F FCB $9F ; phoneme UW2 (end) ; RULE [T]T = (nothing) FE4C: FF FCB $FF ; match: empty (key letter only) FE4D: 34 FCB $34 ; right context: 'T' FE4E: FF FCB $FF ; phonemes: none ; RULE [T]S = PA3 TT1 FE4F: FF FCB $FF ; match: empty (key letter only) FE50: 33 FCB $33 ; right context: 'S' FE51: 42 FCB $42 ; phoneme PA3 FE52: 91 FCB $91 ; phoneme TT1 (end) ; RULE [T] = PA3 TT2 FE53: FF FCB $FF ; match: empty (key letter only) FE54: 42 FCB $42 ; phoneme PA3 FE55: 8D FCB $8D ; phoneme TT2 (end) ; RULE _[U]_ = YY1 UW2 FE56: 13 FCB $13 ; left context: _ (non-letter / word boundary) FE57: FF FCB $FF ; match: empty (key letter only) FE58: 13 FCB $13 ; right context: _ (non-letter / word boundary) FE59: 71 FCB $71 ; phoneme YY1 FE5A: 9F FCB $9F ; phoneme UW2 (end) ; RULE [UN]I = YY2 UW1 NN1 FE5B: EE FCB $EE ; match: 'N' FE5C: 29 FCB $29 ; right context: 'I' FE5D: 59 FCB $59 ; phoneme YY2 FE5E: 16 FCB $16 ; phoneme UW1 FE5F: 8B FCB $8B ; phoneme NN1 (end) ; RULE _[UN] = AX NN1 FE60: 13 FCB $13 ; left context: _ (non-letter / word boundary) FE61: EE FCB $EE ; match: 'N' FE62: 4F FCB $4F ; phoneme AX FE63: 8B FCB $8B ; phoneme NN1 (end) ; RULE _[UPO] = AX PA3 PP AA FE64: 13 FCB $13 ; left context: _ (non-letter / word boundary) FE65: 70 FCB $70 ; match: 'P' (first) FE66: AF FCB $AF ; match: 'O' (last) FE67: 4F FCB $4F ; phoneme AX FE68: 02 FCB $02 ; phoneme PA3 FE69: 09 FCB $09 ; phoneme PP FE6A: 98 FCB $98 ; phoneme AA (end) ; RULE @[UR]# = UW1 ER1 FE6B: 0D FCB $0D ; left context: @ (T S R D L Z N J) FE6C: F2 FCB $F2 ; match: 'R' FE6D: 09 FCB $09 ; right context: # (1+ vowels) FE6E: 56 FCB $56 ; phoneme UW1 FE6F: B3 FCB $B3 ; phoneme ER1 (end) ; RULE [UR]# = YY1 UW1 ER1 FE70: F2 FCB $F2 ; match: 'R' FE71: 09 FCB $09 ; right context: # (1+ vowels) FE72: 71 FCB $71 ; phoneme YY1 FE73: 16 FCB $16 ; phoneme UW1 FE74: B3 FCB $B3 ; phoneme ER1 (end) ; RULE [UR]* = ER1 FE75: F2 FCB $F2 ; match: 'R' FE76: 11 FCB $11 ; right context: * (1+ consonants) FE77: F3 FCB $F3 ; phoneme ER1 ; RULE [U]^_ = AX FE78: FF FCB $FF ; match: empty (key letter only) FE79: 0E FCB $0E ; right context: ^ (1 consonant) FE7A: 13 FCB $13 ; right context: _ (non-letter / word boundary) FE7B: CF FCB $CF ; phoneme AX ; RULE [U]^^ = AX FE7C: FF FCB $FF ; match: empty (key letter only) FE7D: 0E FCB $0E ; right context: ^ (1 consonant) FE7E: 0E FCB $0E ; right context: ^ (1 consonant) FE7F: CF FCB $CF ; phoneme AX ; RULE [UY] = AY FE80: F9 FCB $F9 ; match: 'Y' FE81: C6 FCB $C6 ; phoneme AY ; RULE _G[U]# = (nothing) FE82: 13 FCB $13 ; left context: _ (non-letter / word boundary) FE83: 27 FCB $27 ; left context: 'G' FE84: FF FCB $FF ; match: empty (key letter only) FE85: 09 FCB $09 ; right context: # (1+ vowels) FE86: FF FCB $FF ; phonemes: none ; RULE G[U]% = (nothing) FE87: 27 FCB $27 ; left context: 'G' FE88: FF FCB $FF ; match: empty (key letter only) FE89: 0B FCB $0B ; right context: % (suffix E/ER/ES/ED/ELY/ING) FE8A: FF FCB $FF ; phonemes: none ; RULE G[U]# = WW FE8B: 27 FCB $27 ; left context: 'G' FE8C: FF FCB $FF ; match: empty (key letter only) FE8D: 09 FCB $09 ; right context: # (1+ vowels) FE8E: EE FCB $EE ; phoneme WW ; RULE @[U] = UW2 FE8F: 0D FCB $0D ; left context: @ (T S R D L Z N J) FE90: FF FCB $FF ; match: empty (key letter only) FE91: DF FCB $DF ; phoneme UW2 ; RULE [U] = YY1 UW1 FE92: FF FCB $FF ; match: empty (key letter only) FE93: 71 FCB $71 ; phoneme YY1 FE94: 96 FCB $96 ; phoneme UW1 (end) ; RULE _[V]_ = VV IY FE95: 13 FCB $13 ; left context: _ (non-letter / word boundary) FE96: FF FCB $FF ; match: empty (key letter only) FE97: 13 FCB $13 ; right context: _ (non-letter / word boundary) FE98: 63 FCB $63 ; phoneme VV FE99: 93 FCB $93 ; phoneme IY (end) ; RULE [VIEW] = VV YY1 UW2 FE9A: 69 FCB $69 ; match: 'I' (first) FE9B: 25 FCB $25 ; match: 'E' FE9C: B7 FCB $B7 ; match: 'W' (last) FE9D: 63 FCB $63 ; phoneme VV FE9E: 31 FCB $31 ; phoneme YY1 FE9F: 9F FCB $9F ; phoneme UW2 (end) ; RULE [V] = VV FEA0: FF FCB $FF ; match: empty (key letter only) FEA1: E3 FCB $E3 ; phoneme VV ; RULE _[W]_ = PA2 DD2 AX PA2 BB2 EL YY1 UW1 FEA2: 13 FCB $13 ; left context: _ (non-letter / word boundary) FEA3: FF FCB $FF ; match: empty (key letter only) FEA4: 13 FCB $13 ; right context: _ (non-letter / word boundary) FEA5: 41 FCB $41 ; phoneme PA2 FEA6: 21 FCB $21 ; phoneme DD2 FEA7: 0F FCB $0F ; phoneme AX FEA8: 01 FCB $01 ; phoneme PA2 FEA9: 3F FCB $3F ; phoneme BB2 FEAA: 3E FCB $3E ; phoneme EL FEAB: 31 FCB $31 ; phoneme YY1 FEAC: 96 FCB $96 ; phoneme UW1 (end) ; RULE _[WERE] = WW ER2 FEAD: 13 FCB $13 ; left context: _ (non-letter / word boundary) FEAE: 65 FCB $65 ; match: 'E' (first) FEAF: 32 FCB $32 ; match: 'R' FEB0: A5 FCB $A5 ; match: 'E' (last) FEB1: 6E FCB $6E ; phoneme WW FEB2: B4 FCB $B4 ; phoneme ER2 (end) ; RULE _[WAS]_ = WW AX ZZ FEB3: 13 FCB $13 ; left context: _ (non-letter / word boundary) FEB4: 61 FCB $61 ; match: 'A' (first) FEB5: B3 FCB $B3 ; match: 'S' (last) FEB6: 13 FCB $13 ; right context: _ (non-letter / word boundary) FEB7: 6E FCB $6E ; phoneme WW FEB8: 0F FCB $0F ; phoneme AX FEB9: AB FCB $AB ; phoneme ZZ (end) ; RULE [WA]S = WW AA FEBA: E1 FCB $E1 ; match: 'A' FEBB: 33 FCB $33 ; right context: 'S' FEBC: 6E FCB $6E ; phoneme WW FEBD: 98 FCB $98 ; phoneme AA (end) ; RULE [WA]T = WW AO FEBE: E1 FCB $E1 ; match: 'A' FEBF: 34 FCB $34 ; right context: 'T' FEC0: 6E FCB $6E ; phoneme WW FEC1: 97 FCB $97 ; phoneme AO (end) ; RULE [WAN] = WW AA NN1 FEC2: 61 FCB $61 ; match: 'A' (first) FEC3: AE FCB $AE ; match: 'N' (last) FEC4: 6E FCB $6E ; phoneme WW FEC5: 18 FCB $18 ; phoneme AA FEC6: 8B FCB $8B ; phoneme NN1 (end) ; RULE [WHAT] = WH AA PA3 TT2 FEC7: 68 FCB $68 ; match: 'H' (first) FEC8: 21 FCB $21 ; match: 'A' FEC9: B4 FCB $B4 ; match: 'T' (last) FECA: 70 FCB $70 ; phoneme WH FECB: 18 FCB $18 ; phoneme AA FECC: 02 FCB $02 ; phoneme PA3 FECD: 8D FCB $8D ; phoneme TT2 (end) ; RULE [WH]O* = HH2 FECE: E8 FCB $E8 ; match: 'H' FECF: 2F FCB $2F ; right context: 'O' FED0: 11 FCB $11 ; right context: * (1+ consonants) FED1: F9 FCB $F9 ; phoneme HH2 ; RULE [WHO] = HH2 UW2 FED2: 68 FCB $68 ; match: 'H' (first) FED3: AF FCB $AF ; match: 'O' (last) FED4: 79 FCB $79 ; phoneme HH2 FED5: 9F FCB $9F ; phoneme UW2 (end) ; RULE [WO]M = WW AX FED6: EF FCB $EF ; match: 'O' FED7: 2D FCB $2D ; right context: 'M' FED8: 6E FCB $6E ; phoneme WW FED9: 8F FCB $8F ; phoneme AX (end) ; RULE [WH] = WH FEDA: E8 FCB $E8 ; match: 'H' FEDB: F0 FCB $F0 ; phoneme WH ; RULE [WAR] = WW OR FEDC: 61 FCB $61 ; match: 'A' (first) FEDD: B2 FCB $B2 ; match: 'R' (last) FEDE: 6E FCB $6E ; phoneme WW FEDF: BA FCB $BA ; phoneme OR (end) ; RULE [WOR]^ = WW ER1 FEE0: 6F FCB $6F ; match: 'O' (first) FEE1: B2 FCB $B2 ; match: 'R' (last) FEE2: 0E FCB $0E ; right context: ^ (1 consonant) FEE3: 6E FCB $6E ; phoneme WW FEE4: B3 FCB $B3 ; phoneme ER1 (end) ; RULE [WR] = RR1 FEE5: F2 FCB $F2 ; match: 'R' FEE6: CE FCB $CE ; phoneme RR1 ; RULE [W] = WW FEE7: FF FCB $FF ; match: empty (key letter only) FEE8: EE FCB $EE ; phoneme WW ; RULE _[X]_ = EH PA3 KK2 SS FEE9: 13 FCB $13 ; left context: _ (non-letter / word boundary) FEEA: FF FCB $FF ; match: empty (key letter only) FEEB: 13 FCB $13 ; right context: _ (non-letter / word boundary) FEEC: 47 FCB $47 ; phoneme EH FEED: 02 FCB $02 ; phoneme PA3 FEEE: 29 FCB $29 ; phoneme KK2 FEEF: B7 FCB $B7 ; phoneme SS (end) ; RULE _[X] = ZZ FEF0: 13 FCB $13 ; left context: _ (non-letter / word boundary) FEF1: FF FCB $FF ; match: empty (key letter only) FEF2: EB FCB $EB ; phoneme ZZ ; RULE [X] = PA3 KK2 SS FEF3: FF FCB $FF ; match: empty (key letter only) FEF4: 42 FCB $42 ; phoneme PA3 FEF5: 29 FCB $29 ; phoneme KK2 FEF6: B7 FCB $B7 ; phoneme SS (end) ; RULE [YOUR] = YY2 OR FEF7: 6F FCB $6F ; match: 'O' (first) FEF8: 35 FCB $35 ; match: 'U' FEF9: B2 FCB $B2 ; match: 'R' (last) FEFA: 59 FCB $59 ; phoneme YY2 FEFB: BA FCB $BA ; phoneme OR (end) ; RULE _[Y]_ = WW AY FEFC: 13 FCB $13 ; left context: _ (non-letter / word boundary) FEFD: FF FCB $FF ; match: empty (key letter only) FEFE: 13 FCB $13 ; right context: _ (non-letter / word boundary) FEFF: 6E FCB $6E ; phoneme WW FF00: 86 FCB $86 ; phoneme AY (end) ; RULE [YOUNG] = YY2 AX NG FF01: 6F FCB $6F ; match: 'O' (first) FF02: 35 FCB $35 ; match: 'U' FF03: 2E FCB $2E ; match: 'N' FF04: A7 FCB $A7 ; match: 'G' (last) FF05: 59 FCB $59 ; phoneme YY2 FF06: 0F FCB $0F ; phoneme AX FF07: AC FCB $AC ; phoneme NG (end) ; RULE _[YOU] = YY2 UW2 FF08: 13 FCB $13 ; left context: _ (non-letter / word boundary) FF09: 6F FCB $6F ; match: 'O' (first) FF0A: B5 FCB $B5 ; match: 'U' (last) FF0B: 59 FCB $59 ; phoneme YY2 FF0C: 9F FCB $9F ; phoneme UW2 (end) ; RULE [YEAR]: = YY2 YR FF0D: 65 FCB $65 ; match: 'E' (first) FF0E: 21 FCB $21 ; match: 'A' FF0F: B2 FCB $B2 ; match: 'R' (last) FF10: 10 FCB $10 ; right context: : (0+ consonants) FF11: 59 FCB $59 ; phoneme YY2 FF12: BC FCB $BC ; phoneme YR (end) ; RULE _[YES] = YY2 EH SS SS FF13: 13 FCB $13 ; left context: _ (non-letter / word boundary) FF14: 65 FCB $65 ; match: 'E' (first) FF15: B3 FCB $B3 ; match: 'S' (last) FF16: 59 FCB $59 ; phoneme YY2 FF17: 07 FCB $07 ; phoneme EH FF18: 37 FCB $37 ; phoneme SS FF19: B7 FCB $B7 ; phoneme SS (end) ; RULE _[Y] = YY2 FF1A: 13 FCB $13 ; left context: _ (non-letter / word boundary) FF1B: FF FCB $FF ; match: empty (key letter only) FF1C: D9 FCB $D9 ; phoneme YY2 ; RULE #*[Y]_ = IY FF1D: 09 FCB $09 ; left context: # (1+ vowels) FF1E: 11 FCB $11 ; left context: * (1+ consonants) FF1F: FF FCB $FF ; match: empty (key letter only) FF20: 13 FCB $13 ; right context: _ (non-letter / word boundary) FF21: D3 FCB $D3 ; phoneme IY ; RULE #*[Y]I = IY FF22: 09 FCB $09 ; left context: # (1+ vowels) FF23: 11 FCB $11 ; left context: * (1+ consonants) FF24: FF FCB $FF ; match: empty (key letter only) FF25: 29 FCB $29 ; right context: 'I' FF26: D3 FCB $D3 ; phoneme IY ; RULE _:[Y]_ = AY FF27: 13 FCB $13 ; left context: _ (non-letter / word boundary) FF28: 10 FCB $10 ; left context: : (0+ consonants) FF29: FF FCB $FF ; match: empty (key letter only) FF2A: 13 FCB $13 ; right context: _ (non-letter / word boundary) FF2B: C6 FCB $C6 ; phoneme AY ; RULE _:[Y]# = AY FF2C: 13 FCB $13 ; left context: _ (non-letter / word boundary) FF2D: 10 FCB $10 ; left context: : (0+ consonants) FF2E: FF FCB $FF ; match: empty (key letter only) FF2F: 09 FCB $09 ; right context: # (1+ vowels) FF30: C6 FCB $C6 ; phoneme AY ; RULE _:[Y]^+:# = IH FF31: 13 FCB $13 ; left context: _ (non-letter / word boundary) FF32: 10 FCB $10 ; left context: : (0+ consonants) FF33: FF FCB $FF ; match: empty (key letter only) FF34: 0E FCB $0E ; right context: ^ (1 consonant) FF35: 0F FCB $0F ; right context: + (front vowel E I Y) FF36: 10 FCB $10 ; right context: : (0+ consonants) FF37: 09 FCB $09 ; right context: # (1+ vowels) FF38: CC FCB $CC ; phoneme IH ; RULE _:[Y]^# = AY FF39: 13 FCB $13 ; left context: _ (non-letter / word boundary) FF3A: 10 FCB $10 ; left context: : (0+ consonants) FF3B: FF FCB $FF ; match: empty (key letter only) FF3C: 0E FCB $0E ; right context: ^ (1 consonant) FF3D: 09 FCB $09 ; right context: # (1+ vowels) FF3E: C6 FCB $C6 ; phoneme AY ; RULE [Y] = IH FF3F: FF FCB $FF ; match: empty (key letter only) FF40: CC FCB $CC ; phoneme IH ; RULE _[Z]_ = ZZ IY FF41: 13 FCB $13 ; left context: _ (non-letter / word boundary) FF42: FF FCB $FF ; match: empty (key letter only) FF43: 13 FCB $13 ; right context: _ (non-letter / word boundary) FF44: 6B FCB $6B ; phoneme ZZ FF45: 93 FCB $93 ; phoneme IY (end) ; RULE [Z]Z = (nothing) FF46: FF FCB $FF ; match: empty (key letter only) FF47: 3A FCB $3A ; right context: 'Z' FF48: FF FCB $FF ; phonemes: none ; RULE [Z] = ZZ FF49: FF FCB $FF ; match: empty (key letter only) FF4A: EB FCB $EB ; phoneme ZZ ; TABLE Digit rules ('0'-'9' spoken as words) FF4B: D0 FCB $D0 ; match: digit '0' FF4C: 6B FCB $6B ; phoneme ZZ FF4D: 3C FCB $3C ; phoneme YR FF4E: B5 FCB $B5 ; phoneme OW (end) ; RULE [1] = WW AX NN1 FF4F: D1 FCB $D1 ; match: digit '1' FF50: 6E FCB $6E ; phoneme WW FF51: 0F FCB $0F ; phoneme AX FF52: 8B FCB $8B ; phoneme NN1 (end) ; RULE [2] = PA3 TT2 UW2 FF53: D2 FCB $D2 ; match: digit '2' FF54: 42 FCB $42 ; phoneme PA3 FF55: 0D FCB $0D ; phoneme TT2 FF56: 9F FCB $9F ; phoneme UW2 (end) ; RULE [3] = TH RR1 IY FF57: D3 FCB $D3 ; match: digit '3' FF58: 5D FCB $5D ; phoneme TH FF59: 0E FCB $0E ; phoneme RR1 FF5A: 93 FCB $93 ; phoneme IY (end) ; RULE [4] = FF OR FF5B: D4 FCB $D4 ; match: digit '4' FF5C: 68 FCB $68 ; phoneme FF FF5D: BA FCB $BA ; phoneme OR (end) ; RULE [5] = FF AY VV FF5E: D5 FCB $D5 ; match: digit '5' FF5F: 68 FCB $68 ; phoneme FF FF60: 06 FCB $06 ; phoneme AY FF61: A3 FCB $A3 ; phoneme VV (end) ; RULE [6] = SS SS IH PA3 KK2 SS FF62: D6 FCB $D6 ; match: digit '6' FF63: 77 FCB $77 ; phoneme SS FF64: 37 FCB $37 ; phoneme SS FF65: 0C FCB $0C ; phoneme IH FF66: 02 FCB $02 ; phoneme PA3 FF67: 29 FCB $29 ; phoneme KK2 FF68: B7 FCB $B7 ; phoneme SS (end) ; RULE [7] = SS SS EH VV IH NN1 FF69: D7 FCB $D7 ; match: digit '7' FF6A: 77 FCB $77 ; phoneme SS FF6B: 37 FCB $37 ; phoneme SS FF6C: 07 FCB $07 ; phoneme EH FF6D: 23 FCB $23 ; phoneme VV FF6E: 0C FCB $0C ; phoneme IH FF6F: 8B FCB $8B ; phoneme NN1 (end) ; RULE [8] = EY PA3 TT2 FF70: D8 FCB $D8 ; match: digit '8' FF71: 54 FCB $54 ; phoneme EY FF72: 02 FCB $02 ; phoneme PA3 FF73: 8D FCB $8D ; phoneme TT2 (end) ; RULE [9] = NN1 AY NN1 FF74: D9 FCB $D9 ; match: digit '9' FF75: 4B FCB $4B ; phoneme NN1 FF76: 06 FCB $06 ; phoneme AY FF77: 8B FCB $8B ; phoneme NN1 (end) ; RULE [^] = NN2 FF78: FE FCB $FE ; match: digit '^' ; TABLE Rule pointers: punctuation, A-Z, then digits via TRAP 14 (word table, 2 bytes each) FF79: F8 FCB $F8 ; punct -> $F811 (high) FF7A: 11 FCB $11 ; (low) FF7B: F8 FCB $F8 ; A -> $F83E (high) FF7C: 3E FCB $3E ; (low) FF7D: F8 FCB $F8 ; B -> $F8CE (high) FF7E: CE FCB $CE ; (low) FF7F: F9 FCB $F9 ; C -> $F918 (high) FF80: 18 FCB $18 ; (low) FF81: F9 FCB $F9 ; D -> $F951 (high) FF82: 51 FCB $51 ; (low) FF83: F9 FCB $F9 ; E -> $F9A5 (high) FF84: A5 FCB $A5 ; (low) FF85: FA FCB $FA ; F -> $FA5B (high) FF86: 5B FCB $5B ; (low) FF87: FA FCB $FA ; G -> $FA6D (high) FF88: 6D FCB $6D ; (low) FF89: FA FCB $FA ; H -> $FAB1 (high) FF8A: B1 FCB $B1 ; (low) FF8B: FA FCB $FA ; I -> $FAE0 (high) FF8C: E0 FCB $E0 ; (low) FF8D: FB FCB $FB ; J -> $FB4C (high) FF8E: 4C FCB $4C ; (low) FF8F: FB FCB $FB ; K -> $FB55 (high) FF90: 55 FCB $55 ; (low) FF91: FB FCB $FB ; L -> $FB66 (high) FF92: 66 FCB $66 ; (low) FF93: FB FCB $FB ; M -> $FB84 (high) FF94: 84 FCB $84 ; (low) FF95: FB FCB $FB ; N -> $FB96 (high) FF96: 96 FCB $96 ; (low) FF97: FB FCB $FB ; O -> $FBDC (high) FF98: DC FCB $DC ; (low) FF99: FC FCB $FC ; P -> $FCD4 (high) FF9A: D4 FCB $D4 ; (low) FF9B: FD FCB $FD ; Q -> $FD00 (high) FF9C: 00 FCB $00 ; (low) FF9D: FD FCB $FD ; R -> $FD19 (high) FF9E: 19 FCB $19 ; (low) FF9F: FD FCB $FD ; S -> $FD2B (high) FFA0: 2B FCB $2B ; (low) FFA1: FD FCB $FD ; T -> $FD99 (high) FFA2: 99 FCB $99 ; (low) FFA3: FE FCB $FE ; U -> $FE56 (high) FFA4: 56 FCB $56 ; (low) FFA5: FE FCB $FE ; V -> $FE95 (high) FFA6: 95 FCB $95 ; (low) FFA7: FE FCB $FE ; W -> $FEA2 (high) FFA8: A2 FCB $A2 ; (low) FFA9: FE FCB $FE ; X -> $FEE9 (high) FFAA: E9 FCB $E9 ; (low) FFAB: FE FCB $FE ; Y -> $FEF7 (high) FFAC: F7 FCB $F7 ; (low) FFAD: FF FCB $FF ; Z -> $FF41 (high) FFAE: 41 FCB $41 ; (low) FFAF: FF FCB $FF ; digits -> $FF4B (high) FFB0: 4B FCB $4B ; (low) ; PADDING FFB1: 00 FCB $00 ; unused (zero fill) FFB2: 00 FCB $00 ; unused (zero fill) FFB3: 00 FCB $00 ; unused (zero fill) FFB4: 00 FCB $00 ; unused (zero fill) FFB5: 00 FCB $00 ; unused (zero fill) FFB6: 00 FCB $00 ; unused (zero fill) FFB7: 00 FCB $00 ; unused (zero fill) FFB8: 00 FCB $00 ; unused (zero fill) FFB9: 00 FCB $00 ; unused (zero fill) FFBA: 00 FCB $00 ; unused (zero fill) FFBB: 00 FCB $00 ; unused (zero fill) FFBC: 00 FCB $00 ; unused (zero fill) FFBD: 00 FCB $00 ; unused (zero fill) FFBE: 00 FCB $00 ; unused (zero fill) FFBF: 00 FCB $00 ; unused (zero fill) FFC0: 00 FCB $00 ; unused (zero fill) FFC1: 00 FCB $00 ; unused (zero fill) FFC2: 00 FCB $00 ; unused (zero fill) FFC3: 00 FCB $00 ; unused (zero fill) FFC4: 00 FCB $00 ; unused (zero fill) FFC5: 00 FCB $00 ; unused (zero fill) FFC6: 00 FCB $00 ; unused (zero fill) FFC7: 00 FCB $00 ; unused (zero fill) FFC8: 00 FCB $00 ; unused (zero fill) FFC9: 00 FCB $00 ; unused (zero fill) FFCA: 00 FCB $00 ; unused (zero fill) FFCB: 00 FCB $00 ; unused (zero fill) FFCC: 00 FCB $00 ; unused (zero fill) FFCD: 00 FCB $00 ; unused (zero fill) FFCE: 00 FCB $00 ; unused (zero fill) FFCF: 00 FCB $00 ; unused (zero fill) FFD0: 00 00 FDB $0000 ; TRAP_23 FFD2: 00 00 FDB $0000 ; TRAP_22 FFD4: 00 00 FDB $0000 ; TRAP_21 FFD6: 00 00 FDB $0000 ; TRAP_20 FFD8: F7 EB FDB $F7EB ; TRAP_19 - step cursor back FFDA: F7 C9 FDB $F7C9 ; TRAP_18 - skip class run FFDC: F7 A6 FDB $F7A6 ; TRAP_17 - last token? FFDE: F5 43 FDB $F543 ; TRAP_16 - skip to marked byte FFE0: F6 07 FDB $F607 ; TRAP_15 - match context FFE2: F4 81 FDB $F481 ; TRAP_14 - classify char FFE4: F4 C1 FDB $F4C1 ; TRAP_13 - translate char FFE6: F2 6A FDB $F26A ; TRAP_12 - block access FFE8: F7 E0 FDB $F7E0 ; TRAP_11 - cursor step FFEA: F7 7C FDB $F77C ; TRAP_10 - fetch char FFEC: F5 BD FDB $F5BD ; TRAP_9 - letter class FFEE: F2 06 FDB $F206 ; TRAP_8 - AY write FFF0: F2 02 FDB $F202 ; TRAP_7 - AY write (int-safe) FFF2: F1 0B FDB $F10B ; TRAP_6 - queue op FFF4: F2 66 FDB $F266 ; TRAP_5 - block op (int-safe) FFF6: F1 07 FDB $F107 ; TRAP_4 - queue op (int-safe) FFF8: F0 12 FDB $F012 ; INT3 - host byte FFFA: F0 33 FDB $F033 ; INT2 - timer tick FFFC: F2 1C FDB $F21C ; INT1 - SP0256 request FFFE: F0 00 FDB $F000 ; RESET (INT0) - reset