þþqdX;nX;--------------xX;PROGRAM TRACER‚X;--------------ŒX;–X;Get Key Routine X;ªX;This routine accepts a raw´X;key press and converts it¾X;to ATASCII using the tableÈX;supplied in the OS.ÒX;܆GETKEYQ‚CH;;get key pressæ R>ÿ;;$FF?ðF†GETKEY;;yes. loopú$>ÿ;;now clear key&‚CH;;pressP„OLDC;;save press‚K0?" )>À;;192?, D‚K1;;no.6%>š;;error 136@‚K1Qþþ8;;make asciiJP…OLDAC;;save itT R>€;;128?^F†GETKEY;;yes. try againh R>;;129?r H‚K2;;no.|Q„INVS;;yes.†N>€;;flip inverseP„INVS;;statusš!†GETKEY;;go again¤‚K2R>‚;;130?®H‚K3¸Q„CAPS;;yes. flip capsÂN>@;;statusÌ P„CAPSÖ!†GETKEY;;go againà‚K3R>ƒ;;131?êH‚K4;;shift caps.ôQ>@;;make capsþ P„CAPS H†GETKEY‚K4R>„;;132?H‚K5&Q>€;;control-caps0 P„CAPS: H†GETKEYD‚K5R>…;;skip this oneN F†GETKEYXQ„OLDC;;get pressb R>@;;64?lE‚K6;;yes. +>vQ…OLDAC;;get ascii€ R>a;;97?ŠD‚K6”R>{žE‚K6¨Q„CAPS;;lower case²F‚K6¼L„OLDC;;mask bitsÆ!‚K0;;and do againЂK6$>;;scan for aÚ‚K7Q„KEYS9;;specialäR…OLDAC;;key pressîF‚K8ø0I‚K7  ‚K8F‚K9Q…OLDAC;;get ascii N„INVS;;inverse bit*P…OLDAC;;save it4‚K9:;;and done>X;HX;Wait 15 jiffiesRX;\…WAIT5Q>;;get 0fP†RTCLOK;;zero clokp‚W1Q†RTCLOKzR>;;at 15?„ H‚W1;;no.Ž:;;so long!˜X;¢X;Perform manual RTS¬X;¶…DORTS$„USRS;;get pointerÀ2ÊQ…MYPG19;;RTS lo byteÔP„ADDR;;in trace adrÞ2èQ…MYPG19;;RTS hi byteòP„ADDR;;in trace adrü&„USRS;;update SP!„NSET;;add a 1 to adrX;X;Perform manual JSR$X;.…DOJSRQ„ADDR;;calc return8;;;address andBS>;;store it inL5;;the usersVQ„ADDR;;stack.`S>j$„USRS;;stk pntrtP…MYPG19;;install MSB~ 0;;down 1ˆ 7;;get LSB’P…MYPG19;;put it inœ0¦&„USRS;;new stk pntr°…DOJMP%>;;copy new traceºQ@„SAVD7;;address intoÄP„ADDR;;pointers.Î3;;HI byte.Ø Q@„SAVD7â P„ADDRì :;;bye.öX;X;Thread an ML program X;…TRACE „GADR;;get trace adrQƒFR0;;save it.( P„ADDR2 QƒFR0< P„ADDRF †CLRWINP%>;;slo or fast?ZƒFSLQ„SLOF8d P…COMND8n1xIƒFSL‚ '„SLFSŒX;–X;SLFS = $FF for Slow mode X; = $00 for Fast modeª$X; = $01 for Option step mode´X;¾ƒFSW †GETKEY;;get choiceÈR> F;;FAST?ÒH„SLO?;;no.Ü#„SLFS;;fast modeæF‚TNð„SLO?R> S;;SLOW?úF‚TN;;wrong!R> O;;O=option forHƒFSW;;step thruQ>" P„SLFS,‚TN †CLRSCR;;clear screen6 †CLRWIN;;clear input@ †CLRCMD;;and promptJ…TLOOPQ„ADDR;;take addr andTP…USRPC;;put in Program^P„SAVD;;Counter, andhQ„ADDR;;instructionrP…USRPC;;save address.| P„SAVD† ‡DISAMEM;;disa this adr †SCROLL;;move screenš%>;;install NOP's¤Q>ê;;(a NOP)®„DNOPP„NOPS8;;in area¸1ÂI„DNOP;;done?Ì …PAUSE;;wait?Ö †DOREGS;;up date USRPCàQ…MYBUF;;get disa chrêI„GINS;;inverse?ô …POS15;;on status lineþQ>4†BRKPNT;;BRK REACHED %>5†BRKPNT!†EPRINT;;print it.„GINSR>?;;a '?' ?&H„NOBR;;no.0%>—;;yes. a No-inst:!…IOERR;;give error.D„NOBRQ‚OP;;get the OpcodeNR>`;;is it RTS?XH…NORTS;;no.b …DORTS;;do the RTSl!„TDNE;;all done.v…NORTSR>@;;RTI?€H„IJMP;;no.Š$„USRS;;get USRP”#„USRS;;off stack.žQ…MYPG19;;proc status.¨P„USRP;;in REG²2¼ Q…MYPG19Æ P„ADDRÐ2Ú Q…MYPG19ä P„ADDRî &„USRSø!„TDNE;;all done.„IJMPR>L;;JMP? H„CPN2;;nope. …DOJMP;;do JMP !„TDNE;;done.*„CPN2R> ;;JSR?4H„CPN6;;nope.> …DOJSR;;make JSRH!„TDNE;;finished.R„CPN6R>l;;JMP ()?\H„CPN7;;no.f …DOJMP;;yes. get adrp%>;;look up JMPzQ@„ADDR7;;addr thru„5;;this adr.Ž 3;;up Y˜Q@„ADDR7;;get HI byte¢P„ADDR;;in addr¬7;;restore LSB¶P„ADDR;;in addrÀ!„TDNE;;done.Ê„CPN7Q†BRAFLG;;branch?ÔF„CPN4;;not this one.ÞQ‚OP;;get Op.è%>;;loop 4 timesò„FBRAR„BRAL8;;bit not set?üF‡HAVBRA2;;YES. R„BRAH8;;bit set? F†HAVBRA;;YES. 1;;no.$ I„FBRA;;try next one.. X;8 X;Branch if bit setB X;L †HAVBRAQ„USRP;;get processorV M„BBIT8;;mask bit.` F„NOTE;;off? yes.j †NEWADRQ„BRAN;;set up thet P„ADDR;;new branch~ Q„BRAN;;address forˆ P„ADDR;;next time.’ „NOTE!„TDNE;;jam!œ X;¦ X;Branch if bit not set° X;º ‡HAVBRA2Q„USRP;;processorÄ M„BBIT8;;mask it.Î F†NEWADR;;off? yes.Ø !„TDNE;;no.â „CPN4%>;;ready to copyì ƒCINQ@„SAVD7;;the inströ P„NOPS8;;into NOP area 3;;for fall thru. )…NBYTE;;done? HƒCIN;;not yet. X;( X;Run the instruction2 X;< Q>;;kill intsF P…NMIENP =;;set interruptZ $>;;copy user memd „CPZ1Q…ZPAGE9;;into pagesn ?;;0 - 2.x Q…MYZPG9;;PAGE 0‚ P…ZPAGE9Œ C– P…MYZPG9  X;ª Q…STACK9;;PAGE 1´ ?;;(the stack)¾ Q…MYPG19È P…STACK9Ò CÜ P…MYPG19æ X;ð Q…PAGE29;;PAGE 2ú ?;;(interrupts) Q…MYPG29;;(and stuff) P…PAGE29 C" P…MYPG29, X;6 2@ H„CPZ1J @;;get stackT A;;in A^ $„USRS;;user stackh B;;pointer.r P„USRS;;save my stack.| %„USRY;;get Y,† $„USRX;;get X, Q„USRP;;put on theš 5;;processor stat¤ Q„USRA;;get A® 8;;pull status¸ „NOPS4;;* here is * 4;;* where the *Ì 4;;* instr goes *Ö 6;;push statusà P„USRA;;save Aê 7;;save statusô P„USRPþ &„USRX;;save X '„USRY;;save Y @;;put back stack A;;pointers& $„USRS0 B: P„USRSD =;;set for safetyN $>;;now copy backX X; ;pages 0 - 2b ƒCZPQ…ZPAGE9;;zero pagel ?v Q…MYZPG9€ P…ZPAGE9Š C” P…MYZPG9ž X;¨ Q…STACK9;;the stack² ?¼ Q…MYPG19Æ P…STACK9Ð CÚ P…MYPG19ä X;î Q…PAGE29;;page 2ø ? Q…MYPG29 P…PAGE29 C P…MYPG29* X;4 2> HƒCZPH .;;clr interruptsR Q>@;;turn on the\ P…NMIEN;;interruptsf „TDNE †DOREGS;;show registersp Q„SLFS;;mode.z G„TDN1;;Slow.„ F„TDN2;;Fast!Ž $>;;consol clear˜ &†CONSOL;;clear it.¢ ƒCNWQ†CONSOL;;get it¬ R>;;OPTION?¶ HƒCNW;;no.À &†CONSOL;;yes. zero it.Ê H„TDN2Ô „TDN1 …WAIT5;;wait 1/4 secÞ „TDN2!…TLOOP;;next instrè X;ò X;Move screen up 32 bytesü X;†MOVE32Q>4†MYSCRN;;screenP„IND2;;address inQ>5†MYSCRN;;Zpage addr$P„IND2;;so we can.Q„IND2;;the screen up8,;;40 bytesBO> L P„INDRV Q„IND2`O>j P„INDRt$>;;line 0~„MOVE%>;;32 bytesˆ…MOVITQ@„INDR7’ P@„IND27œ1¦I…MOVIT;;loop.°Q„INDR;;copy toº P„IND2Ä Q„INDRÎP„IND2;;add a 32Ø ,;;to copyâO> ;;from.ì P„INDRö Q„INDRO>  P„INDR 2;;up line(>;;line 13?(H„MOVE;;no.2 :;;bye.<X;FX;Clear status linePX;Z‡ERASTAT%>;;24 charactersdQ>;;a zeron…ERAS1P†STATLN8;;in linex 1;;next‚I…ERAS1;;go to it.Œ :;;bye.–X;  X;Decimal/Hexadecimal ConvertªX;´„PRDHQ„HXDC;;# type¾P…SAVY2;;save itÈQ>;;full numberÒP…NBYTE;;lengthÜ „GADR;;get numberæQ> ;;make EOL a spcð P…MYBUF8úP…MYBUF8Q> =;;install =3 P…MYBUF8"3,'…SAVX2;;save Y6Q„HXDC;;# type@N>;;flip itJP„HXDC;;and save againT$>;;copy in #^ ‡COPYNUMh &„CENDr$>;;now move #|%…SAVX2;;down in string†„CPN9Q…MYBUF9P…MYBUF8š(„CEND;;at end?¤F„AEND;;yes!®2¸3ÂH„CPN9;;go again.Ì„AENDQ>ƒEOL;;install EOLÖP…MYBUF8à …POS15;;on status lineêQ…SAVY2;;restore # typeô P„HXDCþ!„IOL3;;print it.X;X;Erase memoryX;&…ERASE „GADR;;start addr0QƒFR0;;transfer to:P‚SL;;2 Zpage locsD QƒFR0N P‚SLX „GADR;;End addrb%>lQƒFR0;;is End :;;bye.H†NEWERR%>™;;ADR RANGER!…IOERR;;show it.