.TITLE DKBLOCK -- DISK PHYSICAL BLOCK ROUTINES .IDENT /JRBARR/ .MCALL DIR$,QIOW$,ALUN$ ; ;00 - 27-JAN-78 - JR BARR - CREATED! ; ;------------------------------------------------------------------------------ ; ; THE DISK BLOCK UTILITIES FOR PASCAL ALLOW PASCAL PROGRAMMERS TO ; ACCESS RK05 DISK PACKS THROUGH PHYSICAL BLOCK I/O IN ORDER TO CREATE ; OR READ ARBITRARILY FORMATTED DISK VOLUMES. ^THE ROUTINES ARE ; SIMILARE THE THE MAGTAPE BLOCK UTILITIES EXCEPT FOR THE LACK OF ; POSITIONING FUNCTIONS AND VARIABLE LENGTH TRANSFERS. THE ROUTINES ; CONSIST OF AN ACCESSING PROCEDURE WHICH LOCATES THE VOLUME AND ; ATTACHES IT TO THE PASCAL TASK (THE DISK VOLUME MUST BE MOUNTED ; WITH MOU DKNN:/CHA=[FOR,ATCH]), AN UNLOADING PROCEDURE WHICH ; DETACHES THE VOLUME, AND READ AND WRITE PROCEDURES. ; ; THE FOLLOWING PASCAL DATA TYPES ARE USED: ; ; DISKSTATUS=RECORD COUNT,DSW:INTEGER END; ; BUFFER=PACKED ARRAY [0..511] OF CHAR; ; ; THE FOLLOWING PASCAL EXTERNAL DECLARATIONS CAN BE USED TO ACCESS ; THE DISK BLOCK UTILITY ROUTINES: ; ; PROCEDURE DKINIT( LUN,DKLUN:INTEGER; VAR STATUS:DISKSTATUS);EXTERN; ; LUN=THE TASK LOGICAL UNIT THROUGH WHICH THE DISK WILL BE ACCESSED. ; DKLUN=THE PHYSICAL UNIT OF THE RK05 DISK DRIVE. ; STATUS.DSW=IO COMPLETION CODE. ; ; THE PHYSICAL RK05 DISK UNIT (DK[DKLUN]) WILL BE ATTACHED. ; ; PROCEDURE DKUNLD( LUN:INTEGER; VAR STATUS:DISKSTATUS);EXTERN; ; ; THE DISK VOLUME CURRENTLY ATTACHED TO THE LUN WILL BE DETACHED. ; ; PROCEDURE DKWRIT( LUN:INTEGER; VAR BUFF:BUFFER; BLOCK:INTEGER; ; VAR STATUS:DISKSTATUS);EXTERN; ; BUFF=A 512 CHARACTER PACKED ARRAY OF CHARACTERS TO BE WRITTEN TO ; THE DISK. ANY DATA STRUCTURE OF 512 CONTIGUOUS BYTES MAY ; BE WRITTEN OR READ FROM THE DISK. ; BLOCK=AN INTEGER NUMBER OF THE PHYSICAL DISK BLOCK TO BE WRITTEN. ; MUST BE IN THE RANGE 0-4799, SINCE AN RK05 HAS ONLY 4800 BLOCKS. ; ; THE BUFFER REFERENCED BY BUFF WILL BE WRITTEN TO PHYSICAL BLOCK 'BLOCK'. ; ; PROCEDURE DKREAD( LUN:INTEGER; VAR BUFF:BUFFER; BLOCK:INTEGER; ; VAR STATUS:DISKSTATUS);EXTERN; ; ; THE BUFFER REFERENCED BY BUFF WILL BE FILLED WITH THE CONTENTS OF BLOCK ; 'BLOCK' FROM THE DISK VOLUME ATTACHED TO LUN. ; DKLUN=0 EFN=6 ; .PSECT PASRUN ALUN: ALUN$ DKLUN,DK,0 QIOB: QIOW$ 0,DKLUN,EFN,,STAT,,<0,0,0,0,0,0> ; STAT: .WORD 0,0 ; .ENABLE LSB DKINIT:: ;* ON ENTRY: R5 => LINK ;PASCAL LINK ; (DISKSTATUS) ;ADDRESS OF STATUS BLOCK ; DKLUN ;PHYSICAL UNIT NUMBER ; LUN ;LOGICAL UNIT NUMBER ; RETURN ;* ON EXIT: R5 => RETURN ; MOV 6(R5),ALUN+A.LULU ;GET LUN TO ASSIGN MOV 4(R5),ALUN+A.LUNU ;GET DK UNIT NUMBER DIR$ #ALUN ;ASSIGN LUN TO DISK BCS 7$ MOV #IO.ATT,QIOB+Q.IOFN ;ATTACH FUNCTION CODE MOV 6(R5),QIOB+Q.IOLU ;GET LOGICAL UNIT NUMBER DIR$ #QIOB 7$: JSR PC,STATUS ;SET DISK STATUS ADD #10,R5 ;POP OFF PARAMETERS RTS PC ;RETURN ; DKWRIT:: ;* ON ENTRY: R5 => LINK ;PASCAL LINK ; (DISKSTATUS) ;ADDRESS OF STATUS BLOCK ; BLOCK ;BLOCK NUMBER TO WRITE ; (BUFF) ;ADDRESS OF BUFFER TO WRITE ; LUN ;LOGICAL UNIT NUMBER ; RETURN ;* ON EXIT: R5 => RETURN ; MOV #IO.WLB,QIOB+Q.IOFN ;WRITE LOGICAL BLOCK 10$: MOV 10(R5),QIOB+Q.IOLU ;GET LOGICAL UNIT NUMBER MOV #512.,QIOB+Q.IOPL+2 ;SET TRANSFER SIZE MOV 6(R5),QIOB+Q.IOPL ;GET BUFFER ADDRESS MOV 4(R5),QIOB+Q.IOPL+10 ;GET BLOCK NUMBER DIR$ #QIOB ;PERFORM THE TRANSFER JSR PC,STATUS ;SET OPERATION STATUS ADD #12,R5 ;POP OFF PARAMETERS RTS PC ;RETURN ; DKREAD:: ;* ON ENTRY: R5 => LINK ;PASCAL LINK ; (DISKSTATUS) ;ADDRESS OF STATUS BLOCK ; BLOCK ;BLOCK NUMBER TO READ ; (BUFF) ;ADDRESS OF BUFFER TO READ INTO ; LUN ;LOGICAL UNIT NUMBER ; RETURN ;* ON EXIT: R5 => RETURN ; MOV #IO.RLB,QIOB+Q.IOFN ;READ LOGICAL BLOCK BR 10$ ;PERFORM AS WRITE ; DKUNLD:: ;* ON ENTRY: R5 => LINK ;PASCAL LINK ; (DISKSTATUS) ;ADDRESS OF STATUS BLOCK ; LUN ;LOGICAL UNIT NUMBER ; RETURN ;* ON EXIT: R5 => RETURN ; MOV #IO.DET,QIOB+Q.IOFN ;SET DETACH FUNCTION CODE MOV 4(R5),QIOB+Q.IOLU ;GET LOGICAL UNIT NUMBER DIR$ #QIOB ;PERFORM THE OPERATION JSR PC,STATUS ;SET OPERATION STATUS ADD #6,R5 ;POP OFF PARAMETERS RTS PC ;RETURN ; STATUS: BCC 70$ ;GOOD STUFF MOV R0,-(SP) ;SAVE R0 MOV 2(R5),R0 ;ADDRESS OF DISK STATUS BLOCK MOV @#$DSW,(R0)+ ; MOV @#$DSW+2,(R0) ; BR 77$ 70$: MOV R0,-(SP) ;SAVE R0 MOV 2(R5),R0 ;ADDRESS OF DISK STATUS BLOCK MOV STAT,(R0)+ ; MOV STAT+2,(R0) ; 77$: MOV (SP)+,R0 ;RESTORE R0 RTS PC ; .END