JJJJ _ X_ p '       ,0,b   L Ơ͍ɠРÍҠҠàèĠĠ ԠˠԠ˺…$%L" `< *= $0300 .S .O4; PUT THE NUMBER 15M; INTO ADDRESS $4000S;Y;e(LDA #15s2STA $4000y<;F; NOTE THAT LADS LETS YOU USEP; EITHER DECIMAL (THE 15)Z; OR HEXADECIMAL (THE $4000)d; AS LONG AS YOU REMEMBER TO nb ADDRESS768776 BYTE2ADDRESS,BYTE?(ADDRESS`2 24,169,2,105,5,141,80,3,96n H$"0123456789ABCDEF"!A"ENTER DECIMAL NUMBER";:Xu(X255ī30: NO NUMBERS BIGGER THAN 255 ALLOWED2I101<N(X(16I)):XXN16IFHE$HE$(H$,N1,1)PIZHE$dHE$"":30Hd COMPLETE BINARY TABLE.xX0255:X;:ZX:L7NQ07:T(X2)fK$(L)(48(XT2))wLL1:XT:QXZ10);I07:K$(I);:IXdXd BINARY QUIZ$nC1177:C079@X(256(1)):DX:P128FQI18r(DP)1ĺ(C1);:DDP:210~(C0);PP2:I:"WHAT IS THIS IN DECIMAL":Q:QXĺ"CORRECT":250"SORRY, IT WAS ";XT11000:T140  15:(H$,M,1)(HE$,W1,1)104% gWG hD1W(16(Q)):DDD1:QQ1:MU iDE(D): "HEX ";H$:(H$)4ĺ"NEED FOUR DIGITS":200 102:DE 200 "DECIMAL ";DE:100:H$ 400HHE$"0123456789ABCDEF":4"PLEASE CHOOSE:"\"INPUT HEX & GET DECIMAL BACK (1)""INPUT DECIMAL TO GET HEX BACK (2)"KK200,400dH$"":M301:N%DE(16M):DEDEN%16M:H$H$(HE$,N%1,1):Me fD0:Q3:M14:W0   I770798:A:I,A:I8"CALL 770 TO ACTIVATE " 169,193,160,0,153,0,4,200,208,250,153,0,5,200,208,250,153,0,6,200,208,250,153,0,7,200,208,250,96 I A; READLINE LDY #0& LDA (L1L),Y3 BNE GOON; INYK LDA (L1L),YX BNE GOONx END RTS; RETURN TO BASIC ;-------------------------- ; SUBROUTINE TO UPDATE POINTERS TO THE NEXT LINE ; AND STORE THE CURRENT LINE NUMBER IN CASE------------( d; INITIALIZE POINTERS. n;> LDA BASIC+1J STA L1LZ LDA BASIC+2h STA L1L+1 ;------------------------- ; SUBROUTINE TO CHECK FOR 2 ZEROS. ; IF WE DON'T FIND THEM, WE ARE NOT ; YET AT THE END OF THE PROGRAM.   *= 768 .NO# .D PROG8.1A;------------------------q; DEFINE VARIABLES BY GIVING THEM LABELS.w;L1L = $F9L2L = $FB(FOUND = $752BASIC = $0800<PRINT = $FDEDFPLINE = $ED20; PRINT LINE #P; Z;-------------      NG F;/ PPRINTIT = $FDED; PRINT A CHARACTER5 Z;F xSTART LDY #0\ LOOP LDA STRING,Yl JSR PRINTITt INY CPY #LENGTH; NOTE: LENGTH IS ONE LARGER THAN TRUE LENGTH BNE LOOP RTS ; STRING .BYTE "SUPERDUPER" .END PROGRAM7.1 *= $2000 .S .O=; ONE WAY TO PRINT MESSAGES\; (LESS COMMON THAN USINGz; A ZERO AS A DELIMITER; TO END THE MESSAGE);;;;;(COUNTER = $55; TO HOLD INDEX2; <LENGTH = 11; STRING IS 10 CHARS. LON.END PROGRAM6.1 ICHTARGET LDA $400 Z;6 d; NOTE THAT YOU CAN FREELYX n; MIX LABELS AND SUBROUTINES.u x; ALSO, COMMENTS WILL BE ; IGNORED BY THE ASSEMBLER ; AND CAN BE STUCK ANYWHERE ; AS YOU SEE. ; ; SPECIALSUBROUTINE LDA 33 ; ETC. ETC.  *= $2004 .S .O<; EXAMPLE OF LADS' LABELSB;H;N;aTESTBYTE = $80sNEWBYTE = $99y(;2START LDA #TESTBYTE; IMMEDIATE ADDRESSING<CMP NEWBYTE; ZERO PAGE ADDRESSINGFBNE BRANCHTARGET; RELATIVE ADDRESSING PBRAN  0700,Y$ nINY; RAISE COUNTER BY 1J xBNE LOOP; IF NOT ZERO, KEEP GOINGR RTSf .END PROGRAM4.2 $h *= $0300 .S .O6; MASS FILL OF MEMORYO; INTO ADDRESS $4000U;[;A = $C1; DEFINE LABEL "A" AS CHARACTER A;(;2LDY #0; SET COUNTER TO ZERO<LDA #AFLOOP STA $0400,YPSTA $0500,YZSTA $0600,Y dSTA $  ; INDICATE HEX WITH THE $ SYMBOL& s;: x.END PROGRAM4.1 T0,3,32! 32,237,169,160,32,2377 253,96,254,254,2 477,249,133$ 118,165,249,24,105,4? 133,249,165,250,105,0Z 133,250,160,0,177,249r 240,28,205,6,8,240 4,200,76,58,3,162 0,232,200,189,6,8 240,7,209,249,240,245 76,58,3,32,101,3 165,251,133,249,165,252 133,250,76,19# X768880:A:CKCKA:X,A:XPCK15786ĺ"ERROR IN DATA STATEMENTS":id173,1,8,133,249,173n2,8,133,250,160,0x177,249,208,6,200,177249,208,1,96,160,0177,249,133,251,200,177249,133,252,200,177,249 133,117,200,1.;PRINTOUT JSR PLINE=LDA #$A0; THIS IS A BLANKfJSR PRINT; TO PRINT BETWEEN LINE #'SnRTS;-----------------------------;.END PROGRAM8.1 PROGRAM8.1 AINE TO PRINT OUT A BASIC LINE NUMBER.U; THIS ROM ROUTINE PRINTS THE NUMBER AT THE; NEXT CURSOR POSITION ON THE SCREEN.; THEN WE PRINT A BLANK SPACE; AND RETURN TO LINE 610 TO CONTINUE ON WITH; THE MAIN LOOP AND FIND ANY MORE MATCHESITH THE CHECK FOR THEI^; END-OF-PROGRAM DOUBLE ZERO. THIS IS THE LAST{_; SUBROUTINE IN THE MAIN LOOP OF THE PROGRAM.`;bSTOPLINE LDA L2LlSTA L1LvLDA L2L+1STA L1L+1JMP READLINE;-----------------------------%; SUBROUT LOOP; NO MATCH-XPERFECT JSR PRINTOUTOY;----------------------------Z; SUBROUTINE TO REPLACE "CURRENT LINE" POINTER[; WITH THE "NEXT LINE" POINTER WE SAVED IN THE\; SUBROUTINE STARTING AT LINE 260.]; THEN JUMP BACK TO THE START WONTINUE ON?; LOOKING FOR 1ST CHAR. MATCHES IN CURRENT LINE.E;jSAME LDX #0; COMPARE SAMPLE TOCOMPARE INX; TARGETINY&LDA BASIC+6,X0BEQ PERFECT; LINE ENDS SO PRINT:CMP (L1L),YDBEQ COMPARE; CONTINUE COMPARENJMPMPLE (LINE 0) AND THE TARGET (CURRENT LINE) TOg; SEE IF THERE IS A PERFECT MATCH. Y KEEPS TRACK OF; TARGET. X INDEXES SAMPLE. IF WE FIND A MISMATCH; BEFORE A LINE-END ZERO, WE FALL THROUGH TO LINE ; 590 AND JUMP BACK UP TO 460 WHERE WE C LINE FINISHED:CMP BASIC+6; SAME AS 1ST SAMPLE CHAR?fBEQ SAME; YES? CHECK WHOLE STRINGINY; NO? CONTINUE SEARCHJMP LOOP;-------------------------------; SUBROUTINE TO LOOK AT EACH CHARACTER IN BOTH.; THE SA; COMPARISON IN THE SUBROUTINE CALLED "SAME". IF 1STn; CHARS. DON'T MATCH, WE RAISE THE "Y" COUNTER AND; CHECK FOR A MATCH IN THE 2ND CHAR. OF THE CURRENT; BASIC LINE'S TEXT.;LDY #0LOOP LDA (L1L),YBEQ STOPLINE; 0 MEANS ;--------------------------W; SUBROUTINE TO CHECK FOR ZERO (LINE IS FINISHED?); AND THEN CHECK 1ST CHARACTER IN BASIC LINE AGAINST; 1ST CHARACTER IN SAMPLE STRING AT LINE 0. IF THE; 1ST CHARACTERS MATCH, WE MOVE TO A FULL STRING7 IN CASE IT/ hLDA (L1L),Y; NEEDS TO BES rSTA FOUND+1; PRINTED OUT LATER_ |LDA L1L CLC; MOVE FORWARD TO FIRST ADC #$04; PART OF BASIC TEXT STA L1L; (PAST LINE # AND LDA L1L+1; POINTER TO NEXT LINE) ADC #0STA L1L+1 COMPARE IT TO THE SAMPLE. ;0 GOON LDY #0P LDA (L1L),Y; GET NEXT LINEn STA L2L; ADDRESS AND "INY; STORE IT IN L2L ,LDA (L1L),Y 6STA L2L+1 @INY JLDA (L1L),Y; PUT LINE # TSTA FOUND; IN STORAGE TOO ^INY; WE4 ; FIND A MATCH AND NEED TO PRINT THE LINE #.m ; ALSO, WE ADD 4 TO THE CURRENT LINE POINTER SO THAT ; WE ARE PAST THE LINE # AND "POINTER-TO-NEXT-LINE" ; INFORMATION. WE ARE THEN POINTING AT THE 1ST CHAR. ; IN THE CURRENT LINE AND CAN,- `',- `6677 Py667`9,- +**`SK,- `],- `o,- `ST`,*ȱ,+* * +*,* ``` /(`LL0ꏢ ΀ȹLS0O ΀L 0` m ` dhh)L|L{|L0  ׀ꏭȱȱ쏭 쏍돭m돍돭m쏍쏭`L0` d` 0 I`` d m7 dL{|ȹV Ȍ8Iȹ LFȹ=2ȥʠLk` p LȌꏩmꏅi 돑ȑhhL| ΀ 8c80 0 ILLXbL)L{OKw iL|1 ~LU~iL| mȅ L|3 m⏍L{| 2 ~LU~m⏍L{| m⏍L| 3 ~LU~m⏍L| hhHH $}> *8$ 0 ӁL} 0 ρ$ 8$  0 Ӂ 0 0 ρ$ z  ;  dLz,8䏍反䏅叅 0 I L@z 0 I I  0 Ӂ m⏍⏭SL{|L|L{|8HhLh L7|hLhL8돩L{|L,L~LL|Y R  m⏍ a L|L)lL|M"N돭ѩm⏍L{| aL| iL| i a L} L. ȹ=L|L{Lz | LzL@MI L{ ALȹ LAȹ LLi{@ЬLL0) , L{HH hhL#?(7qm⏍L|L) yL 2⏈LzMɠL!zȹɠ爄 l "? d L A D S d  독䏭쏅 CL} "Lz m  F  Lr㏭hm⏍L|9ȹ      FIND START OF LINE FOR DRAWINGQ ,LDY COL:LDA #207:STA (BASE),Y; STORE THE BALLW .;e /;-- DELAYk 0;x 6LDX #200 ;DLUP1 LDY #0 @DLUP2 INY:BNE DLUP2 JINX:BNE DLUP1 TJMP LOOP ^.END PROGRAM9.1 M9.1 : BNE DLUP2 JINX : BNE DLUPCMP #23:BNE NOTBOTT; AT BOTTOM OF SCREEN?< LDA #0:STA ROWB ;Y ;-- ERASE OLD BALL_ ; NOTBOTT LDA OLDROW:JSR BASCALC; FIND START OF LINE FOR ERASE LDY OLDCOL:LDA #160:STA (BASE),Y ; ;-- DRAW NEW BALL ; "LDA ROW:JSR BASCALC;;--MAIN LOOP, HORIZONTAL MOVE$ ;P LOOP LDA COL:STA OLDCOL; SAVE POSITION\ INC COL CMP #39:BNE NOTRIGHT; AT RIGHT EDGE? LDA #0:STA COL ; ; ;-- VERTICAL MOVE ; NOTRIGHT LDA ROW:STA OLDROW; SAVE POSITION INC ROW) = $FE; dROW = $FF; (WE SAVE THE CURRENT LINE NUMBER HERE)o nOLDCOL = $EE; (WE NEED TO ERASE IN THIS COLUMN) xOLDROW = $EF; ( AND IN THIS ROW) ; ;------------------------ LDA #0 STA ROW:STA COL; START AT UPPER LEFT OF SCREEN ;   *= 768.D BALL.OBJO; SUBROUTINE TO MOVE A BALL AROUND THE SCREEN.U;[(;2BASCALC = $FBC1; CALCULATES THE START ADDRESS OF A LINE<; (WHEN GIVEN THE LINE'S #)F;PBASE = $28; (PLACE WHERE BASCALC LEAVES ITS POINTER) ZCOL          -SSSSSSSSNO START ADDRESS-------------------- BRANCH OUT OF RANGEUNDEFINED LABEL NAKED LABEL <<<<<<<< DISK ERROR >>>>>>>>  -- DUPLICATED LABEL --  -- SYNTAX ERROR -- 0123456789ABCDEFPBNELDXJMPSTASTYSTXINYDEYDEXDECINXINCCPYCPXSBCSECADCCLCTAXTAYTXATYAPHAPLABRKBMIBPLANDORAEORBITBVCBVSROLRORLSRCLDCLIASLPHPPLPRTISEDSEITSXTXSCLVNOP  `ТLȈ8aHh0!A$Pp"bBX(@x ƅhhLz. O d L苭 ؁P O:SjHL. N P d 0 Ӂ  I 0 ρL苩. N O d L苩. N H dL苩. N S d L苩. S d L苩. H dLLDALDYJSRRTSBCSBEQBCCCML F  z d 逢 ρ ؁ ؁ ƅ`. E N D ؁ ͊8䏍反䏅叅 "` ؁ ؁ L|L苄 z d  Ӂ   0 ρ ƅhhLz  0 ρ ؁:L`` ` 0 Ӂ Q QL" $ 0 ρ`` ` 0 Ӂ珮 $ 0 ρ`H)hJJJJ `F ͊hhLzE &LqDLoPLՋNLOLSLHLȌ m  F zȅ dL ؁ L͊ ؁ Lي 0 ρee` L` ` Q ‰` $ ‰` Q Q ` $ ` `揭 $ +` `  z `` ` 0 Ӂ 0 ρ`` ` 0 Ӂ QL쉩 $ 0 ρ`800L )`+Lȹ 9L):808` 돍쏍` `  0 ρ '  ׈` `  'L׈ `  ' ׈   'L׈ꏭ  0 Ӂj ׈L†u ؁C:?; L] L :LL. ׈L : ƅ hh Le}Lz` 0 Ӂ8鏭ꏩ  0 ρ; ,) L煎 ,LX ,L[돍쏪....쏽A) 돍` HH hh ؁Bh  m  F  ؁ ؁"E ؁L:L; L"L† L†L.$ LX `LjL800L-)`LXLX *LXLX X * z d  LȄei  독쏅hhLz ؁ ؁ `` ؁,:( $m!!%m""!."`!m돍돭"m쏍` ~ ؁ ؁ ؁  ƅhhLz L` ؁Lƅ:L ;s U LЄ ؁ L m  z dLЄ ؁` L ؁LȄ ƅhhLz`>[<_+*LM ȩ`ZLsyt`݌ 9Lzȹ݌ȹ݌ ս㏼Lz ρ ؁ ؁*& L}`L#돍쏢)!$"% 热!$"%Lƒ #`!."!."` FL񁭂 L  LST`Ƀ`LULkLŸŹ Lk/:SA7S0M) " LhhLz: L808`ij hhLjԠLABEL ERROR MESSAGE.!STA TEMP1&LDA #>NOARG@0STA TEMP+1Q:JSR PRNTMESSDJMP EQRET; RETURN TO EVAL-----------------------H;I;--------------- HANDLE EQUATE TYPES HERE (LABEL = 15)NEQUAL DEY!XSTY LABPTR; TELLS US HOW FAR FROM MEMT ANALYZED(BEQ EQ4; NORMALLY BY EVAL.8STA LABEL,Y@INXHINYTJMP EQ5hEQ4 STA LABEL,YRTS; RETURN TO EVAL -------------------------NOAR JSR ERRING; NAKED LABEL FOUND (NO ARGUMENT) SO RING BELL &LDA #JMP INLINE; LABELS ARE FOLLOWED BY NOTHING TO EVALUATEH.FILE ARRAY NL ADC #0STA TEMP+1\JSR VALDEC; CALCULATE ASCII NUMBER VALUE AND STORE IN RESULTFINEQ LDY LABPTR; STORE INTEGER VALUE JUST AFTER LABEL NAME IN ARRAYLDA RESULTSTA (MEMTOP),Y LDA RESULT+1INY STA (MEMTOP),Y:*EQRET PLRE ARE THREE CHARS. ( = ) BETWEEN LABEL & ARGUMENT, SOKINY; INY THRICE.STY WORK+1; POINT TO LOCATION OF ASCII NUMBER (IN LABEL BUFFER)LDA #LABEOP WE SHOULD STORE ARGUMENT VALUEobLDA HEXFLAG; HEX NUMBERS ALREADY HANDLED BY INDISK ROUTINE, SO SKIP OVER.lBNE FINEQ; HEX FLAG UP, SO GO TO EQUATE EXIT ROUTINE BELOW.vINY; OTHERWISE, WE NEED TO FIGURE OUT THE ARGUMENT (LABEL = 15)6INY; THEOPCODE|STY OPOEND JMP EVAR; MATCH FOUND SO JUMP TO EVAR ROUTINE IN EVAL_.FILE GETSA HTA ABOUT THIS MNEMONIC & RETURN TO EVAL.v JCMP #0; OR IF END OF LINE, IT WOULD BE AN IMPLIED ADDR. MNEMONIC LIKE INY TBNE NOMATCH; OTHERWISE, NO MATCH FOUND (IT'S NOT A MNEMONIC). ^FO1 LDA TYPES,X; STORE ADDR. TYPE. hSTA TPrLDY OPS,X; STORE CMP LABEL+2F BEQ FOUND; IF 3RD LETTERS ARE =, WE'VE FOUND OUR MATCHN INYx BNE LOOP; OTHERWISE TRY NEXT MNEMONIC "BEQ NOMATCH ,FOUND LDA LABEL+3; THE 4TH CHAR. MUST BE A BLANK FOR THIS TO BE A MNEMONIC 6CMP #32( @BEQ FO1; IF SO, STORE DARE1; IF =, GO ON TO COMPARE 3RD AND FINAL LETTER8 INY@ INY BNE LOOP; 2ND LETTER DIDN'T MATCH, TRY NEXT MNEMONIC (Y <> 0) BEQ NOMATCH ; IF Y = 0, WE'VE GONE PAST TABLE (RETURN TO EVAL) MORE1 INY; COMPARE 3RD LETTER LDA MNEMONICS,Y Y nINY8 xCPX #57; HAVE WE CHECKED ALL 56 MNEMONICS.n BNE LOOP; IF NOT, CONTINUE TRYING TO FIND A MATCH NOMATCH JMP EQLABEL; DIDN'T FIND A MATCH (SO GO BACK TO EVAL) MORE INY; COMPARE 2ND LETTER LDA MNEMONICS,Y CMP LABEL+10 BEQ MO OF LOOP8 <LDA MNEMONICS,Y; LOOK IN TABLE OF MNEMONICSw FCMP LABEL; COMPARE IT TO 1ST CHAR. OF WORD IN LABEL BUFFER PBEQ MORE; IF =, COMPARE 2ND LETTERS OF TABLE VS. BUFFER ZINY; OTHERWISE GO UP THREE IN THE TABLE TO FIND THE NEXT MNEMONIC dINa? ; "FINDMN" -- LOOKS THROUGH MNEMONICS FOR MATCH TO LABEL.; WE JMP TO THIS FROM EVAL. & JMP BACK TO 1 OF 2 LOCATIONS (JMP FOR SPEED)FINDMN LDY #0(LDX #255; PREPARE X TO GO TO ZERO AT START OF LOOP 2LOOP INX; X RAISED TO ZERO AT START       MPnLDA #>MDUPLAB#xSTA TEMP+14JSR PRNTMESSCJSR PRNTCRLRTS;\.FILE OPEN1 `)$ ;-----------------------------TDECPAR LDA PARRAY; LOWER ARRAY POINTER BY 1aBNE MDECr(DEC PARRAY+12MDEC DEC PARRAY<RTSF; -----------------PDUPLAB JSR ERRING; RING BELL AND PRINT DUP LABEL MESSAGEZLDA # OR < PSEUDOPRINTC`CMP #2QjBNE ARENDtLDA RESULT+1; STORE HIGH BYTE INTO LOW BYTE~STA RESULTCMPMO LDA PLUSFLAG; DO ADDITION + PSEUDO OPBEQ ARENDCLC; ADD THE + NUMBER "ADDNUM" TO RESULT THAN 0, PRINT DUPLICATION LABEL ERROR MESSAGE<JSR DUPLABPFOFX LDY WORK+1wLDA BUFLAG; COMPENSATE FOR # AND (BEQ FOFINYFOF LDA (PARRAY),Y; PUT TABLE LABEL'S VALUE IN RESULT$STA RESULT.INY8LDA (PARRAY),YBSTA RESULT+1FOUNDIT CPX WORK+1;CHECK LABEL LENGTH AGAINST TARGET WORD LENGTHBEQ FOUNDF; THEY MUST EQUAL TO SIGNIFY A MATCH. (PRINT/PRIN WOULD FAIL)JMP STARTOVER; FAILED MATCHFOUNDF INC FOUNDFLAG; RAISE FLAG TO ZERO (FIRST MATCH)-BEQ FOFX; IF HIGHER 4JSR PRNTMESS; RING BELL AND PRINT NOT FOUND MESSAGEE>JSR PRNTCRTHADONE1 PLA]RPLA;h\LDA OPtfAND #31pCMP #16zBEQ ADO2; CHECK IF BRANCH INSTRUCT.LDA BYTFLAGBNE ADO2; < OR > PSEUDOJMP THREESADO2 JMP TWOS;@R MESSAGEVBEQ ADONE1; ON 1ST PASS, MIGHT NOT YET BE DEFINED (RAISE INCSA/2S OR 3S)AD1X JSR ERRING; LABEL NOT IN TABLE. (TREAT IT AS A 2-BYTE ADDRESS)JSR PRNTLINEJSR PRNTSPACE LDA #NOLAB*STA TEMP+16 MULTIPLY RADD X 4"ROL RADD+1/ASL RADDNROL RADD+1;---------------VCLCLDA TSTORE;PULL OUT ORIGINAL NUMBER AND ADD IT TO RESULT OF X4 (GIVING X5)ADC RADDSTA RADDLDA TSTORE+1ADC RADD+1"STA RADD+1;------------ NOW, NEXT ASCII CHAR. TO THE LEFT)_rDEC VREND; LOWER LENGTH POINTER. IF IT'S NOT YET ZERO, THEN|BNE VALLOOP; CONTINUE PROCESSING THIS ASCII NUMBERRTS; OTHERWISE RETURN TO CALLER.;--------------- MULTIPLY BY 10TEN CLCASL RADD; N INC X; RAISE X BY 1 (SINCE WE'RE MOVING LEFT AND EACH NUMBER WILLO; BE 10X THE ONE TO ITS RIGHT).TLDX X^JSR VALADD; ADD RADD TO RESULT (ADD IN RESULTS OF THE MULTIPLICATION)hDEY; MOVE INDEX OVER BY 1 (TO POINT TOES AS NECESSARYQ LDA RADD; MOVE RESULT OF MULTIPLICATION INTO STORAGE REGISTER` "STA TSTOREo ,LDA RADD+1 6STA TSTORE+1; SAVING RESULTS OF MOST RECENT MULTIPLICATION @JMP VLOOP; CONTINUE MULTIPLYING X10 UNTIL X IS DOWN TO ZERO.--------CJVGOO---------- MULTIPLY X10 AS MUCH AS NECESSARY------} VLOOP DEX; LOWER THE COUNTER. (IN THE EXAMPLE, X NOW = 0 FOR 1ST CHAR) BEQ VGOON; SO WE DON'T JSR TO THE X10 SUBROUTINE IN THIS CASE) JSR TEN; OTHERWISE,WE'D MULTIPLY THE NUMBER X10 AS MANY TIM0F; AS ASCII, 5 = $35. O STRIP OFF THE 3, LEAVING THE 5.h STA RADD; STORE IN MULTIPLICATION REGISTER STA TSTORE; STORE IN "REMEMBER IT" REGISTER LDA #0; PUT 0 IN BOTH THESE REGISTERS (IN THEIR HIGH BYTES) STA RADD+12 STA TSTORE+1;-------= 2) xDEY; LDA #0; CLEAN "RESULT" VARIABLE (SET TO 0)J STA RESULT[ STA RESULT+1 LDX #1; USE "X" VARIABLE AS A MULTIPLY-X10-HOW-MANY-TIMES COUNTER STX X VALLOOP LDA (TEMP),Y; LOAD IN THE RIGHTMOST ASCII CHARACTER (EX: "5")9 AND #$EFT TO RIGHT--DECREMENTING Y --(TO FIND LENGTH)I <VGETZERO LDA (TEMP),Yj FBEQ VZERO; 0 DELIMITER FOUNDr PINY ZJMP VGETZERO;--------------- (FOR EXAMPLE, ASSUME ASCII IS "15") nVZERO STY VREND; SAVE LENGTH OF ASCII NUMBER (IN THE EXAMPLE, LEN  G ; "VALDEC" TRANSLATE ASCII INPUT TO A TWO-BYTE INTEGER IN RESULT; SETUP/TEMP MUST POINT TO ASCII NUMBER (WHICH ENDS IN ZERO).; RESULTS/ RESULT HOLDS 2-BYTE RESULT(; --------------------------2VALDEC LDY #0/ 7; READ ASCII FROM L          ITE ONE OR YOU GAVE THE WRONG FILE NAME)s JMP FIN; GO BACK TO BASIC VIA THE SHUTDOWN ROUTINE WITHIN EVAL;------- MSA RTS .FILE VALDEC DE STA TEMP; SAYS "NO START ADDRESS". OINT TO THIS ERROR MESSAGE IN LDA #>MNOSTART; THE POINTER,"TEMP," AND PRINT THE MESSAGE (PRNTMESS) STA TEMP+1; (NOTE: THIS NO-START-ADDRESS CONDITION OCCURS 2 WAYS: (EITHER( JSR PRNTMESS; (YOU FORGOT TO WRULLED OFF THE? dBNE LSA; 1ST 6 BYTES...THEN------------------a nJSR CHARIN; PULL IN NEXT BYTE xCMP #$2A; IS IT THE * SYMBOL BEQ MSA; IF SO, GO BACK TO CALLER (EVAL SUBPROGRAM CALLS GETSA) LDA #HEXBUFg ,STA TEMP+1 6JSR VALDEC; ROUTINE WHICH TURNS ASCII NUMBER INTO INTEGER IN "RESULT" @LDA RESULT; MOVE RESULT TO TEMPORARY ADDITION VARIABLE, "ADDNUM" JSTA A------- IS THIS >47 AND <58) BCS MATH31 SEC= SBC #48E SECe SBC #208; IS IT > 47 & < 58s MATH3 RTS VALIT LDA #0;---------- TURN IT FROM ASCII INTO A 2-BYTE INTEGER STA HEXBUF,X; PUT ZERO AT END OF ASCII NUMBER (AS DELIMITER): LDBCS VALIT; IF NOT, EXIT THIS ROUTINE (WE'VE STORED THE NUMBER AND HAVE STA HEXBUF,X; LOCATED SOMETHING OTHER THAN AN ASCII NUMBER) INX; KEEP STORING VALID ASCII NUMBERS IN HEXBUF BUFFER JMP MATH2;------------------- RANGECK CMP #58;-------DA LABEL,Y; LOOK FOR LOCATION OF "+" SYMBOL--------? FCMP #43M PBEQ MATH2U ZINY dJMP MATH1;------------- NOW POINT TO 1ST NUMBER FOLLOWING + nMATH2 INY xLDA LABEL,Y JSR RANGECK; CHECK TO SEE IF THIS IS BETWEEN 48 - 58 (ASCII FOR 0-9)G VH ; "MATH" THIS ROUTINE HANDLES + IT COMES FROM EVAL AFTER INDISK; IT LEAVES THE INTENDED ADDITION IN THE VARIABLE "ADDNUM"; (ADDNUM IS ADDED TO "RESULT" IN THE VALDEC SUBPROGRAM)(MATH LDY #0; SET INDEXES TO ZERO2LDX #03 <MATH1 L  RTS.FILE INDISK S MULTIPLY X2. ((N*4+N)*2) IS N*10/ASL RADD>ROL RADD+1F&RTS0;------------- ADD RESULTS OF THE MULTIPLICATION TO THE INTEGER ANSWER:VALADD CLCDLDA RADDNADC RESULTXSTA RESULTbLDA RADD+1lADC RESULT+1vSTA RESULT+1-------------- ERROR PRINTOUT PREPARATIONSIERRING LDA #7; RING BELLW JSR PRINTLDA #18; TURN ON REVERSE PRINTING TO HIGHLIGHT ERRORJSR PRINT(JSR PRNTINPUT; PRINT CONTENTS OF MAIN INPUT BUFFER2LDA #13; PRINT A CARRIAGE RETURN<J#LABEL; POINT "TEMP" TO THE BUFFER AND THENSTA TEMP+1JSR PRNTMESS; USE GENERAL MESSAGE PRINTING ROUTINERTS,;---------- PRINT A SOURCE CODE LINE NUMBER@LDA LINEN+1yJSR OUTNUM; BASIC ROUTINE (LOW BYTE IN X, HIGH IN A)JSR PTPLI; SHOULD WE ALSO PRINT LINE NUMBER TO PRINTERRTS; -----------------------------------------------3PRNTINPUT LDA -----------------------------------------------p`PRNTCR LDA #13; PRINT A CARRIAGE RETURN~jJSR PRINTtJSR PTP; SHOULD WE DO IT ON THE PRINTER TOO~RTS;------------------------------------------------0PRNTLINE LDX LINEN; JSR HEXPRINT; HIGH BYTE 1ST)LDA SA:JSR HEXPRINTlJSR PTPSA; SHOULD WE ALSO PRINT SA TO PRINTER$RTS;----------------.PRNTSAD LDX SA; PRINT SA (DECIMAL VERSION)8LDA SA+1BJSR OUTNUMLJSR PTPSA; PRINT TO PRINTER, TOO/VRTS;--TS; RETURNING TO THE CALLER ----------------------------------xPRNTSA LDA HXFLAG; PRINT THE SA (PC, PROGRAM COUNTER)BEQ PRNTSAD; IF NOT HEX PRINTOUT, THEN USE DECIMAL ROUTINE BELOWLDA SA+1; OTHERWISE, PRINT LOW AND HIGH BYTES OF SA (AS HEX) IN X BEFOREBRTS; RETURNING TO CALLER-------------------------nPRNTNUMD LDA #0; PRINT A DECIMAL NUMBERJSR OUTNUM; BASIC'S LINE NUMBER PRINTOUT ROUTINEJSR PTPNU; SHOULD WE ALSO PRINT IT TO PRINTERLDX X; RESTORE VALUE IN X BEFORE>R A)?fLDA HXFLAG; IF WE'RE PRINTING IN HEX, NOT DECIMAL, THENpBEQ PRNTNUMD; USE THE HEXPRINT SUBROUTINE. OTHERWISE, GO TO PRNTNUMDzTXAJSR HEXPRINTJSR PTPNU; CHECK IF NUMBER SHOULD BE PRINTED TO PRINTER AS WELL LDX X; RESTORE NUMBER-------------------------H4PRNTSPACE LDA #32; PRINT A SPACE CHARACTERV>JSR PRINTHJSR PTP; SEE IF IT SHOULD ALSO GO TO THE PRINTERRRTS;---------------------------------------------\PRNTNUM STX X; PRINT A NUMBER (LOW BYTE IN X, HIGH BYTE IN BY 0 AND ARE POINTEDABEQ MESSDONE; TO BY THE VARIABLE "TEMP"OJSR PRINT JSR PTP; AFTER PRINTING A CHARACTER TO SCREEN, CHECK TO SEE IF IT SHOULDINY; ALSO BE PRINTED TO THE PRINTER JMP MESSLOOP*MESSDONE RTS;---C SASTA SALDA #0'ADC SA+14STA SA+1<RTS;------------------------ PRINTOUT ROUTINES (TO SCREEN) ----------PRNTMESS LDY #0; PRINT A MESSAGE (ERRORS USUALLY) TO THE SCREENMESSLOOP LDA (TEMP),Y; THESE MESSAGES ARE DELIMITED PRINT; PRINT (AFTER LINES 550-570 ABOVE) PRINTS TO DISK FILE #2xlJSR CLRCHN; RESTORE NORMAL I/O (PRINT TO SCREEN ANDvLDX #1; READ FROM FILE #1JSR CHKININCSA CLC;------------------- RAISE THE PC COUNTER (SA) BY 1 --------LDA #1AD&DISP LDA DISKFLAG; ARE WE SUPPOSED TO POKE TO A DISK OBJECT FILEb0BEQ INCSA; IF NOT, SKIP IT:JSR CLRCHN; IF SO, ALERT FILE #2 (WRITE FILE ON DISK)DLDX #2NJSR CHKOUTXLDA WORK+1; PUT THE BYTE TO BE SENT TO DISK IN THE A REGISTER@bJSR+1;-------------POKE IN A BYTE TO RAM/DISK---------------jLDA POKEFLAG; ARE WE SUPPOSED TO POKE TO RAMBEQ DISP; IF NOT, SKIP ITLDY #0; OTHERWISE, SEND THE BYTE TO RAM MEMORY AT CURRENT PC ADDRESS (SA)TXASTA (SA),Y;----------------CT PRINT A SPACE HERE@JSR PRNTSPACE; OTHERWISE, PRINT A SPACEP3MX2 LDX RESULT+1; PRINT AND POKE THE HIGH BYTE OF THE ARGUMENTJSR PRNTNUMP3MXX LDX RESULT+1JMP POKEIT; AND A JUMP TO POKEIT WILL RTS US BACK TO CALLER9POKEIT STX WORK^BEQ P3MX>hLDX RESULT; PRINT AND POKE LOW BYTE OF ARGUMENTNrJSR PRNTNUMb|P3MX LDX RESULTqJSR POKEITLDA SFLAG; SHOULD WE PRINT TO SCREENBEQ P3MXXLDA HXFLAG; ARE WE PRINTING OPCODES AND ARGUMENTS IN HEXBEQ P3MX2; IF SO, DON'TINGL PSEE2 CMP #78; IS IT "N" FOR .NH OR .NS OR SOME OTHER "TURN IT OFF"Z BNE PSEE3z JMP NIX; TURN SOMETHING OFF PSEE3 CMP #79; IS IT "O" FOR OUTPUT (POKE OBJECT CODE INTO RAM) BNE PSEE4 JMP OPON; START POKING OBJECT CODE (DEFAULT). TO EVALP PSEE CMP #68; IS IT "D" FOR .DISK (CREATE OBJECT CODE FILE ON DISK)^ BNE PSEE1 JMP PDISK; OPEN FILE ON DISK FOR OBJECT CODE STORAGE PSEE1 CMP #80; IS IT "P" FOR .P (PRINTER OUTPUT) BNE PSEE2 JMP PPRINTER; TURN ON PRINTER LIS NEXT LINKED FILE -----------------S PGOBACK PLA; RETURN TO EVAL TO GET NEXT LINE[ ZPLA dJMP STARTLINE;------------------------ nPSE1 CMP #69; IS IT .END xBNE PSEE JSR PEND; 128 IS TOKEN FOR END (END OF CHAIN PSEUDO) JMP GOBACK; RETURN!1 ; "PSEUDO" HANDLE ALL PSEUDOPS EXCEPT .BYTEL; JMP HERE FROM INDISK; (INDISK WAS JSR'ED TO FROM EVAL). / Y HOLDS POINTER TO LABEL(; -------------------------2PSEUDO CMP #70; IS IT "F" FOR .FILE<BNE PSE1# FJSR FILE; F MEANS GO TO          LUE (FIRST) (A HOLDS HIGH VALUE AFTER LINE 2280)\($ TXA; (X HELD LOW VALUE AFTER LINE 2210){(. JSR PRINT; PRINT LOW VALUE(8 RTS; RETURN TO CALLER(B .FILE PSEUDO C BITS INTO THE 4 LOW BITS AREA)Q'LSR; (10101111 BECOMES 00001010, FOR EXAMPLE)Y'LSRa'LSR' TAY; AGAIN, PUT POSITION OF THIS VALUE INTO THE Y INDEX' LDA HEXA,Y; PULL OUT THE RIGHT ASCII CHARACTER FROM "HEXA" STRING0( JSR PRINT; PRINT HIGH VA)G&LDA HEXA,Y; THIS NUMBER IS. SO PULL IT OUT AS AN ASCII CHARACTERx&; (HEXA LOOKS LIKE THIS: "0123456789ABCDEF")&TAX; SAVE LOW-BITS VALUE INTO X&PLA; PULL OUT THE ORIGINAL NUMBER, BUT THIS TIME'LSR;SHIFT RIGHT 4 TIMES (MOVING THE 4 HIGHINTOUTQ%; PRINT THE NUMBER IN THE ACCUMULATOR AS A HEX DIGIT (AS ASCII CHARS.)p%HEXPRINT PHA; STORE NUMBER%AND #$0F; CLEAR HIGH BITS (10101111 BECOMES 00001111, FOR EXAMPLE)&TAY; NOW WE KNOW WHICH POSITION IN THE STRING OF HEX NUMBERS ("HEXA"E PTPL1$RTS'$PTPL1 LDX PRINTFLAG5$ BNE MPTPL=$RTSR$ MPTPL JSR CLRCHN]$*LDX #4l$4JSR CHKOUT|$>LDA LINEN+1$HLDX LINEN$RJSR OUTNUM$\JSR CLRCHN$fLDX #1$pJSR CHKIN$zRTS%;---------------------------------- HEX NUMBER PRT #vLDA SA#JSR HEXPRINT.#JMP FINPTPSAC#MPTPSAD LDA SA+1N#LDX SA]#JSR OUTNUMu#FINPTPSA JSR CLRCHN#LDX #1#JSR CHKIN#RTS#;------------------ LINE NUMBER TO PRINTER#PTPLI LDX PASS; SAME LOGIC AS LINES 1350+ ABOVE$BNER6"PTPSA LDX PASS; SAME LOGIC AS LINES 1350+ ABOVED"BNE PTPS1L"RTSd"PTPS1 LDX PRINTFLAGs"BNE MPTPSA{"&RTS"0MPTPSA JSR CLRCHN":LDX #4"DJSR CHKOUT"NLDX HXFLAG; HEX OR DECIMAL PRINTOUT"XBEQ MPTPSAD"bLDA SA+1#lJSR HEXPRINHN !^LDX #4!hJSR CHKOUT@!rLDA HXFLAG; HEX OR DECIMAL MODEO!|BEQ MPTPNDY!LDA Xj!JSR HEXPRINTy!JMP FINPTP!MPTPND LDA #0!LDX X!JSR OUTNUM!FINPTP JSR CLRCHN!LDX #1!JSR CHKIN!RTS";------------------ SA TO PRINTX #1 JSR CHKIN, RETT LDA A; RECOVER AF RTS; RETURN TO CALLERu ;-------------------- NUMBERS TO PRINTER PTPNU LDX PASS; SAME LOGIC AS LINES 1350+ ABOVE "BNE PTPN1 ,RTS 6PTPN1 LDX PRINTFLAG @BNE MPTPN JRTS!TMPTPN JSR CLRC DO NOTHING, RETURN TO CALLER*BNE MPTP<RTS;---------iMPTP STA A; SAVE CONTENTS OF ACCUMULATORJSR CLRCHN; ALERT PRINTERLDX #4JSR CHKOUTLDA A; RECOVER AJSR PRINT; PRINT TO PRINTERJSR CLRCHN; RESTORE NORMAL I/O LDSR PRINTFRTSQP;------------------------------------- PRINTOUT (TO PRINTER)Z;(PTP PRINTS A SINGLE CHARACTER TO THE PRINTER).dPTP LDX PASS; ON PASS 1, DO NO PRINTING TO PRINTERnBNE PTP1xRTSPTP1 LDX PRINTFLAG; IF PRINTFLAG IS DOWN,----------------- HANDLE .P (PRINTER) PSEUDO-OP -------n"PPRINTER LDA PASS; ON PASS 1, DO NO PRINTER OUTPUT,BEQ PULLINE; GET RID OF REST OF LINE AND GO ON.6JSR OPEN4; PASS 2, SO OPEN PRINTER TO HEAR FROM COMPUTER)@INC PRINTFLAG; RAISE PRINTERINTEDISK JSR CLRCHN7LDX #1; RESTORE NORMAL I/OEJSR CHKINjJSR ENDPRO; GET NEXT LINE NUMBER|PLA; PULL RTSPLALDX #0STX ENDFLAG; RESET END OF PROGRAM FLAGJMP STARTLINE; AND RETURN TO EVAL TO GET NEXT LINE7;---------COND DISK FILE (THIS ONE FOR WRITING TO)3xLDX #2BJSR CHKOUTLDA TA; PRINT OBJECT CODE'S STARTING ADDRESS TO DISK FILEJSR PRINTLDA TA+1JSR PRINTLDA LENPTR; WRITE LENGTH OFJSR PRINT; BINARY FILELDA LENPTR+1JSR PR-?PULLJ JMP PULLINE;-------- SPRINGBOARD TO IGNORE FILENAMETFPD1 STY FNAMELENzPJSR PRNTINPUT; PRINT OUT THE LINEZJSR PRNTCR; CARRIAGE RETURNdINC DISKFLAG; RAISE DISKFLAG TO SHOW THAT FUTURE POKES SHOULD GO TO DISK(nJSR OPEN2; OPEN A SES A KEYWORD (WITHIN THE FILENAME) IF >1276BCC PDIXFJSR KEYWORDPDIX STA LABEL,Y; KEEP STORING FILENAME INTO PRINTOUT BUFFER (LABEL)STA FILEN,Y; AS WELL AS OPEN1 BUFFER (FILEN)INYJMP PDLOOP; KEEP STORING FILENAME;-----------------CT CODE FILE)I8PDISK LDA PASS; ON PASS 1, DON'T STORE ANYTHING TO DISKBBEQ PULLJ; PULLJ IS A SPRINGBOARD (JUMPS TO PULLINE)LJSR CHARIN; POINT TO FILENAMEVSTA LABEL,Y`LDY #0jPDLOOP JSR CHARINtBEQ PD1; END OF LINE)~CMP #127; IT'SBC TA+1STA LENPTR+1aLDA TA; PUT ORIGINAL START ADDRESS BACK INTO PC (SA) FOR RESTART OFSTA SA; ASSEMBLY ON PASS 2.LDA TA+1STA SA+1JSR INDISK; SET UP NEXT LINE$RTS .;------------------- HANDLE .D FILENAME PSEUDO-OP (OBJEESSARY (TO END THE ENTIRE PROGRAM)2INC ENDFLAGgPEND1 INC PASS; RAISE PASS FROM PASS 1 TO PASS 2SEC; SAVE LENGTH OF FILELDA SA; FOR THIRD AND FOUTHSBC TA; BYTES OF BINARY FILESTA LENPTR; CREATED BY .DLDA SA+1; PSEUDO-OPpJSR PRINTzLDA #78%JSR PRINT1LDA #68?JSR PRINTKLDA #32YJSR PRINThJSR CHARINJSR FILE; GET FILENAME, ETC. JUST AS .FILE PSEUDO-OP DOESLDA PASS; ON PASS 1, DON'T SET THE ENDFLAG UP."BEQ PEND1; BUT ON PASS 2, IT'S NECTES ANDJSR CHARIN? JSR ENDPRO; CHECK FOR END OF PROGRAMJ*LDX #0{4STX ENDFLAG; SET END OF PROGRAM FLAG TO ZERO>RTSH;------------------------- HANDLE .END PSEUDO-OP ---------RPEND LDA #46; PRINT OUT .END\JSR PRINTfLDA #69 JSR PRNTSA; PRINT .FILE AND THE FILE NAME>JSR PRNTSPACETFI5 JSR PRNTINPUTtJSR PRNTCR; CARRIAGE RETURNJSR OPEN1; OPEN NEXT LINKED FILE ON DISK (FOR CONTINUED READING OF SOURCE)LDX #1JSR CHKIN JSR CHARIN; PULL IN NEXT TWO BYIN BUFFER (LABEL)=lFI2 STY FNAMELEN; STORE FILENAME LENGTHHvLDY #0FILO LDA LABEL,Y;------- PUT FILENAME INTO PROPER BUFFER (FILEN)BEQ FILO1STA FILEN,YINYJMP FILOFILO1 LDA PASS; ON PASS 2, DON'T PRINT OUT PCBNE FI5,LOOKING FOR BLANK FI0 LDY #03FI1 JSR CHARINKCMP #0; END OF LINEW&BEQ FI20CMP #127; KEYWORD, SO STRETCH IT OUT:BCC FII1DJSR KEYWORDNFII1 STA LABEL,Y; STORE CHAR. OF FILENAMEXINYbJMP FI1; CONTINUE STORING FILENAME IN MAJMP PULLINE; PULL IN (& IGNORE) REST OF LINE, THEN BACK TO EVAL;------------------------- HANDLE .FILE PSEUDO-OP ----------------FILE JSR CHARINCMP #32; LOOK FOR END OF THE WORD .FILE (TO LOCATE FILENAME)BEQ FI0JMP FILE; CONTINUE MESSAGE (NO SUCH PSEUDO-OP)J TPSE9 STA LABEL,Y; STORE CHAR. FOR PRINTOUT[ ^JSR PRNTLINEm hJSR PRNTSPACE| rJSR PRNTSA |JSR ERRING JSR PRNTINPUT LDA #MERROR STA TEMP+1 JSR PRNTMESS JSR PRNTCR?PSEE4 CMP #83; IS IT "S" FOR PRINT TO SCREEN< BNE PSEE5d "JMP SCREIN; TURN ON SCREEN PRINTING ,PSEE5 CMP #72; IS IT "H" FOR HEX NUMBERS DURING PRINTOUTS 6BNE PSE9 @JMP HEXIT; TURN ON HEX PRINTING J;------------------------- PRINT ERROR  ; "TABLES"Y; TABLE OF MNEMONICS AND PARALLEL TABLE OF OPCODE/ADDRESS TYPE DATA; BUFFERS AND MESSAGES, FLAGS, POINTERS, REGISTERS(;------------------------- MNEMONICS, TYPES, ADDRESS MODE OPCODES 2MNEMONICS .BYTE "LDALDYJSRRTSBCSBEQ       MBERS DURING PRINTOUT)4) HEXIT LDA #46; PRINT ".H"B) JSR PRINTX) LDA #72; "H"f) JSR PRINT) JSR PRNTCR; CARRIAGE RETURN) LDA #1) STA HXFLAG; SET HEXFLAG UP)" JMP PULLINE; IGNORE REST OF LINE (AND RETURN TO EVAL)), .FILE TABLES NRIAGE RETURN8( LDA PASS; ON PASS 1, NO SCREEN PRINTOUTF( BEQ SCREX( LDA #1; OTHERWISE, RAISE SCREEN PRINTOUT (LISTING) FLAG( STA SFLAG( SCREX JMP PULLINE; IGNORE REST OF LINE (AND RETURN TO EVAL)) ;-------------- HANDLE .H PSEUDO-OP (HEX NUUT DOWN SCREEN PRINTOUT FLAGV' JMP PULLINE; IGNORE REST OF LINE (AND RETURN TO EVAL)'d ;--------------- HANDLE .S PSEUDO-OP (TURN ON SCREEN PRINTOUT)'n SCREIN LDA #46; PRINT ".S"'x JSR PRINT' LDA #83; "S"' JSR PRINT ( JSR PRNTCR; CARE (AND RETURN TO EVAL)L&V ;-------------------------- STOP SCREEN PRINTOUTSo&` NIXSCREEN LDA #46; PRINT ".NS"}&j JSR PRINT&t LDA #78; "N"&~ JSR PRINT& LDA #83; "S"& JSR PRINT& JSR PRNTCR;CARRIAGE RETURN& LDA #0' STA SFLAG; P PRINTOUTS (START DECIMAL):%NIXHEX LDA #46; PRINT ".NH"H%JSR PRINT^% LDA #78; "N"l% JSR PRINT% LDA #72; "H"%$ JSR PRINT%. JSR PRNTCR; CARRIAGE RETURN%8 LDA #0%B STA HXFLAG; PUT HEXFLAG DOWN&L JMP PULLINE; IGNORE REST OF LIN PRINT$LDA #78; "N"*$JSR PRINT@$LDA #79; "O"N$JSR PRINTm$JSR PRNTCR;CARRIAGE RETURNx$LDA #0$STA POKEFLAG; TURN OFF POKE FLAG$JMP PULLINE; IGNORE REST OF LINE (AND RETURN TO EVAL)%;-------------------------- STOP HEXJSR PRINT#>LDA #4##HJSR CLOSE2#RJSR CLRCHNQ#\LDX #1; RESTORE NORMAL I/O_#fJSR CHKIN#pJMP PULLINE; IGNORE REST OF LINE (AND RETURN TO EVAL)#z;-------------------------- STOP POKING OBJECT BYTES TO RAM#NIXOP LDA #46; PRINT ".NO"$JSR #46; PRINT ".NP" TO SCREEN)"JSR PRINT:"LDA #78; "N"H"JSR PRINTY"LDA #80; "P"g"JSR PRINT"JSR PRNTCR; CARRIAGE RETURN"DEC PRINTFLAG; LOWER PRINT-TO-SCREEN FLAG" JSR CLRCHN; TURN OFF PRINTER"LDX #4" JSR CHKOUT"*LDA #13 #4 BYTES TO RAM"!BEQ NIXOPN!CMP #83; IS IT ".NS" TO "NOT PRINT TO SCREEN"`!BEQ NIXSCREEN!CMP #72; IS IT ".NH" TO "NOT PRINTOUT HEX" (THUS SWITCH TO DECIMAL)!BEQ NIXHEX!;-------------------------- TURN OFF PRINTER OUTPUT"NIXPRINT LDAO-OPS@ DNIX LDA PASS; ON PASS 1, DON'T BOTHER WITH ANY OF THISP NBEQ PULLINE XJSR CHARIN; ON PASS 2, SEE WHICH THING IS BEING TURNED OFF bCMP #80; IS IT ".NP" TO "NOT PRINT TO PRINTER" lBEQ NIXPRINT!vCMP #79; IS IT ".NO" TO "NOT POKE OBJECTN LDA #46; PRINT .O!JSR PRINT2LDA #79; "O"@JSR PRINT`JSR PRNTCR; CARRIAGE RETURNkLDA #1&STA POKEFLAG; RAISE POKE-TO-RAM FLAG0JMP PULLINE; IGNORE REST OF LINE :;-------------------------- HANDLE .N(SOMETHING),TURN-IT-OFF PSEUDENDPULL JSR ENDPRO7ENDPULR PLA; PULL RTS OFF STACK?PLAJLDX #0lSTX ENDFLAG; SET ENDFLAG DOWNJMP STARTLINE; RETURN TO EVAL (TO GET NEXT LINE OF SOURCE CODE);-------------------------- HANDLE .O (POKE BYTES TO RAM) PSEUDO-OPOPOLL BYTES, JUST LOCATE NEXT LINEe|BEQ ENDPULL; ZERO END OF LINE SHOULD GO TO ENDPRO FOR NEXT LINE #CMP #58; WHEREAS A COLON END OF LINE SKIPS THAT STEPBEQ ENDPULR; (COLON)JMP PULLINE; NEITHER COLON NOR ZERO (SO PULL IN MORE CHARACTERS) OUTPUT FLAG (SO PRINT WILL SEND BYTES TOjJJSR CLRCHN; THE PRINTER AS WELL AS THE SCREEN).TLDX #1; RESTORE NORMAL I/O^JSR CHKINh;---------------------- SUCTION ROUTINE. GET RID OF REST OF A LINErPULLINE JSR CHARIN; IGNORE Az #  ؠǮ Ӡ Ӡ!Ӡ  Ӡ"Ϡ#Ӡ ̠TˠGα Ʈ Ӡ Š ٠ Π  à Ƞ ʹ Ͷͷ͸͸͹Ӡɮ Ͳ ͲͲͲͲʹOUNDFLAG .BYTE 0; DUPLCATED LABEL NAME (USED BY ARRAY)rSFLAG .BYTE 0; SHOWS TO SEND SOURCECODE TO SCREEN HXFLAG .BYTE 0; SHOWS TO PRINT SA AND OPCODES IN HEX*LOCFLAG .BYTE 0; SHOWS TO PRINT A PC ADDRESS LABEL.4BABFLAG .BYTE 0; D.BDISKFLAG .BYTE 0; SHOWS TO SEND BYTES TO DISK OBJECT FILEyPRINTFLAG .BYTE 0; SHOWS TO SEND BYTES TO PRINTERPOKEFLAG .BYTE 0; SHOWS TO SEND BYTES TO MEMORY (OBJECT CODE)COLFLAG .BYTE 0; ENCOUNTERED A COLON (USED BY INDISK)7 FBNUMFLAG .BYTE 0; FOR .BYTE IN "INDISK"^BFLAG .BYTE 0 0; FOR NUMWERK IN "INDISK"ADDNUM .BYTE 0 0; NUMBER TO ADD FOR + PSEUDOPLUSFLAG .BYTE 0; FLAG SHOWS THAT + PSEUDO HAPPENED.BYTFLAG .BYTE 0; SHOWS THAT < OR > HAPPENES.>BUFLAG .BYTE 0; AVOID # OR ( DURING ARRAYS ANALYSISkPASS .BYTE 0; WHICH PASS WE'RE ON.A .BYTE 0:X .BYTE 0:Y .BYTE 0; TO HOLD REGISTERS DURING P SUBR. CHECKERPT .BYTE 0 0; TEMPORARILY HOLDS PARRAY (IN "ARRAY") 2-BYTE,VALDEC)DbKEYNUM .BYTE 0; POSITION OF KEYWORD IN BASIC'S TABLExlLABSIZE .BYTE 0; SIZE OF LABEL (EQUATE TYPE)vLABPTR .BYTE 0 0; POINTS TO ARRAY POSITION FOR ARG STORAGEARRAYTOP .BYTE 0 0; TOP OF ARRAYS--SAME AS MEMTOP BEFORE LABEL VALUE OF ARGUMENT=0ARGSIZE .BYTE 0; LENGTH OF ARGUMENTl:EXPRESSF .BYTE 0; IS IT AN EXPRESS LABELDHEXFLAG .BYTE 0; HEX NUMBER FLAGNHEXLEN .BYTE 0; LENGTH OF HEX NUMBERXNUMSIZE .BYTE 0; LENGTH OF ASCII NUMBER IN BUFFER (FOR TP .BYTE 0; TYPE@TA .BYTE 0 0; START ADDRESSiLINEN .BYTE 0 0; CURRENT LINE #ENDFLAG .BYTE 0; END-OF-PROG FLAGWORK .BYTE 0 0; TEMP WORK AREARESULT .BYTE 0 0; TEMP ANSWER AREA&ARGN .BYTE 0 0;  <<<<<<<< DISK ERROR >>>>>>>> ":.BYTE 0cMDUPLAB .BYTE " -- DUPLICATED LABEL -- ":.BYTE 0MERROR .BYTE " -- SYNTAX ERROR -- ":.BYTE 0;----------- FLAGS, POINTERS, REGISTERS ---------------------OP .BYTE 0; OPCODEREEN ---------------------------NMNOSTART .BYTE "NO START ADDRESS":.BYTE 0MBOR .BYTE "-------------------- BRANCH OUT OF RANGE":.BYTE 0NOLAB .BYTE "UNDEFINED LABEL":.BYTE 0NOARG .BYTE " NAKED LABEL":.BYTE 0)MDISER .BYTE " 0 0 03^;----- REGISTERS USED BY VALDEC -------mhRADD .BYTE 0 0;TEMPORARY REGISTER FOR DOUBLE ADDITIONrVREND .BYTE 0; TEMP REG TO HOLD END OF PROGRAM COUNTER|TSTORE .BYTE 0 0; TEMPORARY REGISTER FOR MULTIPLY ;---- MESSAGES TO PRINT TO SC0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0@HEXBUF .BYTE 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0JFILEN .BYTE 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0TNUBUF .BYTE 0 0 0 0ER .BYTE 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.BYTE 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6BUFM .BYTE 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0w;.BYTE 0 0 0 0 0 0 0 0 0 0 0 0 0 0 456789ABCDEF"O ;--------------------- BUFFERS ----------------------------- "LABEL .BYTE 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 '.BYTE 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 ,BUFF8 232 230 192 224 225 56? .BYTE 97 24 170 168 138 152 72 104_ .BYTE 0 48 16 33 1 65 36 80 .BYTE 112 34 98 66 216 88 2 8 .BYTE 40 64 248 120 186 154 184 234 ;--------------------- HEX ROUTINE TABLE ------------------ HEXA .BYTE "0123 .BYTE 8 5 6 1 2 2 0 02 .BYTE 0 2 0 2 4 4 1 0L .BYTE 1 0 0 0 0 0 0 0f .BYTE 0 8 8 1 1 1 7 8 .BYTE 8 3 3 3 0 0 3 0 .BYTE 0 0 0 0 0 0 0 0 OPS .BYTE 161 160 32 96 176 240 144 193 .BYTE 208 162 76 129 132 134 200 136 .BYTE 202 19BCCCMP* <.BYTE "BNELDXJMPSTASTYSTXINYDEYN F.BYTE "DEXDECINXINCCPYCPXSBCSECr P.BYTE "ADCCLCTAXTAYTXATYAPHAPLA Z.BYTE "BRKBMIBPLANDORAEORBITBVC d.BYTE "BVSROLRORLSRCLDCLIASLPHP n.BYTE "PLPRTISEDSEITSXTXSCLVNOP xTYPES .BYTE 1 5 9 0 8 8 8 1 LABEL ARGUMENT LIKE LDA PdSTA BUFLAG; SET DOWN THE FLAG THAT SIGNALS # OR ( DURING ARRAY CHECK.LDY PASS;ON PASS 1, WE DON'T PRINT LINE NUMBERS, ADDR. OR ANYTHING ELSEBNE MOREEV JMP MOE4MOREEV STY LOCFLAG; ZERO ADDRESS-TYPE LABEL FLAENDFLAG:BEQ EVIND:JMP FINI; END LADS ASSEMBLY IFv; EITHER THE STOP (BREAK) KEY IS PRESSED OR IF THE ENDFLAG IS UP.|;EVIND JSR INDISK; OTHERWISE GO TO PULL IN A LINE FROM SOURCE CODELDA #0STA EXPRESSF; SET DOWN THE FLAG THAT SIGNALS A"RESULT"UlSTAR1 LDA RESULT; -- STORE OBJECT CODE'S STARTING ADDRESS IN SA,TA --`vSTA SAkSTA TA|LDA RESULT+1STA SA+1STA TA+1;---------------- ENTRY POINT FOR EACH NEW LINE OF SOURCE CODE ----0STARTLINE JSR STOPKEY:LDA DY TRANSLATED0BNE STAR1Z:LDA #LABELXSTA TEMP+1bJSR VALDEC; TURN ASCII NUMBER INTO A TWO-BYTE INTEGER IN NTLDA #76; L'JSR PRINT>LDA #65; ALJSR PRINTcLDA #68; DqJSR PRINTLDA #83; SJSR PRINTJSR PRNTCR; ANOTHER CARRIAGE RETURN &CKHEX LDA HEXFLAG; IF START ADDRESS NUMBER IS HEX, IT'S ALREALADS-IS-OVER FLAG TO DOWNJ JSR INDISK; GET A SINGLE LINE OF SOURCE CODEd LDA PASS; IF 2ND PASS BNE STARTLINE; THEN JUMP OVER PRINTING OF LADS NAME JSR PRNTCR; PRINT CARRIAGE RETURN LDA #230; PRINT BLOCK GRAPHICS SYMBOLJSR PRITSTY FNAMELEN; STORE FILE NAME LENGTH` ^JSR OPEN1; OPEN READ FILE (SOURCE CODE FILE ON DISK) h;------------------ RE-ENTRY POINT FOR PASS 2 ------- rSMORE JSR GETSA; POINT DISKFILE TO 1ST CHARACTER IN SOURCE CODE |LDA #0 STA ENDFLAG; SET CTER IN FILE NAME BUFFER INYD JMP STM0; GET ANOTHER CHARACTERn STM1 STA FILEN,Y; CHECK FOR 2ND BLANKv "INY ,LDA SCREEN,Y 6CMP #$A0; IF NO SECOND BLANK SPACE @BNE STM0; THEN GO BACK FOR MORE NAME (MIGHT BE 2 WORDS) JDEY' T DEFAULTS --E ; HERE YOU CAN SET ANY ADDITIONAL DEFAULTS YOU WISHn STA HXFLAG; TURN ON HEX LISTING FLAG STM0 LDA SCREEN,Y; -- GET SOURCE FILE NAME -- CMP #$A0 BEQ STM1; CHECK FOR ANOTHER BLANK STM3 STA FILEN,Y; STORE CHARAFBNE STRTLP; --------c PLDA #START STA MEMTOP+1 STA BMEMTOP+1 STA ARRAYTOP+1;-------- LDA #1; -- SER: ; "EVAL" MAIN EVALUATION ROUTINE (SIMPLE ASSEMBLER);---------------------------------------------------------------SETUP JMP EDITSU; START THE WEDGESTART LDA #0(LDY #502STRTLP STA OP,Y; -- LOOP TO CLEAR FLAGS --<DEY                            ; HOLDS THE FILE # OF THE CURRENT OUTPUT DEVICEaA1 .BYTE 0; TEMP STORAGE OF ACCY1 .BYTE 0; TEMP STORAGE OF Y-REG;---------------------.END DEFS R0 01WRDATA .BYTE 0 0 0 0 83 149 83 148 83 147lCLOSER .BYTE 2 0 0 0 0 0 0 0 0 0 0 0 0 147 0 146 0 145CLOSEW .BYTE 2 0 0 0 0 0 0 0 0 0 0 0 83 149 83 148 83 147OPNI .BYTE 0; HOLDS THE FILE # OF THE CURRENT INPUT DEVICE5OPNO .BYTE 0----------------2\OPNREAD .BYTE 1 0 1 0 0 1 6 2Wf.BYTE 45 147 0 0 0 147 0 146 0 0ypOPNWRIT .BYTE 1 0 1 0 0 1 6 4z.BYTE 128 149 0 0 83 149 83 148 0 0RD1B .BYTE 3 1 0 0 0 0 0 0 0 0 0 0.BYTE 0 147 0 146 0 145WR1B .BYTE 4 1 0 0 0 0 SHOWS TO PRINT A REM AFTER PRNTINPUT IN EVALe>LENPTR .BYTE 0 0; HOLDS LENGTH OF BINARY PROGRAMHFOPEN1 .BYTE 0; HOLDS THE CURRENT INPUT FILERFOPEN2 .BYTE 0; HOLDS THE CURRENT OUTPUT FILEW;------------ DOS-MANAGER CONTROL BYTES ---RE 2ND CHAR.K""CMP #65; IF LOWER THAN 65, DON'T RAISE LABEL-ARGUMENT FLAGY",BCC EVMO2"6INC EXPRESSF; IF HIGHER, DO RAISE IT"@EVMO2 INY; NOW MOVE REST OF ARGUMENT UP TO "BUFFER" BUFFER"JLDA LABEL+4,Y; LOOP TO MOVE THE ARGUMENT INTO THE BUFFER?HABETIC ARG (LABEL) SO RAISE THIS FLAGn!EVMO2A STA BUFFER,Y; STORE 1ST CHAR. OF ARGUMENT IN "BUFFER" BUFFERv!INY!LDA LABEL+4,Y; LOOK AT 2ND CHAR. IN THE ARGUMENT!BEQ EVMO3; IF ZERO, WE'RE AT THE END SO MOVE ON "STA BUFFER,Y; OTHERWISE, STOR A LABEL EVGO LDY #0L STY EXPRESSF; TURN OFF THE "IT'S A LABEL" FLAG LDA LABEL+4,Y; CHECK 5TH CHAR. (LDA NAME OR LDA 25) (THE "N" OR "2") CMP #65; IF LESS THAN 65 (ASCII FOR "A") THEN IT'S A NUMBER BCC EVMO2A&!INC EXPRESSF; >65 = ALPRAGE METHOD)OSTA WORK; SAVE IT HERE TEMPORARILY TO COMPARE WITH ARRAY WORDSJSR ARRAY; EVAL. EXPRESSION LABEL, SHIFTED 1ST CHAR.JMP L340; THEN CONTINUE ON WITH EVALUATION (AFTER VALUE IS IN "RESULT") ;--------------- IS ARGUMENT NUMERIC O ZCMP #64;dBCS EVE1; IF SO, GO DOWN TO FIND ITS VALUE.wnLDA BUFFER+1; IF NOT, IT MUST HAVE BEEN A ( OR # SYMBOLxINC BUFLAG; TO TELL ARRAY THAT ( OR # WAS FOUND (AND TO IGNORE THEM) EVE1 EOR #$80; SET 7TH BIT IN 1ST CHAR. (TO MATCH ARRAY STOSPRINGBOARD);----------_2EQLAB1 JSR EQUATE; PUT LABEL AND IT'S VALUE INTO THE ARRAY (PASS 1)<JMP MOE4; CONTINUE EVALUATIONF;------------------ TRANSLATE ARGUMENT LABELS INTO NUMBERSPEVEXLAB LDA BUFFER; IS THIS 1ST CHARACTER ALPHABETIC (>64)C LABEL (THIS IS PASS 2), BUT WEeINX; NEED TO EVALUATE THE REST OF THE LINE FOLLOWING THAT LABEL.mINY JMP EVX5;-------------------EVX4 STA LABEL,XJMP MOE4; JUMP TO CONTINUE EVALUATION(GONOAR JSR NOAR; PRINT NO ARGUMENT MESSAGE (A THE LABEL NAME (AS A DELIMITER)gSTA FILEN,Y; NOW WE HAVE TO MOVE THE ARGUMENT PORTION OF THIS LINEEVX5 LDA LABEL,Y; OVER TO THE START OF THE "LABEL" BUFFER FOR FURTHERBEQ EVX4; ANALYSIS (0 DELIMITER HERE) STA LABEL,X; WE CAN IGNORE THE PNE NOTEQ; IF NOT, IT'S A PC ADDRESS TYPE (SO SET LOCFLAG)~JMP INLINE; IF SO,WAS = TYPE SO IGNORE IT (ON PASS 2) ----------NOTEQ LDX #0STX LOCFLAG;(SHOWS PRINTOUT TO DO THIS TYPE OF LABEL ON SCREEN/PRINTER) TXA; PUT A ZERO IN AT THE END OFAKED LABEL (NO ARGUMENT TO IT) WHICH CAUSES US TO PRINTtBNE EVX1;OUT THAT ERROR MESSAGE (AT NOAR, IN EQUATE).OTHERWISE, WE FIND A~INY; BLANK AND FALL THROUGH TO THIS LINE.LDA LABEL,Y; WE RAISE Y BY 1 AND CHECK FOR AN = SIGN.CMP #$3D9BIF IT'S A PC ADDRESS TYPEaLLDA LABEL,Y; LABEL (LIKE: LABEL INY) OR AN EQUATE TYPE (LABEL = 15)VBEQ GONOAR; SO IN THIS LOOP WE LOOK FOR A BLANK WHILE STORING THE`STA FILEN,Y; LABEL NAME IN THE "FILEN" BUFFER. F WE FIND A 0, IT'S7jCMP #32; A N---------K$EQLABEL LDA PASS; MOE4 FOUND IT TO BE A LABEL, NOT A MNEMONIC.BEQ EQLAB1; ON PASS 1 WE DON'T CARE WHICH KIND OF LABEL IT IS SO WE8LDY #255; GO DOWN AND STORE IT IN THE ARRAY (VIA EQLAB1)BEVX1 INY; BUT ON PASS 2, WE NEED TO DECIDE THING (NOT A ZERO) IN 4TH POSITIONjBNE EVGO; EVGO = ARGUMENT (IF NOT, THERE'S NO ARGUMENT,IT'S IMPLIEDLDA #8; OTHERWISE, RAISE OP (OPCODE) BY 8CLCADC OPSTA OPTP1JMP JMP TP1; AND JUMP TO TYPE 1 (SINGLE BYTE TYPES) ;---------"; -------- EVALUATE ARGUMENT2EVAR LDA TP`BEQ TP1JMP; CHECK TYPE, IF 1, NO ARGUMENTCMP #3; IF NOT TYPE 3, THEN CONTINUE EVALUATIONBNE EVGOLDA #1; OTHERWISE, REPLACE 3 WITH 1 IN TP (TYPE)STA TP"LDA LABEL+3; IS THERE SOME (PROGRAM COUNTER)."SA" IS THE VARIABLE.:\JSR PRNTSPACEhfMX LDA PLUSFLAG; DO WE HAVE A + PSEUDO OPpBEQ MOE4; IF NOT SKIPzJSR MATH; IF SO, HANDLE IT IN SUBPROGRAM "MATH"MOE4 JMP FINDMN; LOOK UP MNEMONIC (OR, NOT FINDING ONE, IT'S A LABEL)G (LIKE: LABEL INY)T ; THIS IS FOR THE INLINE SUBROUTINE BELOW.*LDA SFLAG; SHOULD WE PRINT TO THE SCREEN4BEQ MX; IF NOT, SKIP THIS PART>JSR PRNTLINE; PRINT LINE NUMBERHJSR PRNTSPACE; PRINT SPACE(RJSR PRNTSA; PRINT PC$FF2 BEQ MPXS2 PLA'2 JMP DOBERRf2 MPXS PLA; OTHERWISE, CHECK FOR OUT OF RANGE BRANCH ATTEMPT2 BPL BERR; OUT OF RANGE (PRINT ERROR MESSAGE "BERR")2( JMP RELM; AND JUMP TO REL CONCLUSION ROUTINE32 FOR BEQ MPXS1; CHECK FORWARD BRANCH OUT OF R1~ BNE MREL1 JMP TWOS^1 MREL SEC; ON PASS 2, SUBTRACT PC FROM ARGUMENT TO GET REL. BRANCHm1 LDA RESULTx1 SBC SA1 PHA; SAVE LOW BYTE ANSWER1 LDA RESULT+11 SBC SA+11 BCS FOR; IF ARGUMENT > CURRENT PC, THEN IT'S A BRANCH FORWARD2 CMP #RWISE, IT MUST BE A 2-BYTE TYPE SO PRINT/POKE IT.;-------t0` JIMMED JMP IMMED; SPRINGBOARD TO IMMEDIATE MODE TYPES.0j ;------------------------------- HANDLE RELATIVE ADDRESS (BNE) TYPES0t REL LDA PASS; ON PASS 1, DON'T BOTHER, JUST INCREASE PC BY 2 TYPE./LDA TPG/CMP #1; IF TYPE 1, ADD 16 AT THIS POINT TO OPCODEV/ BNE MINDIRb/ LDA #16j/ CLCu/$ ADC OP/. STA OP/8 MINDIR LDA TP; TYPE 6 IS A JUMP INSTRUCTION/B CMP #6/L BEQ JJUMP; SO GO TO THE JUMP-HANDLING ROUTINE90V JMP TWOS; OTHEMP TO THE SINGLE BYTE TYPES (IMPLIED ADDRESSING)u.INDIR LDY ARGSIZE; HANDLE INDIRECT ADDRESSING-------------------.LDA BUFFER,Y; LOOK AT THE LAST CHARACTER IN THE ARGUMENT..CMP #41; IS IT A ")" LEFT PARENTHESIS/BEQ MINDIR; IF SO, HANDLE THATEQ INDIRA-fLDA TP; IS IT A RELATIVE ADDR. MODE (LIKE BNE, BEQ).L-pCMP #8~-zBEQ REL; IF SO, GO TO WHERE THEY ARE HANDLED.-CMP #3; ADD 8 TO OP AT THIS POINT IF IT'S A TYPE 3-BNE EVMO5-LDA #8-CLC-ADC OP-STA OP0.JMP TP1; AND JUHE OPCODE TABLE).,*;[,4L340 LDA BUFFER; 1ST CHAR. OF THE ARGUMENT (THE "#" IN LDA #15)g,>CMP #35,HBEQ JIMMED; # SYMBOL FOUND (SO IMMEDIATE MODE). BRANCH TO SPRINGBOARD,RCMP #40; IS IT A "(" LEFT PARENTHESIS. IF SO, GO TO INDIRECT ADDR.-\BL OPCODE TOW+; REFLECT THE CORRECT ADDRESSING MODE. ADJUSTMENTS TO THE OPCODE "OP"+ ; APPEAR FROM HERE ON RATHER FREQUENTLY. THEIR LOGIC WILL NOT BE+; EXPLAINED. DDING 4,8,16, OR 24 TO AN "OP" IS BASED ON THEIR, ; RELATIONSHIPS WITHIN TLA; RESTORE THE A AND Y REGISTERS)*TAY1*PLA*STA (TEMP),Y; RESTORE A "," OR ")" TO THE BUFFER (FOR THE ADDR. ANALYSIS)*;--------------- ANALYZE THE ARGUMENT TO DETERMINE ADDRESSING MODE +; (THIS ESSENTIALLY AMOUNTS TO MODIFYING THE ORIGINAULATOR)TYA[)PHA;SAVE Y REGISTER(BY NOW, Y IS POINTING AT THE SPACE JUST AFTER THE #))LDA #0; PUT DELIMITER ZERO INTO BUFFER JUST FOLLOWING NUMBER.)STA (TEMP),Y)JSR VALDEC;GO TO THE ASCII-NUMBER-TO-INTEGER-NUMBER-IN-"RESULT" ROUTINE!*P44; WITH A , COMMA (AS IN: 15,Y) OR1(lBEQ MCAL1f(qCMP #32; WITH BLANK SPACE (AS IN: #15 ;COMMENT)t(sBEQ MCAL1(vINY; IF WE'VE NOT YET FOUND ONE OF THESE 4 THINGS, CONTINUE LOOKING(JMP MCAL;----------------------------)MCAL1 PHA; SAVE ACCUMTEMP+1; NUMBER STARTS WITH A # OR ( --- THAT WOULD MESS THINGS UP.':MCAL LDA (TEMP),Y; NOW LOOK FOR THE END OF THE NUMBER: -----------'DBEQ MCAL1; IT COULD END WITH A 0 (DELIMITER) OR'NCMP #41; WITH A ) LEFT PARENTHESIS OR'XBEQ MCAL1#(bCMP #8%&BCS MCAL; IF SO, SKIP THIS PARTk&CLC; IF NOT, THE 1ST CHARACTER MUST BE # OR ( ..... SO WE NEED TO&INC TEMP; MAKE "TEMP" POINT 1 CHARACTER HIGHER IN "BUFFER" TO&&BCC MCAL; AVOID HAVING THE ASCII TO INTEGER SUBROUTINE THINK THAT THEB'0INC -- CALCULATE ARGUMENT'S VALUE (IF IT'S A DECIMAL NUMBER)q%LDA #BUFFER%STA TEMP+1%LDY #0%LDA BUFFER; IS 1ST CHARACTER HIGHER THAN 48 (ASCII FOR THE NUMBER ZERO)&CMP #4 INDISK SUBPROGRAM ALREADY TRANSLATED IT FOR US`$BNE L340; SO GO ON TO EVALUATE ADDRESS MODE.$LDA EXPRESSF; IF IT'S A LABEL (NOT A NUMBER) THEN GO TO THE ROUTINE$BNE EVEXLAB; WHICH EVALUATES EXPRESSION (ARGUMENT) LABELS, "EVEXLAB"9%; --------#TBEQ EVMO3; EVMO3 TAKES OVER AFTER END OF ARGUMENT IS REACHEDP#^STA BUFFER,Y#hJMP EVMO2; RETURN FOR MORE ARGUMENT CHARACTERS.#r;---------------#|EVMO3 DEY#STY ARGSIZE; REMEMBER NUMBER OF CHARACTERS IN ARGUMENT/$LDA HEXFLAG; IF IT'S HEX,1BJSR CHKINLBPRMM LDA #20; PUT 20 INTO CURRENT SCREEN CURSOR POSITION[BSTA CURPOSBLDA #FILENBSTA TEMP+1BJSR PRNTMESS; PRINT LOCATION LABEL;----------'CPRMJSR CHKOUTA$LDY A$A.BPL PRXM1/A8LDY #2>ABJMP PRMLOPPALPRXM1 LDA #32AVPRMLOP JSR PRINT;---------------- PRINT BLANKS TO PRINTERA`DEYAjBNE PRMLOP; PRINT MORE BLANKS TO PRINTER;---------------AtJSR CLRCHN; RESTORE NORMAL I/OB~LDX #AG USAGE, FOR SPEED)8@ LDA PRINTFLAG; PRINT TO PRINTERE@ BEQ PRMMQ@ LDA #20Y@ SEC@ SBC CURPOS; SUBTRACT CURRENT CURSOR POSITION@ STA A; MOVE THE CURSOR TO 20TH COLUMN ON THE SCREEN@JSR CLRCHN; PREPARE PRINTER TO PRINT BLANKS@LDX #4 A PASS; ON PASS 1, IGNORE THIS WHOLE PRINTOUT THING.A? BNE NLOX1M? JMP JST? NLOX1 LDA SFLAG; LIKEWISE, IF SCREENFLAG IS DOWN, IGNORE.? BNE NLOX? JMP JST? NLOX LDA LOCFLAG; ANY PC ADDRESS LABEL TO PRINT@ BNE PRMMX1; NO LOC TO PRINT (RVS FLDC #12>H STA OP:>R THREES JSR FORMAT; PRINT/POKE OPCODEv>\ JSR PRINT3; PRINT/POKE 2 BYTES OF THE ARGUMENT (3000)>f ;------------------------------------- PREPARE TO GET A NEW LINE>p ;PRINT MAIN INPUT AND COMMENTS, THEN TO STARTLINE3?z INLINE LDA---- 3 BYTE TYPESS= PREPTHREES LDA TP; SEVERAL OPCODE ADJUSTMENTS (BASED ON TYPE)^= CMP #2j= BEQ PTT= CMP #7; (LINE 430)= BNE PT1= PTT LDA OP= CLC= ADC #8= STA OP= JMP THREES= PT1 CMP #6= BCS THREES=* LDA OP=4 CLC>> ADJUST OPCODE BY ADDING 8 TO IT.*MERRORRSTA TEMP+1RJSR PRNTMESS; PRINT THE MESSAGE SJMP INLINE; GO LDA OPQCLCQADC #24&QSTA OP5QJMP THREESEQL690 LDA TPPQCMP #5[QBEQ M6hQLDA #$31rQJSR PQJMP L700Q$M6 LDA OPQ.CLCQ8ADC #28QBSTA OPQLJMP THREESQV;----------- PRINT A SYNTAX ERROR MESSAGE ------------------@R`G MODEJP>ZEROY LDA RESULT+1; CHECK HIGH BYTE OF RESULT (ZERO PG. OR NOT)dPHBNE L680; ZERO Y TYPEPRLDA TP; ADJUST OPCODE BASED ON TYPEP\CMP #2PfBEQ L730PpCMP #5PzBEQ L730PCMP #1PBEQ L760PL680 LDA TPPCMP #1PBNE L690Q IT AN XOBEQ L720TODEY; OTHERWISE, LOOK AT THE 3RD CHAR. FROM END OF ARGUMENT\O DEYOLDA BUFFER,Y; IS IT A ")" LEFT PARENTHESISO CMP #41O*BNE ZEROY; IF NOT, IT'S NOT AN INDIRECT ADDR. MODEP4JMP INDIR; IF SO, IT IS AN INDIRECT ADDRESSINCARRIAGE RETURNNJSR PRINT,NJSR CLRCHN7NLDA #4ENJSR CLOSEmNFINFIN JMP TOBASIC; RETURN TO BASICsN;N;------------------------------------- ,X OR ,Y ADDRESSING TYPENXYTYPE LDA BUFFER,Y; LOOK AT LAST CHAR. IN ARGUMENTOCMP #88; ISMXJSR CLOSE; CLOSE OBJECT CODE OUTPUT FILE (IF ANY)]MbLDA PRINTFLAG; IS THE PRINTER ACTIVEMlBEQ FINFIN; IF NOT, JUST RETURN TO BASICMvJSR CLRCHN; OTHERWISE SHUT DOWN PRINTER, GRACEFULLY.MLDX #4MJSR CHKOUTNLDA #13; BY PRINTING A ORE; PASS 1 FINISHED, START PASS 2 (ENTRY POINT FOR PASS 2)------GL;L&;------------------- SHUT DOWN LADS OPERATIONS AND RETURN TO BASIC ------L0FIN JSR CLRCHN; RESTORE NORMAL I/OL:LDA #1LDJSR CLOSE; CLOSE SOURCE CODE INPUT FILELNLDA #24AL START ADDR. INTO THE PC PROGRAM COUNTER (SA):KSTA SAGKLDA TA+1TKSTA SA+1KJSR CLRCHN; RESTORE ORDINARY I/O CONDITIONSKLDA #1KJSR CLOSE; CLOSE INPUT FILEKJSR OPEN1; OPEN INPUT FILE (POINT IT TO THE 1ST BYTE IN THE FILE)ALJMP SMPASS 1 TO PASS TWO (IN THE FLAG)EJSEC; SAVE THE LENGTH OF THE CODEjJLDA SA; FOR THE THIRD AND FOURTHJSBC TA; BYTES OF THE BINARYJSTA LENPTR; FILE CREATED BY THEJLDA SA+1; .D PSEUDOPJSBC TA+1JSTA LENPTR+1/KLDA TA; PUT THE ORIGINIBNE FINITIJST JMP STARTLINE; OTHERWISE GO BACK UP TO GET THE NEXT SOURCE LINE.I;------------------------------------- THE END OF A PASS (1 OR 2)IFINI LDA PASSIBNE FIN; IF IT'S PASS 2, SHUT EVERYTHING DOWN. JINC PASS; OTHERWISE, CHANGE BUF; POINT "TEMP" TO THE COMMENTS BUFFER "BABUF"=HJSTA TEMPMHTLDA #>BABUF\H^STA TEMP+1HhJSR PRNTMESS; PRINT WHAT'S IN THE COMMENTS BUFFERHrRETTX JSR PRNTCR; PRINT CARRIAGE RETURNH|LDA ENDFLAG; IF ENDFLAG IS UP, JUMP TO THE SHUTDOWN ROUTINE PRINTER----------]GPRXM LDA BABFLAG; IS THERE ANY COMMENT TO PRINT (SOMETHING FOLLOWING ;)GBEQ RETTX; IF NOT, SKIP THIS.G"JSR PRNTSPACE; PRINT A SPACE--------PRINT COMMENTS FIELD----------G,LDA #59; PRINT A SEMICOLONG6JSR PRINT0H@LDA # PSEUDO-OP TO PRINT --------------eFBEQ PRXM; HANDLE < AND >FCMP #1; 1 IN BYTFLAG MEANS <FBNE MO5FLDA #60FJMP PRMOFMO5 LDA #62; PRINT >FPRMO JSR PRINTGJSR PTP1; PRINT > OR <. PTP1 IS TO ----------2EPXMX JSR CLRCHN; RESTORE NORMAL I/O=ELDX #1}EJSR CHKIN;-------------------------------------------------EPRMMFIN LDA #30ESTA CURPOS; SET SCREEN CURSOR POSITION TO 30FJSR PRNTINPUT; PRINT MAIN INPUT BUFFER (BULK OF SOURCE LIKS D2LDX #4D<JSR CHKOUT&DFLDY XNDPBEQ PXMX; HANDLE NO BLANKS (IGNORE)DZBMI PXMX; HANDLE TOO MANY BLANKS (>127) (IGNORE)DdLDA #32DnPRMLOPX JSR PRINT; PRINT BLANKS TO PRINTER FOR FORMATTING--------DxDEY EBNE PRMLOPX; PRINT MORE BLANKSMX1 LDA #30; MOVE CURSOR TO 30TH COLUMN/CSEC>CSBC CURPOSCSTA X; SAVE OFFSET FROM CURRENT POSITION (30-POSITION) FOR PRINTERCLDA PRINTFLAG; DO WE NEED TO PRINT BLANKS TO THE PRINTERCBEQ PRMMFIND(JSR CLRCHN; ALERT PRINTER TO RECEIVE BLANN (REM)R"LDA PRINTFLAG; IF PRINTOUT NOT REQUESTED, THEN DON'T STORE THE REMARKSa,BEQ PULLRXq1STA BABFLAG6LDA A; OTHERWISE, CHECK Y (SAVED ABOVE). IF ZERO, IS A SEMICOLON AT@BEQ PUX; START OF THE LINE (NO LABELS OR MNEMONICS, JUST A BIG COUND A 0 END OF LINE. CHECK FOR END OF PROGRAM (3 ZEROS)W MOI1 CMP #58; IS IT A COLON BNE XMO1; IF NOT, CHECK FOR SEMICOLON JMP COLON; FOUND A COLON XMO1 CMP #59; IS IT A SEMICOLON BNE COMOA; IF NOT CONTINUE ONSTY A; FOUND A SEMICOLOOK CMP #32; (OR FOLLOWING A LINE NUMBER)t JMP MOI1; SKIP TO CHECK FOR COLON (IT'S EQUIVALENT TO AN END OF LINE 0) STINDISK JSR CHARIN; ENTRY POINT WITHIN LINE (NOT AT START OF LINE) MOINDI BNE MOI1; IF NOT ZERO, LOOK FOR COLON7 JMP ENDPRO; FOE OF LINE NUMBERW NOBLANKS JSR CHARIN; ROUTINE TO ELIMINATE BLANKS FOLLOWING A COLON CMP #32; (OR FOLLOWING A LINE NUMBER) BNE COOLOOK JSR ENDPRO; THIS HANDLES COLONS PLACED ACCIDENTALLY AT THE END OF LINE PLA:PLA:JMP STARTLINE( COOLOEMOVE ANY BLANKS\ nBNE NOBLANKS; (THIS TAKES CARE OF: INY: LDA 15: LDX 17 TYPE ERRORS) xJSR CHARIN; OTHERWISE, PULL IN THE 1ST CHARACTER (FROM DISK OR RAM) STA LINEN; STORE LOW BYTE OF LINE NUMBER JSR CHARIN STA LINEN+1; STORE HIGH BYTBEL WITH ZEROS (ROUTINE IN EVAL)+ <LDY #0M FSTY HEXFLAG; PUT HEXFLAG DOWN] KSTY BABFLAG PSTY BYTFLAG; PUT FLAG SHOWING < OR > DOWN ZSTY PLUSFLAG; PUT ARITHMETIC PSEUDO OP (+) FLAG DOWN dLDA COLFLAG; IF THERE WAS A COLON JUST PRIOR TO THIS, RE1 ; "INDISK" MAIN GET-INPUT-FROM-DISK ROUTINE~;SETUP/EXPECTS DISK TO POINT TO 1ST CHAR IN A NEW LINE (OR BEYOND COLON);RESULTS/EITHER FLAGS END OF PROG. OR FILLS LABEL+ WITH LINE OF CODE(;------------------ 2INDISK JSR CLEANLAB; FILL LA                    NGE, MBOR)ZLDA #>MBOR(ZSTA TEMP+1LZJSR PRNTMESS; PRINT THE MESSAGExZJSR PRNTCR; PRINT A CARRIAGE RETURN ANDZ JMP TWOS; BUNGLE AS AN ORDINARY 2-BYTE EVENT (TO KEEP PC CORRECT)Z;------------------Z .FILE EQUATE UYRTS'Y;--------------------------hYDOBERR JSR PRNTCR; PRINT "BRANCH OUT OF RANGE" ERROR MESSAGEwYJSR ERRINGYJSR PRNTLINE; PRINT THE LINE NUMBERYLDA # OR < PSEUDOhJMP STINDISK; 1 = < (LOW BYTE) TYPELO LDA #1; 2 = > (HIGH BYTE) TYPESTA BYTFLAG; (ACTION IS TAKEN ON THIS PSEUDO-OP WITHIN THE,JMP STINDISK; EQY>JMP FKEY; LOOP AGAIN FOR NEXT CHAR.---------------------PKSET AND #$7FRTS; CLEAR OUT BIT 7 AND RETURN TO CALLING ROUTINE;------------------ HANDLE > AND < PSEUDO-OPSHI LDA #2; THE BYTFLAG HAS 3 POSSIBLE STATES:6STA BYTFLAART-OF-KEYWORD SHIFTED CHARACTER -------------m`FKEY INX; STORE THE KEYWORD INTO LADS' MAIN BUFFER (LABEL)~jLDA KEYWDS,XtBMI KSET; A SHIFTED CHAR. INDICATES END OF KEYWORD, START OF NEXT KEYWORD~STA LABEL,Y; PUT CHAR. INTO LADS' BUFFERINAND WE EXIT THIS SEARCH ROUTINE AND STORE THE ASCII WORDi8KSX INX; BRING X UP TO ZERO AT START OF LOOPBLDA KEYWDS,X; LOOK AT CHAR. IN BASIC'S TABLE.LBPL KSX;DID NOT FIND A SHIFTED BYTE(1ST CHAR. IS SHIFTED IN THE TABLE).VBMI SKEY; DID FIND ST STRINGIKEYWORD SEC; FIND NUMBER OF KEYWORD (IS IT 1ST, 5TH, OR WHAT)VSBC #$7FSTA KEYNUM; STORE NUMBER (POSITION) IN BASIC'S KEYWORD TABLELDX #255$SKEY DEC KEYNUM; REDUCE NUMBER BY 1 (WHEN ZERO, WE'VE FOUND IT IN TABLE)8.BEQ FKEY; SETTING COLFLAG.RTS;----------------------rPSEUDOO JMP PSEUDOJ; SPRINGBOARD TO PSEUDO-OP HANDLING ROUTINESHEXX STA LABEL,Y; SPRINGBOARD TO HEX NUMBER TRANSLATORINYJMP HEX;-------- TRANSLATE A SINGLE-BYTE KEYWORD TOKEN INTO ASCIIAN ASCII STRINGRADDLAB STA LABEL,Y; PUT THE CHARACTER INTO THE MAIN BUFFER ANDqINY; RAISE THE POINTER ANDJMP STINDISK; RETURN TO GET ANOTHER CHARACTER (BUT NOT A LINE NUMBER);----------------------COLON STA COLFLAG; SIGNIFY COLON BY *COMO CMP #$2A4BNE COMO13>JMP STAR; FOUND *EHCOMO1 CMP #46fRBEQ PSEUDOO; FOUND PSEUDO-OPr\CMP #36fBEQ HEXX; FOUND HEX NUMBERpCMP #127; NOT A KEYWORD (7TH BIT NOT UP)zBCC ADDLABJSR KEYWORD; FOUND KEYWORD, SO EXTEND IT INTO --------OMPULL1 RTS; SEMICOLON, BUT NOT AT START OF LINE (RETURN TO CALLER)COMOA CMP #$3E;------------------ CHECK FOR OTHER ODD CHARACTERSBEQ HI; FOUND >CMP #$3CBEQ LO; FOUND < CMP #$2BBNE COMO INC PLUSFLAG; FOUND +FOR END OF PROGRAM AND THENeLDA A; SEE IF Y = 0. IF SO, THE SEMICOLON WAS AT THE START OF A LINEtBNE MPULL1PLA; Y = 0 SO JUMP BACK TO EVAL TO PREPARE TO GET NEXT LINEPLAJMP STARTLINE; SEMI @ START SO RETURN TO EVAL TO GET NEXT LINE-DvJMP PAX1; RETURN TO LOOP TO GET ANOTHER CHARACTER--------------PULLRX JSR CHARIN; JUST PULL IN REMARK CHARACTERS, IGNORING THEMBEQ MPULL; LOOKING FOR THE END OF LINE ZEROJMP PULLRX;--------------------------MPULL JSR ENDPRO; CHECK OMMENT0LDY AT:RTS; Y MUST HOLD OFFSET FOR ZERO FILL (ENDPRO)-----------------DPAX BPL PAXA; NOT A KEYWORD (7TH BIT NOT SET)XJSR KEYWAD; OTHERWISE, EXTEND KEYWORD INTO AN ASCII STRINGbPAXA STA BABUF,Y; STORE CHAR. IN REMARK BUFFERlINYO EVALUATESTA AVJMP MPULL; GO TO EXIT ROUTINE--------------------------------oPULLREST STA BABFLAGySTA ALDY #0PAX1 JSR CHARIN; GET CHARACTERBNE PAX; IF NOT ZERO, CONTINUE&STA BABUF,Y; OTHERWISE, WE'RE AT THE END OF THE C,PUX1 JSR PRNTLINE; PRINT THE LINE NUMBERMJSR PRNTSPACE; PRINT A SPACEJSR PRNTINPUT; PRINT THE CHARACTERS IN THE LABEL BUFFER (MAIN BUFFER)JSR PRNTCR; PRINT A CARRIAGE RETURN LDA #0; SET A VARIABLE TO ZERO TO SIGNIFY NOTHING FOR EVAL TNOT SET (SO IT'S NOT A KEYWORD IN BASIC)5|BCC PUX2yJSR KEYWORD; IT IS A KEYWORD, SO EXTEND IT OUT AS AN ASCII WORDPUX2 STA LABEL,Y; PUT THE CHAR. INTO THE MAIN BUFFERINYJMP PUX; RETURN TO LOOP FOR MORE CHARACTERS---------------------MMENT)HJJSR PULLREST; OTHERWISE SAVE COMMENTS FOLLOWING THE SEMICOLONTJMP MPULL; AND THEN RETURN TO EVAL ---------------------------^PUX JSR CHARIN; PUT NON-COMMENT DATA INTO LABEL BUFFERhBEQ PUX1; END OF LINE, SO EXIT(rCMP #127; 7TH BIT OF ASCII-HEX NUMBER].STA LABEL,Y; FINISH STORING CHARS. INTO MAIN BUFFER (0 IN THIS CASE).JSR STARTHEX; TRANSLATE ASCII-HEX NUMBER INTO INTEGER IN RESULT VARIABLE.LDA A; RETRIEVE 0 OR COLON OR SEMICOLON AND GO BACK UP TO MOINDI WHICHA/JMP MOYN-pJSR STARTHEX; TRANSLATE ASCII-HEX NUMBER INTO INTEGER IN RESULT VARIABLE-zJMP STINDISK; RETURN TO PULL IN REST OF THE LINE;------------DECI STA A; SAVE THE END OF LINE, COLON, OR SEMICOLON CHAR. FOR LATER-LDA #0.STX HEXLEN; SAVE LENGTH FOR PRINTOUT AND/,>INY; RAISE THIS INDEX TOOu,HJMP H1; THEN KEEP ON PUTTING HEX NUMBER INTO HEXBUFFER-----------,RDECIT STX HEXLEN; SAVE LENGTH OF ASCII-HEX NUMBER,\STA LABEL,Y; FINISH STORING CHARS. INTO MAIN BUFFER (, OR ) IN THIS CASE)-fINIFFERENT PLACE" HANDLES A NOT-END-OF-LINE CONDITION).j+BEQ DECIT; CLOSE PARENTHESIS ) (SO STOP LOOKING)+ STA HEXBUF,X; OTHERWISE, PUT THE ASCII-STYLE-HEX CHAR. IN BUFFER AND+*INX; RAISE THE INDEX AND,4STA LABEL,Y; ALSO STORE IT INTO MAIN BUFFERD OF LINE (SO STOP LOOKING)'*CMP #58M*BEQ DECI; COLON (SO STOP LOOKING)Y*CMP #32d*BEQ H1p*CMP #59*BEQ DECI; SEMICOLON (SO STOP LOOKING)*CMP #44*BEQ DECIT; COMMA (SO STOP LOOKING, BUT GO TO A DIFFERENT PLACE)5+ CMP #41; (THIS "DTURN TO CALLERT);------------------------ CHANGE A HEX NUMBER TO A 2-BYTE INTEGER); PULL IN NEXT FEW BYTES, TURNING THEM INTO AN INTEGER IN RESULT)HEX LDX #0; PUTS INTEGER EQUIVALENT OF INCOMING HEX INTO RESULT)H1 JSR CHARIN*BEQ DECI; ENA #0; OTHERWISE WE PUT THE COLFLAG (COLON) DOWN, BECAUSE THIS ISw(lSTA COLFLAG; AN END OF LINE CONDITION, NOT A COLON(vRTS; AND RETURN TO CALLER(INEND LDA #1;-------- SET END OF SOURCE CODE FILE FLAG TO UP CONDITION(STA ENDFLAG)RTS; AND RECPY #2556'0BNE ENDPRO; FILL REST OF BUFFER WITH 00SF':STA LABEL,Y'DJSR CHARIN; PULL IN THE NEXT 2 BYTES. IF THEY ARE BOTH ZEROS, THEN'NJSR CHARIN; WE HAVE, IN FACT, FOUND THE END OF OUR SOURCE CODE FILE'XBEQ INEND; AND WE BEQ TO INEND@(bLD+1 &PLA; PULL OFF THE RTS AND(&PLAd&JMP STARTLINE; RETURN TO EVAL FOR THE NEXT LINE OF CODE&;------------------ IS THIS THE END OF THE ENTIRE SOURCE CODE&ENDPRO STA LABEL,Y; PUT THE ZERO (THAT SENT US HERE) INTO THE MAIN BUFFER&INY '&GOT TO STUFF THE DISK OBJECT FILEm%BEQ STARRX; IF THE DISKFLAG IS UP (WE ARE CREATING AN OBJECT CODE FILE)%JSR FILLDISK; FILLDISK DOES THIS FOR US.%STARRX LDA RESULT; PUT THE ARGUMENT OF *= INTO THE PC (SA)%STA SA%LDA RESULT+1&STA SAABEL $JCLC$TADC TEMP&$^STA TEMP6$hLDA #>LABELA$rADC #0P$|STA TEMP+1$JSR VALDEC; TRANSLATE ASCII NUMBER INTO INTEGER (IN RESULT)$STARR LDA PASS; ON PASS 1, LEAVE DISK OBJECT FILE ALONE.$BEQ STARRX!%LDA DISKFLAG; ON PASS 2, WE'VE HAS ALREADY BEEN FIGUREDD#BNE STARR; SO JUMP OVER THIS NEXT PARTO#LDY #0d#STAF LDA LABEL,Yp#CMP #32~#BEQ STAF1#INY#"JMP STAF; FIND NUMBER (BY LOOKING FOR THE BLANK: *= 15)#,STAF1 INY#6STY TEMP; POINT TO ASCII NUMBER$@LDA # OR *< TYPE+ (INYw 2INC HEXFLAG; SET HEXFLAG TO PREVENT EVAL FROM TRYING TO FIGURE OUT ARG. <LDA BYTFLAG; SEE WHICH <> PSEUDO-OP IT IS FCMP #1 PBEQ STARLO; LOW BYTE TYPE PUTS LOW BYTE OF PC INTO RESULT,!ZLDA SA+1; HIGUATE SUBPROGRAM). O WE FETCH THE NEXT CHAR.h;------------------ HANDLE * PSEUDO OP (CHANGE THE PC)STAR LDA BYTFLAG; IF NOT *> OR *< TYPE THEN BEQ STARM; CONTINUE ONLDA #42; OTHERWISE PUT * SYMBOL INTO LABEL (MAIN BUFFER)# STA LABEL,Y1 LDA BFLAG; IF BFLAG IS UP, WE'RE DONE.L> BNE BBEND; SO GO TO END ROUTINE> WK0 JSR CHARIN; OTHERWISE, GET A CHARACTER FROM DISK/RAM> BEQ BSFLAG; IF ZERO (END OF LINE) SET BFLAG UP.> CMP #58; LIKEWISE IF COLON> BEQ BSFLAG1? CMP #59; SEMICOLTO MEMORY (THE ASCII CHARACTER)4=N LDY Y; RESTORE YM=X INY; RAISE INDEX ANDm=b JMP BY1; GET NEXT CHARACTER=l BNUMWERK LDX #0;-------- HANDLE .BYTE 1 2 3 (NUMERIC TYPE)=v STX BFLAG; PUT DOWN BFLAG (END OF LINE SIGNAL)= STA NUBUF,X= INX(> WERK < JSR INCSA+< JMP BY1;-----------------t< PSEUD1 JMP PSEUDO; SOME OTHER PSEUDO TYPE, NOT .BYTE (A SPRINGBOARD)<& PSLOOP STA LABEL,Y; STORE A CHARACTER IN MAIN BUFFER;------------<0 TAX<: STY Y; SAVE Y INDEX=D JSR POKEIT; PASS 2, SO POKE IT IN=; JMP BENDPRO; A SEMICOLON SO END THIS ROUTINE IN THAT WAY.s; BY3 CMP #34; HAVE WE FOUND A CONCLUDING QUOTE ("); BNE BY3X; JMP BY1; FOUND A " SO IGNORE IT; BY3X LDX PASS; ON PASS 1, JUST RAISE PC COUNTER (INCSA); DON'T POKE IT.; BNE PSLOOPE (OR PROGRAM);: BY2 CMP #58; FOUND A COLON "END OF LINE"H: BNE BY2Xd: JMP BEN1; FOUND A COLON: BY2X CMP #59; FOUND A SEMICOLON "END OF LINE": BNE BY3: JSR PULLREST; STORE COMMENTS IN COMMENT BUFFER (BABUF): LDX PRINTFLAG: STX BABFLAGFOR PRINTING9T INY_9^ CMP #34; IS THE CHARACTER A QUOTE ("). IF SO, IT'S A .BYTE "ABCD TYPE9h BNE BNUMWERK; OTHERWISE IT'S NOT THE " TYPE9r BY1 JSR CHARIN;---------- HANDLE ASCII STRING .BYTE TYPES9| BNE BY2: JMP BENDPRO; FOUND A 0 END OF LINL IN CHARACTER FROM DISK/RAMB8 STA LABEL,Y; STORE IN MAIN BUFFERJ8" INYe8, CMP #32; IS IT A SPACE86 BNE CLB; IF NOT, CONTINUE PULLING IN MORE CHARACTERS------------8@ JSR CHARIN; (WE'RE LOOKING FOR THE 1ST SPACE AFTER .BYTE) 9J STA LABEL,Y; STORE (OUR INDEX)57 LDA SFLAG; SHOULD WE PRINT TO SCREENE7 BEQ CLB; NOn7 JSR PRNTLINE; YES, PRINT LINE NUMBER7 JSR PRNTSPACE; PRINT SPACE7 JSR PRNTSA; PRINT PC ADDRESS7 JSR PRNTSPACE; PRINT SPACE7 LDY Y; RECOVER Y INDEX8 CLB JSR CHARIN; PUL BNE PSEUD1; WASN'T .BYTEd6 LDA #0; RESET FLAG WHICH WILL DISTINGUISH BETWEEN .BYTE 0 AND .BYTE "A6 STA BNUMFLAG; " TYPE, OR 00 08 15 172 TYPE (THE TWO .BYTE TYPES)6 LDA PASS; PRINT NOTHING TO SCREEN ON PASS 16 BEQ CLB 7 STY Y; SAVE Y REGISTERNAME AND PC ADDR. STORED IN ARRAYT5( PLA; PULL OUT A AND Y REGISTERS (RESTORE THEM)\52 TAYd5< PLA5F PSE2 STA LABEL,Y; STORE . CHAR.5P INY5Z JSR CHARIN; GET CHAR. FOLLOWING THE PERIOD (.)5d STA LABEL,Y5n INY5x CMP #66; IS IT "B" FOR .BYTE6BYTE TYPES)X4 PSEUDOJ CPY #0; IF Y = 0 THEN IT'S NOT A PC LABEL LIKE (LABEL .BYTE 0 0)e4 BEQ PSE24 LDX PASS; OTHERWISE, ON 1ST PASS, STORE LABEL NAME AND PC ADDR. IN ARRAY4 BNE PSE24 PHA; SAVE A AND Y REGISTERS4 TYA4 PHA!5 JSR EQUATE; 93 CPX HEXLEN; ARE WE AT THE END OF OUR ASCII-HEX NUMBERZ3 BNE HXLOOP; IF NOT, CONTINUE3 INC HEXFLAG; IF SO, RAISE HEXFLAG (TO SHOW RESULT HAS THE ANSWER)3 LDA #1; AND RETURN TO CALLER3 RTS3 ;----------------------- 4 ; HANDLE PSEUDOS. (.BC #7; BUT IF IT'S > 65, THEN -7. = 65. 65-7 = 58.y2j HXMORE AND #15; WHEN YOU 58 AND 15, YOU GET 10 (THE VALUE OF A)2t ORA RESULT; #15 (00001111) AND #58 (00111010) = 00001010 (TEN)2~ STA RESULT; PUT THE BYTE INTO RESULT2 INX; RAISE THE INDEX RESULT; CALLING "RESULT."+1$ ROL RESULT+1:1. ASL RESULTK18 ROL RESULT+11B LDA HEXBUF,X; GET A BYTE FROM THE ASCII-HEX NUMBER1L CMP #65; IF IT'S LOWER THAN 65, IT'S NOT AN ALPHABETIC (A-F) HEX NUMBER1V BCC HXMORE; SO DON'T SUBTRACT 7 FROM IT52` SMOVES 2-BYTE BITS TO THE LEFT)-----f0ROL RESULT+1; DOING THIS 8 TIMES HAS THE EFFECT OF BRINGING IN0 ASL RESULT; THE ASCII NUMBER, 1 BYTE AT A TIME, AND TRANSFORMING IT0 ROL RESULT+1; INTO A 2-BYTE INTEGER WITHIN THIS 2-BYTE VARIABLE WE'RE1 ASLINDI;----------------- BEHAVES ACCORDING TO WHICH SYMBOL A HOLDS./STARTHEX LDA #0;----------------- HEX-ASCII TO INTEGER TRANSLATOR------/STA RESULT; SET RESULT TO ZERO/STA RESULT+1/TAX; SET X TO ZERO#0HXLOOP ASL RESULT; SHIFT AND ROLL (         M.FILE MATHddTNSTEAD OF LABEL BUFFER).%L^LDX #2559LhSKEX DEC KEYNUMFLrBEQ FKEXSL|KSXX INXdLLDA KEYWDS,XqLBPL KSXX~LBMI SKEXLFKEX INXLLDA KEYWDS,XLBMI KSEXLSTA BABUF,YLINYLJMP FKEXLKSEX AND #$7FLRTSM;------------------1; RESTORE NORMAL I/O#K"JSR CHKIN+K,RTSGK6;----------------------K@KEYWAD SEC; SEE KEYWORD ABOVE (SAME KEWORD TO ASCII STRING ROUTINE)KJSBC #$7F; THIS IS A VERSION OF KEYWORD, BUT FOR COMMENTS(PUTS IT IN BABUFLTSTA KEYNUM; IJJSR PRINT; PRINT SPACER TO DISK@JLDA WORK; LOWER WORK BY 1QJBNE DECWORKX`JDEC WORK+1vJDECWORKX DEC WORKJBNE PUTSPCRJLDA WORK+1JBNE PUTSPCR; PUT MORE SPACERS IN UNTIL "WORK" IS DECREMENTED TO ZERO.JRESFILL JSR CLRCHNKLDX #JSR CHKOUT; PUT SPACERS IN DISKFILE FOR *=wInSEC; FIND OUT HOW MANY SPACERS TO SEND TO DISK BY SUBTRACTING:RESULT-SAIxLDA RESULTISBC SAISTA WORK; ANSWER HELD IN "WORK" VARIABLEILDA RESULT+1ISBC SA+1ISTA WORK+1IPUTSPCR LDA #0" OBJECT FILEUH2CMP #2; WITH THE REQUISITE NUMBER OF BYTES TO MAKE UP FORH<BNE FILLX; THE ADVANCING OF THE PROGRAM COUNTER (PC)HFRTS; NOT AT START OF 3RD PASS (3RD PASS IS JUST BEFORE SHUT DOWN)HPFILLX JSR CLRCHNHZLDX #2+IdRINT ANY COMMENTSGBEQ NOPRYG JMP PRMMFIN; BACK TO EVAL (WHERE COMMENTS ARE PRINTED)GNOPR JMP STARTLINE; BACK TO EVAL (BYPASSING PRINTOUT)G;----------------------- FOR CHANGE OF PC H(FILLDISK LDA PASS; A CHANGE OF PC REQUIRES FILLING A DISK1 STA COLFLAG; SET IT (COLON) OR NOT (ENDPRO RETURNS WITH 0 IN A)nFINC LOCFLAG; RAISE PRINT-A-PC-LABEL FLAGFPLA; PULL RTS FROM STACKFPLAFLDA PASS; ON PASS 1, DON'T PRINT ANY COMMENTSFBEQ NOPRGLDA SFLAG; IF SCREENFLAG IS DOWN, DON'T P RAISES IT;E~BNE BBEND1; ON PASS 2).IEJSR INCSAEBBEND1 LDA BUFM+1; IF END OF LINE SIGNAL WAS A COLON, THENECMP #58EBEQ BEN1; DON'T LOOK FOR LINE NUMBER OR END OF SOURCE CODE FILE (ENDPRO)EBENDPRO JSR ENDPROAFBEN DISK OBJECT FILE)8D.LDY Y; ERASE THE NUMBER IN HEXBUFCD8LDA #0NDBLDX #5cDLCLEX STA NUBUF,XkDVDEXxD`BNE CLEXDjJMP WERK1; AND THEN RETURN TO FETCH THE NEXT NUMBER;-------------- EtBBEND LDA PASS; END .BYTE LINE. ON PASS 1, RAISE PC (POKEITD LINE);---------RC WERK2 LDA #NUBUF~C STA TEMP+1CSTY YCJSR VALDEC; TURN THE ASCII INTO AN INTEGER IN RESULTCLDX RESULTD$JSR POKEIT; POKE THE RESULT INTO MEMORY (ORE, STORE ITB INXTB JMP WERK1; AND RETURN FOR MORE OF THE NUMBER----------------B BSFLAG INC BFLAG; RAISE UP THE END OF LINE FLAGB STA BUFM+1; SAVE COLON, SEMICOLON, OR WHATEVER FOR LATER USEC JMP WK1; RETURN FOR MORE (BUT THIS TIME IT WILL ENJMP WERK1; GET NEXT NUMBERRAH WERK5 LDA BUFM; PUT CHAR. INTO PRINTOUT MAIN BUFFERbAR STA LABEL,YjA\ INYAf CMP #32; IS IT A SPACEAp BEQ WERK2Az CMP #0; IS IT END OF LINEA BEQ WERK2A CMP #58; IS IT COLONA BEQ WERK2 B STA NUBUF,X; OTHERWIS BUFM; PUT CHAR. INTO "BUFM" BUFFER`@ LDA PASS; ON PASS 1, RAISE THE PC ONLY (INCSA), NO POKESn@ BNE WERK5{@ LDA BUFM@ CMP #32; IS IT A SPACE@* BNE WERK1; IF NOT, RETURN FOR MORE OF THE NUMBER (0 VS 555)@4 JSR INCSA; RAISE PC COUNTER BY 1A> ON REQUIRES THAT WE FIRST FILL THE COMMENT BUFFERv? BNE WK1; BEFORE SETTING THE BFLAG (IN THE BSFLAG ROUTINE)? JSR PULLREST; HERE'S WHERE THE COMMENT BUFFER IS FILLED? LDX PRINTFLAG? STX BABFLAG? JMP BSFLAG; FOUND SEMICOLON#@ WK1 STA TXTPTRBNE OUTLDA #020CMP TXTPTR+1FBNE OUT; NO, EXITQLDY #0NXTCHR LDA (TXTPTR),Y; IGNORE LEADING SPACESCMP #32BNE ISLNUMINC TXTPTRJMP NXTCHRISLNUM CMP #$2F; IS IT A NUMBER?BCC OUT; NO, EXITCMP #PEN FILESCLOSE CMP #01:BNE CL2; CLOSE INPUT FILE?I"JMP CLOSE1q,CL2 CMP #02; NO, CLOSE OUTPUT FILE?}6BNE CL4@JMP CLOSE2JCL4 JMP CLOSE4; NO, MUST BE PRINTER; BASIC WEDGEWEDGE STA A1LDA #$00; IS TXTPTR AT $200?CMP; CLOSE ALL INPUT AND OUTPUT CHANNELS;CLRCHN LDA #00HSTA OPNOUSTA OPNI{LDA #PRINTSTA CSWD+1RTS;CHECK FOR STOP KEYSTOPKEY LDA $C000CMP #$83RTS  ; CLOSE O2dPBYTE JSR $C100; LOBYTE GETS MODIFIED BY OPEN4@nJMP CTOUTnxNXT2 LDA PRINTFLAG; NO, MUST BE TO SCREENzBNE RPRINTING; CARD DOES IT FOR US IF WE'RE PRINTING|LDA A1ORA #$80JSR COUTRPRINTING LDA A1; RESTORE ACCUMJMP CTOUT(STA A14LDA OPNO; CHECK TO SEE IF TO OUTPUT FILE@CMP #02MBNE NXT1mLDA A1; YES, WRITE THE BYTE|JSR WRBYTEJMP CTOUT<NXT1 LDA OPNO; CHECK TO SEE IF TO PRINTERFCMP #4PBNE NXT2ZLDA A1; YES, PRINT TO PRINTER_ORA #$80 X & Y REG6$LDA OPNI; CHECK TO SEE IF INPUT CHANNELA.CMP #1\8BNE CTOUT; IF NOT EXITkBJSR RDBYTEsLPHP~VLDY Y1`LDX XjPLPtRTS~CTOUT LDY Y1RTS; OUTPUT ONE BYTE TO CURRENTLY OPEN CHANNELPRINT STY Y1; SAVE REG3D6; JSR TO FILE MANAGER IN DOS'RTSG; SET CURRENT INPUT CHANNELZCHKIN STX OPNIbRTS; SET CURRENT OUTPUT CHANNELCHKOUT TXASTA OPNOCHKOUTO RTS ; GET ONE BYTE FROM CURRENTLY OPEN CHANNELCHARIN STY Y1 STX X; SAVE,Y  INYCPY FNAMELEN' BNE FM0a*FMDRVR JSR $3DC; GET START ADDRESS TO PARAMETER FIELDp4STA PARM+1}>STY PARMHLDY #00RPARMSU LDA (FMOP),Y; PUT PARMS INTO PARM\STA (PARM),YfINYpCPY #18zBNE PARMSULDX #00JSR $TA TEMPLDA #>FILEN&STA TEMP+12LDY #00?LDA #$A0nPADFN STA (PARM),Y; FIRST FILL WITH SPACESvINYCPY #31BNE PADFNLDY #00FM0 LDA (TEMP),Y; THEN PUT FILENAME IN PARMORA #$80; MAKE SURE HIGH BIT SETSTA (PARM)0RTS:CLOSE4 LDA #LDA #>COUTe@STA CSWD+1mBRTSDFMDRVR0 LDY #08; PUT FILENAME INTO PARAMETER FIELDNLDA (FMOP),YXSTA PARMbINYlLDA (FMOP),YvSTA PARM+1LDA #CLOSEW STA FMOP+1 JSR FMDRVR LDA #0 &STA FOPEN2; SET OUTPUT FILE TO CLOSEDMDRVR hRTS$ m; CLOSE INPUT FILE^ rCLOSE1 LDA FOPEN1; CHECK TO SEE IF INPUT FILE IS OPEN{ |BEQ NOCLOSE; IF NOT EXIT LDA #CLOSER STA FMOP+1 JSR FMDRVR LDA #0 STA FOPEN1; SET INPUT FILE TO CLOSED A #>RD1B STA FMOP+1& JSR FMDRVR3 JSR $3DCB STA PARM+1O STY PARM[ LDY #08z LDA (PARM),Y; GET THE BYTE "RTS '; WRITE ONE BYTE TO OUTPUT FILE ,WRBYTE STA WRDATA 6LDA #WR1B TSTA FMOP+1 ^JSR FA:JSR $FDED; SEND LINE FEEDM LDA #$50:STA $579; SET LINE LEN TO 80 COLUMNSY LDA $36 STA PBYTE+1; SET PRINTING ADDRESS STX $36; RESET OUTPUT LINK STY $37 RTS ; READ ONE BYTE FROM INPUT FILE RDBYTE LDA #OPNWRIT< STA FMOP+1L JSR FMDRVR0q INC FOPEN2; SET OUTPUT FILE OPENy RTS OPEN4 LDA #0; SETUP CARD IN SLOT1 LDX $36; SAVING OLD OUTPUT LINK STA $36 LDA #$C1 LDY $37 STA $37 LDA #$8;OPEN INPUT FILE+ OPEN1 JSR CLRCHNRLDA #1; CLOSE FILE IF ALREADY OPEN`JSR CLOSEr(LDA #OPNREADFSTA FMOP+1PJSR FMDRVR0ZINC FOPEN1; SET INPUT FILE TO OPENdRTSi; OPEN OUTPUT FILE nOPEN2F):DD1& D0C$" "D2D0:FF17 :D0FF1= [ J(C$):JJ487(J64):} A0:A$:A$(A$,4):(A$)0ı P1(A$):C$(A$,P,1):C$"0"C$"9"C$"A"C$"Z"A0: &520:AA16J::0C(B256):CB254C255(C127):CC255K13Ė7:A$;" ";:D K32K47K58K64K71A$L$(K)R$:PP1V K4A$L$R$x K9A$L$" "(A$,P1,1)R$ K8PP(P0) K21PP(PL) 330 F1:D0:P1(A$):C$(A$,P,1):FNC$" "ı C$" "İ520:V(F)J16(D1)V((7);:290, @F18:BF1,V(F)::::150K J(A$)33A$O$:PO:(7);w TL(A$):O$A$:OP:L$"":P0L$(A$,P) ^R$"":PL1R$(A$,LP1) h7:L$;::PLĺ(A$,P1,1);::R$; r" ";: |K(49152):K128380 49168,0:KK128 :L2+ F07:V(F1)(BF)::560:V(9)C^ F1N:AV(F):580:A$" ";:::(49152)128Ăp 49168,0:150 590:B0150 BBE8 "1:AB:L4:580:A$;": ";:64668:A$"":P0:330:L0150 ,470:FNĺ(7);:290 6N9İ560:CV(9)ĺA$:I15:A$("EDLSQ",I,1)Ă:160E I270,220,180,200:34,0:z "FILENAME: ";A$:A$""ĺ(4);"BLOAD";A$;",A";S 150 "FILENAME: ";A$:A$""ĺ(4);"BSAVE";A$;",A";S;",L";ES 150 590:B0150 BBE8:L4:AB:580:A$;": ";&dN9:::"APPLE MLX":34,2:610Xn1:20:"START ADDRESS";:530:A0ĺ(7):110`xSA2:20:"END ADDRESS ";:530:SAA0ĺ(7):130EA:"CHOOSE:(E)NTER DATA";:22:"(D)ISPLAY DATA":8:"(L)OAD FILE (S)AVE FILE (Q)UIT":& (XT2)) LL1:XT:Q' XZ:5);? I07:K$(I);:I:S X:(4);"PR#0"m : TRANSFORM TO HEX H$"":M101:N%DE(16M):DEDEN%16M H$H$(HE$,N%1,1):M H$" ";:DEX256 DE1000ĺ" ";:270 DE10000ĺ" "; D KZ(4);"PR#1": CHANGE THIS TO MATCH THE LOCATION OF YOUR PRINTER CARDfdHE$"0123456789ABCDEF"snX1255xB2:C1zX10ĺ" ";:130|X100ĺ" ";X;" ";:DEX:240 CREATE BINARYZX:L7Q07:T(X2) K$(L)(48  EDITSU LDA #WEDGEN STA $BCb LDA #$4C; "JMP"n STA $BA LDA #$FC:STA 115; SET HIMEM# LDA #$79:STA 116( RTS2 .FILE FINDMN EY B INY"L CMP #00; END OF LINE.V BNE TK3;` DEY; YESGj TK4 DEYst LDA (HIGHDS),Y; IGNORE FOLLOWING SPACES~ CMP #32 BEQ TK4 INY LDA #0 STA (HIGHDS),Y INY INY INY INY INY; Y-REG HOLDS LINE LENGTH +6 RTS&C!JSR LINGET; GET LINE NUMBER0JSR TOKNIZ8PLA@PLAJMP LININS; JUMP TO NORMAL INSERT LINE AND RESET LINE LINK ADDRESSES TOKNIZ LDY #00; TOKENIZE LINE STY HIGHDS LDA #02$ STA HIGHDS+1. TK3 LDA (TXTPTR),Y8 STA (HIGHDS),A1; NORMAL CHRGET>CMP #$3A+HBCS EXIT8RCMP #$20D\BNE NXTSfJMP CHRGET_pNXT SEClzSBC #$30tSECSBC #$D0EXIT RTSINSLIN LDX PRGEND; FOUND LINE NUMBER, NOW INSERT LINESTX VARTABLDX PRGEND+1STX VARTAB+1CLTOP OF SCREENCMP #0$BEQ ASM1ORA #$80@STA $400,YHINYWJMP TFRNAMASM LDA #$A0; PUT FOLLOWING 3 SPACESSTA $400,YSTA $401,Y STA $402,YPLA; PULL RETURN ADDRESS AND JUMP TO START PLA*JMP START4OUT1 LDA $3ABCC INSLIN2&OUT LDA $200; IS IT "ASM "?>0CMP #65K:BNE OUT1XDLDA $201dNCMP #83qXBNE OUT1~bLDA $202lCMP #77vBNE OUT1LDA $203CMP #32BNE OUT1; NO, EXITLDY #0; YES TFRNAM LDA $204,Y; TRANSFER NAME TO L *hhLz`>[<_+4*L{.$ F3L9`L3L8""003L[)`5L5L5 *35LL ) *  3 LȄ3ei Ã)6 ⇭hhLz3RPSL++ 549    hhLz L L:L8;s*7U>* քL  F3L L *L>* *` #Lބ `NLsyt` 3 9Lzȹ 4ȹ 56 ս덌Lz ƒ+ + *T ;L}`gh *T ;L}`,,(``LŃQ+)ORPS O @L偭 L偭7 L偩ST`Ƀ`LOLeL{ŸŹ L_/:SA7S0M) " LhhLz: L808`ij قhhLjԠ ȩ`U,- B`6677 Py6 67`g,- +**`y,- `A,- A`B,- B`ST`,*ȱ,+5* * +*,* ```+ )+(`` -.L*( ȀȹzS0O-. ȀL:0`) L ; hh)5L|Lx|L*: р(ȱȱ5 42m3m)`L*` ؅ ; ` $ =C,- A` e ; Lx|ȹ3V Ȍ#8#3Iȹ3 L@ȹ3=2ȥ#ʠ33Le3` ;L$Ȍ3mi Ã$ȑhhL|&' Ȁ:8c80 LzXbz)L{OKw iL|1 ~LO~iL| ;L|3 mLx| 2 ~LO~mLx| mL| 3 ~LO~mL|*,+ hhHH $*,+`37*8$* $ ʁ*L} 遈 $ ƒ$5 ;8$+7 $ ʁ+ 0 遈 $ ƒ$ 5 ͉> L; 適 ; Lz)))8?@ $ =L=z $ = =7 $ ʁ $ =LАSLx|L|)Lx|8HhL~h L4|hL~hL~8Lx|z,L}LL|Y R  m L|z)lL|{"|ѩmLx| L| iL| i  ψ)L};L}=> ȹ3=L|=533L{3Lz v Lzz@{(I L{7Azȹ7zAȹ7zLf{@Ьzz0) , L{HH Ãhhz#?(7qmL|z) myL2L&zM'<ɠ5L!z5ȹɠ爄  P)? 適L 適A 適D 適S  3 Ã 7L} P()Lz=; L t L4 HLr6hmL|)9ȹ3.5         R DOS 3.3 MLX LOADER%31228<#"LOADING MLX...."P((4);"RUN MLX"X"G (C255)=:F18:CC2255(C127)V(F):CC255(C255)::DI(0):A$"":I1L:T(A16):A$("0123456789ABCDEF",A16T1,1)A$:AT::N"FROM ADDRESS ";:530:SAEAA0B0:XBS8((AS)8):b"DISK ERROR":150LDA RESULT+1:STA SA+1:STA PMEM+1d ; NOW ADJUST PRINTED ADDRESS (SA) UP BY 1 (LOWERED IN LINE 120) INC SA:BNE GETBYTE:INC SA+1 ;-------------- PULL IN A BYTE AND SEE IF IT IS A VALID OPCODE GETBYTE JSR STOPKEY:JSR GB:STA FILEN;(SAVE AS INDEX) PCMP #$8D; CARRIAGE RETURN( ZBEQ DMOH dLDY Y:STA LABEL,Y:JSR PRINT_ nINY:STY Y:JMP DTM0 xDMO LDX Y:DEX:DEC LABEL,X:LDY Y:LDA #0:STA LABEL,Y:JSR PRNTCR LDA #LABEL:STA TEMP+1:JSR VALDEC LDY RESULT:STY PMEM STY SA:  ; DIS -- DISASSEMBLER\LDA #DISMESS:STA TEMP+1:JSR PRNTMESS~(JSR PRNTCR:LDA #$3F:JSR PRINT2STARTDIS LDA #1:STA HXFLAG:LDY #0:STY Y<DTM0 LDA 49168; -- GET START ADDRESS (DECIMAL)FLOOPX LDA 49152:BPL LOOPX   !!! ! ! ! ! !!!!E" ";:d -- SYNTAX ERROR -- -SSSSSSSSPPSPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPNO START ADDRESS-------------------- BRANCH OUT OF RANGEUNDEFINED LABEL NAKED LABEL <<<<<<<< DISK ERROR >>>>>>>>  -- DUPLICATED LABEL -- Ȉ8aHh0!A$Pp"bBX(@x0123456789ABCDEF適H LLJ"L) -LL3, ,L0H0u C:?; ք7>LŽ) Ž -L>Ž3 :HL>0ÎL\H, Ã ,HL>) -Î: 9=hh);Lb}Lz)` $ ʁ83 9`` ,:( ; ,) 3L 3 ZL* 3 Z*L.... A)  `) HH hh3 3Bh/),; L t L, 3 3"E LLJTE 114 115 0 0 116 117 118 0 119 120 121 0 122 123 124 0r .BYTE 125 126 0 0 0 127 128 0 129 130 0 0 0 131 132 0 .BYTE 133 134 0 0 135 136 137 0 138 139 140 0 141 142 143 0 .BYTE 144 145 0 0 0 146 147 0 148 149 0 0 0 150 151 0 ;; ; 68 0 69 70 0 0 0 71 72 0L .BYTE 0 73 0 0 74 75 76 0 77 0 78 0 79 80 81 0 .BYTE 82 83 0 0 84 85 86 0 87 88 89 0 0 90 0 0 .BYTE 91 92 93 0 94 95 96 0 97 98 99 0 100 101 102 0 .BYTE 103 104 0 0 105 106 107 0 108 109 110 0 111 112 113 08 .BY 22 0 23 24 25 0 26 27 28 0M P.BYTE 29 30 0 0 0 31 32 0 33 34 0 0 0 35 36 0 Z.BYTE 37 38 0 0 0 39 40 0 41 42 43 0 44 45 46 0 d.BYTE 47 48 0 0 0 49 50 0 51 52 0 0 0 53 54 0 n.BYTE 55 56 0 0 0 57 58 0 59 60 61 0 62 63 64 0 x.BYTE 65 66 0 0 0 67 + ; "DTABLES" TABLES FOR DISASSEMBLER1;}; TABLE OF 256 POSSIBLE VALUES (SOME ARE VALID ADDRESSING MODES)(;2MTABLE .BYTE 1 2 0 0 0 3 4 0 5 6 7 0 0 8 9 0<.BYTE 10 11 0 0 0 12 13 0 14 15 0 0 0 16 17 0 F.BYTE 18 19 0 0 20 21!!!!""" " " " TIONAL CHARIN/DISK_DINCP1 STY Y:LDY #0:LDA (PMEM),Y:PHP:LDY Y:PLP:RTS; SAVE STATUS REGISTERDISMESS .BYTE "DISASSEMBLY START ADDRESS (DECIMAL)":.BYTE 0.FILE DTABLES :JSR INCSA:JSR INCSA:JSR INCSA:RTSUCOMX LDA #172:JSR PRINT:LDA #216:JSR PRINT:RTSCOMY LDA #172:JSR PRINT:LDA #217:JSR PRINT:RTSLEPAR LDA #168:JSR PRINT:RTSRIPAR LDA #169:JSR PRINT:RTSGB INC PMEM:BNE DINCP1:INC PMEM+1;REPLACES CONVENLLDONE; IND. JUMP (TYPE 10)_XALLDONE JSR PRNTCR:LDX BABFLAG:CPX #1:BCC ALLD1:PLA:PLA:JMP FINubALLD1 JMP GETBYTElDOONE JSR GB:TAX:LDA #0:JSR PRNTNUM:JSR INCSA:JSR INCSA:RTSvDOTWO JSR GB:PHA:JSR GB:TAX:LDA #0"JSR PRNTNUM:PLA:TAX:JSR PRNTNUM#$00:TAX:JSR PRNTNUMM&LDX WORK:JSR PRNTNUM:JSR INCSA:JSR INCSA:JMP ALLDONE0RELPL CLC:ADC SA:ADC #2:STA WORK:LDA #0:ADC SA+1:TAX:JSR PRNTNUMDLDX WORK:JSR PRNTNUM:JSR INCSA:JSR INCSA:JMP ALLDONENDJUMPIND JSR LEPAR:JSR DOTWO:JSR RIPAR:JMP A DOTWO:JSR COMX:JMP ALLDONE; ABSOLUTE X (TYPE 7)pDABSOLY JSR DOTWO:JSR COMY:JMP ALLDONE; ABSOLUTE Y (TYPE 8)DREL JSR GB:BPL RELPL; RELATIVE (TYPE 8)STA WORK:LDA #$FE:SEC:SBC WORK:STA WORK+1SEC:LDA SA:SBC WORK+1:STA WORKLDA SA+1:SBC ALLDONE; ZERO PG (TYPE 3)gDINDX JSR LEPAR:JSR DOONE:JSR COMX:JSR RIPAR:JMP ALLDONE; IND.X (TYPE 4)DINDY JSR LEPAR:JSR DOONE:JSR RIPAR:JSR COMY:JMP ALLDONE; IND. Y (TYPE 5)DZEROX JSR DOONE:JSR COMX:JMP ALLDONE; ZERO X (TYPE 6)0DABSOLX JSR#10:BEQ JDJUMPINDVJSR DOONE:JSR COMX:JMP ALLDONE; FALL-THROUGH TO TYPE 11 (ZERO,X)DIMMED LDA #"#:JSR PRINT:JSR DOONE:JMP ALLDONE; IMMEDIATE (TYPE 1)DABSOL JSR DOTWO:JMP ALLDONE:JDJUMPIND JMP DJUMPIND;ABSOLUTE (TYPE 2)DZERO JSR DOONE:JMP ETABLE,Y:BNE BRANCHES/hJSR INCSA:JMP ALLDONELrBRANCHES LDA TYPETABLE,Yb|CMP #1:BEQ DIMMEDCMP #2:BEQ DABSOL:CMP #3:BEQ DZERO:CMP #4:BEQ DINDX:CMP #5:BEQ DINDYCMP #6:BEQ DZEROX:CMP #7:BEQ DABSOLX:CMP #8:BEQ DABSOLY:CMP #9:BEQ DRELCMP STA PARRAY+1) ,JSR PRNTSA:JSR PRNTSPACEQ 6LDY #0:LDA (PARRAY),Y:JSR PRINT:INYr @LDA (PARRAY),Y:JSR PRINT:INY JLDA (PARRAY),Y:JSR PRINT:JSR PRNTSPACE TLDY FILEN:LDA MTABLE,Y; 0 MEANS NO ARGUMENT(INDIRECT OR ACCUMULATOR MODES)^TAY:DEY:LDA TYP:STA PARRAY:ROL PARRAY+1? ; MULTIPLY Y BY THREE LDA WORK:CLC:ADC PARRAY:STA PARRAY:LDA #0:ADC PARRAY+1:STA PARRAY+1 ; ADD THIS TO WORDTABLE CLC:LDA #WORDTABLE:ADC PARRAY+1:8 TAY:LDA MTABLE,Y:BNE DMORE:JSR PRNTSA:JSR PRNTSPACEg LDX FILEN:LDA #0:JSR PRNTNUM:JSR PRNTSPACE LDA #$3F:JSR PRINT:JSR INCSA:JMP ALLDONE; NOT A VALID OPCODE ; CONTINUE ON, FOUND A VALID OPCODE----- DMORE STA WORK:LDY #0:STY PARRAY+1:ASL    ALDXTAYLDATAXLDYLDALDXBCSLDALDYLDALDXCLVLDATSXLDYLDALDXCPYCMPCPYCMPDECINYCMPDEXCPYCMPDECBNECMPCMPDECCLDCMPCMPDECCPXSBCCPXSBCINCINXSBCNOPCPXSBCINCBEQSBCSBCINCSEDSBCSBCINC       PLORAORAASLCLCORAORAASLJSRANDBITANDROLPLPANDROLBITANDROLBMIANDANDROLSECANDANDROLRTIEOREORLSRPHAEORLSRJMPEORLSRBVCEOREORLSRCLIEOREORLSRRTSADCADCRORPLAADCRORJMPADCRORBVSADCADCRORSEIADCADCRORSTASTYSTASTXDEYTXASTYSTASTXBCCSTASTYSTASTXTYASTATXSSTALDYLDALDXLDYLD !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~XXXBRKORAORAASLPHPORAASLORAASLB 3 3".BYTE 3 0 1 0 2 2 2 9 5 6A.BYTE 6 11 0 8 0 7 7 8 1 4_.BYTE 3 3 3 0 1 0 2 2 2 9}&.BYTE 5 6 6 0 8 7 7 1 4 30.BYTE 3 3 0 1 0 2 2 2 9 5:.BYTE 6 6 0 8 7 7D.END DEFS O 0 2 2 9&.BYTE 5 6 6 0 8 7 7 2 4 3D.BYTE 3 3 0 1 0 2 2 2 9 5b.BYTE 6 6 0 8 7 7 0 4 3 3.BYTE 0 1 0 2 2 2 9 5 6 6.BYTE 0 8 7 7 0 4 3 3 0 1 0 10.BYTE 2 2 9 5 6 6 0 8 7 7 4 3 3.BYTE 3 0 0 2 2 2 9 5 6 6.BYTE 11 0 8 0 7 1 4 1MPLIED) (1 = IMMEDIATE) (2 = ABSOLUTE) (3 = ZERO PG.); (TYPE 4 = INDIRECT X ) (5 = INDIRECT Y) (6 = ZERO X) (7 = ABSOLUTE X); (TYPE 8 = ABSOLUTE Y ) (9 = RELATIVE); (TYPE 10 = JMP INDIRECT) (11 = ZERO Y);TYPETABLE .BYTE 0 4 3 3 0 1ATSXLDYLDALDXCPYCMPCPYCMPDECINYCMPDEXCPYCMPDECaJ.BYTE "BNECMPCMPDECCLDCMPCMPDECCPXSBCCPXSBCINCT.BYTE "INXSBCNOPCPXSBCINCBEQSBCSBCINCSEDSBCSBCINC^;h; TABLE OF MODE TYPES (TIED TO THE NUMBERS IN MTABLE ABOVE)r;5|; (TYPE 0 = IMPEORLSRBVCEOREORLSRCLIEORP .BYTE "EORLSRRTSADCADCRORPLAADCRORJMPADCRORBVSADC ".BYTE "ADCRORSEIADCADCRORSTASTYSTASTXDEYTXASTYSTA ,.BYTE "STXBCCSTASTYSTASTXTYASTATXSSTALDYLDALDX 6.BYTE "LDYLDALDXTAYLDATAXLDYLDALDXBCSLDALDYLDALDX.@.BYTE "CLVLD TABLE OF MNEMONICS (TIED TO THE NUMBERS IN TABLE ABOVE)A ; WORDTABLE .BYTE "XXXBRKORAORAASLPHPORAASLORAASLBPLORAORAASL .BYTE "CLCORAORAASLJSRANDBITANDROLPLPANDROLBIT .BYTE "ANDROLBMIANDANDROLSECANDANDROLRTIEOR .BYTE "EORLSRPHAEORLSRJ