23-Jun-89 23:50:44-PDT,7575;000000000000 Return-Path: Received: from ucbvax.Berkeley.EDU by SCORE.STANFORD.EDU with TCP; Fri 23 Jun 89 23:50:43-PDT Received: by ucbvax.Berkeley.EDU (5.61/1.37) id AA21818; Fri, 23 Jun 89 23:46:33 -0700 Received: from USENET by ucbvax.Berkeley.EDU with netnews for atari8-programs@score.stanford.edu (info-atari8@score.stanford.edu) (contact usenet@ucbvax.Berkeley.EDU if you have questions) Date: 24 Jun 89 05:40:40 GMT From: killer!chasm@ames.arc.nasa.gov (Charles Marslett) Organization: The Unix(R) Connection, Dallas, Texas Subject: An Atari Assembler: A65 Message-Id: <8448@killer.DALLAS.TX.US> Sender: info-atari8-request@score.stanford.edu To: info-atari8@score.stanford.edu # This is a shell archive (Part 2 of 3) # # It contains the documentation (what little there is) # for the A65 (NON-macro) assembler. # #----cut here-----cut here-----cut here-----cut here----# #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # a65.doc # This archive created: Fri Jun 23 20:31:09 1989 sed 's/^X//' << \SHAR_EOF > a65.doc X X X A65 (A very simple 6502 assembler) X X by X Charles Marslett X Wordmark Systems X X XThe A65 assembler is modeled after the Atari MACRO Assembler (AMAC) that Xwas distributed by APX along with the MEDIT editor and the DDT debugger. XThe most significant thing about it is that the source files cannot contain Xline numbers (so editors that use line numbers must be able to write an Xunnumbered output file). A second characteristic is that it is a disk-to- Xdisk assembler (the source must be in a disk (or cassette) file and the Xobject cannot be inserted directly into memory. X XThe assembler is run from the DOS menu using the 'L' command, and prompts Xyou for the source file name, the object file name and the listing file Xname: a RETURN in response to the object and listing prompts will cause Xthe assembler to generate files on the same drive with extensions '.OBJ' Xand '.LST' using the same file name as the source file. If no '.' appears Xin the source file name, '.ASM' is its assumed extension. A listing can Xbe printed directly by specifying 'P:' as the list file or dumped to the Xscreen by specifying 'E:'. A '-' disables the listing if you do not want Xone. X XA start at implementing support for the 65C02 opcodes is in the code, but Xwhat is there has not been tested very thouroughly and most of the opcodes Xand addressing modes are not in place yet. Otherwise, the machine Xinstructions are as any other standard 6502 assembler would expect. XExpressions can include +, -, * and / operators as well as HIGH[] and LOW[] Xfunctions to extract the high and low bytes of 16-bit numbers. Brackets, X[ and ], may be used to group terms in an expression if necessary. Symbols Xmay have up to 11 characters, including upper and lower case letters, Xunderscores and numbers. Symbols must start with an underscore or letter, Xand case is significant except for the predefined assembler opcodes and the Xregister names A, X and Y. X XThe machine opcodes recognized are: X X ADC, AND, ASL, BCC, BCS, BEQ, BIT, BMI, BNE, BPL, BRA (65C02 only), X BRK, BVC, BVS, CLC, CLD, CLI, CLV, CMP, CPX, CPY, DEC, DEX, DEY, X EOR, INC, INX, INY, JMP, JSR, LDA, LDX, LDY, LSR, NOP, ORA, PHA, X PHP, PLA, PLP, ROL, ROR, RTI, RTS, SBC, SEC, SED, SEI, STA, STX, X STY, TAX, TAY, TSX, TXA, TXS, TYA X XThe assembler directives are: X XDB defines a byte, in decimal (12), hex ($0C), octal (@14) or binary X (%00001100) and may also be a character string (enclosed in quotes) XDC defines a byte, as above, but with the high bit set (if defining a X string, only on the last byte of the string) XDW defines a word, low byte first, as if an indirect pointer XDS allocates a number of bytes without storing any data in them X XORG sets the location counter to a fixed address X*= same as ORG XEQU defines a symbol to have a specific value X= same as EQU X X X X X X X X XINCLUDE causes the file specified to be inserted at this point in the X assembly (can be nested if the DOS supports sufficient numbers X of files open at once -- the object, list and source files are X kept open at all times, and each level of nested includes requires X one more open file. MYDOS and Atari DOS 2 allow 3 normally, which X does not allow a listing and include files. If set to 5, the X assembler could generate a listing and handle 1 level of nested X includes) XTITLE specifies the first title line XSUBTTL allows entering a second title line XPAGE causes the assembler to go to the top of th next listing page X XEND terminates the program and specifies INIT and RUN addresses X XLIST a stub for future expansion XMACRO another stub (does nothing, not even generate an error) XMEND another stub X XOctal numbers, EQU, *=, and INIT and RUN addresses may have bugs in them -- Xgood luck. Most of the rest has been debugged reasonably well. X XThe END statement can have the following forms: X X END no RUN or INIT vectors generated at all X END ADDR ADDR is the RUN entry point X END ADDR, ADDR is the INIT entry point (no RUN vector) X END INIT,RUN both vectors specified X X(This is what I call minimum documentation, I will add to it as questions Xare asked) X X Charles Marslett X 8/21/85 X X X XChanges since the first release: X XThe assembler now behaves more reasonably when a forward reference is Xencountered (it used to just generate junque quietly!) -- forward references Xare forced to 16-bit values if possible, otherwise A65 assumes you know what Xyou are doing, and assumes it will be an 8-bit value when it is defined. X XThe assembler allows upper and lower case symbols, and it is case sensitive. XIt still ignores case, however, when handling the directives and machine Xopcodes as well as the register names ("A", "X" and "Y"). Underscores are Xalso allow in symbols and are treated as letters (makes C people happy!). XSymbols may also be up to 11 characters long (rather than 8 as before). X XThe initial load address is the HIMEM value from DOS (the lowest possible Xload address) rather than a random value left over in memory. X XErrors are marked in the listing file (as before) but they are also echoed Xto the screen, and the total number of errors (in HEX) are reported at the Xend of the assembly. If any errors occur, the automatic return to the DOS Xprompt is delayed until the [RETURN] key is pressed to give you an opportunity Xto note any (unexpected) errors reported. X X X X X X X X X XFinally, some errors that were previously accepted (and generated bad code) Xare now caught and flagged as errors). These included multiply defined Xsymbols and some invalid addressing modes. X X Charles Marslett X 6/16/89 SHAR_EOF # End of shell archive exit 0 =========================================================================== Charles Marslett STB Systems, Inc. <== Apply all standard disclaimers Wordmark Systems <== No disclaimers required -- that's just me chasm@killer.dallas.tx.us 23-Jun-89 23:50:48-PDT,8139;000000000000 Return-Path: Received: from ucbvax.Berkeley.EDU by SCORE.STANFORD.EDU with TCP; Fri 23 Jun 89 23:50:47-PDT Received: by ucbvax.Berkeley.EDU (5.61/1.37) id AA21825; Fri, 23 Jun 89 23:46:43 -0700 Received: from USENET by ucbvax.Berkeley.EDU with netnews for atari8-programs@score.stanford.edu (info-atari8@score.stanford.edu) (contact usenet@ucbvax.Berkeley.EDU if you have questions) Date: 24 Jun 89 05:42:26 GMT From: killer!chasm@ames.arc.nasa.gov (Charles Marslett) Organization: The Unix(R) Connection, Dallas, Texas Subject: An Atari Assembler: A65 Message-Id: <8449@killer.DALLAS.TX.US> Sender: info-atari8-request@score.stanford.edu To: info-atari8@score.stanford.edu This is NOT a shell archive (Part 3 of 3). Rather it is a uuencoded executable binary of the MYDOS A65 assembler. Remove the lines up to and including the "cut here" line on the front and remove any lines following the "end" or "size" line, depending on your uudecoder's preferences, then feed the resulting UUENCODEd file into UUDECODE (YAU, etc.) to generate a binary executable copy of A65. ----cut here-----cut here-----cut here-----cut here----# begin 666 a65 V___2(]$DJ=F%M:+_AK'HAK.&M(:VJ3N%LJE!C0`VJ5.-`3:I38T"-B#G,U-O=7)C92!F:6QE! V(#T@``,VJ4^-`#:I0HT!-JE*C0(V(.%N(6YC?XUC?\UK><"A:BMZ`*%J:(PAINI`Z`V(,"%J*D"A:FB& V`J6Y\`RB!*W\-86)K?TUA8JM^C6%AZW[-86(3*XEI;GP)ZW\-86'K?TUA8BIXH6HJ0*%J:("- VAI8@8C.B&;TJ)IT5(LK0]R#6,:2:\`,@GS.B(""_-*U0`S`5TB71)JD@C8`CJ9N-@2,@0#(@P V-C"B$""_-*W^-86H#?\U\#>M_S6%J:(`AI:B&+U#)IT5(LK0]R#6,2#G,U!R97-S(%M21515; V4DY=('1O(&-O;G1I;G5E``,V;`H`/#P\(%)53B])3DE4(%9%0U1/4E,@/CX^FSP\/"!%4E)/G V4E,@3T-#55)2140@/CX^F[$"041#D0)!3D2"!$%33,@!0D-#V`%"0U/X`4)%49`)0DE4F`%"^ V34GH`4).18@!0E!,P`%"4D&``$)22Z@!0E9#N`%"5E.,`$-,0^P`0TQ$K`!#3$G<`$-,5N$"= V0TU0\`-#4%C@`T-06?])1$+_2D1#X@=$14/2)M$GY@!$15C$`$1%6?]#1%/_2$17_T)%3D2AQ V`D5/4O]!15%5_T5)3D-,541%\@=)3D/T`$E.6.0`24Y9H`I*35","TI34M$"3$1!T@Q,1%C0V V#4Q$6?]$3$E35*($3%-2_TQ-04-23_]-345.1/8`3D]0@0)/4D'_0$]21_]+4$%'1:0`4$A!, VA`!02%"T`%!,090`4$Q0D@123TRR!%)/4J``4E1)L`!25%/Q`E-"0YP`4T5#_`!3142\`%-%/ V2<$%4U1!P@935%C`"%-46?]'4U5"5%1,U@!405C4`%1!6?]&5$E43$7>`%136,8`5%A!S@!4H V6%/,`%190?__KI((68("HPR3OPRJHPQ\D]T!&I[H6"J2:%@\@@*C"$F4QQ*"#K+R`J,(29J5N%@JDFA8.@. V`,BQ@A#[&)AE@H6"J0!E@X6#H`&Q@C`8HO_(Z+6<\"/)>[`&R6&0`ND@T8+0T_#JJ4^%F*GJ% VA8>%B(6)J0.%EJ``8+&"$+J@`+&"A8?(YI:Q@O`4I)G)0)`#3"8K(/LHA)F0!*E%A9BEARG\+ V&&6'&&64A8=,7C,@V2T8I8CEJ(6(T`+&B:6)Y:F%B<:(I8@*I8EI`/`*J2#%F)`$J5:%F!A@2 VL8#)*-`2TBC1*:DLA93((-DMB+&`R2G0+!+R9OP1R#9+:6(II:=/#;HB(:6I90=.S:=.S:Q@,C)+/#5)+8P+G!$H@:]@ V.S:5ALK0^(:4($DS&&#(L8#))_`1R9OP")T\-NC@>)#MJ5.%F(C(T-(JT2N]HCR].S:=(37*5 VT/>&EJF`A96EMBD#A;9@HCR].S:=:37*T/?PYB`;*J6Q\`2I_X6Q(![`-R2Z0"9VZ-LCHX!+0[:F;G;HV(%$TTBO1+!BEFVD0,`JJJ;J@-B#'-!#-J4F%$ VF-#)O;$AA8J]XR&%B[WB(4B]L"&JJ0"%B(6)J0B%DF@@&BS&DM#YJ0B%DHH@&BS&DM#Y8`:(B V)HD*D`](&*6(98J%B*6)98N%B6A@O;$AA8J]XR&%B[VP(4B]XB&JJ0"%B(6)J?"%DF@DBS`)( V!HHFB^:2T/1@2*62*0^%DFCDB]`"Q8H()H@FB2B0".6*2(KEBZIH1HMFBL:2$.)@&+VP(7VQ* V(9VP(;WB(7WC(9WB(4SR+#B]L"']L2&=L"&]XB']XR&=XB%,\BPXJ0#]L2&=L2&I`/WC(9WCQ V(4ST+*:OR2OPNLDM\,S)(?#>R2K2+-$M\"G)+_`KR27P+(A3 V/>,AG>(A3/(LO;`A';$AG;`AO>(A'>,AG>(A3/(LI9S)3-`RI9W)3]`LI9[P",E7T"2EG]`@2 V.&"EG,E(T!BEG,AG;$AJ0"=XR'P$ V0:E,T`*I2(6PL8#)6]`!R*E`T`^Q@,C)+?`&R5OP!#A@J2&FKIV`(>:N3.0MIJ[P[KU_(+;"I($0ML*"DF2#>+K"L+ VIJ^EB)VR(:6)G>0AYJ^Q@,C)+?`^R2OP.LDJ\&?)+_!CR27P7\DF\$+)?/!WR5WPE*:N\`V]I V?R')6_`&(,(LD/!@&,:O\`$XK;(AA8BMY"&%B6"FKIV`(?`EO7\AR5OP'LE`\!H@PBR0Z6"FA VKIV`(?`-O7\AR2'0!B#"+)#M8.:N3.0MIJZ=@"'P]+U_(P%LE'M VL"G)09`$Z3>P"LDZL!W),)`9Z3`&B":)!H@FB0:()HD&B":)!8B%B$SS+AA@.&#))?!,R4#P* V7,DJ\'C))_!_R3JPZLDPD.;).K#@R3"0W.DP2`:()HFEB862I8@*)I(*)I(898B%B*6298F%J VB1AH98B%B*D`98F%BR3"P[JD`Z)6;8+&`R9OP$\D@\`_)?]#RR+&`R2#P^&F1B898*%@JD`98.%@ZD`&&D4Q9F0^ED*AEA(6$J0!EA86%B+F9`)&"P`/0]J6.2@B@`I&"I8U*B)&"B)AJ*&I*2@6/T V.&J1@F"@`+&"*?O1@O`#D8)@J42%F&"@`+&""D@ISH6/:`H*"@@*R+&"*H6-*,BQ@BJ%CF"F4 VA(:JI86%JZ+;AJRI-H6MA8.&@N2JY:NP5#BEJF6LA8*EJV6M:F:"A8.@`+&",`RE@M`"QH/&R V@K&"$/2@`[&",`K9F0"0#=`LR+#R&+F9`/"MT`'(L8(0^QB898*D@Y`!R,2KD`G%JI`%A8*$* V@V"$K86LD*6EK,6"I:WE@[#OI8*%JJ6#TC'1,H6KD)$@TS*B`J65,!;0"J6I(+8RI:A,\C&E: VB2"V,J6((+8RI9:%DO`'I90P`R`<,Z(4(.4RI9B-@"/)(/`-H@`@FC+N_C70`^[_-:U0`S`;9 V($`R,!BEE#`2I9+P$"#3,B`<,ZF;G8`C3"(RJ0!@I;'FL<6RD%"I((UG-8UF-8UE-:D`A;'F7 VL]`"YK2ELX74I;2%U2"JV2#FV*#_R+'SF60U$/@I?YED-:(0J0N=0@.I(9U$`ZDUG44#I;6=3 V2`.I`(U)`R!6Y*(0J8"=1`.I(YU%`ZD)G4(#J5&=2`.I`)U)`TQ6Y$A*2DI*^#CI"FDZG8`C; VZ&@I#SCI"FDZV)V`(^C2,M$S8*(`J2"=@"/HX%"0]JF;G8`C8*``L8#)?]`/BJ(2RMT*,Y#Z/ VO0LSJK`(G8`CR9OP!NC(X%"0WF```@<4'2,K,SM#2$E*2TQ-3D^B!Z``A).YAP`@MC+&DO`<& VYI.DD\`&T.ZY03:9A@"(T/>Y0C:9/#;(Q)*0]6"DAM`0('(SO3PV()DSZ.26T/6$FF"DAM#[5 V('(SM8<@F3/HY);0]H2:8*2:\!:8&&UZ(JY[(I`!Z,6HT`3DJ?`-()\SI:B->B*EJ8U[(J(`A V8)E^(LC0^8:MB)A(KGLB&&UZ(HU\(I`!Z(Y](J(@.&AI!)U(`ZD!L`*I`)U)`R!6Y#`7K7TB4 VC7LBK-(ST31\(LB,>B+0`^Y[(J:MH`!@`.IL"@!HA:QHA:VI"XU"`Z`!H@".2`..20.QK/`*% VR(22(%;DI)+0\LBQK(6JR+&LA:N$DJD%C4(#J1"-2`.I`(U)`ZFZC40#J3:-10,@5N0PN2!1A V-*#_R+FZ-I&J$/@8I9)EK(62I:UI`$BEDDA@H@"@`(:3K;HV$".(R+D#-IFZ-C`$R2[0\ZF;( VF;HVH`#P#,DZT`'*R2[0`L:3R+FZ-A#OI9/0(*DNF;HVR*T`-IFZ-LBM`3:9NC;(K0(VF;HV\ VR*F;F;HVBM`3N;HVF;PVB!#WJ42-NC:I.HV[-F"I#)U"`TQ6Y(222""_-*D$G4H#TC31-6B=F V1`.EDIU%`ZD#G4(#3%;DA))(J0R=0@,@5N2I"-#=IINI!9U"`ZEDG4@#J0"=20.%F:D6G40#] VA8"I(IU%`X6!(%;DO4@#JJF;G18BF&`,("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@D V("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@(%!A9V4@("`@("";("`@("`@("`@("`@X V("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@*$,IT V(#$Y.#2;("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("#2-?DU("`@("`@("`@("`@& B("`@("`@("`@("!73U)$34%22R!3>7-T96USF^`"X0+2(P``T `` end size 4732 =========================================================================== Charles Marslett STB Systems, Inc. <== Apply all standard disclaimers Wordmark Systems <== No disclaimers required -- that's just me chasm@killer.dallas.tx.us 23-Jun-89 23:52:11-PDT,40190;000000000000 Return-Path: Received: from ucbvax.Berkeley.EDU by SCORE.STANFORD.EDU with TCP; Fri 23 Jun 89 23:52:07-PDT Received: by ucbvax.Berkeley.EDU (5.61/1.37) id AA21568; Fri, 23 Jun 89 23:40:55 -0700 Received: from USENET by ucbvax.Berkeley.EDU with netnews for atari8-programs@score.stanford.edu (info-atari8@score.stanford.edu) (contact usenet@ucbvax.Berkeley.EDU if you have questions) Date: 24 Jun 89 05:38:14 GMT From: killer!chasm@ames.arc.nasa.gov (Charles Marslett) Organization: The Unix(R) Connection, Dallas, Texas Subject: An Atari Assembler: A65 Message-Id: <8447@killer.DALLAS.TX.US> Sender: info-atari8-request@score.stanford.edu To: info-atari8@score.stanford.edu # This is a shell archive (Part 1 of 3) # # It contains 6 source files that contain the source # code for the A65 (NON-macro) assembler. # # Run it through the Bourne shell "sh" or an unshar program. # The remaining files when put on a single diskette in the # default disk drive can then be assembled to generate a new # copy of the A65 assembler. # # The documentation and executable binary files follow. # #----cut here-----cut here-----cut here-----cut here----# #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # a65.asm # asm1.asm # asm2.asm # asm3.asm # asm4.asm # asm5.asm # This archive created: Fri Jun 23 20:23:34 1989 sed 's/^X//' << \SHAR_EOF > a65.asm X TITLE '6502/65C02 ASSEMBLER' X SUBTTL 'SOURCE = A65.ASM, 6/24/84, 6/16/89' X; X; Copyright (C) 1984, 1986, 1989 by Charles Marslett X; WORDMARK Systems X; All rights reserved. 2705 Pinewood Dr. X; Garland, TX 75042 X; X; Permission granted to copy, modify or execute X; this program for noncommercial purposes only. X; XLOGDEV = $00 ;LOG (SCREEN) IOCB XPRUNIT = $10 ;LIST OUTPUT IOCB XOBUNIT = $20 ;OBJECT FILE IOCB XINUNIT = $30 ;SOURCE FILE IOCB X LIST I X; X; PARAMETERS OF THE ASSEMBLER X; XSYMSIZ = 11 ;MAX NUMBER OF CHARACTERS IN A SYMBOL XFNSIZE = 18 ;MAX LENGTH OF A FILE NAME STRING XSTRMAX = 120 ;MAX LENGTH OF QUOTED STRING XLINLEN = 100 ;MAX LENGTH OF AN INPUT LINE XPRTLEN = 80 ;PRINT LINE WIDTH XBUFLEN = 256+6 ;MAX SIZE OUTPUT RECORD XCWIDTH = SYMSIZ+9 X; XTAB = $7F XEOL = $9B X; X; REGISTERS ON ZERO PAGE X; XDOSVEC = $0A X; X ORG $0080 XTEXTP DS 2 ;ADDRESS OF TEXT BUFFER XTABPTR DS 2 ;ADDRESS OF OPCODE ENTRY XENDSTAB DS 2 ;ADDRESS OF END OF SYMTAB XPASSNO DS 1 ;CURRENT ASSEMBLER PASS XOPCODE DS 1 ;OPCODE VALUE XVALUE DS 2 ;VALUE OF OPERAND XSECVAL DS 2 XOPER DS 1 XSVAL DS 2 ;SYMBOL VALUE XSFLGS DS 1 ;SYMBOL FLAGS X ; BIT 7=UNDEFINED X ; BIT 6=GLOBAL X ; BIT 5=0 X ; BIT 4=0 X ; BIT 3=FORWARD REFERENCE (IN GETVAL) X ; BIT 2-1=ORG COUNT X ; BIT 0=UNUSED XSLEN DS 1 XPARENS DS 1 XTEMP DS 2 ;GENERAL TEMPORARIES XCNT = TEMP XMODE DS 1 ;ADDRESSING MODE OFFSET XISVAL DS 1 ;FLAG (NONZERO -> LABEL=VALUE) XLEN DS 2 ;LENGTH OF CURRENT INSTRUCTION XADRERR DS 1 ;ADDRESS ERROR FIELD XTXTPTR DS 1 ;CURRENT TEXT BYTE OFFSET XOBJPTR DS 1 ;NEXT BYTE IN OBJECT BUFFER XFILE DS 1 ;IOCB USED CURRENTLY FOR INPUT XSYMBOL DS SYMSIZ ;RESERVE 9 BYTES FOR THE SYMBOL X DS 1 XPC DS 2 ;CURRENT VALUE OF * XHIGHP DS 2 XLOWP DS 2 XOPRSP DS 1 ;OPERATOR STACK POINTER XOPDSP DS 1 ;OPERAND STACK POINTER XFUNC DS 1 ;HIGH/LOW FUNCTION FLAG X; XCURLINE DS 1 XLPP DS 1 XCURPAGE DS 2 XTTLLEN DS 1 XTTLFLG DS 1 XENDFLG DS 1 XENTPTF DS 1 XINIFLG DS 1 XFWDREF DS 1 X; XFR0 = $D4 XFR1 = $E0 XINBUFF = $F3 X; XRUNVEC = $02E0 XINIVEC = $02E2 XINIORG = $02E7 ;BASE LOAD ADDRESS IS IN THIS WORD X; X ORG $0340 X DS 2 XICMD DS 1 XISTAT DS 1 XIBUF DS 2 X DS 2 XILEN DS 2 XIAUX DS 2 X DS 2 X DS 2 X; XFASCII = $D8E6 XIFP = $D9AA XCIOV = $E456 X; X ORG $2180 ;END OF RESIDENT MYDOS (4.51 IS ACTUALLY AT 1F80) XOPERS DS 50 ;EXPRESSION STACKS XOPNDL DS 50 XOPNDH DS 50 X; XTEXTBF DS LINLEN XOBJBUF DS BUFLEN XPRBUF DS PRTLEN+2 X; XSTART LDA #TTLSIZE X STA TTLLEN X LDX #$FF X STX CURLINE X INX X STX CURPAGE X STX CURPAGE+1 X STX TTLFLG X LDA #59 ;DEFAULT LINES/PAGE X STA LPP X LDA #'A' X STA EXTTXT X LDA #'S' X STA EXTTXT+1 X LDA #'M' X STA EXTTXT+2 X JSR PROMPT X DB 'Source file = ',0 X DW INF X; X LDA #'O' X STA EXTTXT X LDA #'B' X STA EXTTXT+1 X LDA #'J' X STA EXTTXT+2 X JSR PROMPT X DB 'Object file = ',0 X DW OUTF X; X LDA #'L' X STA EXTTXT X LDA #'S' X STA EXTTXT+1 X LDA #'T' X STA EXTTXT+2 X JSR PROMPT X DB 'List file = ',0 X DW PRF X; X LDA #1 ;FIRST PASS IS 1 X STA PASSNO ;SECOND PASS IS 0 X; X LDA #LOW[SYMTAB] X STA ENDSTAB X LDA #HIGH[SYMTAB] X STA ENDSTAB+1 X LDX #$FF X STX SYMTAB X; X LDA PRF+2 X CMP #'-' X BEQ NOPRNT X LDX #PRUNIT X LDA #LOW[PRF] X LDY #HIGH[PRF] X JSR OPNOUT X BMI ABORT X; XNOPRNT LDA #'A' X STA EXTTXT X LDA #'S' X STA EXTTXT+1 X LDA #'M' X STA EXTTXT+2 X; XPASSLP LDA #0 X STA ENDFLG X STA ENTPTF X STA INIFLG X STA ERRCNT X STA ERRCNT+1 X LDA INIORG ;INITIALIZE THE STARTING ADDRESS X STA PC X LDA INIORG+1 X STA PC+1 X LDX #INUNIT X STX FILE X LDA #LOW[INF] X LDY #HIGH[INF] X JSR OPENIN X BMI ABORT X; XLOOP LDA #$00 X STA SFLGS X STA LABEL X JSR READLN X BMI CKEOF X JSR GENCODE ;GENERATE CODE/DO DIRECTIVE X JSR ADDSYM ;IF LABEL DEFINED, ADD TO SYM/TAB X LDA PASSNO X BNE NOPLIN ;IF NOT PASS 2, SKIP PRINTING X LDA ADRERR X CMP #' ' ;ERRORS? X BNE FORCEPR ;IF SO, FORCE PRINTING X LDA ICMD-2+PRUNIT X BMI NOPLIN XFORCEPR JSR PRINT ;LIST LINE TO PRINTER X BMI ABORT XNOPLIN LDA ENDFLG X BNE ASDONE X; X CLC X LDA LEN X ADC PC X STA PC X LDA LEN+1 X ADC PC+1 X STA PC+1 X JMP LOOP X; XABORT LDX FILE XCLINFS JSR CLOSEF X TXA X SEC X SBC #$10 X TAX X CPX #INUNIT X BCS CLINFS X BCC ABXIT X; XCKEOF CPY #136 ;IS THIS EOF? X BNE ABORT ;IF SO, THEN TREAT AS 'END' XASDONE LDX FILE X JSR CLOSEF X CPX #INUNIT X BNE ENDINCL X; X; CHECK FOR END OF PASS X; XPASSCK DEC PASSNO X BPL PASS2 XABXIT JMP ASMXIT ;ASSEMBLY DONE, GO WRAP UP! X; XPASS2 LDY #LOW[SYMTAB] X LDA #HIGH[SYMTAB] X STA TABPTR+1 X LDA #0 X STA TABPTR X BEQ NEXTSET ;THIS SHOULD BRANCH ALWAYS! X; XSETFREF INY X BNE NEXTSET X INC TABPTR+1 XNEXTSET LDA TABPTR+1 X CPY ENDSTAB X SBC ENDSTAB+1 X BCS FREFXT X; X LDA (TABPTR),Y X BPL SETFREF ;IF THE FIRST BYTE OF A SYMBOL X ORA #$04 ;SET FORWARD REFERENCE FLAG X STA (TABPTR),Y X;;;; JSR DEBUG1 ;Print them out as we mark them! X BNE SETFREF ;JUMP ALWAYS! X; XENDINCL TXA X SBC #$10 X STA FILE X LDA ENDFLG X BNE ASDONE X JMP LOOP X; X; ALL SYMBOLS MARKED FWD REF (GO ON TO THE REAL WORK) X; XFREFXT LDX #OBUNIT X LDA #LOW[OUTF] X LDY #HIGH[OUTF] X JSR OPNOUT X BMI TOABRT X; X LDA #$FF X STA OBJBUF X STA OBJBUF+1 X LDA #2 X STA ILEN,X X LDA #0 X STA ILEN+1,X X STA OBJPTR ;NO DATA IN BUFFER YET (LEN=0) X LDA #11 X STA ICMD,X X LDA #LOW[OBJBUF] X STA IBUF,X X LDA #HIGH[OBJBUF] X STA IBUF+1,X X JSR CIOV X BMI TOABRT X JMP PASSLP XTOABRT JMP ABORT X; XASMXIT LDA ENTPTF X BEQ NOENTV X LDX #2 X LDA #LOW[RUNVEC] X STA PC X LDA #HIGH[RUNVEC] X STA PC+1 X LDX #2 X LDA INIFLG X BEQ VECT2 X LDX #4 X LDA INIPT X STA OPCODE+2 X LDA INIPT+1 X STA OPCODE+3 X; XVECT2 LDA ENTPT X STA OPCODE X LDA ENTPT+1 X STA OPCODE+1 X JMP WRVECT X; XNOENTV LDA INIFLG X BEQ NOINIV X LDA INIPT X STA OPCODE X LDA INIPT+1 X STA OPCODE+1 X LDA #LOW[INIVEC] X STA PC X LDA #HIGH[INIVEC] X STA PC+1 X LDX #2 XWRVECT STX LEN X JSR CODOBJ+4 X LDX #VECLL XCPYVL LDA VECLIN-1,X X STA TEXTBF-1,X X DEX X BNE CPYVL X JSR PRINT ;PRINT VECTOR CODE LINE XNOINIV LDY OBJPTR X BEQ NOOBJB X JSR WRTOBJ XNOOBJB LDX #OBUNIT X JSR CLOSEF X LDA ICMD-2+PRUNIT X BMI NOPSYM X LDA #' ' X STA PRBUF X LDA #EOL X STA PRBUF+1 X JSR LIST X JSR PRSTAB ;PRINT SYMBOL TABLE X LDX #PRUNIT X JSR CLOSEF XNOPSYM LDA ERRCNT X STA PC X ORA ERRCNT+1 ;IF ANY ERRORS, WAIT FOR A KEY X BEQ NOERRS X; X LDA ERRCNT+1 X STA PC+1 X LDX #0 X STX LEN X LDX #ERRLL XCPYEL LDA ERRTOT-1,X X STA TEXTBF-1,X X DEX X BNE CPYEL X JSR PRINT ;PRINT VECTOR CODE LINE X JSR PROMPT ;WAIT FOR A KEY X DB 'Press [RETURN] to continue',0 X DW INF X; XNOERRS JMP (DOSVEC) ;AND RETURN TO DOS X; XVECLIN DB '<<< RUN/INIT VECTORS >>>',EOL XVECLL = *-VECLIN XERRTOT DB '<<< ERRORS OCCURRED >>>',EOL XERRLL = *-ERRTOT X; X INCLUDE D:ASM1.ASM X; X INCLUDE D:ASM2.ASM X; X INCLUDE D:ASM3.ASM X; X INCLUDE D:ASM4.ASM X; X INCLUDE D:ASM5.ASM X; XTTLINE DB $0C ;FORMFEED XTITLE DB ' ' X DB ' ',' Page ' XPAGE DB ' ',EOL XSUBTTL DB ' ' X DB ' ',' (C) 1984',EOL X DB ' ' X DB ' ','WORDMARK Systems',EOL XTTLSIZE = *-TTLINE X; X; NON-ZERO PAGE RAM X; XENTPT DS 2 XINIPT DS 2 XERRCNT DS 2 ;NUMBER OF ERRORS REPORTED X; XEXTTXT DS 3 X; XINF DS FNSIZE X DS 1 XOUTF DS FNSIZE X DS 1 XPRF DS FNSIZE X DS 1 XDATBUF DS STRMAX X DS 6 XFNBUF DS FNSIZE X DS 2 XLABEL DS SYMSIZ X DS 2 X; XSYMTAB END START SHAR_EOF sed 's/^X//' << \SHAR_EOF > asm1.asm X; X; X; OPCODE TABLE AND OPERAND EVALUATION ROUTINES X; X; BYTE 0, BASE OPCODE VALUE: BITS 7-3 RIGHT SHIFTED 1 BIT (BIT2 ALWAYS 0) X; BYTE 1, CODE IDENTIFYING VALID OPERAND MODES X; X; 0 -- NO OPERAND ALLOWED X; 1 -- RELATIVE ADDRESSING X; 2 -- XIND, ZP, IMM, ABS, INDY, ZPIND, ZPX, ABSY, ABSX X; 3 -- ZP, IMM, ABS X; 4 -- ZP, ACC, ABS, ZPX, ABSX X; 5 -- XIND, ZP, ABS, INDY, ZPIND, ZPX, ABSY, ABSX X; 6 -- ZP, ABS, ZPYSP X; 7 -- ZP, ABS, ZPX, ABSX (DEC, INC) X; 8 -- ZP, ABS, ZPX X; 9 -- ZP, ABS (BIT) X; 10 -- ABS, ABSIND (JMP) X; 11 -- (JSR) X; 12 -- ZP, IMM, ABS, ZPYSP, ABSYSP X; 13 -- ZP, IMM, ABS, ZPX, ABSX X; X; DEFINE MODES X; XXIND = $00 XZP = $04 XACC = $08 XIMM = $08 XABS = $0C XINDY = $10 XZPIND = $11 XZPX = $14 XABSY = $18 XABSX = $1C X; XOPS DB $B1,$02,'ADC' X DB $91,$02,'AND' X DB $82,$04,'ASL' X DB $C8,$01,'BCC' X DB $D8,$01,'BCS' X DB $F8,$01,'BEQ' X DB $90,$09,'BIT' X DB $98,$01,'BMI' X DB $E8,$01,'BNE' X DB $88,$01,'BPL' X DB $C0,$01,'BRA' X DB $80,$00,'BRK' X DB $A8,$01,'BVC' X DB $B8,$01,'BVS' X DB $8C,$00,'CLC' X DB $EC,$00,'CLD' X DB $AC,$00,'CLI' X DB $DC,$00,'CLV' X DB $E1,$02,'CMP' X DB $F0,$03,'CPX' X DB $E0,$03,'CPY' X DB $FF,$49,'DB' X DB $FF,$4A,'DC' X DB $E2,$07,'DEC' X DB $E6,$00,'DEX' X DB $C4,$00,'DEY' X DB $FF,$43,'DS' X DB $FF,$48,'DW' X DB $FF,$42,'END' X DB $A1,$02,'EOR' XEQCODE DB $FF,$41,'EQU' X DB $FF,$45,'INCLUDE' X DB $F2,$07,'INC' X DB $F4,$00,'INX' X DB $E4,$00,'INY' X DB $A0,$0A,'JMP' X DB $8C,$0B,'JSR' ;VERY FUNNY OPCODE (ABNORMAL) X DB $D1,$02,'LDA' X DB $D2,$0C,'LDX' X DB $D0,$0D,'LDY' X DB $FF,$44,'LIST' X DB $A2,$04,'LSR' X DB $FF,$4C,'MACRO' X DB $FF,$4D,'MEND' X DB $F6,$00,'NOP' X DB $81,$02,'ORA' X DB $FF,$40,'ORG' X DB $FF,$4B,'PAGE' X DB $A4,$00,'PHA' X DB $84,$00,'PHP' X DB $B4,$00,'PLA' X DB $94,$00,'PLP' X DB $92,$04,'ROL' X DB $B2,$04,'ROR' X DB $A0,$00,'RTI' X DB $B0,$00,'RTS' X DB $F1,$02,'SBC' X DB $9C,$00,'SEC' X DB $FC,$00,'SED' X DB $BC,$00,'SEI' X DB $C1,$05,'STA' X DB $C2,$06,'STX' X DB $C0,$08,'STY' X DB $FF,$47,'SUBTTL' X DB $D6,$00,'TAX' X DB $D4,$00,'TAY' X DB $FF,$46,'TITLE' X DB $DE,$00,'TSX' X DB $C6,$00,'TXA' X DB $CE,$00,'TXS' X DB $CC,$00,'TYA' XENDOPS DB $FF,$FF X; XNOTHG LDA LABEL X BNE LABONL XCOMMNT LDA #$80 X STA ISVAL XLABONL CLC X RTS X; XGENCODE LDY #0 X JSR GETSYM ;LABEL? X LDA SYMBOL X BEQ NOLBL ;NO DO OPCODE THEN X LDX #SYMSIZ+1 XSAVLAB LDA SYMBOL-1,X X STA LABEL-1,X X DEX X BNE SAVLAB X; XNOLBL JSR NXTFLD ;NEXT, SKIP OVER TO OPCODE X LDA #0 X STA ISVAL X STA MODE X STA LEN X STA LEN+1 X LDA #' ' X STA ADRERR X JSR NXTFLD X CMP #';' ;COMMENT? X BEQ NOTHG X TAX X BMI NOTHG X CMP #'=' X BNE NOTEQ X LDA #LOW[EQCODE] X STA TABPTR X LDA #HIGH[EQCODE] X STA TABPTR+1 X INY X JSR NXTFLD X STY TXTPTR X JMP SPCLOP X; XNOTEQ JSR GETSYM X JSR NXTFLD X STY TXTPTR X; X LDA #LOW[OPS-1] X STA TABPTR X LDA #HIGH[OPS-1] X STA TABPTR+1 X LDY #0 XFINDOP INY X LDA (TABPTR),Y X BPL FINDOP X CLC X TYA X ADC TABPTR X STA TABPTR X LDA #0 X ADC TABPTR+1 X STA TABPTR+1 X LDY #1 X LDA (TABPTR),Y X BMI NOTOPC ;IF NO MATCH IN THE TABLE X LDX #$FF X; XOPCPL INY X INX X LDA SYMBOL,X X BEQ TSTEM ;END OF SYMBOL, END OF TABENT? X CMP #$7B X BCS DOCOMP X CMP #$61 X BCC DOCOMP X SBC #$20 XDOCOMP CMP (TABPTR),Y X BNE FINDOP X BEQ OPCPL X; XNOTOPC LDA #'O' X STA ADRERR X LDA #$EA ;3 NOP INSTRUCTIONS X STA OPCODE X STA VALUE X STA VALUE+1 X LDA #3 X STA LEN X LDY #0 ;CC=ZERO, PLUS (ERROR) X RTS X; XTSTEM LDA (TABPTR),Y X BPL FINDOP ;NOT END OF TABLE ENTRY, NO MATCH X; XSPCLOP LDY #0 X LDA (TABPTR),Y X STA OPCODE X INY X INC LEN X LDA (TABPTR),Y X BEQ OPNDOK X LDY TXTPTR X CMP #$40 X BCC MACHCD ;IF 6502 INSTRUCTION X JMP ASSDIR X; XMACHCD JSR RDOPND X STY TXTPTR X BCC OPNDOK X LDA #'E' X STA ADRERR XOPNDOK LDA OPCODE X AND #$FC X CLC X ADC OPCODE X CLC X ADC MODE X STA OPCODE X JMP CODOBJ X; X; ESTABLISH MODE FROM SYNTAX OF OPERAND X; XRELJMP JSR EVALAB ;EVALUATE ADDRESS X CLC X LDA VALUE X SBC PC X STA VALUE X BNE GRELV X DEC VALUE+1 XGRELV LDA VALUE+1 X SBC PC+1 X STA VALUE+1 X DEC VALUE X; X LDA VALUE X ASL A X LDA VALUE+1 X ADC #0 X BEQ RRELV X LDA #' ' X CMP ADRERR X BCC RRELV X LDA #'V' X STA ADRERR XRRELV CLC X RTS X; XJMPGRP LDA (TEXTP),Y X CMP #'(' X BNE JABS X LDA #$2C ;MODE OFFSET = 2C X STA MODE X INY X JSR EVALAB X DEY X LDA (TEXTP),Y X CMP #')' X BNE SMERR X JMP SMXIT X; XJABS JSR EVALAB X JMP SMABS X; XACCREF LDA #1 X STA LEN X BNE ACCJ X; XJSUB JSR EVALAB XACCJ LDA #ACC X JMP SMRET X; XABSOPD JMP ZPOPNOK X; XRDOPND INC LEN X CMP #1 ;IF RELATIVE BRANCH, SPECIAL X BEQ RELJMP X INC LEN X CMP #$0A ;IF JUMP, ONLY ABS AND ABSIND ARE ALLOWED X BEQ JMPGRP X CMP #$0B X BEQ JSUB X TAX ;SAVE FOR FUTURE REF. X STA MODE X LDA (TEXTP),Y X CPX #$04 ;ACC OPERAND ALLOWED? X BNE NOACC ;NO, THEN "A" IS NOT SPECIAL X CMP #'a' X BEQ ISACC X CMP #'A' X BNE NOACC XISACC INY X LDA (TEXTP),Y X CMP #'0' X BCC ACCREF X CMP #'z'+1 X BCS ACCREF X DEY X BCC GOTACH XNOACC CMP #'#' X BEQ SMIMM X CMP #'(' X BEQ SMIND XGOTACH JSR EVALAB ;EVALUATE ABSOLUTE OPERAND X DEY X LDA FWDREF ;FORWARD REFERENCES ARE ALWAYS 16-BIT X ORA VALUE+1 X BNE ABS16 X LDA ADRERR X CMP #' ' X BEQ ABSOPD XABS16 LDA (TEXTP),Y X CMP #',' X BNE SMABS X JSR NEXTCHR ;GET NEXT CHAR (INY) AND FORCE UPPER CASE X CMP #'Y' X BEQ SMAY X CMP #'X' X BEQ SMAX XSMERR SEC ;ELSE, ERROR X RTS X; XSMIND DEC LEN X INY X JSR EVALAB X LDA VALUE+1 X BNE SMERR X DEY X LDA (TEXTP),Y X CMP #',' X BEQ SMINX X CMP #')' X BNE SMERR X INY X LDA (TEXTP),Y X CMP #',' X BNE SZI X JSR NEXTCHR ;GET NEXT CHAR (INY) AND FORCE UPPER CASE X CMP #'Y' X BNE SMERR X LDA #INDY X DB $2C ;BIT [ADDR16] (SKIP 2 BYTES) X; XSMABS LDA #ABS X DB $2C ;BIT [ADDR16] (SKIP 2 BYTES) X; XSMAX LDA #ABSX X JMP SMRET X; XSMZPY CMP #'Y' XTSMERR BNE SMERR X LDX MODE X CPX #$03 X BEQ ZPYSP X CPX #$0C X BEQ ZPYSP X CPX #$06 X BEQ ZPYSP X; XSMAY LDA #3 X STA LEN X LDX MODE X CPX #$0C X BEQ SMAX X LDA #ABSY X BNE SMRET X; XSMIMM DEC LEN X INY X JSR EVALAB X LDA VALUE+1 X BEQ SMIMOK X LDA VALUE X BPL SMIMBD X INC VALUE+1 X BEQ SMIMOK XSMIMBD LDA #' ' X CMP ADRERR X BCC SMIMOK X LDA #'V' X STA ADRERR XSMIMOK LDX MODE X CPX #$03 X BEQ XYIMM X CPX #$06 X BEQ XYIMM X CPX #$08 X BEQ XYIMM X CPX #$0C X BEQ XYIMM X CPX #$0D X BEQ XYIMM X LDA #IMM X BNE SMRET X; XSMINX JSR NEXTCHR ;GET NEXT CHAR (INY) AND FORCE UPPER CASE X CMP #'X' X BNE TSMERR X INY X LDA (TEXTP),Y X CMP #')' X BNE TSMERR XXYIMM LDA #XIND XSMRET STA MODE XSMXIT CLC X RTS X; XSZI LDA #ZPIND X BNE SMRET X; XZPYSP LDA #ZPX X BNE SMRET X; XSMZP LDA #ZP X BNE SMRET X; XZPOPNOK DEC LEN X LDA (TEXTP),Y X CMP #',' X BNE SMZP X JSR NEXTCHR ;GET NEXT CHAR (INY) AND FORCE UPPER CASE X CMP #'X' X BEQ ZPYSP X JMP SMZPY X; XNEXTCHR INY X LDA (TEXTP),Y X CMP #$7B X BCS CHROK X CMP #$61 X BCC CHROK X SBC #$20 XCHROK RTS SHAR_EOF sed 's/^X//' << \SHAR_EOF > asm2.asm X; X; MACRO.ASM X; XDOMACRO RTS XDOMEND RTS X; X; DATA.ASM X; XDSETUP LDY #STRMAX X LDA #' ' XCLRSTR STA DATBUF-1,Y X DEY X BNE CLRSTR X LDY TXTPTR X RTS X; XDEFWP JSR DSETUP XDEFWPL JSR EVALAB X LDA VALUE X LDX LEN X STA DATBUF,X X INX X LDA VALUE+1 X STA DATBUF,X X INX X STX LEN X DEY X LDA (TEXTP),Y X INY X CMP #',' X BEQ DEFWPL X BNE EXITWS X; XGETTTL JSR DSETUP X LDA #2 X BNE TTLS XGETSTL JSR DSETUP X LDA #1 XTTLS BIT TTLFLG X BEQ DOTTL X LDX PASSNO X BNE IGNTTL XDOTTL TAX X LDA TTLCODE,X X ORA TTLFLG X STA TTLFLG X BNE DEFBPE X; XDEFCOP JSR DSETUP X LDA #$80 X BMI DEFBEN X; XDEFBP JSR DSETUP XDEFBPE LDA #0 XDEFBEN STA MODE X LDX #0 XDEFBLP LDA (TEXTP),Y X CMP #$27 ;STARTING QUOTE? X BEQ QTSTR X CPX #STRMAX X BCS TOLONG X CMP #EOL X BEQ TOLONG X JSR EVALAB X LDA VALUE X LDX LEN X STA DATBUF,X X INX X DEY XENDBS STX LEN X LDA MODE X ORA DATBUF-1,X ;SET THE HIGH BIT OF THE LAST CHAR X STA DATBUF-1,X X LDA (TEXTP),Y X INY X CMP #',' X BEQ DEFBLP XEXITBS BIT TTLFLG X BMI LDTITL X BVS LDSTTL XEXITWS LDX #6 XCPYTXT LDA DATBUF-1,X X STA OPCODE-1,X X DEX X BNE CPYTXT X STX MODE X JSR DATOBJ XIGNTTL CLC X RTS X; XQTSTR INY X LDA (TEXTP),Y X CMP #$27 ;END QUOTE? X BEQ CLQUOT X CMP #EOL X BEQ TOLONG X STA DATBUF,X X INX X CPX #STRMAX X BCC QTSTR X; XTOLONG LDA #'S' X STA ADRERR X DEY ;INSURE WE SEE EOL LATER X; XCLQUOT INY X BNE ENDBS X; XLDTITL LDX #60 XLDTITA LDA DATBUF-1,X X STA TITLE-1,X X DEX X BNE LDTITA XTTLXIT STX LEN X LDA #$80 X STA ISVAL X LDA TTLFLG X AND #3 X STA TTLFLG X RTS X; XLDSTTL LDX #60 XLDSTTA LDA DATBUF-1,X X STA SUBTTL-1,X X DEX X BNE LDSTTA X BEQ TTLXIT X; XDOEJECT JSR DSETUP X LDA CURLINE X BEQ ALREADY X LDA #$FF X STA CURLINE ;FORCE A PAGE EJECT XALREADY JSR IFARG X BCC NOARG X JSR EVALAB X LDA VALUE+1 X BNE TERROR X LDA VALUE X BMI TERROR X STA LPP XNOARG CLC X RTS X; XIFARG JSR NXTFLD X CMP #EOL X BEQ NOARG X CMP #';' X BEQ NOARG X; XTERROR SEC X RTS X; XTTLCODE = *-1 X DB $41,$82 X; X; DIREC.ASM X; X; HANDLE ASSEMBLER DIRECTIVES (Byte 2 of opcode table > 0x40) X; XASSDIR DEC LEN X AND #$3F X CMP #DIRTBH-DIRTBL X TAX X LDA DIRTBH,X X PHA X LDA DIRTBL,X X PHA X RTS X XDIRTBL DB LOW[ASSORG-1] X DB LOW[ASSEQU-1] X DB LOW[ASSEND-1] X DB LOW[ASSDEFS-1] X DB LOW[ASSLIST-1] X DB LOW[ASSINCL-1] X DB LOW[GETTTL-1] X DB LOW[GETSTL-1] X DB LOW[DEFWP-1] X DB LOW[DEFBP-1] X DB LOW[DEFCOP-1] X DB LOW[DOEJECT-1] X DB LOW[DOMACRO-1] X DB LOW[DOMEND-1] X XDIRTBH DB HIGH[ASSORG-1] X DB HIGH[ASSEQU-1] X DB HIGH[ASSEND-1] X DB HIGH[ASSDEFS-1] X DB HIGH[ASSLIST-1] X DB HIGH[ASSINCL-1] X DB HIGH[GETTTL-1] X DB HIGH[GETSTL-1] X DB HIGH[DEFWP-1] X DB HIGH[DEFBP-1] X DB HIGH[DEFCOP-1] X DB HIGH[DOEJECT-1] X DB HIGH[DOMACRO-1] X DB HIGH[DOMEND-1] X; XASSORG JSR EVALAB X LDA VALUE X LDX PC X STA PC X STX VALUE X LDA VALUE+1 X LDX PC+1 X STA PC+1 X STX VALUE+1 X INC ISVAL X RTS X; XASSEQU JSR EVALAB X INC ISVAL X RTS X; XASSEND LDA (TEXTP),Y X CMP #';' X BEQ NOENDV X CMP #EOL X BEQ NOENDV X JSR EVALAB X DEY X LDA (TEXTP),Y X INY X CMP #',' X BNE RUNEND X LDA VALUE X STA INIPT X LDA VALUE+1 X STA INIPT+1 X DEC INIFLG X BNE ASSEND X; XRUNEND LDA VALUE X STA ENTPT X LDA VALUE+1 X STA ENTPT+1 X DEC ENTPTF XNOENDV DEC ENDFLG X RTS X; XASSDEFS JSR EVALAB X LDA VALUE X STA LEN X LDA VALUE+1 X STA LEN+1 X LDA #$FF X STA MODE X RTS X; XBMPFIL STX FILE XCMTXIT JMP COMMNT X; XASSINCL LDX #0 XASSINL LDA (TEXTP),Y X CMP #'z'+1 X BCS ICLXIT X CMP #'.' X BCC ICLXIT X STA FNBUF,X X INY X INX X CPX #FNSIZE X BNE ASSINL X; XICLXIT LDA #EOL X STA FNBUF,X X JSR BLDFNB X CLC X LDA FILE X ADC #$10 X BMI TMINCF X TAX X LDA #LOW[FNBUF] X LDY #HIGH[FNBUF] X JSR OPENIN X BPL BMPFIL X; XTMINCF LDA #'I' X STA ADRERR X BNE CMTXIT X; XASSLIST EQU CMTXIT ;NOT IMPLEMENTED YET SHAR_EOF sed 's/^X//' << \SHAR_EOF > asm3.asm X; X; EXPR.ASM X; X; PROVIDE FOR EXPRESSIONS IN OPERANDS X; XMUL16 LDA OPNDL-1,X X STA SECVAL X LDA OPNDH-1,X X STA SECVAL+1 X LDA OPNDH-2,X X PHA X LDA OPNDL-2,X X TAX X LDA #0 X STA VALUE X STA VALUE+1 X LDA #8 X STA CNT X PLA XML0 JSR MUL1 X DEC CNT X BNE ML0 X; X LDA #8 X STA CNT X TXA XML1 JSR MUL1 X DEC CNT X BNE ML1 X RTS X; XMUL1 ASL VALUE X ROL VALUE+1 XMUL0 ASL A X BCC MEX X PHA X CLC X LDA VALUE X ADC SECVAL X STA VALUE X LDA VALUE+1 X ADC SECVAL+1 X STA VALUE+1 X PLA XMEX RTS X; XDIV16 LDA OPNDL-1,X X STA SECVAL X LDA OPNDH-1,X X STA SECVAL+1 X LDA OPNDL-2,X X PHA X LDA OPNDH-2,X X TAX X LDA #0 X STA VALUE X STA VALUE+1 X LDA #-16 X STA CNT X PLA XGETSIZ BIT SECVAL+1 X BMI DODVS X ASL SECVAL X ROL SECVAL+1 X INC CNT X BNE GETSIZ X RTS X; XDODVS PHA X LDA CNT X AND #$0F X STA CNT X PLA XCMP16 CPX SECVAL+1 X BNE CMPX X CMP SECVAL XCMPX PHP X ROL VALUE X ROL VALUE+1 X PLP X BCC NOSUB X SBC SECVAL X PHA X TXA X SBC SECVAL+1 X TAX X PLA XNOSUB LSR SECVAL+1 X ROR SECVAL X DEC CNT X BPL CMP16 X RTS X; XDOADD CLC X LDA OPNDL-2,X X ADC OPNDL-1,X X STA OPNDL-2,X X LDA OPNDH-2,X X ADC OPNDH-1,X X STA OPNDH-2,X X JMP DOOPXB X; XDOSUB SEC X LDA OPNDL-2,X X SBC OPNDL-1,X X STA OPNDL-2,X X LDA OPNDH-2,X X SBC OPNDH-1,X X STA OPNDH-2,X X JMP DOOPXB X; XDONEG SEC X LDA #0 X SBC OPNDL-1,X X STA OPNDL-1,X X LDA #0 X SBC OPNDH-1,X X STA OPNDH-1,X X JMP DOOPXU X; XDOOP LDX OPDSP X CMP #'+' X BEQ DOADD X CMP #'-' X BEQ DOSUB X CMP #'!' X BEQ DONEG X CMP #'*' X BEQ DOMUL X CMP #'/' X BEQ DODIV X CMP #'%' X BEQ DOMOD X CMP #'&' X BEQ DOAND X CMP #'|' X BEQ DOOR X BNE DOOPXU X; XDOOPCX LDX OPDSP X LDA VALUE X STA OPNDL-2,X X LDA VALUE+1 X STA OPNDH-2,X XDOOPXB DEC OPDSP XDOOPXU DEC OPRSP X LDX OPRSP X LDA OPERS+1,X X CLC X RTS X; XDOMUL JSR MUL16 X JMP DOOPCX X; XDODIV JSR DIV16 X JMP DOOPCX X; XDOMOD JSR DIV16 X PHA X TXA X LDX OPDSP X STA OPNDH-2,X X PLA X STA OPNDL-2,X X JMP DOOPXB X; XDOAND LDA OPNDL-2,X X AND OPNDL-1,X X STA OPNDL-2,X X LDA OPNDH-2,X X AND OPNDH-1,X X STA OPNDH-2,X X JMP DOOPXB X; XDOOR LDA OPNDL-2,X X ORA OPNDL-1,X X STA OPNDL-2,X X LDA OPNDH-2,X X ORA OPNDH-1,X X STA OPNDH-2,X X JMP DOOPXB X; X; SYMBOLIC FUNCTION TESTS X; XLTEST LDA SYMBOL X CMP #'L' X BNE NOTM X LDA SYMBOL+1 X CMP #'O' X BNE NOTM X LDA SYMBOL+2 X BEQ TMATCH X CMP #'W' X BNE NOTM X LDA SYMBOL+3 X BNE NOTM X; XTMATCH SEC X RTS ;CY=1 X; XHTEST LDA SYMBOL X CMP #'H' X BNE NOTM X LDA SYMBOL+1 X CMP #'I' X BNE NOTM X LDA SYMBOL+2 X BEQ TMATCH X CMP #'G' X BNE NOTM X LDA SYMBOL+3 X CMP #'H' X BNE NOTM X LDA SYMBOL+4 X BEQ TMATCH XNOTM CLC X RTS X; XDOFUN LDX OPDSP X LDA FUNC X CMP #'H' X BNE SAVLO X LDA OPNDH-1,X X STA OPNDL-1,X XSAVLO LDA #0 X STA OPNDH-1,X X BEQ UNEXIT X; XLOWFUN LDA #'L' X BNE LFXIT X; XHIGHFUN LDA #'H' XLFXIT STA FUNC X LDA (TEXTP),Y X CMP #'[' X BNE NOBMP X INY XNOBMP LDA #'@' X BNE PUSHOP X; XCKPAREN LDA (TEXTP),Y X INY X CMP #'-' ;UNARY MINUS? X BEQ PSHCOM X CMP #'[' X BEQ PUSHOP XRETERR SEC X RTS ;ELSE, EXPRESSION ERROR! X; XPSHCOM LDA #'!' ;UNARY MINUS ON STACK XPUSHOP LDX OPRSP X STA OPERS,X ;PUT NEW OPERATOR ON STACK X INC OPRSP X JMP EVAL X; XUNEST LDX OPRSP X BEQ RETERR X LDA OPERS-1,X X CMP #'[' X BEQ UNEXIT X CMP #'@' X BEQ DOFUN X JSR DOOP X BCC UNEST X RTS X; XUNEXIT DEC OPRSP X JMP GETOPR X; XEVALAB LDA #0 X STA OPRSP X STA OPDSP ;CLEAR EVALUATION STACKS X STA FWDREF ;AND FORWARD REF. FLAG X JSR NXTFLD XEVAL STY TXTPTR X JSR GETSYM X JSR HTEST X BCS HIGHFUN X JSR LTEST X BCS LOWFUN X LDY TXTPTR ;NOT A SYMBOLIC FUNCTION X JSR PRIMRY X BCS CKPAREN X LDX OPDSP X LDA VALUE X STA OPNDL,X X LDA VALUE+1 X STA OPNDH,X X INC OPDSP X; XGETOPR LDA (TEXTP),Y X INY X CMP #'-' X BEQ ADDSUB X CMP #'+' X BEQ ADDSUB X CMP #'*' X BEQ MULDIV X CMP #'/' X BEQ MULDIV X CMP #'%' X BEQ MULDIV X CMP #'&' X BEQ ANDOP X CMP #'|' X BEQ OROP X CMP #']' X BEQ UNEST XWRPUP LDX OPRSP X BEQ EVDON X LDA OPERS-1,X X CMP #'[' X BEQ EVDON X JSR DOOP X BCC WRPUP X RTS X; XEVDON CLC X DEC OPDSP X BEQ EVNXIT X SEC XEVNXIT LDA OPNDL X STA VALUE X LDA OPNDH X STA VALUE+1 X RTS X; XADDSUB LDX OPRSP X STA OPERS,X ;IF WE NEED TO DO IT NOW X BEQ EXIT X LDA OPERS-1,X X CMP #'[' X BEQ EXIT X CMP #'@' X BEQ EXIT X JSR DOOP X BCC ADDSUB X RTS X; XANDOP LDX OPRSP X STA OPERS,X X BEQ EXIT X LDA OPERS-1,X X CMP #'!' X BNE EXIT X JSR DOOP X BCC ANDOP X RTS X; XEXIT INC OPRSP X JMP EVAL X; XMULDIV LDX OPRSP X STA OPERS,X X BEQ EXIT X LDA OPERS-1,X X CMP #'+' X BEQ EXIT X CMP #'-' X BEQ EXIT X CMP #'[' X BEQ EXIT X CMP #'@' X BEQ EXIT X JSR DOOP X BCC MULDIV X RTS X; XOROP LDX OPRSP X STA OPERS,X X BEQ EXIT X LDA OPERS-1,X X CMP #'!' X BEQ ORDOOP X CMP #'&' X BNE EXIT XORDOOP JSR DOOP X BCC OROP X RTS X; XEVLSYM STY TXTPTR X JSR FIND ;GET SYMBOL FROM TABLE X BCS UNDFSM ;IF SYMBOL UNDEFINED X; X JSR GETVAL X; X LDA SFLGS X AND #$08 ;PROPOGATE FORWARD REFERENCES X ORA FWDREF ;NOTE THAT THE FLAG IS IN BIT 3 NOW X STA FWDREF ;(BIT 2 IN THE SYMBOL TABLE) X; X BIT SFLGS X BMI UNDFSM X LDA SVAL X STA VALUE X LDA SVAL+1 X STA VALUE+1 XEVSXIT LDY TXTPTR X CLC X RTS X; XUNDFSM LDA #'U' X STA ADRERR X BNE EVSXIT X; X; EVALUATE AN OPERAND EXPRESSION X; XPRIMRY LDA #0 X STA VALUE X STA VALUE+1 X STA SYMBOL X JSR GETSYM X LDA SYMBOL X BNE EVLSYM ;IF A SYMBOL WAS FOUND X LDA (TEXTP),Y X CMP #'$' X BNE NOTHEX XHEXCVL INY X LDA (TEXTP),Y X CMP #'f'+1 X BCS ENDEXP X CMP #'a' X BCC NLCHD X SBC #'a'-10 X BCS HEXDGT X; XNLCHD CMP #'F'+1 X BCS ENDEXP X CMP #'A' X BCC NUCHD X SBC #'A'-10 X BCS HEXDGT X; XNUCHD CMP #'9'+1 X BCS ENDEXP X CMP #'0' X BCC ENDEXP X SBC #'0' XHEXDGT ASL VALUE X ROL VALUE+1 X ASL VALUE X ROL VALUE+1 X ASL VALUE X ROL VALUE+1 X ASL VALUE X ROL VALUE+1 X ORA VALUE X STA VALUE X JMP HEXCVL X; XENDEXP CLC X RTS X; XNOPRIM SEC X RTS X; XNOTHEX CMP #'%' X BEQ ISBIN X CMP #'@' X BEQ ISOCT X CMP #'*' X BEQ ISPC X CMP #$27 ;QUOTED CHARACTERS X BEQ ISQSTR X CMP #'9'+1 X BCS NOPRIM X CMP #'0' X BCC NOPRIM XDECCVL CMP #'9'+1 X BCS ENDEXP X CMP #'0' X BCC ENDEXP X SBC #'0' X PHA X ASL VALUE X ROL VALUE+1 X LDA VALUE+1 X STA TEMP X LDA VALUE X ASL A X ROL TEMP X ASL A X ROL TEMP X CLC X ADC VALUE X STA VALUE X LDA TEMP X ADC VALUE+1 X STA VALUE+1 X CLC X PLA X ADC VALUE X STA VALUE X LDA #0 X ADC VALUE+1 X STA VALUE+1 X INY X LDA (TEXTP),Y X JMP DECCVL X; XISBIN INY X LDA (TEXTP),Y X CMP #'0' X BCC ENDEXP X CMP #'1' X BCC SHFTBN X BNE ENDEXP XSHFTBN ROL VALUE X ROL VALUE+1 X JMP ISBIN X; XISOCT INY X LDA (TEXTP),Y X CMP #'7'+1 XENDOCT BCS ENDEXP X CMP #'0' XND2OCT BCC ENDEXP X SBC #'0' X ASL VALUE X ROL VALUE+1 X ASL VALUE X ROL VALUE+1 X ASL VALUE X ROL VALUE+1 X ORA VALUE X STA VALUE X JMP ISOCT X; XISPC INY X LDA PC X STA VALUE X LDA PC+1 X STA VALUE+1 X BCS ENDOCT X; XISQSTR INY X LDA (TEXTP),Y X INY X CMP #$27 X BEQ ENDOCT X CMP #EOL X BEQ STRERR X STA VALUE X LDA (TEXTP),Y X INY X CMP #$27 X BEQ ENDOCT X CMP #EOL X BEQ STRERR X STA VALUE+1 X LDA (TEXTP),Y X INY X CMP #$27 X BEQ ENDOCT XSTRERR LDA #'S' X STA ADRERR X JMP ENDEXP X; XGETSYM LDX #0 XGSYMLP LDA (TEXTP),Y XGSLP1 CMP #'A' X BCC ENDOPC X CMP #'Z'+1 X BCC STCHAR X CMP #'_' ;ALLOW UNDERSCORES IN SYMBOLS X BEQ STCHAR X CMP #'a' X BCC ENDOPC X CMP #'z'+1 X BCS ENDOPC XSTCHAR INY X CPX #SYMSIZ ;ALLOW 8 CHAR SYMBOLS X BCS GSYMLP X STA SYMBOL,X X INX X LDA (TEXTP),Y X CMP #'9'+1 X BCS GSLP1 X CMP #'0' X BCS STCHAR X; XENDOPC LDA #0 X INX X STA SYMBOL-1,X X RTS X; XSKPTXT LDA (TEXTP),Y X CMP #EOL X BEQ SKXIT X CMP #' ' X BEQ SKXIT X CMP #TAB X BNE SKPTXT X XSKIPF INY XNXTFLD LDA (TEXTP),Y X CMP #' ' X BEQ SKIPF X CMP #TAB X BEQ SKIPF XSKXIT RTS SHAR_EOF sed 's/^X//' << \SHAR_EOF > asm4.asm X; X; SYMBOLS.ASM X; X; SYMBOL TABLE FORMAT: X; X; BYTE 0: FLAGS AND BITS 8 AND 0 OF VALUE X; BIT 7 -- ALWAYS 1 X; BIT 6 -- UNDEFINED X; BIT 5 -- GLOBAL X; BIT 4 -- VALUE BIT 8 X; BIT 3 -- VALUE BIT 0 X; BIT 2 -- FORWARD REFERENCE FLAG X; BITS 1-0 -- ORIGIN NUMBER X; X; BYTE 1: BITS 7-1 OF VALUE X; X; BYTE 2: BITS 15-9 OF VALUE X; X; PRINT THE SYMBOL TABLE X; XPRTABE RTS X; XPRSTAB LDA #LOW[SYMTAB] X STA TABPTR X LDA #HIGH[SYMTAB] X STA TABPTR+1 XPRTALN JSR CLEAR X LDA #0 XPRTABL STA TXTPTR X LDA TABPTR+1 X LDX TABPTR X CPX ENDSTAB X SBC ENDSTAB+1 X BCS PRTABE X JSR GETVAL X LDX TXTPTR X LDA SVAL+1 X JSR PRHEX X LDA SVAL X JSR PRHEX X INX X BIT SFLGS X BPL SYMDFD X LDA #'U' X STA PRBUF,X XSYMDFD INX X LDA #'L' X BVC SYMLCL X LDA #'E' XSYMLCL STA PRBUF,X X LDA #' ' X LDY #2 XSYMNLP INX X INY X STA PRBUF,X X LDA (TABPTR),Y X BPL SYMNLP X STX TXTPTR X CLC X TYA X ADC TABPTR X STA TABPTR X LDA #0 X ADC TABPTR+1 X STA TABPTR+1 X LDA #0 XNXTCOL CLC X ADC #CWIDTH X CMP TXTPTR X BCC NXTCOL X CMP #PRTLEN-CWIDTH X BCC PRTABL X LDA #EOL X STA PRBUF+1,X X JSR LIST X JMP PRTALN X; X; ADD A SYMBOL AND VALUE TO THE SYMBOL TABLE X; XADDSYM LDA LABEL X BEQ NOSYM X LDX VALUE X LDY VALUE+1 X LDA ISVAL X BNE USEVAL X LDX PC X LDY PC+1 XUSEVAL STX SVAL X STY SVAL+1 X; X LDX #2 XFESYM INX X LDA LABEL-3,X X STA SYMBOL-3,X X BNE FESYM X STX SLEN X JSR FIND X BCC OLDSYM X LDA ENDSTAB+1 X STA TEMP+1 X LDY ENDSTAB ;POINT TO END OF SYMBOL TABLE XCPFS1 STY TEMP X LDY #0 X LDA (TEMP),Y ;AND MAKE ROOM FOR X LDY SLEN ;NEW ENTRY OF SLEN BYTES X STA (TEMP),Y X LDY TEMP X BNE DECFS1 X DEC TEMP+1 XDECFS1 DEY XFSNDCK LDA TEMP+1 ;START OF NEW SYMBOL? X CPY TABPTR X SBC TABPTR+1 X BCS CPFS1 ;NO, MOVE ANOTHER BYTE X; X LDA SLEN X TAY X ADC ENDSTAB ;POINT TO END OF X STA ENDSTAB ;LONGER SYMBOL TABLE X LDA #0 X ADC ENDSTAB+1 X STA ENDSTAB+1 XNEWTXT DEY X LDA SYMBOL-3,Y X STA (TABPTR),Y X CPY #3 X BNE NEWTXT X; X; SAVE VALUE AND FLAGS IN SYMBOL TABLE ENTRY X; XPUTVAL LDA SVAL+1 X LSR A X PHP X LDY #2 X STA (TABPTR),Y X LDA SVAL X LSR A X DEY X STA (TABPTR),Y X DEY X TYA X ROR A X PLP X ROR A X LSR A X LSR A X ORA SFLGS X SEC X ROR A X STA (TABPTR),Y XNOSYM RTS X; X; CLEAR THE FORWARD REFERENCE FLAG X; XOLDSYM LDY #0 X LDA (TABPTR),Y X AND #$FB ;CLEAR BIT 2 (FORWARD REF. FLAG) X CMP (TABPTR),Y X BEQ DUPSYM X STA (TABPTR),Y X RTS X; XDUPSYM LDA #'D' ;ERROR ON SECOND DEFINITION X STA ADRERR X RTS X; X; RECOVER VALUE AND FLAGS FROM SYMBOL TABLE ENTRY X; XGETVAL LDY #0 X LDA (TABPTR),Y ;GET FLAGS X ASL A X PHA X AND #$CE ;EXTRACT FLAGS X STA SFLGS ;AND SAVE THEM X PLA X ASL A X ASL A X ASL A ;SAVE BIT 8 IN CY X PHP X ASL A ;PUT BIT 0 INTO CY X INY X LDA (TABPTR),Y X ROL A ;MERGE BITS 0 AND 1-7 X STA SVAL X PLP X INY X LDA (TABPTR),Y X ROL A ;MERGE BITS 8 AND 9-15 X STA SVAL+1 XSYMFND RTS X; X; FIND LOCATION FOR A SYMBOL IN THE TABLE X; XFIND LDX ENDSTAB X STX HIGHP X LDA ENDSTAB+1 X STA HIGHP+1 X LDX #LOW[SYMTAB] X STX LOWP X LDA #HIGH[SYMTAB] X STA LOWP+1 X STA TABPTR+1 X STX TABPTR X; X CPX HIGHP X SBC HIGHP+1 X BCS SNFND X; XHALVE SEC X LDA HIGHP X ADC LOWP X STA TABPTR X LDA HIGHP+1 X ADC LOWP+1 X ROR A X ROR TABPTR X STA TABPTR+1 X LDY #0 X LDA (TABPTR),Y X BMI GSTRT ;FOUND START OF A SYMBOL XNOT1ST LDA TABPTR X BNE FBKUP X DEC TABPTR+1 XFBKUP DEC TABPTR X LDA (TABPTR),Y X BPL NOT1ST X; XGSTRT LDY #3 XFCHRLP LDA (TABPTR),Y X BMI MTCHOK X CMP SYMBOL-3,Y ;MATCH? X BCC FADVC1 ;TABLE ENT. < SYMBOL X BNE FBKUP1 ;TABLE ENT. > SYMBOL X INY X BCS FCHRLP X; XMTCHOK CLC X LDA SYMBOL-3,Y X BEQ SYMFND ;SYMBOL FOUND (CY=0) X BNE FADVC2 X; XFADVC1 INY XFADVC2 LDA (TABPTR),Y X BPL FADVC1 X CLC X TYA X ADC TABPTR X LDY TABPTR+1 X BCC FADVNI X INY XFADVNI CPY HIGHP+1 X BCC FADVC3 X CMP HIGHP X BCC FADVC3 X STA TABPTR ;SYMBOL NOT FOUND (CY=1) X STY TABPTR+1 XSNFND RTS X; XFADVC3 STY LOWP+1 X STA LOWP X BCC HALVE X; XFBKUP1 LDA LOWP X CMP TABPTR X LDA LOWP+1 X SBC TABPTR+1 X BCS SNFND ;SYMBOL NOT FOUND (CY=1) X LDA TABPTR X STA HIGHP X LDA TABPTR+1 X STA HIGHP+1 X BCC HALVE SHAR_EOF sed 's/^X//' << \SHAR_EOF > asm5.asm X; X; PRINT.ASM X; X; PRINT THE GENERATED CODE/SOURCE LINE X; XPRINT JSR CLEAR X; X LDX #2 X LDA ISVAL X BMI NOADDR X BNE VALADR X; X LDA PC+1 X JSR PRHEX X LDA PC X JMP LSTHLF X; XVALADR LDA VALUE+1 X JSR PRHEX X LDA VALUE XLSTHLF JSR PRHEX X; XNOADDR LDA LEN X STA TEMP X BEQ NODATA X LDA MODE X BMI NODATA X JSR PROBJT ;PRINT 1 TO 6 BYTES OF OBJECT CODE XNODATA LDX #20 X JSR PRSRC X; X LDA ADRERR X STA PRBUF X CMP #' ' X BEQ PRINTQ X; X LDX #LOGDEV X JSR DOPRINT ;LOG ERRORS TO THE SCREEN X; X INC ERRCNT X BNE PRINTQ ;AND COUNT THEM X INC ERRCNT+1 X; XPRINTQ LDA ICMD-2+PRUNIT X BMI LOKXIT X; XEXCODE JSR LIST X BMI LINXIT X LDA MODE X BMI LOKXIT X LDA TEMP X BEQ LINXIT X JSR CLEAR X JSR PROBJT X LDA #EOL X STA PRBUF,X X JMP EXCODE X; XLOKXIT LDA #0 XLINXIT RTS X; X; PRINT A FORMATTED LINE TO LISTING DEVICE X; XLIST LDA CURLINE X INC CURLINE X CMP LPP ;NUMBER OF LINES/PAGE X BCC NONEWP X LDA #' ' X STA PAGE+3 ;BLANK OUT PAGE NO. X STA PAGE+2 X STA PAGE+1 X LDA #0 X STA CURLINE ;START OF NEW PAGE X INC CURPAGE X BNE PAGEOK X INC CURPAGE+1 XPAGEOK LDA CURPAGE X STA FR0 X LDA CURPAGE+1 X STA FR0+1 X JSR IFP X JSR FASCII ;CONVERT TO ASCII STRING X LDY #$FF XPGCPLP INY X LDA (INBUFF),Y X STA PAGE,Y ;COPY TO HEADING BUFFER X BPL PGCPLP X AND #$7F X STA PAGE,Y X; X LDX #PRUNIT X LDA #11 ;PRINT MULTIPLE LINES X STA ICMD,X X LDA #LOW[TTLINE] X STA IBUF,X X LDA #HIGH[TTLINE] X STA IBUF+1,X X LDA TTLLEN X STA ILEN,X X LDA #0 X STA ILEN+1 X JSR CIOV ;WRITE TITLE LINE X; XNONEWP LDX #PRUNIT XDOPRINT LDA #LOW[PRBUF] X STA IBUF,X X LDA #HIGH[PRBUF] X STA IBUF+1,X X; X LDA #9 X STA ICMD,X ;PRINT A LINE ENDING WITH EOL X LDA #81 X STA ILEN,X X LDA #0 X STA ILEN+1,X X JMP CIOV X; X; CONVERT NUMBER TO HEX IN PRINT LINE X; XPRHEX PHA X LSR A X LSR A X LSR A X LSR A X SED X SEC X SBC #9+1 X ADC #'9'+1 X STA PRBUF,X X INX X PLA X AND #$0F X SEC X SBC #9+1 X ADC #'9'+1 X CLD X STA PRBUF,X X INX X RTS X; X; CLEAR THE PRINT LINE X; XCLEAR LDX #0 XCLLP LDA #' ' X STA PRBUF,X X INX X CPX #80 X BCC CLLP X LDA #EOL X STA PRBUF,X X RTS X; X; PRINT SOURCE LINE X; XPRSRC LDY #0 XPRSCP LDA (TEXTP),Y X CMP #TAB X BNE STINBF X; X TXA X LDX #NTABS XNXTTAB DEX X CMP TABTAB,X X BCC NXTTAB X LDA TABTAB+1,X X TAX X BCS PRBMPY XSTINBF STA PRBUF,X X CMP #EOL X BEQ GOTEOL X INX XPRBMPY INY X CPX #80 X BCC PRSCP XGOTEOL RTS X; XTABTAB DB 0,2,7,20,29 X DB 35,43,51,59,67 X DB 72,73,74,75,76 X DB 77,78,79 XNTABS = *-TABTAB X; X; PRINT OUT A CHUNK OF OBJECT CODE X; XPROBJT LDX #7 X LDY #0 X STY TEMP+1 XOBJPRL LDA OPCODE,Y X JSR PRHEX X DEC TEMP X BEQ HEXIT X INC TEMP+1 X LDY TEMP+1 X CPY #6 X BNE OBJPRL X; XLDOUTB LDA DATBUF-1+6,Y X STA OPCODE-1,Y X DEY X BNE LDOUTB X; XPRNX6 LDA DATBUF+6,Y X STA DATBUF,Y X INY X CPY TEMP X BCC PRNX6 X; XHEXIT RTS X; X; OBJECT.OBJ X; X; PUT CONTENTS OF THE DATA BUFFER INTO THE OBJECT FILE X; XDATOBJ LDY PASSNO X BNE NOOBJG X JSR OBJSET XDOLOOP LDA DATBUF,X X JSR WRTBYTE ;PUT EACH BYTE INTO THE BUFFER X INX X CPX LEN ;DONE? X BNE DOLOOP X STY OBJPTR XNOOBJG RTS X; X; PUT THE CONTENTS OF THE MACHINE CODE BUFFER INTO THE OBJECT FILE X; XCODOBJ LDY PASSNO X BNE NOOBJG X JSR OBJSET XCODELP LDA OPCODE,X X JSR WRTBYTE X INX X CPX LEN X BNE CODELP X STY OBJPTR X RTS X; X; INSURE THE PC AGREES WITH THE LOCATION BEING LOADED X; XOBJSET LDY OBJPTR X BEQ NEWSET ;IF NOTHING IN BUFFER X TYA X CLC X ADC OBJBUF X LDX OBJBUF+1 ;ELSE COMPARE BUF ADDR AND PC X BCC NOBX X INX XNOBX CMP PC X BNE NOTSET X CPX PC+1 X BEQ SETXIT ;IF NEXT BYTE ADDR MATCHES PC XNOTSET JSR WRTOBJ X; XNEWSET LDA PC X STA OBJBUF X LDA PC+1 X STA OBJBUF+1 XSETXIT LDX #0 XWRTXIT RTS X; X; WRITE A BYTE TO THE OBJECT FILE BUFFER X; XWRTBYTE STA OBJBUF+4,Y X INY X BNE WRTXIT ;IF NOT THE END OF THE BUFFER X; X; WRITE A BLOCK OF OBJECT TEXT IN OBJBUF X; XWRTOBJ STX LOWP+1 X DEY X TYA X PHA X LDX OBJBUF+1 X CLC X ADC OBJBUF X STA OBJBUF+2 X BCC WRTEQL X INX XWRTEQL STX OBJBUF+3 X LDX #OBUNIT X SEC X PLA X ADC #4 X STA ILEN,X X LDA #1 X BCS ZEROPB X LDA #0 XZEROPB STA ILEN+1,X X JSR CIOV X BMI OBJERR X LDA OBJBUF+3 X STA OBJBUF+1 X LDY OBJBUF+2 X INY X STY OBJBUF X BNE WRTOUT X INC OBJBUF+1 XWRTOUT LDX LOWP+1 X LDY #0 X RTS X; XOBJERR BRK X NOP X JMP ($000A) X; X; INPUT.ASM X; X; PROMPT FOR COMMAND INPUT X; XPROMPT PLA X STA LOWP X PLA X STA LOWP+1 XPRETRY LDA #11 X STA ICMD X LDY #1 X LDX #0 X STX ILEN X STX ILEN+1 XPMTLP LDA (LOWP),Y X BEQ PMTEND X INY X STY TEMP X JSR CIOV X LDY TEMP X BNE PMTLP X; XPMTEND INY X LDA (LOWP),Y X STA HIGHP X INY X LDA (LOWP),Y X STA HIGHP+1 X STY TEMP X LDA #5 X STA ICMD X LDA #FNSIZE-2 X STA ILEN X LDA #0 X STA ILEN+1 X LDA #LOW[FNBUF] X STA IBUF X LDA #HIGH[FNBUF] X STA IBUF+1 X JSR CIOV X BMI PRETRY X JSR BLDFNB X LDY #$FF XCPFNLP INY X LDA FNBUF,Y X STA (HIGHP),Y X BPL CPFNLP X CLC X LDA TEMP X ADC LOWP X STA TEMP X LDA LOWP+1 X ADC #0 X PHA X LDA TEMP X PHA X RTS X; XBLDFNB LDX #0 X LDY #0 X STX TEMP+1 X LDA FNBUF X BPL BLDFNE X DEY XKEEPNM INY X LDA INF,Y X STA FNBUF,Y X BMI NOTDFLT X CMP #'.' X BNE KEEPNM XNOTDFLT LDA #EOL X STA FNBUF,Y X LDY #0 X BEQ BLDFNE X; XBLDFNL CMP #':' X BNE BLDFCP X DEX XBLDFCP CMP #'.' X BNE BLDFND X DEC TEMP+1 XBLDFND INY XBLDFNE LDA FNBUF,Y X BPL BLDFNL X LDA TEMP+1 X BNE GOTEXT X LDA #'.' X STA FNBUF,Y X INY X LDA EXTTXT X STA FNBUF,Y X INY X LDA EXTTXT+1 X STA FNBUF,Y X INY X LDA EXTTXT+2 X STA FNBUF,Y X INY X LDA #EOL X STA FNBUF,Y XGOTEXT TXA X BNE GOTPFX XSHFTBF LDA FNBUF,Y X STA FNBUF+2,Y X DEY X BPL SHFTBF X LDA #'D' X STA FNBUF X LDA #':' X STA FNBUF+1 XGOTPFX RTS X; X; CLOSE A FILE X; XCLOSEF LDA #12 X STA ICMD,X X JMP CIOV X; X; OPEN A FILE FOR INPUT X; XOPENIN STY TEMP X PHA X JSR CLOSEF X LDA #4 XDOPEN STA IAUX,X X PLA X STA IBUF,X X LDA TEMP X STA IBUF+1,X X LDA #3 X STA ICMD,X X JMP CIOV ;OPEN INPUT FILE X; X; OPEN LIST OR OBJECT FILE X; XOPNOUT STY TEMP X PHA X LDA #12 X STA ICMD,X X JSR CIOV X LDA #8 X BNE DOPEN X; X; READ A LINE INTO THE TEXT BUFFER X; AND INITIALIZE THE TEXT POINTERS X; XREADLN LDX FILE ;READ SELECTED FILE X LDA #5 X STA ICMD,X X LDA #LINLEN X STA ILEN,X X LDA #0 X STA ILEN+1,X X STA TXTPTR X LDA #LOW[TEXTBF] X STA IBUF,X X STA TEXTP X LDA #HIGH[TEXTBF] X STA IBUF+1,X X STA TEXTP+1 X JSR CIOV X LDA ILEN,X X TAX X LDA #EOL X STA TEXTBF,X X TYA X RTS SHAR_EOF # End of shell archive exit 0 =========================================================================== Charles Marslett STB Systems, Inc. <== Apply all standard disclaimers Wordmark Systems <== No disclaimers required -- that's just me chasm@killer.dallas.tx.us