JJJJ _ X_ p '       ,0,b   L Ơ͍ɠРÍҠҠàèĠР ԠˠԠ˺…$%L" `! 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  {#DIS'DTABLES &PSEUDOi6 &TABLES{ $$EVAL*lQ&INDISK$E%OPEN1 $LADS |{'RAMLADS %ARRAY8 ^&FINDMNCa%GETSAHx&VALDECL $MATHSV(PRINTOPSW *PROGRAM9.1 PROGRAMB.1#|*PROGRAMF.1 PROGRAMG.2%#MLX'$DEFS,&EQUATE0bPROGRAM4.1 <PROGRAM4.2h*PROGRAM6.1PROGRAM7.1*PROGRAM8.1 *PROGRAM8.29ML4BEGINNERS' "PROGRAMI.2PROGRAM2.1PROGRAM2.2 PROGRAM2.3 PROGRAM2.4 PROGRAM2.5 >dLԡm#i㰼m#iЕOLԡȱfg hi !dLԡ憦  Ljmkm l y`2 Lԡ8(Je稽)ʈ@LLnSOS BOOT 1.1 SOS.KERNEL SOS KRNLI/O ERRORFILE 'SOS.KERNEL' NOT FOUND%INVALID KERNEL FILE: xةw,@  ȱlmi8#)!)? &PRODOS `DaElH$?EGvѶK+`L HHLy XP LM ŠϠĠӠS)*+,+`F)) (*=GJFjJJA QE'+ '== `@ STSP8QSS8 m P o R(8RHE$"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:W015 *= $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 PBRANCH00,Y$ nINY; RAISE COUNTER BY 1J xBNE LOOP; IF NOT ZERO, KEEP GOINGR RTSf .END PROGRAM4.2  *= $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 $07INDICATE HEX WITH THE $ SYMBOL& s;: x.END PROGRAM4.1  *= $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 n;  ADDRESS768776 BYTE2ADDRESS,BYTE?(ADDRESS`2 24,169,2,105,5,141,80,3,96 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$"":30d COMPLETE BINARY TABLE.xX0255:X;:ZX:L7NQ07:T(X2)fK$(L)(48(XT2))wLL1:XT:QXZ10);I07:K$(I);:IXdd 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 :(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$ 400TARGET 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. .E;--------------------------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 OMPARE 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; E4 ; 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 C 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 W----------( 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;--------------- 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. LONGND PROGRAM6.1 ; 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 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 SAMP  *= 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 = 3,32! 32,237,169,160,32,2377 253,96,254,254,2 ,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,10,# 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,177;PRINTOUT JSR PLINE=LDA #$A0; THIS IS A BLANKfJSR PRINT; TO PRINT BETWEEN LINE #'SnRTS;-----------------------------;.END PROGRAM8.1 E 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 MATCHES.H 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;-----------------------------%; SUBROUTINOOP; 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 WITTINUE 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 COMPARENJMP LLE (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 CON$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 ; ;!"&()*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$;": ";:L&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":&  PRODOS MLX LOADER7 FOR USE TO TYPE IN LADSFI768I5R(A:I,AY2Ib<768vF(4);"RUN MLX"P 169,31,32,245,190,96L(XT2)) LL1:XT:Q) XZ:5);A I07:K$(I);:I:U X:(4);"PR#0"o : TRANSFORM TO HEX H$"":M101:N%DE(16M):DEDEN%16M H$H$(HE$,N%1,1):M H$" ";:DEX256 DE1000ĺ" ";:270 DE10000ĺ" "; DMZ(4)" PR# 1": CHANGE THIS TO MATCH THE LOCATION OF YOUR PRINTER CARDhdHE$"0123456789ABCDEF"unX1255xB2:C1zX10ĺ" ";:130|X100ĺ" ";X;" ";:DEX:240 CREATE BINARYZX:L7Q07:T(X2) K$(L)(48 LOADER FOR PRODOS ONLY-I768I59A:I,A@(II2768_<(4);"BRUN LADS"zF 169,31,32,245,190,96 IND 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 P #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; F--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) CM2+ 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)ĺ(/ ; "EQUATE" EVALUATE LABLE OF EQUATE TYPEq; COULD BE PC (ADDRESS) TYPE OR EQUATE TYPE. STORE IN ARRAY.; NAME/2-BYTE INTEGER VALUE/NAME/2-BYTE VALUE/ETC...;-------------(EQUATE LDY #255; PREPARE Y TO ZERO AT START OF LOOP$ 2EQ1 INY; $FDF0; OUTPUT ONE BYTET LINGET = $DA0C; GET LINE NUMBER FROM TXTPTR INTO LINNUM LININS = $D46A; INSERT BASIC LINE INTO BASIC TEXT SCREEN = $0400; ADDRESS OF 1ST BYTE OF SCREEN RAM "MLI = $BF00 ;PRODOS MACHINE LANGUAGE INTERFACE .FILE EVAL------- TOBASIC = $3D0; GO BACK TO BASICU BABUF = $0200; BASIC'S INPUT BUFFER KEYWDS = $D0D0; START OF KEYWORD TABLE IN BASIC OUTNUM = $ED24; PRINTS OUT A (MSB), X (LSB) NUMBER CSWD = $BE30; ADDRESS OF CHARACTER OUTPUT ROUTINE COUT = = 36; POSITION OF CURSOR ON A GIVEN SCREEN LINE.z ;--------------------- LADS INTERNAL ZERO PAGE EQUATES ----------- TEMP = $FB:SA = $FD:MEMTOP = $EB:PARRAY = $ED PARM = $2A:FMOP = $2C ;------------------ MACHINE SPECIFIC ROM EQUATES -----+-.YTE OF TEXT5 UFNAMELEN = $F9; LENGTH OF FILE NAME] ZCHRGET = $B1; GET NEXT BYTE OF TEXT _PRGEND = $AF; POINTER TO END OF PROGRAM dHIGHDS = $94; HIGH DESTINATION OF BLOCK TRANSFER UTILITY (BLTU) nVARTAB = $69; VARIABLE TABLE POINTER2 CURPOS  *= $7B00.D LADS".NO<(;APPLE PRODOS VERSIONb2; "DEFS" EQUATES AND DEFINITIONS<;--------------------- MACHINE SPECIFIC ZERO PAGE EQUATES -----------FBMEMTOP = $4C; BASIC'S TOP OF MEMORY POINTER PTXTPTR = $B8; POINTER TO NEXT B255)=: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":150: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):CC255(C13Ė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(F)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 K Y GOES TO ZERO 1ST TIME THRU LOOPQ <LDA LABEL,Y; LOOK AT THE WORD, THE LABEL FBEQ NOAR; END OF LINE (SO THERE'S A NAKED LABEL, NOTHING FOLLOWS IT) PCMP #32; FOUND A SPACE, SO RAISE Y BY 2 AND SET LABEL SIZE (LABSIZE) ZBNE EQ1; OTHERWISE, KEEP L/123456C ; "ARRAY" LOOKS THROUGH LABEL TABLE AND PUTS VALUE IN RESULT.k; (USED IN BOTH PASS 1 AND PASS 2)ARRAY LDA ARRAYTOP;PUT TOP-OF-ARRAY VALUE INTO THE DYNAMIC POINTER (PARRAY) (STA PARRAY; IN OTHER WORDS, MAKE PARRAY POINT TO THE HIGHEST WORD PULL OFF THE RTS (FROM EVAL) AND JUMP DIRECTLY TO INLINE4PLA; IGNORING ANY FURTHER EVALUATION OF THIS LINE SINCE EQUATE TYPE>JMP INLINE; LABELS ARE FOLLOWED BY NOTHING TO EVALUATEH.FILE ARRAY 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 PLA; ARE THREE CHARS. ( = ) BETWEEN LABEL & ARGUMENT, SOKINY; INY THRICE.STY WORK+1; POINT TO LOCATION OF ASCII NUMBER (IN LABEL BUFFER)LDA #LABEL 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; THEREBEL 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 MEMTOPNALYZED(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 #?@AAN 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+1UNDIT 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 THJSR 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;@FOMESSAGEVBEQ 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+164, BELOW VALUE)?JMP STARTLK; TRY ANOTHER WORD IN THE ARRAY\;-----------------------tADONE LDA FOUNDFLAGBMI AD1; DIDN'T FIND THE LABELRTS; ALL IS WELL. RETURN TO EVAL.AD1 LDA PASS BNE AD1X; 2ND PASS-- GO AHEAD AND PRINT ERROR WORDSSb;--------------------------- NO MATCH, SO LOOK AT NEXT WORD DOWN -----lSTARTOVER LDA PT; PUT PREVIOUS WORD'S START ADDR. INTO POINTERvSTA PARRAYLDA PT+1STA PARRAY+1JSR DECPAR; LOWER POINTER BY 1 (STARTLK WILL LOWER IT ALSOMP #48; OR THERE'S A MATCH IF IT'S A CHARACTER LOWER THAN ASCII 0 (,OR+)Z0BCC FOUNDIT:; NOT YET THE END OF THE "BUFFER" HELD LABELDINXNCMP (PARRAY),Y; IF ARRAY WORD STILL AGREES WITH BUFFER WORD, THENXBEQ LKM1; CONTINUE LOOKING AT THESE ON'T NEED TO RAISE Y IN ORDER TO IGNORE THEM6INYpJSR DECPAR; LOWER THE INDEX TO COMPENSATE FOR THE INYv;LKM1 INYLDA BUFFER,Y; CHECK BUFFER-HELD LABELBEQ FOUNDIT; IF WE'RE AT THE END OF THE WORD (0), THEN WE'VE FOUND A MATCHJ&C DOWN IN THE TABLE & FIND NEXT WORD.G;---------------------------qLKMORE INX; RAISE LENGTH COUNTER BY 1STX WORK+1; REMEMBER ITLDX #1LDA BUFLAG;THIS MEANS THAT # OR ( COME BEFORE THE NAME IN THE BUFFER.BEQ LKM1; IF THEY DON'T WE D'S STARTING LOCATION' rLDA PARRAY+14 |STA PT+1G LDA (PARRAY),Y CMP WORK; COMPARE THE 1ST LETTER WITH THE 1ST LETTER OF THE TARGET WORD BEQ LKMORE; LOOK MORE CLOSELY AT THE WORD, IF 1ST LETTER MATCHED&JMP STARTOVER; IF IT DIDN'T MATCH, GOHERWISE GO DOWN 1 BYTE IN ARRAY/ "BNE MDECX@ ,DEC PARRAY+1U 6MDECX DEC PARRAY @INX; INCREASE LABEL NAME SIZE COUNTER JJMP LPAR T;----------------------- ^FOUNDONE LDA PARRAY; WE'VE LOCATED A LABEL NAME IN THE ARRAY hSTA PT; REMEMBER ITC #2 STA PARRAY& LDA PARRAY+11 SBC #0B STA PARRAY+1M LDY #0m ;-------------------------- LPAR LDA (PARRAY),Y; LOOK FOR A 7TH BIT SET (START OF LABEL NAME) BMI FOUNDONE; IF YES, WE'VE GOT TO THE START OF A NAME.! LDA PARRAY; OTSBC PARRAY LDA MEMTOP+1/ SBC PARRAY+1u BCS ADONE; IF SO, CHECK IF WE FOUND THE LABEL (OR FOUND IT TWICE) LDX #0; SET LABEL NAME SIZE COUNTER TO ZERO SEC; GO DOWN 2 BYTES IN MEMORY (PAST THE INTEGER VALUE OF A LABEL) LDA PARRAY SBLLDA BYTFLAG8VBEQ CMPMO; IS IT > 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 LDA ADDNUMADC RESULT(STA RESULT9LDA ADDNUM+1JADC RESULT+1[STA RESULT+1AREND LDA PASS; ON 2ND PASS, DON'T CHECK FOR DUPSBEQ ARENXRTS; GO BACK TO EVALARENX JMP STARTOVER; ON PASS 1, LOOK FOR DUPS (SO CONTINUE IN ARRAY)H ; "GETSA" GET STARTING ADDRESS FROM DISK (LEAVES DISK POINTING AT-}; *= THIS SPACE (START ADDRESS); (EXPECTS FILE #1 TO BE ALREADY OPENED).(; ------------------------- 2GETSA LDX #1; SET UP INPUT CHANNEL FOR A DEVICE CODE|STY OPOEND JMP EVAR; MATCH FOUND SO JUMP TO EVAR ROUTINE IN EVAL_.FILE GETSA 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 OPP 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 DATA1; 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 CM 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 MOREBDEFF 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 dINY? ; "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 OnLDA #>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 #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 WRITE ONE OR YOU GAVE THE WRONST 4 BYTES...THEN------------------G nJSR CHARIN; PULL IN NEXT BYTEh 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 ADD----- 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): LDA CS 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;---------RTU 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 BH ; "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 LDATS.FILE INDISK ULTIPLY 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+1ROUTPUT) dJSR CHKIN3 nLDX OP; LOAD THE OPCODEM xJSR PRNTNUM; PRINT ITn JSR PRNTSPACE; PRINT A SPACE PRMX LDX OP;----------- NOW POKE THE OPCODE INTO RAM/DISK MEMORY JSR POKEIT RTS;---------------------------------------< ; PRINT TWO; 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)N 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>RTS)?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 I-----------------------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 AY 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;-----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 BRINT; 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 #1ADC 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 P;-------------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;----------------C&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+1BEQ 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'T E BYTES (THE OPCODE AND A 2-BYTE ARGUMENT)-----------------| "PRINT3 LDA PASS; ON PASS 2, SKIP INCSA (SEE LINE 20 ABOVE) ,BNE P3M 6JSR INCSA; RAISE PC BY 2 @JSR INCSA JRTS;-------------------- TP3M LDA SFLAG; SHOULE WE PRINT TO SCREEN ^BEQ P2MXS LDX RESULT; OTHERWISE PRINT THE LOW-BYTE OF "RESULT" (THE ARGUMENT)c JSR PRNTNUM P2MX LDX RESULT; AND ALSO POKE THE LOW-BYTE TO RAM/DISK MEMORY JMP POKEIT; A JMP TO POKEIT WILL RTS US BACK TO THE CALLER------------= ; PRINT THRE BYTES (THE OPCODE AND A 1-BYTE ARGUMENT)-----------------~ PRINT2 LDA PASS; ON PASS 2, WE SKIP INCSA (SEE LINE 20 ABOVE) BNE P2M JSR INCSA RTS;-------------------- P2M LDA SFLAG; IF SCREEN PRINT FLAG IS DOWN, SKIP PRINTING TO SCREEN 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;-------------------------------------------------p`PRNTCR LDA #13; PRINT A CARRIAGE RETURN~jJSR PRINTtJSR PTP; SHOULD WE DO IT ON THE PRINTER TOO~RTS;------------------------------------------------0PRNTLINE LDX LINEN; E (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 ITS 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 VALUG&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 HIGH BTOUTQ%; 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")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 PRIN #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$BNE 6"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 HEXPRINT !^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 PRINTER#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 CLRCHNO 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 LDX 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, D------------ 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<JSRLABEL; PRINT CONTENTS OF MAIN INPUTmSTA TEMP; BUFFER ("LABEL")LDA #>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 #<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 N INC PASS; RAISE PASS FROM PASS 1 TO PASS 2uLDA 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 FILENAINTLDA #32JSR PRINT.JSR CHARINlJSR 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 NECESSARY (TO END THE ENTIRE PROGRAM)INC ENDFLAG-PEND1RAM*LDX #0A4STX ENDFLAG; SET END OF PROGRAM FLAG TO ZEROI>RTSH;------------------------- HANDLE .END PSEUDO-OP ---------RPEND LDA #46; PRINT OUT .END\JSR PRINTfLDA #69pJSR PRINTzLDA #78JSR PRINTLDA #68JSR PRJSR 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 ENDPRO; CHECK FOR END OF PROG 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,OKING 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 MAINP 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 LOSSAGE (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?JMPSEE4 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 MENGL 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). O 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 LISTIhjklmnopqrstuvwxyEXT 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 TME PSEUDO-OP (OBJECT CODE FILE)]8PDISK 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'S A KEYWORD (WITHIN THE FILENAME) IF >127JBCC PDIXZJSR KEYWORDPDIX STA LABEL,Y; KEEP STORING FILENAME INTO PRINTOUT BUFFER (LABEL)STA FILEN,Y; AS WELL AS OPEN1 BUFFER (FILEN)INYJMP PDLOOP; KEEP STORING FILENAMEG; PUT HEXFLAG DOWNO$L JMP PULLINE; IGNORE REST OF LINE (AND RETURN TO EVAL)$V ;-------------------------- STOP SCREEN PRINTOUTS$` NIXSCREEN LDA #46; PRINT ".NS"$j JSR PRINT$t LDA #78; "N"$~ JSR PRINT$ LDA #83; "S"$ JSR PRINT%ETURN TO EVAL)S#;-------------------------- STOP HEX PRINTOUTS (START DECIMAL)s#NIXHEX LDA #46; PRINT ".NH"#JSR PRINT# LDA #78; "N"# JSR PRINT# LDA #72; "H"#$ JSR PRINT#. JSR PRNTCR; CARRIAGE RETURN#8 LDA #0$B STA HXFLAECT BYTES TO RAM1"NIXOP LDA #46; PRINT ".NO"?"JSR PRINTU"LDA #78; "N"c"JSR PRINTy"LDA #79; "O""JSR PRINT"JSR PRNTCR;CARRIAGE RETURN"LDA #0"STA POKEFLAG; TURN OFF POKE FLAG#JMP PULLINE; IGNORE REST OF LINE (AND RN OFF PRINTER!LDX #4)! JSR CHKOUT5!*LDA #13C!4JSR PRINTN!>LDA #4\!HJSR CLOSEk!RJSR CLRCHN!\LDX #1; RESTORE NORMAL I/O!fJSR CHKIN!pJMP PULLINE; IGNORE REST OF LINE (AND RETURN TO EVAL)"z;-------------------------- STOP POKING OBJ-------------- TURN OFF PRINTER OUTPUTT NIXPRINT LDA #46; PRINT ".NP" TO SCREENb JSR PRINTs LDA #78; "N" JSR PRINT LDA #80; "P" JSR PRINT JSR PRNTCR; CARRIAGE RETURN DEC PRINTFLAG; LOWER PRINT-TO-SCREEN FLAG! JSR CLRCHN; TURQ NIXPRINTGvCMP #79; IS IT ".NO" TO "NOT POKE OBJECT BYTES TO RAM"UBEQ NIXOPCMP #83; IS IT ".NS" TO "NOT PRINT TO SCREEN"BEQ NIXSCREENCMP #72; IS IT ".NH" TO "NOT PRINTOUT HEX" (THUS SWITCH TO DECIMAL)BEQ NIXHEX( ;---------------------------- HANDLE .N(SOMETHING),TURN-IT-OFF PSEUDO-OPSyDNIX LDA PASS; ON PASS 1, DON'T BOTHER WITH ANY OF THISNBEQ PULLINEXJSR CHARIN; ON PASS 2, SEE WHICH THING IS BEING TURNED OFFbCMP #80; IS IT ".NP" TO "NOT PRINT TO PRINTER" lBE------- HANDLE .O (POKE BYTES TO RAM) PSEUDO-OPLOPON LDA #46; PRINT .OZJSR PRINTkLDA #79; "O"yJSR PRINTJSR PRNTCR; CARRIAGE RETURNLDA #1&STA POKEFLAG; RAISE POKE-TO-RAM FLAG0JMP PULLINE; IGNORE REST OF LINE>:;----------NEITHER COLON NOR ZERO (SO PULL IN MORE CHARACTERS)LENDPULL JSR ENDPROpENDPULR PLA; PULL RTS OFF STACKxPLALDX #0STX ENDFLAG; SET ENDFLAG DOWNJMP STARTLINE; RETURN TO EVAL (TO GET NEXT LINE OF SOURCE CODE)1;------------------- RID OF REST OF A LINEXrPULLINE JSR CHARIN; IGNORE ALL BYTES, JUST LOCATE NEXT LINE|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)5JMP PULLINE; TO HEAR FROM COMPUTERb@INC PRINTFLAG; RAISE PRINTER OUTPUT FLAG (SO PRINT WILL SEND BYTES TOJJSR CLRCHN; THE PRINTER AS WELL AS THE SCREEN).TLDX #1; RESTORE NORMAL I/O^JSR CHKINh;---------------------- SUCTION ROUTINE. GETINE; AND RETURN TO EVAL TO GET NEXT LINEp;-------------------------- HANDLE .P (PRINTER) PSEUDO-OP -------"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 PRINTERR OPEN2; OPEN A SECOND DISK FILE (THIS ONE FOR WRITING TO)QEDISK JSR CLRCHNpLDX #1; RESTORE NORMAL I/O~JSR CHKINJSR ENDPRO; GET NEXT LINE NUMBERPLA; PULL RTSPLALDX #0STX ENDFLAG; RESET END OF PROGRAM FLAG*JMP STARTL;------------------SPULLJ JMP PULLINE;-------- SPRINGBOARD TO IGNORE FILENAMEhFPD1 STY FNAMELENPJSR PRNTINPUT; PRINT OUT THE LINEZJSR PRNTCR; CARRIAGE RETURNdINC DISKFLAG; RAISE DISKFLAG TO SHOW THAT FUTURE POKES SHOULD GO TO DISK<nJS JSR PRNTCR;CARRIAGE RETURN(% LDA #0U% STA SFLAG; PUT DOWN SCREEN PRINTOUT FLAG% 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 PRINTE& JSR PRNTCR; CARRIAGE RETURNq& LDA PASS; ON PASS 1, NO SCREEN PRINTOUT& BEQ SCREX& LDA #1; OTHERWISE, RAISE SCREEN PRINTOUT (LISTING) FLAG& STA SFLAG ' SCREX JMP PULLINE; IGNORE REST OF LINE (AND RETURN TSTART ADDRESS":.BYTE 0ZMBOR .BYTE "-------------------- BRANCH OUT OF RANGE":.BYTE 0NOLAB .BYTE "UNDEFINED LABEL":.BYTE 0NOARG .BYTE " NAKED LABEL":.BYTE 0MDISER .BYTE " <<<<<<<< DISK ERROR >>>>>>>> ":.BYTE 0-MDUPLAB .BRADD .BYTE 0 0;TEMPORARY REGISTER FOR DOUBLE ADDITIONrrVREND .BYTE 0; TEMP REG TO HOLD END OF PROGRAM COUNTER|TSTORE .BYTE 0 0; TEMPORARY REGISTER FOR MULTIPLY;---- MESSAGES TO PRINT TO SCREEN ---------------------------MNOSTART .BYTE "NO 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 0TNUBUF .BYTE 0 0 0 0 0 0 0^;----- REGISTERS USED BY VALDEC -------7h .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 0 6789ABCDEF"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 ,BUFFER232 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 "012345.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 198 z|}~CCMP* <.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  ; "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 "LDALDYJSRRTSBCSBEQBCREST OF LINE (AND RETURN TO EVAL)4(, .FILE TABLES O EVAL)O' ;-------------- HANDLE .H PSEUDO-OP (HEX NUMBERS DURING PRINTOUT)m' HEXIT LDA #46; PRINT ".H"{' JSR PRINT' LDA #72; "H"' JSR PRINT' JSR PRNTCR; CARRIAGE RETURN' LDA #1' STA HXFLAG; SET HEXFLAG UP#(" JMP PULLINE; IGNORE YTE " -- DUPLICATED LABEL -- ":.BYTE 0bMERROR .BYTE " -- SYNTAX ERROR -- ":.BYTE 0;----------- FLAGS, POINTERS, REGISTERS ---------------------OP .BYTE 0; OPCODETP .BYTE 0; TYPE TA .BYTE 0 0; START ADDRESS3LINEN .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; VALUE OF ARGUMENT0ARGSIZE .BYTE 0; LENGTH OF ARG: ; "EVAL" MAIN EVALUATION ROUTINE (SIMPLE ASSEMBLER);---------------------------------------------------------------SETUP JMP EDITSU; START THE WEDGESTART LDA #0(LDY #502STRTLP STA OP,Y; -- LOOP TO CLEAR FLAGS --<DEY F------------------".END DEFS 0 0 0 0 0 0 0 0 0YOPNI .BYTE 0; HOLDS THE FILE # OF THE CURRENT INPUT DEVICEOPNO .BYTE 0; HOLDS THE FILE # OF THE CURRENT OUTPUT DEVICEA1 .BYTE 0; TEMP STORAGE OF ACCY1 .BYTE 0; TEMP STORAGE OF Y-REG;--- 2 0 NAMEBUFF+1<OLINLIST .BYTE 2 0 56 145QDATABUFF .BYTE 0fNAMEBUFF .BYTE 0FILEN .BYTE 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.BYTE 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.BYTE 0 0 0 0 0 0 0BUFF 1 0 0 02RWLIST .BYTE 4 0 54 145 1 0 0 0t;INFOLIST .BYTE 7 NAMEBUFF $C3 6 0 0 0 0 0 0 0 0 0INFOLIST .BYTE 7 55 145 195 6 0 0 0 0 0 0 0 0 0;PREFLIST .BYTE 1 NAMEBUFFPREFLIST .BYTE 1 55 145;OLINLIST .BYTEAMEBUFF >NAMEBUFF $C3 6 0 0 1 0 0 0 0VaCRELIST .BYTE 7 55 145 195 6 0 0 1 0 0 0 0mfCLOSLIST .BYTE 1 0p;OPENLIST .BYTE 3 NAMEBUFF 0 0 0uOPENLIST .BYTE 3 55 145 0 0 0zSEOFLIST .BYTE 2 0 0 0 0;RWLIST .BYTE 4 0 DATA1 .BYTE 0; HOLDS THE CURRENT INPUT FILEcRFOPEN2 .BYTE 0; HOLDS THE CURRENT OUTPUT FILEW;------------ PRODOS MLI PARAMETER LISTS --------------------Y.BYTE 255; MARKERZ*= $9100; FIX LOCATIONS OF PARAMETER LISTS'\;CRELIST .BYTE 7 HAPPENED. DISKFLAG .BYTE 0; SHOWS TO SEND BYTES TO DISK OALYSIS5PASS .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-BYTEBNUMFLAG .BYTE 0; FOR .BYTE IN "INDISK"(BFLAG .ASIC'S TABLEBlLABSIZE .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 LABELS.BUFLAG .BYTE 0; AVOID # OR ( DURING ARRAYS ANUMENT6:EXPRESSF .BYTE 0; IS IT AN EXPRESS LABEL^DHEXFLAG .BYTE 0; HEX NUMBER FLAGNHEXLEN .BYTE 0; LENGTH OF HEX NUMBERXNUMSIZE .BYTE 0; LENGTH OF ASCII NUMBER IN BUFFER (FOR VALDEC)bKEYNUM .BYTE 0; POSITION OF KEYWORD IN BBNE STRTLP; --------c PLDA #START STA MEMTOP+1 STA BMEMTOP+1 STA ARRAYTOP+1;-------- LDA #1; -- SET TP1JMP JMP TP1; AND JUMP TO TYPE 1 (SINGLE BYTE TYPES)R;------------------$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 INREPLACE 3 WITH 1 IN TP (TYPE)*STA TPkLDA LABEL+3; IS THERE SOMETHING (NOT A ZERO) IN 4TH POSITIONBNE EVGO; EVGO = ARGUMENT (IF NOT, THERE'S NO ARGUMENT,IT'S IMPLIEDLDA #8; OTHERWISE, RAISE OP (OPCODE) BY 8CLCADC OPSTA OP:MOE4 JMP FINDMN; LOOK UP MNEMONIC (OR, NOT FINDING ONE, IT'S A LABEL)k; -------- EVALUATE ARGUMENT{EVAR LDA TPBEQ TP1JMP; CHECK TYPE, IF 1, NO ARGUMENTCMP #3; IF NOT TYPE 3, THEN CONTINUE EVALUATIONBNE EVGOLDA #1; OTHERWISE, INT LINE NUMBER0HJSR PRNTSPACE; PRINT SPACEqRJSR PRNTSA; PRINT PC (PROGRAM COUNTER)."SA" IS THE VARIABLE.\JSR PRNTSPACEfMX LDA PLUSFLAG; DO WE HAVE A + PSEUDO OPpBEQ MOE4; IF NOT SKIPzJSR MATH; IF SO, HANDLE IT IN SUBPROGRAM "MATH"IMOREEV JMP MOE4\MOREEV STY LOCFLAG; ZERO ADDRESS-TYPE LABEL FLAG (LIKE: LABEL INY) ; THIS IS FOR THE INLINE SUBROUTINE BELOW.*LDA SFLAG; SHOULD WE PRINT TO THE SCREEN4BEQ MX; IF NOT, SKIP THIS PART>JSR PRNTLINE; PRURCE CODELDA #0cSTA EXPRESSF; SET DOWN THE FLAG THAT SIGNALS A LABEL ARGUMENT LIKE LDA PSTA 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 T FOR EACH NEW LINE OF SOURCE CODE ----ySTARTLINE JSR STOPKEY:LDA ENDFLAG:BEQ EVIND:JMP FINI; END LADS ASSEMBLY IF; EITHER THE STOP (BREAK) KEY IS PRESSED OR IF THE ENDFLAG IS UP.; EVIND JSR INDISK; OTHERWISE GO TO PULL IN A LINE FROM SOTA TEMP+1QbJSR VALDEC; TURN ASCII NUMBER INTO A TWO-BYTE INTEGER IN "RESULT"lSTAR1 LDA RESULT; -- STORE OBJECT CODE'S STARTING ADDRESS IN SA,TA --vSTA SASTA TALDA RESULT+1STA SA+1STA TA+1*;---------------- ENTRY POINETURNV&CKHEX LDA HEXFLAG; IF START ADDRESS NUMBER IS HEX, IT'S ALREADY TRANSLATEDd0BNE STAR1:LDA #LABEL XST CARRIAGE RETURN= LDA #230; PRINT BLOCK GRAPHICS SYMBOLK JSR PRINTb LDA #76; Lp JSR PRINT LDA #65; A JSR PRINT LDA #68; D JSR PRINT LDA #83; S JSR PRINTJSR PRNTCR; ANOTHER CARRIAGE RSKFILE TO 1ST CHARACTER IN SOURCE CODE3 |LDA #0b STA ENDFLAG; SET LADS-IS-OVER FLAG TO DOWN JSR INDISK; GET A SINGLE LINE OF SOURCE CODE LDA PASS; IF 2ND PASS BNE STARTLINE; THEN JUMP OVER PRINTING OF LADS NAME JSR PRNTCR; PRININ FILE NAME BUFFER INYA JMP STM0; GET ANOTHER CHARACTERp TSTM1 STY 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 DIDEFAULTS --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; ONE SPACE AND I QUIT STM3 STA FILEN,Y; STORE CHARACTER THE ARRAY (VIA EQLAB1)bBEVX1 INY; BUT ON PASS 2, WE NEED TO DECIDE IF IT'S A PC ADDRESS TYPELLDA 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 THE8`STA FILEN,Y; LABEL NAME IN THE "FILEN" BUFFER. F WE FIND A 0, IT'SjCMP #32; A NAKED 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.6LL; AVOID HAVING THE ASCII TO INTEGER SUBROUTINE THINK THAT THE&0INC TEMP+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 (DELIMITE IS 1ST CHARACTER HIGHER THAN 48 (ASCII FOR THE NUMBER ZERO)J%CMP #48n%BCS MCAL; IF SO, SKIP THIS PART%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 MCA WHICH EVALUATES EXPRESSION (ARGUMENT) LABELS, "EVEXLAB"$; ---------- CALCULATE ARGUMENT'S VALUE (IF IT'S A DECIMAL NUMBER)$LDA #BUFFER$STA TEMP+1$LDY #0>%LDA BUFFER;REMEMBER NUMBER OF CHARACTERS IN ARGUMENTx#LDA HEXFLAG; IF IT'S HEX, 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;" BUFFERG"JLDA LABEL+4,Y; LOOP TO MOVE THE ARGUMENT INTO THE BUFFER"TBEQ EVMO3; EVMO3 TAKES OVER AFTER END OF ARGUMENT IS REACHED"^STA BUFFER,Y"hJMP EVMO2; RETURN FOR MORE ARGUMENT CHARACTERS."r;---------------"|EVMO3 DEY+#STY ARGSIZE; ; IF ZERO, WE'RE AT THE END SO MOVE ONU!STA BUFFER,Y; OTHERWISE, STORE 2ND CHAR.!"CMP #65; IF LOWER THAN 65, DON'T RAISE LABEL-ARGUMENT FLAG!,BCC EVMO2!6INC EXPRESSF; IF HIGHER, DO RAISE IT "@EVMO2 INY; NOW MOVE REST OF ARGUMENT UP TO "BUFFER FOR "A") THEN IT'S A NUMBER- BCC EVMO2Ao INC EXPRESSF; >65 = ALPHABETIC ARG (LABEL) SO RAISE THIS FLAG EVMO2A STA BUFFER,Y; STORE 1ST CHAR. OF ARGUMENT IN "BUFFER" BUFFER INY LDA LABEL+4,Y; LOOK AT 2ND CHAR. IN THE ARGUMENT(!BEQ EVMO3(AFTER VALUE IS IN "RESULT")R;--------------- IS ARGUMENT NUMERIC OR A LABELbEVGO LDY #0STY EXPRESSF; TURN OFF THE "IT'S A LABEL" FLAGLDA LABEL+4,Y; CHECK 5TH CHAR. (LDA NAME OR LDA 25) (THE "N" OR "2") CMP #65; IF LESS THAN 65 (ASCIIE THEM)UEVE1 EOR #$80; SET 7TH BIT IN 1ST CHAR. (TO MATCH ARRAY STORAGE METHOD)STA WORK; SAVE IT HERE TEMPORARILY TO COMPARE WITH ARRAY WORDSJSR ARRAY; EVAL. EXPRESSION LABEL, SHIFTED 1ST CHAR.JMP L340; THEN CONTINUE ON WITH EVALUATION NUMBERSHPEVEXLAB LDA BUFFER; IS THIS 1ST CHARACTER ALPHABETIC (>64)TZCMP #64dBCS EVE1; IF SO, GO DOWN TO FIND ITS VALUE.nLDA BUFFER+1; IF NOT, IT MUST HAVE BEEN A ( OR # SYMBOL xINC BUFLAG; TO TELL ARRAY THAT ( OR # WAS FOUND (AND TO IGNOR CONTINUE EVALUATION`(GONOAR JSR NOAR; PRINT NO ARGUMENT MESSAGE (A SPRINGBOARD);----------2EQLAB1 JSR EQUATE; PUT LABEL AND IT'S VALUE INTO THE ARRAY (PASS 1)<JMP MOE4; CONTINUE EVALUATION F;------------------ TRANSLATE ARGUMENT LABELS INTO EVX4; ANALYSIS (0 DELIMITER HERE)iSTA LABEL,X; WE CAN IGNORE THE PC LABEL (THIS IS PASS 2), BUT WEINX; NEED TO EVALUATE THE REST OF THE LINE FOLLOWING THAT LABEL.INY JMP EVX5;-------------------EVX4 STA LABEL,XJMP MOE4; JUMP TOS TYPE OF LABEL ON SCREEN/PRINTER)iTXA; PUT A ZERO IN AT THE END OF THE LABEL NAME (AS A DELIMITER)STA 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 FURTHER$BEQDA LABEL,Y; WE RAISE Y BY 1 AND CHECK FOR AN = SIGN.CCMP #$3DBNE 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 #0$STX LOCFLAG;(SHOWS PRINTOUT TO DO THIR) OR1'NCMP #41; WITH A ) LEFT PARENTHESIS OR?'XBEQ MCAL1l'bCMP #44; WITH A , COMMA (AS IN: 15,Y) ORz'lBEQ MCAL1'qCMP #32; WITH BLANK SPACE (AS IN: #15 ;COMMENT)'sBEQ MCAL1(vINY; IF WE'VE NOT YET FOUND ONE OF THESE 4 THINGS, CONTINUE LOOKING/(JMP MCAL;----------------------------O(MCAL1 PHA; SAVE ACCUMULATORW(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),YC)JSR VA THE JUMP-HANDLING ROUTINE.----------o6, MEV LDA RESULT+1; IF HIGH BYTE OF RESULT ISN'T ZERO (ZERO PG. ADDR)66 BNE PREPTHREES; THEN GO TO THE 3-BYTE INSTRUCTIONS (LINE 400)6@ LDA TP; OTHERWISE, IT'S ZERO PAGE MODE6E CMP #9:BEQ PREPTHREES67J CMP #6;NDLING ROUTINE5 INY^5 JMP XYTYPE; OTHERWISE, IT MUST BE A ,X OR ,Y TYPE;---------------5 JJUMP LDA OP; HANDLE JMP MNEMONIC5 CMP #76; IF THE OPCODE ISN'T 76, IT'S NOT A JUMP5 BNE MEV; SO LOOK FOR SOMETHING ELSE'6" JMP JUMP; NOW SPRINGBOARD TOD4 ;------------------------------- CONTINUE ADDR. MODE ANALYSISZ4 EVMO5 LDY ARGSIZEb4 DEY4 LDA BUFFER,Y; LOOK AT LAST CHARACTER OF ARGUMENT4 CMP #44; IF IT'S NOT A COMMA, THEN THIS MUST BE A JUMP INSTRUCTION5 BNE JJUMP; SO GO TO THE JUMP-HATHE FACT THAT BRANCHES ARE CALCULATED FROM THEv3 STA RESULT; INSTRUCTION FOLLOWING THEM: BNE LOOP:LDA 15 WOULD BE3 LDA #0; CALCULATED FROM THE PC OF THE LDA 153 STA RESULT+14 JMP TWOS; NOW GO TO THE 2-BYTE PRINT/POKE (WITH CORRECT ARGUMENT)REL CONCLUSION ROUTINEM22 FOR BEQ MPXS1; CHECK FORWARD BRANCH OUT OF RANGEU2< PLAd2F JMP DOBERRr2P MPXS1 PLA2Z BPL RELM; WITHIN RANGE----------------2d BERR JMP DOBERR; PRINT "BRANCH OUT OF RANGE" ERROR MESSAGE2n RELM SEC03 SBC #2; CORRECT FOR BCS FOR; IF ARGUMENT > CURRENT PC, THEN IT'S A BRANCH FORWARDL1 CMP #$FFY1 BEQ MPXSa1 PLAp1 JMP DOBERR1 MPXS PLA; OTHERWISE, CHECK FOR OUT OF RANGE BRANCH ATTEMPT1 BPL BERR; OUT OF RANGE (PRINT ERROR MESSAGE "BERR")2( JMP RELM; AND JUMP TO YPESG0t REL LDA PASS; ON PASS 1, DON'T BOTHER, JUST INCREASE PC BY 2T0~ BNE MRELa0 JMP TWOS0 MREL SEC; ON PASS 2, SUBTRACT PC FROM ARGUMENT TO GET REL. BRANCH0 LDA RESULT0 SBC SA0 PHA; SAVE LOW BYTE ANSWER0 LDA RESULT+10 SBC SA+1?1 #66/L BEQ JJUMP; SO GO TO THE JUMP-HANDLING ROUTINE/V JMP TWOS; OTHERWISE, IT MUST BE A 2-BYTE TYPE SO PRINT/POKE IT.;-------/` JIMMED JMP IMMED; SPRINGBOARD TO IMMEDIATE MODE TYPES.0j ;------------------------------- HANDLE RELATIVE ADDRESS (BNE) TMP #41; IS IT A ")" LEFT PARENTHESISO.BEQ MINDIR; IF SO, HANDLE THAT TYPE.Z.LDA TP.CMP #1; IF TYPE 1, ADD 16 AT THIS POINT TO OPCODE. BNE MINDIR. LDA #16. CLC.$ ADC OP.. STA OP.8 MINDIR LDA TP; TYPE 6 IS A JUMP INSTRUCTION/B CMP BNE EVMO5-LDA #8-CLC*-ADC OP5-STA OPy-JMP TP1; AND JUMP TO THE SINGLE BYTE TYPES (IMPLIED ADDRESSING)-INDIR LDY ARGSIZE; HANDLE INDIRECT ADDRESSING--------------------LDA BUFFER,Y; LOOK AT THE LAST CHARACTER IN THE ARGUMENT.&.CP #40; IS IT A "(" LEFT PARENTHESIS. IF SO, GO TO INDIRECT ADDR.Q,\BEQ INDIR,fLDA TP; IS IT A RELATIVE ADDR. MODE (LIKE BNE, BEQ).,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 -,8,16, OR 24 TO AN "OP" IS BASED ON THEIRZ+ ; RELATIONSHIPS WITHIN THE OPCODE TABLE).`+*;+4L340 LDA BUFFER; 1ST CHAR. OF THE ARGUMENT (THE "#" IN LDA #15)+>CMP #35+HBEQ JIMMED; # SYMBOL FOUND (SO IMMEDIATE MODE). BRANCH TO SPRINGBOARDC,RCMDDRESSING MODET*; (THIS ESSENTIALLY AMOUNTS TO MODIFYING THE ORIGINAL OPCODE TO*; REFLECT THE CORRECT ADDRESSING MODE. ADJUSTMENTS TO THE OPCODE "OP"* ; APPEAR FROM HERE ON RATHER FREQUENTLY. THEIR LOGIC WILL NOT BE++; EXPLAINED. DDING 4LDEC;GO TO THE ASCII-NUMBER-TO-INTEGER-NUMBER-IN-"RESULT" ROUTINEj)PLA; RESTORE THE A AND Y REGISTERSr)TAYz)PLA)STA (TEMP),Y; RESTORE A "," OR ")" TO THE BUFFER (FOR THE ADDR. ANALYSIS)*;--------------- ANALYZE THE ARGUMENT TO DETERMINE A IF HIGHER THAN TYPE 6, IT'S AN ORDINARY 2-BYTE TYPEQ7T BCS TWOS; SO GO THERE.w7^ CMP #2; IF TYPE 2, ALSO GO THERE.7h BEQ TWOS7r LDA #4; OTHERWISE, ADD 4 TO OPCODE AND FALL THROUGH INTO TWO-BYTE TYPE7| CLC7 ADC OP7 STA OP.8 ;------------------------------- 2 BYTE TYPES (LIKE LDA 12)U8 TWOS JSR FORMAT; PRINT/POKE OPCODE~8 JSR PRINT2; THEN PRINT/POKE ARGUMENT8 JMP INLINE; AND FINALLY PREPARE TO FETCH NEW LINE OF SOURCECODE (2000)8 ;------------------------------- HANDLE JMP-9 JUM62; PRINT > FPRMO JSR PRINTZFJSR PTP1; PRINT > OR <. PTP1 IS TO PRINTER----------FPRXM LDA BABFLAG; IS THERE ANY COMMENT TO PRINT (SOMETHING FOLLOWING ;)FBEQ RETTX; IF NOT, SKIP THIS.G"JSR PRNTSPACE; PRINT A SPACE--------PRINT COMMENTS FIION TO 30LEJSR PRNTINPUT; PRINT MAIN INPUT BUFFER (BULK OF SOURCE LINE)ELDA BYTFLAG; IS THERE A < OR > PSEUDO-OP TO PRINT --------------EBEQ PRXM; HANDLE < AND >ECMP #1; 1 IN BYTFLAG MEANS <EBNE MO5ELDA #60EJMP PRMO FMO5 LDA #INTER FOR FORMATTING--------&DxDEYSDBNE PRMLOPX; PRINT MORE BLANKS----------{DPXMX JSR CLRCHN; RESTORE NORMAL I/ODLDX #1DJSR CHKIN;-------------------------------------------------DPRMMFIN LDA #30 ESTA CURPOS; SET SCREEN CURSOR POSITE PRINTERCBEQ PRMMFINKC(JSR CLRCHN; ALERT PRINTER TO RECEIVE BLANKSVC2LDX #4eC<JSR CHKOUToCFLDY XCPBEQ PXMX; HANDLE NO BLANKS (IGNORE)CZBMI PXMX; HANDLE TOO MANY BLANKS (>127) (IGNORE)CdLDA #32DnPRMLOPX JSR PRINT; PRINT BLANKS TO PRBSTA TEMP+1ABJSR PRNTMESS; PRINT LOCATION LABEL;----------pBPRMMX1 LDA #30; MOVE CURSOR TO 30TH COLUMNxBSECBSBC CURPOSBSTA X; SAVE OFFSET FROM CURRENT POSITION (30-POSITION) FOR PRINTER CLDA PRINTFLAG; DO WE NEED TO PRINT BLANKS TO THTO PRINTER;---------------?AtJSR CLRCHN; RESTORE NORMAL I/OJA~LDX #1XAJSR CHKINAPRMM LDA #20; PUT 20 INTO CURRENT SCREEN CURSOR POSITIONASTA CURPOSALDA #FILENHE SCREEN;@JSR CLRCHN; PREPARE PRINTER TO PRINT BLANKSF@LDX #4U@JSR CHKOUT_@$LDY Am@.BPL PRXM1x@8LDY #2@BJMP PRMLOP@LPRXM1 LDA #32@VPRMLOP JSR PRINT;---------------- PRINT BLANKS TO PRINTER@`DEYAjBNE PRMLOP; PRINT MORE BLANKS ; ANY PC ADDRESS LABEL TO PRINT]? BNE PRMMX1; NO LOC TO PRINT (RVS FLAG USAGE, FOR SPEED)? LDA PRINTFLAG; PRINT TO PRINTER? BEQ PRMM? LDA #20? SEC? SBC CURPOS; SUBTRACT CURRENT CURSOR POSITION @ STA A; MOVE THE CURSOR TO 20TH COLUMN ON TNE:>p ;PRINT MAIN INPUT AND COMMENTS, THEN TO STARTLINE|>z INLINE LDA PASS; ON PASS 1, IGNORE THIS WHOLE PRINTOUT THING.> BNE NLOX1> JMP JST> NLOX1 LDA SFLAG; LIKEWISE, IF SCREENFLAG IS DOWN, IGNORE.> BNE NLOX> JMP JST!? NLOX LDA LOCFLAGP= JMP THREES!= PT1 CMP #60= BCS THREES;=* LDA OPC=4 CLCO=> ADC #12Z=H STA OP=R THREES JSR FORMAT; PRINT/POKE OPCODE=\ JSR PRINT3; PRINT/POKE 2 BYTES OF THE ARGUMENT (3000)>f ;------------------------------------- PREPARE TO GET A NEW LIO ARGUMENT(< JMP INLINE; (LINE 1000)Z< ;------------------------------- 3 BYTE TYPES< PREPTHREES LDA TP; SEVERAL OPCODE ADJUSTMENTS (BASED ON TYPE)< CMP #2< BEQ PTT< CMP #7; (LINE 430)< BNE PT1< PTT LDA OP< CLC< ADC #8= STA OSTA RESULT;N IMMEDX LDA TP);X CMP #1h;b BNE TWOS; IF IT'S TYPE 1, ADJUST OPCODE BY ADDING 8 TO IT.s;l LDA #8;v CLC:ADC OP:STA OP; JMP TWOS; ;------------------------------- 1 BYTE TYPES < TP1 JSR FORMAT; JUST POKE OPCODE FOR THESE, THERE'S NTE INSTRUCTIONS: ;------------------------------- IMMEDIATE ADDRESSING (# TYPE)j: IMMED LDA BUFFER+1:& CMP #""; IS THIS A CHARACTER LOAD PSEUDO-OP LIKE: LDA #"A:0 BNE IMMEDX:: LDA BUFFER+2; IF SO, PUT THE ASCII CHAR. INTO "RESULT" (ARGUMENT) ;D P LDY ARGSIZE; IS IT JMP 1500 OR JMP (1500)p9 LDA BUFFER,Y; A ")" AT THE END PROVES IT'S AN INDIRECT JUMP SO|9 CMP #419 BNE JUMO9 LDA #108; WE MUST CHANGE THE OPCODE FROM 76 TO 1089 STA OP: JUMO JMP THREES; TREAT IT AS A NORMAL 3-BYELD----------.G,LDA #59; PRINT A SEMICOLONBABUFG^STA TEMP+1GhJSR PRNTMESS; PRINT WHAT'S IN THE COMMENTS BUFFERHrRETTX JSR PRNTCR; PRINT CARRIAGE RETURNGH|LDA ENDFLAG; IF ENDFLAG IS UP, JUMP TO THE SHUTDOWN ROUTINETHBNE FINIHJST JMP STARTLINE; OTHERWISE GO BACK UP TO GET THE NEXT SOURCE LINE.H;------------------------------------- THE END OF A PASS (1 OR 2)HFINI LDA PASS(IBNE FIN; THE RTS ADDRESS (TO KEEP THE STACK INTACT)5VTAX=VPLAEVTAYMVTYAUVPHA]VTXAeVPHAmVTYAV&JSR OUTNUM; PRINT THE PC ADDRESS.V0LDA A; RESTORE THE REGISTERS.V:LDY YVDLDX XVNRTSVX;-------------------------->WbCLEANLAB LDY A "JSR P" INTO YOUR SOURCE CODE, THIS ROUTINEdUSTY Y; WILL PRINT THE PC FROM WHICH YOU JSR'ED.USTX X; AFTER AN RTS, THIS WILL REVEAL THE JSR ADDR.ULDA #$BA; PRINT A GRAPHICS SYMBOL TO SIGNAL THAT THE PC IS TO FOLLOWUJSR PRINT-VPLA; SAVET6L800 LDA #$33T@JSR P+TJJMP L700RBNE L780; NOT ZERO PAGENRL730 LDA TPYRCMP #2fRBNE L740rRLDA #16zRCLCRADC OPR STA OPRJMP TWOSRL740 CMP #1R(BEQ L759R2CMP #3R<BEQ L759RFCMP #5RPBEQ L759RZL750 LDA #$32SdJTEMP" TO SYNTAX ERROR MESSAGE,Q~STA TEMP=QLDA #>MERRORLQSTA TEMP+1pQJSR PRNTMESS; PRINT THE MESSAGEQJMP INLINE; GO TO THE GET-THE-NEXT-LINE ROUTINEQ;------------------------------ CONTINUE ANALYSIS OF ADDR. MODE"RL720 LDA RESULT+1; MA0P$M6 LDA OPP.CLC%P8ADC #280PBSTA OP?PLJMP THREESPV;----------- PRINT A SYNTAX ERROR MESSAGE ------------------P`L700 JSR ERRING; RING ERROR BELL AND TURN ON REVERSE CHARACTERSPjJSR PRNTLINE; PRINT LINE NUMBERQtLDA #ZEROY LDA RESULT+1; CHECK HIGH BYTE OF RESULT (ZERO PG. OR NOT)NHBNE L680; ZERO Y TYPEORLDA TP; ADJUST OPCODE-------------------------------- ,X OR ,Y ADDRESSING TYPEtMXYTYPE LDA BUFFER,Y; LOOK AT LAST CHAR. IN ARGUMENTMCMP #88; IS IT AN XMBEQ L720MDEY; OTHERWISE, LOOK AT THE 3RD CHAR. FROM END OF ARGUMENTM DEYNLDA BUFFER,Y; IS IT A ")" LEFURN TO BASICGLvJSR CLRCHN; OTHERWISE SHUT DOWN PRINTER, GRACEFULLY.RLLDX #4aLJSR CHKOUTLLDA #13; BY PRINTING A CARRIAGE RETURNLJSR PRINTLJSR CLRCHNLLDA #4LJSR CLOSELFINFIN JMP TOBASIC; RETURN TO BASICL;MBORXSTA TEMP+1XJSR PRNTMESS; PRINT THE MESSAGEXJSR PRNTCR; PRINT A CARRIAGE RETURN ANDBY JEVALUATESTA 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 COMPUX1 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 TO T 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---------------------,ENT)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 NO(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 COMMD 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 SEMICOLON 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; FOUNOF 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( COOLOOKOVE 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 BYTE L 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, REM1 ; "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 LABEMP TWOS; BUNGLE AS AN ORDINARY 2-BYTE EVENT (TO KEEP PC CORRECT)ZY;------------------kY .FILE EQUATEMENT0LDY 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 BUFFERlINYDvJMP 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 FO-OP (CHANGE THE PC)M"LDA PASS; ON PASS 1, DON'T PRINT OUT DATA TO SCREEN["BEQ STARNp"LDA #42; PRINT *~"JSR PRINT"JSR PRNTINPUT; PRINT STRING IN LABEL BUFFER"JSR PRNTCR; PRINT CARRIAGE RETURN#STARN LDA HEXFLAG; IF HEX, THE ARGUMENT HBYTE TYPE PUTS HIGH BYTE OF PC INTO RESULT;!dSTA RESULT!nJMP STINDISK; AND RETURN FOR NEXT CHAR.------------------------!xSTARLO LDA SA!STA RESULT!JMP STINDISK; WAS LDA #<* TYPE --------"STARM JSR STINDISK;------------- HANDLE *= PSEUDO------------ HANDLE *> 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; HIGH TE 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,Y;- 0 = LINE DOESN'T CONTAIN A > 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; EQUA>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 BYTFLAG;T-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' BUFFERINYD 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 STARTRINGIKEYWORD 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; ANTTING 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 ASCII S 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 SECOMO 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 AN------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 +*R 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---AS 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 #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 GO #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 INDEX93ESULT; 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` SBCVES 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 ASL RDI;----------------- 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 (MOF 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 MOINN-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 OOR 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)-fINYFERENT 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 BUFFER FOF 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 "DIFRN 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; END #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 RETUPY #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@(bLDA &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 '&CT 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 SA+1 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. (.BYTE 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; NA 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 END P 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; OTHERWISE,UFM; 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> JM 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 BLDA 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; SEMICOLON 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(> WERK1  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 INTO 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 PSLOOP <(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 BABFLAG=;R 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 LINE 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 FOOUR 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; PULL NE 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 REGISTER (ME 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 .BYTE6 BLINE);---------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 (OR 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 (POKEIT R.BYTE 195 33 145 RTSB OPEN4 LDA #0; SETUP CARD IN SLOT1d LDX $36; SAVE OLD OUTPUT LINKp STA $36} LDA #$C1 LDY $37 STA $37 LDA #$8A:JSR $FDED; SEND LINE FEED LDA #$50:STA $579; SET LINE LEN TO 80 COLUMNS LDA $36 STA2 STA SEOFLIST+16 JSR MLI ;ERASE OLD CONTENTSY ;.BYTE $D0 SEOFLISTn .BYTE 208 20 145y LDA TA STA INFOLIST+5 LDA TA+1 STA INFOLIST+6 JSR MLI; PUT START ADDRESS IN AUX FILE TYPE ;.BYTE $C3 INFOLIST ;OPEN INPUT FILE+ OPEN1 JSR CLRCHNRLDA #1; CLOSE FILE IF ALREADY OPEN`JSR CLOSE(LDA #$92; BUFFER1 AT $92002JSR OPENFILE<STA FOPEN1dRTSi; OPEN OUTPUT FILEnOPEN2 LDA #$96; BUFFER2 AT $9600xJSR OPENFILE STA FOPENM.FILE MATHTEAD 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;------------------ 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; INSJSR 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 #1;SR 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"JBJECT 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+IdJNT 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 DISK OSTA 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 PRIAISES 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 ENDPROAFBEN1 PBYTE+1; SET PRINTING ADDRESSA STX $36; RESTORE OUTPUT LINKM STY $37U RTSy ; READ ONE BYTE FROM INPUT FILE RDBYTE LDA FOPEN1 STA RWLIST+1 JSR MLI ;.BYTE $CA RWLIST .BYTE 202 25 145 LDA DATABUFF RTS '; WRITE ONE BYTE TO OUTPUT FILE5 ,WRBYTE STA DATABUFFD 6LDA FOPEN2U @STA RWLIST+1a JJSR MLI T;.BYTE $CB RWLIST Y.BYTE 203 25 145 ^RTS m; CLOSE INPUT FILE rCLOSE1 LDA FOPEN1; CHECK TO SEE IF INPUT FILE IS OPEN |BEQ NOCLOSE; IF$-;.BYTE $C5 OLINLIST9..BYTE 197 50 145T/LDA NAMEBUFF+1:AND #$Fd0TAY:INY:INY|1LDA #$2F; ADD "/"'S2STY NAMEBUFF3STA NAMEBUFF+14STA NAMEBUFF,Y5JSR MLI; MAKE IT PREFIX6;.BYTE $C6 PREFLIST7.BYTE 198 4FIX?)";.BYTE $C7 PREFLIST>#.BYTE 199 47 145O$LDA NAMEBUFFf%BNE GOASSM; IS ONE&LDA $BE3C:ASL:ASL:ASL:ASL'LDY $BE3D; DEFAULT DRIVE(CPY #1)BEQ SLOT1*ORA #$80+SLOT1 STA OLINLIST+1,JSR MLI; FIND NAME OF VOLUMENAME TO TOP OF SCREEN"CMP #0.BEQ ASM;ORA #$80JSTA $400,YRINYaJMP TFRNAMASM LDA #$A0; PUT FOLLOWING 3 SPACESSTA $400,YSTA $401,Y STA $402,YPLA; PULL RETURN ADDRESS AND JUMP TO START PLA!JSR MLI; IS PRE BCS OUT!JMP INSLIN<&OUT LDA $200; IS IT "ASM "?H0CMP #65U:BNE OUT1bDLDA $201nNCMP #83{XBNE OUT1bLDA $202lCMP #77vBNE OUT1LDA $203CMP #32BNE OUT1; NO, EXITLDY #0; YESTFRNAM LDA $204,Y; TRANSFER PTRBNE OUTLDA #02.CMP TXTPTR+1DBNE OUT; NO, EXITOLDY #0NXTCHR LDA (TXTPTR),Y; IGNORE LEADING SPACESCMP #32BNE ISLNUMINC TXTPTRJMP NXTCHRISLNUM CMP #$2F; IS IT A NUMBER?BCC OUT; NO, EXITCMP #$3AFILESCLOSE CMP #018BNE CL2; CLOSE INPUT FILE?G"JMP CLOSE1o,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 TXTUMJMP CTOUT<; CLOSE ALL INPUT AND OUTPUT CHANNELSOCLRCHN LDA #00\STA OPNOiSTA OPNIyLDA #PRINTSTA CSWD+1RTS;CHECK FOR STOP KEYSTOPKEY LDA $C000CMP #$83RTS ; CLOSE OPEN 2%ZLDA A1; YES, PRINT TO PRINTER2_ORA #$80FdPBYTE JSR $C100TnJMP CTOUTxNXT2 LDA PRINTFLAG; NO, MUST BE TO SCREENzBNE RPRINTING; CARD DOES IT FOR US IF WE'RE PRINTING|LDA A1ORA #$80JSR COUTRPRINTING LDA A1; RESTORE ACCENTLY OPEN CHANNEL/PRINT STY Y1; SAVE REG:STA A1gLDA OPNO; CHECK TO SEE IF TO OUTPUT FILEsCMP #02BNE NXT1LDA A1; YES, WRITE THE BYTEJSR WRBYTEJMP CTOUT<NXT1 LDA OPNO; CHECK TO SEE IF TO PRINTERFCMP #4PBNE NXTLY OPEN CHANNEL#CHARIN STY Y1=STX X; SAVE X & Y REGi$LDA OPNI; CHECK TO SEE IF INPUT CHANNELt.CMP #18BNE CTOUT; IF NOT EXITBJSR RDBYTELPHPVLDY Y1`LDX XjPLPtRTS~CTOUT LDY Y1RTS; OUTPUT ONE BYTE TO CURR.BYTE 192 0 145&JMP ATTOPENROPENSUCC LDA OPENLIST+5 ;RETURN FILE IDZRTSz; SET CURRENT INPUT CHANNELCHKIN STX OPNIRTS; SET CURRENT OUTPUT CHANNELCHKOUT TXASTA OPNOCHKOUTO RTS ; GET ONE BYTE FROM CURRENTDOPENFILE STA OPENLIST+4,NLDA FNAMELEN=XSTA NAMEBUFFQATTOPEN JSR MLIt;.BYTE $C8 OPENLIST.BYTE 200 14 145BCC OPENSUCC ;IF FILE NOT FOUNDCMP #$46BNE OPENSUCCJSR MLI ;MAKE ONE;.BYTE $C0 CRELISTSTA FOPEN2; SET OUTPUT FILE TO CLOSED2RTSLCLOSIT STA CLOSLIST+1XJSR MLI{;.BYTE $CC CLOSLIST .BYTE 204 12 145RTS:CLOSE4 LDA #LDA #>COUT@STA CSWD+1BRTS NOT EXIT JSR CLOSIT% LDA #0N STA FOPEN1; SET INPUT FILE TO CLOSED^ NOCLOSE RTSv ; CLOSE OUTPUT FILE CLOSE2 LDA FOPEN2; CHECK TO SEE IF OUTPUT FILE IS OPEN BEQ NOCLOSE; IF NOT EXIT JSR CLOSIT ; CLOSE OUTPUT FILELDA #0*7 1458GOASSM JMP START;9OUT1 LDA A1; NORMAL CHRGETH>CMP #$3AUHBCS EXITbRCMP #$20n\BNE NXT}fJMP CHRGETpNXT SECzSBC #$30SECSBC #$D0EXIT RTSINSLIN LDX PRGEND; FOUND LINE NUMBER, NOW INSERT LINESTX VARTABLDX PRGEND+1#STX VARTAB+1+CLCKJSR LINGET; GET LINE NUMBERZJSR TOKNIZbPLAjPLAJMP LININS; JUMP TO NORMAL INSERT LINE AND RESET LINE LINK ADDRESSES TOKNIZ LDY #00; TOKENIZE LINE STY HIGHDS LDA #02$ STA HIGHDS+101`Ƀ`LDLRLjzŸŹ L2/:L؃AtSmMf _ Lfhh /72< = 3 28)ȩ/787 /L{z: L808`ij hhLjԠ!`6677 Py6߂67`ɐ 6`6ʐ `ɐ `ɐ`ʐ `ʐ` `01`7  F L}`x`y`{x ${(`{`{zy z 4Ly z Lz zLyx ȹS0O񭷐 LĐ0` l  chh)L}Lr}좐LĐ ȱ퍣ȱ퍤 mm`L` b c`   uɐ` uʐ &' Lr}ȹЎV Ȍ8ЎIȹЎ L,ȹЎ=2ȥ뮭ʠЎЎLQЎ` ( LȌmi 뭤ȑhhL} Đ8c80 LԀ퍷͡L莢OKw iL}1 L;iL} l L}3 mLr} 2 L;mLr} mL} 3 L;mL} hhHH $`Ў` c l c L~  $8 8$  0  $ y Ȑ ;  cL{   ρL7{      LXb)L|Lr}8HhLh L.}hLhL8Lr},L~LL{}Y R  m ` L})lL}"ѩmLr} `L} iL} i ` L~ŐL~ǐ>*8$ }ǐ8ЎЎL |ЎL{ b L{@I L|ԎAȹԎAȹԎL`|@Ь0) , L|HH hh#?(7qmL}) mSLr}L}L2L{MƐɠ8L${ ρ k !? c L A D S c Ѕ L~ !L{ǐŐ l  E  LrӎhmL}9ȹЎ.8 ȹЎ=LY; Y-REG HOLDS LINE LENGTH +6' RTSP EDITSU LDA #WEDGEx STA $BC LDA #$4C; "JMP" STA $BA( RTS2 .FILE FINDMN . TK3 LDA (TXTPTR),Y+8 STA (HIGHDS),Y3B INYLL CMP #00; END OF LINEXV BNE TK3e` DEY; YESqj TK4 DEYt LDA (HIGHDS),Y; IGNORE FOLLOWING SPACES~ CMP #32 BEQ TK4 INY LDA #0 STA (HIGHDS),Y INY INY INY INY IN ȩ`!L`蹨Ў 9L{ȹюȹҎӎ սPL{  *ޅ L~`Lۏ)ُ܏ڏݏ 愭ُ܏ڏݏL ۏ`ُ.ڏُ.ڏ܏mُُݏmڏڏُ.ڏ`ُmڏm` ȐÐ  ņhhL{ L_ Lņ:L ;sUȐ Lυ  ЎL l  y cLυȐ ` L LDž ņhhL{`>[<_+*LL.$ $776778--- BRANCH OUT OF RANGEUNDEFINED LABEL NAKED LABEL <<<<<<<< DISK ERROR >>>>>>>>  -- DUPLICATED LABEL --  -- SYNTAX ERROR -- NO START ADDRESS-----------------YAPHAPLABRKBMIBPLANDORAEORBITBVCBVSROLRORLSRCLDCLIASLPHPPLPRTISEDSEITSXTXSCLVNOP  `ТLȈ8aHh0!A$Pp"bBX(@x0123456789ABCDEF P c     L. N O cL. N H cƐL. N S cŐL. S cŐL. H cƐLLDALDYJSRRTSBCSBEQBCCCMPBNELDXJMPSTASTYSTXINYDEYDEXDECINXINCCPYCPXSBCSECADCCLCTAXTAYTXAT E  y c ρ ņ`. E N D ̋ !` Ў  Ў8LdL y c  ņhhL{   :L ņhhL{. O cL P O:SjHL. N  Ɛ P PL! $  ```  $  `H)hJJJJ `F ̋hhL{E LpDLWPLNLOĽSLyHLЎ l  E y cL L̋  ЎL؋Ў8L񋭳ee` L` `Ɛ P ` $ `Ɛ P P ` $ ` ` $ *`Ѕ `  y ```   ```  Ɛ PL늩 $  ```00L )`Ў+LȹЎ 8L(:808` ` `Ő  &  ։` `Ő &L։ `Ő & ։ŐƐ  &L։   Lҏ譺u C:?; ȐL\_ _ L_Ў :ҏL`L-҅ ։ҏL `: ņÐǐhhŐL\~L{`  8 ΢Ρ  `8άЎL憎Ў +LWЎ +LZ....A) 쪐` HH hhЎ ЎBhŐ l  E  Ў Ў"E L:L; ȐL"L LLiЎ ։ЎLWÐ`LiЎL8ά00ЎL,)`LWLW *ЎLWLW W * y c Ў LȄei  hhL{ЎЎ Ð`` ,:( ; ,) E" ";:dL㐮 ; `.. m m.`mѐѐmҐҐ` א퐌쐭 ̐ ͐  hhL{ L L:L7;s␭U ՅL  EL K L␠ ` "L݅ L `L`֍ 9L{ȹ֍ȹ֍ ս~ɐȐL{  * :L~`gh * :L~`䐠(``LĄ ѐҐ㐱)     Ƀ`L>LLLdzŸŹ L&/:L̃AtSmMf _ LZhh /72< = 3 28)ȩ/787 /L{z: L808`ij hhLjԠ ȩȦ6677 Py6ӂ67` 6`6 ` Z` Z` `01`7  F Lw``y`㐭x {(`{`{zy z .Ly z Lz zLyx01`ȹES0O吅搅 L0` KF : hhȐ)L}Lo}АL АȱѐȱҐ ҐѐmѐѐmҐҐ`L` : ` 납  o` o ʐ&ː' !`ȹV Ȍې8ېIȹ L&ȹ=2ȥېʠLK` V :LܐאȌАmАi „ܐѐҐȑhhL}ސߐ 8c80 L΀吥搱ϐLА Kwɐ ȐiȐL}ɐ1 L5ȐiȐL} :L}Ґ3ɐ mȐȐLo} 2 L5mȐȐLo}ɐ mȐȐL} 3 L5mȐȐL}␌䐎㐩 hhHH $␬䐮``  : Lo} L~ 낢 $8 :8$㐭 낢 0 낢 $  ̊ K;  : ΐL{ᐭʐː 납 L4{ 납   낢 납 LEXbE)L|ҐɐOLo}8ѐHҐhLh L+}hLhL8ѐҐLo}ՐE,L~ȐLLx}ҐYɐ R  mȐȐ L}ՐE)lȐL}F"GѐɐѩmȐȐLo} L}ɐ ȐiȐL} Ȑi Ȑ ΉL~L~>*8$ 낢8L|L{ \ L{E@FIϐ L|֐A֐EȹEA֐ȹEL]|Րא@֐ЬEE0) , L|HH „hhE#?(ɐ7qmȐȐL}ՐE)ɐ mȐȐɐSLo}L}L2ȐLސ{Mߐɠ8L${ ΐ O? L A D S א „ѐʐҐː ΐL~ O֐L{ K s K GLɐrɐhmȐȐL}9ȹ.8 ȹ=L}hhL{`>[<_+*Lz.$ EL`LL8ڐڐ00LZ)`LL *אѐLѐL * א LȄei „ ርѐҐhhL{ `ΐ` ,:( ; ,) Lؐ YL␩ؐ YLѐҐѐ.Ґѐ.Ґѐ.Ґѐ.ҐA) ѐѐؐא` HH hh Bh琭䐭 K s K "E Lƈ:LɈ;ARRIAGE RETURN ZBEQ DMO< dLDY Y:STA LABEL,Y:JSR PRINTS 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:LDA RESULT+1:SJMP SETUPPLDA #DISMESS:STA TEMP+1:JSR PRNTMESSr(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 PCMP #$8D; C776778NO START ADDRESS-------------------- BRANCH OUT OF RANGEUNDEFINED LABEL NAKED LABEL <<<<<<<< DISK ERROR >>>>>>>>  -- DUPLICATED LABEL --  -- SYNTAX ERROR -- INYDEYDEXDECINXINCCPYCPXSBCSECADCCLCTAXTAYTXATYAPHAPLABRKBMIBPLANDORAEORBITBVCBVSROLRORLSRCLDCLIASLPHPPLPRTISEDSEITSXTXSCLVNOP  `ТLȈ8aHh0!A$Pp"bBX(@x0123456789ABCDEFO Lጭ P O:SjHL. N P 낢   낢 Lጩ. N O Lጩ. N H Lጩ. N S Lጩ. S Lጩ. H LLDALDYJSRRTSBCSBEQBCCCMPBNELDXJMPSTASTYSTXL  EL8L s K Ɂ ΐ`. E N D ΐᐭʐː O`  E8LLጄ ځ 낢 hhΐL{ 낢 :L hhΐL{. ~L $ 낢 ``` 낢 ~ ~LO $ 낢 ``` 낢 ͐̐ $ 낢 `H)hJJJJ `F hhL{E MLDLPLΌNLOLSLHL K s : L LА 낢 А 낢 ee` ƊL<` Ɗ`㐭 ~ ` $ ` ~ ~ "` $ "` Ɗ`̐͐ $ X` :`  ``` 낢 낢 ``` 낢А ϐАϐА 낢 `8ڐڐ00L7)`+LKȹ fLV:808`돩 „ѐꐭҐ` ,` 낢 Ȑ T KȐ ` ,`ѐ TѐL , ,`ѐ Tѐ  KҐ T ՅLƈ"L ,LL L萝u C:?; ՅL ,L= :L=萍L[ „ѐ 䐩L= ,: hhLY~L{` 낢 8ѐϐҐTA SA+1:STA PMEM+1X ; NOW ADJUST PRINTED ADDRESS (SA) UP BY 1 (LOWERED IN LINE 120)x 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), TAY:LDA M 2 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 6+ ; "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 2DISKSDINCP1 STY Y:LDY #0:LDA (PMEM),Y:PHP:LDY Y:PLP:RTS; SAVE STATUS REGISTERDISMESS .BYTE "DISASSEMBLY START ADDRESS (DECIMAL)":.BYTE 0.FILE DTABLES INCSA:JSR INCSA:RTSICOMX LDA #172:JSR PRINT:LDA #216:JSR PRINT:RTS|COMY 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 CONVENTIONAL CHARIN/UMP (TYPE 10)SXALLDONE JSR PRNTCR:LDX BABFLAG:CPX #1:BCC ALLD1:PLA:PLA:JMP FINibALLD1 JMP GETBYTElDOONE JSR GB:TAX:LDA #0:JSR PRNTNUM:JSR INCSA:JSR INCSA:RTSvDOTWO JSR GB:PHA:JSR GB:TAX:LDA #0JSR PRNTNUM:PLA:TAX:JSR PRNTNUM:JSR INCSA:JSRRNTNUMA&LDX WORK:JSR PRNTNUM:JSR INCSA:JSR INCSA:JMP ALLDONEv0RELPL 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 ALLDONE; IND. JX:JMP ALLDONE; ABSOLUTE X (TYPE 7)dDABSOLY 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 #$00:TAX:JSR PPG (TYPE 3)[DINDX 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)$DABSOLX JSR DOTWO:JSR COMINDJJSR 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 ALLDONE; ZERO RANCHES#hJSR INCSA:JMP ALLDONE@rBRANCHES LDA TYPETABLE,YV|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 #10:BEQ JDJUMP ,JSR PRNTSA:JSR PRNTSPACEE 6LDY #0:LDA (PARRAY),Y:JSR PRINT:INYf @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 TYPETABLE,Y:BNE BL PARRAY+13 ; 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:STA PARRAY+1TABLE,Y:BNE DMORE:JSR PRNTSA:JSR PRNTSPACE[ 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:STA PARRAY:RO8 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 .BYTE 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.FILE EVAL 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 1 3LIED) (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 1 0SXLDYLDALDXCPYCMPCPYCMPDECINYCMPDEXCPYCMPDECaJ.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 "CLVLDAT TABLE OF MNEMONICS (TIED TO THE NUMBERS IN TABLE ABOVE)A ; WORDTABLE .BYTE "XXXBRKORAORAASLPHPORAASLORAASLBPLORAORAASL .BYTE "CLCORAORAASLJSRANDBITANDROLPLPANDROLBIT .BYTE "ANDROLBMIANDANDROLSECANDANDROLRTIEOR .BYTE "EORLSRPHAEORLSRJMP 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 ;; ;