;MAC80 - An 8085 cross assembler for the DECsystem-10

;	Copyright 1976,1977,1978,1983
;	Bruce Tanner / Cerritos College
;	11110 Alondra Blvd.
;	Norwalk, CA 90650


	SEARCH M80UNV,JOBDAT
	.TITLE	(MAC80,\M80MAJ,\M80EDT)
	SUBTTL	COMMAND SCANNER

	TWOSEG
	RELOC	400000

MAC80:	TDZA	F,F		;CLEAR FLAGS
	MOVSI	F,FL.CCL	;CCL ENTRY
	SETZM	SVJBFF		;ZERO AT START
START::	RESET			;RESET ALL I/O
	MOVE	P,PDP		;SET UP PDL
	SKIPE	T1,SVJBFF	;1ST TIME THRU?
	JRST	.+4		;NO--RESET .JBFF
	MOVE	T1,.JBFF	;YES--GET .JBFF
	MOVEM	T1,SVJBFF	;AND SAVE IT
	JRST	.+4		;AND SKIP THE CORE CONTRACTION
	MOVEM	T1,.JBFF	;RESET FIRST FREE
	CORE	T1,		;SHRINK CORE BACK DOWN
	  JRST	CORERR		;IMPROBABLE

;	Yea, from the table of my memory
;	I'll wipe away all trivial fond records.
;
;				- Hamlet (Act I, Sc. 5, Line 98)

	SETZB	P2,LOOKIT	;TEMP (P2) & 1ST LOC OF TEMP STORAGE
	MOVE	T1,[FILNAM,,FILNAM+1]	;REST OF TEMP STORAGE
	BLT	T1,ENDLOW	;BBLLLIIIITTTTT!
	SETZM	SYMTAB##	;START OF STORAGE
	MOVE	T1,[SYMTAB,,SYMTAB+1]
	BLT	T1,ENDHGH##	;BLIT
	MOVE	P1,[POINT 6,P2]	;TEMP POINTER
	TLNE	F,FL.CCL	;CCL INPUT?
	JRST	CCLIN		;YES
STAR:	OUTSTR	ASTER		;HERE IF TTY INPUT
	PUSHJ	P,INCH		;GET CHAR
	CAIL	I,40		;SPECIAL CHAR?
	JRST	LOOP1		;NO--PROCESS
	CAIN	I,"Z"-100	;TTY EOF?
	EXIT	1,		;YES
	CLRBFI			;CLEAR BUFFER
	JRST	STAR		;& TRY AGAIN
INITMP:	SETZ	P2,		;CLEAR P2
	MOVE	P1,[POINT 6,P2]	;RESTORE BYTE POINTER

LOOP:	PUSHJ	P,INCH		;GET CHARACTER FROM WHEREVER
	JUMPE	I,XIT		;NULL--END OF THE LINE.
LOOP1:	CAIN	I,40		;SPACE?
	JRST	LOOP		;YES, IGNORE
	CAIN	I,":"
	JRST	LOADEV		;IF COLON-LOAD THE DEVICE
	CAIE	I,"="
	CAIN	I,"_"
	JRST	BACK		;IF _ OR = STORE REL OR LIST FILE NAME
	CAIN	I,","
	JRST	LODRL1		;IF , STORE REL FILE NAME
	CAIN	I,"!"
	JRST	RUNAME		;IF ! RUN THE PROGRAM
	CAIN	I,"."
	JRST	LODFIL		;IF . LOAD THE FILE NAME
	CAIN	I,"["
	JRST	LODPPN		;IF [ STORE EXT & PROCESS PPN
	CAIN	I,"]"
	JRST	LOOP		;IGNORE ]
	CAIGE	I,40
	JRST	DONE		;IF BREAK, WE'RE DONE
	CAIE	I,"("
	CAIN	I,"/"
	JRST	DONE		;IF A SWITCH, WE'RE DONE TOO.
	SUBI	I,40		;CONVERT TO SIXBIT
	TLNE	P1,770000	;> 6 CHAR?
	IDPB	I,P1		;NO STUFF
	JRST	LOOP		;LOOP

LOADEV:	SKIPE	DEVICE		;IF DEVICE ALREADY FULL
	JRST	TWODEV		;HOLLER
	MOVEM	P2,DEVICE	;STORE DEVICE
	JRST	INITMP		;INIT TEMP & LOOP

LODFIL:	SKIPE	FILNAM		;FILE NAME ALREADY THERE?
	JRST	TWOFIL		;YES
	MOVEM	P2,FILNAM	;STORE FILE NAME
	JRST	INITMP		;& LOOP
BACK:	TRNN	F,FR.LST	;IF LISTING,
	JRST	LODRL1+1	;LOAD REL FILE
	SKIPN	T1,FILNAM	;SKIP & LOAD IF FILE NAME THERE
	MOVE	T1,P2		;ELSE LOAD TEMP
	MOVEM	T1,LSTNAM	;LOAD LIST FILE NAME
	SETZM	FILNAM		;CLEAR OLD FILE NAME
	CAME	P2,LSTNAM	;DID WE LOAD TEMP ALREADY?
	MOVEM	P2,LSTEXT	;NO-TEMP CONTAINS LST EXT.
	MOVE	T1,DEVICE	;LOAD THE DEVICE
	MOVEM	T1,LSTDEV	;TRANSFER
	SETZM	DEVICE		;AND CLEAR DEVICE
	JRST	INITMP		;LOOP

LODRL1:	TRO	F,FR.LST	;COMMA INPLIES LIST FILE
	SKIPN	T1,FILNAM	;SKIP & LOAD IF FILE NAME THERE
	MOVE	T1,P2		;ELSE LOAD TEMP
	MOVEM	T1,RELNAM	;LOAD RELFILE NAME
	SETZM	FILNAM		;CLEAR FILE NAME
	CAME	P2,RELNAM	;DID WE LOAD TEMP?
	MOVEM	P2,RELEXT	;NO-LOAD RELFILE EXT.
	SKIPN	T1,DEVICE
	MOVE	T1,[SIXBIT/DSK/]
	MOVEM	T1,OBJDEV
	SETZM	DEVICE
	JRST	INITMP		;LOOP

LODPPN:	SETZ	T1,
	SKIPE	PPN
	JRST	TWOPPN
	PUSHJ	P,GETOCT
	CAIE	I,","
	JRST	ILLDEL
	HRLZM	T1,PPN
	SETZ	T1,
	PUSHJ	P,GETOCT
	HRRM	T1,PPN
	JRST	LOOP1

DONE:	PUSHJ	P,INCH
	CAIN	I,CR
	PUSHJ	P,INCH
	SKIPN	T1,DEVICE	;IF DEVICE IS OMITTED...
	HRLZI	T1,'DSK'	;... "DSK" IS ASSUMED
	MOVEM	T1,DEVICE	;STORE THE DEVICE
	SKIPE	FILNAM		;IF THERE IS A FILE NAME
	JRST	TSTEXT		;SEE IF THERE IS AN EXTENSION
	SKIPN	T1,P2		;IS THERE SOMETHING IN TEMP?
	JRST	START		;NO - BAD SYNTAX
	MOVEM	T1,FILNAM	;MOVE WHATEVER
	JRST	DO.IO		;AND START DOING THE I/O
TSTEXT:	SKIPN	FILEXT		;ALREADY FILE EXTENSION?
	HLLZM	P2,FILEXT	;NO--STORE TEMP
DO.IO:	MOVEI	T1,0		;ASCII
	SETZ	T4,
	MOVE	T2,DEVICE	;INPUT DEVICE
	HRRZI	T3,IBUF
	OPEN	SRC,T1
	  JRST	NODEV
RELOOK:	MOVE	T1,FILNAM
	MOVE	T2,FILEXT
	SETZ	T3,
	MOVE	T4,PPN
	LOOKUP	SRC,T1
	  JRST	NOFILE
	TRNN	F,FR.LST	;NEED A LIST FILE?
	JRST	NOLST		;NO
	SETZ	T1,
	SKIPN	T2,LSTDEV
	MOVSI	T2,'DSK'
	HRLZI	T3,LBUF
	OPEN	LST,T1
	  JRST	NODEV
	SKIPN	T1,LSTNAM
	MOVE	T1,FILNAM
	SKIPN	T2,LSTEXT
	MOVSI	T2,'LST'
	SETZB	T3,T4
	ENTER	LST,T1		;MAKE THE LISTFILE
	  JRST	ENTERR
NOLST:	TLNN	F,FL.CCL
	JRST	MAC80A##
	OUTSTR	[ASCIZ/MAC80:	/]
	MOVE	T1,FILNAM	;GET THE FILENAME
	PUSHJ	P,TYPE		;TYPE IT
	OUTSTR	[ASCIZ/
/]
	SETZ	P2,
	MOVEM	P3,TMPPTR	;SAVE TMPCOR BUFFER POINTER
	JRST	MAC80A

GETOCT:	PUSHJ	P,INCH
	CAIN	I,40
	JRST	GETOCT
	CAIG	I,"7"
	CAIGE	I,"0"
	POPJ	P,
	IMULI	T1,10
	ADDI	T1,-60(I)
	JRST	GETOCT
OPNOBJ::PUSH	P,T2
	PUSH	P,T3
	PUSH	P,T4
	SETZ	T4,
	SKIPN	T2,OBJDEV	;DEVICE
	MOVSI	T2,'DSK'
	MOVSI	T3,OBUF
	OPEN	OBJ,T1
	  JRST	NODEV
	SKIPN	T1,RELNAM
	MOVE	T1,FILNAM
	SKIPN	T2,RELEXT
	MOVSI	T2,'HEX'
	SETZB	T3,T4
	ENTER	OBJ,T1
	  JRST	ENTERR
	POP	P,T4
	POP	P,T3
	POP	P,T2
	POPJ	P,

RUNAME:	PUSHJ	P,INCH
	CAIN	I,15
	PUSHJ	P,INCH
	MOVEI	T1,T2
	HRLI	T1,1
	SKIPN	T2,DEVICE
	MOVSI	T2,'SYS'
	MOVE	T3,P2
	SETZB	T4,T4+1
	SETZB	T4+2,T4+3
	RUN	T1,
	HALT

INCH:	TLNN	F,FL.CCL	;CCL INPUT?
	JRST	.+3		;NO, SKIP
	ILDB	I,P3		;GET TMPCOR CHAR
	JRST	.+2		;JUST IN CASE...
	INCHWL	I		;GET TTY CHAR.
	CAIL	I,140		;IF LOWER CASE,
	SUBI	I,40		;CONVERT TO UPPER CASE
	POPJ	P,		;RETURN

TYPE:	MOVE	T2,[POINT 6,T1]
	TLNN	T2,770000
	POPJ	P,
	ILDB	T3,T2
	JUMPE	T3,.-2
	ADDI	T3,40
	OUTCHR	T3
	JRST	TYPE+1

NODEV:	MOVE	T1,T2
	OUTSTR	[ASCIZ/Cannot OPEN device /]
	PUSHJ	P,TYPE
	OUTSTR	[BYTE (7) 15,12,0,0,0]
	JRST	START

ENTERR:	OUTSTR	[ASCIZ/ENTER error for file /]
	PUSH	P,T2
	PUSHJ	P,TYPE
	POP	P,T2
	HLRZ	T1,T2
	JUMPE	T1,.+3
	OUTCHR	["."]
	PUSHJ	P,TYPE
	OUTSTR	[BYTE (7) 15,12,0]
	JRST	START

NOFILE::SKIPE	FILEXT
	JRST	.+4
	MOVSI	T1,'M80'
	MOVEM	T1,FILEXT
	JRST	RELOOK
	MOVE	T1,FILNAM
	OUTSTR	[ASCIZ/No such file /]
	PUSHJ	P,TYPE
	MOVE	T1,FILEXT
	JUMPE	T1,.+3
	OUTCHR	["."]
	PUSHJ	P,TYPE
	OUTSTR	[BYTE (7) 15,12,0,0,0]
	JRST	START
TWODEV:	OUTSTR	[ASCIZ/Two devices
/]
	JRST	CSTART

TWOFIL:	OUTSTR	[ASCIZ/Two file names
/]
	JRST	CSTART

TWOPPN:	OUTSTR	[ASCIZ/Two PPNs
/]
	JRST	CSTART

ILLDEL:	OUTSTR	[ASCIZ/Illegal delimiter in PPN
/]

CSTART:	TLNN	F,FL.CCL	;CCL INPUT?
	CLRBFI			;SHOULDN'T BE
	JRST	START		;RESTART SCAN

CORERR:	OUTSTR	[ASCIZ/?Cannot shrink core
/]
	JRST	CSTART

ASTER:	ASCIZ /
*/

XIT:	EXIT	1,		;EXIT GRACEFULLY
	EXIT			;NO SO GRACEFULLY
CCLIN:	SKIPE	P3,TMPPTR	;WAS THERE A TMPCOR BUFFER POINTER?
	JRST	INITMP		;YES--LOADED & GONE
	MOVE	T1,[2,,TMPBLK]	;NO, GET TMPCOR FILE (1 IS READ)
	TMPCOR	T1,
	PUSHJ	P,NOTEMP
	MOVE	P3,[POINT 7,TBUF]
	JRST	INITMP

NOTEMP:	MOVEI	T1,17		;NO TMPCOR--TRY DISK
	MOVSI	T2,'DSK'
	SETZB	T3,T4
	OPEN	TMPC,T1		;OPEN DISK
	  JRST	NODEV
	PJOB	T1,		;GET JOB NUMBER
	SETZ	T3,
	IDIVI	T1,12		;AND CONVERT
	TRO	T2,20		;TO TMPDISK FILE NAME
	LSHC	T2,-6		;BY THE TRIED & TRUE METHOD
	TLNN	T3,77
	JRST	.-4
	MOVE	T1,T3
	HRRI	T1,'MAC'
	MOVSI	T2,'TMP'	;NNNMAC.TMP
	SETZB	T3,T4
	LOOKUP	TMPC,T1		;LOOKUP
	  JRST	MAC80		;NO CCL FILE, ASSUME TTY INPUT
	INPUT	TMPC,TMPBLK+1	;PUT INTO TMPCOR BUFFER
	SETZ	T1,
	RENAME	TMPC,T1		;DELETE TMPDSK FILE
	 OUTSTR	NOREN		;FAILURE
	RELEAS	TMPC,
	POPJ	P,		;BACK


NOREN:	ASCIZ/Cannot delete temp disk file
/

PDP:	IOWD 100,PDL

TMPBLK:	SIXBIT	/MAC/
	IOWD 30,TBUF
	0

	XLIST
	LIT
	LIST
	RELOC	0

TBUF:	BLOCK 30	;DONT CLEAR TMPCOR BUFFER
TMPPTR:	BLOCK 1		;HOLDS TMPCOR BYTE POINTER
SVJBFF:	BLOCK 1		;SAVE .JBFF
			;CLEAR REST OF TABLE SPACE
LOOKIT:
FILNAM::BLOCK 1
FILEXT::BLOCK 1
	BLOCK 1
PPN::	BLOCK 1
OBJDEV::BLOCK 1
RELNAM:	BLOCK 1
RELEXT:	BLOCK 1
LSTNAM:	BLOCK 1
LSTEXT:	BLOCK 1
DEVICE:	BLOCK 1
LSTDEV:	BLOCK 1
PDL:	BLOCK 40	;PDL STORAGE
IBUF::	BLOCK 3
OBUF::	BLOCK 3		;BUFFER HEADERS
LBUF::	BLOCK 3		;LISTING FILE
ENDLOW:	BLOCK 1		;TOP OF STORAGE

	END	MAC80
