þþÂNdX;nX;------------xX;DISASSEMBLER‚X;------------Œ„DISA-;;no decimal.–Q†DOSINI;;save DOS INIT P†MYINITªQ†DOSINI´P†MYINIT¾Q†VKEYBD;;copy keybrd adrÈP„TKEY;;to holdÒQ†VKEYBDÜ P„TKEYæQ„VBRK;;copy VBRK vecðP„BRKS;;to hold areaú Q„VBRK P„BRKSQ†KEYDEF;;test 800 or XL?L†KEYDEF"F†REINIT;;have 800,Q†KEYDEF;;copy keycode to6P‚K1;;ascii table adr@Q†KEYDEF;;to my programJ P‚K1TX;^ †REINIT-h$>;;get 0r&„EXEC;;no run.| &†COLDST†&„NCHK;;check keys&…NMIEN;;no interupts.š&…DTYPE;;display type¤2® &„IPUT¸ &„BBCKÂ@;;get stk pntrÌ&„USRS;;save.ÖQ>à;;restore charàP…CHBAS;;setêQ> ;;set RAMTOP onôP†RAMTOP;;my programþ=Q>4…BRKER;;point BRK handP„VBRK;;to my routine. Q>5…BRKER& P„VBRK0Q>4…MKEYV;;replace keybrd:P†VKEYBD;;interrupt withDQ>5…MKEYV;;mineNP†VKEYBDXQ>4†MYINIT;;point RESETbP†DOSINI;;vec to my prog.l Q>5†MYINITvP†DOSINI€.Š$>”„C123Q…ZPAGE9;;now copy thežP…MYZPG9;;first 3 pages¨Q…STACK9;;of RAM to my²P…MYPG19;;buffers.¼Q…PAGE29;;(For TRACER)Æ P…MYPG29Ð2Ú H„C123ä …OPSCR;;open screenîQ…USRPC;;now disa fromøPƒFR0;;the users PC Q…USRPC  PƒFR0 †TOEDEV Q>@;;interupts on.* P…NMIEN4 †FREBRK;;sho BRK points> †DOREGS;;and registers.HX;RX;Wait here for command\X;f†GETCOM †CLRWIN;;clear comp †CLRCMD;;and promptz †CLRKEY„ †SETKEY;;set keysŽ †GETKEY;;get a key˜M>;;no inverse¢$>;;scan 18 coms¬ƒGC2R†CMDTXT9;;is it a com?¶F†HAVCOM;;yes.À 0;;no.ÊIƒGC2;;18 coms yet?Ô †GOTERR;;sorry error.Þ!†GETCOM;;go again.è †HAVCOMAòT?;;mult * 2ü>Q†CMDADR9;;get commandP†CMDJSR;;address fromQ†CMDADR9;;the table$P†CMDJSR;;put in JSR. †CLRERR;;erase error.8 ‡ERASTAT;;and status.B †SETKEYL†CMDJSR ÿÿ;;go command!V!†GETCOM;;get next one.`X;jX;This is the go DOS commandtX;~†DOSCMDQ>;;kill VBLANKˆ %>4†XITVBV’ $>5†XITVBVœ †SETVBV¦Q„BRKS;;restore the°P„VBRK;;BRK vector.º Q„BRKSÄ P„VBRKÎQ†MYINIT;;restore RESETØP†DOSINI;;vectorâQ†MYINITìP†DOSINIö=Q„TKEY;;restore key- P†VKEYBD;;board interrupt Q„TKEYP†VKEYBD(.27;;pull off RTS<7F!@†DOSVEC:;;go DOSPX;ZX;Re-init prog after RESETdX;n†MYINIT ÿÿ;;changedx !†REINIT‚X;ŒX;Open new screen–X; …OPSCRQ>;;blackªP†COLPF2;;background´Q> ;;white text¾ P†COLPF1ÈQ>’;;blue bordersÒP†COLPF2Ü †CLRSCR;;clear screenæQ>4…DLIST;;install myðP†SDLSTL;;Display Listú Q>5…DLISTP†SDLSTLQ>!;;screen on P†SDMCTL"Q>;;def. mode,%>4ƒVBI;;point to my VBI6 $>5ƒVBI@!†SETVBV;;set it!JX;T"X;This routine closes IOCB two.^X;(Device IOCB.)hX;r†DCLOSE$>„DDEV;;Device|Q> ;;close command†P…ICCOM9;;store it!„CIOV;;close it.šX;¤ X;Zero FR0®X;¸ƒZFRQ>;;zero floatingÂPƒFR0;;point regs.Ì PƒFR0Ö:àX;êX;General use print routineôX;þ †EPRINTP„IND2;;address of mem'„IND2;;to 'print'. …CLCLN;;get line adr%>;;zero loop.&ƒPRLQ@„IND27;;get char0R>ƒEOL;;is EOL?:FƒPRD;;yes. finished.D †ASC2IC;;no. make icodeNP@ƒSCR7;;on screenX3;;up loop.bHƒPRL;;go again.lƒPRD#†ROWCRS;;up y-pos.v :;;bye.€X;ŠX;Error routine”X;ž†GOTERRQ>d;;nice tone.¨ P…AUDF1²Q>ª;;no distortion¼ P…AUDC1ÆQ>;;leave it onÐP†RTCLOK;;for 5 jiffies.Ú„TONEQ†RTCLOKäR>î H„TONEø$>;;turn it off. &…AUDC1  &…AUDF1 :;;bye. X;*X;Fetch address4X;>„GADR †CLRCMD;;clear promptH †CLRWIN;;and windowRQ> ;;a '*'\ P…COMNDf …INPUT;;get INPUTpD„GDNM;;good inputz7;;pull off RTS„7Ž:;;next command˜ „GDNM%>¢ „GTDR$>¬&„HXDC;;signal hex #¶Q…MYBUF8;;first char.ÀR> .;;a '.'?ÊH„GET4;;no. in hexÔ#„HXDC;;signal dec #Þ3èH„GNUM;;get decimalòX;ü"X;Pull out a 4 byte hex address X; „GET4 ƒZFR;;zero fp regs P…GDIGS$ †G4LOOPQ…MYBUF8;;pull char. R>ƒEOL;;at end?8 H†TESTIT;;no.B :;;bye.L †TESTIT$>;;do 16 digits.V †G4SCANR†HEXDIG9;;is it in` F†GOTG4D;;the Hex table?j 0;;no. try next.t I†G4SCAN;;go again.~ …G4ERR7;;Not in table,ˆ 7;;we have an’ !†GOTERR;;error. Sorry.œ †GOTG4DTƒFR0;;multiply #¦ UƒFR0;;by a factor° TƒFR0;;of 16.º UƒFR0Ä TƒFR0Î UƒFR0Ø TƒFR0â UƒFR0ì A;;add digitö LƒFR0;;to the PƒFR0;;current addr #…GDIGS;;up digs done Q…GDIGS;;get it. R>;;more than 4( E…G4ERR;;yes. error.2 3;;do next one< !†G4LOOP;;do again.F X;P X;Get out a decimal numberZ X;d „GNUM ƒZFR;;zero fp regsn P…GDIGSx …DONUMQ…MYBUF8;;pull char‚ R>ƒEOL;;EOL?Œ H…GTEST;;no.– Q>;;index to str  PƒCIX;;is zeroª '…SAVEY´ Q>4…LBUFF;;point INBUFF¾ P†INBUFF;;to LBUFFÈ Q>5…LBUFFÒ P†INBUFFÜ $…GDIGS;;install EOLæ Q>ƒEOL;;for safetyð P…LBUFF9ú  ƒAFP;;to fp E…GNERR;;error?  ƒFPI;;to integer E…GNERR;;error?" %…SAVEY;;restore Y, :;;bye.6 …GTEST$> ;;scan 10 digs.@ †GNSCANR†HEXDIG9;;in tableJ F…GOTGN;;have digitT 0;;try next^ I†GNSCANh …GNERR7;;errorr 7;;bad digit| !†GOTERR† …GOTGN3;;up char index $…GDIGS;;save char inš P…LBUFF9;;LBUFF.¤ #…GDIGS;;next digit® !…DONUM;;go again¸ X; X;Show memory contentsÌ X;Ö †SHOMEM$>;;pos. 2,0à &„HXDCê 2ô &…NBYTEþ  „ZBUF;;blank buffer Q„ADDR;;in fp for PƒFR0;;hex convert Q„ADDR& PƒFR00 $>;;at pos 0:  ‡COPYNUM;;copy numberD Q>ƒEOL;;insert EOLN P…MYBUFX %>;;Y = 0b …COPY2'…SAVEY;;save yl  ƒZFR;;Zero FR0v ?;;Y = 0€ Q@„ADDR7;;numberŠ P‚OP;;make digit”  †FNDBRK;;BRK point?ž Q‚OP;;put op in FR0¨ PƒFR0² %…SAVEY;;restore index¼ R>ƒEOL;;have EOL?Æ FƒGOL;;yes. leave it.Ð P…MYBUF8;;save charÚ ƒGOL ‡BIN2HEX;;make it hexä Q„BSET;;is this BRK?î FƒNN1;;point? no.ø %>;;yes. make # ƒNN0Q…LBUFF8;;inverse L>€;;video. P…LBUFF8 1* IƒNN04 ƒNN1%…SAVEY;;insert in buf.> $†STRPOS8;;get positionH Q…LBUFF;;first digitR P…MYBUF9;;in buffer\ Q…LBUFF;;second digitf P…MYBUF9;;in buff.p  „NSET;;add 1 to addrz 3;;up count„ )>;;done 6?Ž H…COPY2;;no.˜ :;;bye.¢ X;¬ X;Handle Change memory¶ X;À †CHGMEM „GADRÊ „CREGQƒFR0;;copy fp toÔ P„SMEM;;zpage forÞ QƒFR0;;lookupè P„SMEMò  „GADR;;get numberü QƒFR0;;take LSB%>P@„SMEM7;;poke it in:$X;.X;Go memory routine8X;B„GMEM „GADR;;run addressL7V7`QƒFR0;;copy RUN addrjP…USRPC;;for latert QƒFR0~ P…USRPCˆ=;;kill interrupts’$>œ„C321Q…MYZPG9;;copy USER RAM¦P…ZPAGE9;;back for the°Q…MYPG19;;run.º P…STACK9Ä Q…MYPG29Î P…PAGE29Ø2â H„C321ì.ö$„USRS;;restore userB;;registers  Q„USRP5$„USRX;;restore X(%„USRY;;and Y2Q„USRA;;and Acc<#„EXEC;;set RUN flagF8;;restore statusP!@…USRPC:;;RUN!ZX;dX;Disassemble MemorynX;x†DISMEM „GADR;;get adr‚†TOEDEVQƒFR0;;move in addrŒ P„ADDR–P†TOPADR;;top line QƒFR0;;hi byteª P„ADDR´P†TOPADR¾Q>;;pos.0È P†ROWCRSÒ„DMEM †FINLIN;;disa itÜ …CLCLN;;screen lineæ%>ðƒDM3Q…MYBUF8úR>ƒEOL;;make EOL space H„CON2Q> „CON2 †ASC2IC;;make icode"P@ƒSCR7;;on screen,16IƒDM3;;do next@#†ROWCRS;;up ypos.JQ†ROWCRS;;get itTR>;;second line?^H…SECLN;;no.hQ„ADDR;;set LN2 pntrrPƒLN2| Q„ADDR† PƒLN2…SECLNQ†ROWCRS;;done 14 yet?šR>¤H„DMEM;;no.® :;;yes.¸X;ÂX;Memory disassemblerÌX;Ö‡DISAMEM%>;;zero Yà'†BRAFLG;;no branchê'„HXDC;;in hexôQ@„ADDR7;;get opcodeþP‚OP;;and save †FNDBRK;;BRK point?Q‚OP;;get op%>;;zero Y&…FNDOPR†OPCODE8;;is op in0F…HAVOP;;the opcode: 3;;table?D)>—;;151 yet?NH…FNDOP;;no.X…HAVOP'…SAVY2;;save Yb „ZBUF;;clear bufferlQ„ADDR;;copy addrvPƒFR0;;to FP€ Q„ADDRŠ PƒFR0”$>;;pos. 0ž ‡COPYNUM;;copy it¨ ƒZFR;;clear FP²Q‚OP;;get op¼PƒFR0;;in FPÆ$>;;pos 8Ð ‡COPYNUM;;copy itÚ%…SAVY2;;get Yä$†OFFSET8;;MNE offsetî%>;;copy out theø…ADMNEQƒMNE9;;Mnemonic andP…MYBUF8;;put in  2;;buffer.3 )>;;3 chars?*H…ADMNE;;no.4%>;;Y = 1>'…NBYTE;;1 byte instrHQ@„ADDR7;;copy next 2RP„INDR;;possible\3;;instructionfQ@„ADDR7;;bytes to temppP„INDR;;hold address.z%…SAVY2;;restore Y„Q…ITYPE8;;get ItypeŽT?;;times 2˜ ?;;in Y¢Q…DCOMT8;;look up the¬P„DJSR;;routine addr¶Q…DCOMT8;;an put inÀP„DJSR;;JSRÊ„DJSR ÿÿ;;go command!Ô%>';;now insert theÞ…AEOL3Q…MYBUF8;;the EOLèR> ;;characterò H…AEOL2ü1 I…AEOL3…AEOL2Q>ƒEOLP…MYBUF8$Q„BSET;;brk point?.F„NSET;;no.8 „INV2;;inverse itB„NSETQ„ADDR;;now add theL,;;number ofVO…NBYTE;;byte to the`P„ADDR;;adr pointerjQ„ADDR;;to get nexttO>;;instr addr.~ P„ADDRˆ :;;bye.’X;œX;Inverse Mnemonics¦X;°„INV2%>;;start w/ 18thº„INVLQ…MYBUF8;;get charÄN>€;;flip bit 7ÎP…MYBUF8;;store in buffØ3;;up indexâ)>;;21st yet?ìH„INVL;;not doneö :;;done.X; X;Immediate ModeX;…IMMED †LOBYTE;;insert LSB(Q> #;;a '#'2P…MYBUF;;in buffer<…NUMBRQ>;;zero MSBF P„INDRP†NUMBR2Q„INDR;;put in FR0ZPƒFR0d Q„INDRn PƒFR0x†NUMBR3$>;;put in arg‚ !‡COPYNUMŒX;–X;Zero page X;ª„ZPAG †LOBYTE;;do LSB´!…NUMBR;;add arg¾X;ÈX;Zero page,XÒX;Ü…ZPAGX †LOBYTE;;LSBæ …NUMBR;;add argð…ADDX2%>;;just ,Xú„ADDX2;;up X…ADDX3Q†COMMAX8;;copy theP…MYBUF9;;,X into0;;the buffer"1, I…ADDX36 :;;done.@X;J X;AbsoluteTX;^…ABSOL †LOBYTE;;LSBh †HIBYTE;;MSBr!†NUMBR2;;add arg|X;†X;Absolute ,XX;š†ABSOLX …ABSOL;;set up absol¤!…ADDX2;;copy in ,X®X;¸X;Absolute ,YÂX;̆ABSOLY …ABSOL;;do absolÖƒACYQ>,;;a commaàP…MYBUF9;;in bufê Q>Y;;a YôP…MYBUF9;;in bufþ :;;doneX;X;Indirect XX;&„INDXQ>;;no MSB0 P„INDR: †LOBYTE;;do LSBD …OPENP;;add open '('N 2;;up XX%>;;3 bytesbH„ADDX;;copy ',X)'lX;vX;Indirect Y€X;Š„INDYQ>;;no MSB” P„INDRž †LOBYTE;;do LSB¨ …OPENP;;left (²%>;;copy in the¼„ADDYQ†COMMAY8;;'),Y'ÆP…MYBUF9Ð2Ú1ä I„ADDYî :;;doneøX;X;Accumulator Mode X;…ACCUMQ>A;;an 'A' P…MYBUF;;in buffer* :;;done4X;>X;Branch instructionsHX;R„RELA †LOBYTE;;put LSB\#…NBYTE;;make 3 bytef ƒZFR;;zero FR0p#†BRAFLG;;have branch.zQ>;;add arrow„P…MYBUF;;in buffer.ŽQ„INDR;;get operand˜I†NOBACK;;not inverse¢"…MYBUF;;make up arrow¬M>;;mask inverse¶N>;;flip itÀ ,;;add a 1ÊO>ÔP„DINS;;save itÞ;;;and subtractè S>;;two.ò!„TOFP;;doneü†NOBACKP„DINS„TOFPQ„INDR;;operandI‡FORWARD;;bran forwardQ„ADDR;;now subtract$;;;from addr.S„DINS;;to find out8PƒFR0;;where thisBQ„ADDR;;branch goes.LS>V PƒFR0`!„BACK;;done.j‡FORWARD,;;add # totO„ADDR;;addr to calc~PƒFR0;;forward branchˆ Q„ADDR’O>œ PƒFR0¦„BACKQ>;;now add a 2°,;;to skip theºOƒFR0;;instructionÄPƒFR0;;addressÎP„BRAN;;and saveØQƒFR0;;the branchâO>;;addr for theìPƒFR0;;tracer.ö P„BRAN †NUMBR3;;add number "…NBYTE;;make 2 bytesX;X;Implied Mode(X;2ƒIMP:;;do nothing<X;FX;Indirect instructionsPX;Z„INDI †LOBYTE;;copy in LSBd †HIBYTE;;and MSBn …OPENP;;do open (xQ> );;and add‚P…MYBUF9;;closing oneŒ :;;leave.–X; X;Zero page ,YªX;´…ZPAGY †LOBYTE;;do LSB¾ …NUMBR;;add argÈ!ƒACY;;copy ,YÒX;ÜX;Insert LSBæX;ð†LOBYTE#…NBYTE;;up bytesú ƒZFR;;zero FR0Q„INDR;;do lobytePƒFR0$> ;;at pos. 10"!‡COPYNUM;;do it!,X;6X;Insert MSB@X;J†HIBYTE#…NBYTE;;3 byterT ƒZFR;;no FR0^Q„INDR;;hibytehPƒFR0;;in FPr$>;;at pos. 14|!‡COPYNUM;;copy it.†X;X;Add Open (šX;¤…OPENPQ> (;;open (®P…MYBUF;;in buffer¸!†NUMBR2;;add numberÂX;ÌX;Handle I/O errorÖX;à…IOERR ƒZFR;;save errnumê'ƒFR0ô '†ERRNUMþ †GOTERR;;beep! „ZBUF;;no buffer ƒIFP;;Int to FP „FASC;;con to asc&%>ÿ0$>ÿ;;copy to buf: „IOLP3D2N Q@†INBUFF7X P…MYBUF9b I„IOLPlM>vP…MYBUF9;;in err buf€ Q>ƒEOLŠP…MYBUF9” &„CENDž$>;;search the¨†ERRLP1Q„ERRS9;;errors²R†ERRNUM;;we have in¼F…GERR1;;englishÆ0Ð I†ERRLP1Ú G„IOL5ä…GERR1A;;we have one.î T?;;* 2ø>;;get addressQ†ERRTAB9  P„INDR Q†ERRTAB9  P„INDR*%>ÿ;;and copy it4$„CEND;;to mybuf.>Q> ,HP…MYBUF9R2\ „IOL43f2p Q@„INDR7zP…MYBUF9„ I„IOL4ŽM>˜P…MYBUF9¢Q>ƒEOL;;add EOL.¬P…MYBUF9¶„IOL5Q>;;on error lineÀ P†ROWCRSÊ †CLRERR;;clear itÔ„IOL3Q>4…MYBUF;;and printÞ %>5…MYBUFè !†EPRINTòX;üX;Copy number to stringX; ‡COPYNUM0&…CNTLO;;save X$Q„HXDC;;hex/dec?.F…INHEX;;have Hex.8 ƒIFP;;to FPB „FASC;;to ASCL$…CNTLO;;get indexV%>ÿ;;and copy`†CNLOOP3;;the numberj2t Q@†INBUFF7~ P…MYBUF9ˆ I†CNLOOP’M>;;mask bit 7œ P…MYBUF9¦ :;;leave°…INHEX ‡BIN2HEX;;make hexº$…CNTLO;;get posÄ 2;;up it.ÎFƒALL;;if 0 do allØ(>;;is X > 20?âEƒARG;;yes.ì!„SOMEQ…LBUFF;;no. just copyöP…MYBUF9;;the LSB part2;;of the Hex Q…LBUFF;;number. P…MYBUF9 :;;bye.(ƒARGQ> $;;install a '$'2 P…MYBUF9< 2;;up XFQ…NBYTE;;Get # of bytesPR>;;is it 2?ZF„SOME;;no.dƒALL%>;;no. copy itn…ALOOPQ…LBUFF8;;all to bufx P…MYBUF9‚2Œ3–)>;;done yet? H…ALOOP;;nope.ª 0;;dec X´:;;so long.¾X;ÈX;Binary to hexadecimalÒX;܇BIN2HEX%>;;buf indx=0æ$>;;do 2 numsð†NXTBYT&…SAVEX;;save itúQ>ð;;get HI bits MƒFR09V?;;divide by 16V?"V?,V?6>;;to index@Q†HEXDIG9;;get charJP…LBUFF8;;and saveT3;;up buf index^$…SAVEX;;get X backhQ>;;now LO bitsr MƒFR09|>†Q†HEXDIG9;;get char andP…LBUFF8;;put in bufferš3;;up buf indx¤$…SAVEX;;get X®0;;down by one¸I†NXTBYT;;done?Â:;;yes. bye.ÌX;ÖX;Fill buffer with blanksàX;ê„ZBUFQ> ;;spaceô$>';;do 128 spacesþ…ZLOOPP…MYBUF9;;in buf 0;;down count I…ZLOOP;;go again :;;bye.& X;0 "X;Handle a 6502 BRK instruction: X;D …BRKERQ„EXEC;;running?N H†SAVREG;;yes.X 7;;no. just exit.b 9l †SAVREG-;;chill decv &„USRX;;save registers€ '„USRYŠ 7” P„USRAž 7¨ P„USRP;;calc BRK point² 7¼ ;Æ S>Ð P…USRPC;;put in programÚ 7;;counter.ä S>î P…USRPCø @;;store stck pntr!&„USRS;;for user !.!!†SHOBRK;;bye. !X;*!X;Vertical Blank Interrupt4!X;>!X;Update my RTCLOK registersH!X;in my zero page buffer soR!X;we can use real-time delay\!X;loops in the tracer.f!X;p!ƒVBI#…MYZPG;;jiffiesz! H„VBDN„!#…MYZPG;;'seconds'Ž! H„VBDN˜!#…MYZPG;;'minutes'¢!X;¬!!X;Now we check to see if there¶! X;is an input being taken andÀ!X;if so blink the cursorÊ!X;Ô!„VBDNQ„IPUT;;inputting?Þ!H„VBOT;;no.è!Q†SRTIMR;;key pressed?ò!F†BLINK?;;no.ü!Q>?;;yes. leave"P†CSHAPE;;cursor on for"Q><;;1 second." P…BLINK$"†BLINK?Q†CSHAPE;;shape.""…BLINK;;down blink8"H…VEXIT;;not 0 leaveB"%>;;1/2 secondL"'…BLINK;;delayV"N>?;;flip shape`"P†CSHAPE;;and savej"…VEXIT%„CEND;;get positt"P…COMLN8;;save cursor~"„VBOT!†XITVBV;;all doneˆ"X;’"X;Show BRK informationœ"X;¦"†SHOBRK6;;get status°">º"7Ä"M>ï;;alter itÎ"5Ø"8;;put it back.â"Q>;;stop EXECì" P„EXECö"!†REINIT;;reinit DEBUG+#X; #X;Keyboard Handler#X;#…MKEYVQ„EXEC;;running?(# F†MYKEYV2# Q†KBCODE<#R>œ;;control ESC?F#H†MYKEYV;;no so get keyP#'„USRY;;save YZ#&„USRX;;save Xd#Q>ÿ;;clear out keyn#P‚CHx#7;;pull Accum‚#P„USRA;;store itŒ#7;;get P stat–#P„USRP;;save it #7;;pull LSB of PCª#P…USRPC;;save it´#7;;pull MSB¾#P…USRPC;;save itÈ#@;;get S pntrÒ#&„USRS;;save itÜ#.;;clear interruptæ#!†SHOBRK;;show infoð#†MYKEYV!@„TKEY:ú#X;$X;Show registers$X;$†DOREGS%>;;zero index"$…DOLOP'…SAVEY,$ ƒZFR;;clr FR06$Q„USRA8;;get reg@$PƒFR0;;in FR0J$ ‡BIN2HEX;;to hex.T$%…SAVEY;;reload Y^$$…DRPOS8;;find posit.h$Q…LBUFF;;get byter$;|$S> †$P„PCNT9;;into buffer$Q…LBUFF;;next.š$;¤$S> ®$ P„PCNT9¸$3Â$)>;;done?Ì$H…DOLOP;;no way.Ö$Q…USRPC;;show theà$PƒFR0;;program cntrê$ Q…USRPCô$ PƒFR0þ$ ‡BIN2HEX%%>;;put it on%ƒPCLQ…LBUFF8;;the screen%;;;make icode&%S> 0% P„PCNT8:%1D%IƒPCLN%$>;;index for PSX%%>;;do 8 bits.b%…BITITQ„USRP;;get itl%M„BITS8;;mask itv%FƒNON€%Q>;;a '1'Š% H„PRON”%ƒNONQ>;;a '0'ž%„PRONP„PCNT9;;on screen¨%2;;up scr pntr²%1;;dec loop¼%I…BITIT;;do again.Æ%Q>;;put on a 1Ð%P„PCNT;;under unusedÚ%:;;status bit.ä%X;î%X;Change registersø%X;&…CREGS%>;;copy on prompt &„CRGLQ†REGTXT8& P…COMND8 &1*& I„CRGL4&„REGW †GETKEY;;get a key>&%>;;test 5H&ƒCRGR…REGIS8;;this one?R&F†HAVREG;;yes!\& 1;;nope.f&IƒCRG;;try nextp&G„REGW;;sorry, againz&†HAVREGC;;get address„&T?;;of registerŽ&?;;in memory˜&Q†REGTAB8;;and put¢&PƒFR0;;in fp regs¬&Q†REGTAB8¶& PƒFR0À& „CREG;;change memory.Ê&!†DOREGS;;show regs.Ô&X;Þ& X;These are the routines usedè& X;to convert ASC to ICODE andò&X;ICODE to ASC. Each uses aü&X;4 byte table of bit masks'X;located at the end of the' X;program for the conversion.'X;$'X;Asc to internal.'X;8'†ASC2IC …BITER;;fix up bitsB'LƒA2I9;;add new maskL'$…SAVX2;;restore XV' :;;done!`'X;j'X;Internal to Asct'X;~'†IC2ASC …BITER;;do bits.ˆ'LƒI2A9;;add mask.’'$…SAVX2;;get Xœ':;;and leave¦'X;°'X;Ready the bitsº'X;Ä'…BITER5;;save old byteÎ'U?;;roll the bitsØ'U?;;around 4 timesâ'U?ì'U?ö'M>;;make it index(&…SAVX2;;save X ( >;;X = A(7;;pull old byte(M>Ÿ;;mask it off((:;;and leave2(X;<(X;Clear screen (3 pages)F(X;P(†CLRSCRQ>;;get a spaceZ( >;;zero Xd(„CLSCP†MYSCRN9;;page 1n(P†MYSCRN9;;page 2x(P†MYSCRN9;;page 3‚( 2;;up loopŒ(H„CLSC;;and loop again–(P†ROWCRS;;pos 0,0 (:;;all doneª(X;´(X;Input routine¾(X;È(…INPUTQ>;;length = 0Ò( P„CENDÜ(P„IPUT;;signal inputæ( †CLRWIN;;clear windowð( „ZBUF;;and bufferú(„GETC †GETKEY;;get a key)R>;;ESCape?)H„LEG0;;nope.) #„IPUT");;;signal error,):;;and leave6)„LEG0%„NCHK;;check legals?@)H†GOTCHR;;nope.J)„LEG1%>(;;is it a legalT)„LEGLR…LEGAL8;;char?^)F†GOTCHR;;yup.h)1;;not this oner)I„LEGL;;try next|) †GOTERR;;error.†)!„GETC;;go again.)†GOTCHRR>~;;Delete?š)H†NOTDEL;;no.¤)"„CEND;;lower length®)IƒTS2;;<0? no.¸)Q>;;make zero.Â) P„CENDÌ) †GOTERR;;give error.Ö)ƒTS2 „TST1;;test lengthà)Q„CEND;;get lengthê)F„GETC;;if not 0 go!ô)%„CEND;;put in a spcþ))> * H…DODEL*1* …DODELQ>&*P…COMLN8;;erase char0*P…COMLN8;;erase cursor:*!„GETC;;get next.D*†NOTDELR>œ;;Delete Line?N*F…INPUT;;yes.X* %„CENDb* P…MYBUF8l*R>ƒEOL;;EOL?v*F…ATEND;;done!€* †ASC2IC;;make icodeŠ*)> ”* H„SHCHž*1¨*„SHCHP…COMLN8;;to screen²*3¼*)> Æ* D„TST9Ð*1Ú*„TST9'„CENDä* „TST1;;length?î*!„GETC;;do again.ø*…ATENDQ…MYBUF+ R>ƒEOL + F…INPUT+Q>;;check 'em +P„NCHK;;next time*+P…COMLN8;;and erase cursr4+ #„IPUT>+,;;show good inputH+ :;;bye.R+X;\+X;Test input lengthf+X;p+„TST1Q„CEND;;get lengthz+ HƒTL2;;no.„+P…COMLN;;erase 1st charŽ+P…COMLN;;and cursor˜+ƒTL2:;;bye.¢+X;¬+X;Erase error line¶+X;À+†CLRERR%>;;24 chars.Ê+Q>;;to clearÔ+ƒCLEP…ERRLN8;;on lineÞ+1è+IƒCLE;;loop.ò+:;;so long.ü+X;,X;Print to device,X;,†DPRINTQ>…PUTRC;;put record$, $>„DDEV.,P…ICCOM9;;CIO command8,Q>4…MYBUF;;mybuf isB,P…ICBAL9;;the bufferL,Q>5…MYBUF;;hi byteV, P…ICBAH9`,Q>(;;40 bytes maxj, P…ICBLL9t,Q>~, P…ICBLH9ˆ,Q…MYBUF;;if chr is’,IƒPRT;;>128 invertœ, „INV2¦,ƒPRT „CIOV;;print it.°,G„STOP;;on error stopº,:Ä, „STOP7Î,7Ø, !†DCLOSEâ,X;ì,X;Calculate line addressö,X;-…CLCLNQ†ROWCRS;;y-pos - T?;;* 2->;;look up the-Q„SCRN9;;screen memory(-PƒSCR;;address in2-Q„SCRN9;;table and<-PƒSCR;;store it.F- :;;bye.P-X;Z-X;Change display betweend- X;Disassembly and display memn-X;x-…ALTERQ…DTYPE;;display type‚-N>Œ- P…DTYPE–-H†HAVMEM;;in display -Q>ª- P„BBCK´-Q>!¾-H„ALT2;;finishÈ-†HAVMEMQ>Ò- P„BBCKÜ-Q>0æ-„ALT2P„PCNTð- Q†TOPADRú-PƒFR0.Q†TOPADR. PƒFR0. !†TOEDEV".X;,.X;Find Break point6.X;@.†FNDBRKQ>;;say none foundJ. P„BSETT.%>;;try 6 B.P's^.„SET?Q„ADDR;;check ifh.R…SETHI8;;MSB is same?r.H„UPLP;;not same.|.Q„ADDR;;match. try LSB†. R…SETLO8.H„UPLP;;no go.š.Q…OPSET8;;match.set yet?¤.F„UPLP;;no.®.Q…OLDOP8;;yes. restore¸.P‚OP;;old opcode.Â.#„BSET;;say set.Ì. :;;leave.Ö.„UPLP1;;decrease loopà.I„SET?;;done? no.ê.:;;yes. leave.ô.X;þ.X;Go to correct DISA routine/X;/†FINLINQ…DTYPE;;type flag/H…FINL2;;1 = display&/!‡DISAMEM;;disassemble0/…FINL2!†SHOMEM;;and display:/X;D/X;Set default GETKEY dataN/X;X/†SETKEYQ>;;set normal vidb/ P„INVSl/Q>@;;and upper casev/ P„CAPS€/: