1`d * * * DEFINE I/O PORTS ON KONAN SMC-200 DISK CONTROLLER * * * an BUSDRVA : HEX 90 = OUTPUT PORT (BUS DRIVERS - BUSDRVA CONT- ROLS THE BUS & SELECT LINES TO THE DISK DRIVE (BITS 0,1 = BITS 8,9 OF THE BUS DATA, BIT 4 = DRIVE ADDRESS AND BIT 7 = POWER SAVE)) ax BUSDRVB : HEX 91 = OUTPUT PORT (BUS DRIVERS - BUSDRVB CONT- ROLS THE BUS DATA LINES TO THE DISK DRIVE (BITS 0 - 7 = BUS DATA 0 - 7)) Vb CMDREG : HEX 92 = OUTPUT PORT (COMMAND REGISTER - USED TO INITIATE THE FOLLOWING: DMA AND DISK TRANSFERS, DISK SELECTION, HEAD SELECTION, SEEKS, AND RECOVERY OPERATIONS) b BITS - 0 = DISK WRITE, 1 = DMA WRITE, 2 = DMA READ, 3 = DISK READ, 4 = SELECT UNIT, 5 = SET CYLINDER, 6 = SET HEAD, 7 = FAULT RECOVERY c SECADDP : HEX 93 = OUTPUT PORT (SECTOR ADDRESS - SELECTS THE SECTOR TO BE USED FOR THE NEXT READ OR WRITE OPERATION (BITS - 0 = LSB AND 7 = MSB)) d SECBUFP : HEX 94 = INPUT PORT/OUTPUT PORT (SECTOR BUFFER - ALLOWS SOFTWARE TO READ AND WRITE THE SECTOR BUFFER (1K OF RAM LOGICALLY PLACED BETWEEN THE DISK AND USER'S MEMORY. SIZE = BYTES OF USER MEMORY + HEADER BYTES.)) -e STATPRT : HEX 97 = INPUT/OUTPUT PORT (STATUS - ALLOWS DONE, READY AND ERROR STATUS TO BE READ. WRITING TO THIS I/O PORT RESETS THE SECTOR BUFFER ADDRESS) e BITS - 0 = SELECTED, 1 = SEEK ERROR, 2 = CHECKSUM ERROR, 3 = BUSY OR PROTECTED, 4 = ON CYLINDER, 5 = DISK FAULT, 6 = DISK READY 7 = DONE e * * * DEFINE SMC-200 LEGAL COMMANDS * * * Gf RESETS : HEX 0 (RESETS DONE AND INTERRUPT, NO DATA SET-UP REQUIRED) f DSKWRT : HEX 1 (WRITES THE CONTENTS OF THE SECTOR BUFFER TO THE DISK) g THE DATA IS WRITTEN ON THE CURRENTLY SELECTED DRIVE, HEAD AND TRACK AT THE SECTOR SELECTED BY THE SECTOR ADDRESS REGISTER qg DSKRD : HEX 8 (READS A SECTOR FROM THE DISK INTO THE SECTOR BUFFER) g THE SECTOR READ IS DEFINED BY THE SECTOR REGISTER AND IS TAKEN FROM THE CURRENTLY SELECTED DRIVE, HEAD, AND TRACK Eh SELUNIT : HEX 10 (THIS COMMAND CAUSES THE SELECT TAG LINE TO BE STROBED) h PRIOR TO ISSUING THIS COMMAND THE ADDRESS OF THE DRIVE TO BE SEL- ECTED IS SET INTO THE BUSDRVA REGISTER Ei SETCYL : HEX 20 (CAUSES THE SELECTED DRIVE TO SEEK TO THE CYLINDER SELECTED BY BUS 0 - 9 LINES (SET BY BUSDRVA AND BUSDRVB)) i" SETHEAD @: HEX 40 (SELECTS THE DISK HEAD IDENTIFIED BY THE BUS LINES (SET BY OUT BUSDRVB)) j, FLTCLR : HEX 80 (PERFORMS THE FAULT CLEAR FUNCTION IDENT- IFIED BY THE BUS LINES) j6 FLTREC : HEX 88 (READS A SECTOR FROM THE DISK (SAME AS 08H) WITH ERROR RECOVERY FUNCTIONS SELECTED BY OUT BUSDRVA AND BUSDRVB) j N : JUMP TO MAIN PROGRAM j * * * CLEAR DRIVE FAULT * * * k BUSDRVA, : MSB SET TO ZERO %k BUSDRVB,: FAULT CLEAR Kk CMDREG,FLTCLR : FAULT RECOVERY ek : GET STATUSES k : IDENTIFY STATUSES k DSKFLT 8 k. : BACK TO MAIN PROGRAM k8" ": " * * * ERROR * * * ":" " lB"DISK FAULT CLEAR ON UNIT ";UNIT;" WAS UNSUCCESSFUL " $lL Ol * * * DISPLAY CURRENT STATUSES * * * il : GET STATUSES l : IDENTIFY STATUSES l X : DISPLAY STATUSES l l * * * RETURN TO ZERO SEEK (RTZ) * * * l BUSDRVA, : MSB SET TO ZERO m BUSDRVB,@ : HEX 40 = RTZ Bm( CMDREG,FLTCLR : FAULT RECOVERY Vm- CMDREG,RESETS pm2 : GET STATUSES m< : IDENTIFY STATUSES mF DONE P : 2 mP SEEKERR Z : x mZ OK mn : BACK TO MAIN PROGRAM nx" ":" * * * ERROR * * * ":" " an"RETURN TO ZERO (RTZ) SEEK WAS UNSUCCESSFUL FOR DISK UNIT ";UNIT gn n * * * MAIN SEEK ROUTINE * * * n *** CONVERT CYLINDER ADDRESS (TWO BINARY DIGITS) *** n XCYL : o XCYL : o LCYL XCYL :MCYL -o Lo XCYL : lo XCYL : o LCYL XCYL :MCYL o o XCYL : o XCYL : o LCYL XCYL :MCYL p *p XCYL : Jp XCYL : mp LCYL XCYL :MCYL zp p DO SEEK p6 BUSDRVA,MCYL p@ BUSDRVB,LCYL pJ CMDREG,SETCYL pO"LCYL = ";LCYL pP"MCYL = ";MCYL qT : GET STATUSES #q^ : IDENTIFY STATUSES @qh DONE r : T `qr SEEKERR | : iq| OK q : BACK TO MAIN PROGRAM q" ":" * * * ERROR * * * ":" " q"SEEK TO CYLINDER ";XCYL;" WAS UNSUCCESSFUL FOR DISK UNIT ";UNIT q 3r"THERES NOT THAT MANY CYLINDERS (0 - 1023) MAX " Qr : BACK TO MAIN PROGRAM r"NO SUCH THING AS A NEGATIVE CYLINDER (0 - 1023) MAX " rSCYL rECYL rXCYL r : BACK TO MAIN PROGRAM r * * * DISK RELEASE * * * s BUSDRVA, : RELEASE 0s BUSDRVB, : LSB SET TO ZERO Us& CMDREG,FLTCLR: FAULT RECOVERY os0 : GET STATUSES s: : IDENTIFY STATUSES sD SELECT X sN : OK - BACK TO MAIN PROGRAM sX" ":" * * * ERROR * * * ":" " *tb"DISK RELEASE WAS UNSUCCESSFUL ON DISK UNIT ";UNIT 0tl Nt * * * SELECT UNIT * * * at BUSDRVA,UNIT vt CMDREG,SELUNIT t : GET STATUSES t : IDENTIFY STATUSES t SELECT : t CMDREG,RESETS t : BACK TO MAIN PROGRAM $u" ":" * * * ERROR * * * ":" " Qu"UNABLE TO SELECT DISK UNIT ";UNIT Wu vu * * * GET STATUSES * * * uSTATUS (STATPRT) u u * * * IDENTIFY STATUSES * * * uSELECT STATUS : HEX 1 = SELECTED v SEEKERR STATUS : HEX 2 = SEEK ERROR Fv CHKSUM STATUS : HEX 4 = CHECKSUM ERROR vBSYWRP STATUS : HEX 8 = BUSY OR WRITE PROTECTED vONCYL STATUS : HEX 10 = ON-CYLINDER v(DSKFLT STATUS : HEX 20 = DISK FAULT w2DSKRDY STATUS @ : HEX 40 = DISK READY 9w<DONE STATUS : HEX 80 = DONE ?wF `wX * * * PRINT ROUTINES * * * wZ *** DISPLAY STATUSES *** w[" ":" " w] wb wg wl wq wv w{ > w \ w z w x SELECT : ?x"DISK UNIT ";UNIT ;" IS CURRENTLY SELECTED " Ex bx SEEKERR : x"DISK UNIT ";UNIT ;" HAS A SEEK ERROR " x x CHKSUM : x"DISK UNIT ";UNIT ;" HAS A CHECKSUM ERROR " x y BSYWRP : ?y"DISK UNIT ";UNIT ;" IS WRITE PROTECTED " Ey ay ONCYL : y"DISK UNIT ";UNIT ;" IS ON-CYLINDER " y y DSKFLT * : y*"DISK UNIT ";UNIT;" HAS A FAULT " y4 y> DSKRDY @ H : &zH"DISK UNIT ";UNIT;" IS READY " ,zR Gz\ DONE f : mzf"DISK UNIT ";UNIT;" IS DONE " szp zz"STATUS = ";(STATUS);" HEX " z " ":" " z z' * * * SELECT DISK UNIT (TEST) * * * {'"ENTER DISK UNIT TO BE SELECTED (0 - 15 DECIMAL) ";UNIT 4{'UNIT UNIT : ADD BIAS M{' : SELECT UNIT {$'"SELECTION OF DISK UNIT ";UNIT ;" WAS SUCCESSFUL " {.' Z : DISPLAY STATUSES {V' : BACK TO MENU {o' * * * DISPLAY STATUS DEFINITIONS (TEST) * * * ;|'"DONE - IS SET TRUE AT COMPLETION, OF A SEEK OPERATION (SUCCESSFU- " |'"L OR UNSUCCESSFUL) AND UPON THE COMPLETION OF A DISK TRANSFER. S- " |'"ELECTING A DISK MAY ALSO CAUSE DONE. " |'" " }'"DISK READY - INDICATES THAT THE SELECTED DISK IS UP TO SPEED, THE " O}'"HEADS ARE POSITIONED OVER THE RECORDING TRACKS, AND NO FAULT CON- " s}'"DITION EXISTS IN THE DRIVE. " |}'" " } ("DISK FAULT - INDICATES A FAULT CONDITION EXISTS IN THE SELECTED " }("DISK DRIVE. " }(" " )~ ("ON CYLINDER - INDICATES THE HEADS ARE POSITIONED OVER A TRACK. " 7~(" ":" " ~("BUSY - USED ONLY ON DUAL CHANNEL DISKS. INDICATES THAT THE SELEC- " ~("TED DRIVE IS CURRENTLY BEING ACCESSED BY, OR IS RESERVED BY, AN- " ~("OTHER CONTROLLER. " ~ (" " 8#("CHECKSUM ERROR - INDICATES A READ ERROR HAS OCCURRED. WILL BE CL- " c-("EARED BY THE NEXT SUCCESSFUL READ. " l7(" " 8("TYPE RETURN TO CONTINUE ": XX:() A("SEEK ERROR - INDICATES A SEEK ERROR HAS OCCURRED ON THE SELECTED " -K("DRIVE. THE ERROR MAY ALSO BE CLEARED BY PERFORMING A RTZ ( RETURN " EU("TO ZERO ) SEEK. " N_(" " i("SELECTED - INDICATES THAT THE LAST SELECT OPERATION WAS SUCCESSFUL." n(" " s("WRITE PROTECT - INDICATES THE DISK IS WRITE PROTECTED. " }(" " ( : BACK TO MENU -) * * * RETURN TO ZERO (RTZ) SEEK (TEST) F) : DO RTZ SEEK )"RETURN TO ZERO (RTZ) SEEK WAS SUCCESSFUL FOR DISK UNIT ";UNIT ) Z : DISPLAY STATUSES Á") : BACK TO MENU 6) * * * DISPLAY STATUSES (TEST) * * * @) : DO STATUSES AND DISPLAY THEM 2J) : BACK TO MAIN MENU ]h) * * * CLEAR DRIVE FAULT (TEST) * * * {r) : CLEAR DISK FAULT |)"DISK FAULT CLEAR WAS SUCCESSFUL ON UNIT ";UNIT ӂ) Z : DISPLAY STATUSES 邐) : BACK TO MENU ) * * * SEQ FWD SEEK (TEST) * * * <)"ENTER STARTING CYLINDER ADDRESS ";SCYL g)"ENTER ENDING CYLINDER ADDRESS ";ECYL )"ENTER SEEK STEP AMOUNT ";STP )XCYL SCYL ) : DO SEEK ) XCYL XCYL STP : GENERATE NEXT ADDRESS * XCYL ECYL * : ) N*"SEQUENTIAL FORWAD SEEK TEST WAS SUCCESSFUL FOR DISK UNIT ";UNIT l&* Z : DISPLAY STATUSES 0* : BACK TO MENU * * * * SEQ REV SEEK (TEST) * * * Մ+"ENTER STARTING CYLINDER ADDRESS ";SCYL +"ENTER ENDING CYLINDER ADDRESS ";ECYL #+"ENTER SEEK STEP AMOUNT ";STP 3 +XCYL SCYL H*+ : DO SEEK y4+ XCYL XCYL STP : GENERATE NEXT ADDRESS >+ XCYL ECYL H+ : *+ H+"SEQUENTIAL REVERSE SEEK TEST WAS SUCCESSFUL FOR DISK UNIT ";UNIT R+ Z : DISPLAY STATUSES \+ : BACK TO MENU A+ * * * RANDOM SEEK (TEST) * * * f+"ENTER MAXIMUM CYLINDER ";MXCYL +"ENTER HOW MANY SEEKS YOU WANT ";MCNT +XCYL ( ) : GENERATE CYL ADDRESS ߆+" ";XCYL + XCYL MXCYL + : PICK LEGAL CYLINDER (+SCNT SCNT E+ SCNT MCNT , Z, : DO SEEK d, + ,"RANDOM SEEK TEST WAS SUCCESSFUL FOR DISK UNIT ";UNIT Ç,"TOTAL SEEKS = ";SCNT , Z : DISPLAY STATUSES ,SCNT : RESET SEEK COUNTER $, : BACK TO MENU E, * * * OSCILLATING SEEK (TEST) * * * j,"ENTER STARTING CYLINDER ";SCYL ,"ENTER ENDING CYLINDER ";ECYL ,"ENTER HOW MANY SEEKS YOU WANT ";MCNT Ȉ,XCYL SCYL ݈, : DO SEEK ,XCYL ECYL , : DO SEEK ,SCNT SCNT /, SCNT MCNT , 9, , ~,"OSCILLATING SEEK TEST WAS SUCCESSFUL FOR DISK UNIT ";UNIT ,"TOTAL SEEKS = ";SCNT - Z : DISPLAY STATUSES ډ-SCNT : RESET SEEK COUNTER - : BACK TO MENU P- * * * DISK RELEASE (TEST) * * * .Z- : DO RELEASE dd-"RELEASE WAS SUCCESSFUL ON DISK UNIT ";UNIT n- Z : DISPLAY STATUSES x- : BACK TO MAIN MENU N *N () : CLEAR SCREEN ܊N * * * MENU * * * N IP$ "DONE" lR : INIT. USER JUST ONCE N" " aO" * * * * * * MAID-III * * * * * * " jO" " sO" " $O" 1) - DISK SELECT " .O" 2) - CLEAR FAULT " ϋ8O" 3) - RETURN TO ZERO (RTZ) SEEK " BO" 4) - SEQUENTIAL FORWARD SEEK " LO" 5) - SEQUENTIAL REVERSE SEEK " 5VO" 6) - RANDOM SEEK " T`O" 7) - OSCILLATING SEEK " jO" 8) - DISPLAY CURRENT DISK STATUSES " tO" 9) - DISPLAY DEFINITIONS OF STATUSES " Ռ~O"10) - DISK RELEASE (DE-SELECT) " O"11) - FORMAT DISK " O"12) - FORMAT VERIFY " 0O"13) - WRITE - READ - COMPARE " hO"14) - OSCILLATING SEEK WITH HEADER CHECK (FAST) " O"15) - DISPLAY SECTOR WRITTEN TO DISK " O"16) - DISPLAY SECTOR READ FROM DISK " ǍO ͍O ӍO ٍO ߍO O P P P" ":" " )P"ENTER NUMBER FOR DESIRED TEST";TEST FP () : CLEAR SCREEN ]P TEST ' t(P TEST h) 2P TEST )