; ; PRINT.ASM ; ; PRINT THE GENERATED CODE/SOURCE LINE ; PRINT JSR CLEAR ; LDX #2 LDA ISVAL BMI NOADDR BNE VALADR ; LDA PC+1 JSR PRHEX LDA PC JMP LSTHLF ; VALADR LDA VALUE+1 JSR PRHEX LDA VALUE LSTHLF JSR PRHEX ; NOADDR LDA LEN STA TEMP BEQ NODATA LDA MODE BMI NODATA JSR PROBJT ;PRINT 1 TO 6 BYTES OF OBJECT CODE NODATA LDX #20 JSR PRSRC ; LDA ADRERR STA PRBUF CMP #' ' BEQ PRINTQ ; LDX #LOGDEV JSR DOPRINT ;LOG ERRORS TO THE SCREEN ; INC ERRCNT BNE PRINTQ ;AND COUNT THEM INC ERRCNT+1 ; PRINTQ LDA ICMD-2+PRUNIT BMI LOKXIT ; EXCODE JSR LIST BMI LINXIT LDA MODE BMI LOKXIT LDA TEMP BEQ LINXIT JSR CLEAR JSR PROBJT LDA #EOL STA PRBUF,X JMP EXCODE ; LOKXIT LDA #0 LINXIT RTS ; ; PRINT A FORMATTED LINE TO LISTING DEVICE ; LIST LDA CURLINE INC CURLINE CMP LPP ;NUMBER OF LINES/PAGE BCC NONEWP LDA #' ' STA PAGE+3 ;BLANK OUT PAGE NO. STA PAGE+2 STA PAGE+1 LDA #0 STA CURLINE ;START OF NEW PAGE INC CURPAGE BNE PAGEOK INC CURPAGE+1 PAGEOK LDA CURPAGE STA FR0 LDA CURPAGE+1 STA FR0+1 JSR IFP JSR FASCII ;CONVERT TO ASCII STRING LDY #$FF PGCPLP INY LDA (INBUFF),Y STA PAGE,Y ;COPY TO HEADING BUFFER BPL PGCPLP AND #$7F STA PAGE,Y ; LDX #PRUNIT LDA #11 ;PRINT MULTIPLE LINES STA ICMD,X LDA #LOW[TTLINE] STA IBUF,X LDA #HIGH[TTLINE] STA IBUF+1,X LDA TTLLEN STA ILEN,X LDA #0 STA ILEN+1 JSR CIOV ;WRITE TITLE LINE ; NONEWP LDX #PRUNIT DOPRINT LDA #LOW[PRBUF] STA IBUF,X LDA #HIGH[PRBUF] STA IBUF+1,X ; LDA #9 STA ICMD,X ;PRINT A LINE ENDING WITH EOL LDA #81 STA ILEN,X LDA #0 STA ILEN+1,X JMP CIOV ; ; CONVERT NUMBER TO HEX IN PRINT LINE ; PRHEX PHA LSR A LSR A LSR A LSR A SED SEC SBC #9+1 ADC #'9'+1 STA PRBUF,X INX PLA AND #$0F SEC SBC #9+1 ADC #'9'+1 CLD STA PRBUF,X INX RTS ; ; CLEAR THE PRINT LINE ; CLEAR LDX #0 CLLP LDA #' ' STA PRBUF,X INX CPX #80 BCC CLLP LDA #EOL STA PRBUF,X RTS ; ; PRINT SOURCE LINE ; PRSRC LDY #0 PRSCP LDA (TEXTP),Y CMP #TAB BNE STINBF ; TXA LDX #NTABS NXTTAB DEX CMP TABTAB,X BCC NXTTAB LDA TABTAB+1,X TAX BCS PRBMPY STINBF STA PRBUF,X CMP #EOL BEQ GOTEOL INX PRBMPY INY CPX #80 BCC PRSCP GOTEOL RTS ; TABTAB DB 0,2,7,20,29 DB 35,43,51,59,67 DB 72,73,74,75,76 DB 77,78,79 NTABS = *-TABTAB ; ; PRINT OUT A CHUNK OF OBJECT CODE ; PROBJT LDX #7 LDY #0 STY TEMP+1 OBJPRL LDA OPCODE,Y JSR PRHEX DEC TEMP BEQ HEXIT INC TEMP+1 LDY TEMP+1 CPY #6 BNE OBJPRL ; LDOUTB LDA DATBUF-1+6,Y STA OPCODE-1,Y DEY BNE LDOUTB ; PRNX6 LDA DATBUF+6,Y STA DATBUF,Y INY CPY TEMP BCC PRNX6 ; HEXIT RTS ; ; OBJECT.OBJ ; ; PUT CONTENTS OF THE DATA BUFFER INTO THE OBJECT FILE ; DATOBJ LDY PASSNO BNE NOOBJG JSR OBJSET DOLOOP LDA DATBUF,X JSR WRTBYTE ;PUT EACH BYTE INTO THE BUFFER INX CPX LEN ;DONE? BNE DOLOOP STY OBJPTR NOOBJG RTS ; ; PUT THE CONTENTS OF THE MACHINE CODE BUFFER INTO THE OBJECT FILE ; CODOBJ LDY PASSNO BNE NOOBJG JSR OBJSET CODELP LDA OPCODE,X JSR WRTBYTE INX CPX LEN BNE CODELP STY OBJPTR RTS ; ; INSURE THE PC AGREES WITH THE LOCATION BEING LOADED ; OBJSET LDY OBJPTR BEQ NEWSET ;IF NOTHING IN BUFFER TYA CLC ADC OBJBUF LDX OBJBUF+1 ;ELSE COMPARE BUF ADDR AND PC BCC NOBX INX NOBX CMP PC BNE NOTSET CPX PC+1 BEQ SETXIT ;IF NEXT BYTE ADDR MATCHES PC NOTSET JSR WRTOBJ ; NEWSET LDA PC STA OBJBUF LDA PC+1 STA OBJBUF+1 SETXIT LDX #0 WRTXIT RTS ; ; WRITE A BYTE TO THE OBJECT FILE BUFFER ; WRTBYTE STA OBJBUF+4,Y INY BNE WRTXIT ;IF NOT THE END OF THE BUFFER ; ; WRITE A BLOCK OF OBJECT TEXT IN OBJBUF ; WRTOBJ STX LOWP+1 DEY TYA PHA LDX OBJBUF+1 CLC ADC OBJBUF STA OBJBUF+2 BCC WRTEQL INX WRTEQL STX OBJBUF+3 LDX #OBUNIT SEC PLA ADC #4 STA ILEN,X LDA #1 BCS ZEROPB LDA #0 ZEROPB STA ILEN+1,X JSR CIOV BMI OBJERR LDA OBJBUF+3 STA OBJBUF+1 LDY OBJBUF+2 INY STY OBJBUF BNE WRTOUT INC OBJBUF+1 WRTOUT LDX LOWP+1 LDY #0 RTS ; OBJERR BRK NOP JMP ($000A) ; ; INPUT.ASM ; ; PROMPT FOR COMMAND INPUT ; PROMPT PLA STA LOWP PLA STA LOWP+1 PRETRY LDA #11 STA ICMD LDY #1 LDX #0 STX ILEN STX ILEN+1 PMTLP LDA (LOWP),Y BEQ PMTEND INY STY TEMP JSR CIOV LDY TEMP BNE PMTLP ; PMTEND INY LDA (LOWP),Y STA HIGHP INY LDA (LOWP),Y STA HIGHP+1 STY TEMP LDA #5 STA ICMD LDA #FNSIZE-2 STA ILEN LDA #0 STA ILEN+1 LDA #LOW[FNBUF] STA IBUF LDA #HIGH[FNBUF] STA IBUF+1 JSR CIOV BMI PRETRY JSR BLDFNB LDY #$FF CPFNLP INY LDA FNBUF,Y STA (HIGHP),Y BPL CPFNLP CLC LDA TEMP ADC LOWP STA TEMP LDA LOWP+1 ADC #0 PHA LDA TEMP PHA RTS ; BLDFNB LDX #0 LDY #0 STX TEMP+1 LDA FNBUF BPL BLDFNE DEY KEEPNM INY LDA INF,Y STA FNBUF,Y BMI NOTDFLT CMP #'.' BNE KEEPNM NOTDFLT LDA #EOL STA FNBUF,Y LDY #0 BEQ BLDFNE ; BLDFNL CMP #':' BNE BLDFCP DEX BLDFCP CMP #'.' BNE BLDFND DEC TEMP+1 BLDFND INY BLDFNE LDA FNBUF,Y BPL BLDFNL LDA TEMP+1 BNE GOTEXT LDA #'.' STA FNBUF,Y INY LDA EXTTXT STA FNBUF,Y INY LDA EXTTXT+1 STA FNBUF,Y INY LDA EXTTXT+2 STA FNBUF,Y INY LDA #EOL STA FNBUF,Y GOTEXT TXA BNE GOTPFX SHFTBF LDA FNBUF,Y STA FNBUF+2,Y DEY BPL SHFTBF LDA #'D' STA FNBUF LDA #':' STA FNBUF+1 GOTPFX RTS ; ; 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