ÿ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 REGISTERqgðˆ 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 TRACKEhˆ 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 REGISTEREiˆ 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 CLEARKkò� CMDREG,FLTCLR :� FAULT RECOVERYekü� ˆ :� 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 ZEROm� BUSDRVB,@ :� HEX 40 = RTZBm(� CMDREG,FLTCLR :� FAULT RECOVERYVm-� CMDREG,RESETSpm2� ˆ :� GET STATUSES�m<� ì :� IDENTIFY STATUSES¬mF‹ DONE ð € Ï P :¢ 2ÌmP‹ SEEKERR ñï  Ï Z :¢ xÕmZ� OKómnŽ :� BACK TO MAIN PROGRAMnx‘" ":‘" * * * ERROR * * * ":‘" "an‡‘"RETURN TO ZERO (RTZ) SEEK WAS UNSUCCESSFUL FOR DISK UNIT ";UNITógnŒ�‹nÜ� * * * MAIN SEEK ROUTINE * * *Ãnæ� *** CONVERT CYLINDER ADDRESS (TWO BCD DIGITS) ***ànð‹ XCYL ïð  Ï ñ :¢ ùoñ ‹ XCYL ñ  Ï ó :¢ ùoó LCYL ð XCYL :MCYL ð *oö ‰ Ioù‹ XCYL ïð  Ï ú :¢ ioú ‹ XCYL ñ  Ï ü :¢ Œoü LCYL ð XCYL ó  :MCYL ð ™oÿ ‰ ¸o‹ XCYL ïð  Ï  :¢  Øo ‹ XCYL ñ  Ï  :¢  ûo LCYL ð XCYL ó  :MCYL ð p ‰ 'p ‹ XCYL ïð  Ï   :¢ ÂGp  ‹ XCYL ñ  Ï  :¢ ®jp LCYL ð XCYL ó  :MCYL ð wp ‰ …p� DO SEEK˜p6� BUSDRVA,MCYL«p@� BUSDRVB,LCYL¿pJ� CMDREG,SETCYLÓpO‘"LCYL = ";LCYLçpP‘"MCYL = ";MCYLqT� ˆ :� GET STATUSES q^� ì :� IDENTIFY STATUSES=qh‹ DONE ð € Ï r :¢ T]qr‹ SEEKERR ñï  Ï | :¢ �fq|� OK„q†Ž :� BACK TO MAIN PROGRAM©q�‘" ":‘" * * * ERROR * * * ":‘" "ôqš‘"SEEK TO CYLINDER ";XCYL;" WAS UNSUCCESSFUL FOR DISK UNIT ";UNIT ó úq¤�0r®‘"THERES NOT THAT MANY CYLINDERS (0 - 1023) MAX "Nr¸Ž :� 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-s� BUSDRVB, :� LSB SET TO ZERORs&� CMDREG,FLTCLR:� FAULT RECOVERYls0� ˆ :� 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 ó -tl�Kt”� * * * SELECT UNIT * * *^tž� BUSDRVA,UNITst¨� CMDREG,SELUNIT�t«� ˆ :� GET STATUSES¬t®� ì :� IDENTIFY STATUSESÊt²‹ SELECT ð  Ï · :¢ ÆÞt·� CMDREG,RESETSüt¼Ž :� BACK TO MAIN PROGRAM!uÆ‘" ":‘" * * * ERROR * * * ":‘" "NuБ"UNABLE TO SELECT DISK UNIT ";UNIT ó TuÚ�suˆ� * * * GET STATUSES * * *Œu’STATUS ð ÿ�(STATPRT)’uâ޶uì� * * * IDENTIFY STATUSES * * *âuöSELECT ð STATUS ÷  :� HEX 1 = SELECTEDvSEEKERR ð STATUS ÷  :� HEX 2 = SEEK ERRORCv 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 FAULTw2DSKRDY ð STATUS ÷ @ :� HEX 40 = DISK READY6w<DONE ð STATUS ÷ € :� HEX 80 = DONEÚw€� \äw…� zêwŠŽx”‹ SELECT ð  Ï ž :¢ Ž‹ DSKRDY ð @ Ï H :¢ Ž#zH‘"DISK UNIT ";UNITó;" IS READY ")zRŽDz\‹ DONE ð € Ï f :¢ Žjzf‘"DISK UNIT ";UNITó;" IS DONE "pzpŽ”zz‘"STATUS = ";ÿš(STATUS);" HEX "£z‘ " ":‘" "©z„ŽÓz'� * * * SELECT DISK UNIT (TEST) * * *{'…"ENTER DISK UNIT TO BE SELECTED (0 - 15 DECIMAL) ";UNIT1{'UNIT ð UNIT ò  :� ADD BIASJ{'� ” :� SELECT UNIT†{$'‘"SELECTION OF DISK UNIT ";UNIT ó ;" WAS SUCCESSFUL "¤{.'� Z :� DISPLAY STATUSESº{V'Ž :� BACK TO MENUî{o'� * * * DISPLAY STATUS DEFINITIONS (TEST) * * *8|Ø'‘"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 "L}ñ'‘"HEADS ARE POSITIONED OVER THE RECORDING TRACKS, AND NO FAULT CON- "p}ö'‘"DITION EXISTS IN THE DRIVE. "y}û'‘" "Â}(‘"DISK FAULT - INDICATES A FAULT CONDITION EXISTS IN THE SELECTED "Ö}(‘"DISK DRIVE. "ß}(‘" "&~ (‘"ON CYLINDER - INDICATES THE HEADS ARE POSITIONED OVER A TRACK. "4~(‘" ":‘" "~~(‘"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. "ë~ (‘" "5#(‘"CHECKSUM ERROR - INDICATES A READ ERROR HAS OCCURRED. WILL BE CL- "`-(‘"EARED BY THE NEXT SUCCESSFUL READ. "i7(‘" "–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 "B€U(‘"TO ZERO ) SEEK. "K€_(‘" "–€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)C�)�  :� 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/‚J)Ž :� BACK TO MAIN MENUZ‚h)� * * * CLEAR DRIVE FAULT (TEST) * * *x‚r)� è :� CLEAR DISK FAULT²‚|)‘"DISK FAULT CLEAR WAS SUCCESSFUL ON UNIT ";UNIT ó Ђ†)� Z :� DISPLAY STATUSESæ‚�)Ž :� BACK TO MENU ƒÂ)� * * * SEQ FWD SEEK (TEST) * * *9ƒÌ)…"ENTER STARTING CYLINDER ADDRESS ";SCYLdƒÖ)…"ENTER ENDING CYLINDER ADDRESS ";ECYL‡ƒÛ)…"ENTER SEEK STEP AMOUNT ";STP—ƒà)XCYL ð SCYL¬ƒê)� Ü :� DO SEEK݃þ)ˆ XCYL ð XCYL ò STP :� GENERATE NEXT ADDRESS„*‹ XCYL ïð ECYL ò  Ï * :¢ ê)K„*‘"SEQUENTIAL FORWAD SEEK TEST WAS SUCCESSFUL FOR DISK UNIT ";UNIT ói„&*� 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 ";STP0… +XCYL ð SCYLE…*+� Ü :� DO SEEKv…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>†À+� * * * RANDOM SEEK (TEST) * * * c†Ê+…"ENTER MAXIMUM CYLINDER ";MXCYLކÔ+…"ENTER HOW MANY SEEKS YOU WANT ";MCNT¾†Þ+XCYL ð ÿ…(ÿˆ ô è) :� GENERATE CYL ADDRESS܆ã+‘" ";XCYL‡è+‹ XCYL ïð MXCYL ò  Ï Þ+ :� PICK LEGAL CYLINDER%‡ò+SCNT ð SCNT ò B‡ü+‹ SCNT ïð MCNT ò  Ï ,W‡,� Ü :� DO SEEKa‡ ,‰ Þ+¡‡,‘"RANDOM SEEK TEST WAS SUCCESSFUL FOR DISK UNIT ";UNIT ó À‡,‘"TOTAL SEEKS = ";SCNT ó Þ‡,� Z :� DISPLAY STATUSESˆ,SCNT ð  :� RESET SEEK COUNTERˆ$,Ž :� BACK TO MENUBˆˆ,� * * * OSCILLATING SEEK (TEST) * * *gˆ’,…"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 Ï ö,6‰ì,‰ °,{‰ö,‘"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 RELEASEaŠ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‘" "^‹O‘" * * * * * * MAID-III * * * * * * "g‹O‘" "p‹O‘" "Ž‹$O‘"1) - DISK SELECT TEST "¬‹.O‘"2) - CLEAR FAULT TEST "Ø‹8O‘"3) - RETURN TO ZERO (RTZ) SEEK TEST "ŒBO‘"4) - SEQUENTIAL FORWARD SEEK TEST ",ŒLO‘"5) - SEQUENTIAL REVERSE SEEK TEST "JŒVO‘"6) - RANDOM SEEK TEST "mŒ`O‘"7) - OSCILLATING SEEK TEST "˜ŒjO‘"8) - DISPLAY CURRENT DISK STATUSES "ÅŒtO‘"9) - DISPLAY DEFINITIONS OF STATUSES "ñŒ~O‘"10) - DISK RELEASE (DE-SELECT) TEST "÷ŒˆO�ýŒ’O��œO� �¦O��°O��ºO��ÄO�!�ÎO�'�ØO�-�âO�3�ìO�9�öO�?�P�E� P�X�P‘" ":‘" ":‘" "‚�P…"ENTER NUMBER FOR DESIRED TEST";TESTŸ�P‘ ÿ–( ) :� CLEAR SCREEN¶�P‹ TEST ð  Ï � 'Í�(P‹ TEST ð  Ï � h)ä�2P‹ TEST ð  Ï � )û�