;This program will change the density of any PERCOM compatible drive from›;single to double density and vice versa. It also displays the values›;in the drive option table before and after the change.›;Note that by changing the CHANGE_DENSITY() procedure you could configure›;the disk controller to handle a double sided or 96TPI (quad density)›;drive, assuming your controller can handle these drive types.›;(The PERCOM RFD-1 and ATR8000 can, the TRAK, INDUS, etc. can't)›› ›DEFINE RDOCMD="$4E", WROCMD="$4F",› TIMEOUT="$0F", SIOUT="$80",› SIOIN="$40", BUSSID="'1"››››BYTE DCB=$0300, DDEVIC=$0300, DUNIT=$0301,› DCOMND=$0302, DSTATS=$0303, DTIMLO=$0306,› DRIVENUMBER››CARD DBUF=$0304, DBYTE=$0308, DAUX12=$030A,› SECTOR_SIZE,BUF256›BYTE POINTER PTR››BYTE ARRAY BUFFER(12) ›››PROC SIO=$E459() ;define location of serial bus handler››PROC FIRE_IO(BYTE TIME, COMND, STATS CARD BUF, BYTES)››;this routine sets up the Device Control Block›;and calls the SIO routine in the OS.›› DDEVIC=BUSSID› DUNIT=DRIVENUMBER› DCOMND=COMND› DTIMLO=TIME› DSTATS=STATS› DBUF=BUF› DBYTE=BYTES› SIO()›RETURN›››PROC OPTION_TABLE_ERROR()››;dummy error handling routine, put your own here I got lazy››RETURN››PROC OPTION_TABLE(BYTE CMND)› BYTE STATSD ;STATSD controls the direction of data › ;transfer› IF CMND=RDOCMD THEN ;read option table› STATSD=SIOIN ;set for data in› ELSEIF CMND=WROCMD THEN ;write option table› STATSD=SIOUT ;set for data out› ELSE› OPTION_TABLE_ERROR()› RETURN› FI› FIRE_IO(TIMEOUT,CMND,STATSD,BUF256,$0C)› IF DSTATS#1 THEN› OPTION_TABLE_ERROR()› FI ›RETURN››PROC TEST_OPTION_TABLE()››;this routine reads the option table and displays the values›› BYTE BUFBYTE › CARD BUFCARD› PTR=BUFFER› BUF256=PTR› OPTION_TABLE(RDOCMD)› PRINT("TRACKS ")› BUFBYTE=PTR^› PRINTBE(BUFBYTE)› PRINT("STEP RATE ")› PTR==+1› BUFBYTE=PTR^› PRINTBE(BUFBYTE)› PRINT("SEC/TRACK ")› PTR==+1› BUFCARD=256*PTR^› PTR==+1› BUFCARD==+PTR^› PRINTCE(BUFCARD)› PRINT("SIDES ")› PTR==+1› BUFBYTE=PTR^› PRINTBE(BUFBYTE)› PRINT("DENSITY ")› PTR==+1› BUFBYTE=PTR^› PRINTBE(BUFBYTE)› PRINT("SEC SIZE ")› PTR==+1› BUFCARD=256*PTR^› PTR==+1› BUFCARD==+PTR^› PRINTCE(BUFCARD)› PRINT("PRESENT ")› PTR==+1› BUFBYTE=PTR^› PRINTBE(BUFBYTE)›RETURN››PROC CHANGE_DENSITY(BYTE NEW_DENSITY)›› PTR=BUFFER› BUF256=PTR› OPTION_TABLE(RDOCMD) ;read option table› IF NEW_DENSITY=1 THEN ;sets single density› PTR==+5› PTR^=0 ;single/double flag› PTR==+1› PTR^=0 ;high byte of sector size› PTR==+1› PTR^=$80 ;low byte of sector size› OPTION_TABLE(WROCMD) ;write new info› ELSEIF NEW_DENSITY=2 THEN ;sets double density› PTR==+5› PTR^=4 ;density flag› PTR==+1› PTR^=1 ;high byte of sector size› PTR==+1› PTR^=0 ;low byte of sector size› OPTION_TABLE(WROCMD)› FI›RETURN›››PROC MAIN()›› BYTE CHANGE_TYPE›› PRINTE("ENTER THE DRIVE NUMBER YOU WISH TO")› PRINTE("CHANGE THE DENSITY OF")› DRIVENUMBER=INPUTB()›› TEST_OPTION_TABLE()›› PRINTE("ENTER '1' IF YOU WANT TO MAKE DRIVE")› PRINT("NUMBER ")› PRINTB(DRIVENUMBER)› PRINTE(" SINGLE DENSITY")› PRINTE("ENTER '2' IF YOU WANT TO MAKE DRIVE")› PRINT("NUMBER ")› PRINTB(DRIVENUMBER)› PRINTE(" DOUBLE DENSITY")› CHANGE_TYPE=INPUTB()› › CHANGE_DENSITY(CHANGE_TYPE)› › TEST_OPTION_TABLE()›RETURN››