;-*-MIDAS-*- .SYMTAB 5000. ; need room for symbols TITLE CVT SUBTTL Mark Crispin, Stanford University ; Makes the MIDAS .INSRT file TNXDFU.MID out of the MACRO universal files ; SYS:MACSYM.UNV and SYS:MONSYM.UNV ; Modified by KLH so runtime will work on either 10X/T20. .DECSAV ; specify direct SAV/EXE file output INJFN: BLOCK 1 ; save area for input JFN OUTJFN: BLOCK 1 ; save area for output JFN .SCALAR FLG20X ; -1 if on 20X DEFINE LOSE TEXT JRST [ HRROI 1,[ASCIZ/TEXT - /] ESOUT JRST DIE] TERMIN DEFINE TYPE &TEXT& HRROI 1,[ASCIZ TEXT] PSOUT TERMIN DEFINE TYPFIL (JFN) MOVE 2,JFN MOVEI 1,.PRIOU SETZ 3, JFNS TERMIN ; Start here CVT: RESET ; initialize all I/O SETZM FLG20X ; Determine sys; assume 10X MOVE 1,[SIXBIT /LOADTB/] ; So far only 10X has this table. SYSGT CAIN 2,0 SETOM FLG20X ; Table not defined, so must be 20X. MOVSI 1,(GJ%FOU\GJ%SHT\GJ%NEW) ; open up TNXDFU.MID for write HRROI 2,[ASCIZ/TNXDFU.MID/] GTJFN LOSE [Can't gtjfn TNXDFU.MID] HRRZM 1,OUTJFN MOVE 2,[7_12.,,OF%WR] ; 7-bit write OPENF LOSE [Can't open TNXDFU.MID] TYPE "Writing file " TYPFIL OUTJFN TYPE " " MOVE 1,OUTJFN HRROI 2,[ASCIZ ";;TNXDFU - TOPS-20/TENEX symbol definition file for MIDAS ;; MONSYM Symbols "] ; output header SETZ 3, SOUT MOVSI 1,(GJ%OLD\GJ%SHT) ; open up SYS:MONSYM.UNV for read HRROI 2,[ASCIZ/MONSYM.UNV/] SKIPE FLG20X HRROI 2,[ASCIZ/SYS:MONSYM.UNV/] GETLP: GTJFN JRST [ HRROI 1,[ASCIZ/Can't find default MONSYM.UNV file, specify file to use: /] PSOUT MOVSI 1,(GJ%OLD\GJ%SHT\GJ%FNS) MOVE 2,[.PRIIN,,.PRIOU] JRST GETLP] HRRZM 1,INJFN ; current input JFN MOVEI 2,OF%RD ; 36-bit read OPENF LOSE [Can't open MONSYM file] TYPE "using " TYPFIL INJFN TYPE " ..." JSR GO ; process the file MOVE 1,INJFN ; close up MONSYM CLOSF LOSE [Can't close MONSYM] TYPE " " MOVE 1,OUTJFN ; output MACSYM banner HRROI 2,[ASCIZ/ ;; MACSYM Symbols /] SETZ 3, SOUT MOVSI 1,(GJ%OLD\GJ%SHT) ; open up SYS:MACSYM.UNV for read HRROI 2,[ASCIZ/MACSYM.UNV/] SKIPE FLG20X HRROI 2,[ASCIZ/SYS:MACSYM.UNV/] GETLP2: GTJFN JRST [ HRROI 1,[ASCIZ/Can't find default MACSYM.UNV file, specify file to use: /] PSOUT MOVSI 1,(GJ%OLD\GJ%SHT\GJ%FNS) MOVE 2,[.PRIIN,,.PRIOU] JRST GETLP2] HRRZM 1,INJFN MOVEI 2,OF%RD OPENF LOSE [Can't open MACSYM file] TYPE "using " TYPFIL INJFN TYPE " ..." JSR GO ; do it MOVE 1,INJFN ; close MACSYM CLOSF LOSE [Can't close MACSYM] TYPE " " MOVE 1,OUTJFN CLOSF LOSE [Can't close TNXDFU] TYPE "Done. " PSOUT HALTF ; return to EXEC JRST .-1 ; no continuing allowed DIE: MOVEI 1,.PRIOU ; primary output HRLOI 2,.FHSLF ; this fork,,last error ERSTR ; output error NOP ; ignore failure NOP HALTF JRST .-1 COMMENT | Stuff about UNIVERSAL file format, taken from MACRO source. ;UNIVERSAL VERSION BIT DEFINITION ;THE FIRST WORD OF A UNV FILE MUST CONTAIN: ; LEFT HALF 777 ; RIGHT HALF UNIVERSAL VERSION NUMBER ;WHEN WRITING A UNV FILE, MACRO WRITES OUT: ; 777,,UWVER FOR THE FIRST WORD ; .JBVER FOR THE SECOND WORD( MACRO VERSION NUMBER) ;WHEN READING A UNV FILE, MACRO READS THE FIRST WORD AND CHECKS FOR: ; 777 IN LEFT HALF, AND ; CHECKS THE RIGHT HALF AGAINST MASK .URVER ; WILL SKIP THE SECOND WORD IF A VERSION NUMBER IS EXPECTED THERE ; UMACV==000020 ;HAS MACRO VERSION IN 2ND WORD USYN==000010 ;NEW SYN HANDLING IN UNIVERSAL UBAS==000004 ;MUST HAVE THIS BASIC BIT ON ;SAME AS THE FIRST VERSION #4 UPOL==000002 ;POLISH INCLUDED UMAD==000001 ;MACRO ARG DEFAULT VALUE BUG FIXED | ; Universal flag definitions SYMF==400000 ; symbol TAGF==200000 ; tag NOOUTF==100000 ; no DDT output SYNF==040000 ; synonym MACF==020000 ; macro OPDF==010000 ; opdef PNTF==004000 ; "value" in symbol table in ; pointer to 36-bit value UNDF==002000 ; undefined EXTF==001000 ; external INTF==000400 ; internal ENTF==000200 ; entry ARF==000100 ; variable NCRF==000040 ; don't CREF MDFF==000020 ; multiply defined SPTR==000010 ; special external pointer SUPRBT==000004 ; suppress output to REL and listing LELF==000002 ; LH relocatable RELF==000001 ; RH relocatable GO: 0 ; PC return point MOVE 1,INJFN REPEAT 5,[ BIN ; slurp up header words ];REPEAT 5 IOLP: BIN ; read a symbol JUMPE 2,[JRST 4,IOLP] ; spurious end of file? IOLP1: CAMN 2,[373737373737] ; special symbol meaning end of universal file JRST 2,@GO ; at end, return to caller MOVE 10,2 ; save symbol for safekeeping BIN ; read flags word MOVE 11,2 ; save flags as well TLNN 11,MACF ; macro? JRST NOTMAC ; no, look at it further ; Have to flush a macro...great pain involved. FLSMAC: BIN ; word 1 of leaf, LH 0 if last leaf MOVE 11,2 ; save it REPEAT 3,[ BIN ; rest of leaf ];REPEAT 3 TLNE 11,-1 ; last leaf? JRST FLSMAC ; no, get next leaf ;;; I don't think this code is right, but it seems to work... BIN ; check for arguments TLNE 2,770000 ; look like SIXBIT? JRST IOLP1 ; yes, back to top level loop HLRZ 11,2 ; looks like a macro argument, get arg count-1 FLSARG: REPEAT 5,[ BIN ; default value plus leaf ];REPEAT 5 SOJGE 11,FLSARG ; flush remaining arguments JRST IOLP NOTMAC: MOVE 1,OUTJFN ; get ready to output this symbol HRROI 2,[ASCIZ/;;; /] ; see if we need to comment it out TLNN 11,TAGF\UNDF\EXTF\ENTF\MDFF\SPTR\LELF\RELF ; any of these CAMN 10,['.SYMTA] ; or if .SYMTAB SOUT ; will cause it to be commented out HRROI 2,[ASCIZ/DEFSYM /] ; output DEFSYM line SOUT JSR SIXOUT ; output the symbol name TRNN 10,77 ; right justify the symbol name JRST [ LSH 10,-6 JRST .-1] ANDI 10,77 ; now get its last character CAIN 10,'% ; did the symbol end in "%"? SKIPA 2,[-1,,[ASCIZ/=:/]] ; yes, new-style JSYS name HRROI 2,[ASCIZ/==:/] ; otherwise suppress DDT typeout of it SOUT TLNN 11,PNTF\SPTR ; see if pointer block JRST [ HRRZ 2,11 ; no, easy case right halfword symbol MOVE 3,[NO%LFL\NO%ZRO\<6.,,8.>] NOUT LOSE [NOUT failed] JRST TERPRI] ; output CRLF and do next symbol MOVE 1,INJFN ; pointer, get next word BIN TLNE 11,EXTF ; simple external? JRST [ BIN ; yes, get symbol it references MOVE 10,2 MOVE 1,OUTJFN ; output the symbol JSR SIXOUT JRST TERPRI] ; output CRLF and do next symbol MOVE 1,OUTJFN ; otherwise it looks like a fullword symbol MOVE 3,[NO%MAG\NO%LFL\NO%ZRO\<12.,,8.>] NOUT LOSE [NOUT failed] TLNN 11,SPTR ; simple numeric value? JRST TERPRI ; yes, output CRLF and do next MOVEI 2,"+ ; no, plus some relocatable or Polish stuff BOUT MOVE 1,INJFN ; get what sort of thing the extra stuff is BIN JUMPL 2,POLAK ; if negative, Polish expression BIN ; I forget what this word was supposed to be... BIN ; finally the symbol added in MOVE 10,2 ; output it MOVE 1,OUTJFN JSR SIXOUT TERPRI: HRROI 2,[ASCIZ/ /] ; output CRLF SETZ 3, SOUT MOVE 1,INJFN ; set JFN back JRST IOLP ; and get next symbol POLAK: MOVE 1,OUTJFN ; Polish expression -- don't even try to win HRROI 2,[ASCIZ//] SETZ 3, SOUT MOVE 1,INJFN FLSPOL: BIN ; link word JUMPN 2,FLSPOL ; can't be EOF BIN SKIPL 2 CAIL 2,14 ; look like a Polish block? JRST [MOVE 1,OUTJFN ; no, probably an external block, done JRST TERPRI] REPEAT 4,[ BIN ; remainder of block ];REPEAT 4 REPEAT 2,[ BIN ; consistency block ];REPEAT 2 JRST FLSPOL ; continue flushing Polish cruft SIXOUT: 0 ; simple SIXBIT output routine MOVE 4,[440600,,10] SIXOU1: ILDB 2,4 JUMPE 2,@SIXOUT ADDI 2,"A-'A BOUT TLNE 4,770000 JRST SIXOU1 JRST 2,@SIXOUT ..LIT: CONSTA END CVT