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 IFE KL10P, TTY==120 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 CAIGE A,40 CAIL A,175 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