.NLIST TTM,BEX ;====================================================================== ; .TITLE SYMGET .IDENT /032081/ ; ; OPERATING SYSTEM: RSX-11M VERSION 3.2 ; ; AUTHOR: T V ATKINSON ; DEPT. OF CHEMISTRY ; MICHIGAN STATE UNIVERSITY ; EAST LANSING, MI 48824 ; ; DATE: 20-MAR-81 ; ; ABSTRACT: THIS SUBROUTINE RETRIEVES VECTOR LISTS FROM ONE OF SEVERAL ; SYMBOL LIBRARIES. THE LIBRARIES ARE IN PACKED FORMAT (SEE ; ROMSIM.MAC). ; ;---------------------------------------------------------------------- ; ; CALLING SEQUENCE: ; THERE ARE THREE CALLING SEQUENCES FOR SYMGET. THE FIRST IS FOR ; INITIALIZING FOR A NEW CHARACTER. THE SECOND IS USED ; TO RETRIEVE THE VECTORS WHICH DESCRIBE THE SYMBOL ONCE THE SYMBOL ; HAS BEEN INITIALIZED. A CALL OF THE SECOND TYPE WILL BE MADE ; FOR EACH VECTOR IN THE SYMBOL DESCRIPTION. A FINAL CALL OF ; THE SECOND TYPE WILL INDICATE THAT NO MORE VECTORS EXIST ; FOR THAT SYMBOL. THE THIRD TYPE CALL MUST BE DONE BEFORE ; ANY CALL OF THE FIRST TWO TYPES ARE DONE. THIS CALL WILL DEFINE ; THE INTERNAL LIBRARIES. ; ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ; ; CALLING SEQUENCE 0 (INITIALIZE FOR NEW CHARACTER): ; ; CALL SYMGET (0,IERR,SYMBOL,IRASTX,IRASTY,IEXTRM,LCHAR) ; ; WHERE: ; ; MODE ; =0 -> INITIALIZE FOR NEW SYMBOL ; ; IERR ; ERROR FLAG ; ; =0: VECTOR LIST READY TO BE RETRIEVED ; ; =1: ILLEGAL LIBRARY NUMBER ; ; =2: NONEXISTENT SYMBOL ; ; SYMBOL ; BYTE CONTAINING THE CODE OF THE SYMBOL ; ; IRASTX ; INTEGER TO RECEIVE THE HORIZONTAL RASTER SIZE FOR THIS ; ; SYMBOL. ; ; IRASTY ; INTEGER TO RECEIVE THE VERTICAL RASTER SIZE FOR THIS ; ; SYMBOL. ; ; IEXTRM ; INTEGER ARRAY OF DIMENSION 4 TO RECEIVE XMIN,XMAX, ; ; YMIN,YMAX FOR THE CHARACTER ; ; LCHAR ; CHARACTER NUMBER. THIS ARGUMENT WILL ONLY APPEAR ; ; IN ERROR MESSAGES AND SHOULD CONTAIN THE INDEX OF ; ; THE CURRENT CHARACTER IN THE STRING BEING DRAWN. ; ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ; ; CALLING SEQUENCE 1 (RETRIEVE VECTORS) ; ; ; CALL SYMGET (1,IERR,IM,IX,IY) ; ; WHERE: ; ; MODE ; =1 -> RETRIEVE VECTORS ; ; IERR ; ERROR FLAG (RETURNED TO CALLING PROGRAM) ; ; = 0: VALID IM,IX,IY HAS BEEN RETURNED ; ; = -1: NO MORE VECTORS FOR THIS SYMBOL ; ; IM ; VECTRO DRAWING MODE ; ; = 1: VECTOR IS TO BE DRAWN IN UNWRITTEN MODE ; ; = 2: VECTOR IS TO BE DRAWN IN WRITTEN MODE ; ; IX ; INTEGER RELATIVE X-COORDINATE ; ; IY ; INTEGER RELATIVE Y-COORDINATE ; ; ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ; ; CALLING SEQUENCE 2 (SET INTERNAL LIBRARIES) ; ; EXTERNAL (LIB1,LIB2,LIB3, ... ) ; . ; . ; ; CALL SYMGET (2,NUML,LIB1,LIB2,LIB3, ... ) ; ; WHERE: ; ; NUML ; = NUMBER OF LIBRARIES TO BE INTERNAL ; ; LIB1 ; NAME OF THE FIRST SYMBOL LIBRARY ; ; LIB2 ; NAME OF THE SECOND SYMBOL LIBRARY ; ; LIB3 ; NAME OF THE THIRD SYMBOL LIBRARY ; ;====================================================================== ; ; DEFINITIONS ; O.MODE=2 ;ARGUMENT LIST OFFSETS O.IERR=4 O.SYMB=6 O.IRAX=10 O.IRAY=12 O.IEXT=14 O.LCHA=16 ; O.IM=6 O.IX=10 O.IY=12 ; O.NUML=4 ; ; REGISTER USAGE ; ; R0 SCRATCH ; R1 CHARACTER CODE, SCRATCH ; R2 -> NEXT VECTOR ; R3 -> FIRST VECTOR OF NEXT ENTRY ; R4 ERROR FLAG ; .PAGE .PSECT SYMGET .GLOBL SYMGET ; ;---------------------------------------------------------------------- ; ; ENTRY POINT: ; ;---------------------------------------------------------------------- ; SYMGET: MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) CLR R4 ; CLEAR LOCAL ERROR FLAG CMP #1,@O.MODE(R5) ; GO TO PROPER MODE BHI SETSYM ; =0, BRANCH BEQ VECGET ; =1, BRANCH BR SETLIB ; ;---------------------------------------------------------------------- ; ; SET UP FOR A NEW SYMBOL ; ;---------------------------------------------------------------------- ; SETSYM: MOV @O.LCHA(R5),ERRARG+4 ; SET UP FOR ERROR MESSAGE MOV LIBNUM,R1 ; GET ADDRESS OF LIBRARY MOV R1,ERRARG ; SET UP FOR POSSIBLE ERROR MSG CMP NUMEXT,R1 ; VALID LIBRARY? BLO ERR1 ; NO, BRANCH ASL R1 ; CONVERT TO WORD ADDRESS MOV LIBTBL(R1),R0 ; R0 <<<< ENTRY POINT OF LIBRARY MOV R0,-(SP) ; SAVE BASE ADDRESS ; ; FIND SYMBOL ; MOVB @O.SYMB(R5),R1 ; R1 <<<< SYMBOL BIC #177600,R1 ; 7-BIT ASCII ONLY MOV R1,ERRARG+2 ; SET UP FOR POSSIBLE ERROR MSG CMP R1,(R0)+ ; SYMBOL CODE .LT. FIRST ENTRY? BLO ERR2 ; YES, BRANCH CMP R1,(R0)+ ; SYMBOL CODE .GT. LAST ENTRY? BHI ERR2 ; NO, BRANCH ; ; R0 -> RASTER SIZE ; MOV R0,R3 ; R3 <<<< R0 ADD #4,R3 ; BUMP R3 PAST RASTER SIZES SUB -4(R0),R1 ; REMOVE FIRST CODE BIAS ASL R1 ; CONVERT CODE TO WORD ADDRESS ADD R1,R3 ; R3 <<<< ADDRESS OF ENTRY IN PNTTBL MOV (R3)+,R2 ; R2 <<<< FIRST VECTOR ADDRESS ADD (SP),R2 MOV (R3),R3 ; R3 <<<< ADDRESS OF FIRST VECTOR OF NEXT ; SYMBOL ADD (SP)+,R3 CMP R2,R3 ; DOES SYMBOL EXIST? BHIS ERR2A ; NO, BRANCH ; ; SYMBOL FOUND ; MOV (R0)+,@O.IRAX(R5) ; RETURN RASTER SIZE MOV (R0),@O.IRAY(R5) MOV R3,NXTENT ; SAVE THE POINTER MOV O.IEXT(R5),R1 ; R1 -> EXTREMA ARRAY MOV #4.,R0 ; R0 <<<< NUMBER OF EXTREMA 1$: MOVB (R2)+,R3 ; CONVERT EXTREME TO SIGNED INTEGER MOV R3,(R1)+ ; RETURN EXTREME SOB R0,1$ ; DO FOUR MOV R2,NXTVEC ; SAVE THE POINTERS BR EXIT ; ;---------------------------------------------------------------------- ; ; RETURN THE NEXT VECTOR FOR THIS SYMBOL ; ;---------------------------------------------------------------------- ; VECGET: CMP #2,O.MODE(R5) ; SET UP? BEQ SETLIB ; YES, BRANCH MOV NXTVEC,R2 ; R2 <<<< ADDRESS OF NEXT VECTOR CMP R2,NXTENT ; MORE VECTORS? BHIS DONE ; NO, BRANCH MOV (R2)+,R0 ; GET NEXT VECTOR(PACKED) MOV R2,NXTVEC ; UPDATE NEXT VECTOR POINTER ; ; GET VECTOR DRAWING MODE ; CLR R1 ; GET MODE TST R0 ; BIT15 = 1? BPL 1$ ; NO, MODE = 1; BRANCH INC R1 ; YES, MODE = 2 1$: INC R1 MOV R1,@O.IM(R5) ; RETURN MODE ; ; GET IY ; MOVB R0,R1 ; R1 <<<< LOWER BYTE OF VECTOR(PACKED) ; (WITH SIGN EXTENSION) MOV R1,@O.IY(R5) ; RETURN IY ; ; GET IX ; ASL R0 ; BIT15 <<<< BIT6(UPPER BYTE) ASH #-9.,R0 ; SIGN EXTEND MOV R0,@O.IX(R5) ; RETURN IX BR EXIT ; ;---------------------------------------------------------------------- ; ; SET UP INTERNAL LIBRARY LIST ; ;---------------------------------------------------------------------- ; SETLIB: MOV @O.NUML(R5),R4 ; R4 <<<< # OF INTERNAL LIB CMP #MAXTBL,R4 ; ROOM FOR ALL THE LIBR? BLOS ERR3 ; NO, BRANCH MOV R4,NUMEXT ; SET NUMBER IN SYMLIB COMMON MOV R5,R0 ; R0 WILL POINT TO LIBRARY LIST ADD #6,R0 ; BUMP PAST #ARG,ARG1,ARG2 MOV #LIBTBL,R1 ; R1 -> LIBRARY TABLE TST R4 ; NO INTERNAL LIBRARIES? BEQ 2$ ; NONE, BRANCH 1$: MOV (R0)+,(R1)+ ; LOAD ADDRESSES INTO LIBTBL SOB R4,1$ 2$: MOV #LIBEXT+2,(R1) ; PUT IN ADDRESS OF LOADABLE LIBRARY BR EXIT ; ;---------------------------------------------------------------------- ; ; ERROR HANDLER ; ;---------------------------------------------------------------------- ; ERR2: TST (SP)+ ; POP BASE ADDRESS BR ERR2A ERR3: INC R4 ERR2A: INC R4 ERR1: INC R4 MOV R4,@O.IERR(R5) ; RETURN ERROR FLAG DEC R4 ; CONVERT TO "0" BASED ADDRESS ASL R4 ; CONVERT TO BYTE ADDRESS MOV MSGTAB(R4),ERRMSG ; UPDATE ERR MSG POINTER MOV NARTAB(R4),NUMARG ; CHOOSE NUMBER OF ARGUMENTS MOV R5,-(SP) MOV #ARGLIS,R5 ; SET UP CALL TO FORTRN JSR PC,ERRPRT ; GO PRINT IT MOV (SP)+,R5 BR EXIT1 ; ; FORTRAN IV ARGUMENT LIST ; ARGLIS: .BYTE 4,0 .WORD MODNAM .WORD ERRARG .WORD NUMARG ERRMSG: .WORD 0 ; POINTER TO ERROR MESSAGE ; ; ERROR REPORTING STORAGE ; MSGTAB: .WORD MSG1 ; TABLE OF MESSAGE POINTERS .WORD MSG2 .WORD MSG3 NARTAB: .WORD 1 ; TABLE OF NUMBER OF ARGUMENTS .WORD 3 .WORD 1 NUMARG: .WORD 0 ; NUMBER OF ARGUMENTS ERRARG: .BLKW 3 ; ARGUMENTS TO BE PRINTED WITH ERROR MSG ; ; MESAGES ; MODNAM: .ASCII / SYMGET/ MSG1: .ASCII /ILLEGAL LIBRARY / MSG2: .ASCII /ILLEGAL CHARACT / MSG3: .ASCII /TOO MANY LIBR'S / ; ;---------------------------------------------------------------------- ; ; EXIT ; ;---------------------------------------------------------------------- ; DONE: DEC R4 EXIT: MOV R4,@O.IERR(R5) ; RETURN ERROR FLAG EXIT1: MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 RTS PC ; ;---------------------------------------------------------------------- ; ; STORAGE ; ;---------------------------------------------------------------------- ; NXTVEC: .WORD 0 ; POINTER TO NEXT VECTOR NXTENT: .WORD 0 ; POINTER TO FIRST VECTOR OF NEXT ENTRY ; ;---------------------------------------------------------------------- ; ; TABLE OF POINTERS TO LIBRARY ENTRY POINTS ; ;---------------------------------------------------------------------- ; MAXTBL=10. LIBTBL: .BLKW MAXTBL ; TABLE OF SYMBOL LIBRARY ADDRESSES ; ;---------------------------------------------------------------------- ; ; LOADABLE LIBRARY ; ;---------------------------------------------------------------------- ; .PSECT SYMLIB,RW,D,GBL,REL,OVR NWORD=1. NUMEXT: .WORD 0 ; LIBRARY NUMBER FOR EXTERNAL LIBR NWEXTL: .WORD NWORD NBYTE: .WORD 0 LIBNUM: .WORD 0 LIBEXT: .BLKW NWORD ; ;---------------------------------------------------------------------- ; .END