diff --git a/src/midas/cvtunv.4 b/src/midas/cvtunv.4 new file mode 100755 index 00000000..eda250b7 --- /dev/null +++ b/src/midas/cvtunv.4 @@ -0,0 +1,309 @@ +;-*-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