.TITLE SEE - INTERACTIVE MEMORY DUMP PROGRAM .SBTTL DISCUSSION .MCALL EXIT$S,QIOW$,DIR$,SPND$S .MCALL FSRSZ$,FDBDF$,FDRC$A,FDBK$A,FDOP$A ; SEE - INTERACTIVE MEMORY DUMP PROGRAM ; ; WRITTEN BY JOHN WOOD ; LAWRENCE BERKELEY LABORATORY ; BERKELEY, CALIFORNIA 94720 ; (415) 486-5972 ; ; THIS PROGRAM ALLOWS THE USER TO SEE 256 CONTIGUOUS BYTES OF ; DATA ANYWHERE IN MEMORY (18 BIT ADDRESSING). IT IS A ; PRIVILEGED TASK USING $RELOC AND $BLXIO TO COPY THE DATA INTO ; A LOCAL BUFFER. ; ; THERE ARE 3 WAYS OF ENTERING AN ADDRESS TO DISPLAY: ; ; 1 - ENTER THE ADDRESS (RETURN) ; PRINTS 256 BYTES ; ; 2 - (RETURN) ALONE ; PRINTS THE NEXT 256 BYTES ; ; 3 - UP-ARROW (RETURN) ; PRINTS THE PREVIOUS 256 BYTES ; ; THE TASK CAN BE TERMINATED BY TYPING: Q (RETURN) ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; TO ASSEMBLE AND TASK BUILD: ; ; MAC SEE,SEE=[1,1]EXEMC/ML,[200,200]RSXMC,[X,Y]SEE ; ; X,Y IS SOME UIC WHERE YOU HAVE SEE.MAC ; ; TKB> SEE/PR,SEE= ; TKB> [1,54]RSX11M.STB ; TKB> [1,1]EXELIB/LB ; TKB> SEE ; TKB>/ ; ENTER OPTIONS: ; TKB> TASK=...SEE ; TKB>// ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .PAGE .SBTTL BUFFERS AND OTHER VARIABLES LINE: .BLKW 3 ;ADDRESS TO PRINT .ASCII /0 / ;3 SPACES FWD: .BLKW 3 ;WORD 1 .ASCII / / ;2 SPACES .BLKW 3 ;WORD 2 .ASCII / / ; .BLKW 3 ;WORD 3 .ASCII / / ; .BLKW 3 ;WORD 4 .ASCII / / ; .BLKW 3 ;WORD 5 .ASCII / / ; .BLKW 3 ;WORD 6 .ASCII / / ; .BLKW 3 ;WORD 7 .ASCII / / ; .BLKW 3 ;WORD 8 CRLF: .ASCII <15><12> ; LLEN= .-LINE ;LENGTH OF OUTPUT BUFFER .EVEN HEARLD: .ASCII <15><12>/ENTER ADDRESS - / HLEN= .-HEARLD .EVEN .PAGE TITLE: .ASCII <15><12>/ ADDR 00 02 04 06/ .ASCII / 10 12 14 16/<15><12> LTIT= .-TITLE .EVEN ADR: .WORD 0 ;ADDRESS TO DISPLAY BLK: .WORD 0 ;BLOCK NUMBER TO READ CNT: .WORD 0 ;NUMBER OF LINES PTR: .WORD 0 ;POINTER INTO BUFFER BUF: .BLKW 1024. ;BUFFER TO HOLD DATA BLEN= .-BUF ;LENGTH OF BUFFER IBUF: .BLKB 132. ;INPUT BUFFER TDPB: QIOW$ IO.WVB,5,5,,TSB ;TERMINAL DPB NDPB: QIOW$ IO.RVB,5,5,,TSB,, TSB: .BLKW 2 ;TERMINAL IOSB .PAGE .SBTTL MAIN PROGRAM START: MOV #TDPB,R0 ;SEND MESSAGE TO USER MOV #HEARLD,Q.IOPL(R0) ;INSERT ADDRESS MOV #HLEN,Q.IOPL+2(R0) ;INSERT LENGTH DIR$ #TDPB ;SEND IT ; CLEAR THE INPUT BUFFER CLR IBUF CLR IBUF+2 CLR IBUF+4 CLR IBUF+6 DIR$ #NDPB ;INPUT THE ADDRESS ; TEST FOR Q = QUIT ; NULL = PRINT NEXT SCREEN FULL ; ^ = PRINT PREVIOUS SCREEN FULL CMPB #'Q,IBUF ;TEST FOR Q BNE 10$ ;BRANCH IF NOT Q JMP QUIT ; 10$: TSTB IBUF ;TEST FOR 'NULL' BNE 20$ ;BRANCH IF NOT 'NULL' MOV ADR,R1 ;GET LAST ADDRESS BR 100$ ;BRANCH TO PRINT IT 20$: CMPB #'^,IBUF ;TEST FOR '^' BNE 40$ ;BRANCH IF NOT '^' MOV ADR,R1 ;GET LAST ADDRESS CMP R1,#100 ;TEST IF SUBTRACTING 100 WILL GO NEGATIVE BLOS 30$ ;BRANCH IF YES SUB #100,R1 ; BR 100$ ;PRINT IT 30$: CLR R1 ;START AT TOP BR 100$ ;PRINT IT 40$: MOV #IBUF,R0 ;POINT AT INPUT BUFFER CLRB 6(R0) ;FORCE ONLY SIX CHARACTERS MOV TSB+2,R1 ;DELETE TRAILING BYTE DEC R1 ; CLRB IBUF(R1) ; CALL $COTB ;CONVERT TO BINARY MOV #TDPB,R0 ;CRLF MOV #CRLF,Q.IOPL(R0) ; MOV #2,Q.IOPL+2(R0) ; DIR$ #TDPB ;SEND CRLF 100$: BIC #1,R1 ;ALLIGN ON 16 BYTE BOUNDARY MOV R1,ADR ;SAVE ADDRESS CLR R0 ;DIVIDE BY 10 DIV #10,R0 ; MOV R0,BLK ;SAVE BLOCK NUMBER ASL R1 ;MULTIPLY BY 10 ASL R1 ; ASL R1 ; MOV R1,PTR ;SAVE POINTER INTO BLOCK ; MOVE DATA TO BUFFER MOV #BUF,R0 ;POINT AT BUFFER SWSTK$ 104$ ;;ENTER SYSTEM STATE CALL $RELOC ;;MAKE ADDRESS DOUBLE WORD MOV R1,BUF ;;SAVE ADDRESS MOV R2,BUF+2 ;; RETURN ;;EXIT SYSTEM STATE 104$: MOV BLK,R0 ;TEST FOR MEMORY LIMIT ADD #20,R0 ; CMP R0,$SYSIZ ; BGT QUIT ;EXIT IT TOO LARGE MOV #1024.,R0 ;GET BYTE COUNT MOV BLK,R1 ;GET SOURCE BLOCK NUMBER MOV #120000,R2 ;APR5 MOV BUF,R3 ;DESTINATION BUFFER ADDRESS MOV BUF+2,R4 ; SWSTK$ 106$ ;;ENTER SYSTEM STATE CALL $BLXIO ;;MOVE DATA RETURN ;;EXIT SYSTEM STATE 106$: MOV #TDPB,R0 ;PRINT TITLE MOV #TITLE,Q.IOPL(R0) ; INSERT ADDRESS MOV #LTIT,Q.IOPL+2(R0) ; INSERT LENGTH DIR$ #TDPB ;PRINT IT MOV #16.,CNT ;NUMBER OF LINES 110$: CALL MKADR ;CALCULATE THE ADDRESS ADD #2,ADR ;BUMP ADDRESS CALL MKDAT ;SET UP DATA CALL OUT ;SEND THE DATA DEC CNT ;DECREMENT COUNT BNE 110$ ;BRANCH TILL DONE JMP START ;GO AROUND AGAIN QUIT: EXIT$S ;QUIT .PAGE .SBTTL SUBROUTINES ; MKDAT - CONVERT BINARY DATA TO ASCII ; ; THIS ROUTINE CONVERTS 8 WORDS OF BINARY DATA INTO ASCII CHARACTERS ; FOR DISPLAY ON THE TERMINAL. ; ; ENTRY PTR = NEXT WORD TO CONVERT ; ; USES R0 R1 R2 R3 R4 R5 ; ; MKDAT: MOV #8.,R3 ;COUNT OF WORDS MOV PTR,R4 ;POINTER INTO BUFFER MOV #FWD,R5 ;POINT INTO OUTPUT BUFFER 10$: MOV R5,R0 ;SET UP OUTPUT WORD ADD #8.,R5 ;BUMP ADDRESS MOV #1,R2 ;NO ZERO SUPPRESSION MOV BUF(R4),R1 ;GET DATA TO FIX TST (R4)+ ;BUMP POINTER CALL $CBOMG ;FIX IT SOB R3,10$ ;MORE? MOV R4,PTR ;SAVE POINTER RETURN ;NO .PAGE ; MKADR - CONVERT ADDRESS WORD TO ASCII CHARACTERS ; ; ENTRY ADR = WORD TO CONVERT ; ; USES R0 R1 R2 MKADR: MOV #LINE,R0 ;SET UP OUTPUT WORD MOV #1,R2 ;NO ZERO SUPPRESSION MOV ADR,R1 ;GET DATA TO FIX CALL $CBOMG ;FIX IT RETURN ; .PAGE ; OUT - PRINTS ONE LINE OF DATA TO THE TERMINAL. ; ; IT PRINTS ONE LINE CONSISTING OF THE TWO CONTIGUOUS ARRAYS 'LINE' ; AND 'FWD'. ; ; USES R0 OUT: MOV #TDPB,R0 ;POINT AT DPB MOVB #40,LINE ;MAKE FIRST CHARACTER A BLANK MOV #LINE,Q.IOPL(R0);INSERT STARTING ADDRESS MOV #LLEN,Q.IOPL+2(R0) ;INSERT LENGTH DIR$ #TDPB,ERR ;SEND IT RETURN ; ERR: SPND$S ;SUSPEND TASK .END START