ÿ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 "$lLOl° * * * 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 STATUSESm< ì : 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 ó -tlKt” * * * SELECT UNIT * * *^tž BUSDRVA,UNITst¨ CMDREG,SELUNITt« ˆ : 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-âO3ìO9öO?PE PXP‘" ":‘" ":‘" "‚P…"ENTER NUMBER FOR DESIRED TEST";TESTŸP‘ ÿ–( ) : CLEAR SCREEN¶P‹ TEST ð  Ï 'Í(P‹ TEST ð  Ï h)ä2P‹ TEST ð  Ï )û