.TITLE FFDISK .ENABLE LC .SBTTL Description .IDENT /02.02/ ; AUTHOR: TED YLONEN ; CHANGES: ; ; Version 02.01 John Miller Sanders Associates, Inc. 19-Nov-81 ; ; Modify error notification to output only the actual number of ; characters in the error message. ; ; Version 02.02 Jean Holland Sanders Associates, Inc. 9-Mar-82 ; ; Modify error routine to pass the physical address of the error buffer to ; the controller rather than the virtual address. ; Redefine ERBUF as four words as defined in DSD 440 manual. ; Change MSG definition from .ASCII to .ASCIZ per $EDMSG requirement. ; Change $EDMSG argument to address of address of data buffer. (ARGBUF) ; ; MODULE FUNCTION: ; ; THIS MODULE FORMATS A FLOPPY DISKETTE USING ; THE MICROPROCESSOR IN THE DSD 440 FLOPPY DISK DRIVE. .SBTTL SYMBOL, MACRO, DATA DEFINITION .MCALL EXIT$S ; EXEC'S EXIT MACRO .MCALL QIOW$S ; 02.01 .MCALL DSCP$S ;DISABLE CHECKPOINTING ;02.02. ; LOCAL SYMBOL DEFINITIONS: TRACK: .WORD 0 ;TRACK NUMBER SECTOR: .WORD 0 ;SECTOR NUMBER DENS: .WORD 153 ;153 = HIGH DENSITY FORMAT,152 = LOW DENSITY ERBUF: .BLKW 4 ;ERROR BUFFER 02.02 CMD: .WORD 5 ;COMMAND WORD......5 = DRIVE 0,25 = DRIVE 1 RXCS =177170 RXDB =177172 DRIVE0=5 ; CMD FOR DRIVE 0 DRIVE1=25 ; CMD FOR DRIVE 1 SNGDNS=152 ; CODE FOR SINGLE DENSITY DBLDNS=153 ; CODE FOR DOUBLE DENSITY .SBTTL MAIN ROUTINE ; START CODE HERE .PSECT FFDISK: ; QUERY USER FOR DRIVE NUMBER QIOW$S #IO.WVB,#5,#1,,,,<#DRVMSG,#DRVLTH,#044> ; WAIT FOR RESPONSE QIOW$S #IO.RVB,#5,#1,,,,<#INBUF,#2> ; SET UP CMD FOR DRIVE NUMBER ENTERED MOVB INBUF,R0 ; GET DRIVE NUMBER SUB #60,R0 ; CHANGE FROM ASCII TO BINARY BNE 10$ ; ANYTHING BUT 0 INDICATES DRIVE 1 MOV #DRIVE0,CMD ; SET CODE FOR DRIVE 0 BR 15$ 10$: MOV #DRIVE1,CMD ; SET CODE FOR DRIVE 1 15$: ; QUERY USER FOR DENSITY QIOW$S #IO.WVB,#5,#1,,,,<#DNSMSG,#DNSLTH,#044> ; WAIT FOR RESPONSE QIOW$S #IO.RVB,#5,#1,,,,<#INBUF,#2> ; SET UP CODE FOR DENSITY MOVB INBUF,R1 ; GET DENSITY TYPED IN SUB #61,R1 ; CHANGE TO BINARY AND DECREMENT BNE 20$ ; ANYTHING BUT 1 INDICATES DOUBLE DENSITY MOV #SNGDNS,DENS ; SET CODE FOR SINGLE DENSITY BR 25$ 20$: MOV #DBLDNS,DENS ; SET CODE FOR DOUBLE DENSITY 25$: ; FORMAT FLOPPY CLR TRACK ; INITIALIZE TRACK NUMBER TO ZERO ;----------------------LOOP AROUND TRACK NUMBER-------------------------------- NXTTRK: MOV CMD, @#RXCS ;SETUP FOR WRITE SECTOR 1$: TSTB @#RXCS ;WAIT FOR TRANSFER FLAG BPL 1$ MOV DENS, @#RXDB ;SEND HIGH DENSITY FORMAT 2$: TSTB @#RXCS ;WAIT FOR FLAG BPL 2$ MOV TRACK, @#RXDB ;MOVE TRACK ADDRESS INC TRACK ; INCREMENT MOV #1, @#SECTOR ;INITIALIZE SECTOR ;---------------------------LOOP AROUND SECTOR NUMBER-------------------------------- 3$: TSTB @#RXCS ;WAIT FOR FLAG BPL 3$ MOV SECTOR, @#RXDB ; MOVE SECTOR ADDRESS INC SECTOR ;INCREMENT CMP SECTOR, #33 ;DONE? BLT 3$ ;NO...SEND ANOTHER ADDRESS ; YES...FORMAT ONE TRACK ;-------------------END SECTOR LOOP-------------------------------------------- 4$: BIT #100040, @#RXCS ;TEST FOR DONE OR ERROR BEQ 4$ BMI ERFIN ;ERROR BIT SET? 5$: CMP TRACK,#115 ;ALL TRACKS DONE? BLT NXTTRK ;NO...DO ANOTHER TRACK ;-------------------END TRACK LOOP----------------------------------------------- ; ASK IF USER WANTS TO DO ANOTHER QIOW$S #IO.WVB,#5,#1,,,,<#DONMSG,#DONLTH,#044> ; WAIT FOR RESPONSE QIOW$S #IO.RVB,#5,#1,,,,<#INBUF,#2> ; CHECK RESPONSE - ANYTHING BUT 'Y' INDICATES NO MORE FLOPPIES TO FORMAT CMPB INBUF,#'Y ; RESPONSE = YES? BNE END ; NO - GET OUT JMP FFDISK ; YES - START OVER .SBTTL ERROR ROUTINE ERFIN: ;ERROR PROCESSING ; ; CALCULATE PHYSICAL ADDRESS OF ERBUF ; DSCP$S ;DISABLE CKPTING SO PHYSICAL ADDR IS FIXED 02.02 MOV #ERBUF,R0 ;RO INPUTS PHYS ADDR TO $RELOC 02.02 CALL $RELOC ;SYSTEM RTN, RETURNS ; R1 -- RELOCATION BIAS ; R2 -- DISPLACEMENT ADDRESS 02.02 ;NEXT 15 LINES OF CODE FROM SYSTEM RTN $MPPHY ASL R2 ;REMOVE APR6 BIAS FROM DISPLACEMENT 02.02 ASL R2 CLC ;GET 2 BITS OF RELOCATION BIAS ROR R1 RORB R2 ;TO FILL 8 LOW ORDER BITS OF ADDRESS ASR R1 RORB R2 SWAB R2 ;SWAP TO COLLECT 8 MORE BITS BISB R1,R2 ;INSERT UPPER 8 BITS OF ADDRESS SWAB R2 ;SWAP BACK TO REAL ADDRESS CLRB R1 ;CLEAR LOW BYTE OF UPPER BITS ASR R1 ;SHIFT BITS 17,18 OF ADDRESS ASR R1 ASR R1 ASR R1 ; END OF $MPPHY CODE ; ; SET EXTENDED ADDR BITS AND GET ERROR STATUS ; ;16-BIT PHYS ADDR IN R2 ;BITS 17,18 OF PHYS ADDR IN BITS 4,5 OF R1 BIC #177717,R1 ;CLEAR ALL BUT BITS 4,5 02.02. SWAB R1 ;POSITION BITS 4,5 IN 12,13 FOR RXCS 02.02 BIS #17,R1 ;SET UP R1 FOR RXCS TO 02.02. MOV R1,@#RXCS ; GET DEFINITIVE ERROR STATUS 02.02. 6$: TSTB @#RXCS ;WAIT FOR TRANSFER FLAG BPL 6$ MOV R2,@#RXDB ;SEND PHYS ERROR BUFFER ADDRESS 02.02 7$: BIT #40,@#RXCS ;WAIT FOR DONE BIT BEQ 7$ ; EDIT ERROR MESSAGE MOV #OUTBF,R0 ;OUTPUT BUFFER TO R0 MOV #MSG, R1 ;MESSAGE FORM TO R1 MOV #ERBUF,ARGBLK ;PUT ERROR BFR ADDR IN ARGBUF ADDR BLK 02.02 MOV #ARGBLK, R2 ;ERROR CODE TO R2 02.02 CALL $EDMSG ; ;WRITE ERROR MESSAGE QIOW$S #IO.WVB,#5,#5,,,,<#OUTBF,R1,#40> ; 02.01 END: EXIT$S INBUF: .WORD 0 ; INPUT BUFFER OUTBF: .BLKB 40 ;OUTPUT BUFFER ARGBLK: .WORD 0 ; ADDR BLK FOR ERROR DATA INTO $EDMSG 02.02 MSG: .ASCIZ /%5SCONTROLLER ERROR CODE%3S%B/ ;02.02 .EVEN ; DRIVE QUERY DRVMSG: .ASCII /WHICH DRIVE (0 OR 1)?/ DRVLTH=.-DRVMSG .EVEN ; DENSITY QUERY DNSMSG: .ASCII /SINGLE OR DOUBLE DENSITY (1 OR 2)?/ DNSLTH=.-DNSMSG .EVEN ; ADDITIONAL FLOPPY QUERY DONMSG: .ASCII /ANOTHER FLOPPY TO FORMAT (Y OR N)?/ DONLTH=.-DONMSG .EVEN .END FFDISK