.IDENT /MRHV01/ .SBTTL INTRO PAGE ; ;THIS PROGRAM IS DESIGNED TO COMPARE TWO LARGE DISK DRIVES, I.E. ;AN AMPEX DM980 DRIVE, OR A FUJUTSU DRIVE EMULATING AN RM03 DRIVE ;IT WILL: ; ;1 READ EACH DISK IN 32. BLOCK INCREMENTS (ONE FULL SURFACE CYLINDER) ; ;2 COMPARE EACH BUFFER ; ;3 REPORT ANY DIFFERENCES ; ;NOTE NOTE NOTE ; ; PROGRAM USES LUN 1 AND 2 FOR READS, THEY MUST BE ASSIGNED ; TO THE TWO REQUIRED DISKS BEFORE RUNNING PROGRAM ; ; ;DEFINE SOME NEEDED VARIABLES ; READSZ=16.*1000 ;NUMBER OF BYTES IN 16. BLOCKS ; ; .MCALL QIOW$,DIR$,EXIT$S,GMCR$,GLUN$ .PAGE .SBTTL MAIN LOOP ; START: DIR$ #GETMCR ;SO WE RECALL THE CALLER DIR$ #GETDEV ;SEE WHAT DRIVE WE^RE WORKING ON DIR$ #GETDE2 ;SEE WHAT DRIVE WE^RE WORKING ON CMP DEVICE,#"DP ;IS THIS AN AED DISK? BEQ 110$ ;BR IF IT IS CMP DEVIC2,#"DP ;IF NOT AN AED BNE 111$ ;SKIP BLOCK SIZE ADJUST 110$: SUB #80.,BLOCKL ;ADJUST BLOCK LOW FOR AED 111$: MOV #0,REAQIO+Q.IOPL+6 ;START AT BLOCK # 0 MOV #0,REAQIO+Q.IOPL+10 MOV #0,REAQI2+Q.IOPL+6 ;START AT BLOCK # 0 MOV #0,REAQI2+Q.IOPL+10 REGO: DIR$ #REAQIO ;DO DISK READ TSTB IOSB ;DID READ GO OK BPL 113$ ;BR IF OK JSR PC,HARDNG ;ELSE REPORT ERROR 113$: DIR$ #REAQI2 ;READ OTHER DISK TSTB IOSB2 ;DID THIS READ GO OK BPL READOK ;BR IF OK JSR PC,HARDN2 ;REPORT OTHER ERROR READOK: MOV #20*400,R0 ;COUNT TO R0 MOV #READBF,R1 ;POINT TO 2 BUFFERS MOV #READB2,R2 1$: CMP (R1)+,(R2)+ ;OK ? BEQ 2$ ;BR IF SAME JSR PC,COMPNG ;REPORT COMPARE NO GO 2$: SOB R0,1$ ;TRY MORE COMPDN: ADD #16.,REAQIO+Q.IOPL+10 ;BUMP READ BY 16. BLOCKS ADC REAQIO+Q.IOPL+6 ;ADD CARRY TO UPPER WORD OF BLOCK # ADD #16.,REAQI2+Q.IOPL+10 ;BUMP READ BY 16. BLOCKS ADC REAQI2+Q.IOPL+6 ;ADD CARRY TO UPPER WORD OF BLOCK # CMP BLOCKH,REAQIO+Q.IOPL+6 ;ARE WE AT END ? BNE REGO CMP BLOCKL,REAQIO+Q.IOPL+10 ;OF DISK BHI REGO MOV #DONE,ERRQIO+Q.IOPL MOV #DONELN,ERRQIO+Q.IOPL+2 DIR$ #ERRQIO ;REPORT IT EXIT$S ;EXIT SYSTEM .PAGE .SBTTL SUBROUTINES .SBTTL REPORT HARD ERROR ; ;SUB TO REPORT HARD ERROR ; HARDNG: MOVB #61,HARDDV ;CHANGE LUN NUMBER INDICATOR BR HARCON ;DO REST OF MESSAGE HARDN2: MOVB #62,HARDDV ;CHANGE LUN NUMBER INDICATOR HARCON: MOV R0,-(SP) ;SAVE USED REGS MOV R1,-(SP) MOV R2,-(SP) MOV #HARDP1,R0 ;POINT TO BUFFER MOV REAQIO+Q.IOPL+6,R1 ;GET HIGH PART OF BLOCK NUMBER CLR R2 ;INDICATE 0 SUPPRESSION JSR PC,$CBOMG ;CONVERT NUMBER MOVB #',,(R0)+ ;PUT IN A COMMA MOV REAQIO+Q.IOPL+10,R1 ;GET LOW PART OF BLOCK NUMBER INC R2 ;MAKE THIS 6 DIGITS JSR PC,$CBOMG ;CONVERT IT MOV REAQIO+Q.IOPL+6,R2 ;GET BLOCK NUMBER AGAIN MOV REAQIO+Q.IOPL+10,R3 ;IN DOUBLE REGISTER DIV #240,R2 ;DIVIDE BY NUMBER OF BLOCKS/CYLINDER ;QUOTIENT (R2) = CYL, REM (R3)=BLOCK OF CYL MOV R2,R1 ;GET QUOTIENT (CYL NUMBER) MOV #1,R2 ;INDICATE NO SUPRESS 0'S MOV #HARDP2,R0 ;POINT TO BUFFER JSR PC,$CBOMG ;CONVERT CYL CLR R2 ;FOR DIVIDE DIV #32.,R2 ;DIV BY BLOCKS/SURFACE QUOT = SURFACE # MOV R2,R1 ;GET SURFACE # IN R1 CLR R2 ;SUPRESS 0'S, ITS ONE DIGIT MOV #HARDP3,R0 JSR PC,$CBOMG ;CONVERT SURFACE # MOV #HARDER,ERRQIO+Q.IOPL ;FILL IN MESSAGE START IN DPB MOV #HARDLN,ERRQIO+Q.IOPL+2 ;AND LENGTH DIR$ #ERRQIO ;AND REPORT ERROR MOV (SP)+,R2 ;RESTORE USED REGS MOV (SP)+,R1 MOV (SP)+,R0 RTS PC ;AND RETURN .PAGE .SBTTL REPORT COMPARE ERROR ; ;SUB TO REPORT COMPARE ERROR ; COMPNG: MOV R0,-(SP) ;SAVE LOOP COUNT MOV R1,-(SP) ;AND POINTERS MOV R2,-(SP) MOV #COMPP1,R0 ;POINT TO BUFFER MOV REAQIO+Q.IOPL+6,R1 ;GET HIGH PART OF BLOCK NUMBER CLR R2 ;INDICATE 0 SUPPRESSION JSR PC,$CBOMG ;CONVERT NUMBER MOVB #',,(R0)+ ;PUT IN A COMMA MOV REAQIO+Q.IOPL+10,R1 ;GET LOW PART OF BLOCK NUMBER INC R2 ;MAKE THIS 6 DIGITS JSR PC,$CBOMG ;CONVERT IT MOV #COMPP2,R0 ;POINT TO BUFFER MOV REAQIO+Q.IOPL+6,R2 ;GET BLOCK NUMBER AGAIN MOV REAQIO+Q.IOPL+10,R3 ;IN DOUBLE REGISTER DIV #240,R2 ;DIVIDE BY NUMBER OF BLOCKS/CYLINDER MOV R2,R1 ;GET QUOTIENT (CYL NUMBER) MOV #1,R2 ;INDICATE NO SUPRESS 0'S JSR PC,$CBOMG ;CONVERT CYL CLR R2 ;FOR DIVIDE DIV #32.,R2 ;DIV BY BLOCKS/SURFACE QUOT=SURF # MOV R2,R1 ;MOVE SURFACE # CLR R2 ;SUPRESS 0 FOR SURFACE # MOV #COMPP3,R0 JSR PC,$CBOMG ;CONVERT SURFACE NUMBER CLR R1 ;NOW CALC WORD NUMBER OF SURFACE BIT #20,REAQIO+Q.IOPL+10 ;IS THIS 2ND HALF OF SURFACE ? BEQ 1$ ;BR IF NOT ADD #20*400,R1 ;ELSE ACCOUNT FOR IT 1$: MOV #1,R2 ;NO 0 SUPRESSION FOR WORD # ADD #20*400,R1 ;ADD MAX # WE CHECK SUB 4(SP),R1 ;SUB WHERE WE ARE IN BUFFER ASL R1 ;MAKE IT A BYTE OFFSET MOV #COMPP4,R0 JSR PC,$CBOMG ;CONVERT WORD OF SURFACE MOV 2(SP),R1 ;GET WORD FROM FIRST DISK MOV -2(R1),R1 MOV #COMPP5,R0 JSR PC,$CBOMG ;CONVERT FIRST WORD MOV (SP),R1 ;GET WORD FROM 2ND DISK MOV -2(R1),R1 MOV #COMPP6,R0 JSR PC,$CBOMG ;CONVERT WORD FROM 2ND DISK MOV #COMPER,ERRQIO+Q.IOPL ;FILL IN MESSAGE START IN DPB MOV #COMPLN,ERRQIO+Q.IOPL+2 ;AND LENGTH DIR$ #ERRQIO ;AND REPORT ERROR MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 RTS PC ;AND RETURN .PAGE .SBTTL DATA AREAS ; ;QIO FOR MESSAGES TO TI ; ERRQIO: QIOW$ IO.WVB,5,1,,,,<0,0,40> ; ;NOW POSSIBLE MESSAGES ; COMPER: .ASCII /COMPARE ERR AT BL# / COMPP1: .ASCII /N,NNNNNN CYL=/ COMPP2: .ASCII /NNNNNN SURF=/ COMPP3: .ASCII /N @ BYTE OFFSET / COMPP4: .ASCII /NNNNNN / COMPP5: .ASCII /NNNNNN / COMPP6: .ASCII /NNNNNN/ COMPLN=.-COMPER ; HARDER: .ASCII /LUN #/ HARDDV: .ASCII /1 READ ERR AT BL# / HARDP1: .ASCII /N,NNNNNN CYL=/ HARDP2: .ASCII /NNNNNN SURF=/ HARDP3: .ASCII /N/ HARDLN=.-HARDER ; DONE: .ASCII /READ CHECK FINISHED/ DONELN=.-DONE .EVEN ; ;NOW THE DISK READ QIO ; REAQIO: QIOW$ IO.RLB,1,1,,IOSB,, REAQI2: QIOW$ IO.RLB,2,1,,IOSB2,, ; IOSB: .WORD 0,0 ;RETURNED STATUS IOSB2: .WORD 0,0 ;RETURNED STATUS ; ; GETMCR: GMCR$ ;GET MCR DPB GETDEV: GLUN$ 1,DEVICE ;GET LUN DPB GETDE2: GLUN$ 2,DEVIC2 ;GET LUN DPB DEVICE: .BLKW 6 ;GET LUN BUFFER DEVIC2: .BLKW 6 ;GET LUN BUFFER ; ;MISC VARIABLES ; BLOCKH: .WORD 2 ;HIGH ORDER MAX BLOCK # BLOCKL: .WORD 1140 ;LOW ORDER MAX BLOCK # LBLOCK: .WORD 1000 ;LOW ORDER MAX BLOCK # FOR LAST AED READ READBF: .BLKB READSZ ;BUFFER FOR READING 32. BLOCKS READB2: .BLKB READSZ ;BUFFER FOR READING 32. BLOCKS .END START