.TITLE DXL.MAC FLOPPY DRIVER FOR RT/RSX SYSTEM ; ; THIS DRIVER ACCESSES LOGICAL BLOCKS ON A FLOPPY DISK ; MOUNTED IN DRIVE 0 OF THE RSX HOST SYSTEM. ; ; IT MAY BE USED TO ACCESS THIS DRIVE FOR EITHER THE VIRTUAL ; OR LOGICAL SYSTEM SINCE IT ALWAYS CONSIDERS ; THE FLOPPY TO BE OF RT-11 FORMAT. ; ; IT MUST BE ASSEMBLED WITH EITHER 'RSX.MAC' FOR THE 16K SYSTEM ; OR 'RSX24K.MAC' FOR THE 24K SYSTEM AND THEN LINKED ; FOR STAND-ALONE OPERATION. ; ; ; ; ; MODIFIED BY: G. BERNSTEIN ; 7-SEP-77 ; .GLOBL DXDPB .MACRO DIR$ DPB,ERR ;### MOV @#$DSW,-(SP) ;(SAVE DSW AROUND DIRECTIVES) ;### MOV DPB,-(SP) ;### EMT 377 ;### .IF NB ERR ;### BCC .+6 ;### JSR PC,ERR ;### .IFF ;### BCC .+4 ;### HALT ;### .ENDC ;ERR ;### MOV (SP)+,@#$DSW ;### .ENDM ;### ; DEFINITIONS FOR RSX QIO Q.IOAE=12 ;### Q.IOEF=6 ;### Q.IOFN=2 ;### Q.IOLU=4 ;### Q.IOPL=14 ;### Q.IOPR=7 ;### Q.IOSB=10 ;### H.BUFA=0 ;### H.BUFS=2 ;### H.LBN=6 ;### IO.RVB=10400 ;### IO.WVB=11000 ;### IO.RLB=1000 IO.WLB=400 $DSW=46 ;### ; REGISTER DEFINITIONS R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 PR5 = 240 PR7 = 340 SYSPTR = 54 OFFSET = 270 ; GLOBAL DEFINITIONS .GLOBL RKINT .GLOBL DPSYS, DSSYS, DXSYS .GLOBL RKSYS, RFSYS, DTSYS, $INPTR, $INTEN DTSYS = 0 ;THIS IS RK HANDLER DSSYS = 0 DXSYS = 0 DPSYS = 0 RFSYS = 0 ; RK CONTROL DEFINITIONS: RKDS = 177400 RKER = 177402 RKCS = 177404 RKWC = 177406 RKBA = 177410 RKDA = 177412 RKCNT = 10 ;# ERROR RETRYS .CSECT SYSHND START: .WORD 204 ;RK TRAP ADDRESS ;### .WORD RKINT-. ;OFFSET FROM INTERRUPT ADDRESS .WORD PR7 ;SERVICE INTERRUPT AT LEVEL 7 RKSYS: RKLQE: .WORD 0 ;LAST Q ENTRY ADDRESS RKCQE: .WORD 0 ;CURRENT Q ENTRY ADDRESS MOV RKCQE,R5 ;GET Q PARAMETER POINTER ;### NOP ;NO CONVERSION TO VIRTUAL BLOCKS MOV @R5,@#DXDPB+Q.IOPL+H.LBN+2 ;BLK # TO DPB ;### CMP (R5)+,(R5)+ ;POINT TO BUFR ADDR IN Q ELEMENT ;### MOV (R5)+,@#DXDPB+Q.IOPL+H.BUFA ;BUF ADDR TO DPB ;### MOV (R5)+,-(SP) ;WORD COUNT TO STACK ;### MOV #IO.RLB,@#DXDPB+Q.IOFN ;INIT FUNCT TO READ ;### ASL (SP) ;MAKE BYTE COUNT FOR RSX ;### ; ;NEED BEQ DONE FOR SEEKS !!!!!!!!!!!!!! ;### ; BPL 5$ ;PL=>READ-ALL SET ;### NEG (SP) ;WRITE-FIX WORD COUNT ;### MOV #IO.WLB,@#DXDPB+Q.IOFN ;ADJUST FUNCT TO WRITE ;### 5$: MOV (SP)+,@#DXDPB+Q.IOPL+H.BUFS ;BUFR SIZE TO DPB ;### MOV PC,-(SP) ;PC TO STACK ;### ADD #RKINT-.,(SP) ;CALC ADDR OF RKINT ;### MOV (SP)+,@#DXDPB+Q.IOAE ;ADDR OF I/O AST SRVCE ROUTINE TO DPB ;### DIR$ #DXDPB ;ISSUE DIRECTIVE FOR QIO ;### 1$: RTS PC ;RETURN ;### ; NOTE THAT THE RTS PC ABOVE SERVES AS THE ABORT ENTRY FOR THE RK RKINT:MOV @#54,-(SP) ;AVOID GLOBAL REF TO INPTR JSR R5,@(SP)+ ;;;RKINT: JSR R5,@$INPTR ;DO IT. INTO MONITOR ;### .WORD ^C&PR7 ;RUN AT LEVEL 5 ;### MOVB @6(SP),R4 ;PICK UP I/O STATUS ;### BPL DONE ;IF PL-NO ERRORS ;### HERROR: MOV RKCQE,R5 ;ERROR-SET HDW BIT IN CSW ;### BIS #1,@-(R5) ;### DONE: MOV PC,R4 ;EXIT TO Q MANAGER ;### ADD #RKCQE-.,R4 ;### MOV @#SYSPTR,R5 ;### JMP @OFFSET(R5) ;### $INPTR: .WORD $INTEN ;MONITOR INTERRUPT ENTRY POINT RKSIZE = .-START .END