Latest at 10/1/2011 – MAW Please note that this was used for manual entry of HEX and therefore there may be some 0s and 1s shown as letter O and l respectively as this would not affect manual entry. The aim was to get correct HEX and tidying of menmonic code was only incidental to this. This is believed to be the original 1K version listed in the Microtan Manual TANBUG LISTING 0000 NULL: 00 ;reserved for bpt use 000l ICHAR: 00 ;ascii character 0002 OCHAR: 00 ;temp char store 0003 VDUIND: 00 ;display index 0004 INTFS1: 00 ;fast int link 0005 INTFS2: 00 0003 INTFS3: 00 0007 NMIJP: 00 ;nmi link 0008 NMIJP1: 00 0009 NMIJP2: 00 000A ICURS: 00 ;cursor index 000B ICURSH: 00 ;cursor index high 000C RUNIND: 00 ; zero if in user 000D SINGLE: 00 ; nonzero if using int3 000E PROCED: 00 ; proceed count 000F SIMCOM: 00 ;simple/complex kb 0010 INTSL1: 00 ;slow int link = RTI 0011 INTSL2: 00 0012 INTSL3: 00 0013 HXPKL: 00 ;hexpack low byte 0014 HXPKH: 00 0015 PCLBCK: 00 ;pseudo reg PCL 0016 PCHBCK: 00 ;PCH 0017 PSWBCK: 00 ;PSW 0018 SPBCK: 00 ;SP 0019 XBCK: 00 ;IX 001A YBCK: 00 ;IY 001B ABCK: 00 ;A 001C MODADL: 00 ;temp store 001D MODADH: 00 001E COPL: 00 ;copy store 001F COPH: 00 0020 BPTLO: 00 ;bpt status table 0021 00 0022 00 0023 BPTHL: 00 0024 00 0025 00 0026 00 0027 00 0028 00 0029 00 002A 00 002B 00 002C 00 002D 00 002E 00 002F 00 0030 BPTCOD: 00 bpt code store 0031 00 0032 00 0033 00 0034 00 0035 00 0036 00 0037 00 0038 00 0039 00 003A 00 003B 00 003C 00 003D 00 003E 00 003F 00 0100 STKBSE: 00 ;stack base address 0200 VDUSTT: 00 ;display scroll labels 0220 VDUFST: 00 0300 VDUMID: 00 0320 VDUTOP: 00 03E0 LINBOT: 00 BFF0 SGRAPH: 00 ;I/O ports KBINCL: 00 ;alt. to SGRAPH BFF1 SNMI: 00 BFF2 KBWRIT: 00 BFF3 KBREAD: 00 STEXT: 00 ;alt. to KBREAD F7F7 INPERR: 00 ;error exit link ;start of main program init. sequence ;program starts here on a reset FC00 A2FF START: LDX #FF ;set stack pointer FC02 9A TXS ;to top of the stack FC03 E8 INX ;enable interrupts in FC04 8617 STX PSWBCK ;user prog on a go ;clear breakpoint store as their values will be ;indeterminate on power up. FC06 20B7FF JSR BPTCLR ;clear breakpoints. FC09 8DF3BF STA STEXT ;set text mode. ;now use table to initiate parameters ;note order of table must correspond with the ;order of INTFS1 to ICURSH in ram definitions. FC0C A20E LDX #E ; set index. FC0E BDDFFF SETUP1: LDA SETUP, X ; get value. FC11 9504 STA INTFS1, X ; store in ram. FC13 CA DEX FC14 10F8 BPL SETUP1 ; do till all done ; ; determine keyboard type and set flag ; note IX=FF. ; FC16 E8 INX FC17 8EF2BF TSFIV: STX KBWRIT ;clear kb write latch. FCLA 8DF0BF STA KBINCL ;clear kbint. flag. FCLD CA DEX FCLE 8EF2BF STX KBWRIT ; write to kb lines. FC21 E8 INX ;reset IX. FC22 ADF3BF LDA KBREAD ;read it back. FC25 1002 BPL KPCPLX ;if plus not set-alpha. FC27 E60F INC SIMCOM ;if set then keypad. FC29 8DF0BF KPCPLX: STA KBINCL ;clear kbint. FC2C BDECFF TBMS: LDA HDR, X ; print TANBUG. FC2F F006 BEQ MONTOR FC31 2075FE JSR OPCHR ;o/p chars until a 0. FC34 E8 INX FC35 D0F5 BNE TBMS ; ; monitor at present part of main program. ; FC37 D8 MONTOR: CLD ;set binary mode. FC38 58 CLI FC39 20FAFD JSR POLLKB ; look at kb. FC3C A501 LDA ICHAR ;get char. FC3E C921 CMP #21 ;LT or EQ space-term. FC40 3006 BMI MONCH1 ;else o/p char. FC42 2075FE ISTERM: JSR OPCHR FC45 4C37FC JMP MONTOR FC48 204FFC MONCH1: JSR MONEN2 ;call string process. FC4B A90D RCl: LDA #D ;set up CR. FC4D DOF3 BNE ISTERM ;uncond. branch loop. FC4F A000 MONEN2: LDY #0 ; set IY to zero. FC51 B10A LDA (ICURS), Y ;pick up command. FC53 AA TAX ; store in X. FC54 C8 INY ; pee k at next char. FC55 B10A LDA (ICURS), Y ;get it in A. FC57 1036 BPL MULTI ;if -ve was cursor. FC59 A900 LDA #0 ;else set A to zero. FC5B E053 TRYS: CPX #53 ; was it S? FC5D D003 BNE TRYM ; yes-set GT 0 else skip. FC5F 860D STX SINGLE FC61 60 RTS FC62 E04E TRYN: CPX #4E ; was it N? FC64 D003 BNE TRYP ; no-try P. FC66 850D STA SINGLE ;else clr single mode. FC68 60 RTS FC69 E050 TRYP: CPX #50 ; P with no arg? FC6B D004 BNE TRYR ; no-try for R. FC6D 850E STA PROCED ;else clr P count. FC6F F056 BEQ PROC1 ;uncond. branch proc. FC71 E052 TRYR: CPX #52 ;command R? FC73 D009 BNE TRYB ;no-try for no bpts. ;note A=0 FC75 851D STA MODADH FC77 A915 LDA #15 ;else set pseudo reg. FC79 851C STA MODADL FC7B 4CE5FD JMP REOPEN ;jmp mod memory. FC7E E042 TRYB: CPX #42 ;remove bpts? FC80 D004 BNE ERRQ ;no-error. FC82 20B7FF JSR BPTCLR ;else clear. FC85 60 RTS ; ;with no TANEX FFF7 will respond to F7F7. ;with TANEX monitor can be expanded. ;FFF7 jumps back to here. FC86 4CF7F7 ERRQ: JMP INPERR FC89 A93F RETERR: LDA #3F ;load question mark. FC8B 2075FE JSR OPCHR ;print it. FC8E 60 PRERC: RTS ;if we get here command expects data too. FC8F 88 MULTI: DEY ;readjust IY. FC90 8A TXA ;save cmd on stack. FC91 48 PHA FC92 2028FF JSR HEXPCK ; pack its arg. FC95 D054 BNE MOREY ; more data? FC97 68 PLA ;else is cmd G. FC98 50EC BVC ERRQ ;error if no arg. FC9A C947 CMP #47 ;is it a G? FC9C D021 BNE TRYPL ; no-skip. FC9E A200 LDX #0 FCA0 860E STX PROCED ;clr proceed count. FCA2 CA DEX ;set IX to FF. ;if G stack pointer initialised ;and pseudo registers loaded. FCA3 9A GOEND: TXS ;reload it. FCA4 A514 LDA HXPKH push PC high. FCA6 48 PHA FCA7 A513 LDA HXPKL push PC low. FCA9 48 PHA FCAA A517 LDA PSWBCK FCAC 48 PHA FCAD C60C DEC RUNIND ;clr run flag. FCAF A920 LDA #20 ;obliterate cursor. FCB1 A403 LDY VDUIND FCB3 910A STA (ICURS), Y FCB5 A619 LDX XBCK FCB7 A41A LDY YBCK FCB9 A51B SRET: LDA ABCK ; set users A. FCBB 8DF1BF STA SNMI ;set NMI for next. FCBE 40 RTI ; get to user prog. FCBF C950 TRYPL: CMP #50 ;is cmd P with arg? FCC1 DO11 BNE TRYM ; no-try M. FCC3 A513 LDA HXPKL ; else set P count. FCC5 850E STA PROCED FCC7 A516 PROCL: LDA PCHBCK ;restore users PC. PNOARG: FCC9 8514 STA HXPKH FCCB A515 LDA PCLBCK FCCD 8513 STA HXPKL FCCF A618 LDX SPBCK ;set IX to users SP. FCD1 4CA3FC JMP GOEND ;then back to user. FCD4 C94D TRYM: CMP #4D ; is it M address? FCD6 D0AE BNE ERRQ ; no-error popping S. FCD8 A92C EQPT: LDA #2C FCDA 2075FE JSR OPCHR FCDD A000 LDY #0 ; pick up value FCDF B113 LDA (HXPKL), Y FCE1 200BFF JSR HEXPNT ;and print it. FCE4 68 PLA ; pop stack return. FCE5 68 PLA FCE6 A92C LDA #2C ;load comma. FCE8 4C42FC JMP ISTERM ;back to monitor. FCEB E02C MOREY: CPX #2C ;was term a comma? FCED F004 BEQ GETPT2 ;yes-continue. FCEF 68 LINKPH: PLA ;else pull command FCFO 4C86FC LINKR: JMP ERRQ ;and give error. FCF3 A513 GETPT2: LDA HXPKL ;no-store previous FCF5 851C STA MODADL ;in MODADL&MODADH. FCF7 A514 LDA HXPKH FCF9 851D STA MODADH FCFB 2028FF JSR HEXPCK ; pack next value. FCFE D07C BNE MOREY1 ; not curs-more yet. FDOO 68 PLA ; else pull command. FDO1 50ED BVC LINKR ; no arg? - error. FDO3 C94C CMP #4C ;is it L? FDO5 F042 BEQ LISTIT ; yes-list it. FDO7 C94F CMP #4F ; is it offset O? FDO9 D027 BNE TRYBPT ; no-skip. FDOB A513 LDA HXPKL ;else get branch dest. FDOD 38 SEC FDOE E902 SBC #2 ;adj for branch code. FDl0 B002 BCS NOTOPO FD12 C614 DEC HXPKH FD14 38 NOTOPO: SEC FD15 E51C SBC MODADL ; subtract source. FD17 AA TAX ; hold result in IX. FD18 A514 LDA HXPKH ; subtract high byte. FD1A E51D SBC MODADH FD1C A8 TAY ; store in I Y. FD1D 8A TXA ; get low byte. FD1E 3005 BMI RNGNG ; if -ve branch. FD20 98 TYA ; if +ve look at high. FD21 D0CD BNE LINKR ;not O-error. FD23 F003 BEQ PNTITO if ok continue. FD25 C8 RNGNG: INY if -ve high is FF. FD26 D0C8 BNE LINKR FD28 A93D PNTITO: LDA #3D ;ok-print equals FD2A 2075FE JSR OPCHR FD2D 8A TXA FD2E 200BFF JSR HEXPNT ;and the value. FD31 60 RTS FD32 C942 TRYBPT: CMP #42 ;is it B? FD34 D0BA LINK1: BNE LINKR ;no-error. FD36 A513 LDA HXPKL ;max bpt code is 7. FD38 30B6 BMI LINKR FD3A C908 CMP #8 ; if greater-error. FD3C 10B2 BPL LINKR FD3E 0A ASL A ; double A. FD3F AA TAX ;set X for mode X. FD40 A51C LDA MODADL ;store bpt address. FD42 9520 STA BPTLO, X FD44 A51D LDA MODADH FD46 9521 STA BPTH, X FD48 60 JPRTRN: RTS FD49 2073FE LISTIT: JSR OUTPCR ;o/p carriage return. NXLI: FD4C A000 LDY #0 ;set IY to zero. FD4E A51D LDA MODADH ; print address. FD50 200BFF JSR HEXPNT FD53 A51C LDA MODADL FD55 200BFF NXLIST: JSR HEXPNT ;o/p low byte. FD58 A920 LDA #20 -load a space. FD5A 2075FE JSR OPCHR ;o/p 8 mem locations. FD5D B11C LDA (MODADL), Y ;get character. FD5F C8 INY FD60 C009 CPY #9 ; is IY GT 7? FD62 30F1 BMI NXLIST ; no-more yet. FD64 C613 DEC HXPKL ;dec line count. ; ;note that requesting 0 lines gives 256! ; FD66 F0E0 BEQ JPRTRN ;O? RTS via CR. FD68 88 DELXL: DEY FD69 D0FD BNE DELXL FD6B CA DEX FD6C D0FA BNE DELXL ; ;now adjust the address. ; FD6E A51C LDA MODADL ; get low bybe. FD70 18 CLC FD71 6908 ADC #8 ; add 8. FD73 851C STA MODADL ; store it. FD75 90D2 BCC NXLI ; more if C set. FD77 E61D INC MODADH ; inc high byte. FD79 4C49FD JMP NXLI ; ; if we get here there is a third parameter.' ; FD7C E02C MOREYL: CPX #2C ;term a comma? FD7E F003 BEQ TERMOK ;no-error.. FD80 4CEFFC ERJUM2: JMP LINKPH FD83 A513 TERMOK: LDA HXPKL ;else store parameter. FD85 851E STA COPL FD87 A514 LDA HXPKH FD89 851F STA COPH ;then pack new para. FD8B 2028FF JSR HEXPCK FD8E D0F0 BNE ERJUM2 ; error not term I d. FD90 68 PLA ;is command M? FD91 C94D CMP #4D FD93 F027 BEQ MEM100 ; yes-mod memory. FD95 C943 CMP #43 ; is it C? FD97 D09B BNE LINK1 ;no-error. ; ;if copy command, start address is held in MODADL. ;end address in COPL. ;destination address in HXPKL. ; FD99 5099 BVC LINK1 ;arg? error if not. FD9B A000 LDY #0 FD9D B11C NXCOP: LDA (MODADL), Y ;get instruction. FD9F 9113 STA (HXPKL), Y ; store it. FDA1 A51F LDA COPH ;is it done? FDA3 C51D CMP MODADH FDA5 D006 BNE ICMCOP FDA7 A51E LDA COPL FDA9 C51C CMP MODADL FDAB F05B BEQ ENDLS FDAD E61C ICMCOP: INC MODADL increment source. FDAF D002 BNE NOHIH1 FDB1 E61D INC MODADH FDB3 E613 NOHIH1: INC HXPKL ;increment dest. FDB5 DOE6 BNE NXCOP FDB7 E614 INC HXPKH FDB9 D0E2 BNE HXCOP ;destination can not roll over top of memory. FDBB 60 RTS ;return if end. FDBC A601 MEM100: LDX ICHAR ; get term char in IX. FDBE E020 CPX #20 ;was it a space? FDCO F023 BEQ REOPEN ; yes-reopen. FDC2 5006 BVC NOENT ; branch if nothing. FDC4 A513 LDA HXPKL ;else enter data. FDC6 A000 LDY #0 FDC8 911C STA (MODADL), Y FDCA E00A NOENT: CPX #A ;was LF typed? FDCC F011 BEQ WASLF ; yes-process it. FDCE E01B CPX #lB ; was it ESC? FDDO D036 BNE ENDLS ; no-return. FDD2 C61C ESCIT: DEC MODADL ; dec mem mod address FDD4 A51C LDA MODADL FDD6 C9FF CMP #FF FDD8 D00B BNE REOPEN FDDA C61D DEC MODADH FDDC 4CE5FD JMP REOPEN FDDF E61C WASLF: INC MODADL ; inc mem address. FDE1 D002 BNE REOPEN ;also high byte. FDE3 E61D INC MODADH FDE5 2073FE REOPEN: JSR OUTPCR ;o/p carriage return. FDE8 A94D LDA #4D FDEA 2075FE JSR OPCHR ;print M. FDED A51D LDA MODADH ; print address. FDEF 20OBFF JSR HEXPNT FDF2 A51C LDA MODADL FDF4 200BFF JSR HEXPNT FDF7 4C4FFC JMP MONEN2 go to cmd bit. ; ;POLLKB subroutine. ; note all addresses are page zero. ; FDFA A900 POLLKB: LDA #0 FDFC 48 PHA ; push 0-shift ind. FDFD 8501 PLKB1: STA ICHAR ; set ICHAR to zero. FDFF C50F CMP SIMCOM ;is it keypad? FE01 D006 BNE SIMPLE FE03 C501 WAIT1: CMP ICHAR ;else wait for int. FE05 F0FC BEQ WAIT1 FE07 68 PLKEND: PLA ; pop indicator. FE08 60 ENDLS: RTS ;simple keypad routine. FE09 A90F SIMPLE: LDA #F ;enable all kb lines. FEOB 8DF2BF STA KBWRIT FEOE ADF3BF LDA KBREAD ;look at kb lines. FE11 D0F6 BNE SIMPLE ;key down?-wait till up. FE13 A240 LDX #40 ;debounce it. FE15 88 DEBOUN: DEY FE16 D0FD BNE DEBOUN FE18 CA DEX FE19 D0FA BNE DEBOUN ;now poll the keypad properly. ;note IY is zero. FE1B A0FF PLK1: LDY #FF ;set up Y index. FE1D 68 PLA ; peep at shift ind. FE1E 48 PHA FE1F F002 BEQ NOSHIF ;if shift set mod IY. FE21 A013 LDY #13 FE23 A208 NOSHIF: LDX #8 ;set IX-kb drive. FE25 8EF2BF PLK2: STX KBWRIT ;drive kb lines. FE28 ADF3BF LDA KBREAD ;get result in A. FE2B D00C BNE ACHAR ;not 0-a char-skip. FE2D C8 INY ;else adjust IY. FE2E C8 INY FE2F C8 INY FE30 C8 INY FE31 C8 INY FE32 8A TXA ;shift IX right. FE33 4A LSR A FE34 AA TAX FE35 F0E4 BEQ PLK1 ;if zero repeat. FE37 D0EC BNE PLK2 ;else next line. ;if we get here a key has been pressed. FE39 C8 ACHAR: INY FE3A 4A LSR A ;which key of 5? FE3B 90FC BCC ACHAR ; C set'? thats key. FE3D B94BFE LDA CHRTBL, Y ; get ascii equiv. FE40 8501 STA ICHAR put it in IACHR. FE42 D0C3 BNE PLKEND ; if zero-shift. FE44 68 PLA ; pull shift. FE45 49FF EOR #FF ;change shift state. FE47 48 PHA ; push shift. FE48 4C09FE JMP SIMPLE ; continue. ;character look up table for ascii equivalent. FE4B 333742 CHRTBL: FE4E 463F32 FE51 364145 FE54 0D FE55 313539 FE58 440A FE5A 303438 FE5D 4300 FE5F 2C524C FE62 4E3F32 FE65 434953 FE68 20314F FE6B 1B477F FE6E 303450 FE71 4D00 ;output character routine. ;on entry character is stored in A. ;IX and IY are saved. FE73 A90D OUTPCR: LDA #D ;load CR. FE75 8502 OPCHR: STA OCHAR ;save the character. FE77 8A TXA ;save IX and IY. FE78 48 PHA FE79 98 TYA FE7A 48 PHA FE7B A403 LDY VDUIND ;get curs position. FE7D A920 LDA #20 ;obliterate cursor. FE7F 910A STA (ICURS), Y FE81 A602 LDX OCHAR ;get char in IX. FE83 E07F CPX #7F ;is it delete? FE85 D010 BNE TRYCR ;no-skip. FE87 88 DEY ;else dec vdu index. FE88 1002 BPL DODEL ;if neg set zero. FE8A A000 ZERCUR: LDY #0 FE8C A9FF DODEL: LDA #FF ; print cursor. FE8E 910A STA (ICURS), Y FE90 8403 STY VDUIND ;save index. FE92 68 PLA ;restore regs and rtn. FE93 A8 TAY FE94 68 PLA FE95 AA TAX FE96 60 RTS FE97 E00D TRYCR: CPX #D ; is it a CR? FE99 F008 BEQ DOCR ;yes-process it. FE9B 8A TXA ;else o/p character. FE9C 910A STA (ICURS), Y FEGE C8 INY ;inc vdu index. FE9F C020 CPY #20 ;end of line? FEA1 3OE9 BMI DODEL ;no-tidy up-exit. FEA3 A200 DOCR: LDX #0 ;else scroll. FEA5 BD2002 LOWBLK: LDA VDUFST, X ; do in two blocks. FEA8 9D0002 STA VDUSTT, X FEAB E8 INX FEAC D0F7 BNE LOWBLK FEAE BD2003 HIBLK: LDA VDUTOP, X FEB1 9D0003 STA VDUMID, X FEB4 E8 INX FEB5 E0E0 CPX #E0 ; see if done. FEB7 D0F5 BNE HIBLK FEB9 A920 LDA #20 ;fill line spaces. FEBB A8 TAY FEBC 88 MORSP: DEY ; set IX as count. FEBD 910A STA (ICURS), Y FEBF D0FB BNE MORSP ;do for whole line FEC1 F0C7 BEQ ZERCUR ;when done tidy up. ;keyboard interrupt subroutine. ;note this is entered via jump instruction ;stored in RAM location labelled INTFS1 ;so that user can access interrupts quickly. ;a reset will always initiahse INTFS1. FEC3 48 KBINT: PHA ;save accumulator. FEC4 D8 CLD ;set binary mode. FEC5 8A TXA ;save IX. FEC6 48 PHA FEC7 BA TSX ; get SP in IX. FECB E8 INX ; IX to add old PSW. FEC9 E8 INX FECA E8 INX FECB BD0001 LDA STKBSE, X ;get the PSW. FECE 2910 AND #10 ;was it a break? FEDO D01E BNE BRKP ;yes-process it. FED2 68 PLA ;else pull IX. FED3 AA TAX ;restore and continue. FED4 ADF3BF LDA KBREAD ;read keyboard. FED7 3004 BMI WASKB ;if -ve was kb. FED9 68 USER: PLA ;else restore A. FEDA 4C1000 JMP INTSL1 ;note that INTSL1 normally holds an RTI ;unless the user has modified it. FEDD 297F WASKB: AND #7F ; mask top bit. FEDF 8501 STA ICHAR ; put it in ICHAR. FEE1 8DF0BF STA KBINCL ; clr kb int flip-flop. FEE4 C91B CMP #lB ; was it ESC? FEE6 D0F1 BNE USER ; no-normal return. FEE8 A50C LDA RUNIND ;user prog running? FEEA D0ED BNE USER ; no-norma1. FEEC 850E STA PROCED ;else clr proc count. FEEE F012 BEQ ACTBP ;uncond br to break. ;break processing code-break was encountered. ;note the user should not set a break at own break ;or in this interrupt routine else crashes. ;now adjust PC to return to instr must subtract 3. FEFO E8 BRKP: INX ; address PCL. FEF1 38 SEC ;set C. FEF2 BD0001 LDA STKBSE, X ;get PCL. FEF5 E902 SBC #2 ;subtract 3. FEF7 9D0001 STA STKBSE, X ;put it back. FEFA B004 BCS NOROLL ;C set? NOHI byte. FEFC E8 INX ;else address PCH. FEFD DE0001 DEC STKBSE, X ;dec PCH. FF00 68 NOROLL: PLA ;pull IX. FF01 AA TAX ;restore it. FF02 68 ACTBP: PLA ;pull accumulator. FF03 851B STA ABCK ;back it up. FF05 20C1FF JSR BPTREM ;restore user code. FF08 4C75FF NOROL: JMP NMNT1 ;service break. ;HEXPNT takes a hex value stored in accumulator ;ie a two character number and displays it. ;registers are not saved. IX is corrupted. FF0B 48 HEXPNT: PHA ;save value of char. FF0C A201 LDX #1 ;load IX with 1. FF0E 4A LSR A ; get top part FF0F 4A LSR A ;by multiple shifts. FF10 4A LSR A FF11 4A LSR A FF12 18 PNT2: CLC FF13 6930 ADC #30 ;add hex 30. FF15 C93A CMP #3A more than 9? FF17 3003 BMI PNT1 no- print it. FF19 18 CLC FF1A 6907 ADC #7 FF1C 2075FE PNT1: JSR OPCHR ;print it. FF1F CA DEX FF20 1001 BPL MORL ;-ve?-end else low bit. FF22 60 RTS FF23 68 MORL: PLA ;recover low bits. FF24 290F AND #F ;clr unwanted bits. FF26 10EA BPL PNT2 ;uncond branch. ;HEXPCK uses values in TXTP to store hex values ;of characters indexed by IY from display RAM. ;on exit, caused by any non-hex character,these ;contain a two byte number. HEXENT contains ;the number of characters entered. ;registers are not saved. ;on exit IY points tc) the last character. ;the zero flag is clear if the terminating ;character was the cursor, else set. ;the overflow flag is set if this subroutine ;encountered some hex data. FF28 A900 HEXPCK: LDA #0 ;clr accumulator. FF2A 48 PHA ;push as PSW. FF2B 8513 STA HXPKL ;clr parameters. FF2D 8514 STA HXPKH FF2F C8 NXHX: INY FF30 B10A LDA (ICURS), Y ;get character. FF32 AA TAX ; store in I X FF33 38 SEC ;subtract hex 30. FF34 E930 SBC #30 ; tc) give 0 to 9. FF36 3010 BMI ENDTS FF38 C90A HX1: CMP #A ; is it 0 tc) 9? FF3A 3010 BMI HX2 ;yes-pack it. FF3C 38 SEC ;else sub hex 11. FF3D E911 SBC #11 FF3F 3007 BMI ENDTS ;goto carry setup. FF41 18 HX3: CLC ;else add 9. FF42 690A ADC #A FF44 C910 CMP #10 ;more than 15? exit. FF46 3004 BMI HX2 FF48 28 ENDTS: PLP ;deal with V flag. FF49 E0FF CPX #FF ;cursor. FF4B 60 RTS note character is in IX on exit ;return does not affect zero flag. FF4C A204 HX2: LDX #4 ; its hex save it. FF4E 0614 HX5: ASL HXPKH ; shift left 4 times. FF50 0613 ASL HXPKL ; add new one. FF52 9002 BCC HX4 FF54 E614 INC HXPKH ; replicate. FF56 CA HX4: DEX ; dec IX until zero. FF57 D0F5 BNE HXS FF59 18 CLC ; add in char. FF5A 6513 ADC HXPKL FF5C 8513 STA HXPKL ; store it. FF5E 68 PLA ; get pseudo PSW. FF5F A940 LDA #40 ; set V bit. FF61 48 PHA ; and push it. FF62 D0CB BNE NXHX ; do next. ;non-maskable interrupt routine for single instr. FF64 851B NMNT: STA ABCK ;save accumulator. FF66 D8 CLD ;set binary mode. FF67 A50D LDA SINGLE ;test single inst. FF69 D00A BNE NMNT1 FF6B 8A TXA ; if not save IX. FF6C 48 PHA FF6D 20D0FF JSR BPSET ;set breakpoints. FF70 68 PLA ;restore IX. FF71 AA TAX FF72 A51B LDA ABCK ;restore accumulator. FF74 40 RTI FF75 A50E NMNT1: LDA PROCED ;get proc count. FF77 F005 BEQ ZERBCK ;if zero break. FF79 C60E DEC PROCED ;else dec count. FF7B 4CB9FC JMP SRET ;rts via single test. FF7E E60C ZERBCK: INC RUNIND ;set not running. FF80 68 PLA ; pop bpt PSW to acc. FF81 8517 STA PSWBCK ;back it up. FF83 68 PLA FF84 8515 STA PCLBCK ; ditto PCL. FF86 68 PLA FF87 8516 STA PCHBCK ; ditto PCH. FF89 8619 STX XBCK FF8B 841A STY YBCK FF8D BA TSX ;operators SP. FF8E 8618 STX SPBCK FF90 2073FE PSEUD: JSR OUTPCR FF93 A516 LDA PCHBCK FF95 200BFF JSR HEXPNT FF98 A515 LDA PCLBCK FF9A 200BFF JSR HEXPNT FF9D A000 LDY #0 ;clear IY. FF9F A920 PSNX: LDA #20 ;print two spaces. FFAL 48 PHA FFA2 2075FE JSR OPCHR FFA5 68 PLA FFA6 2075FE JSR OPCHR FFA9 B91700 LDA PSWBCK, Y FFAC 200BFF JSR HEXPNT FFAF C8 INY ;do all registers. FFBO C005 CPY #5 FFB2 30EB BMI PSNX FFB4 4C4BFC JMP RC1 ;breakpoint clearing routine uses IX and A. FFB7 A21F BPTCLR: LDX #lF ; set count for 8 bpt3. FFB9 A900 LDA #0 FFBB 9520 BPTCL1: STA BPTLO, X ; clear a location. FFBD CA DEX ; dec count. FFBE 10FB BPL BPTCL1 ; do for all locations. FFCO 60 RTS ;this subroutine removes breakpoints by ;writing back the users original code. ;IX and IY are used. FFC1 8A BPTREM: TXA FFC2 48 PHA FFC3 A20E LDX #E ; set for 8 bpts. FFC5 B530 BPTRM1: LDA BPTCOD, X ;load old instruction. FFC7 8120 STA (BPTLO, X) ;write tc) prog mem. FFC9 CA DEX FFCA CA DEX ;decrement it. FFCB 10F8 BPL BPTRM1 ;do for all bpts. FFCD 68 PLA FFCE AA TAX FFCF 60 RTS ;subroutine BPSET looks at the entered breakpoint ;addresses, stores the present instruction ;and writes brk to program memory. FFDO A20E BPSET: LDX #E ; set for 8 bpts. FFD2 A120 BPS1: LDA (BPTLO, X) ;get users instr. FFD4 9530 STA BPTCOD, X ; store it. FFD6 A900 LDA #0 ;set brk.. FFD8 8120 STA (BPTLO, X) FFDA CA DEX FFDB CA DEX FFDC 10F4 BPL BPS1 ;do till done. FFDE 60 RTS ;setup table for initial values. ;order is same as RAM locations. FFDF 4CC3FE SETUP: ;starts at INTFS1, addr 0004 FFE2 4C64FF ;NMI JMP FFE5 E00301 FFE8 000000 FFEB 40 ;RTI for INTSL1 ;header message "TANBUG" FFEC 0D HDR: FFED 54414E ;TAN FFFO 425547 ;BUG FFF3 0D00 FFF7 4C89FC JMP RETERR FFFA 070000 FFFD FC0400