ALWAYS 26MAR4 DISPLAY ;26MAR4 .MCALL DIR$,PUT$S,CLOSE$,OPEN$W,QIOW$ ;**-1 ;************************************************************************ ;* * ;* MODULE: DISPLAY * ;* * ;* FUNCTION: DISPLAY A RANGE OF VIRTUAL MEMORY * ;* * ;* INPUT PARAMETERS: * ;* * ;* R0 POINTS TO THE COMMAND LINE IN PROCESS * ;* * ;* OUTPUT PARAMETERS: * ;* * ;* DESTROYS ALL REGISTERS * ;* * ;* AUTHOR: KEVIN ANGLEY * ;* * ;* DATE: 02-SEP-80 * ;* * ;* Modifications Record: * ;* ===================== * ;* CJD01 13-Jul-83 * ;* Change PRINT$ to CALL .PRINT, which may be in FCSRES (doesn't * ;* cost any more if it isn't). * ;* * ;* CJD02 Nov 83 * ;* Support STEP option. * ;* Show program name and transfer address (if any). * ;* Change PUT$ to PUT$S for separate in/out overlays. * ;* Attach TI: (if output device) so that ctrl/O will work. * ;* Add DISPLAY ASCII ... option. * ;* * ;* CJD03 Jan 84 * ;* Bring into line with Aug 82 version. * ;* Return cs on error. * ;* * ;************************************************************************ DISPLAY:: CLRB ERRFLG ; Assume success MOV #PUTHX2,PUTSUB ; Default to hex byte display GETKEY ASCII ; But see if it should be ASCII BNE 1$ ; No, keep hex MOV #PUTASC,PUTSUB ; Yes, use PUTASCII routine instead 1$: CALL FROMTH ; COLLECT FROM/THRU/STEP BCS 11$ ; (255$) ; CC: SUCCESS, CS: TAKE ERROR EXIT CMP STEP,#1 ; Unless not printing all values, BNE 3$ ; when we must start exactly at address given BICB #^B00001111,R1 ; ROUND FROM ADDRESS DOWN TO XXX0 3$: MOVB (R0),R5 ; TI:/FILE FLAG BNE 10$ ; NE: MUST BE FILE MOV #TI,%0 ; SET UP TI: POINTER MOV #IO.ATT,ATTDET+Q.IOFN ; Attach to TI: DIR$ #ATTDET ; So ^O will work BR 12$ ; Do file parse for FDB setup 10$: GETKEY FILE ; GET FILE KEYBOARD BCC 12$ ; CC: GOT IT OUTPUT MSK ; MISSING KEYWORD 11$: COMB ERRFLG ; Set error flag JMP 255$ ; TAKE ERROR EXIT 12$: PUSH RWFORMAT ; Save format number MOV #F.LIST,RWFORMAT ; Change to list format temporarily (type .LST) CALL PARSE ; PARSE FILE DESCRIPTOR POP RWFORMAT ; Restore format code BCS 11$ ; CC: SUCCESS, CS: TAKE ERROR EXIT 15$: OPEN$W #FDB ; OPEN FILE FOR WRITE BCC 20$ ; CC: OPENED O.K. MOV #FOE+FOELEN-4,%0 ; Address file error no MOV FDB+F.ERR,%1 CALL PUTHX4 ; Show number in hex OUTPUT FOE ; FILE OPEN ERROR BR 11$ ; (255$) ; TAKE ERROR EXIT 20$: PUT$S ,,#0 ; OUTPUT BLANK LINE MOV #RECORD,%0 ; Address start of record CMPB PRGNAM,#SPACE ; See if there is a program name BEQ 22$ ; Don't insert it if not MOV #FNM+1,%1 ; Else address "Name: PRGNAM ", less CR MOV #FNMLEN+7-1,%4 ; Load count 21$: MOVB (%1)+,(%0)+ ; Copy in name SOB %4,21$ 22$: MOV TRNSFR+2,%2 ; Get transfer address hi PUSH %2 BIS TRNSFR,(SP)+ ; Unless 00000000 BEQ 24$ ; which means there isn't one MOV #RDT+1,%1 ; Address string "Transfer: ", less CR prefix MOV #RDTLEN-8.-1,%4 ; Load length 23$: MOVB (%1)+,(%0)+ ; Copy string SOB %4,23$ MOV TRNSFR,%1 ; Get address lo CALL PUTHXJ ; Add value in hex 24$: MOV FROM,%2 ; Load first address SUB #RECORD,%0 ; Compute length BEQ 31$ ; 0 means neither name nor transfer, no output MOV %0,FDB+F.NRBD ; <>0, store length in FDB PUT$S #FDB ; Show name/transfer address 30$: PUT$S ,,#0 ; and another blank line 31$: MOV #RECORD,R0 ; FORMAT HEADER MOV #"Ad,(R0)+ ; PUT ADDR HEADER MOV #"dr,(R0)+ MOV #"es,(R0)+ MOV #"s ,(R0)+ CALL SPACER ; PUT IN SPACES AFTER IT MOV %2,%1 ; Put out 16 headers BIC #^C^B1111,%1 ; from start address modulus 16 MOV #16.,R4 32$: CALL SPACER ; SPACE BEFORE IT CALL PUTHX2 ; PUT 2 HEX DIGITS ADD STEP,R1 ; Advance by display step SOB R4,32$ ; FOR 16 TIMES SUB #RECORD,R0 ; COMPUTE COUNT MOV R0,R1 ; COUNT GOES INTO R1 PUT$S #FDB,,R1 ; PUT THE HEADER BCS 245$ ; CS: ERROR EXIT WITH CLOSE MOV #RECORD,R0 ; CHANGE NON-BLANKS TO HYPHEN 35$: CMPB #SPACE,(R0)+ ; IS IT A SPACE? BEQ 37$ ; EQ: YES - LEAVE IT MOVB #HYPHEN,-1(R0) ; REPLACE WITH HYPHEN 37$: SOB R1,35$ ; CONTINUE UNTIL DONE PUT$S #FDB ; OUTPUT THE RECORD (same length) BCS 245$ ; CS: ERROR EXIT WITH CLOSE PUT$S ,,#0 ; OUTPUT BLANK LINE BCS 245$ ; CS: ERROR EXIT WITH CLOSE 40$: ; OUTPUT LINE OF MEMORY MOV #RECORD,R0 PUSH R3 ; SAVE COUNT CALL UNOFFSET ; UN-OFFSET PUSH R2 ; SAVE OFFSETTED ADDRESS MOV R3,R1 ; PUT REAL 32-BIT ADDRESS IN R1/R2 MOV R4,R2 CALL PUTHXJ ; PUT OUT THE ADDRESS CALL SPACER ; SPACE AFTER IT POP R2 ; RESTORE OFFSETTED ADDRESS POP R3 ; RESTORE COUNT MOV #16.,R4 ; PUT OUT 16. BYTES 45$: CALL SPACER ; SPACE BEFORE IT MOVB MEMORY(R2),R1 ; LOAD THE BYTE CALL @PUTSUB ; Put it out in required format ADD STEP,R2 ; Increment from address SOB R4,45$ ; PUT OUT 16. BYTES SUB #RECORD,R0 ; CALCULATE RECORD LENGTH MOV R0,R1 ; PUT RECORD LENGTH IN R1 PUT$S #FDB,,R1 ; OUTPUT THE RECORD BCS 245$ ; CS: FAILED - EXIT WITH CLOSE CMP R2,THRU ; DONE? BHI 250$ ; HI: FROM > TO TSTB R2 ; NEED A HEADER? BEQ 30$ ; EQ: PAGE BOUNDARY BR 40$ ; NO, PUT OUT MORE 245$: ; ERROR EXIT WITH CLOSE CALL IOERROR ; Show error number 250$: PUT$S #FDB,,#0 ; OUTPUT BLANK LINE (Sets %0->FDB) TSTB R5 ; TERMINAL OR FILE? BNE 252$ ; NE: FILE CLOSE$ ; TERMINAL - JUST CLOSE BR 254$ 252$: CALL .PRINT ; FILE - SPOOL TO PRINTER 254$: BCC 255$ ; IF PROPERLY CLOSED, EXIT CALL IOERROR ; Show I/O error number 255$: MOV #IO.DET,ATTDET+Q.IOFN ; Load detach TI: function, in case it is ;CJD02 DIR$ #ATTDET ; Doesn't matter if it wasn't RORB ERRFLG ; Return error flag in carry RETURN ; EXIT .PAGE ; PUT EVEN # SPACES SPACER: MOV #" ,(R0)+ ; TWO SPACES FOR TI: TSTB R5 ; TI: OR FILE? BEQ 10$ ; EQ: TI: WE ARE DONE MOV #" ,(R0)+ ; TWO MORE FOR FILE 10$: RETURN ; Display I/O error number. IOERROR: MOV #IOE+IOELEN-4,%0 ; Address I/O error number MOV FDB+F.ERR,%1 CALL PUTHX4 ; Show it in hex OUTPUT IOE ; I/O ERROR MOVB #377,ERRFLG ; Set error exit flag RETURN .PSECT DATA D,RW ATTDET: QIOW$ IO.ATT,TILUN,TILUN ; Attach/detach TI: DPB PUTSUB: .BLKW 1 ; Display routine address, PUTHX2 or PUTASC ERRFLG: .BYTE 0 ; Error exit flag .EVEN .PSECT PURE D,RO KEY ASCII TI: .ASCIZ "TI:" ; Default device, MUST be ASCIZ, or PARSE .EVEN ; may think a name follows .END