.TITLE DYCOPY .IDENT /Y01/ ; ; DYCOPY - OCTOBER, 1984 ; A.J. ARNOLD, BOUNDARY LAYER RESEARCH DIVISION, ; ATMOSPHERIC ENVIRONMENT SERVICE ; 4905 DUFFERIN ST., DOWNSVIEW, ONTARIO, M3H 5T4 ; ; DYCOPY - IMAGE COPY FROM ONE DOUBLE DENSITY FLOPPY DISK TO ANOTHER ; DESIGNED TO MAKE COPIES OF DIAGNOSTIC FLOPPIES ; ; READ/WRITE PHYSICAL IS THE ACCESS METHOD USED. IT IS ; SLOW, BUT RESULTS IN AN EXACT DUPLICATE OF THE INPUT ; DISK. ; THE ONLY ERROR CHECKING DONE IS FOR THE TOTAL NUMBER ; OF ERRORS NOT THEIR TYPE. THE ASSUMPTION IS THAT IF ; AN ERROR OCCURS THE RESULTING FLOPPY IS USELESS. ; .MCALL QIOW$,QIOW$S,ALUN$S,DIR$,EXIT$S,GTIM$S .IF DF R$$MPL .MCALL GIN$,STOP$S,GTSK$S .ENDC ;R$$MPL ; .NLIST BEX PRMPT: .ASCII /INPUT DISK IS LOADED IN DRIVE / PRMPTL= .-PRMPT PRMP1: .ASCII /OUTPUT DISK IS LOADED IN DRIVE / PRMP1L=.-PRMP1 START: .ASCII <15><12>/START COPYING FROM DISK DRIVE / DRV0: .BYTE 0,0 .ASCII / TO DISK DRIVE / DRV1: .BYTE 0,0 .ASCII / AT / TIM1: .BLKB 8. .ASCII / ON / DAT1: .BLKB 9. STARTL= .-START END: .ASCII /COPYING FINISHED AT / TIME: .BLKB 8. .ASCII / ON / DATE: .BLKB 9. ENDL= .-END .IF DF RX01 DEV: .ASCII /DX/ .IFF DEV: .ASCII /DY/ ERR1: .ASCII <15>/INPUT DISK IS NOT DOUBLE DENSITY/<15><12> .ASCII /PLEASE REPLACE IT WITH A DOUBLE DENSITY DISK/ ERR1L= .-ERR1 ERR2: .ASCII <15>/OUTPUT DISK IS NOT DOUBLE DENSITY/<15><12> .ASCII /PLEASE REPLACE IT WITH A DOUBLE DENSITY DISK/ ERR2L= .-ERR2 .ENDC ;RX01 .IF DF R$$MPL NMFI: .ASCII /INPUT DISK IS NOT MOUNTED FOREIGN, PLEASE CORRECT THE PROBLEM/<15><12> .ASCII /AND THEN TYPE 'UNSTOP / TSK: .BLKB 6 .ASCII / '/<12> NMFIL= .-NMFI NMFO: .ASCII <15>/OUTPUT DISK IS NOT MOUNTED FOREIGN, PLEASE CORRECT THE PROBLEM/<15><12> .ASCII /AND THEN TYPE UNSTOP / TSK1: .BLKB 6 .ASCII / '/<12> NMFOL= .-NMFO .ENDC ;R$$MPL INERM: .ASCII /INPUT ERRORS = / ERBUF: .BLKB 5 INERML= .-INERM OUERR: .ASCII /OUTPUT ERRORS = / ERRBUF: .BLKB 5 OUERRL= .-OUERR .EVEN .LIST BEX ; ; BUFFERS AND LOCAL DATA ; .IF DF RX01 BYTES= 128. ;BYTES/SECTOR .IFF BYTES= 256. ;BYTES/SECTOR .ENDC ;RX01 SECTOR= 1 ;1 SECTOR FOR READ/WRITE TOTAL: .WORD 2002. ;2002. SECTORS ON A FLOPPY DISK BUFLEN= BYTES*SECTOR ;BUFFER LENGTH BUF: .BLKB BUFLEN ;DATA BUFFER BLOCK: .WORD 0 ;BLOCK COUNTER INERR: .WORD 0 ;INPUT ERROR COUNTER OUTERR: .WORD 0 ;OUTPUT ERROR COUNTER IOST: .BLKW 2 ;I/O STATUS BLOCK DATBUF: .BLKW 8. ;DATE-TIME BUFFER ; ; DIRECTIVE PARAMETER BLOCKS ; QIOI: QIOW$ IO.RPB,1,1,,IOST,, QIOO: QIOW$ IO.WPB,2,2,,IOST,, .IF DF R$$MPL GIN: GIN$ GI.DEV,DATBUF,1,0,0 .ENDC ;R$$MPL DYCOPY: QIOW$S #IO.RPR,#5,#5,,,,<#DRV0,#2,,#PRMPT,#PRMPTL,#44> QIOW$S #IO.RPR,#5,#5,,,,<#DRV1,#2,,#PRMP1,#PRMP1L,#44> MOV #DRV0,R0 ;ADDRESS OF INPUT DRIVE CALL $COTB ;CONVERT TO BINARY MOV R1,R2 ;SAVE IT MOV #DRV1,R0 ;ADDRESS OF OUTPUT DRIVE CALL $COTB ;CONVERT TO BINARY ALUN$S #1,DEV,R2 ;ASSIGN LUN 1 TO INPUT ALUN$S #2,DEV,R1 ;ASSIGN LUN 2 TO OUTPUT .IF DF R$$MPL MOV DEV,GIN+G.IP03 ;GET DEVICE MOV R2,GIN+G.IP04 ;GET INPUT DRIVE NUMBER DIR$ #GIN ;GET DEVICE INFO BIT #40,DATBUF ;IS IT MOUNTED FOREIGN? BNE 10$ ;IF NE YES GTSK$S #BUF ;GET TASK PARAMETERS MOV #TSK,R0 ;GET OUTPUT AREA MOV #BUF,R3 ;GET ADDRESS OF TASK PARAMETERS MOV (R3)+,R1 ;GET FIRST WORD CALL $C5TA ;CONVERT FROM RAD-50 TO ASCII MOV (R3),R1 ;GET SECOND WORD CALL $C5TA ;CONVERT TO ASCII QIOW$S #IO.WVB,#5,#5,,,,<#NMFI,#NMFIL,#40> ;TELL NOT MOUNTED FOREIGN STOP$S ;STOP TIL MOUNTED FOREIGN 10$: MOV R1,GIN+G.IP04 ;GET OUTOUT DRIVE NUMBER DIR$ #GIN ;GET DEVICE INFO BIT #40,DATBUF ;IS IT MOUNTED FOREIGN? BNE 20$ ;IF NE YES GTSK$S #BUF ;GET TASK PARAMETERS MOV #TSK1,R0 ;GET OUTPUT AREA MOV #BUF,R3 ;GET ADDRESS OF TASK PARAMTERS MOV (R3)+,R1 ;GET FIRST WORD CALL $C5TA ;CONVERT FROM RAD-50 TO ASCII MOV (R3),R1 ;GET SECOND WORD CALL $C5TA ;CONVERT TO ASCII QIOW$S #IO.WVB,#5,#5,,,,<#NMFO,#NMFOL,#40> ;TELL NOT MOUNTED FOREIGN STOP$S ;STOP TIL MOUNTED FOREIGN 20$: ;REF LABEL .ENDC ;R$$MPL .IF NDF RX01 QIOW$S #IO.SEC,#1,#1,,#IOST ;SENSE CHARACTERISTICS FOR INPUT BIT #4000,IOST+2 ;DOUBLE DENSITY? BNE 30$ ;IF NE YES JMP 90$ ;ELSE NO 30$: QIOW$S #IO.SEC,#2,#2,,#IOST ;SENSE CHARACTERISTICS FOR OUTPUT BIT #4000,IOST+2 ;DOUBLE DENSITY? BNE 40$ ;IF NE YES JMP 100$ ;ELSE NO .ENDC ;RX01 40$: GTIM$S #DATBUF ;GET DATE AND TIME MOV #DATBUF+6,R1 ;ADDRESS OF TIME MOV #TIM1,R0 ;ADDRESS OF OUTPUT MOV #3,R2 ;HH:MM:SS CALL $TIM ;CONVERT TO ASCII MOV #DATBUF,R1 ;ADDRESS OF DATE MOV #DAT1,R0 ;ADDRESS OF OUTPUT CALL $DAT ;CONVERT TO ASCII QIOW$S #IO.WVB,#5,#5,,,,<#START,#STARTL,#40> ;TELL WE'RE STARTING MOV TOTAL,R0 ;NUMBER OF SECTORS 50$: DIR$ #QIOI ;READ IN A SECTOR TSTB IOST ;ANY ERRORS? BPL 60$ ;IF PLUS NO INC INERR ;BUMP UP ERROR COUNTER 60$: DIR$ #QIOO ;WRITE IT OUT TSTB IOST ;ANY ERRORS? BPL 70$ ;IF PLUS NO INC OUTERR ;BUMP UP ERROR COUNTER 70$: ADD #SECTOR,BLOCK ;BUMP UP THE COUNTER MOV BLOCK,QIOI+Q.IOPL+10 ;MOVE IN SECTOR NUMBER MOV BLOCK,QIOO+Q.IOPL+10 ;MOVE IN SECTOR NUMBER SOB R0,50$ ;GO DO IT AGAIN GTIM$S #DATBUF ;GET DATE AND TIME AGAIN MOV #DATBUF+6,R1 ;AND MOV #TIME,R0 ;CONVERT MOV #3,R2 ;FOR OUTPUT CALL $TIM ;AS MOV #DATBUF,R1 ;ABOVE MOV #DATE,R0 ; CALL $DAT ; QIOW$S #IO.WVB,#5,#5,,,,<#END,#ENDL,#40> ;TELL ALL DONE TST INERR ;ANY INPUT ERRORS? BEQ 80$ ;IF EQ NO MOV #ERBUF,R0 ;ADDRESS OF OUTPUT MOV INERR,R1 ;COPY NUMBER OF ERRORS CLR R2 ;ZERO SUPPRESSION CALL $CBDSG ;CONVERT TO ASCII QIOW$S #IO.WVB,#5,#5,,,,<#INERM,#INERML,#40> ;TELL NUMBER OF ERRORS 80$: TST OUTERR ;ANY OUTPUT ERRORS? BEQ EXIT ;IF EQ NO MOV #ERRBUF,R0 ;ADDRESS OF OUTPUT MOV OUTERR,R1 ;COPY NUMBER OF ERRORS CLR R2 ;ZERO SUPPRESSION CALL $CBDSG ;CONVERT TO ASCII QIOW$S #IO.WVB,#5,#5,,,,<#OUERR,#OUERRL,#40> ;TELL NUMBER OF ERRORS BR EXIT .IF NDF RX01 90$: QIOW$S #IO.WVB,#5,#5,,,,<#ERR1,#ERR1L,#40> ;TELL NOT DOUBLE DENSITY BR EXIT 100$: QIOW$S #IO.WVB,#5,#5,,,,<#ERR2,#ERR2L,#40> ;TELL NOT DOUBLE DENSITY .ENDC ;RX01 EXIT: EXIT$S .END DYCOPY