Path: utzoo!attcan!uunet!ginosko!bbn!apple!oliveb!ames!killer!chasm From: chasm@killer.DALLAS.TX.US (Charles Marslett) Newsgroups: comp.sys.atari.8bit Subject: An Atari Assembler: A65 Summary: A65 assembler, part 1 of 3 Message-ID: <8447@killer.DALLAS.TX.US> Date: 24 Jun 89 05:38:14 GMT Organization: The Unix(R) Connection, Dallas, Texas Lines: 2537 # 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