;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