***  super-utility plus  ***
***   system addresses   ***


rESTART vECTORS (SEE LABELS FOR DETAILS):
rst  8         display
rst  10h       getstr
rst  18h       ascii
rst  20h       hexcv
rst  28h       dlon
rst  30h       dloff
rst  38h       task (INTERRUPT SERVICE)
<
drives:
     f> # DRIVES IN THE SYSTEM
mode:
     f> mODIFY MODE NUMBER BASE
     0=hex, 1=dec, 2=bin, 3=oct, 4=asc
sector:
     f> sECTOR SAVE AREA, USED FOR lAST COMMAND
trak:
     f> tRACK SAVE AREA, USED FOR lAST COMMAND
cursor:
     f> cURRENT CURSOR ADDRESS ON VIDEO
eofb:
     f> eND OF FILE BYTE SAVE AREA, USED IN fILES
eofs:
     f> eND OF FILE SECTOR SAVE, USED IN fILES
eoas:
     f> eND OF ALLOCATION SECTOR, USED IN fILES
freeg:
     f> fREE gRANS SAVE, USED IN pURGE, fILES
cgrans:
     f> cOPY gRANS, USED IN fILE cOPY
address:
     f> cURRENT ADDRESS IN mEMORY mODIFY
defaddr:
     f> dEFAULT ADDRESS IN mEMORY mODIFY IF <enter> PRESSED ALONE
fmtbuff:
     f> aDDRESS OF BUFFER TO BE USED WHILE BUILDING fORMAT tRACK
midbuff:
     f> aDDRESS OF MIDDLE OF BUFFER AREA, USED IN eXCHANGE sECTORS
dircount:
     f> hOLDS NUMBER OF SECTORS IN LAST DIRECTORY READ INTO MEMORY
dirpage:
     f> cURRENT PAGE OF DIRECTORY BEING DISPLAYED IN kILL/rESTORE FILES
true:
     f> tRUE TRACK AS READ FROM THE DISK, USED IN dISPLAY sECTORS
type:
     f> uSED BY mODIFY TO DETERMINE WHERE DATA CAME FROM
     1=dISK sECTOR, 2=mEMORY, 3=fILE sECTOR
topmem:
     f> tOP OF MEMORY.  fIRST UNUSABLE BYTE.  mUST BE AN EVEN PAGE. 0000=48k
numtype:
     f> bASE OF NUMBER AS ENTERED FROM KEYBOARD INPUT
     2=bINARY, 8=oCTAL, 10=dECIMAL, 16=hEX
result:
     f> nON-MASKED STATUS OF LAST i/o FROM dISK
lastb:
     f> bYTE TO lOCATE IN mODIFY MODE, ALSO SAVED FOR lAST
dvrtbl:
     f> 8 BYTES TABLE INDICATING WHICH DRIVES CURRENT ROUTINE IS TO USE
     0=iNACTIVE, 1=aCTIVE
tracks:
     f> 8 BYTE TABLE OF TRACK COUNTS OF DRIVES
dirtrk:
     f> 8 BYTE TABLE OF DIRECTORY TRACK LOCATIONS ON DRIVES
types:
     f> 8 BYTE TABLE OF DRIVE TYPES
     bIT 7 * 0 = 1 sECOND mOTOR ON DELAY, 1 = 1/2 sECOND
     bIT 6 * 0 = sIDE 0 OF dISK, 1 = sIDE 1 OF dISK
     bIT 5 * 0 = sINGLE dENSITY, 1 = dOUBLE dENSITY
     bIT 4 * 0 = not dOUBLEdos, 1 = aDJUST TO dOUBLEdos, nd80 dd
     bIT 3 * 0 = tRACK 0 sINGLE dENSITY, 1 = tRACK 0 dOUBLE dENSITY
     bIT 2 * 0 = uSE a9h dIRECTORY, 1 = uSE abh dIRECTORY (ldos)
     bIT 1,0 = dRIVE sTEP sPEED
               0=6MS, 1=12MS, 2=20MS, 3=40MS
track:
     f> 8 BYTE TABLE HOLDING CURRENT LOCATION OF DRIVE HEADS
     IF THE BYTE IS 0, THEN A restore IS FORCED BEFORE seek
savedrv:
     f> 24 BYTE TABLE TO SAVE tracks, dirtrk, AND types
     USED IF sAVE cONFIGURATION IS on TO RESTORE VALUES
sdrive:
     f> hOLDS source dRIVE
ddrive:
     f> hOLDS destination dRIVE
keybrd:
     f> 7 BYTE MASK AREA FOR KEYBOARD INPUT
mflag:
     f> fLAG INDICATING IF DISK MOUNTS ARE TO BE PROMPTED
count:
     f> tEMPORARY cOUNT sAVER
string:
     f> 70 bYTES FOR kEYBOARD iNPUT
input:
     f> 6 bYTES TO SAVE i/d aDDRESS mARKS READ FROM DISK
stack:
     f> 144 BYTES FOR sTACK AREA.  pLENTY LEFT FOR USER ROUTINES
filename:
     f> 24 BYTES TO HOLD UP TO 2 fILENAMES, WITH TERMINATORS
     fILENAMES PLACED HERE ARE lset AS THEY WOULD APPEAR IN A DIRECTORY
password:
     f> 8 BYTES TO HOLD FILENAME IF SPECIFIED FROM KEYBOARD INPUT
display:
     f> dISPLAY DRIVER, DISPLAYS BYTES FOLLOWING A CALL (OR rst 8)
     sPECIAL BYTES:
     7 = cLEAR sCREEN
     8 = bACKSPACE
     9 = cENTER cURSOR ON sCREEN (OR START NEXT LINE IF PAST CENTER)
     10= lINEFEED (DOESN'T CLEAR NEXT LINE)
     11= uPWARD LINEFEED (DOESN'T CLEAR THE LINE)
     13= lINEFEED (DOESN'T CLEAR NEXT LINE)
     29= mOVE CURSOR TO BEGINNING OF CURRENT LINE (DON'T CLEAR)
     30= mOVE CURSOR TO BEGINNING OF LINE AND CLEAR IT
     aLL OTHER BYTES BELOW 32 ARE IGNORED.  lOWER-CASE IS AUTOMATIC
     bYTES WILL ALSO BE SENT TO THE PRINTER IF dual IS on
     e> bYTES TO BE DISPLAYED MUST IMMEDIATELY FOLLOW THE CALL (OR rst 8)
     x> 0 IS THE TERMINATOR, AND CONTROL WILL BE PASSED TO BYTE FOLLOWING IT
     r> all REGISTERS and fLAGS ARE PRESERVED
cls:
     f> cLEAR THE VIDEO SCREEN TO ALL SPACES
     e> nONE
     x> hl = (cURSOR) = 3c00h
     r> af, hl dESTORYED
getstr:
     f> gET A STRING FROM kEYBOARD (ALSO rst 10h)
     e> b = MAXIMUM LENGTH OF INPUT (MAXIMUM 70 CHARS)
     x> c = MAXIMUM ALLOWED LENGTH (b REGISTER FROM CALL)
        b = ACTUAL NUMBER OF CHARACTERS INPUT
       hl => INPUT STRING (MAX 70 CHARS)
        a = FIRST CHARACTER INPUT IF ANY
        z FLAG SET IF no CHARACTERS INPUT (enter PRESSED ALONE)
       sHIFT 0 TOGGLE UPPER/LOWER CASE LOCK
       sHIFT clear ACTIVATES SCREEN PRINTER
       sHIFT enter TOGGLES dual MODE
       lEFT ARROW IS BACKSPACE KEY
       sHIFT LEFT ARROW, OR clear RESTARTS INPUT LINE
     r> de, AND ALL prime REGISTERS ARE PRESERVED
key:
     f> sTROBE KEYBOARD FOR ANY INPUT, REPEAT IS AUTOMATIC
     e> nONE
     x> a = INPUT KEY (IN ASCII)
        z SET IF no KEYS PRESSED
        a = 0 IF NO KEY PRESSED
     r> all REGISTERS PRESERVED EXCEPT af
kiflag:
     f> 0 = KEYBOARD REVERSAL (LIKE rom), 1 = NORMAL TYPEWRITER KEYBOARD
screenpt:
     f> sEND CONTENTS OF vIDEO sCREEN TO THE lINEPRINTER
     e> nONE
     r> all REGISTERS USED, prime REGISTERS ARE PRESERVED
prtflag:
     f> bIT 7 * 0 = no GRAPHICS, RESET 7 ON PRINT BYTE, 1 = PRINT GRAPHICS
        bIT 6 * 0 = cONVERT LOWER CASE TO UPPER, 1 = dON'T ADJUST
        bIT 5 * 0 = nO ADJUST, 1 = aDJUST >=80h TO BYTE +20h FOR mx80'S
        bIT 4 * 0 = pARALLEL OUTPUT, 1 = trs232 SERIAL OUTPUT
        bIT 3 * 0 = NO LINEFEEDS, 1 = PRINT LINEFEED (10) AFTER c/r (13)
get:
     f> uNSTACKER (POPS bc, de, hl, AND or'S THE aCCUMULATOR)
keytable:
     f> lOOKUP TABLE FOR KEYBOARD INPUT
               +0 = eNTER
               +1 = sH eNTER
               +2 = cLEAR
               +3 = sH cLEAR
               +4 = bREAK
               +5 = sH bREAK
               +6 = u aRROW
               +7 = sH u aRROW
               +8 = d aRROW
               +9 = sH d aRROW
               +10= l aRROW
               +11= sH l aRROW
               +12= r aRROW
               +13= sH r aRROW
               +14= sPACE
               +15= sH sPACE
ckdual:
     f> cALLED BY display, CHECKS TO SEE IF dual ACTIVE
ifprintr:
     f> cALLED BY task, INTERRUPT SERVICES PRINTER SPOOLER
pout:
     f> sENDS BYTE TO PRINTER (ACTUALLY PUTS IN BUFFER FOR SPOOLER)
xread:
     f> cALLS readns, BUT FIRST TOGGLES ibm TYPE (ibm TO non-ibm ETC)
readns:
     f> rEAD 1 DISK SECTOR, BUT seek IS not PERFORMED.
        (37edh) MUST BE = TO d IF IT IS TO BE SUCCESSFUL
        sEE read FOR SPECIFICS
writens:
     f> sEE readns FOR DETAIL, BUT WILL EXECUTE write
tread:
     f> rEAD 1 DISK SECTOR (read), BUT REVERSE DENSITY FIRST
read:
     f> rEAD 1 DISK SECTOR
     e> d = tRACK TO READ
        e = sECTOR TO READ
       bc = mEMORY BUFFER OF WHERE TO LOAD DATA
     (drive) MUST BE VALID (SEE select)
     (rdtype) MUST BE THE BYTE TO BE USED FOR READ (NORMALLY 88h)
     80h = non-ibm TYPE SECTOR READ
     88h = ibm TYPE SECTOR READ
     e4h = tRACK READ WITH NO SYNC
     e5h = tRACK READ WITH SYNC TO ADDRESS MARKS
     c0h = rEAD id MARKS
     iF THE DRIVE IS SET AS dOUBLE dENSITY AND dOUBLEdos, nd80 dd, THEN THE          TRACK, SECTOR (de) WILL AUTOMATICALLY BE ADJUST prior TO THE READ, AND          RESTORED BACK TO IT'S ENTRY VALUE ON EXIT.  pLEASE NOTE THAT YOU WILL not       ACTUALLY READ THE SECTOR YOU SPECIFY, BUT THE relative SECTOR.  yOU WILL        not BE ABLE TO READ TRACK 0 WITH THE dOUBLEdos TYPE SPECIFIED
     2 ATTEMPTS WILL BE MADE IN THE CASE OF AN ERROR ON THE FIRST TRY
     x> z FLAG SET IF READ WAS SUCCESSFUL
        iF nz, THEN A CALL TO badrd MAY BE MADE TO PROMPT FOR A RETRY OR SKIP
        bc = LAST BYTE +1 IF READ IS ok (z FLAG SET), ELSE NOT CHANGED
        (wrtype) IS SET TO write THE SECTOR AS THE SAME TYPE (ibm AND dam)
        tHIS VALUE IS ALSO RETURNED IN a'
     r> de MAINTAINED, hl IS DESTROYED, a = ERROR BITS FROM i/o
        a CALL TO showst WILL DISPLAY THE ERROR TYPE IF nz
        aLTERNATE SET IS PRESERVED except a'
twrite:
     f> sEE tread, EXCEPT THAT A wRITE IS PERFORMED
write:
     f> sAME CONDITIONS AS read, EXCEPT (wrtype) MUST BE VALID FOR THE TYPE OF 
     WRITE TO BE PERFORMED.  tHIS VALUE IS SET FROM read TO PRODUCE THE SAME
     TYPE OF SECTOR.  a read THEN write WILL PUT IT BACK EXACTLY WITH THE
     SAME TYPE OF id MARKS.  aFTER THE read, DECREMENT b TO POINT TO THE
     DATA.  tHIS WILL ALSO POSITION FOR A write
flipden:
     f> rEVERSE THE DENSITY BIT FOR THE CURRENT (drive).  (bIT 5 FROM types)
rdtype:
     f> CURRENT TYPE OF read TO BE PERFORMED
wrtype:
     f> CURRENT TYPE OF write TO BE PERFORMED
seek:
     f> mOVE THE HEAD OF (drive) TO THE DESIRED TRACK SPECIFIED BY d
     e> d = DESIRED TRACK
     x> rETURN z IF ok, ELSE nz = SEEK ERROR
     r> a USED ONLY
select:
     f> tURN ON (drive)
     e> (drive) MUST BE VALID FOR CORRECT DRIVE
        1=dRIVE 0, 2=1, 4=2, 8=3, 16=4, 32=5, 64=6, 128=7
     x> z = ok, nz = not ready
        iF MOTOR IS ALREADY ON, NO DELAY, ELSE A DELAY SPECIFIED BY BIT 7
        OF types WILL BE PERFORMED BEFORE RETURNING
        iF BIT 6 OF types IS SET (SIDE 1), THEN BIT 3 OF (drive) WILL BE SET
drive:
     f> bIT PATTERN USED IN DETERMINING WHICH DRIVE IS TO BE USED FOR i/o
        sEE select FOR THE PROPER SETTINGS
