NEW
  AUTO 3,1
*--------------------------------------
*    .IN -- INCLUDE A SOURCE FILE
*--------------------------------
PSIN   LDA INFLAG   SEE IF NESTED .IN
       BNE .4       ...YES, ERROR
       SEC
       ROR INFLAG   TURN ON FLAG (=$80)
       LDA #'I      PUT "I" IN PROMPT MESSAGE
       STA PROMPT.FLAG
       JSR LIST.LINE.BOTH.PASSES
*---SAVE CURRENT, SET UP NEW-----
       LDX #1
.1     LDA HI.MEM,X       SAVE CURRENT SOURCE POINTERS
       STA INSAVE,X
       LDA SRCP,X
       STA INSAVE+2,X
       LDA PP,X
       STA HI.MEM,X
  .DO AUXMEM
  .ELSE
       LDA LO.MEM,X  MAKE DOS PROTECT THE SYMBOL TABLE
       STA INSAVE+6,X    DURING THE LOAD
       LDA EOT,X
       STA LO.MEM,X
  .FIN
       DEX
       BPL .1
*---CHECK FOR .INBx--------------
       JSR GNC.UC
       CMP #'B'
       BNE .2            ...NOT .INBx
       JSR GNC.UC        GET # OF BLOCKS
       EOR #'0'
       BEQ .12           ...NOT 1-9, USE 1
       CMP #10
       BCC .14           ...1-9
.12    LDA #1            USE 1 BLOCK
.14    ORA #$C0
       STA INFLAG
*---LOAD THE FILE----------------
.2     JSR SAVE.PATHNAME
       LDY #PQ.LOD  LOAD COMMAND
       JSR ISSUE.DOS.COMMAND
*---ASSEMBLE INCLUDED STUFF------
       LDX #1
.3     LDA PP,X          MOVE SRCP TO BEGINNING OF INCLUDED FILE
       STA SRCP,X
       STA MACSTK,X
  .DO AUXMEM
  .ELSE
       LDA INSAVE+6,X    RESTORE LO.MEM
       STA LO.MEM,X
  .FIN
       LDA SCI.IOB.RW+6,X     # BYTES ACTUALLY RECEIVED
       STA INSAVE+4,X
       DEX
       BPL .3
       LDA SCI.IOB.RW+1       REFNUM OF INB FILE
       STA INSAVE+6
       JMP ASM2      CONTINUE ASSEMBLY
*---NO NESTING ALLOWED-----------
.4     LDY #QNIN     "NEST .IN"
       JMP FIRM.ERROR
*--------------------------------
*    .EN -- END OF SOURCE PROGRAM
*--------------------------------
PSEN   JSR LIST.SOURCE.IF.LISTING
ENDM
       BIT INFLAG    IN A ".IN"?
       BPL .1         NO
       BVC .3       ...NOT IN .INBx
       LDA INSAVE+6 .INBx REFNUM
       STA SCI.IOB.CLOSE+1
       LDA #$CC     Close the .INclude file
       JSR SCI.MLI
.3     JSR RESTORE  YES, BACK TO ROOT
       JMP ASM2     CONTINUE ASSEMBLY
*---END OF ROOT FILE-------------
.1     JSR TFEND    END .TF IF DOING ONE
       LDA PASS     WHICH PASS?
       BNE .2       ...END OF PASS 2
       INC PASS     END OF PASS 1
       JMP ASM1
.2     BIT LF.ALL   Are we listing?
       BMI ASM.END  ...no, we are finished
       JSR CRLF.WITH.PAGING
       JSR CRLF.WITH.PAGING
       JSR CRLF.WITH.PAGING
       LDY #QST     "SYMBOL TABLE"
       JSR QT.OUT
       JSR CRLF.WITH.PAGING
       JSR CRLF.WITH.PAGING
       JSR STPRNT   PRINT THE SYMBOLS
*--------------------------------
ASM.END
       JSR CRLF.WITH.PAGING
       LDA ERROR.COUNT
       STA CURRENT.LINE.NUMBER
       LDA ERROR.COUNT+1
       STA CURRENT.LINE.NUMBER+1
       JSR CONVERT.LINE.NUMBER.PRINT
       LDY #QERRCNT
       JSR QT.OUT
       JMP SOFT      END OF ASSEMBLY
*--------------------------------
*    RESTORE IF INSIDE AN INCLUDE
*--------------------------------
RESTORE
       LDA INFLAG
       BEQ .1       RETURN
       LDX #0       CLEAR PROMPT.FLAG
       STX PROMPT.FLAG
       STX INFLAG   CLEAR INFLAG
       INX          X=1
.2     LDA HI.MEM,X
       STA PP,X
       STA MACSTK,X
       LDA INSAVE,X
       STA HI.MEM,X
       LDA INSAVE+2,X
       STA SRCP,X
       DEX
       BPL .2
.1     RTS
*--------------------------------
*      SET UP TITLE LINE
*--------------------------------
PSTI   LDA PASS
       BEQ PGXIT    DO NOTHING IN PASS ONE
       JSR EXPR.DEFINED    GET PAGE LENGTH
       LDA EXP.VALUE  USE MOD 256
       STA PAGE.LENGTH    NON-ZERO PAGE LENGTH MEANS TITLING IS ON
       LDX #0       POINT AT TITLE BUFFER
       JSR GNC
       CMP #',
       BNE .2       NO TITLE
.1     JSR GNC
       BCS .2       END OF TITLE
       STA KBUF,X
       INX
       CPX #70      MAX TITLE SIZE
       BCC .1
.2     LDA #0       TERMINATE TITLE
       STA KBUF,X
*---FALL INTO PSPG CODE----------
*--------------------------------
*    PAGE EJECT
*--------------------------------
PSPG   JSR FORM.FEED
PGXIT  JMP ASM2
*--------------------------------
FORM.FEED
       JSR CHECK.IF.LISTING
       LDA #$0C      FORM FEED CHAR
       JSR CHO
      >INCD PAGE.NUMBER
       LDA PAGE.LENGTH
       CMP #3       PAGE LENGTHS LESS THAN 3 CANNOT BE TITLED
       BCC .1          EXIT, NOT TITLING NOW
       LDX #0
       STX LINE.COUNT
.3     LDA KBUF,X   PRINT TITLE
       BEQ .4       END OF TITLE
       JSR CHO
       INX
       BNE .3       ...ALWAYS
.4     LDY #PAGEQT  " PAGE "
       JSR QT.OUT
       LDA CURRENT.LINE.NUMBER   SAVE LINE #
       PHA
       LDA CURRENT.LINE.NUMBER+1
       PHA
       LDA PAGE.NUMBER           PRINT PAGE #
       STA CURRENT.LINE.NUMBER
       LDA PAGE.NUMBER+1
       STA CURRENT.LINE.NUMBER+1
       JSR CONVERT.LINE.NUMBER.PRINT
       JSR CRLF.WITH.PAGING
       PLA                       RESTORE LINE #
       STA CURRENT.LINE.NUMBER+1
       PLA
       STA CURRENT.LINE.NUMBER
.1     RTS          RETURN
*--------------------------------
*      .BS -- BLOCK STORAGE
*--------------------------------
PSBS   JSR EXPR.DEFINED  GET # OF BYTES
       LDA EXP.VALUE+3
       ORA EXP.VALUE+2
       BNE RAER          VALUE >32767
       LDA EXP.VALUE+1
       BMI RAER          VALUE >32767
       STA BS.COUNT+1
       LDA EXP.VALUE
       STA BS.COUNT          SAVE COUNT
       JSR P.ORIGIN      PRINT ADDRESS
       JSR GNC           GET NEXT CHAR
       CMP #',           COMMA?
       BNE .1            NO, NO VALUE PRESENT
       JSR EXPR          GET FILL VALUE
       BPL .2            BRANCH IF GOOD EXPRESSION
.1     JSR ZERO.EXP.VALUE    USE ZERO FOR FILL VALUE
.2     SEC
       ROR LF.ALL     TURN OFF LISTING
.3     LDA BS.COUNT          GET COUNT
       BNE .4            STILL MORE BYTES
       DEC BS.COUNT+1
       BMI .5            ...ALL THRU
.4     DEC BS.COUNT          COUNT DOWN
       LDA EXP.VALUE     GET FILL VALUE
       JSR EMIT          AND EMIT IT
       JMP .3

.5     ASL LF.ALL     RESTORE LISTING
       RTS

*--------------------------------
RAER   LDY #QER3    ERROR -- OUT OF RANGE
       JMP SOFT.ERROR

*--------------------------------
*      LISTING CONTROL
*      .LIST ON/OFF/MON/MOFF/CON/COFF,...
*--------------------------------
PSLI   LDY #LI.INDEX-2
       JSR SET.FLAGS
       JMP ASM2        DON'T LIST LINE
*--------------------------------
*      SWITCH FLAGS ON OR OFF
*--------------------------------
SET.FLAGS
       STY YSAVE
.1     LDY YSAVE
.2     INY          Find letter in table
       INY
       LDA FLAG.TABLE,Y
       BEQ .7       ...end of table, get next letter
       CMP CURRENT.CHAR
       BNE .2       ...try next entry in table
*---Found letter in table--------
       LDX FLAG.TABLE+1,Y
.3     EOR #'N      'N' means ON
       BEQ .5       ...set flag to $00
       EOR #'F^'N   'F' means OFF
       BEQ .4       ...set flag to $FF
       EOR #',^'F   comma here is an error
       BEQ .9       ...oops!
       JSR GNC.UC   get next char from user
       BNE .3       ...might be N, F, or comma
       RTS          ...blank or end of line
*---Turn flag ON or OFF----------
.4     LDA #$FF     signal OFF with $FF
.5     STA 0,X      store $00 or $FF in flag
*---Scan to a comma or eol-------
.6     JSR GNC      GET NEXT CHAR
       BEQ .8       ...blank or end of line
       CMP #','
       BNE .6       ...not comma yet
*---Get next char from user------
.7     JSR GNC.UC
       BCC .1       ...not end of line yet
.8     RTS          RETURN TO CALLER
.9     JMP ERBA
*--------------------------------
FLAG.TABLE
LI.INDEX  .EQ *-FLAG.TABLE
       .DA #'N',#LF.ALL
       .DA #'F',#LF.ALL
       .DA #'M',#LF.MACRO
       .DA #'C',#LF.CONDITIONAL
       .DA #'X',#LF.XTRA.BYTES
       .HS 00
*--------------------------------------
MAN
SAVE usr/src/scmasm.31/scmasm.s.dir2
LOAD usr/src/scmasm.31/scmasm.s
ASM
