ALWAYS 3FEB84 EDIT .MCALL DIR$,QIOW$C ; ; MODULE: EDIT ; ; FUNCTION: EXAMINE AND OPTIONALLY MODIFY VIRTUAL MEMORY ; ; INPUT PARAMETERS: ; ; R0 POINTS TO COMMAND LINE IN PROCESS ; ; OUTPUT PARAMETERS: ; ; NONE ; ; DESTROYS: ; ; R0,R1,R2,R3,R4 ; ; AUTHOR: KEVIN ANGLEY ; ; DATE: 27-JUL-82 ; ; Modifications Record ; ==================== ; CJD03 Jan 84 ; Support STEP option. ; Use LUN TILUN, not CMILUN for prompt/read -- CMILUN could be a file! ; Add ^ option to backup to previous address after store. ; Display in ASCII as well as hex, and accept 'char = insert ASCII ; character value (parity clear). ; Use separate read/write QIO's if read-after-prompt not supported. ; Accept ctrl/Z = exit EDIT mode. ; Use common COMPRESS routine for line compression/upper case convert. ; .ENABL LSB EDIT:: CALL GETHXL ; GET FIRST ADDRESS TO EDIT (HEX DIGITS) ; LONG WORD IN R1 (LOW WORD) & R2 (HIGH) BCC 7$ ; CC: O.K. 5$: JMP ERREXIT ; else take error exit 7$: MOV R1,R3 ; PUT LONG WORD IN R3 (LOW WORD) & R4 (HIGH) MOV R2,R4 MOV #1,STEP ; Assume edit byte step of 1 GETKEY STEP ; See if there is a STEP argument BNE 8$ ; No, keep 1 CALL GETHX2 ; Get no of bytes to step by BCS 5$ ; (ERREXIT) ; Trap error MOVB %1,STEP ; Set step 8$: CALL EXTRA ; PURGE COMMAND LINE OF SUPERFLUOUS JUNK BCS 5$ ; Exit if any found NEXT: MOV #EDT+1,R0 ; FORMAT EDIT MESSAGE (SKIPPING CR) MOV R3,R1 ; PREPARE REAL 32-BIT ADDRESS FOR CONVERSION MOV R4,R2 CALL PUTHXJ ; PUT IN ADDRESS TO EDIT ; (8 CHARACTERS - LEFT JUSTIFIED WITH SPACES ; IF NECESSARY) CALL VALID ; VALIDATE AND OFFSET ADDRESS ; OFFSETTED ADDRESS IN R3/R4 BCS 5$ ; CS: FAILED MOVB MEMORY(R2),R1 ; RETRIEVE THE BYTE INC R0 ; SKIP OVER THE TAB IN EDT MESSAGE CALL PUTHAS ; Put current value in message -- hex & ASCII ; ISSUE READ AFTER PROMPTING WITH EDT MESSAGE .IF DF T$$RPR QIOW$C IO.RPR,TILUN,TILUN,,IOSB,,,EDIT .IFF MOVB #'$,OUTDIR+Q.IOPL+4 ; Set prompting mode OUTPUT EDT ; Print MOV #SPACE,OUTDIR+Q.IOPL+4 ; Reset standard carriage-control QIOW$C IO.RLB,TILUN,TILUN,,IOSB,,,EDIT ; Get reply .ENDC BCC 20$ ; CC: SUCCESS OUTPUT CIE ; COMMAND INPUT ERROR SEC ; Set error flag BR ERREXIT ; Abort 20$: MOV IOSB+2,R0 ; SAVE COUNT IN R0 CLRB RECORD(R0) ; MAKE ASCIZ MOV #RECORD,R0 ; PREPARE TO COMPRESS CALL COMPRESS ; Do it TSTB (R0) ; WAS A VALUE GIVEN? BEQ 50$ ; EQ: NO ; A 1-byte record beginning ^ is backup only. A 2-byte one beginning ^ is a ; control code, so check that it is ^. 45$: CMP @%0,(PC)+ ; Backup only? .BYTE '^,0 BEQ 50$ ; Yes, no value to get CALL GETHAS ; else should be ASCII char or hex digits BCS ERREXIT ; CS: ERROR EXIT 47$: MOVB R1,MEMORY(R2) ; PUT NEW VALUE INTO MEMORY 50$: CMP #IS.ESC,IOSB ; WAS TERMINATOR ESCAPE ? BEQ 255$ ; EQ: ESCAPE ---> EXIT EDIT CMPB IOSB,#IE.EOF ; Or ctrl/Z? BEQ 255$ ; that's exit too MOV R2,R1 ; PUT OFFSETTED VALUE INTO R1 CALL UNOFFSET ; UN OFFSET VALUE IN R2 IN R3/R4 CMPB @%0,#'^ ; Back to previous location? BNE 60$ ; No, must be forward to next DECR34 STEP ; Yes, decrement real address by STEP BR 70$ ; Do it again 60$: INCR34 STEP ; Increment real address by STEP 70$: JMP NEXT ; LET'S DO IT AGAIN 255$: ERREXIT: RETURN .DSABL LSB .PAGE .SBTTL EDIT DATA AREA .PSECT DATA D,RW DEFM EDT <00000000 00= X-> .EVEN IOSB: .BLKW 2 ; I/O STATUS BLOCK FOR DIRECTIVE QIOW$ .END