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 RECOVERYc 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 = DONEe * * * 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 PROGRAMj * * * CLEAR DRIVE FAULT * * *k BUSDRVA, : MSB SET TO ZERO%k BUSDRVB,: FAULT CLEARKk CMDREG,FLTCLR : FAULT RECOVERYek  : GET STATUSESk  : IDENTIFY STATUSESk DSKFLT  8k. : BACK TO MAIN PROGRAMk8" ": " * * * ERROR * * * ":" "lB"DISK FAULT CLEAR ON UNIT ";UNIT;" WAS UNSUCCESSFUL "$lLOl * * * DISPLAY CURRENT STATUSES * * *il  : GET STATUSESl  : IDENTIFY STATUSESl X : DISPLAY STATUSESll * * * RETURN TO ZERO SEEK (RTZ) * * *l BUSDRVA, : MSB SET TO ZEROm BUSDRVB,@ : HEX 40 = RTZBm( CMDREG,FLTCLR : FAULT RECOVERYVm- CMDREG,RESETSpm2  : GET STATUSESm<  : IDENTIFY STATUSESmF DONE  P : 2mP SEEKERR  Z : xmZ OKmn : BACK TO MAIN PROGRAMnx" ":" * * * ERROR * * * ":" "an"RETURN TO ZERO (RTZ) SEEK WAS UNSUCCESSFUL FOR DISK UNIT ";UNITgnn * * * 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 SEEKp6 BUSDRVA,MCYLp@ BUSDRVB,LCYLpJ CMDREG,SETCYLpO"LCYL = ";LCYLpP"MCYL = ";MCYLqT  : GET STATUSES#q^  : IDENTIFY STATUSES@qh DONE  r : T`qr SEEKERR  | : iq| OKq : BACK TO MAIN PROGRAMq" ":" * * * ERROR * * * ":" "q"SEEK TO CYLINDER ";XCYL;" WAS UNSUCCESSFUL FOR DISK UNIT ";UNIT q3r"THERES NOT THAT MANY CYLINDERS (0 - 1023) MAX "Qr : BACK TO MAIN PROGRAMr"NO SUCH THING AS A NEGATIVE CYLINDER (0 - 1023) MAX "rSCYL rECYL rXCYL r : BACK TO MAIN PROGRAMr * * * DISK RELEASE * * * s BUSDRVA, : RELEASE0s BUSDRVB, : LSB SET TO ZEROUs& CMDREG,FLTCLR: FAULT RECOVERYos0  : GET STATUSESs:  : IDENTIFY STATUSESsD SELECT  XsN : OK - BACK TO MAIN PROGRAMsX" ":" * * * ERROR * * * ":" "*tb"DISK RELEASE WAS UNSUCCESSFUL ON DISK UNIT ";UNIT 0tlNt * * * SELECT UNIT * * *at BUSDRVA,UNITvt CMDREG,SELUNITt  : GET STATUSESt  : IDENTIFY STATUSESt SELECT   : t CMDREG,RESETSt : BACK TO MAIN PROGRAM$u" ":" * * * ERROR * * * ":" "Qu"UNABLE TO SELECT DISK UNIT ";UNIT Wuvu * * * GET STATUSES * * *uSTATUS (STATPRT)uu * * * IDENTIFY STATUSES * * *uSELECT STATUS  : HEX 1 = SELECTEDvSEEKERR STATUS  : HEX 2 = SEEK ERRORFv CHKSUM STATUS  : HEX 4 = CHECKSUM ERRORvBSYWRP STATUS  : HEX 8 = BUSY OR WRITE PROTECTEDvONCYL STATUS  : HEX 10 = ON-CYLINDERv(DSKFLT STATUS  : HEX 20 = DISK FAULTw2DSKRDY STATUS @ : HEX 40 = DISK READY9w<DONE STATUS  : HEX 80 = DONE?wF`wX * * * PRINT ROUTINES * * *wZ *** DISPLAY STATUSES ***w[" ":" "w] wb wg wl wq wv  w{ >w \w zw x SELECT   : ?x"DISK UNIT ";UNIT ;" IS CURRENTLY SELECTED "Exbx SEEKERR   : x"DISK UNIT ";UNIT ;" HAS A SEEK ERROR "xx CHKSUM   : x"DISK UNIT ";UNIT ;" HAS A CHECKSUM ERROR "x y BSYWRP   : ?y"DISK UNIT ";UNIT ;" IS WRITE PROTECTED "Eyay ONCYL    : y "DISK UNIT ";UNIT ;" IS ON-CYLINDER "yy  DSKFLT  * : y*"DISK UNIT ";UNIT;" HAS A FAULT "y4y> DSKRDY @ H : &zH"DISK UNIT ";UNIT;" IS READY ",zRGz\ DONE  f : mzf"DISK UNIT ";UNIT;" IS DONE "szpzz"STATUS = ";(STATUS);" HEX "z " ":" "zz' * * * SELECT DISK UNIT (TEST) * * *{'"ENTER DISK UNIT TO BE SELECTED (0 - 15 DECIMAL) ";UNIT4{'UNIT UNIT  : ADD BIASM{'  : 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 MENU6) * * * DISPLAY STATUSES (TEST) * * *@)  : DO STATUSES AND DISPLAY THEM2J) : 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 ";SCYLg)"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 STATUSES0* : BACK TO MENU* * * * SEQ REV SEEK (TEST) * * *Մ+"ENTER STARTING CYLINDER ADDRESS ";SCYL +"ENTER ENDING CYLINDER ADDRESS ";ECYL#+"ENTER SEEK STEP AMOUNT ";STP3 +XCYL SCYLH*+  : DO SEEKy4+ XCYL XCYL STP : GENERATE NEXT ADDRESS>+ XCYL ECYL  H+ : *+H+"SEQUENTIAL REVERSE SEEK TEST WAS SUCCESSFUL FOR DISK UNIT ";UNITR+ Z : DISPLAY STATUSES\+ : BACK TO MENUA+ * * * 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 SEEKd , +,"RANDOM SEEK TEST WAS SUCCESSFUL FOR DISK UNIT ";UNIT Ç,"TOTAL SEEKS = ";SCNT , Z : DISPLAY STATUSES,SCNT  : RESET SEEK COUNTER$, : BACK TO MENUE, * * * 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 MENUP- * * * DISK RELEASE (TEST) * * *.Z-  : DO RELEASEdd-"RELEASE WAS SUCCESSFUL ON DISK UNIT ";UNIT n- Z : DISPLAY STATUSESx- : BACK TO MAIN MENU N *N ( ) : CLEAR SCREEN܊N * * * MENU * * *N IP$ "DONE" lR : INIT. USER JUST ONCEN" "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ߍOOP PP" ":" ")P"ENTER NUMBER FOR DESIRED TEST";TESTFP ( ) : CLEAR SCREEN]P TEST  't(P TEST  h)2P TEST  )

bAOSBUFF %P\HbAISBUFF )RpRbAHDR1 %P\bAHDR2 &PfbAHDR3 'PpbAHDR4 (PzbAXCYL PԔbAXHD P蔎bAXSECT PbAXDATA PbAXPRGCNT PbYc *** PASS FORMAL PARAMETERS TO MACHINE LANGUAGE ROUTINES ***kc ASUNIT,UNIT}c ASCYL,MSCYLc ASCYL ,LSCYLc AECYL,MECYLc AECYL ,LECYLʕc ASHD,SHDٕc AEHD,EHDc ASSECT,SSECTc AESECT,ESECTc ASDATA,SDATA'd APRGCMD,PRGCMD< d APRGMOD,PRGMODQd ADATMOD,DATMODgd APRGCNT,MPRGCNT#d APRGCNT ,LPRGCNT,e˖e *** PASS FORMAL PARAMETERS FROM MACHINE LANGUAGE ROUTINES ***䖤eCSTATS (ACSTATS)ePSTATS (APSTATS)eMXCYL (AXCYL)-eLXCYL (AXCYL )@eXHD (AXHD)WeXSECT (AXSECT)neXDATA (AXDATA)eMXPRGCNT (AXPRGCNT)eLXPRGCNT (AXPRGCNT )ixi *** CONVERT CYLINDER ADDRESS (TWO BINARY DIGITS) ***i XCYL  i : i(i XCYL  i : iEi LCYL XCYL :MCYL Ri @jqi XCYL  i : ii XCYL  i : ii LCYL XCYL  :MCYL i @ji XCYL  i : ji XCYL  j : j#j LCYL XCYL  :MCYL 0j @jOj XCYL  "j : jo"j XCYL  ,j : |j,j LCYL XCYL  :MCYL 6j @j@j DO SEEKJj |j"THERES NOT THAT MANY CYLINDERS (0 - 1023) MAX "j1j"NO SUCH THING AS A NEGATIVE CYLINDER (0 - 1023) MAX ">jSCYL KjECYL XjXCYL ^j0u *** GENERAL PARAMETER INPUT ***Nu"ENTER STARTING CYLINDER ";ESCYLΚXu"ENTER ENDING CYLINDER ";EECYLbu"ENTER STARTING HEAD ";ESHDlu"ENTER ENDING HEAD ";EEHD3vu"ENTER STARTING SECTOR ";ESSECTVu"ENTER ENDING SECTOR ";EESECTguXCYL ESCYL|u xi : CONVERTuMSCYL MCYLuLSCYL LCYLuXCYL EECYLěu xi : CONVERT՛uMECYL MCYLuLECYL LCYLuSHD ESHDuEHD EEHDuSSECT ESSECT*vESECT EESECT0*vUv *** DISPLAY PROGRAM STATUS ***sv PSTATS  v : wv"PROGRAM STATUS - NO ERRORS "ww PSTATS  w : .ww"PROGRAM STATUS - UNABLE TO SELECT DRIVE (ERROR) "$w.w PSTATS  8w : LwJ8w"PROGRAM STATUS - SEEK ERROR OCCURED (ERROR) "PBwnLw PSTATS  Vw : jwVw"PROGRAM STATUS - MISSING STATUS (RDY,ONCYL,SEL) BEFORE WRITE (ERROR)"`wޝjw PSTATS  tw : w0tw"PROGRAM STATUS - BAD STATUS (FLT,PROTECTED,SEEK ERR) BEFORE WRITE (ERROR) "6~wTw PSTATS  w : ww"PROGRAM STATUS - MISSING STATUS (RDY,ONCYL,SEL) AFTER WRITE (ERROR) "wĞw PSTATS  w : ww"PROGRAM STATUS - BAD STATUS (FLT,PROTECTED,SEEK ERR) AFTER WRITE (ERROR) "w9w PSTATS  w : ww"PROGRAM STATUS - MISSING STATUS (RDY,ONCYL,SEL) BEFORE READ (ERROR) "ww PSTATS  w : xw"PROGRAM STATUS - BAD STATUS (FLT,SEEK ERR) BEFORE READ (ERROR) "wx PSTATS   x : xa x"PROGRAM STATUS - MISSING STATUS (RDY,ONCYL,SEL) AFTER READ (ERROR) "gxx PSTATS  (x : ފ cJ芶 MLANGT er PSTATS   : 8} GOOD"FORMAT VERIFY WAS SUCCESSFUL FOR DISK UNIT ";UNIT ާ v : DISPLAY PROGRAM STATUS$  : GET,DECODE, DISPLAY CURRENT STATUSES&. : BACK TO MENUe8"FORMAT VERIFY WAS UNSUCCESSFUL FOR DISK UNIT ";UNIT = y : DISPLAY LAST HEADERB v : DISPLAY PROGRAM STATUSΨLSTATUS CSTATS : GET STATUSESV  : IDENTIFY STATUSES ` X : DISPLAY STATUSES!j : BACK TO MENUF؋ *** WRITE - READ - COMPARE ***x⋑" * * * WRITE - READ - COMPARE * * * "싑" "ɩPRGCMD  : TELL MACHINE LANGUAGE PRG. TO WRITE,READ THEN COMPAREө 0u "ENTER DATA BYTE TO USE (0 - 255) DECIMAL ";ESDATASDATA ESDATA( c4 MLANG> e\( PSTATS  2 : dg2 GOOD<"TEST - WRITE,READ,COMPARE WAS SUCCESSFUL FOR DISK UNIT ";UNIT ԪF v : DISPLAY PROGRAM STATUSP  : GET,DECODE,DISPLAY CURRRENT STATUSESZ : BACK TO MENUgd"TEST - WRITE,READ,COMPARE WAS UNSUCCESSFUL FOR DISK UNIT ";UNIT i y : DISPLAY LAST HEADERn v : DISPLAY PROGRAM STATUSЫxSTATUS CSTATS : GET STATUSES輸  : IDENTIFY STATUSES X : DISPLAY STATUSES# : BACK TO MENUU̍ *** OSCILLATING SEEK WITH HEADER VERIFY ***֍" * * * OSCILLATING SEEK WITH HEADER VERIFY * * * "" "ܬPRGCMD  : TELL MACHINE LANGUAGE PROG. TO DO OSC. SEEKS 0u"ENTER HOW MANY SEEKS YOU WANT ";ELPRGCNT(XXX ELPRGCNTD XXX   : WXXX XXX hLPRGCNT r LPRGCNT XXXXXX XXX XXX c MLANG e֭ PSTATS  & : X& GOOD* XXX  + : $+SEKCNT ELPRGCNT XXX LXPRGCNTA-"TOTAL SEEKS = ";SEKCNT0"OSCILLATING SEEK WAS SUCCESSFUL FOR DISK UNIT ";UNIT : v : DISPLAY PROGRAM STATUS֮D  : GET,DECODE,DISPLAY CURRENT STATUSESN : BACK TO MENU.X"OSCILLATING SEEK WAS UNSUCCESSFUL FOR DISK UNIT ";UNIT UYSEKCNT ELPRGCNT XXX LXPRGCNTrZ"TOTAL SEEKS = ";SEKCNT] y : DISPLAY LAST HEADERb v : DISPLAY PROGRAM STATUSۯlSTATUS CSTATS : GET STATUSESv  : IDENTIFY STATUSES X : DISPLAY STATUSES. : BACK TO MENUY *** DISPLAY OUTPUT SECTOR BUFFER ***e( )" * * * OUTPUT SECTOR BUFFER * * * "" "ɰ"DUMP IN HEX (H), OR DECIMAL (D) ";B$ްĐBUFPTR AOSBUFFؐ }␎ : BACK TO MENU(쐏 *** DISPLAY INPUT SECTOR BUFFER ***4( )c " * * * INPUT SECTOR BUFFER * * * "l" ""DUMP IN HEX (H), OR DECIMAL (D) ";B$(BUFPTR AISBUFF< }̱F : BACK TO MENUR BUFFER * * * "l" "