TITLE '6502/65C02 ASSEMBLER' SUBTTL 'SOURCE = A65.ASM, 6/24/84, 6/16/89' ; ; Copyright (C) 1984, 1986, 1989 by Charles Marslett ; WORDMARK Systems ; All rights reserved. 2705 Pinewood Dr. ; Garland, TX 75042 ; ; Permission granted to copy, modify or execute ; this program for noncommercial purposes only. ; LOGDEV = $00 ;LOG (SCREEN) IOCB PRUNIT = $10 ;LIST OUTPUT IOCB OBUNIT = $20 ;OBJECT FILE IOCB INUNIT = $30 ;SOURCE FILE IOCB LIST I ; ; PARAMETERS OF THE ASSEMBLER ; SYMSIZ = 11 ;MAX NUMBER OF CHARACTERS IN A SYMBOL FNSIZE = 18 ;MAX LENGTH OF A FILE NAME STRING STRMAX = 120 ;MAX LENGTH OF QUOTED STRING LINLEN = 100 ;MAX LENGTH OF AN INPUT LINE PRTLEN = 80 ;PRINT LINE WIDTH BUFLEN = 256+6 ;MAX SIZE OUTPUT RECORD CWIDTH = SYMSIZ+9 ; TAB = $7F EOL = $9B ; ; REGISTERS ON ZERO PAGE ; DOSVEC = $0A ; ORG $0080 TEXTP DS 2 ;ADDRESS OF TEXT BUFFER TABPTR DS 2 ;ADDRESS OF OPCODE ENTRY ENDSTAB DS 2 ;ADDRESS OF END OF SYMTAB PASSNO DS 1 ;CURRENT ASSEMBLER PASS OPCODE DS 1 ;OPCODE VALUE VALUE DS 2 ;VALUE OF OPERAND SECVAL DS 2 OPER DS 1 SVAL DS 2 ;SYMBOL VALUE SFLGS DS 1 ;SYMBOL FLAGS ; BIT 7=UNDEFINED ; BIT 6=GLOBAL ; BIT 5=0 ; BIT 4=0 ; BIT 3=FORWARD REFERENCE (IN GETVAL) ; BIT 2-1=ORG COUNT ; BIT 0=UNUSED SLEN DS 1 PARENS DS 1 TEMP DS 2 ;GENERAL TEMPORARIES CNT = TEMP MODE DS 1 ;ADDRESSING MODE OFFSET ISVAL DS 1 ;FLAG (NONZERO -> LABEL=VALUE) LEN DS 2 ;LENGTH OF CURRENT INSTRUCTION ADRERR DS 1 ;ADDRESS ERROR FIELD TXTPTR DS 1 ;CURRENT TEXT BYTE OFFSET OBJPTR DS 1 ;NEXT BYTE IN OBJECT BUFFER FILE DS 1 ;IOCB USED CURRENTLY FOR INPUT SYMBOL DS SYMSIZ ;RESERVE 9 BYTES FOR THE SYMBOL DS 1 PC DS 2 ;CURRENT VALUE OF * HIGHP DS 2 LOWP DS 2 OPRSP DS 1 ;OPERATOR STACK POINTER OPDSP DS 1 ;OPERAND STACK POINTER FUNC DS 1 ;HIGH/LOW FUNCTION FLAG ; CURLINE DS 1 LPP DS 1 CURPAGE DS 2 TTLLEN DS 1 TTLFLG DS 1 ENDFLG DS 1 ENTPTF DS 1 INIFLG DS 1 FWDREF DS 1 ; FR0 = $D4 FR1 = $E0 INBUFF = $F3 ; RUNVEC = $02E0 INIVEC = $02E2 INIORG = $02E7 ;BASE LOAD ADDRESS IS IN THIS WORD ; ORG $0340 DS 2 ICMD DS 1 ISTAT DS 1 IBUF DS 2 DS 2 ILEN DS 2 IAUX DS 2 DS 2 DS 2 ; FASCII = $D8E6 IFP = $D9AA CIOV = $E456 ; ORG $2180 ;END OF RESIDENT MYDOS (4.51 IS ACTUALLY AT 1F80) OPERS DS 50 ;EXPRESSION STACKS OPNDL DS 50 OPNDH DS 50 ; TEXTBF DS LINLEN OBJBUF DS BUFLEN PRBUF DS PRTLEN+2 ; START LDA #TTLSIZE STA TTLLEN LDX #$FF STX CURLINE INX STX CURPAGE STX CURPAGE+1 STX TTLFLG LDA #59 ;DEFAULT LINES/PAGE STA LPP LDA #'A' STA EXTTXT LDA #'S' STA EXTTXT+1 LDA #'M' STA EXTTXT+2 JSR PROMPT DB 'Source file = ',0 DW INF ; LDA #'O' STA EXTTXT LDA #'B' STA EXTTXT+1 LDA #'J' STA EXTTXT+2 JSR PROMPT DB 'Object file = ',0 DW OUTF ; LDA #'L' STA EXTTXT LDA #'S' STA EXTTXT+1 LDA #'T' STA EXTTXT+2 JSR PROMPT DB 'List file = ',0 DW PRF ; LDA #1 ;FIRST PASS IS 1 STA PASSNO ;SECOND PASS IS 0 ; LDA #LOW[SYMTAB] STA ENDSTAB LDA #HIGH[SYMTAB] STA ENDSTAB+1 LDX #$FF STX SYMTAB ; LDA PRF+2 CMP #'-' BEQ NOPRNT LDX #PRUNIT LDA #LOW[PRF] LDY #HIGH[PRF] JSR OPNOUT BMI ABORT ; NOPRNT LDA #'A' STA EXTTXT LDA #'S' STA EXTTXT+1 LDA #'M' STA EXTTXT+2 ; PASSLP LDA #0 STA ENDFLG STA ENTPTF STA INIFLG STA ERRCNT STA ERRCNT+1 LDA INIORG ;INITIALIZE THE STARTING ADDRESS STA PC LDA INIORG+1 STA PC+1 LDX #INUNIT STX FILE LDA #LOW[INF] LDY #HIGH[INF] JSR OPENIN BMI ABORT ; LOOP LDA #$00 STA SFLGS STA LABEL JSR READLN BMI CKEOF JSR GENCODE ;GENERATE CODE/DO DIRECTIVE JSR ADDSYM ;IF LABEL DEFINED, ADD TO SYM/TAB LDA PASSNO BNE NOPLIN ;IF NOT PASS 2, SKIP PRINTING LDA ADRERR CMP #' ' ;ERRORS? BNE FORCEPR ;IF SO, FORCE PRINTING LDA ICMD-2+PRUNIT BMI NOPLIN FORCEPR JSR PRINT ;LIST LINE TO PRINTER BMI ABORT NOPLIN LDA ENDFLG BNE ASDONE ; CLC LDA LEN ADC PC STA PC LDA LEN+1 ADC PC+1 STA PC+1 JMP LOOP ; ABORT LDX FILE CLINFS JSR CLOSEF TXA SEC SBC #$10 TAX CPX #INUNIT BCS CLINFS BCC ABXIT ; CKEOF CPY #136 ;IS THIS EOF? BNE ABORT ;IF SO, THEN TREAT AS 'END' ASDONE LDX FILE JSR CLOSEF CPX #INUNIT BNE ENDINCL ; ; CHECK FOR END OF PASS ; PASSCK DEC PASSNO BPL PASS2 ABXIT JMP ASMXIT ;ASSEMBLY DONE, GO WRAP UP! ; PASS2 LDY #LOW[SYMTAB] LDA #HIGH[SYMTAB] STA TABPTR+1 LDA #0 STA TABPTR BEQ NEXTSET ;THIS SHOULD BRANCH ALWAYS! ; SETFREF INY BNE NEXTSET INC TABPTR+1 NEXTSET LDA TABPTR+1 CPY ENDSTAB SBC ENDSTAB+1 BCS FREFXT ; LDA (TABPTR),Y BPL SETFREF ;IF THE FIRST BYTE OF A SYMBOL ORA #$04 ;SET FORWARD REFERENCE FLAG STA (TABPTR),Y ;;;; JSR DEBUG1 ;Print them out as we mark them! BNE SETFREF ;JUMP ALWAYS! ; ENDINCL TXA SBC #$10 STA FILE LDA ENDFLG BNE ASDONE JMP LOOP ; ; ALL SYMBOLS MARKED FWD REF (GO ON TO THE REAL WORK) ; FREFXT LDX #OBUNIT LDA #LOW[OUTF] LDY #HIGH[OUTF] JSR OPNOUT BMI TOABRT ; LDA #$FF STA OBJBUF STA OBJBUF+1 LDA #2 STA ILEN,X LDA #0 STA ILEN+1,X STA OBJPTR ;NO DATA IN BUFFER YET (LEN=0) LDA #11 STA ICMD,X LDA #LOW[OBJBUF] STA IBUF,X LDA #HIGH[OBJBUF] STA IBUF+1,X JSR CIOV BMI TOABRT JMP PASSLP TOABRT JMP ABORT ; ASMXIT LDA ENTPTF BEQ NOENTV LDX #2 LDA #LOW[RUNVEC] STA PC LDA #HIGH[RUNVEC] STA PC+1 LDX #2 LDA INIFLG BEQ VECT2 LDX #4 LDA INIPT STA OPCODE+2 LDA INIPT+1 STA OPCODE+3 ; VECT2 LDA ENTPT STA OPCODE LDA ENTPT+1 STA OPCODE+1 JMP WRVECT ; NOENTV LDA INIFLG BEQ NOINIV LDA INIPT STA OPCODE LDA INIPT+1 STA OPCODE+1 LDA #LOW[INIVEC] STA PC LDA #HIGH[INIVEC] STA PC+1 LDX #2 WRVECT STX LEN JSR CODOBJ+4 LDX #VECLL CPYVL LDA VECLIN-1,X STA TEXTBF-1,X DEX BNE CPYVL JSR PRINT ;PRINT VECTOR CODE LINE NOINIV LDY OBJPTR BEQ NOOBJB JSR WRTOBJ NOOBJB LDX #OBUNIT JSR CLOSEF LDA ICMD-2+PRUNIT BMI NOPSYM LDA #' ' STA PRBUF LDA #EOL STA PRBUF+1 JSR LIST JSR PRSTAB ;PRINT SYMBOL TABLE LDX #PRUNIT JSR CLOSEF NOPSYM LDA ERRCNT STA PC ORA ERRCNT+1 ;IF ANY ERRORS, WAIT FOR A KEY BEQ NOERRS ; LDA ERRCNT+1 STA PC+1 LDX #0 STX LEN LDX #ERRLL CPYEL LDA ERRTOT-1,X STA TEXTBF-1,X DEX BNE CPYEL JSR PRINT ;PRINT VECTOR CODE LINE JSR PROMPT ;WAIT FOR A KEY DB 'Press [RETURN] to continue',0 DW INF ; NOERRS JMP (DOSVEC) ;AND RETURN TO DOS ; VECLIN DB '<<< RUN/INIT VECTORS >>>',EOL VECLL = *-VECLIN ERRTOT DB '<<< ERRORS OCCURRED >>>',EOL ERRLL = *-ERRTOT ; INCLUDE D:ASM1.ASM ; INCLUDE D:ASM2.ASM ; INCLUDE D:ASM3.ASM ; INCLUDE D:ASM4.ASM ; INCLUDE D:ASM5.ASM ; TTLINE DB $0C ;FORMFEED TITLE DB ' ' DB ' ',' Page ' PAGE DB ' ',EOL SUBTTL DB ' ' DB ' ',' (C) 1984',EOL DB ' ' DB ' ','WORDMARK Systems',EOL TTLSIZE = *-TTLINE ; ; NON-ZERO PAGE RAM ; ENTPT DS 2 INIPT DS 2 ERRCNT DS 2 ;NUMBER OF ERRORS REPORTED ; EXTTXT DS 3 ; INF DS FNSIZE DS 1 OUTF DS FNSIZE DS 1 PRF DS FNSIZE DS 1 DATBUF DS STRMAX DS 6 FNBUF DS FNSIZE DS 2 LABEL DS SYMSIZ DS 2 ; SYMTAB END START