home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
kermit.columbia.edu
/
kermit.columbia.edu.tar
/
kermit.columbia.edu
/
extra
/
mac80.mac
< prev
next >
Wrap
Text File
|
1990-11-05
|
8KB
|
412 lines
;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,MACTEN
TITLE. (M80,MAC80,8085 Cross Assembler)
M80TTL
M80137
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
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
CAIE I,")"
CAIN I,"]"
JRST LOOP ;IGNORE ]
CAIGE I,40
JRST DONE ;IF BREAK, WE'RE DONE
CAIE I,"("
CAIN I,"/"
JRST SWITCH ;IF A SWITCH, SAVE IT
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
SWITCH: PUSHJ P,INCH ;GET THE SWITCH
CAILE I,140 ;LC?
SUBI I,40 ;FORCE UPPER CASE SWITCH
CAIN I,"C" ;CREF?
JRST [SETOM CREFSW ;YES
TRO F,FR.LST ;CREF IMPLIES LIST
JRST LOOP]
CAIN I,"S" ;SYMBOLS?
SETOM SYMBSW ;YES
JRST 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
MOVEI T1,0 ;ASCII
SETZ T4,
MOVE T2,DEVICE ;INPUT DEVICE
HRRZI T3,MBUF
OPEN LIB,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: SKIPN SYMBSW ;IF NO SYMBOL FILE
JRST NOSYM ;SKIP THIS
SETZ T1,
SKIPN T2,SYMDEV
MOVSI T2,'DSK'
HRLZI T3,SBUF
OPEN SYM,T1
JRST NODEV
SKIPN T1,SYMNAM
MOVE T1,FILNAM
SKIPN T2,SYMEXT
MOVSI T2,'SYM'
SETZB T3,T4
ENTER SYM,T1 ;MAKE THE SYMBOL FILE
JRST ENTERR
NOSYM: 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
SYMNAM: BLOCK 1
SYMEXT: BLOCK 1
DEVICE: BLOCK 1
LSTDEV: BLOCK 1
SYMDEV: BLOCK 1
PDL: BLOCK 40 ;PDL STORAGE
IBUF:: BLOCK 3
OBUF:: BLOCK 3 ;BUFFER HEADERS
LBUF:: BLOCK 3 ;LISTING FILE
SBUF:: BLOCK 3 ;SYMBOL FILE
MBUF:: BLOCK 3 ;MACLIB
CREFSW::BLOCK 1 ;NON-ZERO IF CROSS REFERENCE LISTING REQUESTED
SYMBSW::BLOCK 1 ;NON-ZERO IF SYMBOL TABLE DUMP REQUESTED
ENDLOW: BLOCK 1 ;TOP OF STORAGE
END MAC80