.TITLE STB -- CREATE A STB FILE .SBTTL TITLE PAGE .IDENT /VD0.0/ ;+ ; ; AUTHOR: 1LT JOEL IRWIN ; ; ; DATE: 21 NOV 1977 ; ; ; SYSTEM: OISS SUBSYSTEM: PROGRAMMER AID ; ; ; FUNCTIONAL DESCRIPTION: ; ; THIS PROGRAM WILL TAKE AS INPUT THE LISTING FILE CREATED BY ; TKB AND CREATE AN STB FILE CONTAINING AS THE GLOBAL SYMBOLS, THE ; PSECTS DEFINED IN THE USER PROGRAM AND THEIR ASSOCIATED VALUES. ; THIS STB FILE IN TURN CAN BE USED BY THE USER TO DEFINE THOSE ; PSECT SYMBOLS VIA THE O COMMAND WHEN USING THE DDT DEBUGGER. ; ; ; ; ; RECORD OF MODIFICATIONS ; ; VERSION DATE BY DESCRIPTION ; _______ ____ __ ___________ ; ; ; ; ; ; GLOBAL EVENT FLAG USAGE: ; ; ;- .SBTTL MACROS,SYMBOLS,AND DATA .PAGE ; ; ; LOCAL MACRO DEFINITIONS AND SYSTEM MACRO CALLS ; ; .MACRO ERRPUT NAME,LENGTH,ERRCD MOV #NAME,R0 MOV #LENGTH,R1 .IIF NB,ERRCD,MOV ERRCD,R2 JMP ERROR .ENDM .MCALL GCML$,CSI$1,CSI$2,OPEN$R,OPEN$W,CLOSE$,EXIT$S,QIOW$S,GET$ .MCALL PUT$ .MCALL STRUCT,IF,END,REPEAT,UNTILB,ELSE,IFB STRUCT ; ; ; GLOBAL SYMBOL DEFINITIONS AND DATA ; ; .SBTTL INPUTS,OUTPUTS AND EFFECTS .PAGE ;+ ; ; INPUTS: ; THE USER INPUT FILE STRING IS OF THE TYPICAL FORM: ; OUTPUTFILE=INPUTFILE ; ; WHERE THE DEFAULT INPUT FILE TYPE IS .MAP ; AND THE DEFAULT OUTPUT FILE TYPE IS .STB ; ; ; OUTPUTS: ; AN STB FILE IS CREATED WITH GLOBAL SYMBOL DIRECTORY RECORDS AS ; DESCRIBED BELOW (ONE FOR EACH PSECT). A COMPLETE DESCRIPTION OF ; THESE DATA RECORDS IS IN THE TASK BUILDER MANUAL APPENDIX B. ; ; EACH GSD RECORD LOOKS AS FOLLOWS: ; WORD 0 - 1,0 ; WORD 1 - CHARS 1-3 OF PSECT NAME IN RAD50 ; WORD 2 - CHARS 4-6 OF PSECT NAME IN RAD50 ; WORD 3 - 50,4 ; WORD 4 - STARTING ADDRESS OF PSECT (BINARY) ; ; THE STB FILE IS A SEQUENCE OF GSD RECORDS. IT IS TERMINATED WITH ; TWO STANDARD STB TERMINATING RECORDS (EACH 1 WD LONG): ; ; END GSD RECORD: 0,2 ; END OF MODULE: 9,0 ; ; ; EFFECTS: ; ; THE EFFECT OF THIS PROGRAM IS TO CREATE AN STB FILE SPECIFIED ; BY THE USER IN HIS COMMAND STRING. ; ;- .PAGE .NLIST BIN .SBTTL MAIN ROUTINE ; .PSECT STB,RW ;FOR DEBUGGING PURPOSES ONLY .PSECT STB,RO STB: GCML$ #GCLBLK ;GET THE USER COMMAND LINE BCS ERROR1 CSI$1 #CSIBLK,GCLBLK+G.CMLD+2,GCLBLK+G.CMLD ;PARSE THE INPUT LINE BCS ERROR1 ;SYNTAX ERROR CSI$2 #CSIBLK,INPUT ;PARSE THE INPUT FILE NAME BCS ERROR2 BITB #CS.WLD!CS.MOR,CSIBLK+C.STAT ;BETTER NOT BE WILDCARDS BCS ERROR3 OPEN$R #INFDB ;NOW TRY AND OPEN THE INPUT FILE BCS ERROR4 CSI$2 #CSIBLK,OUTPUT ;NOW PARSE THE OUTPUT FILE NAME BCS ERROR2 BITB #CS.WLD!CS.MOR,CSIBLK+C.STAT ;BETTER NOT BE WILDCARDS BCS ERROR3 OPEN$W #STBFDB ;NOW OPEN THE OUTPUT STB FILE BCS ERROR5 CALL CREATE ;ALL IS WELL SO CREATE THE FILE CLOSE$ #INFDB ;CLOSE BOTH THE INPUT AND OUTPUT FILES BCS ERROR6 CLOSE$ #STBFDB BCS ERROR7 EXIT$S ;AND EXIT .PAGE .SBTTL ERROR SECTION ERROR1: ERRPUT ERR1,ERR1L ERROR2: ERRPUT ERR2,ERR2L ERROR3: ERRPUT ERR3,ERR3L ERROR4: ERRPUT ERR4,ERR4L,INFDB+F.ERR ERROR5: ERRPUT ERR5,ERR5L,STBFDB+F.ERR ERROR6: ERRPUT ERR6,ERR6L,INFDB+F.ERR ERROR7: ERRPUT ERR7,ERR7L,STBFDB+F.ERR ERROR8: ERRPUT ERR8,ERR8L,INFDB+F.ERR ERROR9: ERRPUT ERR9,ERR9L,STBFDB+F.ERR .PSECT ERROR,RO ; COMMON ERROR HANDLING SECTION ERROR: QIOW$S #IO.WVB,#5,#1,,,, IF R2 NE IF #177400 SETOFF R2 MOV #IOERRN,R0 ;CONVERT ERROR CODE MOVB R2,R1 CLR R2 CALL $CBDSG QIOW$S #IO.WVB,#5,#1,,,,<#IOERR,#IOERRL,#40> ELSE MOV #DRERRN,R0 ;CONVERT ERROR CODE MOVB R2,R1 CLR R2 CALL $CBDSG QIOW$S #IO.WVB,#5,#1,,,,<#DRERR,#DRERRL,#40> END END EXIT$S .PSECT ERRMSG,RO ; THE ERROR MESSAGES ERR1: .ASCII /SYNTAX ERROR IN COMMAND STRING/ ERR1L=.-ERR1 ERR2: .ASCII /SEMANTIC ERROR IN COMMAND STRING/ ERR2L=.-ERR2 ERR3: .ASCII /WILDCARDS NOT ALLOWED IN COMMAND STRING/ ERR3L=.-ERR3 ERR4: .ASCII /OPEN ERROR FOR INPUT FILE/ ERR4L=.-ERR4 ERR5: .ASCII /OPEN ERROR FOR OUTPUT FILE/ ERR5L=.-ERR5 ERR6: .ASCII /CLOSE ERROR FOR INPUT FILE/ ERR6L=.-ERR6 ERR7: .ASCII /CLOSE ERROR FOR OUTPUT FILE/ ERR7L=.-ERR7 ERR8: .ASCII /INPUT ERROR/ ERR8L=.-ERR8 ERR9: .ASCII /OUTPUT ERROR/ ERR9L=.-ERR9 .EVEN .PAGE .SBTTL CREATING THE STB FILE .PSECT STB CREATE: REPEAT ;FIND THE FIRST RECORD WHOSE FIRST CHAR IS GET$ #INFDB ;A < BCS ERROR8 UNTILB INPUT EQ #'< REPEAT ;NOW CREATE THE GCDS MOV #INPUT+1,R0 ;THE PSECT NAME FIELD MOV #1,R1 CALL $CAT5 MOV R1,OUTPUT+NF1 CALL $CAT5 MOV R1,OUTPUT+NF2 MOV #INPUT+12,R0 ;THE PSECT VALUE CALL $COTB MOV R1,OUTPUT+VAL PUT$ #STBFDB ;OUT GOES THE RECORD BCS ERROR9 GET$ #INFDB ;AND IN COMES ANOTHER IF CS IFB #IE.EOF EQ INFDB+F.ERR ;AN EOF HERE IS ALSO OK BR DONE ELSE BR ERROR8 END END UNTILB INPUT NE #'< ;STOP CREATING GCDS WHEN THERE ARE NO ;MORE PSECTS DONE: PUT$ #STBFDB,#ENDGCD,#4. ;OUT GOES THE FINAL TWO RECS BCS ERROR9 PUT$ #STBFDB,#ENDSTB,#4. BCS ERROR9 RETURN .PSECT IODATA,RW INPUT:: .BLKB 121. ;HOPE THIS IS THE LARGEST REC POSSIBLE! .EVEN OUTPUT::.BYTE 1,0 .BLKW 2 .BYTE 50,4 .BLKW 1 NF1=2 NF2=NF1+2 VAL=NF2+4 ENDGCD: .BYTE 0,2 ENDSTB: .BYTE 9.,0 IOERR: .ASCII /IO ERROR CODE / IOERRN: .BLKB 6 IOERRL=.-IOERR DRERR: .ASCII /DIRECTIVE ERROR CODE / DRERRN:.BLKB 6 DRERRL=.-DRERR .EVEN ENDCHK .END STB