.TITLE AS0 .IDENT /X01/ .NLIST BEX .ENABL LC ; ; AS ; ROOT SEGMENT ; ; VERSION X01 ; ; DAVID G. CONROY 24-MAY-78 ; LAST UPDATED: 11-JUN-79 ; .GLOBL AS .GLOBL MSG .GLOBL FMSG .GLOBL GMCR .GLOBL SFILE .GLOBL OFILE .GLOBL LFILE .GLOBL ARGV .GLOBL ARGVND .GLOBL ARGVPT .GLOBL BFLAG .GLOBL GFLAG .GLOBL NFLAG .GLOBL DFLAG .GLOBL WFLAG .GLOBL LFLAG .GLOBL TITLE .MCALL CALL .MCALL CALLR .MCALL RETURN .MCALL FDBDF$ .MCALL FDAT$A .MCALL FDOP$A .MCALL FSRSZ$ .MCALL GMCR$ .MCALL EXIT$S .MCALL QIO$ .MCALL WTSE$S .MCALL DIR$ FSRSZ$ 3 ; ; EQUIVALENCES ; USED BY THE ENTIRE ASSEMBLER ; ; SYMBOL TABLE ENTRY ; S.V == 0 ;VALUE S.T == 2 ;TYPE S.F == 4 ;FLAGS S.N == 6 ;NAME S.SIZE == S.N+8. ;SIZE OF SYMBOL TABLE ENTRY SF.GBL == 000001 ;GLOBAL SF.MDF == 000002 ;MULTIPLY DEFINED SF.ASG == 000004 ;DEFINED BY ASSIGNMENT ; ; PSECTION TABLE ENTRY ; SAME SIZE AS SYMBOL TABLE ENTRY SO 'LOOKUP' WORKS ; P.L == 0 ;LOCATION P.F == 2 ;FLAGS (IN S.T SO SYM MACRO WORKS) P.FUZZ == 4 ;SAVE FOR FUZZ VALUE P.N == 6 ;START OF NAME P.SIZE == P.N+8. ;SIZE OF PSECTION TABLE ENTRY PF.HI == 001 ;HIGH SPEED MEMORY PF.LIB == 002 ;LIBRARY PSECTION PF.OVR == 004 ;OVERLAID PSECTION PF.RO == 020 ;READ ONLY PF.REL == 040 ;RELOCATION PF.GBL == 100 ;GLOBAL SCOPE PF.D == 200 ;D SPACE ; ; FB TABLE ENTRY ; NO NEED TO BE SAME LENGTH; NEVER SEARCHED BY LOOKUP ; F.T == 0 ;FB TYPE F.N == 1 ;FB NUMBER (0 <= F.N <= 9) F.V == 2 ;FB VALUE F.SIZE == 4 ;SIZE OF AN FB TABLE ENTRY ; ; LISTING MODE. ; LM.N == 0 ;NONE LM.S == 1 ;SOURCE LM.A == 2 ;ADDRESS LM.B == 3 ;BYTES LM.W == 4 ;WORDS ; ; COMPLEX LEXIC TOKENS ; ALL HIGHER THAN HIGHEST 8 BIT CHARACTER ; ID == 400 ;IDENTIFIER TOKEN CON == 401 ;CONSTANT TOKEN SL == 402 ;SHIFT LEFT '<<' SR == 403 ;SHIFT RIGHT '>>' TLAB == 404 ;TEMPORARY LABEL ; ; MISC. ; PCREL == 100000 ;PC REL TYPE FLAG SYREL == 040000 ;SYMBOL REL TYPE FLAG ; ; OPCODE TYPES ; ST.UND == 0 ;UNDEFINED ST.ABS == 1 ;ABSOLUTE ST.REG == 2 ;REGISTER ST.ASC == 3 ;.ASCII ST.ASZ == 4 ;.ASCIZ ST.WRD == 5 ;.WORD ST.BYT == 6 ;.BYTE ST.EVN == 7 ;.EVEN ST.ODD == 10 ;.ODD ST.BKW == 11 ;.BLKW ST.BKB == 12 ;.BLKB ST.GBL == 13 ;.GLOBL ST.ENT == 14 ;.ENTRY ST.PST == 15 ;.PSECT ST.SOP == 16 ;SINGLE OP ST.DOP == 17 ;DOUBLE OP ST.JSR == 20 ;JSR, XOR ST.BR == 21 ;BRANCH ST.RTS == 22 ;RTS ST.INH == 23 ;HALT, WAIT, ... ST.MRK == 24 ;MARK ST.SOB == 25 ;SOB ST.EMT == 26 ;EMT, TRAP ST.MUL == 27 ;MUL, DIV, ASH, ASHC ST.LIM == 30 ;.LIMIT ST.FLD == 31 ;FPP LOAD ST.FST == 32 ;FPP STORE ST.FL2 == 33 ;.FLT2 ST.FL4 == 34 ;.FLT4 ST.REL == 35 ;RELOCATABLE ST.REL == 36 ;RELOCATABLE ; ; GLOBAL DATA ; DIRECTIVE BLOCKS ; GMCR: GMCR$ ;GMCR DPB TI: QIO$ IO.WLB,1,1,,,,<0,0,40> SFILE: FDBDF$ ;SOURCE FILE DPB FDOP$A 2 ; OFILE: FDBDF$ ;OBJECT FILE DPB FDAT$A R.VAR,FD.CR ; FDOP$A 3 ; LFILE: FDBDF$ ;LISTING FILE FDB FDAT$A R.VAR,FD.CR ; FDOP$A 4 ; ARGV: .BLKW 10. ;POINTERS TO THE ARGUMENTS ARGVND: .BLKW 1 ;END MARK, SPACE FOR 0 WORD ARGVPT: .WORD ARGV-2 ;ARG POINTER (OPEN) TITLE: .BLKW 2 ;FILE TITLE SET BY AS2 BFLAG: .BYTE 0 ;-B BRANCHES GFLAG: .BYTE 0 ;-G GLOBALS LFLAG: .BYTE 0 ;-L LISTING NFLAG: .BYTE 0 ;-N NO OBJECT DFLAG: .BYTE 0 ;-D DELETE AFTER ASSEMBLY WFLAG: .BYTE 0 ;PROCESSING A WILDCARD FLAG (OPEN) .EVEN ;+ ; ** AS - MAIN DRIVING ROUTINE ; ; THIS IS THE MAIN DRIVING ROUTINE OF THE ASSEMBLER. IT GETS ; AND PARSES ITS COMMAND LINE, THEN LOOPS AROUND GETTING FILES ; AND ASSEMBLING THEM. ;- AS: CALL GCML ;GET AND PARSE COMMAND LINE BCS 20$ ;ERROR 10$: CALL OPEN ;GET A FILE TO ASSEMBLE BCS 20$ ;END OF FILES CALL ASEMBL ;ASSEMBLE IT CALL CLOSE ;CLOSE IT OFF BR 10$ ;AND DO IT AGAIN 20$: EXIT$S ;DONE ;+ ; ** MSG - WRITE A MESSAGE TO THE TI: ; ; INPUTS: ; R5=POINTER TO MESSAGE STRING ; ; USES: ; R5 ;- MSG: MOV R5,TI+Q.IOPL ;SAVE POINTER TO MESSAGE 10$: TSTB (R5)+ ;COMPUTE ITS LENGTH BNE 10$ ; DEC R5 ; SUB TI+Q.IOPL,R5 ; MOV R5,TI+Q.IOPL+2 ;SET INTO TTY DPB DIR$ #TI ;WRITE IT OUT WTSE$S #1 ; RETURN ; ;+ ; ** FMSG - WRITE FILE I/O MESSAGES ; ; INPUTS: ; R4=POINTER TO FILE NAME STRING ; R5=POINTER TO MESSAGE STRING ; ; USES: ; R5 ;- FMSG: MOV R5,-(SP) ;SAVE MESSAGE POINTER MOV R4,R5 ;FILE NAME MOV #'$,TI+Q.IOPL+4 ;THIS IS A HORRID WAY TO DO THIS CALL MSG ; MOV (SP)+,R5 ;BUT IT NEEDS NO BUFFER MOV #'+,TI+Q.IOPL+4 ; CALL MSG ; MOV #' ,TI+Q.IOPL+4 ; RETURN ;END OF HORROR .END AS