.NLIST TTM .TITLE GETMSG - GET ERROR MESSAGE FROM QIOSYM. .SBTTL GETMSG - TITLE PAGE .PSECT ERRORS,RO,I .IDENT /V01.01/ ; ; ************************************************************************ ; * ; THIS PROGRAM IS PROVIDED ON AN "AS IS" BASIS ONLY. DIGITAL EQUIPMENT * ; COMPUTER USER'S SOCIETY, DIGITAL EQUIPMENT CORPORATION, MONSANTO, AND * ; THE AUTHOR DISCLAIM ALL WARRANTIES ON THE PROGRAM, INCLUDING WITHOUT * ; LIMITATION, ALL IMPLIED WARRANTIES OF MERCHANTABLITY AND FITNESS. * ; * ; FULL PERMISSION AND CONSENT IS HEREBY GIVEN TO DECUS AND TO THE DECUS * ; SPECIAL INTEREST GROUPS TO REPRODUCE, DISTRIBUTE, AND PUBLISH AND * ; PERMIT OTHERS TO REPRODUCE IN WHOLE OR IN PART, IN ANY FORM AND * ; WITHOUT RESTRICTION, THIS PROGRAM AND ANY INFORMATION RELATING THERETO * ; * ; ************************************************************************ ; ; VERSION: V01.01 ; ; AUTHOR: RW STAMERJOHN MAPS 24-JUN-77 ; ; THIS ROUTINE GETS A SPECIFIED MESSAGE FROM LB0:[1,2]QIOSYM.MSG. ; ; ASSEMBLY INSTRUCTIONS: ; ; OBJECT,LISTING=GETMSG .PAGE .SBTTL GETMSG - GLOBAL DEFINITIONS ; ; SYSTEM MACROS: ; .MCALL CALL,RETURN ;SUBROUTINE LINKAGE. .MCALL FILIO$ ;DEFINE THE I/O FUNCTION CODES LOCALLY. .MCALL NMBLK$ ;DEFINE A NAMEBLOCK. .MCALL QIO$ ;ISSUE I/O REQUEST. .MCALL WTSE$S ;WAIT FOR EVENT FLAG. .MCALL ALUN$S ;ASSIGN LUN. .MCALL DIR$ ;ISSUE DIRECTIVE. ; ; GLOBAL DECLARATIONS: ; .GLOBL GETMSG ;GET MESSAGE. ; ; GLOBAL REFERENCES: ; .GLOBL ERLUN2 ;ADDRESS OF LUN FOR DISK I/O. .PAGE .SBTTL GETMSG - LOCAL DEFINITIONS ; ; LOCAL MACROS: ; ; NONE. ; ; LOCAL SYMBOLS: ; FILIO$ ;DEFINE I/O SYMBOLS. EV.ERR = 24. ;EVENT FLAG FOR I/O. ; ; LOCAL DATA STRUCTURES. ; ; IMPURE DATA STRUCTURES. ; .PSECT ERRORD,RW,D ; ; FILE NAME BLOCKS. ; DIRNMB: NMBLK$ 001002,DIR,,LB,0 ;DIRECTORY NAME BLOCK. . = DIRNMB+N.DID .WORD -1,-1 ;SET DIRECTORY ACCESS. . = DIRNMB+S.FNB QIONMB: NMBLK$ QIOSYM,MSG,,LB,0 ;FILE NAME BLOCK. ; ; QIO DPB. ; GETDIR: QIO$ IO.FNA,,EV.ERR,,IOSTAT,,<0,0,0,0,0,DIRNMB> GETFIL: QIO$ IO.FNA,,EV.ERR,,IOSTAT,,<0,0,0,0,0,QIONMB> ACCESS: QIO$ IO.ACR,,EV.ERR,,IOSTAT,, READBK: QIO$ IO.RVB,,EV.ERR,,IOSTAT,, DEAESS: QIO$ IO.DAC,,EV.ERR,,IOSTAT,, ; ; INPUT BUFFER. ; BUFFER: .BLKB 512. ;DISK BLOCK INPUT BUFFER. IOSTAT: .BLKW 2 ;I/O STATUS BUFFER. ; ; RETURN TO CODE. ; .PSECT ERRORS,RO,I .PAGE .SBTTL GETMSG * GET MESSAGE FROM QIOSYM ; ; THIS ROUTINE GETS A MESSAGE FROM QIOSYM AND RETURNS A POINTER TO IT ; TO THE CALLER. ; ; CALLING SEQUENCE: ; ; CALL BY: JSR PC,GETMSG ; ; WHERE: R2 = MESSAGE NUMBER IN QIOSYM. ; ; EXITS WITH: R2 = MESSAGE ADDRESS OR 0 IF NOT FOUND. ; ; ERROR CONDITIONS: ; ; THIS ROUTINE DOES NOT USE FCS I/O BUT DOES EVERYTHING ITSELF. ANY ; ERRORS RESULT IN A NO MESSAGE RETURN (R2 = 0). ; ; SPECIAL NOTES: ; ; THIS ROUTINE WAS TAKEN FROM THE DEC MODULE GERRM. ; ; QIOSYM.MSG IS A FILE WITH 64. CHARACTER FIXED LENGTH RECORDS. THE ; CALLER SUPPLIES THE RECORD NUMBER HE DESIRES (STARTING WITH 1). ; ; REGISTERS: ; ; USES R0-R2 SAVES R3-R5 ; ; CALLS: ; ; QIOWAT ; GETMSG:: ;REF. LABEL. MOV R2,-(SP) ;SAVE THE RECORD NUMBER. TST QIONMB+N.FID ;HAVE WE BEEN HERE BEFORE? BNE 20$ ; IF NE - YES, SKIP SETUP. MOV ERLUN2,R0 ;GET LUN TO USE. ALUN$S R0,#"LB,#0 ;ASSIGN TO LB0:. BCS 30$ ; IF CS - ASSIGNMENT ERROR. MOV #GETDIR,R1 ;GET THE FIRST DPB. MOV #5,R2 ;WE KNOW THERE ARE 5 DPB'S. 10$: MOV R0,Q.IOLU(R1) ;STORE LUN NUMBER. ADD #Q.IOPL+12.,R1 ;ADVANCE TO THE NEXT DPB. DEC R2 ;COUNT TILL WE ARE DONE. BNE 10$ ; IF NE - NOT DONE. CALL QIOWAT ;LOOKUP DIRECTORY FILE. .WORD GETDIR ; BCS 30$ ; IF CS - ERROR. MOV #DIRNMB,R1 ;GET ADDRESS OF DIRECTORY NAMEBLOCK. MOV #QIONMB+N.DID,R0;GET ADDRESS OF FILE NAME BLOCK DIRECTORY ID. MOV (R1)+,(R0)+ ;MOVE DIRECTORY ID. MOV (R1)+,(R0)+ ; MOV (R1)+,(R0)+ ; CALL QIOWAT ;LOOKUP FILE. .WORD GETFIL ; BCS 30$ ; IF CS - ERROR. 20$: CALL QIOWAT ;ACCESS FILE. .WORD ACCESS ; BCS 30$ ; IF CS - ERROR. DEC (SP) ;CORRECT RECORD NUMBER TO 0 BASE. MOV (SP),R2 ;SAVE RECORD NUMBER. ASR R2 ;GET BLOCK NUMBER TO READ. ASR R2 ; ASR R2 ; INC R2 ;VBN START AT 1. MOV R2,READBK+Q.IOPL+8. ;STORE IN DPB. CALL QIOWAT ;READ BLOCK. .WORD READBK ; ROR R0 ;SAVE CARRY FOR LATER CHECK. CALL QIOWAT ;DEACCESS FILE. .WORD DEAESS ; BCS 30$ ; IF CS - ERROR. ROL R0 ;UNSAVE CARRY FROM READ. BCS 30$ ; IF CS - ERROR. MOV (SP),R2 ;GET THE RECORD NUMBER AGAIN. BIC #177770,R2 ;GET RECORD INSIDE BLOCK. SWAB R2 ;THIS WAY THERE ARE LESS SHIFTS. ASR R2 ; ASR R2 ; ADD #BUFFER,R2 ;MAKE INTO REAL POINTER. TSTB (R2) ;IF FIRST BYTE IS NULL, NO MESSAGE. BNE 31$ ; IF NE - GOOD MESSAGE. 30$: CLR R2 ;SET TO NO MESSAGE. 31$: TST (SP)+ ;CLEAN STACK. RETURN ;RETURN TO CALLER. .PAGE .SBTTL QIOWAT * ISSUE QIO, WAIT AND RETURN. ; ; THIS ROUTINE ISSUES QIO'S FOR GETMSG AND CHECKS FOR ERRORS ON RETURN. ; ; CALLING SEQUENCE: ; ; CALL BY: JSR PC,QIOWAT ; .WORD A ; ; WHERE: A = QIO DPB ADDRESS. ; ; EXITS WITH: QIO ISSUED AND CARRY SET IF ERROR. ; ; REGISTERS: ; ; USES R0 SAVES R1-R5 ; QIOWAT: ;REF. LABEL. MOV @(SP),R0 ;GET DPB ADDRESS. ADD #2,(SP) ;RETURN TO CALLER+2 DIR$ R0 ;ISSUE QIO. BCS 10$ ; IF CS - EXIT. WTSE$S #EV.ERR ;WAIT TILL DONE. TSTB IOSTAT ;WHERE WE A SUCCESS? BGT 10$ ; IF GT - YES. SEC ;RETURN ERROR. 10$: RETURN ; RETURN TO CALLER. ; .END