Freeware assember ASxx.EXE Ver 1.03. 0001 * > demon *************************************************************** 0002 * * 0003 * The makers of "The chip that says KUTTEKOP" * 0004 * * 0005 * and * 0006 * * 0007 * "The Bit-Blasting Page-O-Matic" * 0008 * * 0009 * now proudly present * 0010 * * 0011 * "The Deafening Demon-Dialer" * 0012 * * 0013 ************************************************************************* 0014 0015 0000 PORTA EQU $00 0016 0001 PORTB EQU $01 0017 0002 PORTC EQU $02 0018 0003 PORTD EQU $03 in,-,SS*,SCK;MOSI,MISO,TxD,RxD 0019 0004 DDRA EQU $04 Data direction, Port A 0020 0005 DDRB EQU $05 Data direction, Port B 0021 0006 DDRC EQU $06 Data direction, Port C 0022 000a SPCR EQU $0A SPIE,SPE,-,MSTR;CPOL,CPHA,SPR1,SPR0 0023 000b SPSR EQU $0B SPIF,WCOL,-,MODF;-,-,-,- 0024 000c SPDR EQU $0C SPI Data 0025 000d BAUD EQU $0D -,-,SCP1,SCP0;-,SCR2,SCR1,SCR0 0026 000e SCCR1 EQU $0E R8,T8,-,M;WAKE,-,-,- 0027 000f SCCR2 EQU $0F TIE,TCIE,RIE,ILIE;TE,RE,RWU,SBK 0028 0010 SCSR EQU $10 TDRE,TC,RDRF,IDLE;OR,NF,FE,- 0029 0011 SCDAT EQU $11 SCI Data 0030 0012 TCR EQU $12 ICIE,OCIE,TOIE,0; 0,0,IEGE,OLVL 0031 0013 TSR EQU $13 ICF,OCF,TOF,0; 0,0,0,0 0032 0014 ICAP EQU $14 Input Capture Reg (Hi-$14, Lo-$15) 0033 0016 OCMP EQU $16 Output Compare Reg (Hi-$16, Lo-$17) 0034 0018 TCNT EQU $18 Timer Count Reg (Hi-$18, Lo-$19) 0035 001a ALTCNT EQU $1A Alternate Count Reg (Hi-$1A, Lo-$1B) 0036 001c PROG EQU $1C Program register 0037 001d COPR EQU $1D COP Reset register (write $55, then $AA to reset) 0038 001e COPC EQU $1E -,-,-,COPF; CME,COPE,CM1,CM0 0039 0040 1fdf OPTION EQU $1FDF 0041 0042 * Baud rate equates for BAUD register (at 4.0 MHz crystal) 0043 0044 0037 B75 EQU %00110111 0045 0036 B150 EQU %00110110 0046 0035 B300 EQU %00110101 0047 0034 B600 EQU %00110100 0048 0033 B1200 EQU %00110011 0049 0032 B2400 EQU %00110010 0050 0031 B4800 EQU %00110001 0051 0030 B9600 EQU %00110000 0052 0053 000d CR EQU 13 0054 000a LF EQU 10 0055 0056 006b MAXFREQ EQU 107 Maximum freq # in frequency table 0057 0064 MAXKEYS EQU 100 Maximum number of programmable key area bytes 0058 0059 3cf0 ATF1_LO EQU 1950*8 Low frequency (1950 Hz) of ATF1 0060 40b0 ATF1_HI EQU 2070*8 High frequency (2070 Hz) of ATF1 0061 ffb0 ATF1_TM EQU 65536-10*8 Bit time of ATF1 (10 ms) 0062 0063 0064 0030 ORG $0030 0065 0066 0030 TONE1CT RMB 2 Tone 1 counter value 0067 0032 TONE1ST RMB 2 Tone 1 step value 0068 0034 TONE2CT RMB 2 Tone 2 counter value 0069 0036 TONE2ST RMB 2 Tone 2 step value 0070 0038 TONE3CT RMB 2 Tone 3 counter value 0071 003a TONE3ST RMB 2 Tone 3 step value 0072 003c TONEOUT RMB 1 0073 003d TONE1 RMB 3 This RAM space is allocated to hold jump instructions 0074 0040 TONE2 RMB 3 into the routines that handle the tone producing bit 0075 0043 TONE3 RMB 3 0076 0046 TICKER RMB 2 8.192 kHz ticker, which allows tone lengths to 8 secs 0077 0048 NEXTSTR RMB 1 Strobe to indicate next tone parms are to be loaded 0078 0079 0049 TIMEOUT RMB 1 Time-out counter for auto power-off function 0080 004a TIMOUTA RMB 1 Time-out counter for audio-off 0081 0082 004b KEYBUF RMB 4 4-byte keyboard buffer 0083 004f KEYS RMB 1 # of keys in keyboard buffer 0084 0050 KEYCNT RMB 1 Keyboard counter 0085 0051 KEYSTAT RMB 1 Keyboard status 0086 0087 0052 SERSTAT RMB 1 Status of serial keyboard fake 0088 0089 0053 TEMP1 RMB 1 Temporary storage for main program (not interrupt) 0090 0054 TEMP2 RMB 1 Secondary temp storage 0091 0055 TEMP3 RMB 1 Third temp storage 0092 0056 TEMP4 RMB 1 Guess 0093 0057 TEMP5 RMB 1 Boring 0094 0058 TEMP6 RMB 1 0095 0096 0059 VALUE RMB 2 2-byte value entered from keyboard 0097 0098 005b MODE RMB 1 0099 0100 ************************************************************************* 0101 * * 0102 * MODE : Current operating mode * 0103 * * 0104 * The mode byte format is : * 0105 * * 0106 * piom mmmm * 0107 * * 0108 * p : password is entered correctly * * 0109 * i : key is played in macro * 0110 * o : password protection off when set * 0111 * mmmmm : current mode * 0112 * * 0113 ************************************************************************* 0114 0115 005c MACKEYS RMB 1 # keys total macro space (10-96) 0116 005d MACCNT RMB 1 Macro counter 0117 005e MACNCNT RMB 2 Macro counters for nested macros (two maximum) 0118 0060 MACMCNT RMB 2 Macro counters for nested macros for marker (2 max) 0119 0062 MACNEST RMB 1 Macro level nesting count (Bits 1&0). Bit 7 indicates 0120 * non-pauseable macro is being played. 0121 * Bit 6 indicates pauseable mode 4 temp marker bit. 0122 * Bit 5 means don't set timeout on AUDIOFF. 0123 * Bit 4 means in-macro-mode scan. 0124 * Bits 3&2 indicate marker's nesting level. 0125 0063 MARKER RMB 1 Marker used in pauseable macros 0126 0127 0064 MACAL RMB 1 Macro alias two nibbles (0-9 or 11 when off) 0128 0129 0065 MACSCAN RMB 1 In-Macro-Scanning: two nibbles: Macro/Count Macro 0130 0066 MACSCNT RMB 1 I-M-S Scan count increment/decrement amount 0131 0132 0067 GUARD RMB 3 Three guard frequencies, high bit of the first 0133 * indicates guard tone on 0134 0135 006a TIMTMPL RMB 16 The time templates hold room for 8 timing values 0136 0137 007a GETBYTE RMB 4 These RAM locations hold instructions LDA ix2,X RTS 0138 007b LOC EQU GETBYTE+1 0139 0140 007e US2OFS RMB 1 Offset into key area for start of user mode 2 0141 007f MODKEYS RMB 1 Total # of keys in key area 0142 0080 KEYAREA RMB MAXKEYS 0143 00e4 RMB 1 Dummy byte (used by programmer to check end of keyarea) 0144 0145 ************************************************************************* 0146 * * 0147 * KEYAREA : This area holds the definitions for two user modes * 0148 * * 0149 * The format for the keys is exactly the same as those of the ROM modes * 0150 * * 0151 * First byte of a key : lnnt thhh * 0152 * l when set indicates last tone of key * 0153 * nn - # of tones (0,1,2) * 0154 * tt - 0 means play fixed time hhh=high 3 bits * 0155 * 1 means play while pressed if not in * 0156 * macro, else fixed time * 0157 * 2 means play template time hhh=index * 0158 * 3 means play while pressed if not in * 0159 * macro, else template time hhh=index * 0160 * * 0161 * If fixed time then next byte is lower 8 bits of time in 1/1024 secs * 0162 * If tones <> 0 then : aaaa bbbb * 0163 * aaaa - dB level tone a * 0164 * bbbb - dB level tone b * 0165 * Then for each tone a byte which is index into frequency table * 0166 * * 0167 * * 0168 * !! NB The RAM key area is growing into the stack, but since we don't * 0169 * use the entire stack this will work fine. (probably) * 0170 * * 0171 ************************************************************************* 0172 0173 0100 ORG $0100 0174 0175 ************************************************************************* 0176 * * 0177 * MACROS : The macro area * 0178 * * 0179 * This area holds up to 96 6-bit macro entries. The macro entry format * 0180 * is : * 0181 * * 0182 * 0skkkk : key code skkkk where s means shift and kkkk 4-bit key * 0183 * kkkk = 0-11 for non-shifted and 0-9 for shifted keys * 0184 * * 0185 * 001100 : start guard tone 0 * 0186 * 001101 : start guard tone 1 * 0187 * 001110 : start guard tone 2 * 0188 * 001111 : stop guard tone * 0189 * * 0190 * The next 5 entries don't apply in non-pauseable macro mode * 0191 * * 0192 * 011100 : marker * 0193 * 011101 : wait for shift-press * 0194 * 011110 : if shift-pressed wait for release and another press * 0195 * 011111 : if shift-pressed wait for release, then if pressed * 0196 * within 125 ms continue else goto marker * 0197 * 111110 : marker AND wait for shift-press * * 0198 * * 0199 * 1mmmmm : mode mmmmm, switches between modes * 0200 * mmmmm = 0-19 * 0201 * * 0202 * 1mmmmm : macro mmmmm, allows up to two nested macros * 0203 * mmmmm = 20-29 * 0204 * * 0205 * 111111 : end of macro * 0206 * * 0207 ************************************************************************* 0208 0209 0210 0100 MACROS RMB 72 72 bytes (96 entries) of macro room 0211 0212 ************************************************************************* 0213 * * 0214 * FREQTBL : 100-entries frequency table * 0215 * * 0216 * This table holds 12 programmable and 88 fixed frequencies. The lower * 0217 * part of the table is in RAM and the upper part is in ROM. * 0218 * * 0219 ************************************************************************* 0220 0221 0148 ORG $0148 0222 0223 0148 FREQTBL RMB 24 Reserve room for 12 user definable frequecies 0224 0225 0160 15 e0 FDB 5600 12 - 700 Hz - 0226 0162 1c 20 FDB 7200 13 - 900 Hz | 0227 0164 22 60 FDB 8800 14 - 1100 Hz |- MF 0228 0166 28 a0 FDB 10400 15 - 1300 Hz | 0229 0168 2e e0 FDB 12000 16 - 1500 Hz | 0230 016a 35 20 FDB 13600 17 - 1700 Hz - 0231 0232 016c 15 b6 FDB 5558 18 - 694.8 Hz - 0233 016e 18 11 FDB 6161 19 - 770.1 Hz | 0234 0170 1a a3 FDB 6819 20 - 852.4 Hz | 0235 0172 1d 60 FDB 7520 21 - 940.0 Hz | 0236 0174 25 b0 FDB 9648 22 - 1206.0 Hz |- FDTMF 0237 0176 29 9e FDB 10654 23 - 1331.7 Hz | 0238 0178 2e 74 FDB 11892 24 - 1486.5 Hz | 0239 017a 33 38 FDB 13112 25 - 1639.0 Hz - 0240 0241 017c 2b 20 FDB 11040 26 - 1380 Hz - 0242 017e 2e e0 FDB 12000 27 - 1500 Hz | 0243 0180 32 a0 FDB 12960 28 - 1620 Hz | 0244 0182 36 60 FDB 13920 29 - 1740 Hz |- R2 Forward 0245 0184 3a 20 FDB 14880 30 - 1860 Hz | 0246 0186 3d e0 FDB 15840 31 - 1980 Hz - 0247 0248 0188 23 a0 FDB 9120 32 - 1140 Hz - 0249 018a 1f e0 FDB 8160 33 - 1020 Hz | 0250 018c 1c 20 FDB 7200 34 - 900 Hz | 0251 018e 18 60 FDB 6240 35 - 780 Hz |- R2 Backward 0252 0190 14 a0 FDB 5280 36 - 660 Hz | 0253 0192 10 e0 FDB 4320 37 - 540 Hz - 0254 0255 0194 2e e0 FDB 12000 38 - 1500 Hz - 0256 0196 35 20 FDB 13600 39 - 1700 Hz |- Red 0257 0198 44 c0 FDB 17600 40 - 2200 Hz - 0258 0259 019a 3c f0 FDB 15600 41 - 1950 Hz - 0260 019c 40 b0 FDB 16560 42 - 2070 Hz }- ATF1 0261 0262 019e 12 c0 FDB 4800 43 - 600 Hz - 0263 01a0 17 70 FDB 6000 44 - 750 Hz | 0264 01a2 25 80 FDB 9600 45 - 1200 Hz | 0265 01a4 32 00 FDB 12800 46 - 1600 Hz | 0266 01a6 32 c8 FDB 13000 47 - 1625 Hz | 0267 01a8 35 20 FDB 13600 48 - 1700 Hz | 0268 01aa 3b 60 FDB 15200 49 - 1900 Hz | 0269 01ac 3f c0 FDB 16320 50 - 2040 Hz | 0270 01ae 41 a0 FDB 16800 51 - 2100 Hz |- Pliek 0271 01b0 47 f4 FDB 18420 52 - 2280 Hz | 0272 01b2 4b 00 FDB 19200 53 - 2400 Hz | 0273 01b4 4e 20 FDB 20000 54 - 2500 Hz | 0274 01b6 51 40 FDB 20800 55 - 2600 Hz | 0275 01b8 5d c0 FDB 24000 56 - 3000 Hz | 0276 01ba 68 b0 FDB 26800 57 - 3350 Hz | 0277 01bc 77 88 FDB 30600 58 - 3825 Hz - 0278 0279 01be 04 98 FDB 1176 59 - 147 Hz _ 0280 01c0 0a f0 FDB 2800 60 - 350 Hz | 0281 01c2 0c 80 FDB 3200 61 - 400 Hz | 0282 01c4 0d c0 FDB 3520 62 - 440 Hz | 0283 01c6 0e 10 FDB 3600 63 - 450 Hz |- Call Progress 0284 01c8 0f 00 FDB 3840 64 - 480 Hz | 0285 01ca 0f a0 FDB 4000 65 - 500 Hz | 0286 01cc 13 60 FDB 4960 66 - 620 Hz - 0287 0288 01ce 1d b0 FDB 7600 67 - 950 Hz - 0289 01d0 2b c0 FDB 11200 68 - 1400 Hz |- SIT 0290 01d2 38 40 FDB 14400 69 - 1800 Hz - 0291 0292 01d4 2b c0 FDB 11200 70 - 1400 Hz - 0293 01d6 39 d0 FDB 14800 71 - 1850 Hz | 0294 01d8 4c 90 FDB 19600 72 - 2450 Hz |- Call Progress HI 0295 01da 51 40 FDB 20800 73 - 2600 Hz - 0296 0297 01dc 00 00 FDB 0 74 - 0 Hz - 0298 01de 3e 80 FDB 16000 75 - 2000 Hz |- Special 0299 01e0 54 60 FDB 21600 76 - 2700 Hz - 0300 0301 01e2 04 b0 FDB 1200 77 - 150 Hz - Call Progress 0302 01e4 11 30 FDB 4400 78 - 550 Hz - Modem tone 0303 01e6 1a a8 FDB 6824 79 - 853 Hz - EBS 0304 01e8 1e 00 FDB 7680 80 - 960 Hz - EBS 0305 01ea 21 70 FDB 8560 81 - 1060 Hz - Modem tone 0306 01ec 27 b0 FDB 10160 82 - 1270 Hz - Modem tone 0307 01ee 3f 48 FDB 16200 83 - 2025 Hz - Modem tone 0308 01f0 45 88 FDB 17800 84 - 2225 Hz - Modem tone 0309 01f2 54 c8 FDB 21704 85 - 2713 Hz - Loopback 0310 01f4 55 f0 FDB 22000 86 - 2750 Hz - Guard 0311 01f6 57 80 FDB 22400 87 - 2800 Hz - Guard 0312 01f8 59 10 FDB 22800 88 - 2850 Hz - Guard 0313 01fa 5a a0 FDB 23200 89 - 2900 Hz - Guard 0314 01fc 5c 30 FDB 23600 90 - 2950 Hz - Guard 0315 0316 01fe 24 40 FDB 9280 91 - 1160 Hz - Tone slot 0317 0200 2f d0 FDB 12240 92 - 1530 Hz - Tone slot 0318 0202 34 30 FDB 13360 93 - 1670 Hz - Tone slot 0319 0204 39 30 FDB 14640 94 - 1830 Hz - Tone slot 0320 0321 0322 * Start of code 0323 0324 0206 9c RESET RSP Cold boot, power on reset, total machine init 0325 0207 a6 c0 LDA #%11000000 0326 0209 c7 1f df STA OPTION Turn all RAM on 0327 0328 020c a6 df LDA #%11011111 Port A pin 5 is switched to input (NILS !*&!*@!) 0329 020e b7 04 STA DDRA 0330 0210 a6 ff LDA #%11111111 Switch ports B & C to outputs 0331 0212 b7 05 STA DDRB 0332 0214 b7 06 STA DDRC 0333 0334 0216 16 01 BSET 3,PORTB Switch on power upper 0335 0336 0218 cd 07 74 JSR DEVINIT 0337 0338 021b 9c INIT RSP Warm boot, only init ports etc. 0339 0340 021c 3f 00 CLR PORTA 0341 021e a6 0f LDA #%00001111 Enable all keyboard columns and switch on 0342 0220 b7 01 STA PORTB power upper and set external bit to 0 0343 0222 a6 80 LDA #%10000000 Switch off audio on init 0344 0224 b7 02 STA PORTC 0345 0346 0226 a6 cc LDA #$CC $cc = JMP instruction 0347 0228 b7 3d STA TONE1 This is a very dirty trick we're using here 0348 022a b7 40 STA TONE2 The RAM locations TONE1, TONE2 and TONE3 are 0349 022c b7 43 STA TONE3 used to hold jump instructions 0350 0351 022e c6 14 83 LDA JUMPTB1+30 Program the jump addresses at init, else 0352 0231 b7 3e STA TONE1+1 the program will crash 0353 0233 c6 14 84 LDA JUMPTB1+31 The init sound levels are -15 dB 0354 0236 b7 3f STA TONE1+2 0355 0356 0238 c6 14 a3 LDA JUMPTB2+30 0357 023b b7 41 STA TONE2+1 0358 023d c6 14 a4 LDA JUMPTB2+31 0359 0240 b7 42 STA TONE2+2 0360 0361 0242 c6 14 c3 LDA JUMPTB3+30 0362 0245 b7 44 STA TONE3+1 0363 0247 c6 14 c4 LDA JUMPTB3+31 0364 024a b7 45 STA TONE3+2 0365 0366 024c 3f 30 CLR TONE1CT at 50% DC level (0 Hz init) 0367 024e 3f 31 CLR TONE1CT+1 0368 0250 3f 32 CLR TONE1ST 0369 0252 3f 33 CLR TONE1ST+1 0370 0254 3f 34 CLR TONE2CT 0371 0256 3f 35 CLR TONE2CT+1 0372 0258 3f 36 CLR TONE2ST 0373 025a 3f 37 CLR TONE2ST+1 0374 025c 3f 38 CLR TONE3CT 0375 025e 3f 39 CLR TONE3CT+1 0376 0260 3f 3a CLR TONE3ST 0377 0262 3f 3b CLR TONE3ST+1 0378 0379 0264 3f 46 CLR TICKER 0380 0266 3f 47 CLR TICKER+1 0381 0382 0268 3f 4f CLR KEYS On init key buffer is empty 0383 026a 3f 51 CLR KEYSTAT No keys pressed right now 0384 0385 026c 3f 49 CLR TIMEOUT Clear the power-off counter 0386 026e 3f 4a CLR TIMOUTA Clear the audio-off counter 0387 0388 0270 3f 5b CLR MODE No password, no macro, protection on, DTMF 0389 0390 0272 3f 59 CLR VALUE On init VALUE is used for password entering 0391 0274 3f 5a CLR VALUE+1 as these bytes are not used without password 0392 0393 0276 a6 d6 LDA #$D6 = LDA eeff,X 0394 0278 b7 7a STA GETBYTE 0395 027a a6 81 LDA #$81 0396 027c b7 7d STA GETBYTE+3 = RTS 0397 0398 027e 1e 48 BSET 7,NEXTSTR 0399 0400 0280 b6 18 INIT_0 LDA TCNT Wait for timer to wrap 0401 0282 be 19 LDX TCNT+1 0402 0284 a1 ff CMP #255 0403 0286 26 f8 BNE INIT_0 0404 0405 0288 b6 13 LDA TSR To make sure these flags are cleared 0406 028a a6 00 LDA #0 To clear Output Compare Flag 0407 028c b7 16 STA OCMP 0408 028e b7 17 STA OCMP+1 0409 0290 b6 19 LDA TCNT+1 To clear Timer Overflow Flag 0410 0411 0292 a6 60 LDA #%01100000 Enable output compare for sound and key-scan 0412 0294 b7 12 STA TCR and timer for auto shutoff 0413 0414 0296 a6 03 LDA #%00000011 Program SCI rate at 16384 bps 0415 0298 b7 0d STA BAUD 0416 029a 3f 0e CLR SCCR1 0417 029c a6 2c LDA #%00101100 Enable transmitter and receiver 0418 029e b7 0f STA SCCR2 and receiver interrupt 0419 0420 02a0 9a CLI Enable system interrupts 0421 0422 02a1 09 1e 03 INIT_1 BRCLR 4,COPC,INIT_2 Test to see if this init is due to a COP 0423 02a4 cd 10 3e JSR SITBEEP If so, signal SIT 0424 0425 02a7 cd 10 1e INIT_2 JSR ONBEEP Say hello to the outside world 0426 0427 02aa a6 06 LDA #%00000110 Set COP control with a 250 ms timeout period 0428 02ac b7 1e STA COPC 0429 0430 02ae 3f 52 CLR SERSTAT 0431 02b0 5f CLRX 0432 02b1 d6 14 4c INIT_3 LDA MESSAGE,X 0433 02b4 27 06 BEQ MAIN 0434 02b6 cd 11 80 JSR TX 0435 02b9 5c INCX 0436 02ba 20 f5 BRA INIT_3 0437 0438 ************************************************************************* 0439 * * 0440 * MAIN : The main program loop * 0441 * * 0442 * The main loop performs the following functions : * 0443 * * 0444 * Get keys from the keyboard buffer * 0445 * Play key sequences * 0446 * Play macro sequences * 0447 * * 0448 ************************************************************************* 0449 0450 0451 02bc cd 0e b0 MAIN JSR INKEY Check keyboard input 0452 02bf a1 ff CMP #$FF 0453 02c1 27 f9 BEQ MAIN 0454 0455 02c3 a1 19 CMP #%00011001 keys 0-9,*,# or ^0-^9 0456 02c5 22 46 BHI MAIN_5 Else ^* or ^# 0457 02c7 0e 5b 39 BRSET 7,MODE,MAIN_4 If password is entered correctly, make tone 0458 0459 02ca 3c 5a INC VALUE+1 0460 02cc be 5a LDX VALUE+1 0461 0462 02ce 0e 59 15 BRSET 7,VALUE,MAIN_2 Is normal password wasted ? 0463 0464 02d1 d1 1e f0 CMP PASSWRD-1,X Is this a correct digit 0465 02d4 27 04 BEQ MAIN_1 If so, check if password completed 0466 0467 02d6 1e 59 BSET 7,VALUE If not, wrong password, set bit 7 of 0468 02d8 20 0c BRA MAIN_2 VALUE to indicate so 0469 0470 02da c3 1e f0 MAIN_1 CPX PASDIGS Have we had all password digits ? 0471 02dd 26 07 BNE MAIN_2 0472 02df 1e 5b BSET 7,MODE If so, set MODE bit, for extra Demon features 0473 02e1 cd 10 a1 JSR PASBEEP And play password beep 0474 02e4 20 d6 BRA MAIN 0475 0476 02e6 0c 59 1a MAIN_2 BRSET 6,VALUE,MAIN_4 Is mother password wasted ? 0477 02e9 d1 14 3f CMP MOTHER-1,X 0478 02ec 27 04 BEQ MAIN_3 0479 0480 02ee 1c 59 BSET 6,VALUE 0481 02f0 20 11 BRA MAIN_4 0482 0483 02f2 a3 0b MAIN_3 CPX #11 All 11 mother digits entered ? 0484 02f4 26 0d BNE MAIN_4 0485 02f6 1e 5b BSET 7,MODE Extra Demon features 0486 02f8 cd 10 a1 JSR PASBEEP 0487 02fb cd 10 a1 JSR PASBEEP 0488 02fe cd 10 a1 JSR PASBEEP 0489 0301 20 b9 BRA MAIN 0490 0491 0303 3f 4a MAIN_4 CLR TIMOUTA 0492 0305 cd 0c 59 JSR PLAYKEY 0493 0308 cd 11 4a JSR AUDIOFF 0494 030b 20 af BRA MAIN 0495 0496 030d 0f 5b ac MAIN_5 BRCLR 7,MODE,MAIN If password not entered, no special features 0497 0498 0310 a1 1a CMP #%00011010 ^* pressed ? 0499 0312 26 05 BNE MACRO If not, ^# pressed, macro mode 0500 0314 cd 06 b1 JSR STAR Else star mode 0501 0317 20 a3 BRA MAIN 0502 0503 0319 1c 5b MACRO BSET 6,MODE Macro mode 0504 031b b6 5b LDA MODE 0505 031d b7 58 STA TEMP6 0506 031f cd 10 82 JSR EMMBEEP Play macro mode entry beep 0507 0508 0322 cd 0e cd MACRO_0 JSR GETKEY Get key from keyboard 0509 0325 a1 09 CMP #9 Digit ? 0510 0327 22 0d BHI MACRO_1 0511 0329 3f 62 MACR_00 CLR MACNEST This is the first macro 0512 032b ae ff LDX #%11111111 0513 032d bf 63 STX MARKER 0514 032f ad 6e MACR_01 BSR PLAYMAC Then play macro 0515 0331 cd 11 4a JSR AUDIOFF 0516 0334 20 ec BRA MACRO_0 0517 0336 a5 10 MACRO_1 BIT #16 Shifted key ? 0518 0338 27 03 BEQ MACRO_2 0519 033a cc 05 69 JMP RECMAC If shifted digit, record macro (or ^*) 0520 033d a1 0b MACRO_2 CMP #11 # pressed ? 0521 033f 27 52 BEQ MACRO_6 Then leave macro mode 0522 0341 cd 10 7c JSR KEYBEEP Else * pressed, macro aliasing or scan up/down 0523 0344 cd 0e cd JSR GETKEY 0524 0347 a1 09 CMP #9 Digit ? 0525 0349 23 26 BLS MACRO_4 0526 034b a1 0b CMP #11 # pressed ? 0527 034d 27 1e BEQ MACRO_3 0528 034f a1 0a CMP #10 * pressed ? 0529 0351 27 05 BEQ MACR_30 0530 0353 cd 10 3e MACR_20 JSR SITBEEP 0531 0356 20 ca BRA MACRO_0 shifted digit hit 0532 0533 0358 4f MACR_30 CLRA ** scan down Note * is down--not up 0534 0359 be 62 MACR_35 LDX MACNEST Unset scan? 0535 035b 53 COMX 0536 035c 27 f5 BEQ MACR_20 0537 035e 18 62 BSET 4,MACNEST 0538 0360 cd 09 d5 JSR SCAN_5 0539 0363 3f 62 CLR MACNEST 0540 0365 a4 0f AND #%00001111 0541 0367 a1 09 CMP #9 0542 0369 22 e8 BHI MACR_20 0543 036b 20 bc BRA MACR_00 0544 036d a6 0a MACRO_3 LDA #10 *# scan up 0545 036f 20 e8 BRA MACR_35 0546 0547 0371 b7 64 MACRO_4 STA MACAL 0548 0373 cd 10 7c JSR KEYBEEP 0549 0376 cd 0e cd MACR_40 JSR GETKEY Else, we want another digit 0550 0379 a1 09 CMP #9 0551 037b 23 09 BLS MACRO_5 0552 037d a1 0b CMP #11 0553 037f 27 05 BEQ MACRO_5 0554 0381 cd 10 3e JSR SITBEEP If the user enters a wrong digit, ask again 0555 0384 20 f0 BRA MACR_40 0556 0557 0386 48 MACRO_5 LSLA 0558 0387 48 LSLA 0559 0388 48 LSLA 0560 0389 48 LSLA 0561 0562 038a ba 64 ORA MACAL 0563 038c b7 64 STA MACAL 0564 038e cd 10 f3 JSR CFBEEP 0565 0391 20 8f BRA MACRO_0 0566 0567 0393 cd 10 94 MACRO_6 JSR XMMBEEP 0568 0396 b6 58 LDA TEMP6 Restore original mode 0569 0398 b7 5b STA MODE 0570 039a 1d 5b BCLR 6,MODE 0571 039c cc 02 bc JMP MAIN 0572 0573 039f 5f PLAYMAC CLRX Play macro 0574 03a0 b7 55 STA TEMP3 First find start of this macro 0575 03a2 b6 64 LDA MACAL 0576 03a4 a4 0f AND #%00001111 0577 03a6 b1 55 CMP TEMP3 0578 03a8 26 0c BNE PLM_00 0579 03aa b6 64 LDA MACAL 0580 03ac 44 LSRA 0581 03ad 44 LSRA 0582 03ae 44 LSRA 0583 03af 44 LSRA 0584 03b0 b7 55 STA TEMP3 0585 03b2 a1 0b PLM_0 CMP #11 No macro (aliased to nothing) ? 0586 03b4 27 33 BEQ PLM_31 0587 03b6 3a 55 PLM_00 DEC TEMP3 This is the one ? 0588 03b8 2b 0a BMI PLM_2 0589 03ba cd 0e e8 PLM_1 JSR READMAC If not, read macro entry 0590 03bd 5c INCX Update counter for next read 0591 03be a1 3f CMP #%00111111 Last macro key 0592 03c0 26 f8 BNE PLM_1 0593 03c2 20 f2 BRA PLM_00 0594 0595 03c4 bf 5d PLM_2 STX MACCNT 0596 03c6 9b PLM_3 SEI Disable keyboard buffer changes 0597 03c7 be 4f LDX KEYS 0598 03c9 27 0f BEQ PLM_32 0599 03cb b6 4b LDA KEYBUF Check last key in buffer 0600 03cd a1 0b CMP #11 # pressed in macro play ? 0601 03cf 26 09 BNE PLM_32 0602 03d1 cd 0e b0 PLM_33 JSR INKEY Clear buffer if # pressed (INKEY CLI's) 0603 03d4 a1 ff CMP #$FF 0604 03d6 26 f9 BNE PLM_33 0605 03d8 20 15 BRA PLM_30 Quit 0606 03da 9a PLM_32 CLI 0607 03db cd 11 7d JSR CLRTIME 0608 03de be 5d LDX MACCNT Get next macro read 0609 03e0 3c 5d INC MACCNT Update counter 0610 03e2 cd 0e e8 JSR READMAC Read macro entry 0611 03e5 a1 3f CMP #%00111111 End of macro ? 0612 03e7 26 14 BNE PLM_5 0613 03e9 b6 62 PLM_31 LDA MACNEST 0614 03eb a4 03 AND #%00000011 0615 03ed 26 01 BNE PLM_4 0616 03ef 81 PLM_30 RTS Then return 0617 0618 03f0 3a 62 PLM_4 DEC MACNEST Nested macro, decrement nesting level 0619 03f2 b6 62 LDA MACNEST 0620 03f4 a4 03 AND #%00000011 0621 03f6 97 TAX 0622 03f7 e6 5e LDA MACNCNT,X And get previous macro counter 0623 03f9 b7 5d STA MACCNT 0624 03fb 20 c9 BRA PLM_3 0625 0626 03fd a1 20 PLM_5 CMP #%00100000 0627 03ff 25 2b BLO PLM_8 0628 0401 a1 3e CMP #%00111110 Pauseable mode 4 ? 0629 0403 27 27 BEQ PLM_8 0630 0405 a1 34 CMP #%00110100 Mode set ? 0631 0407 24 07 BHS PLM_6 0632 0409 a0 20 SUB #%00100000 0633 040b cd 0e a5 JSR SETMODE 0634 040e 20 b6 BRA PLM_3 0635 0410 a0 34 PLM_6 SUB #%00110100 Nested macro 0636 0412 b7 53 STA TEMP1 0637 0414 b6 62 LDA MACNEST 0638 0416 a4 03 AND #%00000011 0639 0418 97 TAX Test the macro level nesting 0640 0419 a3 02 CPX #2 0641 041b 26 04 BNE PLM_7 0642 041d cd 10 3e JSR SITBEEP Up to 2 nesting levels are allowed 0643 0420 81 RTS 0644 0645 0421 b6 5d PLM_7 LDA MACCNT Store current macro counter 0646 0423 e7 5e STA MACNCNT,X 0647 0425 3c 62 INC MACNEST One level deeper 0648 0427 b6 53 LDA TEMP1 And jump to play this macro 0649 0429 cc 03 9f JMP PLAYMAC 0650 0651 042c b7 53 PLM_8 STA TEMP1 0652 042e a4 1c AND #%00011100 0653 0430 a1 0c CMP #%00001100 Is it a guard tone ? 0654 0432 27 0d BEQ PLM_9 0655 0656 0434 a1 1c CMP #%00011100 Is it a pause type ? 0657 0436 27 3f BEQ PLM_11 0658 0659 0438 b6 53 LDA TEMP1 If not, it is a key 0660 043a 3f 4a CLR TIMOUTA Make sure key is played without audio shut-off 0661 043c cd 0c 59 JSR PLAYKEY 0662 043f 20 85 BRA PLM_3 0663 0664 0441 b6 53 PLM_9 LDA TEMP1 Guard tone 0665 0443 a4 03 AND #3 0666 0445 a1 03 CMP #3 End of guard tone 0667 0447 26 0f BNE PLM_10 If not, start guard tone 0668 0449 1f 67 BCLR 7,GUARD Switch off guard tone 0669 044b 9b SEI 0670 044c 3f 3a CLR TONE3ST 0671 044e 3f 3b CLR TONE3ST+1 0672 0450 3f 38 CLR TONE3CT 0673 0452 3f 39 CLR TONE3CT+1 0674 0454 9a CLI 0675 0455 cc 03 c6 JMP PLM_3 0676 0677 0458 97 PLM_10 TAX Start guard tone 0678 0459 9b SEI 0679 045a c6 14 b1 LDA JUMPTB3+12 Set guard tone at -6 dB 0680 045d b7 44 STA TONE3+1 0681 045f c6 14 b2 LDA JUMPTB3+13 0682 0462 b7 45 STA TONE3+2 0683 0464 ee 67 LDX GUARD,X Get frequency index for this guard tone 0684 0466 58 LSLX 0685 0467 d6 01 48 LDA FREQTBL,X 0686 046a de 01 49 LDX FREQTBL+1,X 0687 046d b7 3a STA TONE3ST 0688 046f bf 3b STX TONE3ST+1 0689 0471 9a CLI 0690 0472 1e 67 BSET 7,GUARD 0691 0474 cc 03 c6 JMP PLM_3 0692 0693 0477 0f 62 03 PLM_11 BRCLR 7,MACNEST,PLM_12 Test to see if in non-pauseable mode 0694 047a cc 03 c6 JMP PLM_3 if not, just go on 0695 0696 047d 1a 62 PLM_12 BSET 5,MACNEST Set AUDIOFF timeout prevention flag 0697 047f b6 53 LDA TEMP1 0698 0481 a1 3e CMP #%00111110 0699 0483 27 2b BEQ PLM_1A 0700 0485 a4 03 AND #3 0701 0487 26 0a BNE PLM_13 Marker setting 0702 0489 b6 5d LDA MACCNT 0703 048b b7 63 STA MARKER 0704 048d cd 05 52 JSR SAVNES 0705 0490 cc 05 0f JMP PLM_22 0706 0707 0493 a1 02 PLM_13 CMP #2 0708 0495 25 1b BLO PLM_16 0709 0497 2f 76 BIH PLM_22 Shift not pressed? 0710 0499 22 33 BHI PLM_18 0711 0712 049b cd 11 4a JSR AUDIOFF 0713 049e cd 05 34 PLM_14 JSR USHFDEB 0714 04a1 27 fb BEQ PLM_14 Wait for it to be released 0715 04a3 ad 71 PLM_15 BSR PLM_25 or * to goto marker 0716 04a5 27 46 BEQ PLM_23 If * pressed 0717 04a7 25 66 BCS PLM_22 If # pressed 0718 04a9 cd 05 43 JSR SHFDEB 0719 04ac 27 f5 BEQ PLM_15 And pressed again 0720 04ae 20 5f BRA PLM_22 0721 0722 04b0 1c 62 PLM_1A BSET 6,MACNEST 0723 04b2 cd 11 4a PLM_16 JSR AUDIOFF 0724 04b5 2e fe PLM_1B BIL PLM_1B Wait for shift to be released 0725 04b7 ad 5d PLM_17 BSR PLM_25 Wait for a shift or * to cont. or goto marker 0726 04b9 27 32 BEQ PLM_23 If * pressed 0727 04bb 25 52 BCS PLM_22 If # pressed 0728 04bd cd 05 43 JSR SHFDEB 0729 04c0 27 f5 BEQ PLM_17 0730 04c2 0d 62 4a BRCLR 6,MACNEST,PLM_22 Branch if not pause mode 4 0731 04c5 b6 5d LDA MACCNT 0732 04c7 b7 63 STA MARKER 0733 04c9 cd 05 52 JSR SAVNES Save nesting level 0734 04cc 20 41 BRA PLM_22 0735 0736 04ce cd 11 4a PLM_18 JSR AUDIOFF 0737 04d1 ad 61 PLM_1C BSR USHFDEB 0738 04d3 27 fc BEQ PLM_1C Wait for shift to be released 0739 04d5 be 1a LDX ALTCNT 0740 04d7 b3 1a PLM_19 CPX ALTCNT 0741 04d9 27 fc BEQ PLM_19 0742 04db ad 66 PLM_20 BSR SHFDEB 0743 04dd 26 30 BNE PLM_22 Check if shift is pressed and if so, just 0744 04df b3 1a CPX ALTCNT continue 0745 04e1 26 f8 BNE PLM_20 0746 0747 04e3 ad 31 PLM_21 BSR PLM_25 Check on * or # 0748 04e5 27 06 BEQ PLM_23 If * pressed 0749 04e7 25 26 BCS PLM_22 If # pressed 0750 04e9 ad 58 BSR SHFDEB 0751 04eb 27 f6 BEQ PLM_21 Wait for shift to be pressed 0752 04ed b6 63 PLM_23 LDA MARKER If we have a valid marker, jump back to that 0753 04ef a1 ff CMP #%11111111 0754 04f1 27 1a BEQ PLM_2A 0755 04f3 b7 5d STA MACCNT 0756 04f5 b6 62 LDA MACNEST Restore nesting level 0757 04f7 a4 0c AND #%00001100 0758 04f9 44 LSRA 0759 04fa 44 LSRA 0760 04fb 11 62 BCLR 0,MACNEST 0761 04fd 13 62 BCLR 1,MACNEST 0762 04ff ba 62 ORA MACNEST 0763 0501 b7 62 STA MACNEST 0764 0503 b6 60 LDA MACMCNT Restore nesting markers 0765 0505 b7 5e STA MACNCNT 0766 0507 b6 60 LDA MACMCNT 0767 0509 b7 5e STA MACNCNT 0768 050b 20 02 BRA PLM_22 0769 050d 3a 5d PLM_2A DEC MACCNT If there's nothing to * to, stay here 0770 050f 1b 62 PLM_22 BCLR 5,MACNEST 0771 0511 1d 62 BCLR 6,MACNEST 0772 0513 cc 03 c6 JMP PLM_3 0773 0774 0516 9b PLM_25 SEI Check for * 0775 0517 3d 4f TST KEYS 0776 0519 27 10 BEQ PLM_26 0777 051b b6 4b LDA KEYBUF 0778 051d a1 0a CMP #10 0779 051f 25 0a BLO PLM_26 0780 0521 a1 0b CMP #11 Test for aborting # 0781 0523 27 0b BEQ PLM_28 0782 0525 cd 0e b0 JSR INKEY Get * from buffer 0783 0528 4f CLRA 0784 0529 20 02 BRA PLM_27 0785 052b 4f PLM_26 CLRA 0786 052c 43 COMA 0787 052d 98 PLM_27 CLC 0788 052e 20 02 BRA PLM_29 0789 0530 4f PLM_28 CLRA 0790 0531 43 COMA Also sets carry 0791 0532 9a PLM_29 CLI 0792 0533 81 RTS Returns Z flag set if * hit/C set if # 0793 0794 0534 2e 09 USHFDEB BIL USHFD_1 Debounce for shift release checking 0795 0536 a6 0a LDA #10 0796 0538 2e 05 USHFD_0 BIL USHFD_1 0797 053a 4a DECA 0798 053b 26 fb BNE USHFD_0 0799 053d 20 02 BRA USHFD_2 0800 053f 4f USHFD_1 CLRA 0801 0540 43 COMA 0802 0541 43 USHFD_2 COMA 0803 0542 81 RTS Returns Z=1 for still shifted Z=0 for unshifted 0804 0805 0543 2f 09 SHFDEB BIH SHFD_1 Debounce for shift press checking 0806 0545 a6 0a LDA #10 0807 0547 2f 05 SHFD_0 BIH SHFD_1 0808 0549 4a DECA 0809 054a 26 fb BNE SHFD_0 0810 054c 20 02 BRA SHFD_2 0811 054e 4f SHFD_1 CLRA 0812 054f 43 COMA 0813 0550 43 SHFD_2 COMA 0814 0551 81 RTS Returns Z=1 for still unshifted Z=0 for shifted 0815 0816 0552 b6 62 SAVNES LDA MACNEST Save nesting level 0817 0554 a4 03 AND #%00000011 0818 0556 48 LSLA 0819 0557 48 LSLA 0820 0558 17 62 BCLR 3,MACNEST 0821 055a 15 62 BCLR 2,MACNEST 0822 055c ba 62 ORA MACNEST 0823 055e b7 62 STA MACNEST 0824 0560 b6 5e LDA MACNCNT Save nesting markers 0825 0562 b7 60 STA MACMCNT 0826 0564 b6 5f LDA MACNCNT+1 0827 0566 b7 61 STA MACMCNT+1 0828 0568 81 RTS 0829 0830 0569 a1 1a RECMAC CMP #%00011010 ^* or ^# pressed 0831 056b 25 29 BLO RECM_0 0832 056d 26 21 BNE RECM_00 0833 056f cd 10 7c JSR KEYBEEP ^* pressed 0834 0572 cd 0e cd JSR GETKEY 0835 0575 a1 0b CMP #11 ^* # means play macro in non-pauseable mode 0836 0577 27 06 BEQ RECM_90 0837 0579 cd 06 be JSR STAR_0 goto star mode 0838 0839 057c cc 03 22 JMP MACRO_0 0840 0841 057f cd 10 7c RECM_90 JSR KEYBEEP 0842 0582 cd 0e cd JSR GETKEY Get non-pausable macro number 0843 0585 a1 09 CMP #9 0844 0587 22 07 BHI RECM_00 0845 0589 3f 62 CLR MACNEST 0846 058b 1e 62 BSET 7,MACNEST 0847 058d cc 03 2f JMP MACR_01 0848 0849 0590 cd 10 3e RECM_00 JSR SITBEEP ^# or illegal macro no meaning 0850 0593 cc 03 22 JMP MACRO_0 0851 0852 0596 a4 0f RECM_0 AND #%00001111 Get macro # 0853 0598 b7 55 STA TEMP3 0854 059a 5f CLRX Find start of this macro 0855 059b 3a 55 RECM_1 DEC TEMP3 This is the one ? 0856 059d 2b 0a BMI RECM_3 0857 059f cd 0e e8 RECM_2 JSR READMAC If not, read macro 0858 05a2 5c INCX 0859 05a3 a1 3f CMP #%00111111 Last macro key ? 0860 05a5 26 f8 BNE RECM_2 0861 05a7 20 f2 BRA RECM_1 0862 0863 05a9 bf 5d RECM_3 STX MACCNT 0864 05ab cd 0e e8 JSR READMAC Now check to see if this macro is empty 0865 05ae a1 3f CMP #%00111111 End of macro ? 0866 05b0 27 3d BEQ RECM_7 Then empty 0867 05b2 cd 10 52 JSR ALERT Else, sound alert 0868 05b5 cd 0e cd JSR GETKEY And get key # for confirmation 0869 05b8 a1 0b CMP #11 0870 05ba 27 06 BEQ RECM_4 0871 05bc cd 10 ed JSR DNTBEEP Give beep to indicate a don't 0872 05bf cc 03 22 JMP MACRO_0 If no confirmation, just return 0873 05c2 cd 10 f3 RECM_4 JSR CFBEEP Give beep to indicate OK 0874 05c5 be 5d LDX MACCNT Else, we are going to empty this macro 0875 05c7 bf 55 STX TEMP3 by shifting all keys back 0876 05c9 5c RECM_5 INCX 0877 05ca cd 0e e8 JSR READMAC Find end of macro 0878 05cd a1 3f CMP #%00111111 0879 05cf 26 f8 BNE RECM_5 0880 05d1 bf 56 STX TEMP4 0881 0882 05d3 cd 0e e8 RECM_6 JSR READMAC Now move buffer to empty current macro 0883 05d6 be 55 LDX TEMP3 0884 05d8 cd 0f 2c JSR WRITMAC 0885 05db 3c 55 INC TEMP3 0886 05dd 3c 56 INC TEMP4 0887 05df be 56 LDX TEMP4 0888 05e1 b3 5c CPX MACKEYS 0889 05e3 25 ee BLO RECM_6 0890 0891 05e5 b6 55 LDA TEMP3 Now the # of keys to be moved are TEMP4-TEMP3 0892 05e7 b0 56 SUB TEMP4 This has to be substracted from MACKEYS 0893 05e9 bb 5c ADD MACKEYS (MACKEYS-TEMP4+TEMP3) 0894 05eb b7 5c STA MACKEYS 0895 05ed 20 0f BRA RECM_8 0896 0897 05ef cd 10 f3 RECM_7 JSR CFBEEP Confirm programming 0898 05f2 b6 5c LDA MACKEYS Macro area full ? 0899 05f4 a1 60 CMP #96 0900 05f6 26 06 BNE RECM_8 0901 05f8 cd 10 52 JSR ALERT Then alert and return to macro mode 0902 05fb cc 03 22 JMP MACRO_0 0903 0904 05fe cd 0e cd RECM_8 JSR GETKEY Get macro key 0905 0601 b7 56 STA TEMP4 0906 0603 cd 10 7c JSR KEYBEEP 0907 0606 b6 56 LDA TEMP4 0908 0608 a1 1a CMP #%00011010 Normal digit, *, # or shifted digit 0909 060a 25 3b BLO RECM_14 0910 060c 27 1f BEQ RECM_12 ^* 0911 0912 060e cd 0e cd JSR GETKEY ^# pressed now 0-9 or # 0913 0611 a1 0b CMP #11 #, then end of macro 0914 0613 26 06 BNE RECM_9 0915 0615 cd 10 f3 JSR CFBEEP Indicate end of macro 0916 0618 cc 03 22 JMP MACRO_0 0917 061b a1 09 RECM_9 CMP #9 Not 0-9, then invalid 0918 061d 23 05 BLS RECM_11 0919 061f cd 10 3e RECM_10 JSR SITBEEP 0920 0622 20 da BRA RECM_8 0921 0922 0624 ab 34 RECM_11 ADD #%00110100 Nested macro 0923 0626 b7 56 STA TEMP4 0924 0628 cd 10 7c JSR KEYBEEP 0925 062b 20 1a BRA RECM_14 Store macro key 0926 0927 062d cd 0e cd RECM_12 JSR GETKEY ^* pressed, now 0-9 or ^0-^9 for mode 0928 0630 a1 0a CMP #10 or * for guard toning 0929 0632 25 0c BLO RECM_13 0930 0634 27 35 BEQ RECM_16 * Pressed, guard modes 0931 0636 a1 0b CMP #11 0932 0638 27 5b BEQ RECM_18 # Pressed, pauseable thingies 0933 063a a1 19 CMP #%00011001 0934 063c 22 e1 BHI RECM_10 ^* and ^# no meaning 0935 063e a0 06 SUB #6 otherwise shifted digit 0936 0640 ab 20 RECM_13 ADD #%00100000 0937 0642 b7 56 STA TEMP4 0938 0644 cd 10 7c JSR KEYBEEP 0939 0940 0647 be 5c RECM_14 LDX MACKEYS Now insert a key into macro 0941 0649 5a RECM_15 DECX Move buffer to make space for this entry 0942 064a cd 0e e8 JSR READMAC 0943 064d 5c INCX 0944 064e cd 0f 2c JSR WRITMAC 0945 0651 5a DECX 0946 0652 b3 5d CPX MACCNT 0947 0654 26 f3 BNE RECM_15 0948 0656 b6 56 LDA TEMP4 0949 0658 cd 0f 2c JSR WRITMAC 0950 065b 3c 5d INC MACCNT 0951 065d 3c 5c INC MACKEYS 0952 065f b6 5c LDA MACKEYS 0953 0661 a1 60 CMP #96 Macro area full ? 0954 0663 26 99 BNE RECM_8 If not, next key 0955 0665 cd 10 52 JSR ALERT If so, alert and stop 0956 0668 cc 03 22 JMP MACRO_0 0957 0958 066b cd 10 7c RECM_16 JSR KEYBEEP Star mode 0959 066e cd 0e cd JSR GETKEY 0960 0671 a1 04 CMP #4 0961 0673 27 0d BEQ RECM_17 0962 0675 a1 05 CMP #5 ^* * 5 ; end guard tone 0963 0677 26 a6 BNE RECM_10 0964 0679 cd 10 7c JSR KEYBEEP 0965 067c a6 0f LDA #%00001111 0966 067e b7 56 STA TEMP4 0967 0680 20 c5 BRA RECM_14 0968 0969 0682 cd 10 7c RECM_17 JSR KEYBEEP ^* * 4 ; start guard tone 0970 0685 cd 0e cd JSR GETKEY 0971 0688 a1 02 CMP #2 guard tones 0-2 allowed 0972 068a 22 93 BHI RECM_10 0973 068c ab 0c ADD #%00001100 0974 068e b7 56 STA TEMP4 0975 0690 cd 10 7c JSR KEYBEEP 0976 0693 20 b2 BRA RECM_14 0977 0978 0695 cd 10 7c RECM_18 JSR KEYBEEP ^* # 0-4 are macro pause types 0979 0698 cd 0e cd JSR GETKEY 0980 069b a1 03 CMP #3 0981 069d 23 09 BLS RECM_19 0982 069f a1 04 CMP #4 0983 06a1 27 03 BEQ RECM_1A 0984 06a3 cc 06 1f JMP RECM_10 0985 0986 06a6 a6 22 RECM_1A LDA #%00100010 Pauseable mode 4 is %00111110 0987 0988 06a8 ab 1c RECM_19 ADD #%00011100 0989 06aa b7 56 STA TEMP4 0990 06ac cd 10 7c JSR KEYBEEP 0991 06af 20 96 BRA RECM_14 0992 0993 06b1 cd 10 7c STAR JSR KEYBEEP ^* pressed 0994 0995 06b4 cd 0e cd JSR GETKEY 0996 06b7 a1 0b CMP #%00001011 ^* # pressed, program key definition 0997 06b9 26 03 BNE STAR_0 0998 06bb cc 0a 63 JMP PROGKEY 0999 06be a1 0a STAR_0 CMP #%00001010 ^* * pressed, star mode 1000 06c0 27 3b BEQ STARMOD 1001 06c2 a1 1a CMP #%00011010 1002 06c4 26 21 BNE STAR_3 ^* ^* pressed, power-down 1003 06c6 cd 0f f7 JSR OFFBEEP 1004 06c9 cd 11 4a POW_OFF JSR AUDIOFF 1005 06cc 9b SEI 1006 06cd a6 80 LDA #%10000000 Switch off audio 1007 06cf b7 02 STA PORTC 1008 06d1 a6 55 STAR_1 LDA #$55 Reset COP timer 1009 06d3 b7 1d STA COPR 1010 06d5 48 LSLA 1011 06d6 b7 1d STA COPR 1012 06d8 2e f7 BIL STAR_1 Wait for shift to release 1013 06da 17 01 BCLR 3,PORTB Switch off power upper 1014 06dc 8e STOP 1015 1016 06dd 0b 5b 04 BRCLR 5,MODE,STAR_2 If password protection is off, just return 1017 06e0 16 01 BSET 3,PORTB after switching on power again 1018 06e2 9a CLI 1019 06e3 81 RTS 1020 1021 06e4 cc 02 1b STAR_2 JMP INIT If password protection is on, init 1022 1023 06e7 22 0d STAR_3 BHI STAR_5 ^# means toggle external bit 1024 06e9 a5 10 BIT #16 Else mode set 1025 06eb 27 02 BEQ STAR_4 If shifted then substract 6 from keycode 1026 06ed a0 06 SUB #6 1027 06ef cd 0e a5 STAR_4 JSR SETMODE 0-9 or ^0-^9 sets mode 1028 06f2 cd 10 f3 JSR CFBEEP And say OK 1029 06f5 81 RTS 1030 1031 06f6 b6 01 STAR_5 LDA PORTB Toggle external bit (hook switch) 1032 06f8 a8 10 EOR #%00010000 1033 06fa b7 01 STA PORTB 1034 06fc 81 RTS 1035 1036 06fd cd 10 7c STARMOD JSR KEYBEEP The star mode allows the user to program 1037 0700 cd 0e cd JSR GETKEY various actions 1038 0703 a1 00 CMP #0 1039 0705 26 03 BNE STM_0 1040 0707 cc 07 63 JMP INITDEV Init device 1041 1042 070a a1 01 STM_0 CMP #1 1043 070c 26 03 BNE STM_1 1044 070e cc 07 d4 JMP ENTERFR Enter a table frequency 1045 1046 0711 a1 02 STM_1 CMP #2 1047 0713 26 03 BNE STM_2 1048 0715 cc 08 10 JMP ENTERTM Enter time template 1049 1050 0718 a1 03 STM_2 CMP #3 1051 071a 26 03 BNE STM_3 1052 071c cc 08 31 JMP ENTERGD Enter guard frequency # 1053 1054 071f a1 04 STM_3 CMP #4 1055 0721 26 03 BNE STM_4 1056 0723 cc 08 57 JMP STARTGD Start guard tone 1057 1058 0726 a1 05 STM_4 CMP #5 1059 0728 26 03 BNE STM_5 1060 072a cc 08 89 JMP STOPGD Stop guard tone 1061 1062 072d a1 06 STM_5 CMP #6 1063 072f 26 03 BNE STM_6 1064 0731 cc 08 9c JMP FRSWP1 Frequency sweep 1 1065 1066 0734 a1 07 STM_6 CMP #7 1067 0736 26 03 BNE STM_7 1068 0738 cc 09 23 JMP FRSWP2 Frequency sweep 2 1069 1070 073b a1 08 STM_7 CMP #8 1071 073d 26 08 BNE STM_8 1072 073f cd 10 f3 JSR CFBEEP 1073 0742 1b 5b BCLR 5,MODE Password protection on 1074 0744 cc 06 c9 JMP POW_OFF 1075 1076 0747 a1 09 STM_8 CMP #9 1077 0749 26 09 BNE STM_9 1078 074b cd 10 f3 JSR CFBEEP 1079 074e 1a 5b BSET 5,MODE Password protection off 1080 0750 cd 11 7d JSR CLRTIME 1081 0753 81 RTS 1082 1083 0754 a1 0a STM_9 CMP #10 1084 0756 26 03 BNE STM_10 1085 0758 cc 09 6d JMP SCAN Number scanning feature 1086 1087 075b cd 10 3e STM_10 JSR SITBEEP 1088 075e 81 RTS 1089 1090 075f cd 10 7c KEYDEF JSR KEYBEEP 1091 0762 81 RTS 1092 1093 0763 cd 10 52 INITDEV JSR ALERT Alert for destructive operation 1094 0766 cd 0e cd JSR GETKEY And press # to confirm 1095 0769 a1 0b CMP #11 1096 076b 27 04 BEQ INITD_0 1097 1098 076d cd 10 ed JSR DNTBEEP 1099 0770 81 RTS 1100 1101 0771 cd 10 f3 INITD_0 JSR CFBEEP 1102 1103 0774 a6 0b DEVINIT LDA #11 No aliasing 1104 0776 b7 64 STA MACAL 1105 0778 a6 ff LDA #%11111111 Init all macro entries to %111111 (EOM) 1106 077a 5f CLRX 1107 077b d7 01 00 INITD_1 STA MACROS,X 1108 077e 5c INCX 1109 077f a3 48 CPX #72 1110 0781 26 f8 BNE INITD_1 1111 0783 a6 0a LDA #10 10 Empty macro's right now 1112 0785 b7 5c STA MACKEYS 1113 0787 a6 90 LDA #%10010000 Program 2 RAM modes to blanks 1114 0789 5f CLRX 1115 078a e7 80 INITD_2 STA KEYAREA,X 1116 078c 5c INCX 1117 078d a3 2c CPX #44 2*22 keys 1118 078f 26 f9 BNE INITD_2 1119 0791 bf 7f STX MODKEYS That's the total number of keys in area 1120 0793 54 LSRX And half of it is offset to user mode 2 (19) 1121 0794 bf 7e STX US2OFS 1122 1123 0796 a6 ff LDA #%11111111 1124 0798 b7 65 STA MACSCAN No initial scanning 1125 1126 079a a6 5f LDA #95 Guard 2: 3250Hz 1127 079c b7 69 STA GUARD+2 1128 079e a6 5c LDA #92 1: 3100 1129 07a0 b7 68 STA GUARD+1 1130 07a2 a6 34 LDA #52 0: 2280 1131 07a4 b7 67 STA GUARD 1132 1133 07a6 4a DECA Init time templates 1134 07a7 3f 6a CLR TIMTMPL Init DTMF/C3/pulse dial mark to 50 ms 1135 07a9 b7 6b STA TIMTMPL+1 1136 07ab 3f 6c CLR TIMTMPL+2 Init DTMF/C3/pulse dial space to 50 ms 1137 07ad b7 6d STA TIMTMPL+3 1138 07af 3f 6e CLR TIMTMPL+4 Init C5/R2 mark to 50 ms 1139 07b1 b7 6f STA TIMTMPL+5 1140 07b3 3f 70 CLR TIMTMPL+6 Init C5/R2 space to 50 ms 1141 07b5 b7 71 STA TIMTMPL+7 1142 07b7 a6 66 LDA #102 1143 07b9 3f 72 CLR TIMTMPL+8 Init kp period to 100 ms 1144 07bb b7 73 STA TIMTMPL+9 1145 07bd a6 02 LDA #2 1146 07bf b7 76 STA TIMTMPL+12 Init C3/pulse interdigit period to 500 ms 1147 07c1 3f 77 CLR TIMTMPL+13 1148 1149 07c3 4f CLRA Init RAM frequencies 1150 07c4 c7 01 48 STA FREQTBL Init C3 mark frequency to 2 Hz 1151 07c7 c7 01 4a STA FREQTBL+2 Init C3 space frequency to 1 Hz 1152 07ca a6 10 LDA #16 1153 07cc c7 01 49 STA FREQTBL+1 1154 07cf 44 LSRA 1155 07d0 c7 01 4b STA FREQTBL+3 1156 1157 07d3 81 RTS 1158 1159 07d4 cd 10 7c ENTERFR JSR KEYBEEP 1160 07d7 cd 0f b4 JSR READVAL Read frequency # to program 1161 07da 3d 59 TST VALUE Only frequency #'s 0-11 are RAM based 1162 07dc 26 2e BNE ENTFR_0 1163 07de b6 5a LDA VALUE+1 1164 07e0 a1 0c CMP #12 1165 07e2 24 28 BHS ENTFR_0 1166 07e4 b7 55 STA TEMP3 1167 07e6 cd 0f b4 JSR READVAL Get the frequency in Hz 1168 07e9 38 5a LSL VALUE+1 Multiply by 8 to get internal 'frequency' 1169 07eb 39 59 ROL VALUE 1170 07ed 38 5a LSL VALUE+1 1171 07ef 39 59 ROL VALUE 1172 07f1 38 5a LSL VALUE+1 1173 07f3 39 59 ROL VALUE 1174 07f5 be 55 LDX TEMP3 And store into RAM frequency table 1175 07f7 58 LSLX 1176 07f8 b6 59 LDA VALUE 1177 07fa d7 01 48 STA FREQTBL,X 1178 07fd b6 5a LDA VALUE+1 1179 07ff d7 01 49 STA FREQTBL+1,X 1180 1181 0802 54 LSRX Produce newly programmed frequency 500 ms 1182 0803 a6 fa LDA #250 1183 0805 cd 11 07 JSR BEEP 1184 0808 cd 11 4a JSR AUDIOFF 1185 080b 81 RTS 1186 1187 080c cd 10 3e ENTFR_0 JSR SITBEEP 1188 080f 81 RTS 1189 1190 0810 cd 10 7c ENTERTM JSR KEYBEEP Program time template 1191 0813 cd 0e cd JSR GETKEY Get time template # 1192 0816 a1 07 CMP #7 Only 0-7 allowed 1193 0818 22 f2 BHI ENTFR_0 1194 081a b7 55 STA TEMP3 1195 081c cd 10 7c JSR KEYBEEP 1196 081f cd 0f b4 JSR READVAL Get time 1197 0822 cd 10 fa JSR CFBEEP2 1198 0825 be 55 LDX TEMP3 1199 0827 58 LSLX 1200 0828 b6 59 LDA VALUE 1201 082a e7 6a STA TIMTMPL,X 1202 082c b6 5a LDA VALUE+1 1203 082e e7 6b STA TIMTMPL+1,X 1204 0830 81 RTS 1205 1206 0831 cd 10 7c ENTERGD JSR KEYBEEP Program guard frequency 1207 0834 cd 0e cd JSR GETKEY Get guard # 1208 0837 a1 02 CMP #2 Only 0,1,2 allowed 1209 0839 22 d1 BHI ENTFR_0 1210 083b b7 55 STA TEMP3 1211 083d cd 10 7c JSR KEYBEEP 1212 0840 cd 0f b4 JSR READVAL Get freq # 1213 0843 3d 59 TST VALUE 0 - MAXFREQ allowed 1214 0845 26 c5 BNE ENTFR_0 1215 0847 b6 5a LDA VALUE+1 1216 0849 a1 6b CMP #MAXFREQ 1217 084b 22 bf BHI ENTFR_0 1218 084d cd 10 fa JSR CFBEEP2 1219 0850 b6 5a LDA VALUE+1 Fixed by willem (this wasn't here) 1220 0852 be 55 LDX TEMP3 1221 0854 e7 67 STA GUARD,X Store guard in table 1222 0856 81 RTS 1223 1224 0857 cd 10 7c STARTGD JSR KEYBEEP Start guard tone 1225 085a cd 0e cd JSR GETKEY Get guard # 1226 085d a1 02 CMP #2 Only 0,1,2 allowed 1227 085f 22 ab BHI ENTFR_0 1228 0861 b7 55 STA TEMP3 1229 0863 cd 10 7c JSR KEYBEEP 1230 0866 be 55 LDX TEMP3 1231 0868 9b SEI 1232 0869 3f 4a CLR TIMOUTA Make sure guard tone sounds 1233 086b c6 14 b1 LDA JUMPTB3+12 Set guard tone at -6 dB 1234 086e b7 44 STA TONE3+1 1235 0870 c6 14 b2 LDA JUMPTB3+13 1236 0873 b7 45 STA TONE3+2 1237 0875 ee 67 LDX GUARD,X 1238 0877 58 LSLX 1239 0878 d6 01 48 LDA FREQTBL,X 1240 087b de 01 49 LDX FREQTBL+1,X 1241 087e b7 3a STA TONE3ST 1242 0880 bf 3b STX TONE3ST+1 1243 0882 9a CLI 1244 0883 1e 67 BSET 7,GUARD 1245 0885 cd 11 4a JSR AUDIOFF 1246 0888 81 RTS 1247 1248 0889 cd 10 7c STOPGD JSR KEYBEEP Stop guard tone 1249 088c 1f 67 BCLR 7,GUARD 1250 088e 9b SEI 1251 088f 3f 3a CLR TONE3ST 1252 0891 3f 3b CLR TONE3ST+1 1253 0893 3f 38 CLR TONE3CT 1254 0895 3f 39 CLR TONE3CT+1 1255 0897 9a CLI 1256 0898 cd 11 4a JSR AUDIOFF 1257 089b 81 RTS 1258 1259 089c cd 10 7c FRSWP1 JSR KEYBEEP Frequency sweep 1 (start # end # step #) 1260 089f cd 0f b4 JSR READVAL Read start frequency 1261 1262 08a2 be 59 LDX VALUE 1263 08a4 b6 5a LDA VALUE+1 1264 08a6 48 LSLA 1265 08a7 59 ROLX 1266 08a8 48 LSLA 1267 08a9 59 ROLX 1268 08aa 48 LSLA 1269 08ab 59 ROLX 1270 1271 08ac bf 55 STX TEMP3 1272 08ae b7 56 STA TEMP4 1273 1274 08b0 cd 0f b4 JSR READVAL Read step size 1275 1276 08b3 be 59 LDX VALUE 1277 08b5 b6 5a LDA VALUE+1 1278 08b7 48 LSLA 1279 08b8 59 ROLX 1280 08b9 48 LSLA 1281 08ba 59 ROLX 1282 08bb 48 LSLA 1283 08bc 59 ROLX 1284 08bd bf 59 STX VALUE 1285 08bf b7 5a STA VALUE+1 1286 1287 08c1 9b SEI 1288 08c2 0e 67 0c BRSET 7,GUARD,FRSW1_0 Test for guard tone 1289 08c5 c6 14 65 LDA JUMPTB1 Tone 1 at 0 dB 1290 08c8 b7 3e STA TONE1+1 1291 08ca c6 14 66 LDA JUMPTB1+1 1292 08cd b7 3f STA TONE1+2 1293 08cf 20 0a BRA FRSW1_1 1294 1295 08d1 c6 14 71 FRSW1_0 LDA JUMPTB1+12 If guard tone, then level 1 at -6 dB 1296 08d4 b7 3e STA TONE1+1 1297 08d6 c6 14 72 LDA JUMPTB1+13 1298 08d9 b7 3f STA TONE1+2 1299 1300 08db 9a FRSW1_1 CLI 1301 08dc 3f 4a CLR TIMOUTA 1302 08de be 55 FRSW1_2 LDX TEMP3 1303 08e0 b6 56 LDA TEMP4 1304 08e2 b7 33 STA TONE1ST+1 1305 08e4 bf 32 STX TONE1ST 1306 1307 08e6 cd 11 7d FRSW1_3 JSR CLRTIME Make sure device doesn't turn off during sweep 1308 08e9 cd 0e b0 JSR INKEY 1309 08ec a1 ff CMP #$FF 1310 08ee 27 f6 BEQ FRSW1_3 1311 08f0 a1 0b CMP #11 1312 08f2 27 24 BEQ FRSW1_5 1313 08f4 a1 0a CMP #10 1314 08f6 27 12 BEQ FRSW1_4 1315 08f8 a1 00 CMP #0 1316 08fa 26 ea BNE FRSW1_3 1317 1318 08fc b6 56 LDA TEMP4 1319 08fe b0 5a SUB VALUE+1 1320 0900 b7 56 STA TEMP4 1321 0902 b6 55 LDA TEMP3 1322 0904 b2 59 SBC VALUE 1323 0906 b7 55 STA TEMP3 1324 0908 20 d4 BRA FRSW1_2 1325 1326 090a b6 56 FRSW1_4 LDA TEMP4 1327 090c bb 5a ADD VALUE+1 1328 090e b7 56 STA TEMP4 1329 0910 b6 55 LDA TEMP3 1330 0912 b9 59 ADC VALUE 1331 0914 b7 55 STA TEMP3 1332 0916 20 c6 BRA FRSW1_2 1333 1334 0918 cd 11 4a FRSW1_5 JSR AUDIOFF 1335 1336 091b cd 0e b0 FRSW1_6 JSR INKEY 1337 091e a1 ff CMP #$FF 1338 0920 26 f9 BNE FRSW1_6 1339 1340 0922 81 RTS 1341 1342 0923 9b FRSWP2 SEI Frequency sweep # 2 1343 0924 3f 4a CLR TIMOUTA Make sure tone is played normally 1344 0926 3f 32 CLR TONE1ST 1345 0928 3f 33 CLR TONE1ST+1 1346 1347 092a 0e 67 0c BRSET 7,GUARD,FRSW2_0 Test for guard tone 1348 092d c6 14 65 LDA JUMPTB1 Tone 1 at 0 dB 1349 0930 b7 3e STA TONE1+1 1350 0932 c6 14 66 LDA JUMPTB1+1 1351 0935 b7 3f STA TONE1+2 1352 0937 20 0a BRA FRSW2_1 1353 1354 0939 c6 14 71 FRSW2_0 LDA JUMPTB1+12 If guard tone, then level 1 at -6 dB 1355 093c b7 3e STA TONE1+1 1356 093e c6 14 72 LDA JUMPTB1+13 1357 0941 b7 3f STA TONE1+2 1358 1359 0943 9a FRSW2_1 CLI 1360 0944 cd 11 7d FRSW2_2 JSR CLRTIME Make sure device doesn't turn off during 1361 0947 3c 33 INC TONE1ST+1 a sweep 1362 0949 26 02 BNE FRSW2_3 1363 094b 3c 32 INC TONE1ST 1364 094d ae 14 FRSW2_3 LDX #20 1365 094f 5a FRSW2_4 DECX 1366 0950 26 fd BNE FRSW2_4 1367 0952 cd 0e d5 JSR CURKEY 1368 0955 a1 0b CMP #11 1369 0957 27 09 BEQ FRSW2_5 1370 0959 3d 4f TST KEYS 1371 095b 27 e7 BEQ FRSW2_2 1372 095d cd 0e cd JSR GETKEY If key pressed, then empty keybuffer 1373 0960 20 e2 BRA FRSW2_2 1374 1375 0962 cd 11 4a FRSW2_5 JSR AUDIOFF 1376 1377 0965 cd 0e b0 FRSW2_6 JSR INKEY 1378 0968 a1 ff CMP #$FF 1379 096a 26 f9 BNE FRSW2_6 1380 096c 81 RTS 1381 1382 1383 096d cd 10 7c SCAN JSR KEYBEEP Number scanning 1384 0970 cd 0e cd JSR GETKEY Get macro to play 1385 0973 a1 09 CMP #9 If not 0-9, wrong macro 1386 0975 23 04 BLS SCAN_1 1387 0977 cd 10 3e SCAN_0 JSR SITBEEP 1388 097a 81 RTS 1389 097b 48 SCAN_1 LSLA 1390 097c 48 LSLA 1391 097d 48 LSLA 1392 097e 48 LSLA 1393 097f b7 65 STA MACSCAN 1394 0981 cd 10 7c JSR KEYBEEP 1395 0984 cd 0e cd JSR GETKEY Get macro to use for number 1396 0987 a1 09 CMP #9 1397 0989 22 ec BHI SCAN_0 1398 098b ba 65 ORA MACSCAN 1399 098d b7 65 STA MACSCAN 1400 1401 098f cd 10 7c JSR KEYBEEP 1402 1403 0992 cd 0f b4 JSR READVAL Get step size for number scan 1404 0995 3d 59 TST VALUE Step sizes can be 0-10 1405 0997 26 de BNE SCAN_0 1406 0999 b6 5a LDA VALUE+1 1407 099b a1 0a CMP #10 1408 099d 22 d8 BHI SCAN_0 1409 099f b7 66 STA MACSCNT 1410 09a1 b6 5b LDA MODE Preserve current mode 1411 09a3 b7 58 STA TEMP6 1412 09a5 1c 5b BSET 6,MODE Set macro bit 1413 1414 09a7 b6 56 SCAN_2 LDA TEMP4 This is the first macro 1415 09a9 44 LSRA 1416 09aa 44 LSRA 1417 09ab 44 LSRA 1418 09ac 44 LSRA 1419 09ad 08 62 18 BRSET 4,MACNEST,SCAN_35 Test for in-macro-mode scanning 1420 09b0 3f 62 CLR MACNEST 1421 09b2 1e 62 BSET 7,MACNEST Prevent macro pausing in scan mode 1422 09b4 cd 03 9f JSR PLAYMAC 1423 09b7 cd 11 4a JSR AUDIOFF 1424 1425 09ba cd 0e cd SCAN_3 JSR GETKEY Get *, 0 or # 1426 09bd a1 0b CMP #11 # means end of scan 1427 09bf 26 08 BNE SCAN_4 1428 09c1 cd 10 f3 JSR CFBEEP 1429 09c4 b6 58 LDA TEMP6 Restore mode 1430 09c6 b7 5b STA MODE 1431 09c8 81 SCAN_35 RTS 1432 1433 09c9 a1 0a SCAN_4 CMP #10 * means scan up 1434 09cb 27 08 BEQ SCAN_5 1435 09cd 4d TSTA 0 means scan down 1436 09ce 27 05 BEQ SCAN_5 1437 09d0 cd 10 3e JSR SITBEEP 1438 09d3 20 e5 BRA SCAN_3 1439 1440 09d5 b7 54 SCAN_5 STA TEMP2 1441 09d7 b6 65 LDA MACSCAN 1442 09d9 a4 0f AND #%00001111 1443 09db 5f CLRX 1444 09dc b7 55 STA TEMP3 First find start of this macro 1445 09de 3a 55 SCAN_6 DEC TEMP3 This is the one ? 1446 09e0 2b 0a BMI SCAN_8 1447 09e2 cd 0e e8 SCAN_7 JSR READMAC If not, read macro entry 1448 09e5 5c INCX Update counter for next read 1449 09e6 a1 3f CMP #%00111111 Last macro key 1450 09e8 26 f8 BNE SCAN_7 1451 09ea 20 f2 BRA SCAN_6 1452 1453 09ec bf 55 SCAN_8 STX TEMP3 Offset to start of macro 1454 1455 09ee cd 0e e8 SCAN_9 JSR READMAC 1456 09f1 5c INCX 1457 09f2 a1 3f CMP #%00111111 1458 09f4 26 f8 BNE SCAN_9 1459 1460 09f6 5a DECX 1461 09f7 5a DECX Offset to last digit of macro 1462 09f8 b3 55 CPX TEMP3 Is there at least one digit in this macro ? 1463 09fa 24 04 BHS SCAN_11 1464 09fc cd 10 3e SCAN_10 JSR SITBEEP 1465 09ff 81 RTS 1466 1467 0a00 b6 54 SCAN_11 LDA TEMP2 Is it an up- or down-scan (* or 0) ? 1468 0a02 26 2a BNE SCAN_13 1469 1470 0a04 cd 0e e8 JSR READMAC Get last digit of number 1471 0a07 a1 09 CMP #9 Make sure it really is a digit 1472 0a09 22 f1 BHI SCAN_10 1473 1474 0a0b b0 66 SUB MACSCNT Subtract the counter value 1475 0a0d 2b 05 BMI SCAN_12 < 0 1476 0a0f cd 0f 2c JSR WRITMAC 1477 0a12 20 93 BRA SCAN_2 1478 1479 0a14 ab 0a SCAN_12 ADD #10 1480 0a16 cd 0f 2c JSR WRITMAC 1481 0a19 5a DECX 1482 0a1a b3 55 CPX TEMP3 1483 0a1c 25 89 BLO SCAN_2 1484 0a1e cd 0e e8 JSR READMAC Get next number and make sure it is a digit 1485 0a21 a1 09 CMP #9 1486 0a23 22 82 BHI SCAN_2 1487 0a25 4a DECA 1488 0a26 2b ec BMI SCAN_12 1489 0a28 cd 0f 2c JSR WRITMAC 1490 0a2b cc 09 a7 JMP SCAN_2 1491 1492 0a2e cd 0e e8 SCAN_13 JSR READMAC Get last digit of number 1493 0a31 a1 09 CMP #9 Make sure it really is a digit 1494 0a33 22 c7 BHI SCAN_10 1495 1496 0a35 bb 66 ADD MACSCNT Subtract the counter value 1497 0a37 a1 09 CMP #9 1498 0a39 22 06 BHI SCAN_14 > 9 1499 0a3b cd 0f 2c JSR WRITMAC 1500 0a3e cc 09 a7 JMP SCAN_2 1501 1502 0a41 a0 0a SCAN_14 SUB #10 1503 0a43 cd 0f 2c JSR WRITMAC 1504 0a46 5a DECX 1505 0a47 b3 55 CPX TEMP3 1506 0a49 24 03 BHS SCAN_15 1507 0a4b cc 09 a7 JMP SCAN_2 1508 0a4e cd 0e e8 SCAN_15 JSR READMAC Get next number and make sure it is a digit 1509 0a51 a1 09 CMP #9 1510 0a53 23 03 BLS SCAN_16 1511 0a55 cc 09 a7 JMP SCAN_2 1512 0a58 4c SCAN_16 INCA 1513 0a59 a1 09 CMP #9 1514 0a5b 22 e4 BHI SCAN_14 1515 0a5d cd 0f 2c JSR WRITMAC 1516 0a60 cc 09 a7 JMP SCAN_2 1517 1518 ************************************************************************* 1519 * * 1520 * PROGKEY : program a key definition * 1521 * * 1522 * This routine will program a key definition of one of the two user * 1523 * modes (18 & 19) * 1524 * * 1525 ************************************************************************* 1526 1527 0a63 b6 5b PROGKEY LDA MODE Check mode we're in, because only user 1528 0a65 a4 1f AND #%00011111 modes 18 and 19 are programmable 1529 0a67 a1 12 CMP #18 1530 0a69 24 04 BHS PROG_1 1531 1532 0a6b cd 10 3e PROG_0 JSR SITBEEP If not in user programmable mode, SIT 1533 0a6e 81 RTS 1534 1535 0a6f cd 10 f3 PROG_1 JSR CFBEEP 1536 0a72 cd 0e cd JSR GETKEY Get the key to program 1537 0a75 a1 19 CMP #%00011001 ^* and ^# not allowed 1538 0a77 22 f2 BHI PROG_0 1539 1540 0a79 a5 10 BIT #16 Shift pressed ? 1541 0a7b 27 02 BEQ PROG_2 Then adjust keycode (0-11 non-shifted, 1542 0a7d a0 04 SUB #4 12-21 shifted) 1543 1544 0a7f b7 54 PROG_2 STA TEMP2 Temporarely store key code 1545 0a81 cd 10 7c JSR KEYBEEP 1546 0a84 5f CLRX If in mode 18, offset into key area is 0 1547 0a85 01 5b 02 BRCLR 0,MODE,PROG_3 If in mode 19, offset is US2OFS 1548 0a88 be 7e LDX US2OFS 1549 0a8a 3a 54 PROG_3 DEC TEMP2 Now find key definition so far 1550 0a8c 2b 19 BMI PROG_8 This is the one already ? 1551 1552 0a8e e6 80 PROG_4 LDA KEYAREA,X If not, get the number of bytes needed 1553 0a90 5c INCX for the key at X 1554 0a91 a5 10 BIT #%00010000 Time format (0 and 1 mean one extra byte) 1555 0a93 26 01 BNE PROG_5 1556 0a95 5c INCX 1557 1558 0a96 a5 20 PROG_5 BIT #%00100000 One tone, then 2 extra bytes 1559 0a98 26 05 BNE PROG_6 1560 0a9a a5 60 BIT #%01100000 No tone, then no extra bytes 1561 0a9c 27 03 BEQ PROG_7 1562 1563 0a9e 5c INCX Else, double tone and 3 extra bytes 1564 0a9f 5c PROG_6 INCX 1565 0aa0 5c INCX 1566 0aa1 a5 80 PROG_7 BIT #%10000000 Last tone ? 1567 0aa3 27 e9 BEQ PROG_4 1568 0aa5 20 e3 BRA PROG_3 1569 1570 0aa7 bf 55 PROG_8 STX TEMP3 Key found 1571 0aa9 bf 5d STX MACCNT 1572 0aab e6 80 LDA KEYAREA,X At this point X holds the offset into 1573 0aad a1 90 CMP #%10010000 the key area, to the current definition 1574 0aaf 27 11 BEQ PROG_10 Check if the key is being used 1575 0ab1 cd 10 52 JSR ALERT The key is not empty, so alert user 1576 0ab4 cd 0e cd JSR GETKEY And want # for confirmation 1577 0ab7 a1 0b CMP #11 1578 0ab9 27 04 BEQ PROG_9 1579 0abb cd 10 ed JSR DNTBEEP 1580 0abe 81 RTS 1581 1582 0abf cd 10 f3 PROG_9 JSR CFBEEP User confirmed to empty key, so let's do it 1583 1584 0ac2 be 55 PROG_10 LDX TEMP3 1585 0ac4 e6 80 PROG_11 LDA KEYAREA,X 1586 0ac6 5c INCX 1587 0ac7 a5 10 BIT #%00010000 Time format (0 and 1 mean one extra byte) 1588 0ac9 26 01 BNE PROG_12 1589 0acb 5c INCX 1590 1591 0acc a5 20 PROG_12 BIT #%00100000 One tone, then 2 extra bytes 1592 0ace 26 05 BNE PROG_13 1593 0ad0 a5 60 BIT #%01100000 No tones, then no extra bytes 1594 0ad2 27 03 BEQ PROG_14 1595 1596 0ad4 5c INCX Else double tone, 3 extra bytes 1597 0ad5 5c PROG_13 INCX 1598 0ad6 5c INCX 1599 0ad7 a5 80 PROG_14 BIT #%10000000 Last tone ? 1600 0ad9 27 e9 BEQ PROG_11 1601 1602 0adb bf 56 PROG_15 STX TEMP4 At this point X points to next key definition 1603 1604 0add e6 80 PROG_16 LDA KEYAREA,X Now move the key area back to delete old 1605 0adf be 55 LDX TEMP3 definition 1606 0ae1 e7 80 STA KEYAREA,X 1607 0ae3 3c 55 INC TEMP3 1608 0ae5 3c 56 INC TEMP4 1609 0ae7 be 56 LDX TEMP4 1610 0ae9 b3 7f CPX MODKEYS Have we done the whole area ? 1611 0aeb 26 f0 BNE PROG_16 1612 1613 0aed b6 55 LDA TEMP3 Substract the displacement from the total 1614 0aef b0 56 SUB TEMP4 number of keys 1615 0af1 b7 55 STA TEMP3 1616 0af3 bb 7f ADD MODKEYS 1617 0af5 b7 7f STA MODKEYS 1618 0af7 a6 80 LDA #%10000000 Indicate this is the first tone 1619 0af9 b7 57 STA TEMP5 1620 0afb 00 5b 06 BRSET 0,MODE,PROG_17 1621 0afe b6 55 LDA TEMP3 And if in mode 18 (first user mode) also 1622 0b00 bb 7e ADD US2OFS adjust offset into second mode 1623 0b02 b7 7e STA US2OFS 1624 1625 0b04 cd 0e cd PROG_17 JSR GETKEY Get number of tones or # to end programming 1626 0b07 a1 0b CMP #11 1627 0b09 26 03 BNE PROG_18 1628 0b0b cc 0c 31 JMP PROG_70 1629 1630 0b0e a1 02 PROG_18 CMP #2 If number of tones > 2 then mistake 1631 0b10 23 05 BLS PROG_19 1632 0b12 cd 10 3e JSR SITBEEP And try again 1633 0b15 20 ed BRA PROG_17 1634 1635 0b17 b7 55 PROG_19 STA TEMP3 Store # of tones 1636 0b19 cd 10 7c JSR KEYBEEP 1637 0b1c cd 0e cd PROG_20 JSR GETKEY Get time type 1638 0b1f a1 03 CMP #3 1639 0b21 23 05 BLS PROG_21 Only tones 0,1,2 and 3 are allowed 1640 0b23 cd 10 3e JSR SITBEEP If invalid type then try again 1641 0b26 20 f4 BRA PROG_20 1642 1643 0b28 b7 56 PROG_21 STA TEMP4 1644 0b2a cd 10 7c JSR KEYBEEP 1645 0b2d a6 01 LDA #1 Always one byte needed 1646 0b2f be 55 LDX TEMP3 Now check if the number of bytes needed for 1647 0b31 27 07 BEQ PROG_23 this tone is available in RAM 1648 0b33 a3 01 CPX #1 If 0 tones, no bytes needed for tone info 1649 0b35 27 01 BEQ PROG_22 If 1 tone, 2 extra bytes 1650 0b37 4c INCA If 2 tones, 3 extra bytes 1651 0b38 ab 02 PROG_22 ADD #2 1652 1653 0b3a be 56 PROG_23 LDX TEMP4 Get the time format 1654 0b3c a3 02 CPX #2 1655 0b3e 24 01 BHS PROG_24 If template time, then no extra bytes 1656 0b40 4c INCA else one extra for # of ms 1657 1658 0b41 b7 56 PROG_24 STA TEMP4 1659 0b43 bb 7f ADD MODKEYS 1660 0b45 a1 64 CMP #MAXKEYS Still enough room ? 1661 0b47 23 03 BLS PRG_240 1662 1663 0b49 cc 0c 2c JMP PROG_69 If not, sound mistake bell and exit 1664 1665 0b4c b7 7f PRG_240 STA MODKEYS Adjust number of key entries 1666 1667 0b4e 00 5b 06 BRSET 0,MODE,PROG_25 1668 0b51 b6 56 LDA TEMP4 And if in mode 18 (first user mode) also 1669 0b53 bb 7e ADD US2OFS adjust offset into second mode 1670 0b55 b7 7e STA US2OFS 1671 1672 0b57 58 PROG_25 LSLX Shift time template in proper bit position 1673 0b58 58 LSLX 1674 0b59 58 LSLX 1675 0b5a bf 57 STX TEMP5 1676 1677 0b5c b6 55 LDA TEMP3 Shift # tones into position 1678 0b5e 44 LSRA 0000 000x (x) 1679 0b5f 46 RORA x000 0000 (x) 1680 0b60 46 RORA xx00 0000 (0) 1681 0b61 44 LSRA 0xx0 0000 1682 0b62 ba 57 ORA TEMP5 Or the time template and # of tones 1683 0b64 b7 55 STA TEMP3 1684 1685 0b66 b6 7f LDA MODKEYS 1686 0b68 b7 57 STA TEMP5 1687 0b6a b0 56 SUB TEMP4 1688 0b6c b7 56 STA TEMP4 1689 1690 0b6e 3a 56 PROG_26 DEC TEMP4 Now move the key area to make room for new 1691 0b70 3a 57 DEC TEMP5 definition 1692 0b72 be 56 LDX TEMP4 1693 0b74 e6 80 LDA KEYAREA,X 1694 0b76 be 57 LDX TEMP5 1695 0b78 e7 80 STA KEYAREA,X 1696 0b7a b6 56 LDA TEMP4 1697 0b7c b1 5d CMP MACCNT 1698 0b7e 26 ee BNE PROG_26 1699 1700 0b80 cd 0f b4 PROG_27 JSR READVAL Get time in ms or time template # 1701 0b83 08 55 11 BRSET 4,TEMP3,PROG_29 Is it a template time or ms 1702 0b86 b6 59 LDA VALUE If in ms, range is 0-2047 1703 0b88 a1 07 CMP #7 Range valid ? 1704 0b8a 22 06 BHI PROG_28 1705 0b8c be 5a LDX VALUE+1 1706 0b8e bf 56 STX TEMP4 1707 0b90 20 0f BRA PROG_30 1708 1709 0b92 cd 10 3e PROG_28 JSR SITBEEP If out of range, sound mistake beep 1710 0b95 20 e9 BRA PROG_27 And let user try again 1711 1712 0b97 b6 59 PROG_29 LDA VALUE If time template, then range is 0-7 1713 0b99 26 f7 BNE PROG_28 1714 0b9b b6 5a LDA VALUE+1 Out of range ? 1715 0b9d a1 07 CMP #7 1716 0b9f 22 f1 BHI PROG_28 Try again 1717 1718 0ba1 ba 55 PROG_30 ORA TEMP3 OR template time or 3 MSB of time into word 1719 0ba3 be 5d LDX MACCNT 1720 0ba5 bf 57 STX TEMP5 Preserve the offset to this tone in TEMP5 1721 0ba7 e7 80 STA KEYAREA,X 1722 0ba9 3c 5d INC MACCNT 1723 0bab 08 55 06 BRSET 4,TEMP3,PROG_31 If the time is in ms, then store low 8 bits 1724 0bae b6 56 LDA TEMP4 1725 0bb0 e7 81 STA KEYAREA+1,X 1726 0bb2 3c 5d INC MACCNT 1727 1728 0bb4 b6 55 PROG_31 LDA TEMP3 Now check the number of tones to read 1729 0bb6 a4 60 AND #%01100000 1730 0bb8 27 6c BEQ PROG_44 Silence, then ready, get next tone definition 1731 0bba cd 0f b4 PROG_32 JSR READVAL Else get dB level of first tone 1732 0bbd b6 59 LDA VALUE 1733 0bbf 27 05 BEQ PROG_34 dB level should be between 0 and 15 1734 1735 0bc1 cd 10 3e PROG_33 JSR SITBEEP 1736 0bc4 20 f4 BRA PROG_32 1737 1738 0bc6 b6 5a PROG_34 LDA VALUE+1 1739 0bc8 a1 0f CMP #15 1740 0bca 22 f5 BHI PROG_33 1741 1742 0bcc be 5d LDX MACCNT 1743 0bce 48 LSLA 1744 0bcf 48 LSLA 1745 0bd0 48 LSLA 1746 0bd1 48 LSLA 1747 0bd2 e7 80 STA KEYAREA,X 1748 1749 0bd4 cd 0f b4 PROG_35 JSR READVAL Get freq # for this tone 1750 0bd7 b6 59 LDA VALUE freq # should be between 0 and MAXFREQS 1751 0bd9 27 05 BEQ PROG_37 1752 1753 0bdb cd 10 3e PROG_36 JSR SITBEEP 1754 0bde 20 f4 BRA PROG_35 1755 1756 0be0 b6 5a PROG_37 LDA VALUE+1 1757 0be2 a1 6b CMP #MAXFREQ 1758 0be4 22 f5 BHI PROG_36 1759 1760 0be6 be 5d LDX MACCNT 1761 0be8 e7 81 STA KEYAREA+1,X Store frequency # 1762 1763 0bea 0c 55 06 BRSET 6,TEMP3,PROG_38 Two tones, then read next 1764 0bed 3c 5d INC MACCNT One tone means two bytes needed 1765 0bef 3c 5d INC MACCNT 1766 0bf1 20 33 BRA PROG_44 1767 1768 0bf3 cd 0f b4 PROG_38 JSR READVAL Get dB level of second tone 1769 0bf6 b6 59 LDA VALUE 1770 0bf8 27 05 BEQ PROG_40 db level should be between 0 and 15 1771 1772 0bfa cd 10 3e PROG_39 JSR SITBEEP 1773 0bfd 20 f4 BRA PROG_38 1774 1775 0bff b6 5a PROG_40 LDA VALUE+1 1776 0c01 a1 0f CMP #15 1777 0c03 22 f5 BHI PROG_39 1778 1779 0c05 be 5d LDX MACCNT 1780 0c07 ea 80 ORA KEYAREA,X 1781 0c09 e7 80 STA KEYAREA,X 1782 1783 0c0b cd 0f b4 PROG_41 JSR READVAL Get freq # for this tone 1784 0c0e b6 59 LDA VALUE freq # should be between 0 and MAXFREQS 1785 0c10 27 05 BEQ PROG_43 1786 1787 0c12 cd 10 3e PROG_42 JSR SITBEEP 1788 0c15 20 f4 BRA PROG_41 1789 1790 0c17 b6 5a PROG_43 LDA VALUE+1 1791 0c19 a1 6b CMP #MAXFREQ 1792 0c1b 22 f5 BHI PROG_42 1793 1794 0c1d be 5d LDX MACCNT 1795 0c1f e7 82 STA KEYAREA+2,X Store frequency # 1796 0c21 5c INCX Two tones mean 3 bytes needed 1797 0c22 5c INCX 1798 0c23 5c INCX 1799 0c24 bf 5d STX MACCNT 1800 1801 0c26 cd 10 f3 PROG_44 JSR CFBEEP Sound confirmation to indicate key programmed 1802 0c29 cc 0b 04 JMP PROG_17 Get next tone (or # for end) 1803 1804 0c2c cd 10 3e PROG_69 JSR SITBEEP End of key programming because of memory 1805 0c2f 20 03 BRA PROG_71 problems 1806 0c31 cd 10 f3 PROG_70 JSR CFBEEP End of key programming, user pressed # 1807 0c34 0e 57 09 PROG_71 BRSET 7,TEMP5,PROG_72 Check if we already had a key 1808 0c37 be 57 LDX TEMP5 If not, TEMP5 holds offset to start of last 1809 0c39 e6 80 LDA KEYAREA,X tone 1810 0c3b aa 80 ORA #%10000000 1811 0c3d e7 80 STA KEYAREA,X 1812 0c3f 81 RTS 1813 1814 0c40 be 7f PROG_72 LDX MODKEYS 1815 0c42 5a PROG_73 DECX 1816 0c43 e6 80 LDA KEYAREA,X 1817 0c45 5c INCX 1818 0c46 e7 80 STA KEYAREA,X 1819 0c48 5a DECX 1820 0c49 b3 5d CPX MACCNT 1821 0c4b 26 f5 BNE PROG_73 1822 0c4d a6 90 LDA #%10010000 1823 0c4f e7 80 STA KEYAREA,X 1824 0c51 3c 7f INC MODKEYS 1825 0c53 00 5b 02 BRSET 0,MODE,PROG_74 1826 0c56 3c 7e INC US2OFS 1827 0c58 81 PROG_74 RTS 1828 1829 ************************************************************************* 1830 * * 1831 * PLAYKEY : Plays key in current mode * 1832 * * 1833 * On entry : A = key * 1834 * * 1835 * A should be in the key format : 000s kkkk * 1836 * * 1837 ************************************************************************* 1838 1839 0c59 a5 10 PLAYKEY BIT #16 If shift key is pressed then 1840 0c5b 27 02 BEQ PLK_0 substract 4 of keycode, to let codes 1841 0c5d a0 04 SUB #4 16-25 become 12-21 1842 0c5f b7 53 PLK_0 STA TEMP1 1843 0c61 b6 5b LDA MODE 1844 0c63 a4 1f AND #%00011111 Get current mode 1845 0c65 a1 12 CMP #18 Is it a ROM or RAM mode 1846 0c67 25 16 BLO PLK_2 1847 0c69 26 09 BNE PLK_1 1848 0c6b a6 80 LDA #KEYAREA Mode 18 = User mode 1 1849 0c6d b7 7c STA LOC+1 1850 0c6f 3f 7b CLR LOC It is a RAM mode, so zero-page table 1851 0c71 5f CLRX 1852 0c72 20 1f BRA PLK_3 1853 0c74 a6 80 PLK_1 LDA #KEYAREA Mode 19 = User mode 2 1854 0c76 bb 7e ADD US2OFS 1855 0c78 b7 7c STA LOC+1 1856 0c7a 3f 7b CLR LOC It is a RAM mode, so zero-page table 1857 0c7c 5f CLRX 1858 0c7d 20 14 BRA PLK_3 1859 0c7f a1 01 PLK_2 CMP #1 Is it special mode 1 (ATF1) 1860 0c81 26 03 BNE PLK_200 1861 0c83 cc 0e 0b JMP PLKATF1 Then play key special way 1862 0c86 97 PLK_200 TAX It's a ROM mode, so get base offset 1863 0c87 58 LSLX 1864 0c88 d6 14 f5 LDA ROMMDS,X 1865 0c8b b7 7b STA LOC 1866 0c8d d6 14 f6 LDA ROMMDS+1,X 1867 0c90 b7 7c STA LOC+1 LOC now contains base of mode, now find key 1868 0c92 5f CLRX 1869 0c93 3a 53 PLK_3 DEC TEMP1 Is this our key ? 1870 0c95 2b 33 BMI PLK_11 Then LOC +x is base of key 1871 0c97 bd 7a PLK_4 JSR GETBYTE Get byte from effective address LOC points to 1872 1873 0c99 5c INCX Increment X for next read 1874 0c9a 26 02 BNE PLK_5 1875 0c9c 3c 7b INC LOC 1876 1877 0c9e a5 10 PLK_5 BIT #%00010000 Test time format (0,1 means 1 extra byte) 1878 0ca0 26 05 BNE PLK_6 1879 0ca2 5c INCX 1880 0ca3 26 02 BNE PLK_6 1881 0ca5 3c 7b INC LOC 1882 1883 0ca7 a5 40 PLK_6 BIT #%01000000 Two tones ? Then 3 extra bytes 1884 0ca9 26 0a BNE PLK_7 1885 0cab a5 20 BIT #%00100000 One tone ? Then 2 extra byte 1886 0cad 26 0b BNE PLK_8 1887 0caf a5 80 BIT #%10000000 Last tone ? 1888 0cb1 27 e4 BEQ PLK_4 1889 0cb3 20 de BRA PLK_3 1890 0cb5 5c PLK_7 INCX 1891 0cb6 26 02 BNE PLK_8 1892 0cb8 3c 7b INC LOC 1893 0cba 5c PLK_8 INCX 1894 0cbb 26 02 BNE PLK_9 1895 0cbd 3c 7b INC LOC 1896 0cbf 5c PLK_9 INCX 1897 0cc0 26 02 BNE PLK_10 1898 0cc2 3c 7b INC LOC 1899 0cc4 a5 80 PLK_10 BIT #%10000000 Last tone ? 1900 0cc6 27 cf BEQ PLK_4 1901 0cc8 20 c9 BRA PLK_3 1902 1903 0cca 9f PLK_11 TXA At this point the position (LOC) + x is base 1904 0ccb bb 7c ADD LOC+1 1905 0ccd b7 7c STA LOC+1 1906 0ccf 24 02 BCC PLK_12 1907 0cd1 3c 7b INC LOC Now LOC -> base of key 1908 1909 0cd3 5f PLK_12 CLRX 1910 1911 0cd4 bd 7a PLK_13 JSR GETBYTE 1912 0cd6 b7 53 STA TEMP1 1913 0cd8 a4 18 AND #%00011000 1914 0cda 27 25 BEQ PLK_16 Fixed time tone 1915 1916 0cdc a1 10 CMP #%00010000 1917 0cde 27 0d BEQ PLK_15 Template time 1918 0ce0 22 06 BHI PLK_14 1919 0ce2 0c 5b 1c BRSET 6,MODE,PLK_16 Play while pressed or fixed time in macro 1920 0ce5 5c INCX If not in macro, just skip time 1921 0ce6 20 38 BRA PLK_18 1922 1923 0ce8 0c 5b 02 PLK_14 BRSET 6,MODE,PLK_15 Play while pressed or template time in macro 1924 0ceb 20 33 BRA PLK_18 1925 1926 0ced bf 54 PLK_15 STX TEMP2 Template time, so get index into time 1927 0cef b6 53 LDA TEMP1 template table 1928 0cf1 a4 07 AND #%00000111 1929 0cf3 97 TAX 1930 0cf4 58 LSLX 1931 0cf5 e6 6a LDA TIMTMPL,X Get value in 1/1024 secs from time template 1932 0cf7 40 NEGA 1933 0cf8 9b SEI 1934 0cf9 b7 46 STA TICKER 1935 0cfb e6 6b LDA TIMTMPL+1,X 1936 0cfd be 54 LDX TEMP2 1937 0cff 20 0b BRA PLK_17 And let fixed time routine finish the job 1938 1939 0d01 5c PLK_16 INCX Play fixed time, so get time in 1/1024 secs 1940 0d02 b6 53 LDA TEMP1 1941 0d04 a4 07 AND #%111 3 high bits in first key byte 1942 0d06 40 NEGA Negate, because we use an up counter to 0 1943 0d07 9b SEI 1944 0d08 b7 46 STA TICKER 1945 0d0a bd 7a JSR GETBYTE Get lower 8 bits 1946 0d0c 40 PLK_17 NEGA 1947 0d0d b7 47 STA TICKER+1 1948 0d0f 24 02 BCC PLK_170 1949 0d11 3a 46 DEC TICKER 1950 0d13 38 47 PLK_170 LSL TICKER+1 Convert to 1/8192 sec (= *8) 1951 0d15 39 46 ROL TICKER 1952 0d17 38 47 LSL TICKER+1 1953 0d19 39 46 ROL TICKER 1954 0d1b 38 47 LSL TICKER+1 1955 0d1d 39 46 ROL TICKER 1956 0d1f 9a CLI 1957 0d20 1e 48 PLK_18 BSET 7,NEXTSTR Set strobe bit for timing 1958 0d22 b6 53 LDA TEMP1 1959 0d24 a4 60 AND #%01100000 Now get # of tones 1960 0d26 26 1a BNE PLK_20 No tones, no music 1961 0d28 9b SEI 1962 0d29 3f 32 CLR TONE1ST 1963 0d2b 3f 33 CLR TONE1ST+1 1964 0d2d 3f 30 CLR TONE1CT 1965 0d2f 3f 31 CLR TONE1CT+1 1966 0d31 9a CLI 1967 0d32 bf 54 STX TEMP2 1968 0d34 b6 53 LDA TEMP1 Special case, silence on template 0 = 1969 0d36 a4 1f AND #%00011111 0 ms of silence 1970 0d38 a1 10 CMP #%00010000 1971 0d3a 26 03 BNE PLK_19 1972 0d3c cc 0d f5 JMP PLK_26 1973 0d3f cc 0d db PLK_19 JMP PLK_23 1974 0d42 5c PLK_20 INCX If tones, get dB levels 1975 0d43 bd 7a JSR GETBYTE 1976 0d45 bf 54 STX TEMP2 1977 0d47 0f 67 26 BRCLR 7,GUARD,PLK_22 If guard tone is playing, calculate tone 1978 0d4a b6 53 LDA TEMP1 levels 1979 0d4c a4 60 AND #%01100000 If one tone is playing, guard and tone at -6 dB 1980 0d4e a1 20 CMP #%00100000 1981 0d50 26 10 BNE PLK_21 1982 0d52 9b SEI 1983 0d53 c6 14 b1 LDA JUMPTB3+12 -6 dB 1984 0d56 b7 44 STA TONE3+1 1985 0d58 c6 14 b2 LDA JUMPTB3+13 1986 0d5b b7 45 STA TONE3+2 1987 0d5d 9a CLI 1988 0d5e a6 66 LDA #$66 -6 dB 1989 0d60 20 0e BRA PLK_22 1990 0d62 9b PLK_21 SEI Two tones, play guard and 2 tones at -10 dB 1991 0d63 c6 14 b9 LDA JUMPTB3+20 -10 dB 1992 0d66 b7 44 STA TONE3+1 1993 0d68 c6 14 ba LDA JUMPTB3+21 1994 0d6b b7 45 STA TONE3+2 1995 0d6d 9a CLI 1996 0d6e a6 aa LDA #$AA -10 dB 1997 0d70 b7 55 PLK_22 STA TEMP3 1998 0d72 a4 f0 AND #%11110000 dB level tone A 1999 0d74 97 TAX 2000 0d75 54 LSRX 2001 0d76 54 LSRX 2002 0d77 54 LSRX 2003 0d78 d6 14 65 LDA JUMPTB1,X 2004 0d7b de 14 66 LDX JUMPTB1+1,X 2005 0d7e 9b SEI 2006 0d7f b7 3e STA TONE1+1 2007 0d81 bf 3f STX TONE1+2 2008 0d83 9a CLI 2009 0d84 b6 55 LDA TEMP3 2010 0d86 a4 0f AND #%00001111 dB level tone B 2011 0d88 97 TAX 2012 0d89 58 LSLX 2013 0d8a d6 14 85 LDA JUMPTB2,X 2014 0d8d de 14 86 LDX JUMPTB2+1,X 2015 0d90 9b SEI 2016 0d91 b7 41 STA TONE2+1 2017 0d93 bf 42 STX TONE2+2 2018 0d95 9a CLI 2019 0d96 3c 54 INC TEMP2 Now, get tone A 2020 0d98 be 54 LDX TEMP2 2021 0d9a bd 7a JSR GETBYTE 2022 0d9c 97 TAX 2023 0d9d 58 LSLX 2024 0d9e d6 01 48 LDA FREQTBL,X 2025 0da1 de 01 49 LDX FREQTBL+1,X 2026 0da4 4d TSTA 2027 0da5 26 15 BNE PLK_222 Test if it's 1 or 2 Hz (off/on hook) 2028 0da7 a3 08 CPX #8 2029 0da9 26 04 BNE PLK_220 2030 0dab 18 01 BSET 4,PORTB 2031 0dad 20 06 BRA PLK_221 2032 0daf a3 10 PLK_220 CPX #16 2033 0db1 26 09 BNE PLK_222 2034 0db3 19 01 BCLR 4,PORTB 2035 0db5 9b PLK_221 SEI 2036 0db6 3f 32 CLR TONE1ST 2037 0db8 3f 33 CLR TONE1ST+1 2038 0dba 20 05 BRA PLK_223 2039 0dbc 9b PLK_222 SEI 2040 0dbd b7 32 STA TONE1ST 2041 0dbf bf 33 STX TONE1ST+1 2042 0dc1 9a PLK_223 CLI 2043 0dc2 0d 53 16 BRCLR 6,TEMP1,PLK_23 Check if there are 1 or 2 tones here 2044 0dc5 3c 54 INC TEMP2 Now, get tone B 2045 0dc7 be 54 LDX TEMP2 2046 0dc9 bd 7a JSR GETBYTE 2047 0dcb 97 TAX 2048 0dcc 58 LSLX 2049 0dcd d6 01 48 LDA FREQTBL,X 2050 0dd0 de 01 49 LDX FREQTBL+1,X 2051 0dd3 9b SEI 2052 0dd4 b7 36 STA TONE2ST 2053 0dd6 bf 37 STX TONE2ST+1 2054 0dd8 9a CLI 2055 0dd9 20 0a BRA PLK_24 2056 0ddb 9b PLK_23 SEI If 1 tone, make sure tone 2 is DC at 0 V 2057 0ddc 3f 36 CLR TONE2ST 2058 0dde 3f 37 CLR TONE2ST+1 2059 0de0 3f 34 CLR TONE2CT 2060 0de2 3f 35 CLR TONE2CT+1 2061 0de4 9a CLI 2062 0de5 b6 53 PLK_24 LDA TEMP1 2063 0de7 a4 18 AND #%00011000 2064 0de9 27 07 BEQ PLK_25 Fixed time 2065 0deb a1 10 CMP #%00010000 2066 0ded 27 03 BEQ PLK_25 Template time 2067 0def 0d 5b 0c BRCLR 6,MODE,PLK_27 2068 0df2 0e 48 fd PLK_25 BRSET 7,NEXTSTR,PLK_25 Play as long as strobe is set 2069 0df5 0e 53 12 PLK_26 BRSET 7,TEMP1,PLK_28 Last tone of this key ? 2070 0df8 be 54 LDX TEMP2 2071 0dfa 5c INCX 2072 0dfb cc 0c d4 JMP PLK_13 2073 2074 0dfe cd 11 7d PLK_27 JSR CLRTIME Make sure thingy doesn't die 2075 0e01 cd 0e d5 JSR CURKEY 2076 0e04 a1 ff CMP #$FF 2077 0e06 26 f6 BNE PLK_27 2078 0e08 20 eb BRA PLK_26 2079 2080 0e0a 81 PLK_28 RTS Mind that at return, tone is still playing 2081 2082 0e0b b6 53 PLKATF1 LDA TEMP1 Plays an ATF1 key. ATF1 and C3 are somewhat 2083 0e0d a1 0c CMP #12 different than 'normal' mode 2084 0e0f 23 04 BLS PLATF_0 Only 0-9, *, # and ^0 are allowed 2085 0e11 cd 10 3e JSR SITBEEP 2086 0e14 81 RTS 2087 0e15 48 PLATF_0 LSLA Get offset into ATF1 table 2088 0e16 97 TAX And get bit pattern of message to send 2089 0e17 d6 0e 8b LDA ATF1TBL,X 2090 0e1a b7 54 STA TEMP2 2091 0e1c d6 0e 8c LDA ATF1TBL+1,X 2092 0e1f b7 55 STA TEMP3 2093 0e21 a6 10 LDA #16 We are going to send 16 bits 2094 0e23 b7 56 STA TEMP4 2095 0e25 9b SEI 2096 0e26 3f 35 CLR TONE2CT+1 Single tone, so tone 2 shut up 2097 0e28 3f 34 CLR TONE2CT 2098 0e2a 3f 37 CLR TONE2ST+1 2099 0e2c 3f 36 CLR TONE2ST 2100 0e2e 0f 67 0a BRCLR 7,GUARD,PLATF_1 If guard tone is playing, set level at -6 dB 2101 0e31 c6 14 b1 LDA JUMPTB3+12 2102 0e34 b7 44 STA TONE3+1 2103 0e36 c6 14 b2 LDA JUMPTB3+13 2104 0e39 b7 45 STA TONE3+2 2105 0e3b c6 14 71 PLATF_1 LDA JUMPTB1+12 2106 0e3e b7 3e STA TONE1+1 2107 0e40 c6 14 72 LDA JUMPTB1+13 2108 0e43 b7 3f STA TONE1+2 2109 0e45 b6 53 LDA TEMP1 2110 0e47 a1 0a CMP #10 * pressed, then special case, send preamble 2111 0e49 26 16 BNE PLATF_3 2112 0e4b a6 ec LDA #236 600 ms preamble 2113 0e4d b7 46 STA TICKER 2114 0e4f a6 cd LDA #205 2115 0e51 b7 47 STA TICKER+1 2116 0e53 ae 40 LDX #ATF1_HI/256 2117 0e55 a6 b0 LDA #ATF1_HI 2118 0e57 bf 32 STX TONE1ST 2119 0e59 b7 33 STA TONE1ST+1 2120 0e5b 9a CLI 2121 0e5c 1e 48 BSET 7,NEXTSTR 2122 0e5e 0e 48 fd PLATF_2 BRSET 7,NEXTSTR,PLATF_2 Play as long as strobe is set 2123 2124 0e61 9b PLATF_3 SEI 2125 0e62 a6 ff LDA #$FF Program bit period to 10 ms 2126 0e64 b7 46 STA TICKER 2127 0e66 a6 af LDA #$AF 2128 0e68 b7 47 STA TICKER+1 2129 0e6a 9a CLI 2130 0e6b 38 55 LSL TEMP3 2131 0e6d 39 54 ROL TEMP2 2132 0e6f 24 06 BCC PLATF_4 2133 0e71 ae 40 LDX #ATF1_HI/256 2134 0e73 a6 b0 LDA #ATF1_HI 2135 0e75 20 04 BRA PLATF_5 2136 0e77 ae 3c PLATF_4 LDX #ATF1_LO/256 2137 0e79 a6 f0 LDA #ATF1_LO 2138 0e7b 9b PLATF_5 SEI 2139 0e7c bf 32 STX TONE1ST 2140 0e7e b7 33 STA TONE1ST+1 2141 0e80 9a CLI 2142 0e81 1e 48 BSET 7,NEXTSTR 2143 0e83 0e 48 fd PLATF_6 BRSET 7,NEXTSTR,PLATF_6 Play as long as strobe is set 2144 0e86 3a 56 DEC TEMP4 2145 0e88 26 d7 BNE PLATF_3 2146 0e8a 81 RTS 2147 2148 0e8b 76 03 ATF1TBL FCB %01110110,%00000011 0 2149 0e8d 75 05 FCB %01110101,%00000101 1 2150 0e8f 74 89 FCB %01110100,%10001001 2 2151 0e91 74 51 FCB %01110100,%01010001 3 2152 0e93 73 06 FCB %01110011,%00000110 4 2153 0e95 72 8a FCB %01110010,%10001010 5 2154 0e97 72 52 FCB %01110010,%01010010 6 2155 0e99 71 8c FCB %01110001,%10001100 7 2156 0e9b 71 54 FCB %01110001,%01010100 8 2157 0e9d 70 d8 FCB %01110000,%11011000 9 2158 0e9f 72 22 FCB %01110010,%00100010 * - Start 2159 0ea1 74 21 FCB %01110100,%00100001 # - Stop 2160 0ea3 75 55 FCB %01110101,%01010101 ^0 - Cancel 2161 2162 ************************************************************************* 2163 * * 2164 * SETMODE : Set current mode * 2165 * * 2166 * On entry : A = mode # * 2167 * * 2168 ************************************************************************* 2169 2170 2171 0ea5 b7 53 SETMODE STA TEMP1 2172 0ea7 b6 5b LDA MODE 2173 0ea9 a4 e0 AND #%11100000 2174 0eab ba 53 ORA TEMP1 2175 0ead b7 5b STA MODE 2176 0eaf 81 RTS 2177 2178 ************************************************************************* 2179 * * 2180 * INKEY : gets a key from the keyboard buffer * 2181 * * 2182 * On entry : ----- * 2183 * On exit : A = $FF : keyboard buffer empty * 2184 * otherwise : A = keycode * 2185 * * 2186 ************************************************************************* 2187 2188 0eb0 9b INKEY SEI Disable interrupts to prevent keyboard 2189 0eb1 be 4f LDX KEYS buffer status to be changed within this 2190 0eb3 27 14 BEQ INK_1 function 2191 0eb5 b6 4b LDA KEYBUF Get key code at top of keyboard buffer 2192 0eb7 b7 53 STA TEMP1 And shift all other keyboard entries 2193 0eb9 5f CLRX one to the top 2194 0eba e6 4c INK_0 LDA KEYBUF+1,X 2195 0ebc e7 4b STA KEYBUF,X 2196 0ebe 5c INCX 2197 0ebf b3 4f CPX KEYS 2198 0ec1 26 f7 BNE INK_0 2199 0ec3 3a 4f DEC KEYS 2200 0ec5 b6 53 LDA TEMP1 2201 0ec7 9a CLI Enable interrupts again 2202 0ec8 81 RTS 2203 2204 0ec9 a6 ff INK_1 LDA #$FF No keys in buffer, then return $FF 2205 0ecb 9a CLI 2206 0ecc 81 RTS 2207 2208 ************************************************************************* 2209 * * 2210 * GETKEY : waits for a key to be pressed and returns key code * 2211 * * 2212 * On entry : ----- * 2213 * On exit : A = keycode * 2214 * * 2215 ************************************************************************* 2216 2217 0ecd cd 0e b0 GETKEY JSR INKEY Get key from keyboard buffer 2218 0ed0 a1 ff CMP #$FF If buffer empty, wait 2219 0ed2 27 f9 BEQ GETKEY 2220 0ed4 81 RTS 2221 2222 ************************************************************************* 2223 * * 2224 * CURKEY : returns key code of key currently pressed (or serial) * 2225 * * 2226 * On entry : ----- * 2227 * On exit : A = $FF : no key pressed at the moment * 2228 * otherwise : A = keycode * 2229 * * 2230 ************************************************************************* 2231 2232 0ed5 0d 51 05 CURKEY BRCLR 6,KEYSTAT,CURK_0 2233 2234 0ed8 b6 51 LDA KEYSTAT 2235 0eda a4 1f AND #%00011111 2236 0edc 81 RTS 2237 2238 0edd 0d 52 05 CURK_0 BRCLR 6,SERSTAT,CURK_1 2239 0ee0 b6 52 LDA SERSTAT 2240 0ee2 a4 1f AND #%00011111 2241 0ee4 81 RTS 2242 2243 0ee5 a6 ff CURK_1 LDA #$FF 2244 0ee7 81 RTS 2245 2246 ************************************************************************* 2247 * * 2248 * READMAC : gets a 6-bit entry from the macro area * 2249 * * 2250 * On entry : X = entry # * 2251 * On exit : A = entry, X is preserved * 2252 * * 2253 ************************************************************************* 2254 2255 0ee8 bf 53 READMAC STX TEMP1 Find the byte(s) the 6-bit entry will be in 2256 0eea 9f TXA 2257 0eeb 48 LSLA 2258 0eec bb 53 ADD TEMP1 A*3 2259 0eee 97 TAX 2260 0eef 56 RORX X will point to the first byte (maybe the only) 2261 0ef0 54 LSRX that holds the 6-bit entry 2262 0ef1 48 LSLA 2263 0ef2 a4 06 AND #6 A will now hold the number of right shifts 2264 0ef4 a1 02 CMP #2 2265 0ef6 25 15 BLO READM_0 No right shifts are needed 2266 0ef8 27 1b BEQ READM_1 2 right shifts are needed 2267 0efa a1 04 CMP #4 2268 0efc 27 1f BEQ READM_2 4 right shifts are needed 2269 2270 0efe d6 01 01 LDA MACROS+1,X Else 6 right shifts are needed (2 left shifts) 2271 0f01 de 01 00 LDX MACROS,X X -> kkxx xxxx = X 2272 0f04 58 LSLX xxxx kkkk = A 2273 0f05 49 ROLA 2274 0f06 58 LSLX 2275 0f07 49 ROLA 2276 0f08 a4 3f AND #%00111111 2277 0f0a be 53 LDX TEMP1 2278 0f0c 81 RTS 2279 2280 0f0d d6 01 00 READM_0 LDA MACROS,X X -> xxkk kkkk = A 2281 0f10 a4 3f AND #%00111111 xxxx xxxx 2282 0f12 be 53 LDX TEMP1 2283 0f14 81 RTS 2284 2285 0f15 d6 01 00 READM_1 LDA MACROS,X X -> kkkk kkxx = A 2286 0f18 44 LSRA xxxx xxxx 2287 0f19 44 LSRA 2288 0f1a be 53 LDX TEMP1 2289 0f1c 81 RTS 2290 2291 0f1d d6 01 00 READM_2 LDA MACROS,X X -> kkkk xxxx = A 2292 0f20 de 01 01 LDX MACROS+1,X xxxx xxkk = X 2293 0f23 54 LSRX 2294 0f24 46 RORA 2295 0f25 54 LSRX 2296 0f26 46 RORA 2297 0f27 44 LSRA 2298 0f28 44 LSRA 2299 0f29 be 53 LDX TEMP1 2300 0f2b 81 RTS 2301 2302 ************************************************************************* 2303 * * 2304 * WRITMAC : write a 6-bit entry into the macro area * 2305 * * 2306 * On entry : A = entry * 2307 * X = entry # * 2308 * On exit : X is preserved * 2309 * * 2310 ************************************************************************* 2311 2312 0f2c b7 53 WRITMAC STA TEMP1 Find the byte(s) the 6-bit entry will be in 2313 0f2e bf 54 STX TEMP2 2314 0f30 9f TXA 2315 0f31 48 LSLA 2316 0f32 bb 54 ADD TEMP2 A*3 (Note that the carry bit is used) 2317 0f34 97 TAX 2318 0f35 56 RORX X will point to the first byte (maybe the only) 2319 0f36 54 LSRX that holds the 6-bit entry 2320 0f37 48 LSLA 2321 0f38 a4 06 AND #6 A will now hold the number of left shifts 2322 0f3a a1 02 CMP #2 2323 0f3c 25 2b BLO WRITM_0 No left shifts are needed 2324 0f3e 27 36 BEQ WRITM_1 2 left shifts are needed 2325 0f40 a1 04 CMP #4 2326 0f42 27 43 BEQ WRITM_2 4 left shifts are needed 2327 2328 0f44 b6 53 LDA TEMP1 X -> kkxx xxxx 2329 0f46 b7 5a STA VALUE+1 xxxx kkkk 2330 0f48 3f 59 CLR VALUE 2331 0f4a 34 5a LSR VALUE+1 2332 0f4c 36 59 ROR VALUE 2333 0f4e 34 5a LSR VALUE+1 2334 0f50 36 59 ROR VALUE 2335 0f52 d6 01 00 LDA MACROS,X 2336 0f55 a4 3f AND #%00111111 2337 0f57 ba 59 ORA VALUE 2338 0f59 d7 01 00 STA MACROS,X 2339 0f5c d6 01 01 LDA MACROS+1,X 2340 0f5f a4 f0 AND #%11110000 2341 0f61 ba 5a ORA VALUE+1 2342 0f63 d7 01 01 STA MACROS+1,X 2343 0f66 be 54 LDX TEMP2 2344 0f68 81 RTS 2345 2346 0f69 d6 01 00 WRITM_0 LDA MACROS,X X -> xxkk kkkk 2347 0f6c a4 c0 AND #%11000000 xxxx xxxx 2348 0f6e ba 53 ORA TEMP1 2349 0f70 d7 01 00 STA MACROS,X 2350 0f73 be 54 LDX TEMP2 2351 0f75 81 RTS 2352 2353 0f76 d6 01 00 WRITM_1 LDA MACROS,X X -> kkkk kkxx 2354 0f79 a4 03 AND #%00000011 xxxx xxxx 2355 0f7b 38 53 LSL TEMP1 2356 0f7d 38 53 LSL TEMP1 2357 0f7f ba 53 ORA TEMP1 2358 0f81 d7 01 00 STA MACROS,X 2359 0f84 be 54 LDX TEMP2 2360 0f86 81 RTS 2361 2362 0f87 b6 53 WRITM_2 LDA TEMP1 X -> kkkk xxxx 2363 0f89 b7 59 STA VALUE xxxx xxkk 2364 0f8b 3f 5a CLR VALUE+1 2365 0f8d 38 59 LSL VALUE 2366 0f8f 39 5a ROL VALUE+1 2367 0f91 38 59 LSL VALUE 2368 0f93 39 5a ROL VALUE+1 2369 0f95 38 59 LSL VALUE 2370 0f97 39 5a ROL VALUE+1 2371 0f99 38 59 LSL VALUE 2372 0f9b 39 5a ROL VALUE+1 2373 0f9d d6 01 00 LDA MACROS,X 2374 0fa0 a4 0f AND #%00001111 2375 0fa2 ba 59 ORA VALUE 2376 0fa4 d7 01 00 STA MACROS,X 2377 0fa7 d6 01 01 LDA MACROS+1,X 2378 0faa a4 fc AND #%11111100 2379 0fac ba 5a ORA VALUE+1 2380 0fae d7 01 01 STA MACROS+1,X 2381 0fb1 be 54 LDX TEMP2 2382 0fb3 81 RTS 2383 2384 ************************************************************************* 2385 * * 2386 * READVAL : read a value from keyboard * 2387 * * 2388 * On entry : ---- * 2389 * On exit : Two byte value in RAM locations VALUE and VALUE+1 * 2390 * * 2391 ************************************************************************* 2392 2393 0fb4 3f 59 READVAL CLR VALUE On init no value 2394 0fb6 3f 5a CLR VALUE+1 2395 2396 0fb8 cd 0e cd READV_0 JSR GETKEY We are only interested in keys 0-9 and # 2397 2398 0fbb b7 54 STA TEMP2 2399 0fbd cd 10 7c JSR KEYBEEP 2400 0fc0 b6 54 LDA TEMP2 2401 2402 0fc2 a1 0b CMP #11 Skip shifted keys 2403 0fc4 22 f2 BHI READV_0 2404 2405 0fc6 a1 0a CMP #10 Skip *'s 2406 0fc8 27 ee BEQ READV_0 2407 0fca 25 01 BLO READV_1 digit pressed 2408 0fcc 81 RTS Else # pressed and ready 2409 2410 0fcd 38 5a READV_1 LSL VALUE+1 First multiply value so far by 10 2411 0fcf 39 59 ROL VALUE First by 2 2412 0fd1 b6 5a LDA VALUE+1 2413 0fd3 be 59 LDX VALUE 2414 0fd5 48 LSLA Then by 4 (=*8) 2415 0fd6 59 ROLX 2416 0fd7 48 LSLA 2417 0fd8 59 ROLX 2418 0fd9 bb 5a ADD VALUE+1 Add these two (x*2 + x*8 = x*10) 2419 0fdb b7 5a STA VALUE+1 2420 0fdd 9f TXA 2421 0fde b9 59 ADC VALUE 2422 0fe0 b7 59 STA VALUE 2423 0fe2 b6 54 LDA TEMP2 And finally add our new digit 2424 0fe4 bb 5a ADD VALUE+1 2425 0fe6 b7 5a STA VALUE+1 2426 0fe8 24 ce BCC READV_0 2427 0fea b6 59 LDA VALUE 2428 0fec ab 01 ADD #1 2429 0fee b7 59 STA VALUE 2430 0ff0 24 c6 BHS READV_0 2431 0ff2 cd 10 3e JSR SITBEEP Higher than 65535 2432 0ff5 20 bd BRA READVAL 2433 2434 ************************************************************************* 2435 * * 2436 * OFFBEEP : makes sound for power-off * 2437 * * 2438 ************************************************************************* 2439 2440 0ff7 9b OFFBEEP SEI 2441 0ff8 a6 40 LDA #64 2442 0ffa b7 32 STA TONE1ST 2443 0ffc 3f 33 CLR TONE1ST+1 2444 2445 0ffe c6 14 65 LDA JUMPTB1 Tone 1 at 0 dB 2446 1001 b7 3e STA TONE1+1 2447 1003 c6 14 66 LDA JUMPTB1+1 2448 1006 b7 3f STA TONE1+2 2449 1008 3f 3a CLR TONE3ST No guard during power-down 2450 100a 3f 3b CLR TONE3ST+1 2451 100c 3f 38 CLR TONE3CT 2452 100e 3f 39 CLR TONE3CT+1 2453 2454 1010 9a CLI 2455 1011 3a 33 OFFB_0 DEC TONE1ST+1 2456 1013 b6 33 LDA TONE1ST+1 2457 1015 a1 ff CMP #$FF 2458 1017 26 f8 BNE OFFB_0 2459 1019 3a 32 DEC TONE1ST 2460 101b 2a f4 BPL OFFB_0 2461 101d 81 RTS 2462 2463 ************************************************************************* 2464 * * 2465 * ONBEEP : makes sound for power-on * 2466 * * 2467 ************************************************************************* 2468 2469 101e 9b ONBEEP SEI 2470 101f 3f 32 CLR TONE1ST 2471 1021 3f 33 CLR TONE1ST+1 2472 2473 1023 c6 14 65 LDA JUMPTB1 Tone 1 at 0 dB 2474 1026 b7 3e STA TONE1+1 2475 1028 c6 14 66 LDA JUMPTB1+1 2476 102b b7 3f STA TONE1+2 2477 2478 102d 9a CLI 2479 2480 102e 3c 33 ONB_0 INC TONE1ST+1 2481 1030 26 fc BNE ONB_0 2482 1032 3c 32 INC TONE1ST 2483 1034 b6 32 LDA TONE1ST 2484 1036 a1 40 CMP #64 2485 1038 26 f4 BNE ONB_0 2486 103a cd 11 4a JSR AUDIOFF 2487 103d 81 RTS 2488 2489 2490 ************************************************************************* 2491 * * 2492 * SITBEEP : makes SIT sound * 2493 * * 2494 ************************************************************************* 2495 2496 103e a6 96 SITBEEP LDA #150 ñ 300 ms 2497 1040 ae 43 LDX #67 SIT first tone 2498 1042 cd 11 07 JSR BEEP 2499 1045 a6 96 LDA #150 2500 1047 ae 44 LDX #68 SIT second tone 2501 1049 cd 11 07 JSR BEEP 2502 104c a6 96 LDA #150 2503 104e ae 45 LDX #69 SIT third tone 2504 1050 20 3b BRA ENDBEEP 2505 2506 ************************************************************************* 2507 * * 2508 * ALERT : produces alert tone * 2509 * * 2510 ************************************************************************* 2511 2512 1052 a6 19 ALERT LDA #25 ñ 50 ms 2513 1054 ae 4b LDX #75 2000 Hz 2514 1056 cd 11 07 JSR BEEP 2515 1059 a6 19 LDA #25 ñ 50 ms 2516 105b ae 4a LDX #74 0 Hz (silence) 2517 105d cd 11 07 JSR BEEP 2518 2519 1060 a6 19 LDA #25 ñ 50 ms 2520 1062 ae 4b LDX #75 2000 Hz 2521 1064 cd 11 07 JSR BEEP 2522 1067 a6 19 LDA #25 ñ 50 ms 2523 1069 ae 4a LDX #74 0 Hz (silence) 2524 106b cd 11 07 JSR BEEP 2525 2526 106e a6 19 LDA #25 ñ 50 ms 2527 1070 ae 4b LDX #75 2000 Hz 2528 1072 cd 11 07 JSR BEEP 2529 1075 a6 19 LDA #25 ñ 50 ms 2530 1077 ae 4a LDX #74 0 Hz (silence) 2531 1079 cd 11 07 JSR BEEP 2532 ************************************************************************* 2533 * KEYBEEP : makes 2000 Hz, 50 ms beep for key-press feedback * 2534 ************************************************************************* 2535 107c a6 19 KEYBEEP LDA #25 ñ 50 ms 2536 107e ae 4b LDX #75 2000 Hz 2537 1080 20 0b BRA ENDBEEP 2538 2539 ************************************************************************* 2540 * * 2541 * EMMBEEP : make beep for entering macro mode * 2542 * * 2543 ************************************************************************* 2544 2545 1082 a6 4b EMMBEEP LDA #75 ñ 150 ms 2546 1084 ae 45 LDX #69 SIT third tone 2547 1086 cd 11 07 JSR BEEP 2548 1089 a6 4b LDA #75 2549 108b ae 43 LDX #67 SIT first tone 2550 2551 108d cd 11 07 ENDBEEP JSR BEEP 2552 1090 cd 11 4a JSR AUDIOFF 2553 1093 81 RTS 2554 2555 2556 ************************************************************************* 2557 * * 2558 * XMMBEEP : make beep for exiting macro mode * 2559 * * 2560 ************************************************************************* 2561 2562 1094 a6 4b XMMBEEP LDA #75 ñ 150 ms 2563 1096 ae 43 LDX #67 SIT first tone 2564 1098 cd 11 07 JSR BEEP 2565 109b a6 4b LDA #75 2566 109d ae 45 LDX #69 SIT third tone 2567 109f 20 ec BRA ENDBEEP 2568 2569 ************************************************************************* 2570 * * 2571 * PASBEEP : produces password beep * 2572 * * 2573 ************************************************************************* 2574 2575 10a1 a6 19 PASBEEP LDA #25 2576 10a3 ae 16 LDX #22 2577 10a5 cd 11 07 JSR BEEP 2578 10a8 a6 19 LDA #25 2579 10aa ae 4a LDX #74 2580 10ac cd 11 07 JSR BEEP 2581 2582 10af a6 19 LDA #25 2583 10b1 ae 16 LDX #22 2584 10b3 cd 11 07 JSR BEEP 2585 10b6 a6 19 LDA #25 2586 10b8 ae 4a LDX #74 2587 10ba cd 11 07 JSR BEEP 2588 2589 10bd a6 19 LDA #25 2590 10bf ae 16 LDX #22 2591 10c1 cd 11 07 JSR BEEP 2592 10c4 a6 19 LDA #25 2593 10c6 ae 4a LDX #74 2594 10c8 cd 11 07 JSR BEEP 2595 2596 10cb a6 32 LDA #50 2597 10cd ae 19 LDX #25 2598 10cf cd 11 07 JSR BEEP 2599 10d2 a6 32 LDA #50 2600 10d4 ae 4a LDX #74 2601 10d6 cd 11 07 JSR BEEP 2602 2603 10d9 a6 19 LDA #25 2604 10db ae 16 LDX #22 2605 10dd cd 11 07 JSR BEEP 2606 10e0 a6 19 LDA #25 2607 10e2 ae 4a LDX #74 2608 10e4 cd 11 07 JSR BEEP 2609 2610 10e7 a6 64 LDA #100 2611 10e9 ae 19 LDX #25 2612 10eb 20 a0 BRA ENDBEEP 2613 2614 ************************************************************************* 2615 * * 2616 * DNTBEEP : make beep for not-confirming destructive action(don't)* 2617 * * 2618 ************************************************************************* 2619 2620 10ed a6 7d DNTBEEP LDA #125 2621 10ef ae 43 LDX #67 SIT first tone 2622 10f1 20 9a BRA ENDBEEP 2623 2624 ************************************************************************* 2625 * * 2626 * CFBEEP : make beep for confirming destructive action * 2627 * * 2628 ************************************************************************* 2629 2630 10f3 a6 19 CFBEEP LDA #25 ñ 50 ms 2631 10f5 ae 4b LDX #75 2000 Hz 2632 10f7 cd 11 07 JSR BEEP 2633 10fa a6 19 CFBEEP2 LDA #25 ñ 50 ms 2634 10fc ae 4a LDX #74 0 Hz (silence) 2635 10fe cd 11 07 JSR BEEP 2636 2637 1101 a6 32 LDA #50 ñ 100 ms 2638 1103 ae 4b LDX #75 2000 Hz 2639 1105 20 86 BRA ENDBEEP 2640 2641 2642 2643 ************************************************************************* 2644 * * 2645 * BEEP : makes single tone sound * 2646 * * 2647 * On entry : A = time in 16 cycles (of 1/8192 sec) * 2648 * X = frequency # * 2649 * * 2650 * This routine will make a single tone during A*16 cycles at 0 dB. The * 2651 * routine uses channel 1 to produce the tone. If the other two channels * 2652 * are also in use, overflow will occur. If a guard tone is produced, * 2653 * the level will be -6 dB for both beep and guard tone. * 2654 * * 2655 ************************************************************************* 2656 2657 1107 9b BEEP SEI 2658 1108 b7 53 STA TEMP1 2659 110a 58 LSLX Get proper offset in table 2660 110b d6 01 48 LDA FREQTBL,X Get frequency 2661 110e b7 32 STA TONE1ST 2662 1110 d6 01 49 LDA FREQTBL+1,X 2663 1113 b7 33 STA TONE1ST+1 2664 2665 1115 0e 67 0c BRSET 7,GUARD,BEEP_0 Test for guard tone 2666 1118 c6 14 65 LDA JUMPTB1 Tone 1 at 0 dB 2667 111b b7 3e STA TONE1+1 2668 111d c6 14 66 LDA JUMPTB1+1 2669 1120 b7 3f STA TONE1+2 2670 1122 20 0a BRA BEEP_1 2671 2672 1124 c6 14 71 BEEP_0 LDA JUMPTB1+12 If guard tone, then level beep at -6 dB 2673 1127 b7 3e STA TONE1+1 2674 1129 c6 14 72 LDA JUMPTB1+13 2675 112c b7 3f STA TONE1+2 2676 2677 112e b6 53 BEEP_1 LDA TEMP1 Multiply by 16 to get # cycles 2678 1130 5f CLRX 2679 1131 48 LSLA 2680 1132 59 ROLX 2681 1133 48 LSLA 2682 1134 59 ROLX 2683 1135 48 LSLA 2684 1136 59 ROLX 2685 1137 48 LSLA 2686 1138 59 ROLX 2687 2688 1139 50 NEGX Negate value, since ticker counts up 2689 113a bf 46 STX TICKER to 0 2690 113c 40 NEGA 2691 113d b7 47 STA TICKER+1 2692 113f 24 02 BCC BEEP_2 2693 1141 3a 46 DEC TICKER 2694 1143 1e 48 BEEP_2 BSET 7,NEXTSTR Set strobe to detect end of tone 2695 1145 9a CLI 2696 2697 1146 0e 48 fd BEEP_3 BRSET 7,NEXTSTR,BEEP_3 Wait till tone is over 2698 1149 81 RTS 2699 2700 ************************************************************************* 2701 * * 2702 * AUDIOFF : turns off all audio, except when guard tone is on * 2703 * * 2704 ************************************************************************* 2705 2706 114a 9b AUDIOFF SEI 2707 114b 0e 67 09 BRSET 7,GUARD,AUDIO_0 If guard tone then don't shut down audio 2708 114e 0a 62 1a BRSET 5,MACNEST,AUDIO_1 Don't set timeout for paused macro 2709 1151 a6 10 LDA #16 Switch off after 2 seconds 2710 1153 b7 4a STA TIMOUTA 2711 1155 20 14 BRA AUDIO_1 2712 1157 c6 14 65 AUDIO_0 LDA JUMPTB1 2713 115a b7 3e STA TONE1+1 2714 115c c6 14 66 LDA JUMPTB1+1 2715 115f b7 3f STA TONE1+2 2716 1161 c6 14 b1 LDA JUMPTB3+12 Guard tone at -6 dB 2717 1164 b7 44 STA TONE3+1 2718 1166 c6 14 b2 LDA JUMPTB3+13 2719 1169 b7 45 STA TONE3+2 2720 116b 3f 32 AUDIO_1 CLR TONE1ST 2721 116d 3f 33 CLR TONE1ST+1 2722 116f 3f 30 CLR TONE1CT 2723 1171 3f 31 CLR TONE1CT+1 2724 1173 3f 36 CLR TONE2ST 2725 1175 3f 37 CLR TONE2ST+1 2726 1177 3f 34 CLR TONE2CT 2727 1179 3f 35 CLR TONE2CT+1 2728 117b 9a CLI 2729 117c 81 RTS 2730 2731 ************************************************************************* 2732 * * 2733 * CLRTIME : clears time out period * 2734 * * 2735 ************************************************************************* 2736 2737 117d 3f 49 CLRTIME CLR TIMEOUT 2738 117f 81 RTS 2739 2740 ************************************************************************* 2741 * * 2742 * 2743 * TX : Send a byte * 2744 * * 2745 ************************************************************************* 2746 2747 1180 0f 10 fd TX BRCLR 7,SCSR,TX Wait until Transmit Data Register is empty 2748 1183 b7 11 STA SCDAT 2749 1185 81 RTS 2750 2751 ************************************************************************* 2752 * * 2753 * RX : Receive a byte * 2754 * * 2755 ************************************************************************* 2756 2757 1186 0b 10 fd RX BRCLR 5,SCSR,RX Wait until byte is received 2758 1189 b6 11 LDA SCDAT 2759 118b 81 RTS 2760 2761 * Dummy interrupt, does nothing but return right away 2762 2763 118c 80 DUMINT RTI 2764 2765 ************************************************************************* 2766 * * 2767 * INTSER : serial interrupt routine * 2768 * * 2769 * This routine gets a byte from the serial port and places it in the * 2770 * keyboard buffer * 2771 * * 2772 ************************************************************************* 2773 2774 118d cd 11 7d INTSER JSR CLRTIME 2775 1190 b6 10 LDA SCSR Clear interrupt 2776 1192 b6 11 LDA SCDAT 2777 1194 a1 55 CMP #'U' U means upload RAM contents 2778 1196 26 3a BNE INTS_10 2779 1198 0f 5b 36 BRCLR 7,MODE,ATY_3 2780 119b b6 5b LDA MODE Send mode word 2781 119d cd 11 80 JSR TX 2782 11a0 b6 5c LDA MACKEYS Send # of macro keys 2783 11a2 cd 11 80 JSR TX 2784 11a5 b6 7e LDA US2OFS Send offset into user mode 2 (mode 19) 2785 11a7 cd 11 80 JSR TX 2786 11aa b6 7f LDA MODKEYS Send # bytes in key area 2787 11ac cd 11 80 JSR TX 2788 11af 5f CLRX 2789 11b0 e6 67 ATY_0 LDA GUARD,X Send guard and time template info 2790 11b2 cd 11 80 JSR TX 2791 11b5 5c INCX 2792 11b6 a3 13 CPX #19 2793 11b8 26 f6 BNE ATY_0 2794 11ba 5f CLRX 2795 11bb e6 80 ATY_1 LDA KEYAREA,X Send all key definitions 2796 11bd cd 11 80 JSR TX 2797 11c0 5c INCX 2798 11c1 a3 64 CPX #100 2799 11c3 26 f6 BNE ATY_1 2800 11c5 5f CLRX 2801 11c6 d6 01 00 ATY_2 LDA MACROS,X Send macro and frequeny table 2802 11c9 cd 11 80 JSR TX 2803 11cc 5c INCX 2804 11cd a3 60 CPX #96 2805 11cf 26 f5 BNE ATY_2 2806 11d1 80 ATY_3 RTI 2807 2808 11d2 a1 44 INTS_10 CMP #'D' 2809 11d4 26 3a BNE INTS_15 2810 11d6 0f 5b 36 BRCLR 7,MODE,ATY_13 2811 11d9 cd 11 86 JSR RX 2812 11dc b7 5b STA MODE Set mode word 2813 11de cd 11 86 JSR RX 2814 11e1 b7 5c STA MACKEYS Set # of macro keys 2815 11e3 cd 11 86 JSR RX 2816 11e6 b7 7e STA US2OFS Set offset into user mode 2 (mode 19) 2817 11e8 cd 11 86 JSR RX 2818 11eb b7 7f STA MODKEYS Set # of bytes in key area 2819 11ed 5f CLRX 2820 11ee cd 11 86 ATY_10 JSR RX 2821 11f1 e7 67 STA GUARD,X Set guard and time template info 2822 11f3 5c INCX 2823 11f4 a3 13 CPX #19 2824 11f6 26 f6 BNE ATY_10 2825 11f8 5f CLRX 2826 11f9 cd 11 86 ATY_11 JSR RX 2827 11fc e7 80 STA KEYAREA,X Set all key definitions 2828 11fe 5c INCX 2829 11ff a3 64 CPX #100 2830 1201 26 f6 BNE ATY_11 2831 1203 5f CLRX 2832 1204 cd 11 86 ATY_12 JSR RX 2833 1207 d7 01 00 STA MACROS,X Set macro and frequeny table 2834 120a 5c INCX 2835 120b a3 60 CPX #96 2836 120d 26 f5 BNE ATY_12 2837 120f 80 ATY_13 RTI 2838 2839 1210 a1 50 INTS_15 CMP #'P' 2840 1212 26 1d BNE INTS_20 2841 1214 0f 5b 19 BRCLR 7,MODE,INTS_17 2842 1217 c6 14 4b LDA VERSION 2843 121a cd 11 80 JSR TX 2844 121d c6 1e f0 LDA PASDIGS 2845 1220 cd 11 80 JSR TX 2846 1223 5f CLRX 2847 1224 d6 1e f1 INTS_16 LDA PASSWRD,X 2848 1227 cd 11 80 JSR TX 2849 122a 5c INCX 2850 122b c3 1e f0 CPX PASDIGS 2851 122e 26 f4 BNE INTS_16 2852 1230 80 INTS_17 RTI 2853 2854 1231 a1 ff INTS_20 CMP #255 2855 1233 26 03 BNE INTS_30 2856 1235 1d 52 BCLR 6,SERSTAT 2857 1237 80 RTI 2858 2859 1238 be 4f INTS_30 LDX KEYS Has the keyboard buffer got room ? 2860 123a a3 04 CPX #4 2861 123c 26 01 BNE INTS_31 2862 123e 80 RTI 2863 2864 123f e7 4b INTS_31 STA KEYBUF,X Store key in keyboard buffer 2865 1241 aa 40 ORA #%01000000 2866 1243 b7 52 STA SERSTAT 2867 1245 3c 4f INC KEYS 2868 1247 80 RTI 2869 2870 ************************************************************************* 2871 * * 2872 * INTTIM : timer interrupt routine * 2873 * * 2874 * This routine is called when output compare situation occurs or when * 2875 * the timer overflows * 2876 * * 2877 * The routine is responsible for the auto-power off, keyboard handling * 2878 * and tone producing * 2879 * * 2880 ************************************************************************* 2881 2882 1248 0b 13 4c INTTIM BRCLR 5,TSR,TIM_OCM Did we have timer overflow ? 2883 124b b6 19 LDA TCNT+1 Clear overflow flag 2884 124d a6 55 LDA #$55 Reset COP timer 2885 124f b7 1d STA COPR 2886 1251 48 LSLA 2887 1252 b7 1d STA COPR 2888 1254 3c 49 INC TIMEOUT Increment power-off counter 2889 1256 26 19 BNE TIM_0 After 256*65536 timer cycles (= 32 sec) 2890 1258 0a 5b 03 BRSET 5,MODE,INTT_00 device will automatically switch off 2891 125b cd 0f f7 JSR OFFBEEP Only beep when password protection is on 2892 125e cd 11 4a INTT_00 JSR AUDIOFF 2893 1261 a6 80 LDA #%10000000 Switch off audio circuit 2894 1263 b7 02 STA PORTC 2895 1265 17 01 BCLR 3,PORTB Switch off power upper 2896 1267 8e STOP And stop this device. Wake it by pressing shift 2897 1268 0b 5b 03 BRCLR 5,MODE,INTT_0 If password protection is off, just return 2898 126b 16 01 BSET 3,PORTB after switching on power again 2899 126d 80 RTI 2900 2901 126e cc 02 1b INTT_0 JMP INIT If password protection is on, init 2902 2903 1271 0a 5b 09 TIM_0 BRSET 5,MODE,TIM_1 If password protection is off, don't alert 2904 1274 b6 49 LDA TIMEOUT on power-off 2905 1276 a1 d0 CMP #208 Warn 6 seconds before auto power-off 2906 1278 26 03 BNE TIM_1 Mind that by jumping to ALERT we actually leave 2907 127a cd 10 52 JSR ALERT interrupt routine. This causes no problems. 2908 2909 127d b6 4a TIM_1 LDA TIMOUTA Check if audio is still on 2910 127f 2b 12 BMI TIM_100 2911 1281 3a 4a DEC TIMOUTA 2912 1283 26 0e BNE TIM_100 2913 1285 3a 4a DEC TIMOUTA 2914 1287 a6 80 LDA #%10000000 Switch off audio circuitry 2915 1289 b7 02 STA PORTC 2916 128b a6 13 LDA #NOAUDIO/256 Interrupt routine jumps through fake 2917 128d b7 3e STA TONE1+1 tone routines 2918 128f a6 2d LDA #NOAUDIO 2919 1291 b7 3f STA TONE1+2 2920 1293 0c 13 01 TIM_100 BRSET 6,TSR,TIM_OCM Did we have an output compare situation ? 2921 1296 80 RTI If not, just return 2922 2923 1297 bc 3d TIM_OCM JMP TONE1 -> TONE1 -> TONE2 -> TONE3 -> REENTRY 2924 1299 b6 17 REENTRY LDA OCMP+1 or -> NOAUDIO -> REENTRY 2925 129b ab 40 ADD #64 sample period (= 64 timer cycles = 8.192 kHz) 2926 129d 24 02 BCC TIM_2 2927 129f 3c 16 INC OCMP 2928 12a1 b7 17 TIM_2 STA OCMP+1 2929 2930 12a3 3c 47 INC TICKER+1 Increment ticker value 2931 12a5 26 06 BNE TIM_3 2932 12a7 3c 46 INC TICKER 2933 12a9 26 02 BNE TIM_3 If ticker runs through zero, alert foreground 2934 12ab 3f 48 CLR NEXTSTR program to update tone values 2935 2936 12ad 3a 50 TIM_3 DEC KEYCNT Time to scan the keyboard already ? 2937 12af 27 01 BEQ KEYSCAN 2938 2939 12b1 80 RTI 2940 2941 ************************************************************************* 2942 * * 2943 * At this point the keyboard is going to be scanned * 2944 * The keyboard is being scanned every 1/128 second * 2945 * * 2946 * Because of the critical timing this piece of software is written a * 2947 * 'bit' dirty, so we will not blame you for not understanding one bit * 2948 * of it. * 2949 * * 2950 * KEYSTAT : current key status * 2951 * * 2952 * 00000000 - no key pressed * 2953 * 10000000 - key pressed, not debounced yet * 2954 * 010skkkk - key pressed, debounced, kkkk=key code, s=shift key * 2955 * 001xxxxx - key released, not denounced yet * 2956 * * 2957 ************************************************************************* 2958 2959 12b2 1c 50 KEYSCAN BSET 6,KEYCNT Set key-count to 64 2960 2961 12b4 b6 51 LDA KEYSTAT We are now going to read the keyboard 2962 2963 12b6 2b 0e BMI TIM_4 Key pressed, but not debounced yet ? 2964 2965 12b8 27 5e BEQ TIM_9 No key pressed at all ? 2966 2967 12ba 0d 51 67 BRCLR 6,KEYSTAT,TIM_11 Key released, not debounced yet ? 2968 2969 12bd b6 03 LDA PORTD Key pressed and debounced, check to see 2970 12bf a4 3c AND #%00111100 if it is being released again 2971 12c1 26 69 BNE TIM_13 If not, leave it as it is 2972 2973 12c3 34 51 LSR KEYSTAT If so, indicate that the key has been released 2974 12c5 80 RTI 2975 2976 12c6 b6 03 TIM_4 LDA PORTD Key pressed, not debounced yet 2977 12c8 a4 3c AND #%00111100 If we now get no key pressed, then clear 2978 12ca 27 5e BEQ TIM_12 KEYSTAT again 2979 2980 12cc 97 TAX X will contain an offset into the keytable 2981 12cd 54 LSRX 2982 12ce 54 LSRX 2983 2984 12cf 11 01 BCLR 0,PORTB Clear bit of row 1,4,7,* 2985 12d1 b6 03 LDA PORTD If we now read the keyboard and the data 2986 12d3 a4 3c AND #%00111100 is still present, the key should be in one 2987 12d5 26 0c BNE TIM_5 of the other two rows 2988 2989 12d7 d6 14 c5 LDA COL147,X Else it is in this row 2990 2991 12da be 4f LDX KEYS Check to see if the keyboard buffer is full 2992 12dc a3 04 CPX #4 2993 12de 26 27 BNE TIM_7 2994 12e0 10 01 BSET 0,PORTB Activate port b for next read 2995 12e2 80 RTI 2996 2997 12e3 13 01 TIM_5 BCLR 1,PORTB Clear bit of row 2,5,8,0 2998 2999 12e5 b6 03 LDA PORTD If we now read the keyboard and the data 3000 12e7 a4 3c AND #%00111100 is still present, the key should be in 3001 12e9 26 0e BNE TIM_6 row 3,6,9,# 3002 3003 12eb d6 14 d5 LDA COL258,X 3004 3005 12ee be 4f LDX KEYS Check to see if the keyboard buffer is full 3006 12f0 a3 04 CPX #4 3007 12f2 26 13 BNE TIM_7 3008 12f4 10 01 BSET 0,PORTB Activate port b for next read 3009 12f6 12 01 BSET 1,PORTB 3010 12f8 80 RTI 3011 3012 12f9 d6 14 e5 TIM_6 LDA COL369,X 3013 3014 12fc be 4f LDX KEYS Check to see if the keyboard buffer is full 3015 12fe a3 04 CPX #4 3016 1300 26 05 BNE TIM_7 3017 1302 10 01 BSET 0,PORTB Activate port b for next read 3018 1304 12 01 BSET 1,PORTB 3019 1306 80 RTI 3020 3021 1307 2f 02 TIM_7 BIH TIM_8 Check the shift key; it's connected to the 3022 1309 aa 10 ORA #16 IRQ-pin 3023 3024 130b e7 4b TIM_8 STA KEYBUF,X Put key in keyboard buffer 3025 130d 3c 4f INC KEYS 3026 130f aa 40 ORA #64 Indicate that a key is being pressed right now 3027 1311 b7 51 STA KEYSTAT 3028 1313 10 01 BSET 0,PORTB Activate port b for next read 3029 1315 12 01 BSET 1,PORTB 3030 1317 80 RTI 3031 3032 1318 b6 03 TIM_9 LDA PORTD No key pressed yet, check to see if there is a 3033 131a a4 3c AND #%00111100 key being pressed 3034 3035 131c 27 0e BEQ TIM_13 If not, leave it 3036 131e 1e 51 BSET 7,KEYSTAT Else, indicate that key needs debouncing 3037 3038 1320 cd 11 7d JSR CLRTIME 3039 3040 1323 80 TIM_10 RTI 3041 3042 1324 b6 03 TIM_11 LDA PORTD Key released, not debounced 3043 1326 a4 3c AND #%00111100 Key pressed right now ? 3044 1328 26 02 BNE TIM_13 If so, don`t alter situation 3045 132a 3f 51 TIM_12 CLR KEYSTAT else, it's released and debounced 3046 3047 132c 80 TIM_13 RTI 3048 3049 132d cc 12 99 NOAUDIO JMP REENTRY Tone 1 is indirected to this jump for no audio 3050 3051 ************************************************************************* 3052 * * 3053 * Tone 1 routines to produce 16 levels of tone 1 from 0 to -15 dB * 3054 * * 3055 ************************************************************************* 3056 3057 1330 b6 31 TON1_0 LDA TONE1CT+1 3058 1332 bb 33 ADD TONE1ST+1 3059 1334 b7 31 STA TONE1CT+1 3060 1336 b6 30 LDA TONE1CT 3061 1338 97 TAX 3062 1339 b9 32 ADC TONE1ST 3063 133b b7 30 STA TONE1CT 3064 133d d6 1a b8 LDA SINE0,X 3065 1340 ab 40 ADD #64 3066 1342 b7 3c STA TONEOUT 3067 1344 bc 40 JMP TONE2 3068 3069 1346 b6 31 TON1_6 LDA TONE1CT+1 3070 1348 bb 33 ADD TONE1ST+1 3071 134a b7 31 STA TONE1CT+1 3072 134c b6 30 LDA TONE1CT 3073 134e 97 TAX 3074 134f b9 32 ADC TONE1ST 3075 1351 b7 30 STA TONE1CT 3076 1353 d6 1b b8 LDA SINE6,X 3077 1356 ab 40 ADD #64 3078 1358 b7 3c STA TONEOUT 3079 135a bc 40 JMP TONE2 3080 3081 135c b6 31 TON1_10 LDA TONE1CT+1 3082 135e bb 33 ADD TONE1ST+1 3083 1360 b7 31 STA TONE1CT+1 3084 1362 b6 30 LDA TONE1CT 3085 1364 97 TAX 3086 1365 b9 32 ADC TONE1ST 3087 1367 b7 30 STA TONE1CT 3088 1369 d6 1c b8 LDA SINE10,X 3089 136c ab 40 ADD #64 3090 136e b7 3c STA TONEOUT 3091 1370 bc 40 JMP TONE2 3092 3093 1372 b6 31 TON1_15 LDA TONE1CT+1 3094 1374 bb 33 ADD TONE1ST+1 3095 1376 b7 31 STA TONE1CT+1 3096 1378 b6 30 LDA TONE1CT 3097 137a 97 TAX 3098 137b b9 32 ADC TONE1ST 3099 137d b7 30 STA TONE1CT 3100 137f d6 1d b8 LDA SINE15,X 3101 1382 ab 40 ADD #64 3102 1384 b7 3c STA TONEOUT 3103 1386 bc 40 JMP TONE2 3104 3105 ************************************************************************* 3106 * * 3107 * Tone 2 routines to produce 16 levels of tone 2 from 0 to -15 dB * 3108 * * 3109 ************************************************************************* 3110 3111 1388 b6 35 TON2_0 LDA TONE2CT+1 3112 138a bb 37 ADD TONE2ST+1 3113 138c b7 35 STA TONE2CT+1 3114 138e b6 34 LDA TONE2CT 3115 1390 97 TAX 3116 1391 b9 36 ADC TONE2ST 3117 1393 b7 34 STA TONE2CT 3118 1395 d6 1a b8 LDA SINE0,X 3119 1398 bb 3c ADD TONEOUT 3120 139a b7 3c STA TONEOUT 3121 139c bc 43 JMP TONE3 3122 3123 139e b6 35 TON2_6 LDA TONE2CT+1 3124 13a0 bb 37 ADD TONE2ST+1 3125 13a2 b7 35 STA TONE2CT+1 3126 13a4 b6 34 LDA TONE2CT 3127 13a6 97 TAX 3128 13a7 b9 36 ADC TONE2ST 3129 13a9 b7 34 STA TONE2CT 3130 13ab d6 1b b8 LDA SINE6,X 3131 13ae bb 3c ADD TONEOUT 3132 13b0 b7 3c STA TONEOUT 3133 13b2 bc 43 JMP TONE3 3134 3135 13b4 b6 35 TON2_10 LDA TONE2CT+1 3136 13b6 bb 37 ADD TONE2ST+1 3137 13b8 b7 35 STA TONE2CT+1 3138 13ba b6 34 LDA TONE2CT 3139 13bc 97 TAX 3140 13bd b9 36 ADC TONE2ST 3141 13bf b7 34 STA TONE2CT 3142 13c1 d6 1c b8 LDA SINE10,X 3143 13c4 bb 3c ADD TONEOUT 3144 13c6 b7 3c STA TONEOUT 3145 13c8 bc 43 JMP TONE3 3146 3147 13ca b6 35 TON2_15 LDA TONE2CT+1 3148 13cc bb 37 ADD TONE2ST+1 3149 13ce b7 35 STA TONE2CT+1 3150 13d0 b6 34 LDA TONE2CT 3151 13d2 97 TAX 3152 13d3 b9 36 ADC TONE2ST 3153 13d5 b7 34 STA TONE2CT 3154 13d7 d6 1d b8 LDA SINE15,X 3155 13da bb 3c ADD TONEOUT 3156 13dc b7 3c STA TONEOUT 3157 13de bc 43 JMP TONE3 3158 3159 ************************************************************************* 3160 * * 3161 * Tone 3 routines to produce 16 levels of tone 3 from 0 to -15 dB * 3162 * * 3163 ************************************************************************* 3164 3165 13e0 b6 39 TON3_0 LDA TONE3CT+1 3166 13e2 bb 3b ADD TONE3ST+1 3167 13e4 b7 39 STA TONE3CT+1 3168 13e6 b6 38 LDA TONE3CT 3169 13e8 97 TAX 3170 13e9 b9 3a ADC TONE3ST 3171 13eb b7 38 STA TONE3CT 3172 13ed d6 1a b8 LDA SINE0,X 3173 13f0 bb 3c ADD TONEOUT 3174 13f2 b7 02 STA PORTC 3175 13f4 cc 12 99 JMP REENTRY 3176 3177 13f7 b6 39 TON3_6 LDA TONE3CT+1 3178 13f9 bb 3b ADD TONE3ST+1 3179 13fb b7 39 STA TONE3CT+1 3180 13fd b6 38 LDA TONE3CT 3181 13ff 97 TAX 3182 1400 b9 3a ADC TONE3ST 3183 1402 b7 38 STA TONE3CT 3184 1404 d6 1b b8 LDA SINE6,X 3185 1407 bb 3c ADD TONEOUT 3186 1409 b7 02 STA PORTC 3187 140b cc 12 99 JMP REENTRY 3188 3189 140e b6 39 TON3_10 LDA TONE3CT+1 3190 1410 bb 3b ADD TONE3ST+1 3191 1412 b7 39 STA TONE3CT+1 3192 1414 b6 38 LDA TONE3CT 3193 1416 97 TAX 3194 1417 b9 3a ADC TONE3ST 3195 1419 b7 38 STA TONE3CT 3196 141b d6 1c b8 LDA SINE10,X 3197 141e bb 3c ADD TONEOUT 3198 1420 b7 02 STA PORTC 3199 1422 cc 12 99 JMP REENTRY 3200 3201 1425 b6 39 TON3_15 LDA TONE3CT+1 3202 1427 bb 3b ADD TONE3ST+1 3203 1429 b7 39 STA TONE3CT+1 3204 142b b6 38 LDA TONE3CT 3205 142d 97 TAX 3206 142e b9 3a ADC TONE3ST 3207 1430 b7 38 STA TONE3CT 3208 1432 d6 1d b8 LDA SINE15,X 3209 1435 bb 3c ADD TONEOUT 3210 1437 b7 02 STA PORTC 3211 1439 cc 12 99 JMP REENTRY 3212 3213 ************************************************************************* 3214 * * 3215 * INTIRQ : external IRQ routine * 3216 * * 3217 * This routine is called whenever shift is pressed. It's only task is * 3218 * to reset the power-off counter * 3219 * * 3220 ************************************************************************* 3221 3222 143c cd 11 7d INTIRQ JSR CLRTIME 3223 143f 80 RTI 3224 3225 1440 02 05 18 07 08 13 MOTHER FCB 2,5,16+8,7,8,16+3,7,3,16+8,2,5 Mother key 07 03 18 02 05 3226 144b 83 VERSION FCB 131 Version 1.31 3227 144c 0d 0a MESSAGE FCB CR,LF 3228 144e 44 65 6d 6f 6e 2d FCC 'Demon-Dialer v1.31' 44 69 61 6c 65 72 20 76 31 2e 33 31 3229 1460 0d 0a 0d 0a 00 FCB CR,LF,CR,LF,0 3230 3231 3232 * Here, the 3*16 jump addresses are held for the 16 dB levels of 3233 * the 3 tone channels 3234 3235 1465 13 30 JUMPTB1 FDB TON1_0 3236 1467 13 46 FDB TON1_6 Note that -1, -2, -3, -4 and -5 all redirect 3237 1469 13 46 FDB TON1_6 to -6 dB 3238 146b 13 46 FDB TON1_6 3239 146d 13 46 FDB TON1_6 3240 146f 13 46 FDB TON1_6 3241 1471 13 46 FDB TON1_6 3242 1473 13 5c FDB TON1_10 3243 1475 13 5c FDB TON1_10 3244 1477 13 5c FDB TON1_10 3245 1479 13 5c FDB TON1_10 3246 147b 13 72 FDB TON1_15 3247 147d 13 72 FDB TON1_15 3248 147f 13 72 FDB TON1_15 3249 1481 13 72 FDB TON1_15 3250 1483 13 72 FDB TON1_15 3251 3252 1485 13 88 JUMPTB2 FDB TON2_0 3253 1487 13 9e FDB TON2_6 3254 1489 13 9e FDB TON2_6 3255 148b 13 9e FDB TON2_6 3256 148d 13 9e FDB TON2_6 3257 148f 13 9e FDB TON2_6 3258 1491 13 9e FDB TON2_6 3259 1493 13 b4 FDB TON2_10 3260 1495 13 b4 FDB TON2_10 3261 1497 13 b4 FDB TON2_10 3262 1499 13 b4 FDB TON2_10 3263 149b 13 ca FDB TON2_15 3264 149d 13 ca FDB TON2_15 3265 149f 13 ca FDB TON2_15 3266 14a1 13 ca FDB TON2_15 3267 14a3 13 ca FDB TON2_15 3268 3269 14a5 13 e0 JUMPTB3 FDB TON3_0 3270 14a7 13 f7 FDB TON3_6 3271 14a9 13 f7 FDB TON3_6 3272 14ab 13 f7 FDB TON3_6 3273 14ad 13 f7 FDB TON3_6 3274 14af 13 f7 FDB TON3_6 3275 14b1 13 f7 FDB TON3_6 3276 14b3 14 0e FDB TON3_10 3277 14b5 14 0e FDB TON3_10 3278 14b7 14 0e FDB TON3_10 3279 14b9 14 0e FDB TON3_10 3280 14bb 14 25 FDB TON3_15 3281 14bd 14 25 FDB TON3_15 3282 14bf 14 25 FDB TON3_15 3283 14c1 14 25 FDB TON3_15 3284 14c3 14 25 FDB TON3_15 3285 3286 14c5 00 01 04 04 07 07 COL147 FCB 0,1,4,4,7,7,7,7,10,10,10,10,10,10,10,10 07 07 0a 0a 0a 0a 0a 0a 0a 0a 3287 14d5 00 02 05 05 08 08 COL258 FCB 0,2,5,5,8,8,8,8,0,0,0,0,0,0,0,0 08 08 00 00 00 00 00 00 00 00 3288 14e5 00 03 06 06 09 09 COL369 FCB 0,3,6,6,9,9,9,9,11,11,11,11,11,11,11,11 09 09 0b 0b 0b 0b 0b 0b 0b 0b 3289 3290 ************************************************************************* 3291 * * 3292 * Now following is the list of the ROM modes * 3293 * * 3294 * Some of the ROM modes use template values, don't use them in user * 3295 * modes * 3296 * * 3297 * Time templates : * 3298 * * 3299 * 0 - DTMF/C3/pulse dial mark (50 ms default) * 3300 * 1 - DTMF/C3/pulse dial space (50 ms default) * 3301 * 2 - C5/R2 mark (50 ms default) * 3302 * 3 - C5/R2 space (50 ms default) * 3303 * 4 - kp period (100 ms default) * 3304 * 5 - free * 3305 * 6 - C3 interdigit time (500 ms default) * 3306 * 7 - free * 3307 * * 3308 * RAM frequencies (special : 1 Hz = off hook, 2 Hz = on hook) * 3309 * * 3310 * 0 - C3/pulse dial mark (2 Hz default, meaning on-hook) * 3311 * 1 - C3/pulse dial space (1 Hz default, meaning off-hook) * 3312 * 2 - Special menu freq # 1 (0 Hz) * 3313 * 3 - Special menu freq # 2 (0 Hz) * 3314 * * 3315 ************************************************************************* 3316 3317 14f5 15 19 ROMMDS FDB DTMF 0 Dual tone multi-frequency 3318 14f7 15 19 FDB DTMF 1 3319 14f9 15 6f FDB R2frwrd 2 R2 forward 3320 14fb 15 c1 FDB C3 3 CCITT standard 3 template 3321 14fd 17 1d FDB C4 4 CCITT standard 4 3322 14ff 18 c3 FDB C5 5 CCITT standard 5 3323 1501 19 28 FDB Red 6 Red 3324 1503 19 d5 FDB Special 7 3325 1505 1a 2f FDB Toneslt 8 3326 1507 15 19 FDB DTMF 9 3327 1509 15 19 FDB DTMF ^0 3328 150b 15 19 FDB DTMF ^1 3329 150d 1a 66 FDB R2bkwrd ^2 R2 backward 3330 150f 15 19 FDB DTMF ^3 3331 1511 15 19 FDB DTMF ^4 3332 1513 15 19 FDB DTMF ^5 3333 1515 15 19 FDB DTMF ^6 3334 1517 15 19 FDB DTMF ^7 ^8 and ^9 are RAM modes 3335 3336 3337 1519 58 66 15 17 DTMF FCB %01011000,$66,21,23 0 0 3338 151d 99 FCB %10011001 3339 151e 58 66 12 16 FCB %01011000,$66,18,22 1 1 3340 1522 99 FCB %10011001 3341 1523 58 66 12 17 FCB %01011000,$66,18,23 2 2 3342 1527 99 FCB %10011001 3343 1528 58 66 12 18 FCB %01011000,$66,18,24 3 3 3344 152c 99 FCB %10011001 3345 152d 58 66 13 16 FCB %01011000,$66,19,22 4 4 3346 1531 99 FCB %10011001 3347 1532 58 66 13 17 FCB %01011000,$66,19,23 5 5 3348 1536 99 FCB %10011001 3349 1537 58 66 13 18 FCB %01011000,$66,19,24 6 6 3350 153b 99 FCB %10011001 3351 153c 58 66 14 16 FCB %01011000,$66,20,22 7 7 3352 1540 99 FCB %10011001 3353 1541 58 66 14 17 FCB %01011000,$66,20,23 8 8 3354 1545 99 FCB %10011001 3355 1546 58 66 14 18 FCB %01011000,$66,20,24 9 9 3356 154a 99 FCB %10011001 3357 154b 58 66 15 16 FCB %01011000,$66,21,22 * * 3358 154f 99 FCB %10011001 3359 1550 58 66 15 18 FCB %01011000,$66,21,24 # # 3360 1554 99 FCB %10011001 3361 1555 90 FCB %10010000 ^0 - 3362 1556 58 66 12 19 FCB %01011000,$66,18,25 ^1 A 3363 155a 99 FCB %10011001 3364 155b 58 66 13 19 FCB %01011000,$66,19,25 ^2 B 3365 155f 99 FCB %10011001 3366 1560 58 66 14 19 FCB %01011000,$66,20,25 ^3 C 3367 1564 99 FCB %10011001 3368 1565 58 66 15 19 FCB %01011000,$66,21,25 ^4 D 3369 1569 99 FCB %10011001 3370 156a 90 FCB %10010000 ^5 - 3371 156b 90 FCB %10010000 ^6 - 3372 156c 90 FCB %10010000 ^7 - 3373 156d 90 FCB %10010000 ^8 - 3374 156e 90 FCB %10010000 ^9 - 3375 3376 156f 5a 66 1d 1e R2frwrd FCB %01011010,$66,29,30 0 10 3377 1573 9b FCB %10011011 3378 1574 5a 66 1a 1b FCB %01011010,$66,26,27 1 1 3379 1578 9b FCB %10011011 3380 1579 5a 66 1a 1c FCB %01011010,$66,26,28 2 2 3381 157d 9b FCB %10011011 3382 157e 5a 66 1b 1c FCB %01011010,$66,27,28 3 3 3383 1582 9b FCB %10011011 3384 1583 5a 66 1a 1d FCB %01011010,$66,26,29 4 4 3385 1587 9b FCB %10011011 3386 1588 5a 66 1b 1d FCB %01011010,$66,27,29 5 5 3387 158c 9b FCB %10011011 3388 158d 5a 66 1c 1d FCB %01011010,$66,28,29 6 6 3389 1591 9b FCB %10011011 3390 1592 5a 66 1a 1e FCB %01011010,$66,26,30 7 7 3391 1596 9b FCB %10011011 3392 1597 5a 66 1b 1e FCB %01011010,$66,27,30 8 8 3393 159b 9b FCB %10011011 3394 159c 5a 66 1c 1e FCB %01011010,$66,28,30 9 9 3395 15a0 9b FCB %10011011 3396 15a1 90 FCB %10010000 * - 3397 15a2 90 FCB %10010000 # - 3398 15a3 9b FCB %10011011 ^0 pause 3399 15a4 5a 66 1a 1f FCB %01011010,$66,26,31 ^1 11 3400 15a8 9b FCB %10011011 3401 15a9 5a 66 1b 1f FCB %01011010,$66,27,31 ^2 12 3402 15ad 9b FCB %10011011 3403 15ae 5a 66 1c 1f FCB %01011010,$66,28,31 ^3 13 3404 15b2 9b FCB %10011011 3405 15b3 5a 66 1d 1f FCB %01011010,$66,29,31 ^4 14 3406 15b7 9b FCB %10011011 3407 15b8 5a 66 1e 1f FCB %01011010,$66,30,31 ^5 15 3408 15bc 9b FCB %10011011 3409 15bd 90 FCB %10010000 ^6 - 3410 15be 90 FCB %10010000 ^7 - 3411 15bf 90 FCB %10010000 ^8 - 3412 15c0 90 FCB %10010000 ^9 - 3413 3414 15c1 30 00 00 C3 FCB %00110000,$00,0 0 10 pulses 3415 15c4 31 00 01 FCB %00110001,$00,1 3416 15c7 30 00 00 FCB %00110000,$00,0 3417 15ca 31 00 01 FCB %00110001,$00,1 3418 15cd 30 00 00 FCB %00110000,$00,0 3419 15d0 31 00 01 FCB %00110001,$00,1 3420 15d3 30 00 00 FCB %00110000,$00,0 3421 15d6 31 00 01 FCB %00110001,$00,1 3422 15d9 30 00 00 FCB %00110000,$00,0 3423 15dc 31 00 01 FCB %00110001,$00,1 3424 15df 30 00 00 FCB %00110000,$00,0 3425 15e2 31 00 01 FCB %00110001,$00,1 3426 15e5 30 00 00 FCB %00110000,$00,0 3427 15e8 31 00 01 FCB %00110001,$00,1 3428 15eb 30 00 00 FCB %00110000,$00,0 3429 15ee 31 00 01 FCB %00110001,$00,1 3430 15f1 30 00 00 FCB %00110000,$00,0 3431 15f4 31 00 01 FCB %00110001,$00,1 3432 15f7 30 00 00 FCB %00110000,$00,0 3433 15fa b6 00 01 FCB %10110110,$00,1 3434 3435 15fd 30 00 00 FCB %00110000,$00,0 1 1 pulse 3436 1600 b6 00 01 FCB %10110110,$00,1 3437 3438 1603 30 00 00 FCB %00110000,$00,0 2 2 pulses 3439 1606 31 00 01 FCB %00110001,$00,1 3440 1609 30 00 00 FCB %00110000,$00,0 3441 160c b6 00 01 FCB %10110110,$00,1 3442 3443 160f 30 00 00 FCB %00110000,$00,0 3 3 pulses 3444 1612 31 00 01 FCB %00110001,$00,1 3445 1615 30 00 00 FCB %00110000,$00,0 3446 1618 31 00 01 FCB %00110001,$00,1 3447 161b 30 00 00 FCB %00110000,$00,0 3448 161e b6 00 01 FCB %10110110,$00,1 3449 3450 1621 30 00 00 FCB %00110000,$00,0 4 4 pulses 3451 1624 31 00 01 FCB %00110001,$00,1 3452 1627 30 00 00 FCB %00110000,$00,0 3453 162a 31 00 01 FCB %00110001,$00,1 3454 162d 30 00 00 FCB %00110000,$00,0 3455 1630 31 00 01 FCB %00110001,$00,1 3456 1633 30 00 00 FCB %00110000,$00,0 3457 1636 b6 00 01 FCB %10110110,$00,1 3458 3459 1639 30 00 00 FCB %00110000,$00,0 5 5 pulses 3460 163c 31 00 01 FCB %00110001,$00,1 3461 163f 30 00 00 FCB %00110000,$00,0 3462 1642 31 00 01 FCB %00110001,$00,1 3463 1645 30 00 00 FCB %00110000,$00,0 3464 1648 31 00 01 FCB %00110001,$00,1 3465 164b 30 00 00 FCB %00110000,$00,0 3466 164e 31 00 01 FCB %00110001,$00,1 3467 1651 30 00 00 FCB %00110000,$00,0 3468 1654 b6 00 01 FCB %10110110,$00,1 3469 3470 1657 30 00 00 FCB %00110000,$00,0 6 6 pulses 3471 165a 31 00 01 FCB %00110001,$00,1 3472 165d 30 00 00 FCB %00110000,$00,0 3473 1660 31 00 01 FCB %00110001,$00,1 3474 1663 30 00 00 FCB %00110000,$00,0 3475 1666 31 00 01 FCB %00110001,$00,1 3476 1669 30 00 00 FCB %00110000,$00,0 3477 166c 31 00 01 FCB %00110001,$00,1 3478 166f 30 00 00 FCB %00110000,$00,0 3479 1672 31 00 01 FCB %00110001,$00,1 3480 1675 30 00 00 FCB %00110000,$00,0 3481 1678 b6 00 01 FCB %10110110,$00,1 3482 3483 167b 30 00 00 FCB %00110000,$00,0 7 7 pulses 3484 167e 31 00 01 FCB %00110001,$00,1 3485 1681 30 00 00 FCB %00110000,$00,0 3486 1684 31 00 01 FCB %00110001,$00,1 3487 1687 30 00 00 FCB %00110000,$00,0 3488 168a 31 00 01 FCB %00110001,$00,1 3489 168d 30 00 00 FCB %00110000,$00,0 3490 1690 31 00 01 FCB %00110001,$00,1 3491 1693 30 00 00 FCB %00110000,$00,0 3492 1696 31 00 01 FCB %00110001,$00,1 3493 1699 30 00 00 FCB %00110000,$00,0 3494 169c 31 00 01 FCB %00110001,$00,1 3495 169f 30 00 00 FCB %00110000,$00,0 3496 16a2 b6 00 01 FCB %10110110,$00,1 3497 3498 16a5 30 00 00 FCB %00110000,$00,0 8 8 pulses 3499 16a8 31 00 01 FCB %00110001,$00,1 3500 16ab 30 00 00 FCB %00110000,$00,0 3501 16ae 31 00 01 FCB %00110001,$00,1 3502 16b1 30 00 00 FCB %00110000,$00,0 3503 16b4 31 00 01 FCB %00110001,$00,1 3504 16b7 30 00 00 FCB %00110000,$00,0 3505 16ba 31 00 01 FCB %00110001,$00,1 3506 16bd 30 00 00 FCB %00110000,$00,0 3507 16c0 31 00 01 FCB %00110001,$00,1 3508 16c3 30 00 00 FCB %00110000,$00,0 3509 16c6 31 00 01 FCB %00110001,$00,1 3510 16c9 30 00 00 FCB %00110000,$00,0 3511 16cc 31 00 01 FCB %00110001,$00,1 3512 16cf 30 00 00 FCB %00110000,$00,0 3513 16d2 b6 00 01 FCB %10110110,$00,1 3514 3515 16d5 30 00 00 FCB %00110000,$00,0 9 9 pulses 3516 16d8 31 00 01 FCB %00110001,$00,1 3517 16db 30 00 00 FCB %00110000,$00,0 3518 16de 31 00 01 FCB %00110001,$00,1 3519 16e1 30 00 00 FCB %00110000,$00,0 3520 16e4 31 00 01 FCB %00110001,$00,1 3521 16e7 30 00 00 FCB %00110000,$00,0 3522 16ea 31 00 01 FCB %00110001,$00,1 3523 16ed 30 00 00 FCB %00110000,$00,0 3524 16f0 31 00 01 FCB %00110001,$00,1 3525 16f3 30 00 00 FCB %00110000,$00,0 3526 16f6 31 00 01 FCB %00110001,$00,1 3527 16f9 30 00 00 FCB %00110000,$00,0 3528 16fc 31 00 01 FCB %00110001,$00,1 3529 16ff 30 00 00 FCB %00110000,$00,0 3530 1702 31 00 01 FCB %00110001,$00,1 3531 1705 30 00 00 FCB %00110000,$00,0 3532 1708 b6 00 01 FCB %10110110,$00,1 3533 3534 170b a0 cc 00 0b FCB %10100000,204,$00,11 * 200 ms space 3535 3536 170f a0 cc 00 0a FCB %10100000,204,$00,10 # 200 ms mark 3537 3538 1713 90 FCB %10010000 ^0 - 3539 1714 90 FCB %10010000 ^1 - 3540 1715 90 FCB %10010000 ^2 - 3541 1716 90 FCB %10010000 ^3 - 3542 1717 90 FCB %10010000 ^4 - 3543 1718 90 FCB %10010000 ^5 - 3544 1719 90 FCB %10010000 ^6 - 3545 171a 90 FCB %10010000 ^7 - 3546 171b 90 FCB %10010000 ^8 - 3547 171c 90 FCB %10010000 ^9 - 3548 3549 171d 20 24 66 32 C4 FCB %00100000,36,$66,50 0 10 3550 1721 00 24 FCB %00000000,36 3551 1723 20 24 66 35 FCB %00100000,36,$66,53 3552 1727 00 24 FCB %00000000,36 3553 1729 20 24 66 32 FCB %00100000,36,$66,50 3554 172d 00 24 FCB %00000000,36 3555 172f 20 24 66 35 FCB %00100000,36,$66,53 3556 1733 80 66 FCB %10000000,102 3557 3558 1735 20 24 66 35 FCB %00100000,36,$66,53 1 1 3559 1739 00 24 FCB %00000000,36 3560 173b 20 24 66 35 FCB %00100000,36,$66,53 3561 173f 00 24 FCB %00000000,36 3562 1741 20 24 66 35 FCB %00100000,36,$66,53 3563 1745 00 24 FCB %00000000,36 3564 1747 20 24 66 32 FCB %00100000,36,$66,50 3565 174b 80 66 FCB %10000000,102 3566 3567 174d 20 24 66 35 FCB %00100000,36,$66,53 2 2 3568 1751 00 24 FCB %00000000,36 3569 1753 20 24 66 35 FCB %00100000,36,$66,53 3570 1757 00 24 FCB %00000000,36 3571 1759 20 24 66 32 FCB %00100000,36,$66,50 3572 175d 00 24 FCB %00000000,36 3573 175f 20 24 66 35 FCB %00100000,36,$66,53 3574 1763 80 66 FCB %10000000,102 3575 3576 1765 20 24 66 35 FCB %00100000,36,$66,53 3 3 3577 1769 00 24 FCB %00000000,36 3578 176b 20 24 66 35 FCB %00100000,36,$66,53 3579 176f 00 24 FCB %00000000,36 3580 1771 20 24 66 32 FCB %00100000,36,$66,50 3581 1775 00 24 FCB %00000000,36 3582 1777 20 24 66 32 FCB %00100000,36,$66,50 3583 177b 80 66 FCB %10000000,102 3584 3585 177d 20 24 66 35 FCB %00100000,36,$66,53 4 4 3586 1781 00 24 FCB %00000000,36 3587 1783 20 24 66 32 FCB %00100000,36,$66,50 3588 1787 00 24 FCB %00000000,36 3589 1789 20 24 66 35 FCB %00100000,36,$66,53 3590 178d 00 24 FCB %00000000,36 3591 178f 20 24 66 35 FCB %00100000,36,$66,53 3592 1793 80 66 FCB %10000000,102 3593 3594 1795 20 24 66 35 FCB %00100000,36,$66,53 5 5 3595 1799 00 24 FCB %00000000,36 3596 179b 20 24 66 32 FCB %00100000,36,$66,50 3597 179f 00 24 FCB %00000000,36 3598 17a1 20 24 66 35 FCB %00100000,36,$66,53 3599 17a5 00 24 FCB %00000000,36 3600 17a7 20 24 66 32 FCB %00100000,36,$66,50 3601 17ab 80 66 FCB %10000000,102 3602 3603 17ad 20 24 66 35 FCB %00100000,36,$66,53 6 6 3604 17b1 00 24 FCB %00000000,36 3605 17b3 20 24 66 32 FCB %00100000,36,$66,50 3606 17b7 00 24 FCB %00000000,36 3607 17b9 20 24 66 32 FCB %00100000,36,$66,50 3608 17bd 00 24 FCB %00000000,36 3609 17bf 20 24 66 35 FCB %00100000,36,$66,53 3610 17c3 80 66 FCB %10000000,102 3611 3612 17c5 20 24 66 35 FCB %00100000,36,$66,53 7 7 3613 17c9 00 24 FCB %00000000,36 3614 17cb 20 24 66 32 FCB %00100000,36,$66,50 3615 17cf 00 24 FCB %00000000,36 3616 17d1 20 24 66 32 FCB %00100000,36,$66,50 3617 17d5 00 24 FCB %00000000,36 3618 17d7 20 24 66 32 FCB %00100000,36,$66,50 3619 17db 80 66 FCB %10000000,102 3620 3621 17dd 20 24 66 32 FCB %00100000,36,$66,50 8 8 3622 17e1 00 24 FCB %00000000,36 3623 17e3 20 24 66 35 FCB %00100000,36,$66,53 3624 17e7 00 24 FCB %00000000,36 3625 17e9 20 24 66 35 FCB %00100000,36,$66,53 3626 17ed 00 24 FCB %00000000,36 3627 17ef 20 24 66 35 FCB %00100000,36,$66,53 3628 17f3 80 66 FCB %10000000,102 3629 3630 17f5 20 24 66 32 FCB %00100000,36,$66,50 9 9 3631 17f9 00 24 FCB %00000000,36 3632 17fb 20 24 66 35 FCB %00100000,36,$66,53 3633 17ff 00 24 FCB %00000000,36 3634 1801 20 24 66 35 FCB %00100000,36,$66,53 3635 1805 00 24 FCB %00000000,36 3636 1807 20 24 66 32 FCB %00100000,36,$66,50 3637 180b 80 66 FCB %10000000,102 3638 3639 180d 40 9a 66 32 35 FCB %01000000,154,$66,50,53 * PXX Clear forward 3640 1812 a1 66 66 32 FCB %10100001,102,$66,50 3641 3642 1816 40 9a 66 32 35 FCB %01000000,154,$66,50,53 # PY Transit seizure 3643 181b a0 66 66 35 FCB %10100000,102,$66,53 3644 3645 181f 90 FCB %10010000 ^0 3646 3647 1820 20 24 66 32 FCB %00100000,36,$66,50 ^1 11 3648 1824 00 24 FCB %00000000,36 3649 1826 20 24 66 35 FCB %00100000,36,$66,53 3650 182a 00 24 FCB %00000000,36 3651 182c 20 24 66 32 FCB %00100000,36,$66,50 3652 1830 00 24 FCB %00000000,36 3653 1832 20 24 66 32 FCB %00100000,36,$66,50 3654 1836 80 66 FCB %10000000,102 3655 3656 1838 20 24 66 32 FCB %00100000,36,$66,50 ^2 12 3657 183c 00 24 FCB %00000000,36 3658 183e 20 24 66 32 FCB %00100000,36,$66,50 3659 1842 00 24 FCB %00000000,36 3660 1844 20 24 66 35 FCB %00100000,36,$66,53 3661 1848 00 24 FCB %00000000,36 3662 184a 20 24 66 35 FCB %00100000,36,$66,53 3663 184e 80 66 FCB %10000000,102 3664 3665 1850 20 24 66 32 FCB %00100000,36,$66,50 ^3 13 3666 1854 00 24 FCB %00000000,36 3667 1856 20 24 66 32 FCB %00100000,36,$66,50 3668 185a 00 24 FCB %00000000,36 3669 185c 20 24 66 35 FCB %00100000,36,$66,53 3670 1860 00 24 FCB %00000000,36 3671 1862 20 24 66 32 FCB %00100000,36,$66,50 3672 1866 80 66 FCB %10000000,102 3673 3674 1868 20 24 66 32 FCB %00100000,36,$66,50 ^4 14 3675 186c 00 24 FCB %00000000,36 3676 186e 20 24 66 32 FCB %00100000,36,$66,50 3677 1872 00 24 FCB %00000000,36 3678 1874 20 24 66 32 FCB %00100000,36,$66,50 3679 1878 00 24 FCB %00000000,36 3680 187a 20 24 66 35 FCB %00100000,36,$66,53 3681 187e 80 66 FCB %10000000,102 3682 3683 1880 20 24 66 32 FCB %00100000,36,$66,50 ^5 15 3684 1884 00 24 FCB %00000000,36 3685 1886 20 24 66 32 FCB %00100000,36,$66,50 3686 188a 00 24 FCB %00000000,36 3687 188c 20 24 66 32 FCB %00100000,36,$66,50 3688 1890 00 24 FCB %00000000,36 3689 1892 20 24 66 32 FCB %00100000,36,$66,50 3690 1896 80 66 FCB %10000000,102 3691 3692 1898 20 24 66 35 FCB %00100000,36,$66,53 ^6 16 3693 189c 00 24 FCB %00000000,36 3694 189e 20 24 66 35 FCB %00100000,36,$66,53 3695 18a2 00 24 FCB %00000000,36 3696 18a4 20 24 66 35 FCB %00100000,36,$66,53 3697 18a8 00 24 FCB %00000000,36 3698 18aa 20 24 66 35 FCB %00100000,36,$66,53 3699 18ae 80 66 FCB %10000000,102 3700 3701 18b0 40 9a 66 32 35 FCB %01000000,154,$66,50,53 * PX Terminal seizure 3702 18b5 a0 66 66 32 FCB %10100000,102,$66,50 3703 3704 18b9 90 FCB %10010000 ^8 3705 3706 18ba 40 9a 66 32 35 FCB %01000000,154,$66,50,53 ^9 PYY Forward transfer 3707 18bf a1 66 66 35 FCB %10100001,102,$66,53 3708 3709 18c3 5a 66 0f 10 C5 FCB %01011010,$66,15,16 0 10 3710 18c7 9b FCB %10011011 3711 18c8 5a 66 0c 0d FCB %01011010,$66,12,13 1 1 3712 18cc 9b FCB %10011011 3713 18cd 5a 66 0c 0e FCB %01011010,$66,12,14 2 2 3714 18d1 9b FCB %10011011 3715 18d2 5a 66 0d 0e FCB %01011010,$66,13,14 3 3 3716 18d6 9b FCB %10011011 3717 18d7 5a 66 0c 0f FCB %01011010,$66,12,15 4 4 3718 18db 9b FCB %10011011 3719 18dc 5a 66 0d 0f FCB %01011010,$66,13,15 5 5 3720 18e0 9b FCB %10011011 3721 18e1 5a 66 0e 0f FCB %01011010,$66,14,15 6 6 3722 18e5 9b FCB %10011011 3723 18e6 5a 66 0c 10 FCB %01011010,$66,12,16 7 7 3724 18ea 9b FCB %10011011 3725 18eb 5a 66 0d 10 FCB %01011010,$66,13,16 8 8 3726 18ef 9b FCB %10011011 3727 18f0 5a 66 0e 10 FCB %01011010,$66,14,16 9 9 3728 18f4 9b FCB %10011011 3729 18f5 c0 b3 66 35 37 FCB %11000000,179,$66,53,55 * CF175 3730 18fa a1 33 66 35 FCB %10100001,51,$66,53 # SZ300 3731 18fe 9b FCB %10011011 ^0 pause 3732 18ff 5a 66 0c 11 FCB %01011010,$66,12,17 ^1 11 3733 1903 9b FCB %10011011 3734 1904 5a 66 0d 11 FCB %01011010,$66,13,17 ^2 12 3735 1908 9b FCB %10011011 3736 1909 5c 66 0e 11 FCB %01011100,$66,14,17 ^3 KP1 3737 190d 9b FCB %10011011 3738 190e 5c 66 0f 11 FCB %01011100,$66,15,17 ^4 KP2 3739 1912 9b FCB %10011011 3740 1913 da 66 10 11 FCB %11011010,$66,16,17 ^5 ST 3741 1917 aa 00 00 37 FCB %10101010,0,$00,55 ^6 2600 play while pressed/500 ms 3742 191b c0 7b 66 35 37 FCB %11000000,123,$66,53,55 ^7 CF120 3743 1920 a0 7b 66 35 FCB %10100000,123,$66,53 ^8 SZ120 3744 1924 a0 f6 66 35 FCB %10100000,246,$66,53 ^9 SZ240 3745 3746 3747 1928 90 Red FCB %10010000 0 - 3748 3749 1929 40 3e 66 27 28 FCB %01000000,62,$66,39,40 1 5 cents ACTS 3750 192e 82 00 FCB %10000010,0 3751 3752 1930 40 3e 66 27 28 FCB %01000000,62,$66,39,40 2 10 cents 3753 1935 00 3e FCB %00000000,62 3754 1937 40 3e 66 27 28 FCB %01000000,62,$66,39,40 3755 193c 82 00 FCB %10000010,0 3756 3757 193e 40 24 66 27 28 FCB %01000000,36,$66,39,40 3 25 cents 3758 1943 00 24 FCB %00000000,36 3759 1945 40 24 66 27 28 FCB %01000000,36,$66,39,40 3760 194a 00 24 FCB %00000000,36 3761 194c 40 24 66 27 28 FCB %01000000,36,$66,39,40 3762 1951 00 24 FCB %00000000,36 3763 1953 40 24 66 27 28 FCB %01000000,36,$66,39,40 3764 1958 00 24 FCB %00000000,36 3765 195a 40 24 66 27 28 FCB %01000000,36,$66,39,40 3766 195f 82 00 FCB %10000010,0 3767 3768 1961 40 3e 66 26 28 FCB %01000000,62,$66,38,40 4 5 cents IPTS 3769 1966 82 00 FCB %10000010,0 3770 3771 1968 40 3e 66 26 28 FCB %01000000,62,$66,38,40 5 10 cents 3772 196d 00 3e FCB %00000000,62 3773 196f 40 3e 66 26 28 FCB %01000000,62,$66,38,40 3774 1974 82 00 FCB %10000010,0 3775 3776 1976 40 24 66 26 28 FCB %01000000,36,$66,38,40 6 25 cents 3777 197b 00 24 FCB %00000000,36 3778 197d 40 24 66 26 28 FCB %01000000,36,$66,38,40 3779 1982 00 24 FCB %00000000,36 3780 1984 40 24 66 26 28 FCB %01000000,36,$66,38,40 3781 1989 00 24 FCB %00000000,36 3782 198b 40 24 66 26 28 FCB %01000000,36,$66,38,40 3783 1990 00 24 FCB %00000000,36 3784 1992 40 24 66 26 28 FCB %01000000,36,$66,38,40 3785 1997 82 00 FCB %10000010,0 3786 3787 1999 20 3e 00 28 FCB %00100000,62,$00,40 7 5 cents non ACTS 3788 199d 82 00 FCB %10000010,0 3789 3790 199f 20 3e 00 28 FCB %00100000,62,$00,40 8 10 cents 3791 19a3 00 3e FCB %00000000,62 3792 19a5 20 3e 00 28 FCB %00100000,62,$00,40 3793 19a9 82 00 FCB %10000010,0 3794 3795 19ab 20 24 00 28 FCB %00100000,36,$00,40 9 25 cents 3796 19af 00 24 FCB %00000000,36 3797 19b1 20 24 00 28 FCB %00100000,36,$00,40 3798 19b5 00 24 FCB %00000000,36 3799 19b7 20 24 00 28 FCB %00100000,36,$00,40 3800 19bb 00 24 FCB %00000000,36 3801 19bd 20 24 00 28 FCB %00100000,36,$00,40 3802 19c1 00 24 FCB %00000000,36 3803 19c3 20 24 00 28 FCB %00100000,36,$00,40 3804 19c7 82 00 FCB %10000010,0 3805 3806 19c9 90 FCB %10010000 * - 3807 19ca 90 FCB %10010000 # - 3808 19cb 90 FCB %10010000 ^0 - 3809 19cc 90 FCB %10010000 ^1 - 3810 19cd 90 FCB %10010000 ^2 - 3811 19ce 90 FCB %10010000 ^3 - 3812 19cf 90 FCB %10010000 ^4 - 3813 19d0 90 FCB %10010000 ^5 - 3814 19d1 90 FCB %10010000 ^6 - 3815 19d2 90 FCB %10010000 ^7 - 3816 19d3 90 FCB %10010000 ^8 - 3817 19d4 90 FCB %10010000 ^9 - 3818 3819 19d5 88 33 Special FCB %10001000,51 0 Silence 50 ms 3820 19d7 c8 33 66 35 37 FCB %11001000,51,$66,53,55 1 2400/2600 50 ms 3821 19dc a8 33 66 35 FCB %10101000,51,$66,53 2 2400 50 ms 3822 19e0 a8 33 00 37 FCB %10101000,51,$00,55 3 2600 50 ms 3823 19e4 c8 33 66 32 35 FCB %11001000,51,$66,50,53 4 2040/2400 50 ms 3824 19e9 a8 33 00 34 FCB %10101000,51,$00,52 5 2280 50 ms 3825 19ed a8 33 00 38 FCB %10101000,51,$00,56 6 3000 50 ms 3826 19f1 a8 33 00 30 FCB %10101000,51,$00,48 7 1700 50 ms 3827 19f5 a8 33 00 31 FCB %10101000,51,$00,49 8 1900 50 ms 3828 19f9 a8 33 00 36 FCB %10101000,51,$00,54 9 2500 50 ms 3829 19fd c8 33 66 02 03 FCB %11001000,51,$66,2,3 * #2/#3 50 ms 3830 1a02 c8 0a 66 02 03 FCB %11001000,10,$66,2,3 # #2/#3 10 ms 3831 1a07 88 0a FCB %10001000,10 ^0 Silence 10 ms 3832 1a09 c8 0a 66 35 37 FCB %11001000,10,$66,53,55 ^1 2400/2600 10 ms 3833 1a0e a8 0a 66 35 FCB %10101000,10,$66,53 ^2 2400 10 ms 3834 1a12 a8 0a 00 37 FCB %10101000,10,$00,55 ^3 2600 10 ms 3835 1a16 c8 0a 66 32 35 FCB %11001000,10,$66,50,53 ^4 2040/2400 10 ms 3836 1a1b a8 0a 00 34 FCB %10101000,10,$00,52 ^5 2280 10 ms 3837 1a1f a8 0a 00 38 FCB %10101000,10,$00,56 ^6 3000 10 ms 3838 1a23 a8 0a 00 30 FCB %10101000,10,$00,48 ^7 1700 10 ms 3839 1a27 a8 0a 00 31 FCB %10101000,10,$00,49 ^8 1900 10 ms 3840 1a2b a8 0a 00 36 FCB %10101000,10,$00,54 ^9 2500 10 ms 3841 3842 1a2f a8 47 00 35 Toneslt FCB %10101000,71,$00,53 0 0 3843 1a33 a8 47 00 51 FCB %10101000,71,$00,81 1 1 3844 1a37 a8 47 00 5b FCB %10101000,71,$00,91 2 2 3845 1a3b a8 47 00 52 FCB %10101000,71,$00,82 3 3 3846 1a3f a8 47 00 44 FCB %10101000,71,$00,68 4 4 3847 1a43 a8 47 00 5c FCB %10101000,71,$00,92 5 5 3848 1a47 a8 47 00 5d FCB %10101000,71,$00,93 6 6 3849 1a4b a8 47 00 5e FCB %10101000,71,$00,94 7 7 3850 1a4f a8 47 00 4b FCB %10101000,71,$00,75 8 8 3851 1a53 a8 47 00 28 FCB %10101000,71,$00,40 9 9 3852 1a57 a8 47 00 37 FCB %10101000,71,$00,55 * A 3853 1a5b 90 FCB %10010000 # - 3854 1a5c 90 FCB %10010000 ^0 - 3855 1a5d 90 FCB %10010000 ^1 - 3856 1a5e 90 FCB %10010000 ^2 - 3857 1a5f 90 FCB %10010000 ^3 - 3858 1a60 90 FCB %10010000 ^4 - 3859 1a61 90 FCB %10010000 ^5 - 3860 1a62 90 FCB %10010000 ^6 - 3861 1a63 90 FCB %10010000 ^7 - 3862 1a64 90 FCB %10010000 ^8 - 3863 1a65 90 FCB %10010000 ^9 - 3864 3865 1a66 5a 66 23 24 R2bkwrd FCB %01011010,$66,35,36 0 10 3866 1a6a 9b FCB %10011011 3867 1a6b 5a 66 20 21 FCB %01011010,$66,32,33 1 1 3868 1a6f 9b FCB %10011011 3869 1a70 5a 66 20 22 FCB %01011010,$66,32,34 2 2 3870 1a74 9b FCB %10011011 3871 1a75 5a 66 21 22 FCB %01011010,$66,33,34 3 3 3872 1a79 9b FCB %10011011 3873 1a7a 5a 66 20 23 FCB %01011010,$66,32,35 4 4 3874 1a7e 9b FCB %10011011 3875 1a7f 5a 66 21 23 FCB %01011010,$66,33,35 5 5 3876 1a83 9b FCB %10011011 3877 1a84 5a 66 22 23 FCB %01011010,$66,34,35 6 6 3878 1a88 9b FCB %10011011 3879 1a89 5a 66 20 24 FCB %01011010,$66,32,36 7 7 3880 1a8d 9b FCB %10011011 3881 1a8e 5a 66 21 24 FCB %01011010,$66,33,36 8 8 3882 1a92 9b FCB %10011011 3883 1a93 5a 66 22 24 FCB %01011010,$66,34,36 9 9 3884 1a97 9b FCB %10011011 3885 1a98 90 FCB %10010000 * - 3886 1a99 90 FCB %10010000 # - 3887 1a9a 9b FCB %10011011 ^0 pause 3888 1a9b 5a 66 20 25 FCB %01011010,$66,32,37 ^1 11 3889 1a9f 9b FCB %10011011 3890 1aa0 5a 66 21 25 FCB %01011010,$66,33,37 ^2 12 3891 1aa4 9b FCB %10011011 3892 1aa5 5a 66 22 25 FCB %01011010,$66,34,37 ^3 13 3893 1aa9 9b FCB %10011011 3894 1aaa 5a 66 23 25 FCB %01011010,$66,35,37 ^4 14 3895 1aae 9b FCB %10011011 3896 1aaf 5a 66 24 25 FCB %01011010,$66,36,37 ^5 15 3897 1ab3 9b FCB %10011011 3898 1ab4 90 FCB %10010000 ^6 - 3899 1ab5 90 FCB %10010000 ^7 - 3900 1ab6 90 FCB %10010000 ^8 - 3901 1ab7 90 FCB %10010000 ^9 - 3902 3903 1ab8 00 01 03 04 06 07 SINE0 FCB 0,1,3,4,6,7,9,10,12,13,15,16,18,19,21,22 09 0a 0c 0d 0f 10 12 13 15 16 3904 1ac8 18 19 1a 1c 1d 1f FCB 24,25,26,28,29,31,32,33,35,36,37,38,39,41,42,43 20 21 23 24 25 26 27 29 2a 2b 3905 1ad8 2c 2d 2e 2f 30 31 FCB 44,45,46,47,48,49,50,51,52,53,54,54,55,56,56,57 32 33 34 35 36 36 37 38 38 39 3906 1ae8 3a 3a 3b 3b 3c 3c FCB 58,58,59,59,60,60,61,61,61,62,62,62,62,62,62,62 3d 3d 3d 3e 3e 3e 3e 3e 3e 3e 3907 1af8 3e 3e 3e 3e 3e 3e FCB 62,62,62,62,62,62,62,62,61,61,61,60,60,59,59,58 3e 3e 3d 3d 3d 3c 3c 3b 3b 3a 3908 1b08 3a 39 38 38 37 36 FCB 58,57,56,56,55,54,54,53,52,51,50,49,48,47,46,45 36 35 34 33 32 31 30 2f 2e 2d 3909 1b18 2c 2b 2a 29 27 26 FCB 44,43,42,41,39,38,37,36,35,33,32,31,29,28,26,25 25 24 23 21 20 1f 1d 1c 1a 19 3910 1b28 18 16 15 13 12 10 FCB 24,22,21,19,18,16,15,13,12,10,9,7,6,4,3,1 0f 0d 0c 0a 09 07 06 04 03 01 3911 1b38 00 ff fd fc fa f9 FCB 0,255,253,252,250,249,247,246,244,243,241,240,238,237,235,234 f7 f6 f4 f3 f1 f0 ee ed eb ea 3912 1b48 e8 e7 e6 e4 e3 e1 FCB 232,231,230,228,227,225,224,223,221,220,219,218,217,215,214,213 e0 df dd dc db da d9 d7 d6 d5 3913 1b58 d4 d3 d2 d1 d0 cf FCB 212,211,210,209,208,207,206,205,204,203,202,202,201,200,200,199 ce cd cc cb ca ca c9 c8 c8 c7 3914 1b68 c6 c6 c5 c5 c4 c4 FCB 198,198,197,197,196,196,195,195,195,194,194,194,194,194,194,194 c3 c3 c3 c2 c2 c2 c2 c2 c2 c2 3915 1b78 c1 c2 c2 c2 c2 c2 FCB 193,194,194,194,194,194,194,194,195,195,195,196,196,197,197,198 c2 c2 c3 c3 c3 c4 c4 c5 c5 c6 3916 1b88 c6 c7 c8 c8 c9 ca FCB 198,199,200,200,201,202,202,203,204,205,206,207,208,209,210,211 ca cb cc cd ce cf d0 d1 d2 d3 3917 1b98 d4 d5 d6 d7 d9 da FCB 212,213,214,215,217,218,219,220,221,223,224,225,227,228,230,231 db dc dd df e0 e1 e3 e4 e6 e7 3918 1ba8 e8 ea eb ed ee f0 FCB 232,234,235,237,238,240,241,243,244,246,247,249,250,252,253,255 f1 f3 f4 f6 f7 f9 fa fc fd ff 3919 3920 3921 1bb8 00 00 01 02 03 03 SINE6 FCB 0,0,1,2,3,3,4,5,6,6,7,8,9,9,10,11 04 05 06 06 07 08 09 09 0a 0b 3922 1bc8 0c 0c 0d 0e 0e 0f FCB 12,12,13,14,14,15,16,16,17,18,18,19,20,20,21,21 10 10 11 12 12 13 14 14 15 15 3923 1bd8 16 16 17 17 18 18 FCB 22,22,23,23,24,24,25,25,26,26,27,27,27,28,28,28 19 19 1a 1a 1b 1b 1b 1c 1c 1c 3924 1be8 1d 1d 1d 1d 1e 1e FCB 29,29,29,29,30,30,30,30,30,31,31,31,31,31,31,31 1e 1e 1e 1f 1f 1f 1f 1f 1f 1f 3925 1bf8 1f 1f 1f 1f 1f 1f FCB 31,31,31,31,31,31,31,31,30,30,30,30,30,29,29,29 1f 1f 1e 1e 1e 1e 1e 1d 1d 1d 3926 1c08 1d 1c 1c 1c 1b 1b FCB 29,28,28,28,27,27,27,26,26,25,25,24,24,23,23,22 1b 1a 1a 19 19 18 18 17 17 16 3927 1c18 16 15 15 14 14 13 FCB 22,21,21,20,20,19,18,18,17,16,16,15,14,14,13,12 12 12 11 10 10 0f 0e 0e 0d 0c 3928 1c28 0c 0b 0a 09 09 08 FCB 12,11,10,9,9,8,7,6,6,5,4,3,3,2,1,0 07 06 06 05 04 03 03 02 01 00 3929 1c38 00 00 ff fe fd fd FCB 0,0,255,254,253,253,252,251,250,250,249,248,247,247,246,245 fc fb fa fa f9 f8 f7 f7 f6 f5 3930 1c48 f4 f4 f3 f2 f2 f1 FCB 244,244,243,242,242,241,240,240,239,238,238,237,236,236,235,235 f0 f0 ef ee ee ed ec ec eb eb 3931 1c58 ea ea e9 e9 e8 e8 FCB 234,234,233,233,232,232,231,231,230,230,229,229,229,228,228,228 e7 e7 e6 e6 e5 e5 e5 e4 e4 e4 3932 1c68 e3 e3 e3 e3 e2 e2 FCB 227,227,227,227,226,226,226,226,226,225,225,225,225,225,225,225 e2 e2 e2 e1 e1 e1 e1 e1 e1 e1 3933 1c78 e1 e1 e1 e1 e1 e1 FCB 225,225,225,225,225,225,225,225,226,226,226,226,226,227,227,227 e1 e1 e2 e2 e2 e2 e2 e3 e3 e3 3934 1c88 e3 e4 e4 e4 e5 e5 FCB 227,228,228,228,229,229,229,230,230,231,231,232,232,233,233,234 e5 e6 e6 e7 e7 e8 e8 e9 e9 ea 3935 1c98 ea eb eb ec ec ed FCB 234,235,235,236,236,237,238,238,239,240,240,241,242,242,243,244 ee ee ef f0 f0 f1 f2 f2 f3 f4 3936 1ca8 f4 f5 f6 f7 f7 f8 FCB 244,245,246,247,247,248,249,250,250,251,252,253,253,254,255,0 f9 fa fa fb fc fd fd fe ff 00 3937 3938 3939 1cb8 00 00 00 01 01 02 SINE10 FCB 0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7 02 03 03 04 04 05 05 06 06 07 3940 1cc8 07 08 08 08 09 09 FCB 7,8,8,8,9,9,10,10,11,11,11,12,12,13,13,13 0a 0a 0b 0b 0b 0c 0c 0d 0d 0d 3941 1cd8 0e 0e 0e 0f 0f 0f FCB 14,14,14,15,15,15,16,16,16,16,17,17,17,17,18,18 10 10 10 10 11 11 11 11 12 12 3942 1ce8 12 12 12 12 13 13 FCB 18,18,18,18,19,19,19,19,19,19,19,19,19,19,19,19 13 13 13 13 13 13 13 13 13 13 3943 1cf8 13 13 13 13 13 13 FCB 19,19,19,19,19,19,19,19,19,19,19,19,19,18,18,18 13 13 13 13 13 13 13 12 12 12 3944 1d08 12 12 12 11 11 11 FCB 18,18,18,17,17,17,17,16,16,16,16,15,15,15,14,14 11 10 10 10 10 0f 0f 0f 0e 0e 3945 1d18 0e 0d 0d 0d 0c 0c FCB 14,13,13,13,12,12,11,11,11,10,10,9,9,8,8,8 0b 0b 0b 0a 0a 09 09 08 08 08 3946 1d28 07 07 06 06 05 05 FCB 7,7,6,6,5,5,4,4,3,3,2,2,1,1,0,0 04 04 03 03 02 02 01 01 00 00 3947 1d38 00 00 00 ff ff fe FCB 0,0,0,255,255,254,254,253,253,252,252,251,251,250,250,249 fe fd fd fc fc fb fb fa fa f9 3948 1d48 f9 f8 f8 f8 f7 f7 FCB 249,248,248,248,247,247,246,246,245,245,245,244,244,243,243,243 f6 f6 f5 f5 f5 f4 f4 f3 f3 f3 3949 1d58 f2 f2 f2 f1 f1 f1 FCB 242,242,242,241,241,241,240,240,240,240,239,239,239,239,238,238 f0 f0 f0 f0 ef ef ef ef ee ee 3950 1d68 ee ee ee ee ed ed FCB 238,238,238,238,237,237,237,237,237,237,237,237,237,237,237,237 ed ed ed ed ed ed ed ed ed ed 3951 1d78 ed ed ed ed ed ed FCB 237,237,237,237,237,237,237,237,237,237,237,237,237,238,238,238 ed ed ed ed ed ed ed ee ee ee 3952 1d88 ee ee ee ef ef ef FCB 238,238,238,239,239,239,239,240,240,240,240,241,241,241,242,242 ef f0 f0 f0 f0 f1 f1 f1 f2 f2 3953 1d98 f2 f3 f3 f3 f4 f4 FCB 242,243,243,243,244,244,245,245,245,246,246,247,247,248,248,248 f5 f5 f5 f6 f6 f7 f7 f8 f8 f8 3954 1da8 f9 f9 fa fa fb fb FCB 249,249,250,250,251,251,252,252,253,253,254,254,255,255,0,0 fc fc fd fd fe fe ff ff 00 00 3955 3956 3957 1db8 00 00 00 00 01 01 SINE15 FCB 0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,4 01 01 02 02 02 02 03 03 03 04 3958 1dc8 04 04 04 05 05 05 FCB 4,4,4,5,5,5,5,5,6,6,6,6,7,7,7,7 05 05 06 06 06 06 07 07 07 07 3959 1dd8 07 08 08 08 08 08 FCB 7,8,8,8,8,8,8,9,9,9,9,9,9,10,10,10 08 09 09 09 09 09 09 0a 0a 0a 3960 1de8 0a 0a 0a 0a 0a 0a FCB 10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11 0a 0a 0a 0b 0b 0b 0b 0b 0b 0b 3961 1df8 0b 0b 0b 0b 0b 0b FCB 11,11,11,11,11,11,11,11,10,10,10,10,10,10,10,10 0b 0b 0a 0a 0a 0a 0a 0a 0a 0a 3962 1e08 0a 0a 0a 0a 09 09 FCB 10,10,10,10,9,9,9,9,9,9,8,8,8,8,8,8 09 09 09 09 08 08 08 08 08 08 3963 1e18 07 07 07 07 07 06 FCB 7,7,7,7,7,6,6,6,6,5,5,5,5,5,4,4 06 06 06 05 05 05 05 05 04 04 3964 1e28 04 04 03 03 03 02 FCB 4,4,3,3,3,2,2,2,2,1,1,1,1,0,0,0 02 02 02 01 01 01 01 00 00 00 3965 1e38 00 00 00 00 ff ff FCB 0,0,0,0,255,255,255,255,254,254,254,254,253,253,253,252 ff ff fe fe fe fe fd fd fd fc 3966 1e48 fc fc fc fb fb fb FCB 252,252,252,251,251,251,251,251,250,250,250,250,249,249,249,249 fb fb fa fa fa fa f9 f9 f9 f9 3967 1e58 f9 f8 f8 f8 f8 f8 FCB 249,248,248,248,248,248,248,247,247,247,247,247,247,246,246,246 f8 f7 f7 f7 f7 f7 f7 f6 f6 f6 3968 1e68 f6 f6 f6 f6 f6 f6 FCB 246,246,246,246,246,246,246,246,246,245,245,245,245,245,245,245 f6 f6 f6 f5 f5 f5 f5 f5 f5 f5 3969 1e78 f5 f5 f5 f5 f5 f5 FCB 245,245,245,245,245,245,245,245,246,246,246,246,246,246,246,246 f5 f5 f6 f6 f6 f6 f6 f6 f6 f6 3970 1e88 f6 f6 f6 f6 f7 f7 FCB 246,246,246,246,247,247,247,247,247,247,248,248,248,248,248,248 f7 f7 f7 f7 f8 f8 f8 f8 f8 f8 3971 1e98 f9 f9 f9 f9 f9 fa FCB 249,249,249,249,249,250,250,250,250,251,251,251,251,251,252,252 fa fa fa fb fb fb fb fb fc fc 3972 1ea8 fc fc fd fd fd fe FCB 252,252,253,253,253,254,254,254,254,255,255,255,255,0,0,0 fe fe fe ff ff ff ff 00 00 00 3973 3974 1ef0 ORG $1EF0 3975 3976 1ef0 04 PASDIGS FCB 4 Number of password digits 3977 1ef1 01 02 03 04 PASSWRD FCB 1,2,3,4 3978 3979 3980 * Interrupt & Reset vectors 3981 3982 1ff4 ORG $1FF4 3983 3984 1ff4 11 8c FDB DUMINT SPI interrupt should never occur 3985 1ff6 11 8d FDB INTSER Serial interrupt service routine 3986 1ff8 12 48 FDB INTTIM Timer interrupt 3987 1ffa 14 3c FDB INTIRQ External IRQ-interrupt 3988 1ffc 11 8c FDB DUMINT Software interrupts 3989 1ffe 02 06 FDB RESET Reset vector 3990 Number of errors 0