TITLE '6502/65C02 ASSEMBLER' SUBTTL 'SOURCE = A65.MAC, 6/24/84' ; ; Copyright (C) 1984, 1986 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. ; PRUNIT = $10 ;LIST OUTPUT IOCB OBUNIT = $20 ;OBJECT FILE IOCB INUNIT = $30 ;SOURCE FILE IOCB LIST I ; INCLUDE D2:ASMDEF.MAC ; ORG $2000 ;END OF RESIDENT MYDOS 3.316 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 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 ICMD-2+PRUNIT BMI NOPLIN 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 DEC PASSNO BPL PASS2 ABXIT JMP ASMXIT ;ASSEMBLY DONE, GO WRAP UP! ; PASS2 LDX #OBUNIT LDA #LOW[OUTF] LDY #HIGH[OUTF] JSR OPNOUT BMI ABORT ; 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 ABORT JMP PASSLP ; ENDINCL TXA SBC #$10 STA FILE LDA ENDFLG BNE ASDONE JMP LOOP ; 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 JMP (DOSVEC) ;AND RETURN TO DOS ; VECLIN DB '<<< RUN/INIT VECTORS >>>',$9B VECLL = *-VECLIN ; INCLUDE D2:OPCODE.MAC INCLUDE D2:DATA.MAC INCLUDE D2:DIREC.MAC INCLUDE D2:EXPR.MAC INCLUDE D2:SYMBOLS.MAC INCLUDE D2:PRINT.MAC INCLUDE D2:OBJECT.MAC INCLUDE D2:INPUT.MAC ; ; CLOSE A FILE ; CLOSEF LDA #12 STA ICMD,X JMP CIOV ; ; OPEN A FILE FOR INPUT ; OPENIN STY TEMP PHA JSR CLOSEF LDA #4 DOPEN STA IAUX,X PLA STA IBUF,X LDA TEMP STA IBUF+1,X LDA #3 STA ICMD,X JMP CIOV ;OPEN INPUT FILE ; ; OPEN LIST OR OBJECT FILE ; OPNOUT STY TEMP PHA LDA #12 STA ICMD,X JSR CIOV LDA #8 BNE DOPEN ; ; READ A LINE INTO THE TEXT BUFFER ; AND INITIALIZE THE TEXT POINTERS ; READLN LDX FILE ;READ SELECTED FILE LDA #5 STA ICMD,X LDA #LINLEN STA ILEN,X LDA #0 STA ILEN+1,X STA TXTPTR LDA #LOW[TEXTBF] STA IBUF,X STA TEXTP LDA #HIGH[TEXTBF] STA IBUF+1,X STA TEXTP+1 JSR CIOV LDA ILEN,X TAX LDA #EOL STA TEXTBF,X TYA RTS ; 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 ; CURLINE DS 1 LPP DS 1 CURPAGE DS 2 TTLLEN DS 1 TTLFLG DS 1 ENDFLG DS 1 ENTPTF DS 1 INIFLG DS 1 ENTPT DS 2 INIPT DS 2 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