.TITLE FORMAT -- FORMAT A BLOCK OF MEMORY .IDENT /1/ .MCALL WHILE,IF,END,ELSE,STRMACS,.USE STRMACS ; ; THIS ROUTINE OUTPUTS A BLOCK OF CORE IN OCTAL, ; ASCII AND RAD50. IF IT IS A BYTE ORIENTED DUMP, ; 3 CHARACTER OCTAL IS USED AND RAD50 IS NOT ; DUMPED. ; ; ON ENTRY, ; R4 RECORD LENGTH ; R5 BUFFER ADDRESS ; FORMAT:: SUB #L.SIZE,SP ;ALLOCATE SPACE FOR TEMPORARIES ON STACK MOV R3,L.BOFF(SP) ;OFFSET OF FIRST LINE MOV R4,L.RLEN(SP) ;SAVE RECORD LENGTH MOV R5,L.BADR(SP) ;SAVE RECORD SIZE .USE JUMPS ;AS THE NEXT LOOP IS KINDA LONG WHILE L.RLEN(SP),GT ;WHILE STILL DATA TO PROCESS .USE BRANCHES MOV OUT+F.NRBD+2,R0 ;GET BUFFER ADDRESS INC R0 ;SKIP OVER CARRIAGE CONTROL BYTE MOV R0,R1 ;COPY IT MOV #LOBUF-1,R2 ;GET BUFFER SIZE 10$: MOVB #' ,(R1)+ ;AND BLANK FILL BUFFER SOB R2,10$ ;LOOP MOV L.BOFF(SP),R1 ;GET OFFSET INTO BUFFER MOV #1,R2 ;PREVENT 0 SUPPRESSION CALL $CBOMG ;CONVERT TO OCTAL CMPB (R0)+,(R0)+ ;LEAVE A FILLER MOV #16.,R3 ;ASSUME 16 BYTES ON THIS LINE IF L.RLEN(SP),LT,R3 ;DO WE HAVE 16 BYTES LEFT IN BUFFER MOV L.RLEN(SP),R3 ;NO, JUST DUMP WHAT WE HAVE END MOV L.BADR(SP),R5 ;GET ADDRESS OF MEMORY TO DUMP IF #SW.BY,SETOFF,OPTIONS ;IF IN WORD MODE MOV R3,R4 ;GET BYTE COUNT WHILE ,GT ;WHILE STILL SOMETHING TO DUMP MOVB (R5)+,L.TEMP(SP) ;GET THE NEXT WORD BEING VERY MOVB (R5)+,L.TEMP+1(SP) ;CAREFUL ABOUT WORD ADDRESSES MOV L.TEMP(SP),R1 ;AS THE BLOCK OF MEMORY MAY START AT AN ;ODD ADDRESS MOV #1,R2 ;DON'T SUPPRESS THE ZEROS IF R4,EQ,#1 ;IF DOING A TRAILING BYTE CALL $CBTMG ;CONVERT BYTE TO OCTAL ELSE CALL $CBOMG ;CONVERT WORD TO OCTAL END TSTB (R0)+ ;LEAVE A BLANK SUB #2,R4 ;COUNT DOWN END MOV #1+6+2+<7*8.>+1,R0 ;OFFSET INTO PRINT LINE ELSE MOV R3,R4 ;NUMBER OF BYTES TO DUMP WHILE ,GT ;WHILE STILL SOMETHING TO DUMP MOVB (R5)+,R1 ;GET THE BYTE MOV #1,R2 ;SHOW NO ZERO SUPPRESSION CALL $CBTMG ;CONVERT BYTE TO OCTAL TSTB (R0)+ ;FILLER DEC R4 ;COUNT DOWN END MOV #1+6+2+<4*16.>+1,R0 ;POSITION INTO OUTPUT BUFFER END ADD OUT+F.NRBD+2,R0 ;ADD IN ADDRESS OF BUFFER START MOV L.BADR(SP),R5 ;NOW DO THE ASCII BUSINESS MOVB #'*,(R0)+ ;INSERT A DELIMTING CHARACTER MOV R3,R4 ;GET BYTE COUNT WHILE ,GT ;DUMP THE FORMATTED ASCII MOVB (R5)+,R1 ;GET THE BYTE BIC #^C177,R1 ;AS A 7 BIT CHARACTER MOVB PRNTBL(R1),(R0)+ ;GET THE FORMATED CHARACTER DEC R4 ;AND COUNT DOWN END MOVB #'*,(R0)+ ;PUT IN A DELIMETER CHARACTER IF #SW.BY,SETOFF,OPTIONS ;IF IN WORD MODE MOV #1+6+2+<7*8.>+1+1+16.+1+2,R0 ;POSITION INTO OUTPUT BUFFER ADD OUT+F.NRBD+2,R0 ;PLUS BUFFER START ADDRESS MOVB #'*,(R0)+ ;OUTPUT A DELIMETER MOV L.BADR(SP),R5 ;GET BLOCK ADDRESS MOV R3,R4 ;GET BYTE COUNT WHILE ,GT ;WHILE THERE IS SOMETHING TO DO MOVB (R5)+,L.TEMP(SP) ;GET THE WORD BEING VERY CAREFUL MOVB (R5)+,L.TEMP+1(SP) ;ABOUT WORD ADDRESSES BEING MOV L.TEMP(SP),R1 ;EVEN IF R4,EQ,#1 ;IF THIS IS THE TRAILING BYTE IN AN ODD ;LENGTH RECORD BIC #^C377,R1 ;ONLY USE GOOD PART END CALL $C5TA ;CONVERT TO ASCII SUB #2,R4 ;COUNT DOWN ON WORDS END MOVB #'*,(R0)+ ;OUTPUT FINAL DELIMETER END CALL PUT ;DUMP THE OUTPUT LINE IF ,CS ;IF ERROR ADD #L.SIZE,SP ;RESTORE SP ERREXT: SEC ;SHOW ERROR EXIT: RETURN ;AND RETURN END ADD #16.,L.BADR(SP) ;POINT TO NEXT PART OF MEMORY BLOCK ADD #16.,L.BOFF(SP) ;... SUB #16.,L.RLEN(SP) ;COUNT DOWN END ADD #L.SIZE,SP ;RESTORE SP CLC ;SHOW OK BR EXIT ;AND EXIT .PAGE ; ; DATA AREAS ; ; ; OFFSETS TO LOCAL DATA AREA ON THE STACK ; L.RLEN= 0 ;LENGTH OF MEMORY BLOCK WE STILL HAVE ;TO DUMP L.BADR= 2 ;ADDRESS OF NEXT MEMORY TO DUMP L.BOFF= 4 ;OFFSET INTO BLOCK OF MEMORY L.TEMP= 6 ;TEMPORARY L.SIZE= 10 ;SIZE OF LOCAL DATA AREA ; ; ; MACRO TO INITIALIZE TRANSLATE TABLE ; .MACRO TABLE COUNT,VALUE .REPT COUNT .BYTE VALUE .ENDM .ENDM ; ; TRANSLATE TABLE ; ; ALL NON-PRINTABLE CHARACTERS ARE TRANSLATED TO '.' ; PRNTBL: TABLE 40,'. TABLE 176-40+1,.-PRNTBL TABLE 177-177+1,'. .END