ÿ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 " šrÄSCYL ð §rÆECYL ð ´rÈXCYL ð Ò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 * * * �u’STATUS ð ÿ�(STATPRT) •u⎠¹uì� * * * IDENTIFY STATUSES * * * åuöSELECT ð 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 " E€U(‘"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 2‚J)Ž :� 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 y…4+ˆ 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 dŠd-‘"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‘" " a‹O‘" * * * * * * MAID-III * * * * * * " j‹O‘" " s‹O‘" " �‹$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 " 5ŒVO‘" 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 " 0�œO‘"13) - WRITE - READ - COMPARE " h�¦O‘"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 FŽP‘ ÿ–() :� CLEAR SCREEN ]ŽP‹ TEST ð Ï � ' tŽ(P‹ TEST ð Ï � h) ‹Ž2P‹ TEST ð Ï � ) ¢Ž