diff --git a/README.md b/README.md index dc6e585d..036f4c42 100644 --- a/README.md +++ b/README.md @@ -163,6 +163,7 @@ A list of [known ITS machines](doc/machines.md). - LOSS (device). - LSPEED, set tty line parameters. - LUSER, request help from registered list of logged-in users. + - MAGDMP, standalone program loader/dumper for magtape. - MAIL, Mail sending client. - MAILT, allows editing mail (from :MAIL) in EMACS. - METER, displays system metering information. diff --git a/build/build.tcl b/build/build.tcl index 5f26b936..5c50c73f 100644 --- a/build/build.tcl +++ b/build/build.tcl @@ -309,6 +309,14 @@ expect ":KILL" respond "*" ":link teach;ts emacs,emacs;tstch >\r" type ":vk\r" +# magdmp +respond "*" ":midas .;_syseng;magdmp\r" +respond "PTRHRI=" "y\r" +respond "KL10P=" "n\r" +respond "TM10BP=" "n\r" +respond "340P=" "n\r" +expect ":KILL" + respond "*" ":midas sysbin;_syseng;dump\r" respond "WHICH MACHINE?" "DB\r" expect ":KILL" diff --git a/src/syseng/magdmp.27 b/src/syseng/magdmp.27 new file mode 100755 index 00000000..332d2996 --- /dev/null +++ b/src/syseng/magdmp.27 @@ -0,0 +1,641 @@ +TITLE MAGDMP + +;MAGDMP is a standalone program loader/dumper for magtape. +;The format of binary programs is the same as the ITS "SBLK" +;format, as popularized by Midas. The tapes are normally +;created under timesharing with the MAGFRM program. +; +;MAGDMP filenames are: +; name1 name2 version_number +; name1 name2 +; version_number defaults to the equivalent of ">" +; name2 +; name1 defaults to "@" +; +;MAGDMP commands are: +; +; clear core, load and start program +; L +; clear core, load program, leave control in MAGDMP +; M +; load program without clearing core ("merge"), leave control in MACDMP +; T +; clear core except DDT, load program, give symbol table +; to DDT, and start DDT. 777400G returns to MAGDMP +; F +; list directory (if you have a 340, the directory +; is displayed on the 340 and this command doesn't exist. +;  +; get the directory off the tape again +; D +; dump all non-zero core onto tape and give it the specified name +; G +; start program at its starting address +; The nnn command of DSKDMP does not work in MAGDMP. + +;On non-KL10, load via hardware read-in. +;On KL10, load with a J MAGDMP command to KLDCP, +;which does the following: +; +;Reset KL10 and start microcode +;Set EPT location to ITS standard (currently 2000) +;Turn OFF the cache +;Load the following into memory: +;100/ 763760777176 ;DF10-C command for locs 777177-777777 +;101/ 0 +;102/ 734540000107 ;DATAO MTS,107 ;SET ICWA +;103/ 734200072200 ;CONO MTC,072200 ;READ CONTIN, ODD PAR, 800 BPI, CORE DUMP +;104/ 734740000100 ;CONSO MTS,100 ;AWAIT JOB DONE +;105/ 254000000104 ;JRST .-1 +;106/ 254000777200 ;JRST 777200 ;JUMP TO MAGDMP +;107/ 100 ;ICWA +;START AT 102 + +.MLLIT==1 + +DEFINE SETF TEXT,FLG +IFDEF FLG,.STOP +.TAG FOOBAR +PRINTC "TEXT +FLG=" +.TTYMAC FLAG +.TTYFLG==.TTYFLG+1 +PRINTX/FLAG +/ +.TTYFLG==.TTYFLG-1 +IFSE FLAG,YES,FLG==1 +IFSE FLAG,NO,FLG==0 +IFSE FLAG,Y,FLG==1 +IFSE FLAG,N,FLG==0 +IFNDEF FLG,FLG==FLAG +TERMIN +IFNDEF FLG,.GO FOOBAR +TERMIN + +SETF Paper Tape HRI?,PTRHRI +SETF KL10?,KL10P +SETF TM10B?,TM10BP +SETF 340?,340P + +IFN PTRHRI,[ +NOSYMS +RIM10 +] + +BUFFER=176000 ;THIS IS ABOUT THE LEAST DANGEROUS PLACE IN MEMORY TO PUT IT +IFN TM10BP, ICWA=20 +IFN KL10P, PAG==10 + +IFN KL10P, .INSRT SYSTEM;EPT + +CM=0 +A=1 +B=2 +C=3 +D=4 +E=5 +TT=6 +I=7 .SEE DING +Q=10 +J=11 +R=12 +W=13 +H=14 +P=17 +T=16 +U=15 + + MTC=340 ;MAG TAPE CHANNEL FOR FUNCTIONS + MTS=344 ;MAG TAPE CHANNEL FOR STOPPING AND STATUS + +;SHIFTS FOR FIELDS IN CONO MTC, + UNITNO==15. + PARITY==14. + CDUMP==13. + FUNC==9. + DENSTY==6. + + 800BPI==2 + 556BPI==1 + + MAGCOM=0_+1_+800BPI_+1_ + +;FUNCTIONS + NOOP1=0_+MAGCOM ;CLEAR INTERRUPT FLAGS + NOOP2=10_+MAGCOM ;INTERRUPT WHEN TRANSPORT IDLE + REWIND=1_+MAGCOM ;REWIND + READ=2_+MAGCOM ;READ + READAB=12_+MAGCOM ;READ ACROSS RECORD BOUNDARIES + READC=3_+MAGCOM ;READ/COMPARE + RDCAB=13_+MAGCOM ;READ/COMPARE ACROSS RECORD BOUNDARIES + WRITE=4_+MAGCOM ;WRITE + WRLEOR=14_+MAGCOM ;WRITE WITH LONG EOR GAP + WEOF=5_+MAGCOM ;WRITE EOF + SKIPF=6_+MAGCOM ;SPACE FOWARD ONE OR MORE RECORDS + SKFEOF=16_+MAGCOM ;SPACE TO EOF + SKIPB=7_+MAGCOM ;SPACE REVERSE ONE OR MORE RECORDS + SKBEOF=17_+MAGCOM ;SPACE REVERSE TO EOF + +;FLAGS + JOBDON==100 + DATREQ==1 + EOF==10000 + EOT==4000 + +RELOC=740000 +DDT=RELOC+34000 + +LOC RELOC+37200 + +LOZAD=.-1 +LOW=20 +HIGH=. + +DIRL==3 ;# WORDS PER DIRECTORY ENTRY + +DEFINE INFORM A,B +IF2 [PRINTX \A = B +\] +TERMIN + +GO: +IFE KL10P, CONO 635550 +IFN KL10P,[ + CONO APR,267760 ;I/O RESET, CLEAR AND DISABLE ALL APR FLAGS + CONO PI,010000 ;CLEAR P.I. SYSTEM + CONSZ PAG,620000 ;THE CACHE BETTER BE OFF & TRAPS DISABLED + JRST 4,. +] + MOVEI P,PDL-1 + MOVE B,['MAGDMP] +GO00: MOVEI A,0 + LSHC A,6 + ADDI A,40 + PUSHJ P,TYP + JUMPN B,GO00 + CONO MTS,1 ;STOP ANY HRI HACKERY +GODIR: PUSHJ P,REW ;REWIND TAPE + PUSHJ P,MTWAIT + PUSHJ P,SKPFE ;SKIP OVER HRI FILE + MOVEI A,DIR-1 ;POINTER TO READ INTO +DIRLP: PUSHJ P,RREC ;READ HEADER RECORD + AOJA A,DIREOF ;GOT EOF + CAIGE R,3 ;SKIP IF RECORD ADEQUATELY LONG + JRST DING + PUSH A,BUFFER ;STORE 3 WORDS IN DIR + PUSH A,BUFFER+1 ;.. + PUSH A,BUFFER+2 ;.. + PUSHJ P,SKPFE ;SKIP OVER REST OF HEADER FILE + PUSHJ P,SKPFE ;SKIP OVER PROGRAM FILE + JRST DIRLP + +DIREOF: HRRZM A,DIREND ;ADDRESS OF FIRST WORD AFTER DIRECTORY +DIRIN: MOVEI P,PDL-1 + PUSHJ P,REW +GOR: PUSHJ P,CRR + SETZ CM, + SETZB U,RDWR +CMD1: SETZM J ;J = VERS #, U = # CHARS TYPED + MOVNI E,3 + MOVSI H,(SETZ) ;FN1 +SPACE: AOJE E,TYVER + EXCH W,H ;FN1 + MOVSI H,(SETZ) ;FN2 + SKIPA R,[440600,,H] +TYVER: MOVE R,[220600,,J] +DOVR: +IFN 340P,[ + CONO DIS,100 + CONSZ TTY,40 + JRST TTY1 + MOVEI A,DIR + MOVNI C,1 +DNEXT: SUBI C,DTBL +DLUP: XCT DTB+DTBL(C) +DLUP2: TDC B,[404040,,404040] + DATAO DIS,B + MOVEI TT,200 + SOJG TT,. + AOJL C,DLUP + ADDI A,DIRL + CAME A,DIREND + JRST DNEXT + JRST DOVR + + SKIPA B,[020156,,261743] +DTB: MOVE B,(A) ;FN1 + MOVEI B,757575 ;3 SPACES AND 3 SHIFT INS + MOVE B,1(A) ;FN2 + HRRZ B,2(A) ;VERSION # + MOVEI B,747375 ;CR LF +DTBL==.-DTB +];END IFN 340P + +TTY1: +IFE KL10P+340P,[ + CONSO TTY,40 + JRST .-1 +] +IFE KL10P, DATAI TTY,A +IFN KL10P, MOVEI A,3400 + .ALSO PUSHJ P,DTEXIO + .ALSO JUMPE A,.-2 + PUSHJ P,TYP ;ECHO CHAR JUST READ + ORCMI A,177 ;SAME AS ANDI A,177 ? SUBI A,200 + AOJE A,GOR ;RUBOUT. RESET (A-177) + AOJ A, ;(A-176) + AOJGE A,ALTTST ;(A-175 .GE. 0, I.E. A=175,176) ALTMODE + ADDI A,135 ;(A-40) SIXBIT + JUMPL A,[TRNE A,10 + JRST ALTTST ;33 ALTMODE + JRST CARRET] ;15 OR 12 + CAIL A,100 + SUBI A,40 ;MIGHT BE LOWER CASE TTY + JUMPE A,SPACE + TLNE R,770000 + IDPB A,R + AOJA U,DOVR + +ALTTST: SOJLE U,ALTMD ;0 OR 1 CHARS BEFORE ALT +CARRET: JUMPE J,VEROK ;NO VER # +VERADJ: TRNE J,77 + JRST VEROK1 + LSH J,-6 + JRST VERADJ + +VEROK1: IORI J,202020 +VEROK: PUSHJ P,MTWAIT + SETOB B,D ;B= HIGHEST VER # FOUND, D = INDEX + MOVEI A,DIR +LOOKL: CAMN W,(A) + CAME H,1(A) + JRST LOOKE + HRRZ C,2(A) + JUMPE J,LOOK1 + CAMN C,J + JRST LOOK2 +LOOKE: ADDI A,DIRL + CAME A,DIREND + JRST LOOKL + JUMPL CM,LOOKW ;WRITE + JUMPL D,ERR ;NOT FOUND FOR READ +LOOK2: JUMPL CM,ERR ;WRITE & FILE ALREADY EXISTS + SKIPE J + MOVE D,A + MOVEI A,LOZAD+1 ;FIRST LOCATION NOT TO ZERO +IFE KL10P,[ + SETZM 40 + MOVE C,[40,,41] +] +IFN KL10P,[ + SETZM 3000 ;DEPENDS ON WHERE EPT IS, ETC. + MOVE C,[3000,,3001] +] + CAIN CM,'T + MOVE A,@DDT-1 ;ZERO ONLY UP TO DDT SYMS + CAIE CM,'M + BLT C,-1(A) ;ZERO CORE UNLESS MERGING + MOVEI A,-DIR+DIRL(D) + IDIVI A,DIRL + LSH A,1 ;# FILES TO SKIP +LOOKF1: PUSHJ P,SKPFE ;SKIP A FILE + SOJG A,LOOKF1 + MOVEI R,-1 ;SO CRD WILL READ A RECORD + SETOB E,RDWR +LOADJ1: PUSHJ P,CRD ;READ UP TO 'JRST 1' + CAME A,[JRST 1] + JRST LOADJ1 +LOAD: PUSHJ P,LODUMP + CAMN Q,A ;COMPARE CHECKSUM + JRST LOAD ;CHECKS, LOOP +;DROP THROUGH IF ERROR + ;DROPS IN +DING: +ERR: PUSH P,ERRX ;DIRIN'S BANE, RESET PDL. + SKIPA A,GCTL ;= ^G +CRR: HRROI A,^M +TYP: +IFE KL10P,[ + CONSZ TTY,20 + JRST .-1 + DATAO TTY,A + JUMPGE A,CPOPJ + MOVEI A,12 + JRST TYP +] +IFN KL10P,[ + PUSH P,A ;DON'T CLOBBER A + PUSHJ P,DTEXIO + POP P,A + JUMPGE A,CPOPJ + MOVEI A,12 + +DTEXIO: SETZM DTEFLG + HRRZM A,DTECMD + SETZM DTEF11 + CONO DTE,%DBL11 + SKIPN DTEFLG + JRST .-1 + MOVE A,DTEF11 + SETZM DTEFLG + POPJ P, +] + +IFE 340P,[ ;REST OF LISTF COMMAND +LISTF1: MOVSI C,440600+D ;ON KL10, WON'T FIT EITHER ABOVE OR BELOW -400 +LISTF2: ILDB A,C + ADDI A,40 + PUSHJ P,TYP + MOVEI A,40 + TLNN C,770000 + XCT LISTFB(C) ;END OF WORD, DO SPECIAL FROB + JRST LISTF2 +];340P + +IFG .-, .ERR BARF AT -400 + +LOC RELOC+37400 + JRST DIRIN + +IFE 340P,[ ;F COMMAND +LISTF: MOVEI D,DIR-DIRL +LISTF0: PUSHJ P,CRR + ADDI D,DIRL + CAME D,DIREND + JRST LISTF1 + JRST GOR + +LISTFB: PUSHJ P,TYP ;SPACE AFTER FN1 + PUSHJ P,TYP ;SPACE AFTER FN2 + JRST LISTF0 ;AFTER LENGTH, VERSION, LOOP BACK FOR NEXT FILE +] + +JBLK: CAILE CM,'M ;SKIP IF SYMS NOT NEEDED + AOJE E,LOAD ;E = 0 => LOADING SYMS + PUSHJ P,REW + JUMPG E,DDTG ;JUMP IF SYMS JUST READ + HRRM A,SADR + JUMPN CM,GOR +SADR: JRST GOR + +DDTG: HRROS DDT-1 + JRST DDT + +LOOK1: CAMG C,B + JRST LOOKE + MOVE B,C + MOVE D,A + JRST LOOKE + +ALTMD: MOVEI A,"$ + PUSHJ P,TYP + JUMPL U,GODIR ;GET NEW DIR + LDB CM,R ;CMD +IFE 340P,[ + CAIN CM,'F + JRST LISTF +] + CAIN CM,'D + MOVNI CM,1 + CAIN CM,'G + JRST SADR + JRST CMD1 + +LOOKW: JUMPN J,LOOKW2 ;USE VER # IN J + SKIPGE B + MOVEI B,202020 + SUBI B,9_6+9 + TRNN B,20 + JRST LOOKW1 + TRNE B,20_6 + ADDI B,1_12.-10._6 + ADDI B,10._6-<9_6+10.> +LOOKW1: HRRZI J,<9_6+10.>(B) +LOOKW2: MOVE B,DIREND + CAIN B,DIRF + JRST ERR ;DIRFULL + ADDI B,DIRL + EXCH B,DIREND + MOVEM W,(B) + MOVEM H,1(B) + HRRZM J,2(B) + SETO E, ;FLAG FOR WHETHER CODE OR SYMBOLS +LOOKWL: PUSHJ P,SKPFE +IFE TM10BP, PUSHJ P,SKPREC +IFN TM10BP,[ SETZM ICWA ;MTWAIT CLEARS EOF FLAG + CONO MTC,SKIPF + CONSO MTS,JOBDON + JRST .-1 + ] + CONSO MTS,EOF ;2 EOFS? + JRST LOOKWL + CONO MTC,SKBEOF ;SKIP BACK OVER LAST EOF + PUSHJ P,MTWAIT + MOVEI R,0 ;WRITE HEADER + HRLI B,-3 + MOVE A,(B) + PUSHJ P,CWD + AOBJN B,.-2 + PUSHJ P,CWDEOR + PUSHJ P,WREOF + MOVE A,[JRST 1] ;PUT PROGRAM HEADER + MOVEM A,BUFFER ;NOTE - R NOW CONTAINS 1 + MOVEI I,LOW +DMP1: CAIL I,BUFFER ;DON'T DUMP THE BUFFER!! + CAILE I,BUFFER+2000 + SKIPN (I) ;FIND SOME NON-ZERO CORE + AOJA I,DMP1 ;SINCE LOC(HIGH) IS NON-ZERO, DON'T HAVE TO CAIE I,HIGH + MOVEM I,Q ;SAVE BEGINNING POINTER + HRRZI A,200(I) ;MAX BLOCK SIZE +DMP1B: SKIPN (I) ;FIND SOME ZERO CORE + SKIPE 1(I) ;DON'T MAKE NEW BLOCK FOR 1 ZERO + CAMLE I,A ;DON'T MAKE BLOCK TOO BIG, EITHER + JRST DMP1A + CAIE I,HIGH ;STOP WHEN BEGINNING OF MAGDMP REACHED + AOJA I,DMP1B +DMP1A: MOVE A,Q ;CONSTRUCT AOBJN POINTER +GCTL: SUB Q,I .SEE DING ;RH GETS - # WDS IN BLK + HRL A,Q + JUMPGE A,DMPEND ;EITHER BLOCK > 128K OR REACHED END OF CORE + PUSHJ P,LODUMP + JRST DMP1 + +DMPEND: MOVE A,SADR ;END OF PROG, PUT STARTING ADDRESS + PUSHJ P,CWD ;WRITE JUMP BLOCK + PUSHJ P,CWD ;TWICE (NO SYMBOLS) + PUSHJ P,CWDEOR + PUSHJ P,WREOF ;THEN PUT TWO EOFS FOR LOGICAL EOT + PUSHJ P,WREOF +ERRX: JRST DIRIN + +LODUMP: PUSHJ P,CWD ;READ OR WRITE HEADER + MOVE Q,A ;BEGIN CHECKSUM + JUMPGE A,JBLK ;JUMP IF NOT AOBJN POINTER + JUMPL E,DMP5 ;IF NOT LOADING SYMS + MOVS U,A + HRLI U,-1(U) + ADDB U,@DDT-1 + HRR A,U +DMP5: MOVE B,A ;READ OR WRITE BLOCK OF WORDS +DMP6: ROT Q,1 + HRRZ J,B + CAIL J,20 + CAIL J,LOZAD + MOVEI J,H + MOVE A,(J) + PUSHJ P,CWD + MOVEM A,(J) + ADD Q,A + AOBJN B,DMP6 + TLNE B,-2 + JRST DMP6 + MOVE A,Q + JRST CWD ;READ OR WRITE THE CHECKSUM + +IFN TM10BP,[ + +; READ NEXT RECORD INTO BUFFER +; RETURNS RECORD LENGTH IN R, DISTURBS T,W ALSO. +; SKIP RETURN UNLESS EOF + +RREC: MOVEI T,READ + MOVSI R,-2000_<0+IFN KL10P,[4]> +MTOPR: HRRI R,BUFFER-1 + MOVEM R,ICWA + SETZM ICWA+1 + DATAO MTS,[ICWA] + CONO MTC,(T) + CONSO MTS,JOBDON + JRST .-1 + SKIPN R,ICWA+1 ;LAST DATA ADDRESS + JRST .-1 ;CONTROL WORD NOT WRITTEN YET, WAIT + MOVEI R,1-BUFFER(R) ;CONVERT TO # WORDS XFERRED + CONSO MTS,EOF+EOT ;SKIP RETURN UNLESS EOF + AOS (P) + POPJ P, + +; WRITE RECORD FROM BUFFER +; TAKES RECORD LENGTH IN R, RETURNS # WORDS ACTUALLY +; WRITTEN IN R, WHICH I ASSUME WOULD BE THE SAME +; DISTURBS T,W. SKIP RETURN UNLESS EOT. + +WREC: MOVEI T,WRITE + MOVN R,R + LSH R,18.+IFN KL10P,4 + JRST MTOPR +] + + + + +IFE TM10BP,[ + +; READ NEXT RECORD INTO BUFFER +; RETURNS RECORD LENGTH IN R, DISTURBS T,W ALSO. +; SKIP RETURN UNLESS EOF + +RREC: MOVEI T,READ + MOVSI R,(DATAI MTC,) + MOVEI W,2000 +MTOPR: HRRI R,BUFFER-1 + CONO MTC,(T) +MTOPRL: CONSO MTS,JOBDON+DATREQ + JRST .-1 + CONSZ MTS,DATREQ + AOJA R,[ XCT R ? SOJG W,MTOPRL ? JRST .+1 ] + CONO MTS,1 ;END RECORD HERE + MOVEI R,1-BUFFER(R) ;CONVERT TO # WORDS XFERRED + CONSO MTS,EOF+EOT ;SKIP RETURN UNLESS EOF + AOS (P) + JRST MTWAIT ;WAIT FOR JOBDON TO COME ON BEFORE RETURNING + +; WRITE RECORD FROM BUFFER +; TAKES RECORD LENGTH IN R, RETURNS # WORDS ACTUALLY +; WRITTEN IN R, WHICH I ASSUME WOULD BE THE SAME +; DISTURBS T, W. SKIP RETURN UNLESS EOT. + +WREC: MOVEI T,WRITE + MOVSI W,(DATAO MTC,) + EXCH W,R + JRST MTOPR +] + +CWD: SKIPGE RDWR ;PROCESS WORD IN OR OUT OF A + JRST CRD + CAIGE R,2000 + JRST CWD1 +CWDEOR: PUSHJ P,WREC + JRST DING + MOVEI R,0 +CWD1: MOVEM A,BUFFER(R) + AOJA R,CPOPJ + +CRD: MOVE A,BUFFER(R) ;READ NEXT WORD INTO A + CAMGE R,RECLEN + AOJA R,CPOPJ ;RETURN IF THAT WAS A VALID WORD + PUSHJ P,RREC ;NEED NEW RECORD + JRST DING ;SHOULDN'T HAVE RANDOM EOF + MOVEM R,RECLEN + MOVEI R,0 + JRST CRD + +WREOF: CONO MTC,WEOF ;WRITE EOF, FALL INTO MTWAIT + +MTWAIT: CONSO MTS,JOBDON + JRST .-1 + CONO MTC,NOOP1 ;CLEAR FLAGS + POPJ P, + +REW: CONO MTC,REWIND ;BEGIN REWIND + CONSO MTS,JOBDON ;WAIT TILL REWIND BEGINS + JRST .-1 + CONO MTC,NOOP2 ;CAUSE JOBDON WHEN REWIND DONE +CPOPJ: POPJ P, + +IFN TM10BP,[ +SKPFE: SETZM ICWA ;SPACE FILE + CONO MTC,SKFEOF + JRST MTWAIT +] + +IFE TM10BP,[ +SKPREC: JSP T,SKP ;SPACE RECORD + CONO MTS,1 + +SKPFE: JSP T,SKP ;SPACE FILE + DATAO MTC,0 + +SKP: CONO MTC,SKIPF +SKPL: CONSZ MTS,JOBDON + POPJ P, + CONSZ MTS,DATREQ + XCT (T) + JRST SKPL +] + +PDL: BLOCK 6 +DIREND: DIR +RECLEN: 0 +RDWR: 0 ;-1 => READ + +CONSTANTS +VARIABLES + +DIR: BLOCK 20.*DIRL ;DIRECTORY AREA FOR 20. FILES +DIRF: + +;DIRECTORY FORMAT +;WD1: FN1 +;WD2: FN2 +;WD3: LH => LENGTH IN 2000 WD BLOCKS IN SIXBIT +; RH => VERSION NUMBER IN SIXBIT + +INFORM HIGH,\. + +IFN .,[ + IFL .-RELOC, .ERR BLOAT + IFG .-, .ERR BLOAT +] + +END GO + \ No newline at end of file