**************************************************************************** * Sherwood/Draco Micro/CPU-100 * Disassembly and Reverse-Engineered Firmware Source * * 2012 Jun / bhilpert **************************************************************************** **************************************************************************** * ON RESET * * P is R0 upon reset, switch to R3 and initialise system **************************************************************************** 0000: 71 OnReset DIS disable interrupts 0001: 00 X,P for DIS 0002: F8 00 LDI 00 0004: B3 PHI 3 0005: A8 PLO 8 R8.0 = 0 0006: AA PLO A RA.0 = 0 0007: F8 0B LDI 0B 0009: A3 PLO 3 R3 = 000B (Init) 000A: D3 SEP 3 continue with P==R3 ******************************************** *** Init assorted registers 000B: F8 04 Init LDI 04 000D: B2 PHI 2 000E: B7 PHI 7 R7=04xx 000F: B8 PHI 8 R8=0400 0010: B9 PHI 9 0011: BA PHI A RA=0400 0012: F8 0F LDI 0F 0014: A2 PLO 2 R2 = 040F 0015: F8 10 LDI 10 0017: A9 PLO 9 R9 = 0410 ******************************************** *** Init current channel and preselects 0018: EA SEX A 0019: F8 05 LDI 05 001B: A5 PLO 5 R5.0=5, loop counter 001C: F8 D3 _cpsLoop LDI D3 make sure channel numbers don't exceed max 001E: F7 SM 001F: 3B 26 BNF _cpsBad 0021: F8 01 LDI 01 also bad if LS bit is set 0023: F2 AND 0024: 3A 29 BNZ _cpsNext 0026: F8 01 _cpsBad LDI 01 set to channel 1 if channel # was bad 0028: 5A STR A 0029: 1A _cpsNext INC A on to next 002A: 25 DEC 5 002B: 85 GLO 5 002C: 3A 1C BNZ _cpsLoop * Note A is left pointing to 0405 002E: C4 NOP 002F: C4 NOP ******************************************** *** Init call-sign memory entries 0030: E9 SEX 9 0031: F8 D3 _csmLoop LDI D3 0033: F7 SM 0034: 3B 3B BNF _csmBad 0036: F8 01 LDI 01 0038: F2 AND 0039: 3A 3E BNZ _csmNext 003B: F8 FF _csmBad LDI FF set entry channel number to FF to indicate unused 003D: 59 STR 9 003E: 89 _csmNext GLO 9 003F: FC 05 ADI 05 0041: A9 PLO 9 0042: 3A 31 BNZ _csmLoop ******************************************** 0044: C0 02 70 LBR SetStation set the current station and idle **************************************************************************** * ON INTERRUPT * * P is R1 on interrupt, switch P to R3 and run the Dispatch routine * to handle activity from Rotator & Touch Buttons **************************************************************************** 0047: 91 OnIntr GHI 1 0048: B3 PHI 3 0049: F8 4D LDI 4D set R3 to Dispatch 004B: A3 PLO 3 004C: D3 SEP 3 continue with P==R3 ******************************************** 004D: E2 Dispatch SEX 2 004E: 35 71 B2 OnROTOR check if Rotator 0050: 69 IN1 get touch buttons 0051: FA 10 ANI 10 check if STORE button 0053: 3A 68 BNZ OnSTORE 0055: F8 0F LDI 0F check if ABCD preselect buttons 0057: F2 AND 0058: 3A 8A BNZ OnABCD 005A: F8 C0 LDI C0 check if L/R scan buttons 005C: F2 AND 005D: 3A A1 BNZ OnLRScan 005F: F8 20 LDI 20 check if ALPHA button 0061: F2 AND 0062: CA 03 20 LBNZ OnALPHA 0065: C0 02 A6 LBR Idle nothing to do **************************************************************************** * Handle STORE Button **************************************************************************** 0068: E3 OnSTORE SEX 3 0069: 64 OUT4 turn on STORE LED 006A: 10 data for out 006B: F8 FF LDI FF set A/STORE flag 006D: 5A STR A 006E: C0 02 97 LBR InputAck **************************************************************************** * Handle Rotator **************************************************************************** 0071: E8 OnROTOR SEX 8 R8 points to current channel# 0072: 34 7E B1 _down branch on rotator direction 0074: F8 D3 LDI D3 compare to max (211) 0076: F3 XOR 0077: 32 87 BZ _fin if at max go fin 0079: F8 02 LDI 02 add 2 to channel# 007B: F4 ADD 007C: 30 86 BR _update 007E: F8 01 _down LDI 01 compare to min (1) 0080: F3 XOR 0081: 32 87 BZ _fin if at min go fin 0083: F8 02 LDI 02 subtact 2 from channel# 0085: F5 SD 0086: 58 _update STR 8 0087: C0 02 70 _fin LBR SetStation go set station and idle **************************************************************************** * Handle ABCD Preselect Buttons **************************************************************************** 008A: F8 01 OnABCD LDI 01 R7=0401, pointer to preselect memory 008C: A7 PLO 7 008D: 02 LDN 2 get buttons state 008E: 76 _psLoop SHRC loop to find which one is on 008F: 33 94 BDF _found 0091: 17 INC 7 ++pointer 0092: 30 8E BR _psLoop 0094: 0A _found LDN A check the A/STORE flag for store mode 0095: 3A 9C BNZ _psStore 0097: 07 LDN 7 get preselect channel number 0098: 58 STR 8 make it current channel number 0099: C0 02 70 LBR SetStation 009C: 08 _psStore LDN 8 get current channel 009D: 57 STR 7 and save in preselect memory 009E: C0 02 77 LBR DispStation **************************************************************************** * Handle Left/Right Scan Buttons **************************************************************************** 00A1: F8 00 OnLRScan LDI 00 00A3: AB PLO B RB.0 is flag: 0=scanned one direction, 1=scanned both directions 00A4: AC PLO C RC.0 is flag: 0=left, 1=right 00A5: 08 LDN 8 00A6: BB PHI B RB.1 holds old current channel 00A7: 02 LDN 2 retrieve buttons state 00A8: FA 80 ANI 80 00AA: 3A BE BNZ _right if not 0, right 00AC: E3 _left SEX 3 00AD: 64 OUT4 turn on LEFT LED 00AE: 40 data for out 00AF: 9B GHI B start at old current channel 00B0: 58 STR 8 00B1: 08 _leftNext LDN 8 decrement current channel 00B2: FF 02 SMI 02 00B4: 58 STR 8 00B5: FB FF XRI FF 00B7: 3A DB BNZ _tryChan if not at limit (is valid chan), go check for signal 00B9: 8B GLO B 00BA: 3A D6 BNZ _revert if B flag already set, get out 00BC: 9A GHI A else set B flag and scan right 00BD: AB PLO B 00BE: 9A _right GHI A RA.1 is non-0 00BF: AC PLO C set C flag 00C0: E3 SEX 3 00C1: 64 OUT4 turn on RIGHT LED 00C2: 80 data for out 00C3: 9B GHI B start at old current channel 00C4: 58 STR 8 00C5: 08 _rightNext LDN 8 increment current channel 00C6: FC 02 ADI 02 00C8: 58 STR 8 00C9: FB D5 XRI D5 00CB: 3A DB BNZ _tryChan if not at limit (is valid chan), go check for signal 00CD: 8B GLO B 00CE: 3A D6 BNZ _revert if B flag already set, get out 00D0: 9A GHI A 00D1: AB PLO B else set B flag and scan left 00D2: 88 GLO 8 00D3: AC PLO C clear C flag 00D4: 30 AC BR _left 00D6: 9B _revert GHI B scan failed, restore current channel 00D7: 58 STR 8 00D8: C0 02 70 LBR SetStation and get out 00DB: F8 00 _tryChan LDI 00 gosub SetFreq 00DD: A4 PLO 4 00DE: F8 02 LDI 02 00E0: B4 PHI 4 00E1: D4 SEP 4 00E2: F8 13 LDI 13 delay 1313 00E4: A6 PLO 6 00E5: B6 PHI 6 00E6: 26 _dlyLoop DEC 6 00E7: 96 GHI 6 00E8: 3A E6 BNZ _dlyLoop 00EA: 36 F8 B3 _gotSignal if SIGSENSE, we have signal, go display 00EC: 8C GLO C 00ED: 3A C5 BNZ _rightNext continue right scan 00EF: 30 B1 BR _leftNext continue left scan ******************************************** 00F1: 00 IDL unused 00F2: 00 IDL 00F3: 00 IDL 00F4: 00 IDL 00F5: 00 IDL 00F6: 00 IDL 00F7: 00 IDL ******************************************** 00F8: C0 02 77 _gotSignal LBR DispStatn freq has already been set, go finish displays and idle ******************************************************************************************** * unused ******************************************************************************************** 00FB: 00 IDL 00FC: 00 IDL 00FD: 00 IDL 00FE: 00 IDL 00FF: 00 IDL ******************************************************************************************** * SET FREQUENCY SUBROUTINE * * Required upon entry: * R4 == P, run with R4 as PC * R8 = 0400, ref to current channel number * R2 = 040F, ref to temporary storage locations * * Calculate three values from the current channel number, and output them to set the received frequency: * (1) the 12-bit binary PLL divider count * * (2) the index for the MHz LED of the linear dial display * The channel number is mapped to an index from 0 to 21: * 0 == 87 MHz * 0x15(21) == 108 MHz * * (3) the 4 BCD digits of the frequency display * ******************************************************************************************** 0200: 88 SetFreq GLO 8 D.0=0 0201: AD PLO D 0202: 3F 05 BN4 _mute check odd/even 0204: 1D INC D D.0=1 for even ******************* Mute the receiver 0205: E4 _mute SEX 4 0206: 61 OUT1 out 1 on LDMISC (mute) 0207: 01 data for out ******************* 0208: E8 SEX 8 set X to ref current channel# ******************* Form PLL LO 8 bits 0209: 8D GLO D D=odd/even 020A: FC D4 ADI D4 020C: F4 ADD D = 212 + chan# + odd/even 020D: 52 STR 2 save PLLLO at [R2] 020E: 22 DEC 2 ******************* Form PLL HI 4 bits 020F: 88 GLO 8 D=0 0210: 7C 03 ADCI 03 D=3 + carry from lo bits 0212: 52 STR 2 save PLLHI at [R2-1] 0213: 22 DEC 2 ******************* Form linear MHz display 0214: 88 GLO 8 R5.0 will be LED index, start at 0 0215: A5 PLO 5 0216: 8D GLO D D = odd/even 0217: FC 04 ADI 04 0219: F4 ADD D = chan# + 4 + odd/even 021A: FF 0A _linLoop SMI 0A subtract 10 021C: 3B 21 BNF _linDone 021E: 15 INC 5 R5.0 will count number of 10's 021F: 30 1A BR _linLoop 0221: 85 _linDone GLO 5 0222: 52 STR 2 save linear LED index at [R2-2] 0223: 22 DEC 2 ******************* Form BCD display digits 3 & 2 0224: F8 08 LDI 08 start as 08x.x 0226: AE PLO E E.0 will be 8,9 or 10 0227: 8D GLO D form channel # 0228: F4 ADD 0229: BE PHI E save for digits 1 & 0 022A: FF 1A SMI 1A if less than 26, go for 8 022C: 3B 36 BNF _saveF32 022E: 1E INC E try for 9 022F: FF 64 SMI 64 if less than 100+26, go for 9 0231: 3B 36 BNF _saveF32 0233: F8 10 LDI 10 must be 10 0235: 38 SKP 0236: 8E _saveF32 GLO E 0237: 52 STR 2 save BCD FQ d2 at [R2-3] 0238: 22 DEC 2 ******************* Form BCD display digits 1 & 0 0239: 9E GHI E get channel # 023A: FC 4A ADI 4A add 74 to form two lower digits (8)74+1=(8)75 023C: 3B 40 BNF _adjust if >=256 add another 56 023E: FC 38 ADI 38 + 56 0240: BE _adjust PHI E RE.1 has adjusted channel # 0241: F8 00 LDI 00 RE.0 will be digit 1 0243: AE PLO E *** remove 100s so RD.0 < 100 (lower 2 digits) 0244: 9E GHI E 0245: AD _loop100s PLO D 0246: FF 64 SMI 64 subtract 100 0248: 33 45 BDF _loop100s *** remove 10s so RD.0 < 10, count 10s in RE.0 024A: 8D GLO D 024B: AD _loop10s PLO D 024C: FF 0A SMI 0A subtract 10 024E: 3B 53 BNF _combine 0250: 1E INC E 0251: 30 4B BR _loop10s *** combine RE.0 and RD.0 and save for output 0253: 8E _combine GLO E get digit 1 from E.0 0254: FE SHL shift to upper nibble 0255: FE SHL 0256: FE SHL 0257: FE SHL 0258: 52 STR 2 0259: E2 SEX 2 025A: 8D GLO D get digit 0 from D.0 025B: F1 OR 025C: 52 STR 2 save digits 1 & 0 at [R2-4] ******************* Output new values 025D: 62 OUT2 update LDFRQLO 025E: 63 OUT3 update LDFRQHI 025F: 65 OUT5 update LDDIAL 0260: 67 OUT7 update LDPLLHI 0261: 66 OUT6 update LDPLLLO 0262: 22 DEC 2 restore R2 to 040F ******************* Unmute the receiver 0263: E4 SEX 4 0264: 61 OUT1 out 0 on LDMISC (unmute) 0265: 00 data for out ******************* Finished 0266: D3 SEP 3 return ******************************************************************************************** * unused ******************************************************************************************** 0267: 00 IDL 0268: 00 IDL 0269: 00 IDL 026A: 00 IDL 026B: 00 IDL 026C: 00 IDL 026D: 00 IDL 026E: 00 IDL 026F: 00 IDL ******************************************************************************************** * SET STATION * * Set the receiver frequency and displays to the current channel, * continue to update other displays and then idle. * ******************************************************************************************** 0270: F8 00 SetStation LDI 00 * first, gosub SetFreq via R4 0272: A4 PLO 4 0273: F8 02 LDI 02 0275: B4 PHI 4 0276: D4 SEP 4 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * DISPLAY STATION * * Update the preselect indicators and call-sign display, and clear the input flags. * At completion, go idle the system. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 0277: F8 01 DispStatn LDI 01 0279: A7 PLO 7 R7=0401, base of preselect memory 027A: F8 F0 LDI F0 027C: AB PLO B RB.0=F0, bit mask for LEDs, F will be shifted down in process 027D: F8 04 LDI 04 027F: A5 PLO 5 R5.0=4, loop count 0280: E8 SEX 8 ref current channel 0281: 47 _psLoop LDA 7 compare preselect to current channel 0282: F3 XOR 0283: 32 89 BZ _psMatch 0285: 8B GLO B 0286: FA EF ANI EF no match, remove bit 0288: 38 SKP 0289: 8B _psMatch GLO B 028A: F6 SHR shift mask bits down 028B: AB PLO B 028C: 25 DEC 5 decrement loop counter 028D: 85 GLO 5 028E: 3A 81 BNZ _psLoop loop if > 0 0290: E2 SEX 2 R2 refs temporary RAM 0291: 8B GLO B B has LEDs to turn on in low 4 bits 0292: 52 STR 2 0293: 64 OUT4 set ABCD touch LEDS 0294: 22 DEC 2 restore R2 ******************************************** 0295: 88 GLO 8 clear the A/STORE flag on the way through 0296: 5A STR A * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Input Acknowledge * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 0297: 35 A0 InputAck B2 _ackIn if activity was rotator just go ack it 0299: F8 B0 LDI B0 Gosub TouchAck for touch buttons 029B: A4 PLO 4 029C: F8 02 LDI 02 029E: B4 PHI 4 029F: D4 SEP 4 02A0: 7B _ackIn SEQ pulse Q to clear input flags 02A1: 7A REQ 02A2: 30 C2 BR CallDisp continue on to do the call-sign display and idle ******************************************************************************************** * unused ******************************************************************************************** 02A4: 00 IDL 02A5: 00 IDL ******************************************************************************************** * IDLE * * Setup R1 as the interrupt vector and then idle. * The system does not continue beyond the idle as the interrupt routine redirects the PC. ******************************************************************************************** 02A6: F8 47 Idle LDI 47 set interrupt P = 0047 02A8: A1 PLO 1 02A9: F8 00 LDI 00 02AB: B1 PHI 1 02AC: E3 SEX 3 set X for RET 02AD: 70 RET return will continue at IDL 02AE: 23 X=2,P=3 for RET 02AF: 00 IDL and idle ******************************************************************************************** * TOUCH BUTTON ACKNOWLEDGE SUBROUTINE * * Clear the input flags and wait for a clear state on the touch buttons. * ******************************************************************************************** 02B0: E2 TouchAck SEX 2 dst for Input 02B1: F8 19 _loopOuter LDI 19 delay for awhile 02B3: B5 PHI 5 02B4: 25 _loop1900 DEC 5 02B5: 95 GHI 5 02B6: 3A B4 BNZ _loop1900 02B8: 7B SEQ pulse Q to ack touch buttons 02B9: 7A REQ 02BA: 25 _loop100 DEC 5 delay again but shorter 02BB: 85 GLO 5 02BC: 3A BA BNZ _loop100 02BE: 69 IN1 if touch buttons still set then delay again 02BF: 3A B1 BNZ _loopOuter 02C1: D3 SEP 3 return (PC->R3) ******************************************************************************************** * DISPLAY CALL-SIGN ******************************************************************************************** 02C2: 08 CallDisp LDN 8 02C3: AD PLO D RD.0 = current channel 02C4: F8 00 LDI 00 02C6: BD PHI D RD.1 = 0, no alt channel 02C7: F8 03 LDI 03 Gosub CallScan (0300) 02C9: B4 PHI 4 02CA: F8 00 LDI 00 02CC: A4 PLO 4 02CD: D4 SEP 4 gosub R4 02CE: 8F GLO F 02CF: 3A EA BNZ _alphaOff if not 0, no match in callScan 02D1: 19 INC 9 R9 refs 4-byte call-sign 02D2: F8 05 LDI 05 02D4: B0 PHI 0 02D5: 88 GLO 8 02D6: A0 PLO 0 R0 = 0500 (alpha display memory) 02D7: F8 04 LDI 04 02D9: A5 PLO 5 R5.0=4, loop counter 02DA: 09 _chrLoop LDN 9 get character 02DB: 50 STR 0 and store/display it 02DC: 89 GLO 9 02DD: FC 01 ADI 01 increment R9, (why not INC 9 ?) 02DF: A9 PLO 9 02E0: 10 INC 0 02E1: 25 DEC 5 decrement loop counter 02E2: 85 GLO 5 02E3: 3A DA BNZ _chrLoop loop until 0 02E5: E3 SEX 3 02E6: 61 OUT1 output 4 on LDMISC (alpha on) 02E7: 04 data for out 02E8: 30 A6 BR Idle 02EA: E3 _alphaOff SEX 3 02EB: 61 OUT1 output 0 on LDMISC (alpha off) 02EC: 00 data for out 02ED: 30 A6 BR Idle ******************************************************************************************** * unused ******************************************************************************************** 02EF: 00 IDL 02F0: 00 IDL 02F1: 00 IDL 02F2: 00 IDL 02F3: 00 IDL 02F4: 00 IDL 02F5: 00 IDL 02F6: 00 IDL 02F7: 00 IDL 02F8: 00 IDL 02F9: 00 IDL 02FA: 00 IDL 02FB: 00 IDL 02FC: 00 IDL 02FD: 00 IDL 02FE: 00 IDL 02FF: 00 IDL ******************************************************************************************** * CALL-SIGN SCAN SUBROUTINE * * arg: RD.0 = channel number to scan for * RD.1 = channel to scan for 2nd time around * R9.1 = 04 to ref RAM, R9.0 set in here * return: RF.0 = FF=not found, 0=found * R9 = pointer to entry ******************************************************************************************** 0300: E9 CallScan SEX 9 X/R9 will be pointer to call sign memory entries 0301: 88 GLO 8 0302: AF PLO F RF.0=0, return flag is found 0303: F8 02 LDI 02 0305: A5 PLO 5 R5.0=2, do 2 scans 0306: F8 10 _scanStart LDI 10 0308: A9 PLO 9 R9=0410 0309: 8D _scanLoop GLO D 030A: F3 XOR 030B: 32 1E BZ _fin zero is match, get out 030D: 89 GLO 9 030E: FC 05 ADI 05 increment mem pointer to next entry, 5 bytes per entry 0310: A9 PLO 9 0311: 3A 09 BNZ _scanLoop if not 0, loop to test next entry 0313: 25 DEC 5 end of mem, decrement scan count 0314: 85 GLO 5 0315: 32 1B BZ _finFail if 0, end of scans 0317: 9D GHI D scan again, looking for 2nd channel 0318: AD PLO D 0319: 30 06 BR _scanStart 031B: F8 FF _finFail LDI FF 031D: AF PLO F RF.0=FF, return flag is fail 031E: D3 _fin SEP 3 return ******************************************************************************************** * unused ******************************************************************************************** 031F: 00 IDL ******************************************************************************************** * Handle ALPHA Button ******************************************************************************************** 0320: 08 OnALPHA LDN 8 0321: AD PLO D RD.0=current channel 0322: F8 FF LDI FF 0324: BD PHI D RD.1=FF 0325: E3 SEX 3 0326: 64 OUT4 turn on ALPHA LED 0327: 20 data for out ******************* Find an available entry in call-sign memory 0328: F8 03 LDI 03 Gosub CallScan 032A: B4 PHI 4 032B: F8 00 LDI 00 032D: A4 PLO 4 032E: D4 SEP 4 032F: 8F GLO F test return flag 0330: 32 4A BZ _gotEntry entry available ******************* Memory is full, display 'FULL' 0332: 88 GLO 8 0333: AE PLO E 0334: F8 05 LDI 05 0336: BE PHI E RE=0500 0337: F8 06 LDI 06 'F' 0339: 5E STR E 033A: 1E INC E 033B: F8 15 LDI 15 'U' 033D: 5E STR E 033E: 1E INC E 033F: F8 0C LDI 0C 'L' 0341: 5E STR E 0342: 1E INC E 0343: 5E STR E 'L' twice 0344: E3 SEX 3 0345: 61 OUT1 output 4 on LDMISC (alpha on) 0346: 04 data for out 0347: C0 03 AF LBR _delayDisp delay then restore station display ******************* Do new call-sign entry 034A: F8 02 _gotEntry LDI 02 Gosub TouchAck 034C: B4 PHI 4 034D: F8 B0 LDI B0 034F: A4 PLO 4 0350: D4 SEP 4 ******************* Wait for first action 0351: E2 SEX 2 0352: 69 _waitActn IN1 get buttons state 0353: FA 20 ANI 20 if ALPHA pressed again 0355: CA 02 77 LBNZ DispStatn then get out 0358: F0 LDX 0359: FA 01 ANI 01 if A pressed then go clear entry 035B: 3A A9 BNZ _clrEntry 035D: 3D 52 BN2 _waitActn loop till rotator action ******************* Prep display with "..." 035F: F8 05 LDI 05 R0=0501 0361: B0 PHI 0 0362: F8 01 LDI 01 0364: A0 PLO 0 0365: F8 2E LDI 2E character '.' 0367: 50 STR 0 once 0368: 10 INC 0 0369: 50 STR 0 twice 036A: 10 INC 0 036B: 50 STR 0 thrice ******************* Prep entry and pointers 036C: 08 LDN 8 store current channel number 036D: 59 STR 9 in entry 036E: 19 INC 9 R9 ready to store characters in entry 036F: C4 NOP 0370: 88 GLO 8 0371: A0 PLO 0 R0=0500 0372: E3 SEX 3 0373: 61 OUT1 output 4 on LDMISC (alpha display on) 0374: 04 data for out 0375: F8 04 LDI 04 0377: A6 PLO 6 R6.0 is position counter, count down from 4 ******************* Character selection loop 0378: F8 01 _nextPosn LDI 01 037A: A1 PLO 1 R1.0 is character to display, start at 1 ("A") 037B: 59 _loopChar STR 9 save character in entry 037C: 50 STR 0 display the character 037D: 7B _inputAck SEQ pulse Q to ack input 037E: 7A REQ 037F: E2 _inputWait SEX 2 R2 points to temporary RAM for IN 0380: 69 IN1 0381: FA 10 ANI 10 check STORE button 0383: 3A 92 BNZ _saveChar if STORE button then go accept 0385: 02 LDN 2 0386: 3A 7D BNZ _inputAck 0388: 3D 7F BN2 _inputWait loop until action from rotator 038A: 34 8E B1 _down was rotator up or down 038C: 11 INC 1 ++character 038D: 38 SKP 038E: 21 _down DEC 1 --character 038F: 81 GLO 1 0390: 30 7B BR _loopChar ******************* Set the character and move to next position 0392: E3 _saveChar SEX 3 0393: 64 OUT4 turn on ALPHA and STORE LEDs 0394: 30 data for out 0395: 19 INC 9 ++entry pointer 0396: 10 INC 0 ++display pointer 0397: F8 02 LDI 02 Gosub TouchAck 0399: B4 PHI 4 039A: F8 B0 LDI B0 039C: A4 PLO 4 039D: D4 SEP 4 039E: E3 SEX 3 039F: 64 OUT4 turn on ALPHA LED 03A0: 20 data for out 03A1: 26 DEC 6 --position counter 03A2: 86 GLO 6 03A3: 3A 78 BNZ _nextPosn on to next position or finished 03A5: 29 DEC 9 (is this necessary?) 03A6: C0 02 77 _fin LBR DispStatn all done, get out ******************* Clear an entry 03A9: F8 FF _clrEntry LDI FF set entry channel number to FF 03AB: 59 STR 9 03AC: E3 SEX 3 03AD: 64 OUT4 turn on STORE & A LEDs 03AE: 21 data for out ******************* Delay for display to user, then get out 03AF: F8 19 _delayDisp LDI 19 delay 19xx 03B1: B6 PHI 6 03B2: 26 _dlyLoop DEC 6 03B3: 96 GHI 6 03B4: 3A B2 BNZ _dlyLoop 03B6: 30 A6 BR _fin ******************************************************************************************** * unused ******************************************************************************************** 03B8: 00 IDL 03B9: 00 IDL ******************************************************************************************** * END ********************************************************************************************