           DEF     SFIRST,SLAST,SLOAD

SCREEN     MACRO
           BLWP    @DSPTXT
           DATA    %1
           ENDM

DISPLAY    MACRO
           DATA    %1*40+%2,%3,%4
           ENDM

SFIRST     EQU     $
SLOAD      B       @MAIN
           TEXT    'V1.01'
           EVEN

LINE23     EQU     23*40

CATBUF     EQU     >2000           ;TEMP BUFF FOR CATALOG  >2000 TO >29EC
BUF512     EQU     CATBUF
SCNBUF     EQU     >2B00           ; "     "   "   "
SCNBUFL    EQU     800

VDSK1      EQU     >3FFA
VDSK2      EQU     >3FFC
VDSK3      EQU     >3FFE

PABBUF     EQU     >1000           ;VDP RAM BUFFER  VDP RAM
PNTR       EQU     >8356           ;POINTER FOR PAB NAMELENGTH
PAB        EQU     >0F80           ;PAB GOES HERE
PAB3       EQU     >1E50
KCODE      EQU     >8375           ;KSCAN RETURNS CHAR HERE
STATUS     EQU     >837C           ;GPL STATUS BYTE LOCATION
GPLWS      EQU     >83E0           ;GPL WORKSPACE REG
FAC        EQU     >834A           ;FLOATING POINT ACCUMULATOR
DSKERR     EQU     >8350           ;VOL. ERROR RETURNED HERE

SRCST0     EQU     >FA00           ;SOURCE DRIVE SECTOR 0 (BIT MAP)
SRCST1     EQU     >FB00           ;   "     "     "    1 (LINK MAP)
SRCST2     EQU     >FC00           ;   "     "     "    X (DIRECTORY ENTRY)
TMPSCT     EQU     >F900           ;TEMP SECTOR BUFFER
DSTST0     EQU     >FD00           ;DESTINATION DRIVE SECTOR 0
DSTST1     EQU     >FE00           ;   "          "     "    1
DSTST2     EQU     >FF00           ;   "          "     "    X

MYREG1     EQU     >8300           ;HIGH SPEED WS REG
MYREG2     EQU     >8320           ;  "    "    "  "
MYREG3     EQU     >8380

MYREG4     BSS     32              ;*  >83A0 LOW SPEED WS REG
MYREG5     BSS     32              ;     "    "   "  "
MYREG6     BSS     32              ;WS REG

TBUF       EQU     >8340           ;10 CHAR BUFFER

RDSECX     DATA    MYREG4,$RDSECX
WRSECX     DATA    MYREG4,$WRSECX
RDSECT     DATA    MYREG4,$RDSECT  ;VECTOR TABLE - READ SECTOR FROM VOL.
WRSECT     DATA    MYREG4,$WRSECT  ;   "     "     WRITE "
DISP       DATA    MYREG4,DISENT   ;   "     "     CONVERT/SCREEN ASCII NUMBERS
CLRSCN     DATA    MYREG2,CLSCRN   ;   "     "     CLEAR SCREEN
CLREOS     DATA    MYREG2,CLHALF   ;   "     "     CLEAR LOWER HALF SCREEN
MOVSCT     DATA    MYREG2,$MOVSCT  ;   "     "     MOVE SECTOR FROM VDP TO CPU
MOVVDP     DATA    MYREG2,MOVEVD   ;   "     "     MOVE SECTOR FROM CPU TO VDP
FINDHI     DATA    MYREG2,FINDHH   ;   "     "     FIND FREE SECTOR IN BM RANGE(32-MAX)
FINDLO     DATA    MYREG2,FINDLL   ;   "     "     FIND FREE SECTOR IN BM RANGE(0-MAX)
CLRBUF     DATA    MYREG2,CLRBF    ;   "     "     CLEAR SECTOR BUFFER
DSPTXT     DATA    MYREG2,DSTEXT   ;   "     "     SCREEN TEXT ROUTINE
GTSKEY     DATA    MYREG2,GSKEY    ;   "     "     GET SINGLE KEY FROM SCREEN LOCATION
GTMKEY     DATA    MYREG2,GMKEY    ;   "     "     GET MULTIPLE KEY
INITB      DATA    MYREG5,INITBB
INITC      DATA    MYREG5,INTDSK

PDATA1     DATA    >1000,>1000,>5000,>0000,>0001,>1000,>9800,>8C02
           DATA    >00E0,>000E,>0106,>00F5,>0A0D,>2020,>2A2A,>2A44

CPNTR      DATA    0               ;MOVABLE POINTER FOR CATBUF
SECTOR     DATA    0               ;SECTOR POINTER BUFFER
SCNEND     DATA    0               ;LAST BYTE IN SCREEN TABLE
FILCNT     DATA    0               ;NUMBER OF FILES COUNTER
KEYSW      DATA    0               ;FUNCTION TABLE SWITCH FOR GTSKEY

SECCNT     DATA    >1000           ;SECTOR COUNT IF DSDD
DSKCNT     DATA    >02D0           ;SECTOR COUNT IF SSDD
BMCNT      DATA    90              ;BIT MAP COUNT 80 OR 90

BLKLNK     DATA    0               ;BLOCK LINK POINTER FOR DIRECTORY
STRSCT     DATA    0               ;START SECTOR
OFFSET     DATA    0               ;OFFSET POINTER

DSTSTR     DATA    0               ;DEST VOL. START SECTOR
DSTOFF     DATA    0               ;DEST VOL. SECTOR OFFSET
DSTBLK     DATA    0               ;DEST VOL. BLOCK LINK ADDR

TEMPR0     DATA    0               ;TEMP REG 0
TEMPR1     DATA    0               ;TEMP REG 1
TEMPR2     DATA    0               ;TEMP REG 2
TEMPR3     DATA    0               ;TEMP REG 3

D08        DATA    8               ;8 USED TO CALC BIT MAP ENTRY
DFMT       DATA    >0111           ;DEFAULT FOR INIT

VARMSK     DATA    >8000           ;FILE MASK "VARIABLE TYPE"
INTMSK     DATA    >0200           ;FILE MASK "INTERNAL TYPE"
PRGMSK     DATA    >0100           ;FILE MASK "PROGRAM IMAGE"
PROMSK     DATA    >0800           ;FILE MASK "PROTECTED FILE"
KEYMSK     DATA    >2000           ;KEY PRESSED MASK

D40        DATA    >0028           ;DECIMAL 40
D400       DATA    400             ;DECIMAL 400
D20        DATA    20              ;USED TO CALCULATE NUMBER OF SCREEN PAGES
D800       DATA    800             ;  "   "      "    CATBUF MOVABLE POINTER
DTEN       DATA    10              ;  "   "      "    IN DISP ROUTINE
TD         DATA    300             ;CURSOR FLASH TIME DELAY

FUNCT      DATA    CATPRNT         ;AID   FCTN 7        KEYSW = "0"
           DATA    KZLP2           ;CLEAR FCTN 4
           DATA    KZLP2           ;DEL   FCTN 1
           DATA    KZLP2           ;INS   FCTN 2
           DATA    QUIT            ;QUIT  FCTN =
FCT8       DATA    MGR             ;REDO  FCTN 8
           DATA    LSTDVC          ;ERASE FCTN 3
           DATA    KZLP2           ;LEFT  FCTN S
           DATA    KZLP2           ;RIGHT FCTN D
           DATA    KZLP2           ;DOWN  FCTN X
           DATA    KZLP2           ;UP    FCTN E
           DATA    KZLP2           ;PROCD FCTN 6
FCTE       DATA    KZLP5           ;ENTER ENTER
           DATA    MGR             ;BEGIN FCTN 5
FCT9       DATA    MGR             ;BACK  FCTN 9

FUNCT2     DATA    FLDST           ;AID   FCTN 7        KEYSW = "1"
           DATA    FLDST           ;CLEAR FCTN 4
           DATA    DELCHR          ;DEL   FCTN 1
           DATA    INSCHR          ;INS   FCTN 2
           DATA    QUIT            ;QUIT  FCTN =
           DATA    CAT             ;REDO  FCTN 8
           DATA    FLDST           ;ERASE FCTN 3
           DATA    MOVLFT          ;LEFT  FCTN S
           DATA    MOVRGT          ;RIGHT FCTN D
           DATA    MOVDWN          ;DOWN  FCTN X
           DATA    MOVUP           ;UP    FCTN E
           DATA    EXCMSG          ;PROCD FCTN 6
           DATA    MOVCR           ;ENTER ENTER
           DATA    MGR             ;BEGIN FCTN 5
           DATA    CAT             ;BACK  FCTN 9

ONE        BYTE    1               ;VAL = 1
TWO        BYTE    2               ;VAL = 2
H03        BYTE    3               ;VAL = 3

TRACKS     BYTE    0

CURSOR     BYTE    >1E             ;CURSOR CHARACTER

CTRLE      BYTE    133             ;PAGE UP - KEY BOARD CODES
CTRLX      BYTE    152             ;PAGE DOWN

ASCLO      BYTE    >20             ;LESS THAN   >20 =FCTN KEY
ASCHI      BYTE    >7F             ;GREATER THAN >7F=CRTL KEY

RDO        BYTE    6               ;REDO

CR         BYTE    >0D             ;CARRIAGE RETURN
BS         BYTE    >08             ;BACKSPACE
BK         BYTE    >0F             ;BACK
QT         BYTE    >05             ;QUIT

H30        BYTE    >30             ;ASCII OFFSET
ASC_1       BYTE    >31             ;ASCII 1
ATWO       BYTE    >32             ;ASCII 2
ATHREE     BYTE    >33             ;ASCII 3
AFOUR      BYTE    >34             ;ASCII 4
AFIVE      BYTE    >35             ;ASCII 5
ASIX       BYTE    >36             ;ASCII 6
ASEV       BYTE    >37             ;ASCII 7
AEIG       BYTE    >38             ;ASCII 8

SRCDRV     BYTE    >01             ;SOURCE DRIVE BYTE
DSTDRV     BYTE    >02             ;DESTINATION DRIVE BYTE
OPDRV      BYTE    1               ;OPERATION DRIVE
MGRLN      BYTE    4               ;LENGTH OF 1ST LOAD FILE

VERIFY?    BYTE    0               ;VERIFY FLAG

PGCNT      BYTE    0               ;SCREEN PAGE COUNTER
DSPAGE     BYTE    0               ;SCREEN PAGE MARKER
FIELD      BYTE    0               ;FIELD POINTER
MODE       BYTE    0               ;FLAG FOR VOL. ERRORS

TBYTE1     BYTE    0               ;TEMP BYTE BUFFER
TBYTE2     BYTE    0               ; "    "     "
TPFIL      BYTE    0               ;FLAG FOR TYPE/PRINT FILE

ASC_U      TEXT    'U'             ;P FIELD
YES        TEXT    'Y'
ASC_S      BYTE    'S'
ASC_K      BYTE    'K'
ASC_0      BYTE    '0'
ASC_9      BYTE    '9'
STAR       TEXT    '*'

TXTPRG     TEXT    'PROGRAM'       ;TYPE FIELD
TXTDIS     TEXT    'DIS/'          ; "     "
TXTINT     TEXT    'INT/'          ; "     "
TXTVAR     TEXT    'VAR'           ; "     "
TXTFIX     TEXT    'FIX'           ; "     "

TXTCA0     TEXT    'Vol.Name:'
;                   0000000000111111111122222222223333333333
;                   0123456789012345678901234567890123456789
TXTCA1     TEXT    'Name:   ##########+  Free #### Used ####'
TXTCA2     TEXT    'CMD Filename   Size Type/No.### P  <1/1>'
TXTCA3     TEXT    '--- ---------- ---- ----------- -       '
TXTCA4     TEXT    'Building File Directory'
TXTCA5     TEXT    'CTRL-E:Page-Up CTRL-X:Page Down'
TXTCA5L    EQU     $-TXTCA5
TXTCA5C    EQU     40-TXTCA5L/2

TXTCA6     TEXT    '-= F I L E  U T I L I T I E S =-'
TXTCA6L    EQU     $-TXTCA6
TXTCA6C    EQU     40-TXTCA6L/2
TXTCA8     TEXT    '1. Copy/Move/Delete/'
TXTC8A     TEXT    'Type/Print'
TXTCA9     TEXT    'Prot/Unprot/Rename'
TXTCAA     TEXT    'Execute File Commands (Y/N)?    '

TXTCAB     TEXT    'Volume No.:'
TXTCAC     TEXT    'Vol. Name :'
TXTCAD     TEXT    'Free      Used'
TXTCAE     TEXT    '2. Recover File'
TXTI1      TEXT    '3. RUN IMAGE PROGRAM...XB VDP'
TXTI2      TEXT    '4. RUN IMAGE PROGRAM..E/A VDP'
;TXTCAF     TEXT    '5. Find file'

VOLNBR     BSS     6

TXTPLS     TEXT    '+'
TXTMIN     TEXT    '-'

TXTFD1     EQU     $               ;COMMAND FIELD DEFAULTS
ASC_N      TEXT    'N'             ;DO NOTHING
ASC_C      TEXT    'C'             ;COPY FILE
ASC_M      TEXT    'M'             ;MOVE FILE
ASC_D      TEXT    'D'             ;DELETE FILE
ASC_P      TEXT    'P'             ;PRINT FILE
ASC_T      TEXT    'T'             ;TYPE FILE

TXTFD3     TEXT    'PUTP'          ;PROTECTION FIELD DEFAULTS

TXTFRM     TEXT    'Master'        ;EXECUTE COPY MSGS
TXTTO      TEXT    'Backup'
TXTVOL     TEXT    'Volume# :'
TXTSCT     TEXT    'Sector     '

SPACES     TEXT    '                                         '  ;40 SPACES BLANK LINE

TXTIN0     TEXT    'Format Volume (Y/N)?'
TXTIN0L    EQU     $-TXTIN0
TXTIN4     TEXT    'Verify  Y/N :   <    >'
TXTIN5     TEXT    'Not Formatted'
TXTIN5L    EQU     $-TXTIN5
TXTIN6     TEXT    'Up Arrow Active'

TXTDSK     TEXT    'DSK ('
TXTCM1     TEXT    'UNPROTECTING : '
TXTCM2     TEXT    'DELETE FILE : '
TXTCM3     TEXT    'RENAME FILE : '
TXTCM4     TEXT    'COPY FILE : '
TXTCM5     TEXT    'PROTECTING : '

TXTEMP     TEXT    'VOLUME IS BLANK. PRESS ANY KEY.'
TXTEMPL    EQU     $-TXTEMP

TXTER1     TEXT    ' V O L U M E   E R R O R '
TXTER1L    EQU     $-TXTER1
TXTER1C    EQU     40-TXTER1L/2
TXTER2     TEXT    '   No Volume in Drive    '
TXTER3     TEXT    '  Volume Write Protected '
TXTER4     TEXT    '  Volume Not Initialized '
TXTER5     TEXT    '       Device Error      '

TXTCMP     TEXT    'COMMAND(S)  COMPLETED.  PRESS ANY KEY.'
TXTLRG     TEXT    'File too large for Backup Vol.'
TXTFUL     TEXT    'Backup Vol. Full. Press any Key.'
TXTPRO     TEXT    'DUPLICATE FILE WRITE PROTECTED.'

TXTMM1     TEXT    '--== C F 7 +   M A N A G E R ==--'
TXTMM1L    EQU     $-TXTMM1
TXTMM1C    EQU     40-TXTMM1L/2
TXTMM2     TEXT    'Adapted from B.Caron & R.Romans''s'
TXTMM2L    EQU     $-TXTMM2
TXTMM2C    EQU     40-TXTMM2L/2
TXTMM3     TEXT    'Disk Manager 1000 3.5'
TXTMM3L    EQU     $-TXTMM3
TXTMM3C    EQU     40-TXTMM3L/2
TXTMM4     TEXT    'Select Option:'
TXTMM4L    EQU     $-TXTMM4
TXTMM5     TEXT    '1. File Utilities'
TXTMM6     TEXT    '2. Volume Utilities'
TXTMM6L    EQU     $-TXTMM6
TXTMM7     TEXT    '3. Misc Utilities'

TXTRC1     TEXT    'Recover File on Volume:'
TXTRC1L    EQU     $-TXTRC1
TXTRC2     TEXT    'Enter Name of File:'
TXTRC3     TEXT    'SEARCHING VOLUME'
TXTRC3L    EQU     $-TXTRC3
TXTRC3C    EQU     40-TXTRC3L/2
TXTRC4     TEXT    'FILE NOT FOUND  '
TXTRC4L    EQU     $-TXTRC4
TXTRC5     TEXT    'FILE RECOVERED  '
TXTRC5L    EQU     $-TXTRC5
TXTRC6     TEXT    'FILE HAS BEEN OVER WRITTEN'
TXTRC7     TEXT    'RE-BUILDING LOST FILE'

TXTDS1     TEXT    '-= V O L U M E   U T I L I T I E S =-'
TXTDS1L    EQU     $-TXTDS1
TXTDS1C    EQU     40-TXTDS1L/2
TXTDS2     TEXT    '1. Catalog     4. Rename'
TXTDS2L    EQU     $-TXTDS2
TXTDS3     TEXT    '2. Backup      5. Format'
TXTDS3L    EQU     $-TXTDS3
TXTDS4     TEXT    '3. Erase       6. List'
TXTDS4L    EQU     $-TXTDS4

TXTDS3A    TEXT    'Backup Volume'
TXTDS3AL   EQU     $-TXTDS3A
TXTDS3AC   EQU     40-TXTDS3AL/2

TXTRE1     TEXT    'New Vol. Name :'
TXTRE1L    EQU     $-TXTRE1

TXTCD1     TEXT    'Read  Errors'
TXTCD2     TEXT    'Write Errors'
TXTCD3     TEXT    'PRESS ANY KEY TO CONTINUE.'
TXTCD3L    EQU     $-TXTCD3
TXTCD3C    EQU     40-TXTCD3L/2
TXTCD4     TEXT    'EOF'
TXTCD5     TEXT    'Format another (Y/N)?'
TXTCD5L    EQU     $-TXTCD5
TXTCD5C    EQU     40-TXTCD5L/2

TXTCT1     TEXT    'CATALOG VOLUME'
TXTCT1L    EQU     $-TXTCT1
TXTCT1C    EQU     40-TXTCT1L/2

TXTSWP     TEXT    'Erase Vol. (Y/N)?'
TXTBX1     TEXT    'Select Next Vol.. Press ENTER.'
TXTBX2     TEXT    '    Initializing Next Vol.    '

TXTMS1     TEXT    '1. Install Vol. Protection'
TXTMS2     TEXT    '2. Remove Vol. Protection'
TXTMS3     TEXT    '3. Remove XB Protection'
TXTMS4     TEXT    '1. Backup using bit-map   '
TXTMS4L    EQU     $-TXTMS4
TXTMS5     TEXT    '2. Backup sector-by-sector'
TXTMS5L    EQU     $-TXTMS5
TXTMSB     TEXT    '4. Change Foregnd Color'
TXTMSC     TEXT    '5. Change Backgnd color'
TXTMSD     TEXT    '6. CF Info/geometry'
TXTMS6     TEXT    '-= M I S C  U T I L I T I E S =-'
TXTMS6L    EQU     $-TXTMS6
TXTMS6C    EQU     40-TXTMS6L/2
TXTMS7     TEXT    'XB Program on drive :'
TXTMS8     TEXT    'Enter XB Program name:'
TXTMS9     TEXT    'Program is Unprotected'
TXTMSA     TEXT    'Not in Program Format'

TXTDSA     EQU     TXTMS4+3
TXTDSAL    EQU     TXTMS4L-3
TXTDSB     EQU     TXTMS5+3
TXTDSBL    EQU     TXTMS5-3

TXTDS6     TEXT    'WARNING: Backup Vol. will be erased.'
TXTDS6L    EQU     $-TXTDS6


TXTTFC     TEXT    'Total Files to Copy:'
TXTTSC     TEXT    'Total Size of Files:'

TXTMGR     TEXT    'MGR1      '     ;1ST FILENAME OF DM1000 PROGRAM

TXTPP1     TEXT    'Enter List Device :'
TXTPP2     TEXT    'Send Control Codes (Y/N):'
TXTPP3     TEXT    'Enter Control Codes: Ex. 27 83 01 *'
TXTPP4     TEXT    'Save to Vol. (Y/N):'
TXTPP6     TEXT    'Press ENTER.'
TXTPP6L    EQU     $-TXTPP6
TXTPP6C    EQU     40-TXTPP6L/2

TXTABT     TEXT    'USER  HALTED  I/O '

TXTCP1     TEXT    ' CHECKING FORMAT '
TXTCP2     TEXT    'INITIALIZING VOL.'

TXTCC      TEXT    'COPY'
TXTMM      TEXT    'MOVE'
TXTD       TEXT    'DELETE'
           EVEN

QUIT       CLR     @STATUS         ;CLEAR STATUS BYTE
           LIMI    2
           LWPI    GPLWS
           B       @>0000          ;EXIT PROGRAM

;----------------------------------------------------------------------
;
;  FILE UTILITIES
;
;----------------------------------------------------------------------
CAT        LWPI    MYREG1
           BLWP    @CLRSCN

           LI      R0,CAT
           MOV     R0,@FCT8        ;REDO=CAT
           MOV     R0,@CKT8        ;REDO=CAT

           LI      R0,FILE
           MOV     R0,@FCT9        ;BACK=FILE
           MOV     R0,@CKT9        ;BACK=FILE

           CLR     @DSTBLK         ;FLAG=0 CALLED FROM FILE UTILITY

           SCREEN  6
           DISPLAY 1,TXTCA6C,TXTCA6,TXTCA6L  ;'File Utilities'
           DISPLAY 5,8,TXTCA8,30        ;'Copy/Move/Delete/Type/Print'
           DISPLAY 6,11,TXTCA9,18       ;'Prot/Unprot/Rename'
           DISPLAY 13,3,TXTVOL,9        ;'Volume #:'
           DISPLAY 14,3,TXTCA0,9        ;'Vol.name:'
           DISPLAY 15,3,TXTCAD,14       ;'Free   Used'

FILE10     BL      @GETVOL         ;GET VOLUME#
           DATA    40*13+13,VDSK1,FILE10
           LI      R1,>0100
           MOVB    R1,@SRCDRV      ;SET DRIVE NO.
           MOVB    R1,@OPDRV       ;SET OPERATION DRIVE
           CLR     @SECTOR         ;SECTOR=0
           BLWP    @RDSECX         ;GET VIB FROM VOLUME
           BLWP    @MOVSCT         ;MOVE SECTOR TO CPU RAM
           DATA    SRCST0          ;SOURCE SECTOR 0

           SCREEN  1               ;DISPLAY VOLUME NAME
           DISPLAY 14,13,SRCST0,10

           BL      @CALCBM         ;CALC BIT MAP
           DATA    SRCST0          ;BUFFER ADDR

FILE20     MOV     @TEMPR1,R0      ;SCREEN FREE SECTORS
           BLWP    @DISP
           DATA    15*40+11

           MOV     @TEMPR2,R0      ;SCREEN USED SECTORS
           BLWP    @DISP
           DATA    15*40+21

           LI      R0,14*40+13     ;SAVE VOL.NAME
           LI      R1,TXTCA1+8
           LI      R2,10
           BLWP    @VMBR

           LI      R0,15*40+3      ;SAVE FREE/USED
           LI      R1,TXTCA1+21
           LI      R2,19
           BLWP    @VMBR

           CB      @SRCST0+>10,@TXTFD3  ;IS VOL. PROTECTED
           JNE     FILE30
           MOVB    @TXTPLS,@TXTCA1+18
           JMP     FILE40
FILE30     MOVB    @TXTMIN,@TXTCA1+18

FILE40     SCREEN  1
           DISPLAY 17,3,TXTCA4,23  ;'Building File Directory'

           INC     @SECTOR         ;SECTOR=1            * GET LINK MAP
           BLWP    @RDSECX         ;GET SECTOR
           BLWP    @MOVSCT
           DATA    SRCST1

;
;    CATBUF FORMAT - 20 bytes per directory entry
;
;     name  lm    ff    size     rc r#
;     -----------------------------------
;    |00-09|10-11|12|13|14-15|16|17|18|19|
;     -----------------------------------
;
           LI      R6,SRCST1       ;LINK MAP ADDR
           LI      R1,CATBUF       ;CATALOG BUFFER ADDR
           LI      R2,20
           CLR     R7              ;FILE COUNTER

FILE50     MOV     *R6+,R3         ;GET LM POINTER AND LOOP HERE
           JEQ     FILE60          ;..DIRECTORY IS FINISHED

           INC     R7              ;INC FILE COUNTER

           MOV     R3,@SECTOR      ;GET DIRECTORY ENTRY
           BLWP    @RDSECX

           LI      R0,PABBUF
           BLWP    @VMBR           ;GET 20 BYTES OF DIRECTORY INFO
           MOV     R3,@10(R1)      ;PUT LM BYTE IN CATBUF
           A       R2,R1
           JMP     FILE50

FILE60     MOV     R7,@FILCNT      ;SAVE FILE COUNT
           MOV     R7,R8           ;R7=FILE COUNT..CALC NUMBER OF SCREEN PAGES
           JNE     FILE70          ;IF R7=0 THEN VOL. IS EMPTY

           SCREEN  1
           DISPLAY 17,3,TXTEMP,TXTEMPL      ;'VOLUME IS BLANK. PRESS ANY KEY.'
           B       @TPLP1

FILE70     LI      R1,TXTCA2+28    ;CLEAR OUT TYPE/NO. FIELD
           LI      R0,SPACES
           LI      R2,3
FILE80     MOVB    *R0,*R1+
           DEC     R2
           JNE     FILE80

           LI      R1,TXTCA2+30    ;SHOW # OF FILES
           BL      @ITO4A

           MOV     R7,R5
           CLR     R4              ;20 FILES/PAGE MAX
           DIV     @D20,R4         ;R4=QUOTIENT  R5=REMAINDER

           MOV     R5,R5           ;ANY REMAINDER
           JEQ     FILE90          ;NO..PAGE COUNT=R4

           INC     R4              ;YES..USE INT(R4)
FILE90     SLA     R4,8            ;LSB TO MSB
           MOVB    R4,@PGCNT       ;SAVE PAGE COUNT

FILE100    LI      R0,SCNBUF       ;SCN BUF ADDR
           SRL     R4,8            ;NUMBER OF PAGES TO CLEAR
           LI      R2,>2000        ;SPC

FILE110    LI      R1,20           ;20 LINES TO CLEAR
FILE120    LI      R3,40           ;CHAR PER LINE
FILE130    MOVB    R2,*R0+         ;CLEAR BUF
           DEC     R3              ;LINE CLEARED?
           JNE     FILE130           ;NO.. LOOP

           DEC     R1              ;DEC LINE COUNTER
           JNE     FILE120           ;LOOP IF NOT FINISHED
           DEC     R4              ;DEC PAGE COUNT
           JNE     FILE110           ;LOOP

SETDIS     MOV     R7,R6           ;# OF LINES
           LI      R4,CATBUF
           LI      R5,SCNBUF

SETAGN     MOVB    @ASC_N,@1(R5)   ;PUT N IN CMD FIELD
           AI      R5,4            ;MOVE TO FILENAME FIELD

           LI      R3,10           ;MOVE FILENAME TO FIELD
FNLP1      MOVB    *R4+,*R5+
           DEC     R3
           JNE     FNLP1
           AI      R5,4            ;MOVE TO SIZE FIELD

           MOV     @4(R4),R8       ;GET SIZE BYTE
           INC     R8              ;BYTE +1
           MOV     R5,R1           ;GET ADDR
           BL      @ITO4A
           INCT    R5              ;MOVE TO TYPE FIELD

           MOVB    @2(R4),R0       ;GET FILE FLAG
           CZC     @PRGMSK,R0      ;IS FILE "PROGRAM IMAGE" ?
           JEQ     FILTYP          ;NO..THEN ITS A FILETYPE

           LI      R1,TXTPRG       ;SCREEN "PROGRAM"
           LI      R2,7            ;7 BYTES
PITXT      MOVB    *R1+,*R5+
           DEC     R2
           JNE     PITXT
           AI      R5,5            ;POINT TO PROTECT FIELD
           JMP     PROCHK          ;SCREEN PFIELD

FILTYP     CZC     @INTMSK,R0      ;IS FILE "INTERNAL" ?
           JEQ     DISTYP          ;NO..THEN ITS SCREEN TYPE

           LI      R1,TXTINT       ;SCREEN "INT/"
           JMP     TYPOK
DISTYP     LI      R1,TXTDIS       ;SCREEN "DIS/"
TYPOK      LI      R2,4            ;4 BYTES
TPLPX      MOVB    *R1+,*R5+
           DEC     R2
           JNE     TPLPX

           CZC     @VARMSK,R0      ;IS FILE "VARIABLE" ?
           JEQ     FIXTYP          ;NO..THEN ITS FIXED TYPE

           LI      R1,TXTVAR       ;SCREEN "VAR"
           JMP     TYPEND
FIXTYP     LI      R1,TXTFIX       ;SCREEN "FIX"
TYPEND     LI      R2,3            ;3 BYTES
TYLP1      MOVB    *R1+,*R5+
           DEC     R2
           JNE     TYLP1
           AI      R5,3            ;MOVE TO RECORD SIZE

           MOVB    @7(R4),R8       ;GET RECORD SIZE BYTE
           SRL     R8,8
           MOV     R5,R1
           BL      @ITO4A
           INCT    R5              ;MOVE TO PROTECT FIELD

PROCHK     CZC     @PROMSK,R0      ;IS PROTECT BIT SET..
           JEQ     PUTAU           ;NO..PUT A U

           MOVB    @ASC_P,*R5      ;SAVE A "P" TO PFIELD IN CATBUF
           JMP     SETNXT          ;LOOP TO NEXT DIRECTORY

PUTAU      MOVB    @ASC_U,*R5      ;SAVE A "U" TO PFIELD IN CATBUF

SETNXT     AI      R5,8            ;GOTO NEXT LINE 1ST COLUMN
           AI      R4,10           ;  "    "  CATBUF
           DEC     R7              ;DEC LINE COUNTER
           JNE     SETAGN

           DEC     R5              ;BACK UP 1 POSITION
           MOV     R5,@SCNEND      ;SAVE LAST ADDR

           MOV     @DSTBLK,@DSTBLK ;CALLED FROM FILES OR VOL.??
           JEQ     SHWDIS          ;FILES..
           B       @CATALOG2         ;VOLUME..

SHWDIS     BLWP    @CLRSCN
           LI      R3,3            ;PRINT 3 LINES
           LI      R2,40           ;40 CHAR/LINE
           LI      R1,TXTCA1       ;'Vol.name:   Free    Used'
           CLR     R0              ;SCREEN WRITE ADDR

STLP1      BLWP    @VMBW           ;LOOP HERE
           A       R2,R0           ;SCRN LOC+40
           A       R2,R1           ;NEXT LINE OF TEXT
           DEC     R3
           JNE     STLP1           ;LOOP IF NOT FINISHED

           LI      R0,78           ;SCREEN ADDR
           MOVB    @PGCNT,R1       ;GET PAGE COUNT
           AI      R1,>3000        ;ADD ASCII OFFSET >30
           BLWP    @VSBW           ;WRITE PAGE NUMBER TO SCREEN

           MOVB    @ONE,@DSPAGE    ;SCREEN PAGE 1

           CLR     @CPYSCT
           CLR     @CPYFIL
SHOWPG     BL      @DSPGS          ;SHOW PAGE

           BL      @SHOWS          ;SCREEN SIZE TO COPY/MOVE/DELETE

KEYPRS     CLR     R7              ;SCNBUF OFFSET
           INC     R7              ;POINT TO 1ST CHAR 1ST FIELD
           MOVB    @ONE,@FIELD     ;FIELD=1

FLDST      SETO    @KEYSW
           BL      @CALCS          ;CALC SCREEN ADDR
           BLWP    @GTSKEY

           MOVB    @FIELD,R4       ;CALC JUMP
           SRL     R4,7            ;LSB TO MSB * 2
           DECT    R4

           CB      R1,@ASCHI       ;CTRL KEY PRESSED?
           JH      CTLJMP          ;YES...
           CB      R1,@ASCLO       ;FCTN KEY PRESSED?
           JLT     FTNJMP          ;YES...
           B       @CKFJMP(R4)     ;VERIFY KEYS FOR DIFFERENT FIELDS

CKFJMP     JMP     CKFLD1
           JMP     CKFLD2
           JMP     CKFLD3

CTLJMP     B       @CTLKEY         ;JUMP POINTS TO EXTEND RANGE
FTNJMP     B       @FTNKEY

CKFLD1     CB      R1,@SCNBUF(R7)  ;DID IT CHANGE
           JEQ     KEYOK           ;NO
           BL      @SIZEF          ;GET SIZE OF FILE
           MOVB    @SCNBUF(R7),R5  ;GET OLD CHARACTER FOR FIELD 1
           LI      R2,TXTFD1       ;'NCMD'  CMD FIELD DEFAULTS
           CB      R1,*R2+         ;N
           JEQ     KEYN
           CB      R1,*R2+         ;C COPY FILE
           JEQ     KEYC
           CB      R1,*R2+         ;M MOVE FILE
           JEQ     KEYM
           CB      R1,*R2+         ;D DELETE FILE
           JEQ     KEYD
           CB      R1,*R2+         ;P PRINT FILE
           JEQ     KEYP
           CB      R1,*R2+         ;T TYPE FILE
           JEQ     KEYT
           JMP     FLDST           ;NO

KEYT       LI      R0,RFIL         ;ADJUST FCTN KEYS
           MOV     R0,@FCT8
           MOV     R0,@CKT8

           LI      R0,CAT
           MOV     R0,@FCT9
           MOV     R0,@CKT9
           MOVB    @D40,@TPFIL     ;SET FLAG TO SHOW IT IS TYPE FILE
           B       @TFIL

KEYP       LI      R0,CAT          ;ADJUST FCTN KEYS
           MOV     R0,@FCT8
           MOV     R0,@CKT8

           MOV     R0,@FCT9
           MOV     R0,@CKT9
           MOVB    @ASC_1,@TPFIL
           B       @TFIL

KEYN       CB      R5,@ASC_D
           JEQ     DELD            ;WAS  D
           CB      R5,@ASC_C
           JEQ     DELS            ;WAS  C
           S       R3,@CPYSCT      ;WAS  M
DELD       S       R3,@CPYFIL
           JMP     ABC

KEYC       CB      R5,@ASC_N
           JEQ     ADDS
           S       R3,@CPYFIL      ;WAS D OR M
           CB      R5,@ASC_M
           JEQ     ABC             ;WAS M
ADDS       A       R3,@CPYSCT      ;WAS N
           JMP     ABC

KEYM       CB      R5,@ASC_C
           JEQ     ADDD            ;WAS C
           CB      R5,@ASC_D
           JEQ     ADDS            ;WAS D
           A       R3,@CPYFIL      ;WAS N
           JMP     ADDS

DELS       S       R3,@CPYSCT
           JMP     ABC

KEYD       CB      R5,@ASC_N
           JEQ     ADDD            ;WAS N
           CB      R5,@ASC_M
           JEQ     DELS            ;WAS M
           S       R3,@CPYSCT      ;WAS C
ADDD       A       R3,@CPYFIL

ABC        BL      @SHOWS
           JMP     KEYOK

CKFLD3     LI      R2,TXTFD3       ;'PUTP' PROTECT FIELD DEFAULTS
CKFST      LI      R3,4
CKLP1      CB      R1,*R2+         ;CHECK FOR VALID CHAR
           JEQ     KEYOK           ;YES..
           DEC     R3
           JNE     CKLP1
JFL        B       @FLDST          ;NO...

CKFLD2     LI      R2,>202E        ;SPACE & PERIOD CHAR
           CB      R1,R2           ;IS CHAR SPACE
           JEQ     JFL             ;YES..NO BKP120
           SWPB    R2
           CB      R1,R2           ;IS CHAR PERIOD
           JEQ     JFL             ;YES..NO BKP120

KEYOK      MOVB    R1,@SCNBUF(R7)  ;SAVE CHAR IN CPU
           B       @KYJMP(R4)
KYJMP      EQU     $
           JMP     KYFLD1          ;FIELD 1 MOVE DOWN
           JMP     KYFLD2          ;      2 MOVE RIGHT
           JMP     KYFLD1          ;      3 MOVE DOWN

KYFLD1     B       @MOVDWN         ;MOVE CURSOR DOWN
KYFLD2     B       @MOVRGT         ;  "     "   RIGHT

;----------------------------------------------------------------------
;       GET SIZE OFFSET
;  LOC OF SIZE = CATBUF + 20*INT(R7/40)+14
;  INPUT    R7 = SCNBUF OFFSET
;  OUTPUT   R3 = SIZE OF FILE +1(FOR HEADER)
;
;        DESTROYED R5,R6,R0,R2
;----------------------------------------------------------------------
SIZEF      LI      R2,14
           MOV     R7,R6
           CLR     R5
           DIV     @D40,R5         ;INT(R7/40) IS IN R5
           MPY     @D20,R5         ;20*INT(R7/40)
           A       R6,R2
           MOV     @CATBUF(R2),R3
           INC     R3
           RT
;----------------------------------------------------------------------
;
; -- A T O I --
;
;----------------------------------------------------------------------
ATOI       MOV     *R11+,R1        ; TEXT POINTER
           MOV     *R11+,R2        ; TEXT LENGTH
           CLR     R0              ; R0 = RESULT
ATOI10     CLR     R3
           MOVB    *R1+,R3
           JEQ     ATOI90
           CI      R3,>2000
           JEQ     ATOI90
           CI      R3,>3000
           JL      ATOI97
           CI      R3,>3900
           JH      ATOI97
           ANDI    R3,>0F00
           SWPB    R3
           MOV     R0,R4
           LI      R5,10
           MPY     R5,R4
           A       R5,R3
           MOV     R3,R0
           DEC     R2
           JNE     ATOI10
ATOI90     INCT    R11
           RT
ATOI97     MOV     *R11+,R11
           RT

;----------------------------------------------------------------------
;
; -- G E T V O L --
;
;    SET VIRTUAL DISK
;
;----------------------------------------------------------------------
GETVOL     MOV     *R11+,@GTVOL20
           MOV     *R11+,@GTVOL40+2
           MOV     *R11+,@GTVOL30+4
           MOV     R11,@GTVOL99+2
GTVOL10    CLR     @VOLNBR
           CLR     @VOLNBR+2
           CLR     @VOLNBR+4
           BLWP    @GTMKEY         ;GET VOLUME NUMBER
GTVOL20    DATA    13*40+13,VOLNBR,5,'  '
           BL      @ATOI
GTVOL30    DATA    VOLNBR,5,0

           MOV     R0,R0
           JEQ     GTVOL10
           C       R0,@VOLMAX
           JH      GTVOL10
           MOV     @GTVOL40+2,R2
           AI      R2,-VDSK1
           MOV     R0,@SRCVOL(R2)
           MOV     R0,R1
GTVOL40    LI      R0,>FFFF        ;VIRTUAL DSK1
           BLWP    @VSBW
           SWPB    R1
           MOVB    R1,@VDPWD
GTVOL99    B       @0

SRCVOL     DATA    0
DSTVOL     DATA    0
;----------------------------------------------------------------------
;      CALC BIT MAP
;----------------------------------------------------------------------
CALCBM     MOV     *R11+,@CALCBM40
           MOV     @CALCBM40,R2    ;GET BUFFER ADDR
           MOV     R2,@CALCBM50
           LI      R12,1600        ;NUMB OF SECTORS ON VOLUME (ALWAYS 1600)
           MOV     R12,R14
           SRL     R12,3           ;SECTORS/8 = N BYTES
           LI      R4,>8000        ;HIGH BIT MASK
           CLR     R13             ;USED SECTOR COUNTER
           AI      R2,56           ;START ADDR OF BIT MAP
CALCBM10   LI      R1,8            ;8 BITS TO CHECK
           MOVB    *R2+,R0         ;GET BYTE TO TEST
CALCBM20   CZC     R4,R0           ;TEST BIT
           JEQ     CALCBM30        ;IF BIT=0 THEN SHIFT
           INC     R13             ;BIT=1 SECTOR IS USED
CALCBM30   SLA     R0,1            ;       SHIFT BIT LEFT
           DEC     R1              ;       DEC SHIFT COUNTER
           JNE     CALCBM20        ;       LOOP IF NOT 0
           DEC     R12             ;DEC BYTE COUNT
           JNE     CALCBM10        ;LOOP IF NOT 0
           S       R13,R14         ;TOTAL-USED=FREE
           MOV     R14,@TEMPR1     ;VAL FREE SECTORS
           MOV     R13,@TEMPR2     ;VAL USED SECTORS
           RT
CALCBM40   DATA    0
CALCBM50   DATA    0
;----------------------------------------------------------------------
;
;    SHOW TOTAL FILES TO COPY/MOVE/DELETE
;
;----------------------------------------------------------------------
SHOWS      MOV     @CPYSCT,R0      ;SHOW TOTAL SIZE TO COPY OR MOVE
           BLWP    @DISP
           DATA    238

           MOV     @CPYFIL,R0      ;SHOW TOTAL SIZE TO DELETE
           BLWP    @DISP
           DATA    398

           SCREEN  3
           DISPLAY 3,35,TXTCC,4    ;'COPY'
           DISPLAY 4,35,TXTMM,4    ;'MOVE'
           DISPLAY 8,34,TXTD,6     ;'DELETE'
           RT

;----------------------------------------------------------------------
;
;  -- C A L C S --
;
;      Calculate Screen addr
;      INPUT R7=SCNBUF OFFSET
;     OUTPUT R0=VDP SCREEN ADDR
;            R1=CHAR IN MSB
;     DESTROYED R5,R6
;
;----------------------------------------------------------------------
CALCS      MOV     R7,R0           ;SCNBUF OFFSET
           CLR     R5
           MOVB    @DSPAGE,R5      ;GET PAGE #
           SRL     R5,8
           DEC     R5
           MPY     @D800,R5
           S       R6,R0           ;SUB CPU OFFSET
           AI      R0,120          ;ADD 3 LINE OFFSET
           MOVB    @SCNBUF(R7),R1
           RT

;----------------------------------------------------------------------
;
;      MOVE DOWN, UP, RIGHT, LEFT
;
;----------------------------------------------------------------------
MOVDWN     LI      R0,SCNBUF       ;START ADDR
           A       R7,R0           ;ADD OFFSET
           AI      R0,40           ;ADD 40 (MOVE DOWN)
           C       R0,@SCNEND      ;ARE WE PAST END
           JGT     EXCJMP          ;YES..DON'T MOVE

           BL      @CALCS          ;GET SCN ADDR
           AI      R0,40           ;ADD 40
           CI      R0,920          ;ARE WE OVER
           JGT     EXCJMP          ;YES..DON'T MOVE

           AI      R7,40           ;MOVE DOWN
DWNRTN     B       @FLDST          ;RTN

EXCJMP     B       @EXCMSG         ;JUMP OFF POINT

MOVUP      BL      @CALCS          ;GET SCN ADDR
           AI      R0,-40          ;SUB 40
           CI      R0,120          ;ARE WE OVER
           JLT     UPRTN           ;YES..DON'T MOVE

           AI      R7,-40
UPRTN      B       @FLDST          ;RTN

MOVRGT     B       @RGTJMP(R4)
RGTJMP     EQU     $
           JMP     RGTFL1          ;FIELD 1
           JMP     RGTFL2          ;      2
           JMP     RGTFL3          ;      3

RGTFL1     AI      R7,3            ;MOVE FROM FIELD 1 TO FIELD 2
           AB      @ONE,@FIELD     ;ADJUST FEILD POINTER
           CLR     R8              ;CLEAR CHAR COUNTER
           JMP     RGTRTN

RGTFL3     AI      R7,-31          ;MOVE FROM FIELD 3 TO FIELD 1
           MOVB    @ONE,@FIELD     ;ADJUST FIELD POINTER
           JMP     RGTRTN

RGTFL2     INC     R7              ;MOVE RIGHT 1 CHAR
           INC     R8              ;INC CHAR COUNTER
           CI      R8,10
           JNE     RGTRTN          ;NO..

MVRGT      AI      R7,18           ;YES..MOVE TO FIELD 3
           AB      @ONE,@FIELD     ;ADJUST POINTER

RGTRTN     B       @FLDST          ;RETURN

MOVLFT     B       @LFTJMP(R4)
LFTJMP     EQU     $
           JMP     LFTFL1          ;FIELD 1 LEFT
           JMP     LFTFL2          ;  "   2  "
           JMP     LFTFL3          ;  "   3  "

LFTFL1     AI      R7,31           ;MOVE FROM FIELD 1 TO FIELD 3
           AB      @TWO,@FIELD     ;ADJUST FIELD POINTER
           JMP     LFTRTN

LFTFL3     AI      R7,-19          ;MOVE FROM FIELD 3 TO FIELD 2
           MOVB    @TWO,@FIELD     ;ADJUST POINTER
           LI      R8,9            ;SET CHAR POINTER
           JMP     LFTRTN

LFTFL2     MOV     R8,R8           ;IF R8=0 THEN GOTO FIELD 1
           JEQ     MVFL1

           AI      R7,-1           ;MOVE LEFT 1
           DEC     R8              ;DEC CHAR COUNTER
           JMP     LFTRTN          ;IF NOT=0 THEN STAY IN FIELD 2

MVFL1      AI      R7,-3           ;MOVE FROM FIELD 2 TO FIELD 1
           MOVB    @ONE,@FIELD     ;ADJUST FIELD POINTER

LFTRTN     B       @FLDST          ;RTN

CTLKEY     CB      R1,@CTRLX       ;NEXT PAGE?
           JEQ     PGDWN
           CB      R1,@CTRLE       ;PREVIOUS PAGE?
           JEQ     PGUP

FLDBR      B       @FLDST          ;BRANCH TO FLDST FOR JUMPS

PGDWN      AB      @ONE,@DSPAGE    ;SHOW NEXT PAGE
           CB      @DSPAGE,@PGCNT  ;IS THERE REALLY A NEXT PAGE ?
           JLT     SHOWOK          ;YES..THEN SHOW IT
           JEQ     SHOWOK          ; "     "    "   "

           SB      @ONE,@DSPAGE    ;NO..ADJUST PAGE POINTER AND RETURN
           JMP     FLDBR

PGUP       SB      @ONE,@DSPAGE    ;SHOW PREVIOUS PAGE
           CB      @DSPAGE,@ONE    ;IS THERE REALLY A PREVIOUS PAGE ?
           JEQ     SHOWOK          ;YES..SHOW PAGE
           JGT     SHOWOK          ; " ..  "    "

           AB      @ONE,@DSPAGE    ;NO..ADJUST POINTER AND RETURN
           JMP     FLDBR

SHOWOK     CLR     R5              ;CALC NEW CURSOR POSITION
           MOVB    @DSPAGE,R5
           SRL     R5,8
           DEC     R5
           MPY     @D800,R5
           MOV     R6,R7           ;POINT TO NEW TOP OF PAGE
           INC     R7              ;POINT TO 1ST CHAR
           BL      @DSPGS          ;SHOW PAGE
           MOVB    @ONE,@FIELD

           JMP     FLDBR           ;RTN

FTNKEY     SRL     R1,7            ;CALC INDEX FOR FUNCTION KEY TABLE
           DECT    R1
           MOV     @FUNCT2(R1),R1
           B       *R1

MOVCR      B       @CRJMP(R4)

CRJMP      EQU     $
           JMP     CRFL1           ;FIELD 1 MOVDWN
           JMP     CRFL2           ;      2 ADJUST
           JMP     CRFL1           ;      3 MOVDWN

CRFL1      B       @MOVDWN
CRFL2      S       R8,R7           ;ADJUST CHAR POINTER
           CLR     R8              ;CLEAR BYTE
           JMP     CRFL1

DELCHR     CB      @TWO,@FIELD     ;ONLY ACTIVE IN FIELD 2
           JNE     FLDBR2

           LI      R2,10           ;MAX CHAR 10
           S       R8,R2           ;SUB INDEX OFFSET
           BL      @CALCS          ;GET SCREEN ADDR
           INC     R0
           LI      R1,SCNBUF
           A       R7,R1
           BLWP    @VMBR           ;GET CHAR RIGHT OF CURSOR
           DEC     R0
           BLWP    @VMBW           ;MOVE THEM LEFT 1 POSITION

FLDBR2     BLWP    @VSBR           ;GET CHAR
           B       @FLDST          ;RTN

INSCHR     CB      @TWO,@FIELD     ;ONLY ACTIVE IN FIELD 2
           JNE     FLDBR2

           LI      R2,9
           S       R8,R2
           BL      @CALCS
           LI      R1,SCNBUF
           A       R7,R1
           INC     R1
           BLWP    @VMBR
           MOVB    @ASCLO,@SCNBUF(R7)
           DEC     R1
           INC     R2
           BLWP    @VMBW
           JMP     FLDBR2          ;RTN

CPYFIL     DATA    0               ;TOTAL FILES TO COPY
CPYSCT     DATA    0               ;TOTAL SIZE OF FILES
;----------------------------------------------------------------------
;
;  EXECUTE COMMANDS
;
;----------------------------------------------------------------------
EXCMSG     CLR     @KEYSW
           SCREEN  1
           DISPLAY 23,3,TXTCAA,32  ;"Execute Commands (Y/N) ?"

           LI      R0,23*40+32
           MOVB    @ASC_N,R1
           BLWP    @GTSKEY

           CB      @YES,R1
           JEQ     EXCCMD

           BL      @DSRTN          ;"Turn page with CTRL E-CTRL X"
           B       @FLDST

EXCCMD     BLWP    @CLRSCN
           CLR     R7              ;SIZE COUNTER
           CLR     R6              ;FILE COUNTER
           LI      R4,CATBUF+14
           LI      R3,SCNBUF+1     ;START OF SCREEN BUF
           LI      R2,>434D        ;TEXT "C" AND "M"

CMDLP1     CB      *R3,R2          ;IS CMD=C
           JEQ     CPCHK
           SWPB    R2
           CB      *R3,R2          ;IS CMD=M
           JEQ     CPCHK

CMDLP2     AI      R3,40           ;MOV DWN
           AI      R4,20
           C       @SCNEND,R3
           JGT     CMDLP1

           MOV     R6,@CPYFIL      ;SAVE FILE TOTAL
           MOV     R7,@CPYSCT      ;     SIZE TOTAL
           JNE     CPYSET
           JMP     NOCOPY

CPCHK      INC     R6              ;INC FILE COUNTER
           MOV     *R4,R5          ;GET SIZE
           A       R5,R7           ;INC SIZE
           INC     R7              ;ADD 1 FOR DIRECTORY ENTRY
           JMP     CMDLP2

NOCOPY     SCREEN  4
           DISPLAY 12,3,TXTFRM,6   ;'MASTER'
           DISPLAY 13,3,TXTVOL,9   ;'Volume #:'
           DISPLAY 14,3,TXTCA1,20
           DISPLAY 15,3,TXTCA1+21,19
           MOV     @SRCVOL,R0
           BLWP    @DISP
           DATA    13*40+13
           B       @XXXCMD         ;EXECUTE COMMANDS BYPASS VOL. INITIALIZATION
;----------------------------------------------------------------------
CPYSET     BLWP    @CLRSCN
           SCREEN  9
           DISPLAY 1,TXTCA6C,TXTCA6,TXTCA6L ;'File Utilities'
           DISPLAY 6,3,TXTFRM,6     ;'Master Vol.'
           DISPLAY 7,3,TXTVOL,9     ;'Volume #:'
           DISPLAY 8,3,TXTCA1,20    ;'Vol.Name: **********'
           DISPLAY 9,3,TXTCA1+21,19 ;'Free **** Used ****'
           DISPLAY 12,3,TXTTO,6     ;'Backup Vol.'
           DISPLAY 13,3,TXTVOL,9    ;'Volume #:'
           DISPLAY 14,3,TXTCA0,9    ;'Vol.Name:'
           DISPLAY 15,3,TXTCAD,14   ;'Free      Used'

           MOV     @SRCVOL,R0
           BLWP    @DISP
           DATA    7*40+13

DSDLP1     BL      @GETVOL
           DATA    13*40+13,VDSK2,DSDLP1
           LI      R1,>0200
           MOVB    R1,@DSTDRV      ;SET DEST DRV

           C       @SRCVOL,@DSTVOL ;ARE SRC/DST DRIVES DIFFERENT?
           JEQ     DSDLP1          ;NO -- TRY AGAIN

           MOVB    @DSTDRV,@OPDRV  ;GET DRIVE #
           CLR     @SECTOR         ;SECTOR=0
           BLWP    @RDSECT         ;GET SECTOR

           BLWP    @MOVSCT         ;MOVE SECTOR TO SCTBUF
           DATA    DSTST0

           LI      R3,TXTER3
           BL      @CHKVOL         ;CHECK IF VOLUME IS INITIALIZED OR PROTECTED
           DATA    DSTST0,NODISK,VOLERR

           CLR     R8              ;R8=0 MEANS DISK IS INITIALIZED
           BL      @SHOWDN         ;SHOW DISK NAME
           JMP     CKINIT

NODISK     SETO    R8              ;R8=FF MEANS DISK NOT INITIALIZED
           SCREEN  1
           DISPLAY 14,13,TXTIN5,TXTIN5L ;'NOT FORMATTED'

CKINIT     SCREEN  1
           DISPLAY 23,3,TXTIN0,TXTIN0L  ;'FORMAT VOLUME (Y/N)'

BRLP1      MOVB    @DSTDRV,@OPDRV  ;GET DRIVE NUMBER
           LI      R0,23*40+3+TXTIN0L+1
           MOVB    @ASC_N,R1       ;"NO"
           BLWP    @GTSKEY

           CB      @YES,R1
           JEQ     BRLP2
           CB      @ASC_N,R1
           JNE     BRLP1
           MOV     R8,R8           ;IS DISK INITIALIZED?
           JEQ     OKXCMD          ;YES..EXECUTE COMMANDS
           B       @CPYSET         ;NO.. RETURN INVALID COMMAND

BRLP2      SCREEN  2
           DISPLAY 14,13,SPACES,15 ;ERASE LINE
           DISPLAY 23,3,SPACES,28
           BLWP    @INITB          ;INITIALIZE DISK
           BL      @SHOWDN         ;SHOWN DISKNAME//FREE//USED

OKXCMD     SCREEN  1
           DISPLAY 23,3,SPACES,28  ;BLANK LINE
           B       @XXXCMD         ;BRANCH TO MGR PART 6

TPLP1      BLWP    @KSCAN          ;TEMP ADDR FOR TESTING
           MOVB    @STATUS,R2
           CZC     @KEYMSK,R2
           JEQ     TPLP1
           MOV     @FCT9,R0        ;RETURN TO BACK
           B       *R0

;----------------------------------------------------------------------
;
;  -- S H O W D N --
;
;     SHOW DESTINATION NAME
;
;----------------------------------------------------------------------
SHOWDN     MOV     R11,R10         ;SAV RTN ADDR
           SCREEN  1               ;SHOW DISKNAME //FREE//USED
           DISPLAY 14,13,DSTST0,10
           BL      @CALCBM         ;CALC BIT MAP FREE/USED
           DATA    DSTST0          ;BUFFER ADDR
           MOV     @TEMPR1,R0      ;FREE
           BLWP    @DISP
           DATA    15*40+11
           MOV     @TEMPR2,R0      ;USED
           BLWP    @DISP
           DATA    15*40+21
           B       *R10

;----------------------------------------------------------------------
;
;  -- K Y P R M T --
;
;     KEY PROMPT
;
;----------------------------------------------------------------------
KYPRMT     SETO    @KEYSW          ;SET TO RTN A CR
           AI      R0,-28          ;BACK UP FOR CURSOR POSITION
KYPLP1     MOVB    @ASCLO,R1       ;SPACE CHAR
           BLWP    @GTSKEY
           CB      R1,@CR          ;IS KEY A CR
           JNE     KYPLP1
           LI      R3,9            ;CLEAR 9 LINES (PROMPTS)
           LI      R0,306
           LI      R1,SPACES       ;BLANK LINE
PRMLP1     BLWP    @VMBW
           AI      R0,40           ;MOV DWN
           DEC     R3
           JNE     PRMLP1          ;LOOP IF NOT FINISHED
           RT                      ;RTN

;----------------------------------------------------------------------
;
;  -- D S P G S --
;
;     SCREEN pages routine
;
;----------------------------------------------------------------------
DSPGS      MOVB    @DSPAGE,R1      ;GET PAGE NUMBER
           AI      R1,>3000        ;ADD ASCII OFFSET
           LI      R0,76           ;SCREEN ADDR
           BLWP    @VSBW           ;SHOW PAGE NUMBER
           CLR     R5              ;CALCULATE CATBUF POINTER
           MOVB    @DSPAGE,R5      ;GET PAGE NUMBER
           SRL     R5,8            ;PUT MSB TO LSB
           DEC     R5              ;SCREEN PAGE-1
           MPY     @D800,R5        ;40 BYTES*20 LINES/PAGE=800 BYTES
           LI      R0,120          ;SCREEN ADDR
           LI      R1,SCNBUF       ;CATBUF ADDR
           A       R6,R1           ;ADD CALCULATED PAGE OFFSET
           LI      R2,800
           BLWP    @VMBW

DSRTN      SCREEN  1
           DISPLAY 23,TXTCA5C,TXTCA5,TXTCA5L
           RT

;
;      CONVERT INT VALUE IN R8 TO 4 ASCII (*R1)
;
ITO4A      LI      R3,4

CLCLP1     MOV     R8,R9
           CLR     R8
           DIV     @DTEN,R8

           CI      R3,3
           JNE     CLCLP6
           MOV     R8,R8
           JEQ     CLCLP5

CLCLP6     CI      R3,2
           JNE     CLCLP4
           MOV     R8,R8
           JEQ     CLCLP5

CLCLP4     CI      R3,1
           JNE     CLCLP2

CLCLP5     MOV     R9,R9
           JEQ     CLFMT030

CLCLP2     AI      R9,>0030
           SLA     R9,8
           MOVB    R9,*R1
           DEC     R1
           DEC     R3
           JNE     CLCLP1

CLFMT030     RT

;----------------------------------------------------------------------
;
;      SCREEN decimal numbers routine
;
;----------------------------------------------------------------------
DISENT     LI      R2,4            ;4 PLACES
           MOV     *R14+,R0        ;GET SCREEN ADDR
           MOV     *R13,R4         ;GET VAL

DISLP1     MOV     R4,R5
           CLR     R4
           DIV     @DTEN,R4

           CI      R2,3
           JNE     DISLP6

           MOV     R4,R4           ;IF QUOTIENT=0 THEN CHECK REMAINDER
           JEQ     DISLP5

DISLP6     CI      R2,2
           JNE     DISLP4

           MOV     R4,R4           ;IF QUOTIENT=0 THEN CHECK REMAINDER
           JEQ     DISLP5

DISLP4     CI      R2,1
           JNE     DISLP2

DISLP5     MOV     R5,R5           ;IF REMAINDER=0 THEN EXIT
           JEQ     DISLP3
DISLP2     AI      R5,>30          ;ADD ASCII OFFSET
           SLA     R5,8            ;LSB TO MSB
           MOV     R5,R1
           BLWP    @VSBW           ;WRITE TO SCREEN

           DEC     R0              ;BACKUP 1 SCREEN LOCATION
           DEC     R2
           JNE     DISLP1

DISLP3     MOV     R2,R2           ;HAVE WE GOT 4 DECIMAL FIGURES
           JEQ     DISLP7          ;YES..RETURN

           MOVB    @ASCLO,R1       ;NO..FILL WITH LEADING SPACES
DISLP8     BLWP    @VSBW
           DEC     R0
           DEC     R2
           JNE     DISLP8

DISLP7     RTWP                    ;EXIT

;----------------------------------------------------------------------
;
;  -- M O V E S T --
;
;      Move Sector from VDP RAM to CPU RAM
;
;----------------------------------------------------------------------
$MOVSCT    MOV     *R14+,R1
           LI      R0,PABBUF
           LI      R2,256
           BLWP    @VMBR
           RTWP
;----------------------------------------------------------------------
;
;      Disk Sector I/O Routine
;
;----------------------------------------------------------------------
$RDSECT    CLR     @FAC+2           ;CLEAR DRIVE & OPCODE
           INC     @FAC+2           ;SET TO READ
           JMP     STSCT

$WRSECT    CLR     @FAC+2           ;SET TO WRITE

STSCT      MOVB    @OPDRV,@FAC+2    ;GET DRIVE TO OPERATE ON
           LI      R3,PABBUF        ;VDP BUF ADDR
           MOV     R3,@FAC+4
           MOV     @SECTOR,@FAC+6
           LI      R0,PAB           ;LOAD PAB TO VDP
           LI      R1,PDATA1
           LI      R2,>20
           BLWP    @VMBW
           LI      R2,PAB+9
           MOV     R2,@PNTR
           BLWP    @DSRLNK
           DATA    10

CKERR      CLR     *R13             ;CLEAR CALLING REG 0
           MOVB    @DSKERR,*R13     ;IF FLAG=0 THEN NO ERROR
           BLWP    @KSCAN           ;TEST FOR FCTN CLEAR
           MOVB    @STATUS,R1
           JEQ     ENDSCT
           CB      @KCODE,@TWO
           JNE     ENDSCT
           B       @ABTMSG          ;USER HALTED I/O
ENDSCT     RTWP                     ;RTN

;----------------------------------------------------------------------
;
;      Clear Screen Routine
;
;      BLWP @CLRSCN OR  BLWP @CLREOS
;----------------------------------------------------------------------
CLSCRN     CLR     R0              ;CLEAR WHOLE SCREEN
           JMP     CLRSET

CLHALF     MOV     *R14+,R0        ;CLEAR FROM THIS ADDR

CLRSET     LI      R1,>2000
           LI      R2,960
CLPX       BLWP    @VSBW
           INC     R0
           C       R0,R2
           JNE     CLPX
           RTWP

;----------------------------------------------------------------------
;
;      High Speed VSBW,VMBW,VSBR,VMBR,VWTR
;
;----------------------------------------------------------------------
VDPRD      EQU     >8800           ;VDP READ DATA ADDR
VDPWD      EQU     >8C00           ;VDP WRITE DATA ADDR
VDPWA      EQU     >8C02           ;VDP READ/WRITE ADDR
R2LB       EQU     >8380+5         ;R2'S LOWER BYTE - I SET WS REG TO >8380 ***

VSBW       DATA    MYREG3,VSBW1    ;VECTOR TABLE
VMBW       DATA    MYREG3,VMBW1    ;   "     "
VSBR       DATA    MYREG3,VSBR1    ;   "     "
VMBR       DATA    MYREG3,VMBR1    ;   "     "
VWTR       DATA    MYREG3,VWTR1    ;   "     "

VSBW1      BL      @SETWDA         ;SET UP WRITE OUT ADDR
           MOVB    @2(R13),@VDPWD  ;WRITE OUT BYTE
           RTWP                    ;RETURN

VMBW1      BL      @SETWDA         ;SET UP WRITE OUT ADDR

VWTLOP     MOVB    *R1+,@VDPWD     ;WRITE OUT BYTE
           DEC     R2              ;DEC BYTE COUNTER
           JNE     VWTLOP          ;IF MORE TO WRITE JUMP
           RTWP                    ;RETURN

VSBR1      BL      @SETRDA         ;SET UP READ ADDR
           MOVB    @VDPRD,@2(R13)  ;READ A BYTE
           RTWP                    ;RETURN

VMBR1      BL      @SETRDA         ;SET UP READ ADDR

VRDLOP     MOVB    @VDPRD,*R1+     ;READ A BYTE
           DEC     R2              ;DEC BYTE COUNTER
           JNE     VRDLOP          ;IF MORE TO READ JUMP
           RTWP                    ;RETURN

VWTR1      MOV     *R13,R1         ;GET REG # AND VAL
           MOVB    @1(R13),@VDPWA  ;WRITE OUT VAL
           ORI     R1,>8000        ;SET FOR WRITE TO REG
           MOVB    R1,@VDPWA       ;WRITE OUT REG #
           RTWP                    ;RETURN

SETWDA     LI      R1,>4000        ;SET TO WRITE TO VDP
           JMP     WVADD

SETRDA     CLR     R1              ;SET TO READ FROM VDP

WVADD      MOV     *R13,R2         ;GET VDP ADDR
           MOVB    @R2LB,@VDPWA    ;WRITE LOW BYTE
           SOC     R1,R2           ;ADJUST WRITE BIT
           MOVB    R2,@VDPWA       ;WRITE HIGH BYTE
           MOV     @2(R13),R1      ;GET CPU RAM ADDR
           MOV     @4(R13),R2      ;GET BYTE COUNT
           RT
;----------------------------------------------------------------------
;
;      SCREEN Text Routine
;
;----------------------------------------------------------------------
DSTEXT     MOV     *R14+,R3        ;NO. OF LINES TO DISPALY

DSTLP1     MOV     *R14+,R0        ;GET SCREEN ADDR
           MOV     *R14+,R1        ;GET CPU ADDR
           MOV     *R14+,R2        ;GET NO. OF BYTES
           BLWP    @VMBW           ;WRITE TO SCREEN
           DEC     R3              ;DEC LINE COUNTER
           JNE     DSTLP1          ;LOOP IF NOT FINISHED
           RTWP                    ;RETURN

TDRPT      DATA    160             ;TIME DELAY FOR REPEAT KEY
FF         DATA    >FF00

;----------------------------------------------------------------------
;
;      Get Single Key
;
;----------------------------------------------------------------------
GSKEY      MOV     *R13,R0         ;GET SCREEN ADDR
           MOVB    @2(R13),R1      ;GET BYTE TO SHOW
           BLWP    @VSBW           ;WRITE TO SCREEN
           SRL     R1,8            ;MSB TO LSB
           MOVB    @CURSOR,R1      ;PUT CURSOR IN MSB
           BLWP    @VSBW           ;WRITE CURSOR TO SCREEN
           CLR     R10
KS1        CLR     R2              ;R2=0 THEN "CURSOR ON"
KS2        MOV     @TD,R3          ;RESET FLASH RATE

KS         BLWP    @KSCAN
           MOVB    @STATUS,R4
           CZC     @KEYMSK,R4
           JNE     KCHECK

           CB      @KCODE,@FF
           JEQ     KS3

           INC     R10
           C       @TDRPT,R10
           JEQ     KCHECK

KS3        DEC     R3              ;DEC FLASH RATE TIMER
           JNE     KS

           DEC     R2              ;IS CURSOR ON?
           JEQ     CURSON          ;NO..THEN TURN IT ON

           SWPB    R1              ;SHOW CHAR
           BLWP    @VSBW
           INCT    R2              ;SET FLAG=1
           JMP     KS2             ;RESET FLASH RATE

CURSON     SWPB    R1              ;SHOW CURSOR
           BLWP    @VSBW
           JMP     KS1

KCHECK     MOVB    @2(R13),R1      ;GET ORIGINAL KEY
           SWPB    R1
           MOVB    @KCODE,R1       ;GET CURRENT KEY

           CB      R1,@ASCHI       ;SHOW DEFAULT//RETURN CURRENT
           JH      KZLP2

           CB      R1,@ASCLO       ;IS IT A FCTN KEY
           JLT     KZLP3           ;YES...

           BLWP    @VSBW           ;NO.. SHOW CURRENT//RETURN CURRENT
KZLP1      MOVB    R1,@2(R13)      ;SAVE CHAR TO R1 MSB OF LINK
           RTWP                    ;RETURN

KZLP2      SWPB    R1              ;SHOW DEFAULT
           BLWP    @VSBW
           SWPB    R1              ;RETURN FUNCT CODE
           JMP     KZLP1

KZLP3      MOV     @KEYSW,@KEYSW   ;KEYSW=0
           JNE     KZLP4           ;NO..SHOW DEFAULT/RETURN FUNCT CODE

           LI      R3,KZLP5        ;YES..SHOW DEFAULT//RETURN DEFAULT
           MOV     R3,@FCTE        ;SET UP CR BRANCH

KZLP6      MOV     R1,R2           ;CALC AND BRANCH AS PER FUNCT CODE
           SRL     R2,7
           DECT    R2
           MOV     @FUNCT(R2),R2
           B       *R2             ;BRANCH

KZLP4      LI      R3,KZLP2        ;RETURN FUNCT CODE
           MOV     R3,@FCTE        ;SET UP CR BRANCH

           CLR     @KEYSW          ;KEYSW=0
           JMP     KZLP6

KZLP5      SWPB    R1              ;SHOW DEFAULT//RETURN DEFAULT
           BLWP    @VSBW
           JMP     KZLP1
;----------------------------------------------------------------------
;
;      GET MULTIPLE KEY CODES WITH EDITING
;
;----------------------------------------------------------------------
CKTBL      DATA    NOBS            ;AID   FCTN 7
           DATA    NOBS            ;CLR   FCTN 4
           DATA    CKDL            ;DEL   FCTN 1
           DATA    CKIN            ;INS   FCTN 2
           DATA    QUIT            ;QUIT  FCTN =
CKT8       DATA    NOBS            ;REDO  FCTN 8
           DATA    NOBS            ;ERASE FCTN 3
           DATA    CKBS            ;LEFT  FCTN S
           DATA    CKFS            ;RIGHT FCTN D
           DATA    NOBS            ;DOWN  FCTN X
           DATA    NOBS            ;UP    FCTN E
           DATA    NOBS            ;PROCD FCTN 6
           DATA    CKCR            ;ENTER ENTER
           DATA    MGR             ;BEGIN FCTN 5
CKT9       DATA    CAT             ;BACK  FCTN 9

GMKEY      MOV     *R14+,R0        ;VDP ADDR
           MOV     *R14+,R5        ;CPU ADDR
           MOV     *R14+,R6        ;LENGTH OF STRING
           MOV     *R14+,R7        ;INVALID CHAR (MAX 2)

           CLR     R8              ;CHAR COUNTER
GMST       BLWP    @VSBR           ;GET CHAR FROM SCREEN
GMST1      BLWP    @VSBW           ;WRITE TO SCREEN

           SRL     R1,8            ;MSB TO LSB
           MOVB    @CURSOR,R1      ;CURSOR CHAR
           BLWP    @VSBW           ;WRITE CURSOR

GMLP1      CLR     R2              ;FLAG=0 CURSOR ON
GMLP2      MOV     @TD,R3          ;RESET FLASH RATE

GM         BLWP    @KSCAN          ;SCAN AND GET KCODE
           MOVB    @STATUS,R4
           CZC     @KEYMSK,R4      ;KEY PRESSED?
           JNE     GMCHK           ;YES..CHECK IT OUT

           DEC     R3              ;DEC FLASH TIMER
           JNE     GM

           DEC     R2              ;IS CURSOR ON
           JEQ     GMON            ;NO..THEN TURN IT ON

           SWPB    R1
           BLWP    @VSBW           ;PUT CHAR TO SCREEN
           INCT    R2              ;SET FLAG=1
           JMP     GMLP2

GMON       SWPB    R1
           BLWP    @VSBW
           JMP     GMLP2

GMCHK      MOV     R2,R2           ;IS CURSOR "ON"
           JNE     GMCHK1          ;NO..
           SWPB    R1              ;YES..
           BLWP    @VSBW           ;DO NOT SHOW CURSOR

GMCHK1     MOVB    @KCODE,R1
           CB      R1,@ASCLO       ;IS IT A FCTN KEY?
           JLT     CKFCTN          ;YES..CHECK IT OUT

           CB      R1,R7           ;CHECK INVALID CHAR #1
           JEQ     GMST
           SWPB    R7
           CB      R1,R7           ;CHECK INVALID CHAR #2
           JEQ     GMST

           LI      R2,>6100        ;CHECK FOR LOWERCASE
           CB      R1,R2
           JLT     GMCHK2

           SB      @ASCLO,R1       ;CONVERT TO UPPERCASE

GMCHK2     C       R8,R6           ;IF COUNT=MAX THEN EXIT
           JEQ     GMST            ;WAIT FOR ENTER

           BLWP    @VSBW           ;WRITE CHAR
           MOVB    R1,*R5+         ;SAVE CHAR
           INC     R0              ;INC SCREEN ADDR
           INC     R8              ;INC CHAR COUNTER
           JMP     GMST            ;LOOP NXT CHAR

CKFCTN     SRL     R1,7            ;CALC INDEX TO TABLE
           DECT    R1
           CI      R1,28           ;IF KEY 14*2 THEN NO BKP120
           JGT     GMST
           MOV     @CKTBL(R1),R1
           B       *R1             ;BRANCH AT FUNCTION

CKBS       MOV     R8,R8           ;BACKSPACE
           JEQ     NOBS

           MOVB    *R5,R1
           BLWP    @VSBW           ;SHOW CHAR UNDER CURSOR

           DEC     R0              ;BACK UP 1 LOC VDP
           DEC     R5              ;  "   " "  "  CPU

           MOVB    *R5,R1
           BLWP    @VSBW

CKBS1      DEC     R8              ;DEC CHAR COUNT
NOBS       JMP     GMST            ;GET CHAR


CKFS       INC     R8              ;INC COUNTER
           C       R8,R6           ;OVER MAX
           JGT     CKBS1           ;YES.ADJUST AND DON'T MOVE

           CB      *R5,@ASCLO      ;ARE WE ON A SPACE
           JNE     DOFS            ;NO..SO GO RIGHT
           INC     R5
           CB      *R5,@ASCLO      ;IS NEXT SPACE
           JNE     DOFSS           ;NO
           DEC     R5              ;YES DO NOT MOVE
           JMP     CKBS1

DOFSS      DEC     R5
DOFS       MOVB    *R5,R1
           BLWP    @VSBW           ;SHOW CHAR UNDER CURSOR

           INC     R0              ;MOV RGT 1 LOC VDP
           INC     R5              ;"    "  "  "  CPU
           JMP     NOBS            ;GET CHAR AND RTN

CKDL       MOV     R6,R2           ;DEL- LENGTH
           S       R8,R2           ;S OFFSET
           MOV     R5,R1           ;CPU ADDR
           INC     R0
           BLWP    @VMBR           ;GET STRING
           DEC     R0              ;LEFT ADJUST
           BLWP    @VMBW           ;WRITE STRING
           BLWP    @VSBR
           JMP     CKRN            ;RTN

CKIN       MOV     R6,R2           ;INS- LENGTH
           DEC     R2              ;LENGTH-1
           S       R8,R2

           MOVB    *R5,R1

           BLWP    @VSBW           ;SHOW CHAR UNDER CURSOR

           MOV     R5,R1           ;BUF ADDR
           INC     R1
           BLWP    @VMBR           ;GET STRING
           MOVB    @ASCLO,*R5      ;PUT SPACE CHAR
           DEC     R1
           INC     R2
           BLWP    @VMBW           ;WRITE
           BLWP    @VSBR
CKRN       B       @GMST1          ;RTN
CKCR       RTWP

;----------------------------------------------------------------------
;
;      INIT DISKETTE B
;
;----------------------------------------------------------------------
INITBB     SCREEN  1
           DISPLAY 21,3,TXTIN4,22  ;'Verify Y/N  :'

           LI      R0,14*40+13     ;CLEAR NAME BUFFER
           LI      R1,DSTST0
           LI      R2,10
           BLWP    @VMBR

GDNAG      SCREEN  1
           DISPLAY 17,3,SPACES,35

           BLWP    @GTMKEY         ;GET DISK NAME
           DATA    14*40+13        ;SCREEN ADDR
           DATA    DSTST0          ;CPU ADDR
           DATA    10              ;LENGTH OF STRING
           DATA    >202E           ;INVALID CHAR

           LI      R0,857
VFLP1      MOVB    @ASC_N,R1       ;SHOW DEFAULT
           BLWP    @GTSKEY
           LI      R2,>4E59        ;"N" AND "Y" VERIFY DISK
           CB      R1,R2           ;VERIFY DISK
           JEQ     VFLP2           ;NO.
           SWPB    R2
           CB      R1,R2
           JNE     VFLP1           ;INVALID CHAR

VFLP2      MOVB    R1,@VERIFY?     ;* VERIFY *

INTDSK     LI      R0,PAB          ;LOAD PAB
           LI      R1,PDATA1
           LI      R2,>0020
           BLWP    @VMBW

           LI      R6,>0028        ;40 TRACK DEFAULT
           MOVB    @OPDRV,R6       ;GET DRIVE NUMBER
           MOV     R6,@FAC+2

           LI      R2,PABBUF
           MOV     R2,@FAC+4

           LI      R2,>0200
           MOV     R2,@FAC+6

           LI      R0,PAB+9        ;POINTER TO NAME LENGTH
           MOV     R0,@PNTR
           LI      R1,DFMT         ;>0111
           LI      R2,2
           BLWP    @VMBW
           BLWP    @DSRLNK         ;FORMAT VOLUME
           DATA    10

           MOVB    @DSKERR,R0      ;ERROR?
           JEQ     KLP4            ;NO..
           B       @WPMSG          ;YES..

KLP4       BLWP    @CLRBUF         ;CLEAR OUT SECTOR
           DATA    DSTST1

SNGLE1     BLWP    @MOVVDP         ;MOVE BUFF TO VDP
           DATA    DSTST1

           LI      R0,1            ;WRITE BUFF TO SECTOR(1) LINK MAP
           MOV     R0,@SECTOR
           BLWP    @WRSECX

;
; BUILD VIB
;
           LI      R3,DSTST0       ;WRITE IN DISK NAME
           LI      R2,DSTST1
           LI      R1,10
SNLP1      MOVB    *R3+,*R2+
           DEC     R1
           JNE     SNLP1

           LI      R6,45           ;DEFAULTS FOR SSSD DISK (BM LENGTH)
           LI      R5,>0100        ;DENSITY BYTE
           LI      R4,>0900        ;SECT/TRACKS
           LI      R0,1600         ;SECT/DISK

SNLP3      MOV     R0,*R2+         ;SAVE SIZE SECT/DISK
           MOVB    R4,*R2+         ;SAVE  SECT/TRACKS

           LI      R3,TXTDSK       ;5 BYTES >44,>53,>4B,>20,>28
           LI      R0,5
SNLP5      MOVB    *R3+,*R2+
           DEC     R0
           JNE     SNLP5

           MOVB    R0,*R2+
           MOVB    R0,*R2          ;SAVE DENSITY/DISK

           LI      R1,200          ;200 BYTES TOTAL IN BM
           LI      R3,DSTST1+>38   ;BIT MAP START ADDR
           MOVB    @H03,*R3        ;>03 SHOWS SECTOR 0&1 AS USED

VERIFY     CB      @ASC_N,@VERIFY? ;VERIFY DISK
           JEQ     NOVERF          ;NO..

           CLR     @SECTOR
           LI      R6,DSTST1+>38
           MOVB    *R6,R2
           SRL     R2,8            ;MSB TO LSB
           LI      R1,8            ;8 BITS PER BM BYTE

           LI      R5,1600         ;ALWAYS 1600 SECTORS PER VOLUME
VLOOP8     MOV     @SECTOR,R0      ;SCREEN SECTORS CHECKED
           INC     R0              ;ADD 1 FOR SCREEN OFFSET 0-359//1-360
           BLWP    @DISP
           DATA    863

           BLWP    @RDSECT
           MOV     R0,R0           ;ERROR ON SECTOR?
           JEQ     VLOOP5          ;NO..

           ORI     R2,>0001        ;YES.. MASK BIT BAD
VLOOP5     SRC     R2,1
           DEC     R1              ;DEC BIT COUNT
           JNE     VLOOP6

           MOVB    R2,*R6+         ;PUT BYTE BACK IN BM
           MOVB    *R6,R2          ;GET NEXT BYTE
           SRL     R2,8            ;MSB TO LSB
           LI      R1,8            ;RESET BIT COUNTER

VLOOP6     INC     @SECTOR         ;INC SECTOR ADDR
           DEC     R5
           JNE     VLOOP8

NOVERF     BLWP    @MOVVDP         ;MOVE CPU TO VDP
           DATA    DSTST1

           CLR     @SECTOR
           BLWP    @WRSECX         ;WRITE TO SECTOR (0) BIT MAP

           BLWP    @MOVSCT         ;SAVE NEW BM
           DATA    DSTST0

           BLWP    @CLREOS         ;CLEAR LOWER PART OF SCREEN
           DATA    763
           RTWP                    ;RETURN

MOVEVD     MOV     *R14+,R1        ;MOV CPU TO VDP
           LI      R0,PABBUF
           LI      R2,256
           BLWP    @VMBW
           RTWP

;
; EXECUTE COMMAND
;
XXXCMD     MOVB    @SRCDRV,@OPDRV
           MOV     @FILCNT,R7      ;# OF FILES ON DISK

UNPROT     LI      R5,SCNBUF+32    ;PROTECT FIELD
           LI      R6,CATBUF

UPRLP1     CB      *R5,@ASC_P      ;LEAVE FIELD PROTECTED
           JEQ     UPRLP2          ;YES..

           MOVB    @12(R6),R4      ;GET FILE FLAG BYTE
           CZC     @PROMSK,R4      ;IS IT PROTECTED
           JEQ     UPRLP2          ;NO..THEN CARRY ON

           MOV     R6,@TDATA1+2
           SCREEN  2
           DISPLAY 20,3,TXTCM1,15  ;'UNPROTECTING : '
TDATA1     DISPLAY 20,18,0,10      ;'**********' FILE NAME

           SZCB    @PROMSK,R4      ;RESET PROTECT FLAG
           MOV     @10(R6),@SECTOR ;GET LINK MAP POINTER
           BLWP    @RDSECT         ;GET DIRECTORY ENTRY

UPRLP5     LI      R0,PABBUF+12    ;ADDR OF FILE FLAG IN DIRECTORY ENTRY
           MOVB    R4,R1           ;GET FILE FLAG
           BLWP    @VSBW           ;WRITE NEW FLAG

           BLWP    @WRSECT         ;WRITE DIRECTORY ENTRY

           MOV     R0,R0           ;ERRORS ?
           JEQ     UPRLP3          ;NO..

WPMSG      BLWP    @CLREOS
           DATA    763

           LI      R4,3
           LI      R3,TXTER2
           LI      R2,IOERRS
WPMLP1     CB      R0,*R2+
           JEQ     VOLERR

           AI      R3,20
           DEC     R4
           JNE     WPMLP1

VOLERR     MOV     R3,@WPDATA+2
           SCREEN  2               ;WRITE PROTECTED MSG
           DISPLAY 19,TXTER1C,TXTER1,TXTER1L ;'D I S K  E R R O R'
WPDATA     DISPLAY 21,TXTER1C,0,TXTER1L      ;I/O ERROR MSGS
           B       @CONTINUE       ;HALT ON ERROR

IOERRS     DATA    >0634           ;NO DISK//WRITE PROTECT
           DATA    >2131           ;NOT INIT//DEVICE ERROR

UPRLP3     MOVB    R4,@12(R6)      ;SAVE FLAG IN CATBUF

           SCREEN  1               ;BLANK OUT DISK NAME
           DISPLAY 20,3,SPACES,30

UPRLP2     AI      R5,40           ;MOVE TO NEXT FILE
           AI      R6,20
           DEC     R7              ;DEC FILE COUNT
           JNE     UPRLP1          ;LOOP IF NOT FINISHED

DELFL      MOV     @FILCNT,R7      ;GET # OF FILES
           LI      R5,SCNBUF+1     ;CMD FIELD
           LI      R6,CATBUF

DLLP1      CB      *R5,@ASC_D      ;DELETE FILE?
           JNE     DLLP5           ;NO..

           MOVB    @12(R6),R4
           CZC     @PROMSK,R4      ;IS IT FILE PROTECTED?
           JNE     DLLP5           ;YES..THEN DON'T DELETE

           MOV     R6,@TDATA2+2    ;GET DISKNAME ADDR
           SCREEN  2
           DISPLAY 20,3,TXTCM2,14  ;'DELETE FILE : '
TDATA2     DISPLAY 20,17,0,10      ;'**********' FILENAME

           MOV     @10(R6),@SECTOR ;GET DIRECTORY ENTRY
           BLWP    @RDSECX

           BLWP    @MOVSCT         ;MOVE DIRECTORY TO CPU
           DATA    SRCST2

           LI      R1,SRCST2+>1C   ;BLOCK LINK ADDR
           MOV     R1,@BLKLNK

BLKLP1     BL      @GETLNK         ;GET // STRSCT // OFFSET

           BL      @RTNBM          ;RETURN SECTORS TO BIT MAP

           MOV     @10(R6),@STRSCT ;RETURN DIRECTORY SECTOR TO BIT MAP

           CLR     @OFFSET
           BL      @RTNBM

           CLR     @SECTOR         ;WRITE BM
           BLWP    @MOVVDP         ;MOVE BIT MAP TO VDP
           DATA    SRCST0
BLKLP2     BLWP    @WRSECX         ;WRITE BIT MAP TO DISK

           LI      R4,SRCST1       ;LINK MAP BUFFER
DLLP4      C       @10(R6),*R4     ;FIND POINTER IN LINK MAP
           JEQ     DLLP2           ;YES..
           INCT    R4              ;NO..
           JMP     DLLP4

DLLP2      MOV     @2(R4),R3       ;GET NEXT POINTER
           JEQ     DLLP3           ;IF = 0 THEN END

           MOV     R3,*R4+         ;OVER RUN POINTER WITH NEXT IN LINE
           JMP     DLLP2
DLLP3      CLR     *R4             ;CLEAR LAST POINTER

           INC     @SECTOR         ;WRITE LM
           BLWP    @MOVVDP         ;WRITE LM TO PABBUF
           DATA    SRCST1
           BLWP    @WRSECX         ;WRITE LM TO DISK

           SCREEN  1               ;CLEAR LINE
           DISPLAY 20,3,SPACES,30

DLLP5      AI      R5,40
           AI      R6,20
           DEC     R7
           JNE     DLLP1
           JMP     RENAME

GTMLNK     MOV     @MBLNK,R1       ;GET SECTOR ADDR AND OFFSET
           JEQ     ZEROF           ;FILE WITH ONLY A DIRECTORY(SIZE=1)

           MOVB    @1(R1),R0       ;FOR MASTER DISK
           SRL     R0,8
           MOVB    *R1,R0

           ANDI    R0,>FF0F        ;MASK OUT 3RD NYBBLE
           SWPB    R0
           MOV     R0,@MSECT       ;SAVE START SECTOR ADDR

           MOVB    @1(R1),R0       ;BUILD OFFSET POINTER
           ANDI    R0,>F000
           SRL     R0,8
           MOVB    @2(R1),R0
           SRL     R0,4
           MOV     R0,@MOFFST

           AI      R1,3            ;POINT TO NEXT BLOCK LINK
           MOV     R1,@MBLNK       ;FOR MASTER DISK
           JMP     FINML

ZEROF      CLR     @MOFFST
           CLR     @MSECT
FINML      RT

GETLNK     MOV     @BLKLNK,R1      ;GET SECTOR ADDR AND OFFSET
           JEQ     ZEROS           ;SECTOR ZERO...SKIP

           MOVB    @1(R1),R0
           SRL     R0,8
           MOVB    *R1,R0

           ANDI    R0,>FF0F        ;MASK OUT 3RD NYBBLE
           SWPB    R0
           MOV     R0,@STRSCT      ;SAVE START SECTOR ADDR

           MOVB    @1(R1),R0       ;BUILD OFFSET POINTER
           ANDI    R0,>F000
           SRL     R0,8
           MOVB    @2(R1),R0
           SRL     R0,4
           MOV     R0,@OFFSET

           AI      R1,3            ;POINT TO NEXT BLOCK LINK
           MOV     R1,@BLKLNK
           JMP     FINGL

ZEROS      CLR     @OFFSET
           CLR     @STRSCT
FINGL      RT

RTNBM      MOV     R11,R10         ;SAVE RTN ADDR
           SETO    R8              ;R8= OFFSET COUNTER
RTNLP1     MOV     @STRSCT,R1
           JEQ     NORTN           ;NEVER RETURN BM FOR SECTOR 0

           CLR     R0              ;R0=0 R1=DIVEDEND

           CI      R1,7            ;IS RANGE (0-7)
           JGT     RTNLP3
           JMP     RTNLP4

RTNLP3     DIV     @D08,R0         ;R0=QUOTIENT R1=REMAINDER

RTNLP4     LI      R4,>0100        ;SHIFT MASK
           LI      R3,56           ;BM OFFSET FROM START OF SECTOR 0
           A       R0,R3           ;R3 POINTS TO BIT MAP BYTE

           MOV     R1,R0           ;R0 IS BIT SHIFT COUNTER
           JEQ     NOSHFT          ;IF=0 THEN NO SHIFT

           SLA     R4,0            ;SHIFT R4//R0 TIMES
NOSHFT     SZCB    R4,@SRCST0(R3)  ;MASK IN FREE SECTOR

           INC     @STRSCT         ;INC ADDR
           INC     R8              ;INC OFFSET COUNTER
           C       R8,@OFFSET      ;ARE WE AT THE END?
           JEQ     RTNLP2          ;YES..
           JMP     RTNLP1          ;CARRY ON...

RTNLP2     BL      @GETLNK         ;CHECK IF MORE IN BLOCK LINK
           MOV     @STRSCT,R1      ;IS IT = 0
           JNE     RTNLP1          ;NO..CONTINUE

NORTN      B       *R10
;----------------------------------------------------------------------
;
;  -- R E N A M E --
;
;     THIS ROUTINE RENAMES FILES
;
;----------------------------------------------------------------------
RENAME     MOV     @FILCNT,R7      ;NUMBER OF FILES
           LI      R5,SCNBUF
           LI      R6,CATBUF

RELP2      CB      @1(R5),@ASC_D   ;WAS FILE DELETED?
           JEQ     RELP4           ;YES.. NEXT FILE

           LI      R4,10           ;10 BYTES TO TEST
           MOV     R5,R3           ;SCNBUF FILENAME ADDR
           AI      R3,4
           MOV     R6,R2           ;CATBUF FILENAME ADDR

RELP1      CB      *R3+,*R2+       ;CHECK FILENAME
           JNE     RELP3
           DEC     R4
           JNE     RELP1

RELP4      AI      R5,40           ;ADJUST POINTERS
           AI      R6,20
           DEC     R7              ;ANY MORE FILES?
           JNE     RELP2           ;YES.. THEN LOOP
           B       @PROTCM         ; NO.. GOTO NEXT FUNTION

RELP3      MOV     R5,R3
           AI      R3,4
           MOV     R3,@TDATA5+2    ;NEW FILENAME
           MOV     R3,@TDATA6      ; "      "

           SCREEN  2
           DISPLAY 20,3,TXTCM3,14  ;'RENAME FILE : '
TDATA5     DISPLAY 20,17,0,10      ;'NEW FILENAME'

           MOV     @FILCNT,R9      ;TEST FOR DUPLICATE FILENAME
           LI      R12,CATBUF

RELP3C     MOV     R12,R10
           MOV     R5,R11          ;NEW FILENAME
           AI      R11,4

           LI      R2,10           ;10 BYTES TO CHECK
RELP3A     CB      *R10+,*R11+
           JNE     RELP3B
           DEC     R2
           JNE     RELP3A
           SCREEN  1               ;*DUP FILE ERROR*
           DISPLAY 23,11,TXTPRO,14 ;'DUPLICATE FILE'
           B       @TPLP1

RELP3B     AI      R12,20
           DEC     R9
           JNE     RELP3C

           MOV     @10(R6),R8
           MOV     R8,@SECTOR
           BLWP    @RDSECX         ;READ DIRECTORY ENTRY

           BLWP    @DSPTXT         ;WRITE NEW FILENAME
           DATA    1
           DATA    PABBUF
TDATA6     DATA    0               ;'NEW FILENAME'
           DATA    10

           LI      R0,PABBUF
           MOV     R6,R1           ;CATBUF ADDR
           LI      R2,10
           BLWP    @VMBR           ;SAVE NEW ADDR

RELP6      BLWP    @WRSECX         ;WRITE DIRECTORY ENTRY

           LI      R0,1            ;ADJUST LM
           MOV     R0,@SECTOR
           BLWP    @RDSECX

           BLWP    @MOVSCT
           DATA    DSTST1

           LI      R4,DSTST1       ;* REMOVE OLD POINTER *
TIC1       C       R8,*R4
           JEQ     TIC2

           INCT    R4
           JMP     TIC1

TIC2       MOV     @2(R4),R3
           JEQ     TIC3

           MOV     R3,*R4+
           JMP     TIC2

TIC3       CLR     *R4

           LI      R4,DSTST1       ;* SORT LM *
QTIP3      MOV     *R4+,@SECTOR
           JEQ     QTIP4

           BLWP    @RDSECX

           LI      R0,PABBUF
           LI      R1,TBUF
           LI      R2,10
           BLWP    @VMBR

           MOV     @TDATA6,R3         ;LOC OF FILE ADDR

QTIP5      CB      *R3+,*R1+
           JGT     QTIP3
           JLT     QTIP4
           JMP     QTIP5

QTIP4      DECT    R4
QTIP4A     MOV     *R4,R3
           MOV     R8,*R4+
           MOV     *R4,R8
           MOV     R3,*R4+
           JNE     QTIP4A

           LI      R0,1
           MOV     R0,@SECTOR
           BLWP    @MOVVDP
           DATA    DSTST1

           BLWP    @WRSECX

           SCREEN  1                  ;BLANK LINE
           DISPLAY 20,3,SPACES,25
           B       @RELP4

PROTCM     MOV     @FILCNT,R7      ;NUMBER OF FILES

           LI      R5,SCNBUF
           LI      R6,CATBUF

PRLP5      CB      @1(R5),@ASC_D   ;WAS FILE DELETED?
           JEQ     PRLP4           ;YES.. NEXT FILE

           CB      @32(R5),@ASC_U  ;LEAVE FILE UNPROTECTED
           JEQ     PRLP4           ;YES.. NEXT FILE

           MOVB    @12(R6),R4      ;GET FILE FLAG
           CZC     @PROMSK,R4      ;IS FILE ALREADY PROTECTED
           JNE     PRLP4           ;YES.. NEXT FILE

           MOV     R6,@TDATA3+2       ;FILENAME POINTER
           SCREEN  2
           DISPLAY 20,3,TXTCM5,13  ;'PROTECTING : '
TDATA3     DISPLAY 20,16,0,10      ;'**********' FILE NAME

           SOCB    @PROMSK,R4         ;SET PROTECT FLAG
           MOV     @10(R6),@SECTOR ;GET LINK MAP POINTER
           BLWP    @RDSECX

           LI      R0,PABBUF+12       ;ADDR OF FILE FLAG
           MOVB    R4,R1
           BLWP    @VSBW           ;WRITE FILE FLAG

PRLP3      BLWP    @WRSECX         ;WRITE DIRECTORY ENTRY

           MOVB    R4,@12(R6)      ;SAVE FLAG

           SCREEN  1               ;BLANK OUT DISKNAME
           DISPLAY 20,3,SPACES,30

PRLP4      AI      R5,40
           AI      R6,20
           DEC     R7
           JNE     PRLP5

LSTSCT     DATA    0               ;USED TO SORT LM//SAVE LAST POINTER

CPYMOV     MOV     @FILCNT,R7      ;# OF FILES TO SEARCH
           CLR     @LSTSCT

           LI      R5,SCNBUF
           LI      R6,CATBUF
           MOV     R6,@TEMPR3      ;SAVE FOR MYREG6
CPYTST     CB      @1(R5),@ASC_N   ;COPY THIS PGM?
           JEQ     CKNXT           ;NO.CHECK NEXT ONE

           CB      @1(R5),@ASC_D   ;WAS FILE DELETED?
           JNE     CPY

CKNXT      SCREEN  1
           DISPLAY 20,3,SPACES,22  ;BLANK LINE

           AI      R5,40           ;MOVE TO NEXT FILE
           AI      R6,20
           MOV     R6,@TEMPR3      ;SAVE FOR MYREG6
           DEC     R7              ;DEC FILE COUNTER
           JNE     CPYTST

           B       @MOVTST         ;GOTO NEXT FUNCTION
;----------------------------------------------------------------------
;
;  -- C P Y --
;
;     THIS ROUTINE COPIES FILES
;
;----------------------------------------------------------------------
CPY        SCREEN  2
           DISPLAY 3,8,TXTTFC,20   ;'TOTAL FILES TO COPY:'
           DISPLAY 4,8,TXTTSC,20   ;'TOTAL SIZE OF FILES:'

           MOV     @CPYFIL,R0      ;SHOW # OF FILES
           BLWP    @DISP
           DATA    151

           MOV     @CPYSCT,R0      ;SHOW SIZE OF FILES
           BLWP    @DISP
           DATA    191

           MOVB    @SRCDRV,@OPDRV  ;CHECK SOURCE DRIVE OPERATION
           MOV     @10(R6),@SECTOR ;GET SOURCE DIRECTORY ENTRY
           BLWP    @RDSECX

           BLWP    @MOVSCT
           DATA    SRCST2

           SCREEN  2
           DISPLAY 20,3,TXTCM4,12  ;'COPY FILE : '
           DISPLAY 20,15,SRCST2,10 ;'FILENAME'

           LWPI    MYREG6          ;CLEAR WRITE FLAG
           CLR     R9
           LWPI    MYREG1

           LI      R1,SRCST2+>1C   ;START OF MASTER SOURCE BLOCK(0 FOR 1 SECTOR FILE)
           MOV     R1,@MBLNK       ;STORE MASTER BLOCK LINK
           JEQ     QLP2            ;SKIP WRITE FOR 1 SECTOR FILES

           BL      @GTMLNK         ;GET BLOCK LINK

           CLR     R9              ;CLEAR OFFSET COUNTER
CKBLK3     CLR     R10             ;MAX SECTOR COUNTER
           LI      R8,>1000        ;PABBUF ADDR (VARIABLE)

           LI      R0,PAB          ;SET UP PAB
           LI      R1,PDATA1
           LI      R2,>0020
           BLWP    @VMBW

           CLR     @FAC+2          ;PREPARE TO ACCESS DISK
           INC     @FAC+2
           MOVB    @SRCDRV,@FAC+2

CKBLK2     MOV     R8,@FAC+4       ;PABBUF ADDR
           MOV     @MSECT,@FAC+6   ;SECTOR ADDR

           MOV     R8,@TEMPR2      ;ADJUST NEW PABBUF ADDR
           LI      R0,PAB+2
           LI      R1,TEMPR2
           LI      R2,2
           BLWP    @VMBW

           LI      R2,PAB+9        ;SET UP POINTER
           MOV     R2,@PNTR
           BLWP    @DSRLNK
           DATA    10              ;READ IN SECTOR

           MOVB    @DSKERR,R0         ;ERROR?
           JEQ     QLP2            ;NO.
           B       @WPMSG          ;YES.

MOFFST     DATA    0               ;OFFSET FOR MASTER DISK
MSECT      DATA    0               ;SECT # FOR MASTER DISK
MBLNK      DATA    0               ;BLOCK LINK FOR MASTER DISK


QLP2       BLWP    @KSCAN          ;TEST FOR KEY PRESSED
           MOVB    @STATUS,R1
           JEQ     QLP2A

           CB      @KCODE,@TWO
           JNE     QLP2A
           B       @ABTMSG

QLP2A      C       R9,@MOFFST      ;ARE WE AT END OF BLOCK?
           JEQ     CKBLK           ;YES..CHECK NEXT BLOCK LINK

           INC     @MSECT          ;INC SECTOR POINTER
           INC     R9              ;INC OFFSET COUNTER
           INC     R10             ;INC SECTOR COUNTER (MAX 39)
           CI      R10,39          ;ARE WE UP TO 39 YET?
           JEQ     WRITE           ;YES..WRITE TO DISK

           AI      R8,256          ;INC VDP PABBUF ADDR
           JMP     CKBLK2

CKBLK      MOV     @SRCST2+14,R11  ;GET SIZE(=0 IF 1 SECTOR FILE)
           JEQ     WRITE           ;FOR 1 SECTOR FILE

           DEC     R11             ;SIZE-1
           C       R9,R11          ;COUNT=SIZE??
           JEQ     WRITE           ;YES..WRITE TO DISK

           BL      @GTMLNK         ;GET NEXT BLOCK LINK  IN CASE THERE IS ONE

           INC     R9              ;INC OFFSET COUNTER
           INC     R10             ;INC SECTOR COUNTER
           CI      R10,39          ;ARE WE AT 39 SECTORS YET??
           JEQ     WRITE           ;YES..WRITE TO DISK

           AI      R8,256          ;INC VDP PABBUF ADDR
           JMP     CKBLK2

WRITE      LWPI    MYREG6          ;USE NEW REGISTERS

WRITED     MOV     R9,R9           ;FIRST TIME THROUGH?
           JEQ     SETSCT          ;YES..SET BM//LM//DIRECTORY

           B       @WRITE2         ;NO.. CONTINUE COPING FILE

SETSCT     BLWP    @MOVSCT         ;SAVE PABBUF CONTENT
           DATA    TMPSCT

           MOVB    @DSTDRV,@OPDRV  ;GET DESTINATION DRIVE INFO

           CLR     @SECTOR         ;GET SECTOR 0
           BLWP    @RDSECX

           BLWP    @MOVSCT
           DATA    DSTST0

           INC     @SECTOR         ;GET SECTOR 1
           BLWP    @RDSECX

           BLWP    @MOVSCT
           DATA    DSTST1

           LI      R4,DSTST1       ;DEST LINK MAP
CPYLP2     MOV     *R4+,@SECTOR    ;GET LM POINTER
           JEQ     CPYLP9          ;EXIT IF ZERO

           BLWP    @RDSECX         ;SEARCH DEST DISK FOR DUP FILE

           LI      R0,PABBUF       ;GET FILENAME
           LI      R1,TBUF         ;TEMP BUFF
           LI      R2,10           ;10 BYTES TO TEST
           BLWP    @VMBR

           MOV     @TEMPR3,R3      ;CATBUF FILENAME ADDR

CPYLP1     CB      *R1+,*R3+       ;TEST CHARS ARE THE SAME.
           JGT     CPYLP9          ;EXIT IF THE REST ARE LARGER
           JLT     CPYLP2

           DEC     R2
           JNE     CPYLP1          ;LOOP IF MORE TO TEST

           LI      R0,PABBUF+12    ;FILE FLAG ADDR
           BLWP    @VSBR           ;GET FILE FLAG
           CZC     @PROMSK,R1      ;IS FILE PROTECTED?
           JEQ     CPYCN           ;NO..

           SCREEN  1               ;YES.
           DISPLAY 23,3,TXTPRO,31  ;'DUPLICATE FILE WRITE PROTECTED.'

           LWPI    MYREG1
           B       @TPLP1

CPYCN      BL      @CALCBM         ;* TEST FOR ENOUGH FREE SPACE *
           DATA    DSTST0

           BLWP    @MOVSCT         ;GET DUP FILE DIRECTORY
           DATA    DSTST2

           MOV     @DSTST2+14,R0   ;GET SRC FILE SIZE
           INC     R0              ;ADD 1 FOR DIRECTORY
           A       @TEMPR1,R0      ;ADD FREE DISK SPACE
           C       @SRCST2+14,R0
           JLE     DELDUP          ;LOTS OF ROOM CONTINUE

NODEL      SCREEN  1
           DISPLAY 23,3,TXTLRG,30  ;'FILE TOO LARGE. PRESS ANY KEY.'
           B       @TPLP1

DELDUP     MOV     @SECTOR,@TEMPR3 ;* DEL FILE * SAVE LM POINTER

           LI      R1,DSTST2+>1C   ;BLOCK LINK POINTER
           MOV     R1,@BLKLNK

CPYLP3     BL      @GETLNK         ;GET STRSCT//OFFSET
           BL      @RTNBM2         ;RETURN USED SECTORS TO BM

           MOV     @SECTOR,@STRSCT ;RETURN DIRECTORY ENTRY POINTER TO BM
           CLR     @OFFSET
           BL      @RTNBM2

           LI      R4,DSTST1       ;ADJUST LM POINTERS
CPYLP5     C       @TEMPR3,*R4     ;COMPARE POINTER
           JEQ     CPYLP6          ;FOUND POINTER..
           INCT    R4
           JMP     CPYLP5          ;LOOP TO NEXT LM PNTR

CPYLP6     MOV     @2(R4),R3       ;ADJUST LM NOW
           JEQ     CPYLP7          ;EXIT IF ZERO

           MOV     R3,*R4+         ;SHUFFLE POINTERS
           JMP     CPYLP6
CPYLP7     CLR     *R4             ;END OF LM
           JMP     CPYLPA

CPYLP9     BL      @CALCBM         ;CHECK FOR FREE SPACE
           DATA    DSTST0

           MOV     @TEMPR1,@TEMPR1 ;IS DISK FULL??
           JEQ     CPYLPB          ;YES..

           MOV     @SRCST2+14,R0
           INC     R0
           C       R0,@TEMPR1
           JLE     CPYLPA

           B       @NODEL          ;FILE TOO LARGE

CPYLPB     SCREEN  1
           DISPLAY 23,3,TXTFUL,32  ;'BACKUP DISK FULL. PRESS ANY KEY.'
           B       @TPLP1

CPYLPA     BLWP    @CLRBUF         ;CLEAR OUT SECTOR BUFFER
           DATA    DSTST2

           LI      R0,SRCST2       ;MOVE FILE INFO TO NEW DIRECTORY ENTRY
           LI      R1,DSTST2
           LI      R2,20           ;20 BYTES TO MOVE
MVLP1      MOVB    *R0+,*R1+
           DEC     R2
           JNE     MVLP1           ;LOOP IF NOT FINISHED

           LI      R10,DSTST2+>1C  ;YES..CREATE A NEW BLOCK LINK
           MOV     R10,@DSTBLK     ;SAVE ADDR

           SETO    R13             ;CLEAR OFFSET COUNTER
           CLR     R12             ;CLEAR BLOCK LINK COUNTER

           MOV     @SRCST2+14,R8   ;GET SIZE OF FILE
           JEQ     WRLP6           ;FOR 1 SECTOR FILES

WRLP3      BLWP    @FINDHI         ;FIND FREE SECTOR (RANGE 34-MAX)
           MOV     R0,R3           ;SAVE ADDR

WRLP5      MOV     R12,R12         ;IS THIS FIRST SECTOR
           JEQ     WRLP1           ;YES..

           INC     R2              ;LAST SECTOR NUMBER + 1
           C       R0,R2           ;IS SECTOR NEXT IN SEQUENCE?
           JNE     WRLP4           ;NO..ASSEMBLE BLOCK LINK
           JMP     WRLP2

WRLP1      MOV     R0,@TEMPR2      ;SAVE START SECTOR
WRLP2      MOV     R0,R2           ;SAVE SECTOR FOR COMPARISION
           INC     R13             ;INC OFFSET
           INC     R12             ;INC BLOCK COUNTER
           DEC     R8              ;DEC SIZE COUNTER
           JNE     WRLP3

WRLP4      MOV     @TEMPR2,R0      ;BUILD BLOCK
           SWPB    R0              ;GET SS2-SS1 NYBBLE
           MOVB    R0,*R10+        ;PUT BYTE IN BLOCK LINK

           MOV     R13,R12         ;GET R01-SS3 NYBBLE
           ANDI    R12,>000F
           SLA     R12,12
           ANDI    R0,>000F
           SLA     R0,8
           A       R12,R0
           MOVB    R0,*R10+        ;PUT BYTE IN BLOCK LINK

           MOV     R13,R0          ;GET R03-R02 NYBBLE
           SLA     R0,4
           MOVB    R0,*R10+        ;PUT BYTE IN BLOCK LINK

           MOV     R8,R8           ;ARE WE FINISHED
           JEQ     WRLP6           ;YES..

           CLR     R12             ;CLEAR BLOCK COUNTER
           MOV     R3,R0           ;RESTORE ADDR
           JMP     WRLP1

WRLP6      BLWP    @FINDLO         ;GET SECTOR FOR DIRECTORY
           BLWP    @MOVVDP
           DATA    DSTST2

           MOV     R0,R8           ;SAVE DIRECTORY POINTER
           MOV     R0,@SECTOR
           BLWP    @WRSECX         ;WRITE TO DISK FILE DIRECTORY

           LI      R4,DSTST1       ;LM ADDR * SORT LINK MAP *
           MOV     R4,R6
           MOV     @LSTSCT,R0      ;FIRST TIME THROUGH SORT
           JEQ     SRLP1           ;YES..

SRLP1A     MOV     *R4+,R5         ;NO..PRESORT ALL PREVIOUS POINTERS
           C       R5,R0
           JNE     SRLP1A

SRLP1      MOV     R8,@LSTSCT      ;SAVE POINTER

SRLP4      MOV     *R4,@SECTOR
           JEQ     SRLP3
           BLWP    @RDSECX         ;GET DIRECTORY

           LI      R0,PABBUF       ;GET FILENAME
           LI      R1,TBUF
           LI      R2,10
           BLWP    @VMBR

           LI      R0,DSTST2       ;FILENAME TO CHECK AGAINST
           LI      R1,TBUF
SRLP2      CB      *R0+,*R1+       ;CHECK CHAR
           JEQ     SRLP2
           JLT     SRLP3
           INCT    R4
           JMP     SRLP4

SRLP3      C       R4,R6
           JEQ     SRLP6
           DECT    R4
           MOV     *R4,@SECTOR
           BLWP    @RDSECX
           LI      R0,PABBUF
           LI      R1,TBUF
           LI      R2,10
           BLWP    @VMBR
           LI      R0,DSTST2
           LI      R1,TBUF
SRLP2A     CB      *R0+,*R1+
           JEQ     SRLP2A
           JLT     SRLP3

           INCT    R4

SRLP6      MOV     *R4,R3
           MOV     R8,*R4+
           MOV     *R4,R8
           MOV     R3,*R4+
           JNE     SRLP6

           CLR     @SECTOR         ;WRITE BM TO DISK
           BLWP    @MOVVDP
           DATA    DSTST0
           BLWP    @WRSECX

           INC     @SECTOR         ;WRITE LM TO DISK
           BLWP    @MOVVDP
           DATA    DSTST1
           BLWP    @WRSECX

           BLWP    @MOVVDP         ;RESTORE PABBUF CONTENTS
           DATA    TMPSCT

           BL      @SHOWDN         ;SHOW NEW BM INFO

           MOV     @SRCST2+14,@SRCST2+14    ;IS IT 1 SECTOR FILE
           JEQ     WTLP4                    ;YES

           BL      @GTLNK2         ;GET DEST BLOCK LINK

WRITE2     CLR     R10             ;CLEAR SECTOR COUNTER
           LI      R8,>1000        ;PABBUF ADDR

           CLR     @FAC+2          ;ACCESS DRIVE FOR WRITE OPERATION
           MOVB    @DSTDRV,@FAC+2

WTLP1      MOV     R8,@FAC+4       ;PABBUF ADDR
           MOV     @DSTSTR,@FAC+6  ;SECTOR ADDR

           MOV     R8,@TEMPR2      ;ADJUST PAB ADDR
           LI      R0,PAB+2
           LI      R1,TEMPR2
           LI      R2,2
           BLWP    @VMBW

           LI      R2,PAB+9        ;ADJUST POINTER
           MOV     R2,@PNTR
           BLWP    @DSRLNK
           DATA    10              ;WRITE TO DISK

           MOVB    @DSKERR,R0
           JEQ     QLP9
           B       @WPMSG

QLP9       BLWP    @KSCAN          ;TEST FOR KEY PRESSED
           MOVB    @STATUS,R1
           JEQ     QLP9A

           CB      @KCODE,@TWO
           JNE     QLP9A
           B       @ABTMSG

QLP9A      C       R9,@DSTOFF      ;ARE WE AT END OF OFFSET?
           JEQ     WTLP2           ;YES..
           JGT     WTLP2           ;WE ARE OVER BUT IT IS OK

           INC     @DSTSTR         ;INC SECTOR POINTER
           INC     R9              ;INC OFFSET POINTER
           INC     R10             ;INC SECTOR COUNTER
           CI      R10,39          ;ARE WE AT 39 YET??
           JEQ     WTLP3           ;YES..

           AI      R8,256          ;INC VDP PABBUF ADDR
           JMP     WTLP1

WTLP2      MOV     @DSTST2+14,R11  ;GET SIZE
           DEC     R11             ;SIZE-1
           C       R9,R11          ;SIZE=COUNT
           JEQ     WTLP4           ;YES..

WTLP5      INC     R9              ;INC OFFSET COUNTER
           INC     R10             ;INC SECTOR COUNTER
           CI      R10,39          ;ARE WE AT 39 YET?
           JEQ     WTLP3           ;YES..

           BL      @GTLNK2         ;GET NEXT BLOCK LINK
           AI      R8,256          ;ADJUST VDP PABBUF ADDR
           JMP     WTLP1

WTLP3      LWPI    MYREG1          ;GET MORE SECTORS
           B       @CKBLK3

WTLP4      LWPI    MYREG1          ;GET MORE FILES

           DEC     @CPYFIL
           S       @DSTST2+14,@CPYSCT
           DEC     @CPYSCT         ;SUB 1 AGAIN FOR DIRECTORY ENTRY

           SCREEN  1               ;BLANK OUT FILENAME
           DISPLAY 20,3,SPACES,22
           B       @CKNXT

RTNBM2     MOV     R11,R10         ;RETURN USED BITS TO DEST DISK ROUTINE
           SETO    R8
RTZLP1     MOV     @STRSCT,R1      ;START SECT ADDR
           JEQ     NORTN2          ;NEVER RETURN BM FOR SECTOR 0

           CLR     R0

           CI      R1,7            ;IS RANGE (0-7)
           JGT     RTZLP3
           JMP     RTZLP4

RTZLP3     DIV     @D08,R0         ;R0=QOUTIENT //R1= REMAINDER

RTZLP4     LI      R4,>0100        ;SHIFT MASK
           LI      R3,56
           A       R0,R3

           MOV     R1,R0           ;R0 IS BIT SHIFT COUNTER
           JEQ     NZSHFT          ;IF=0 THEN NO SHIFT

           SLA     R4,0            ;SHIFT R4/R0 TIMES
NZSHFT     SZCB    R4,@DSTST0(R3)  ;MASK IN SECTORS

           INC     @STRSCT         ;INC ADDR
           INC     R8              ;INC OFFSET COUNTER
           C       R8,@OFFSET
           JEQ     RTZLP2
           JMP     RTZLP1

RTZLP2     BL      @GETLNK         ;GET NEXT BLOCKLINK
           MOV     @STRSCT,R1
           JNE     RTZLP1

NORTN2     B       *R10            ;RETURN

FINDHH     LI      R7,DSTST0+>3C   ;SECTOR RANGE(34-MAX)
           LI      R6,34
           JMP     FZLP3

FINDLL     LI      R7,DSTST0+>38   ;SECTOR RANGE(2-MAX)
           LI      R6,2

FZLP3      LI      R5,>0400        ;MASK (START AT 2 INSTEAD OF 0)
           LI      R4,6            ;     (ONLY 6 BITS TO SHIFT)
           JMP     FZLP6

FZLP1      LI      R5,>0100        ;SHIFT MASK
           LI      R4,8            ;8 BITS TO SHIFT

FZLP6      MOVB    *R7+,R3         ;GET BM BYTE
FZLP2      CZC     R5,R3           ;CHECK FOR FREE BIT
           JEQ     FZLP4

           SLA     R5,1            ;SHIFT
           INC     R6              ;INC SECTOR COUNTER
           DEC     R4              ;MORE TO TEST?
           JNE     FZLP2

           C       R6,@DSTST0+10   ;ARE WE AT END OF BM
           JEQ     FINDLL          ;YES..CHECK LO END
           JMP     FZLP1

FZLP4      SOCB    R5,R3           ;SET BIT
           DEC     R7              ;ADJUST BM POINTER
           MOVB    R3,*R7          ;SAVE BYTE TO BM
           MOV     R6,*R13         ;RETURN SECTOR TO "R0"
           RTWP

GTLNK2     MOV     @DSTBLK,R1      ;GET DSTSTR//DSTOFF
           JEQ     ZERO2           ;1 SECTOR FILE SO SKIP ?

           MOVB    @1(R1),R0
           SRL     R0,8
           MOVB    *R1,R0

           ANDI    R0,>FF0F        ;GET 3RD NYBBLE
           SWPB    R0
           MOV     R0,@DSTSTR      ;SAVE DEST START SECTOR

           MOVB    @1(R1),R0       ;BUILD OFFSET POINTER
           ANDI    R0,>F000
           SRL     R0,8
           MOVB    @2(R1),R0
           SRL     R0,4
           MOV     R0,@DSTOFF      ;SAVE DEST OFFSET

           AI      R1,3            ;POINT TO NEXT BLOCK LINK
           MOV     R1,@DSTBLK
           JMP     FINN2

ZERO2      CLR     @DSTOFF
           CLR     @DSTSTR

FINN2      RT

MOVTST     SCREEN  2
           DISPLAY 3,8,SPACES,25
           DISPLAY 4,8,SPACES,25

           MOV     @FILCNT,R7      ;NUMBER OF FILES

           LI      R5,SCNBUF
           LI      R6,CATBUF
           MOVB    @SRCDRV,@OPDRV
MVTST      CB      @1(R5),@ASC_M   ;MOVE OPTION??
           JEQ     MVDEL           ;YES..DELETE FILE

MVDLP5     AI      R5,40
           AI      R6,20
           DEC     R7
           JNE     MVTST           ;LOOP IF MORE FILES TO TEST
           JMP     MVDLP7

MVDEL      MOV     R6,@TDATA7+2    ;FILENAME POINTER
           SCREEN  2
           DISPLAY 20,3,TXTCM2,14  ;'DELETE FILE :'
TDATA7     DISPLAY 20,17,0,10      ;'_________ FILENAME'

           MOV     @10(R6),@SECTOR ;GET DIRECTORY
           BLWP    @RDSECX

           BLWP    @MOVSCT
           DATA    SRCST2          ;GET DIRECTORY

           LI      R1,SRCST2+>1C   ;BLOCK LINK ADDR
           MOV     R1,@BLKLNK

MVDLP1     BL      @GETLNK         ;GET STRSCT//OFFSET
           BL      @RTNBM          ;RETURN BM BITS

           MOV     @10(R6),@STRSCT
           CLR     @OFFSET
           BL      @RTNBM          ;RETURN LM POINTER

           CLR     @SECTOR         ;YES.. RETURN BM
           BLWP    @MOVVDP
           DATA    SRCST0
MVDLP9     BLWP    @WRSECX         ;WRITE BM

           LI      R4,SRCST1       ;LM BUFFER
MVDLP2     C       @10(R6),*R4
           JEQ     MVDLP3
           INCT    R4
           JMP     MVDLP2

MVDLP3     MOV     @2(R4),R3       ;SHUFFLE LM POINTERS
           JEQ     MVDLP4
           MOV     R3,*R4+
           JMP     MVDLP3

MVDLP4     CLR     *R4             ;CLEAR LAST POINTER
           INC     @SECTOR         ;RETURN LM
           BLWP    @MOVVDP
           DATA    SRCST1
           BLWP    @WRSECX         ;WRITE LM
           SCREEN  1
           DISPLAY 20,3,SPACES,30
           JMP     MVDLP5          ;LOOP TO NEXT FILE

MVDLP7     B       @CAT            ;COMMANDS COMPLETED
;----------------------------------------------------------------------
;                   DISK I/O WITH ERROR REPORTING
;
; READS OR BKP280 SECTOR (@SECTOR) FROM/TO VOLUME (@OPDRV)
;----------------------------------------------------------------------
$RDSECX    CLR     @FAC+2          ;READ SECTOR
           INC     @FAC+2          ;1=READ
           JMP     STSCTX
$WRSECX    CLR     @FAC+2          ;WRITE SECTOR 0=WRITE
STSCTX     MOVB    @OPDRV,@FAC+2
           LI      R2,PABBUF
           MOV     R2,@FAC+4
           MOV     @SECTOR,@FAC+6

           LI      R0,PAB          ;SET PAB
           LI      R1,PDATA1
           LI      R2,>0020
           BLWP    @VMBW

           LI      R2,PAB+9        ;INVOKE DSR
           MOV     R2,@PNTR
           BLWP    @DSRLNK
           DATA    10

CKERRX     CLR     R0              ;CLEAR REG
           MOVB    @DSKERR,R0      ;GET ERROR FLAG
           JEQ     KEYX            ;IF NOT SET CONTINUE
           B       @WPMSG          ;ERROR..

KEYX       BLWP    @KSCAN          ;KEY PRESSED ??
           MOVB    @STATUS,R1
           JEQ     ENDSCX          ;NO..

           CB      @KCODE,@TWO     ;YES.. IS IT FCTN 4 (CLEAR)
           JEQ     ABTMSG          ;USER HALTED I/O

ENDSCX     RTWP

ABTMSG     LWPI    MYREG1
           SCREEN  1
           DISPLAY 21,11,TXTABT,18 ;'I/O HALTED BY USER'
           B       @CONTINUE
;------------------------------------------------------
;
; -- M A I N --
;
;------------------------------------------------------
MAIN       LWPI    MYREG1
           LIMI    0
           BL      @CFID
           LI      R0,>0500
           MOV     R0,@>8374       ;LOAD KEY UNIT 5
           BLWP    @CLRSCN
           LI      R0,>F001        ;>01F0 BYTES REVERSED
           MOVB    R0,@>83D4       ;PUT VAL FOR KSCAN
           SWPB    R0
           BLWP    @VWTR           ;ENABLE SCREEN VIDEO//TEXT MODE

;     CODE TO CHECK THE TYPE OF DISK CONTROLLER USER
           LI      R12,>1100
           SBO     0               ;TURN ON DSR ROM
           MOV     @>4004,R0       ;MOVE WORD AT FIRST DIFFERENCE
           SBZ     0               ;TURN OFF
           CI      R0,>4010        ;>4010 FOR MYARC
           JNE     FCTL            ;MUST BE CORCOM OR TI

           LI      R1,>1000        ;>1000 FOR DSDD   MYARC CONTROLLER
           MOV     R1,@SECCNT
           LI      R1,640          ;640 FOR SSDD
           MOV     R1,@DSKCNT
           LI      R1,80           ;BITCOUNT IF DD
           MOV     R1,@BMCNT

           LI      R2,4            ;FILE MUST BE CALLED MGR1 R2 HAS NAME LENGTH
           JMP     FMYA

;    GET LAST FILE NAME/DRIVE LOADER IF TI CONTROLLER/CORCOM=??
FCTL       LI      R0,>3FED        ;LAST DRIVE USED
           BLWP    @VSBR
           MOVB    R1,@OPDRV       ;SAVE DRIVE # TO BUFFER
           LI      R0,>3FEE        ;** VDP ADDRESS OF NAME
           LI      R1,TXTMGR       ;** CPU STORAGE FOR NAME
           LI      R2,10           ;** 10 CHARACTERS
           BLWP    @VMBR           ;** GET NAME
           CLR     R0              ;** POINTER IN NAME
           CLR     R2
GTNM       MOVB    *R1+,R2         ;** GET CHARACTER
           CI      R2,>2000        ;** SPACE?
           JEQ     NMOK            ;** IF SO, COUNT COMPLETE
           INC     R0              ;** IF NOT, INC. POINTER
           CI      R0,10           ;** LAST CHARACTER?
           JEQ     NMOK            ;** IF SO, COUNT COMPLETE
           JMP     GTNM            ;** IF NOT, CHECK NEXT
           DATA    >EEEE
NMOK       MOV     R0,R2           ;** HOLD LENGTH IN R2
           SWPB    R0
           MOVB    R0,@MGRLN       ;   SAVE LENGTH
           LI      R0,TXTMGR       ;** POINT TO LAST FILE NAME
           A       R2,R0           ;** ONE BYTE AFTER LAST CHAR.
           DEC     R0              ;** LAST CHAR. IN NAME
           MOVB    *R0,R1          ;** MOVE IT TO R1 HIGH BYTE
           AI      R1,-256         ;** DECREMENT HIGH BYTE BY 1
           MOVB    R1,*R0          ;** MOVE RESULT BACK (FIRST FILE)
                                   ;NAME IS ONE CHAR. LESS THAN SECOND)

; ***************
FMYA       LI      R1,1
           MOV     R1,@SECTOR
           BLWP    @RDSECT
           BLWP    @MOVSCT
           DATA    SRCST1
           LI      R4,SRCST1
MGRST3     MOV     *R4+,@SECTOR
           JEQ     MGR
           BLWP    @RDSECT
           LI      R3,TXTMGR
           LI      R0,PABBUF
           LI      R1,TBUF
;    R2 HAS LENGTH OF NAME
           BLWP    @VMBR

MGRST4     CB      *R3+,*R1+
           JNE     MGRST3
           DEC     R2
           JNE     MGRST4

           LI      R0,PABBUF+>A0   ;SEE IF LIST/CODES ARE SET
           BLWP    @VSBR
           MOVB    R1,R1
           JEQ     MGR             ;NO..

           LI      R0,PABBUF+>A0   ;GET LIST DEVICE
           LI      R1,PDATA2+9
           LI      R2,41
           BLWP    @VMBR

           LI      R0,PABBUF+>D0   ;GET CONTROL CODES / COLOR CODES
           LI      R1,SCCBUF
           LI      R2,33
           BLWP    @VMBR

MGR        LWPI    MYREG1
           LIMI    0
           LI      R0,>0007
           MOVB    @COLBUF,R0      ;SET COLOR AS PER COLBUF
           SWPB    R0
           BLWP    @VWTR

           LI      R0,KZLP2
           MOV     R0,@FUNCT
           BLWP    @CLRSCN         ;CLEAR SCREEN
           SCREEN  7               ;SHOW MAIN SCREEN
           DISPLAY 1,TXTMM1C,TXTMM1,TXTMM1L     ;'CF7+ MANAGER'
           DISPLAY 20,TXTMM2C,TXTMM2,TXTMM2L
           DISPLAY 22,TXTMM3C,TXTMM3,TXTMM3L
           DISPLAY 4,5,TXTMM4,TXTMM4L   ;'Select Option'
           DISPLAY 7,12,TXTMM5,17       ;'1. File Utilities'
           DISPLAY 9,12,TXTMM6,TXTMM6L  ;'2. Volume Utilities'
           DISPLAY 11,12,TXTMM7,17      ;'3. Misc Utilities'

           LI      R0,MGR          ;SET FCTN KEYS
           MOV     R0,@FCT8        ;REDO=MGR
           MOV     R0,@FCT9        ;BACK=MGR
           MOV     R0,@CKT8        ;REDO=MGR
           MOV     R0,@CKT9        ;BACK=MGR

MGLP1      LI      R0,180          ;SCREEN ADDR FOR 'SELECT OPTION'
           LI      R1,>3100        ;DEFAULT=1
           BLWP    @GTSKEY         ;GET KEY

           CB      R1,@ASC_1        ;=1
           JEQ     MGE1
           CB      R1,@ATWO        ;=2
           JEQ     MGE2
           CB      R1,@ATHREE      ;=3
           JEQ     MGE3
           JMP     MGLP1           ;NO

MGE1       B       @FILE           ;FILE UTILITIES
MGE2       B       @DSKUTL         ;DISK UTILITIES
MGE3       B       @MSFILE         ;MISC UTILITIES
;----------------------------------------------------------------------
;
; -- F I L E   U T I L I T I E S --
;
;----------------------------------------------------------------------
FILE       LWPI    MYREG1
           LIMI    0

           LI      R0,FILE         ;SET FCTN KEYS
           MOV     R0,@FCT8        ;REDO=FILE
           MOV     R0,@CKT8        ;REDO=FILE

           LI      R0,MGR          ;SET FCTN KEYS
           MOV     R0,@FCT9        ;BACK=MGR
           MOV     R0,@CKT9        ;BACK=MGR

           BLWP    @CLRSCN
           SCREEN  7
           DISPLAY 1,TXTCA6C,TXTCA6,TXTCA6L ;'File Utilities'
           DISPLAY 4,5,TXTMM4,TXTMM4L   ;'Select Option:'
           DISPLAY 6,8,TXTCA8,30   ;'1. Copy/Move/Delete/Type/Print'
           DISPLAY 8,11,TXTCA9,18  ;'Prot/Unprot/Rename'
           DISPLAY 10,8,TXTCAE,15  ;'2. Recover File'
           DISPLAY 12,8,TXTI1,29   ;'3. RUN IMAGE PROGRAM..XB VDP'
           DISPLAY 14,8,TXTI2,29   ;'4. RUN IMAGE PROGRAM..E/A VDP'
;          DISPLAY 16,8,TXTCAF,12  ;'5. Find file'

FLP1       LI      R0,180          ;GET OPTION
           LI      R1,>3100
           BLWP    @GTSKEY

           LI      R2,>3134
           CB      R1,R2
           JLT     FLP1
           SWPB    R2
           CB      R1,R2
           JGT     FLP1

           LI      R3,TXTI1
           MOV     R3,@RIMA+2      ;SET UP MESSAGE ADDRESS DEFAULT TO XB VDP

           SB      @ASC_1,R1        ;INDEXED BRANCH
           SRL     R1,7
           MOV     @FJMP(R1),R1

           B       *R1
FJMP       DATA    CAT             ;FILE OPTION 1
           DATA    RCFILE          ;RECOVER FILE
           DATA    IMFXB           ;RUN IMAGE FILE XB VDP
           DATA    IMFEA           ;RUN IMAGE FILE IN E/A VDP

IMFEA      LI      R1,TXTI2
           MOV     R1,@RIMA+2      ;SET UP MESSAGE ADDRESS

           SWPB    R0              ;R0=180
IMFXB      MOVB    R0,@IFLAG       ;IFLAG=0(E/A VDP)  <>1(XB VDP)
           B       @ILOAD          ;LOAD IMAGE FILE

RCFILE     LWPI    MYREG1          ;RECOVER LOST FILE
           BLWP    @CLRSCN

           LI      R0,RCFILE       ;ADJUST FCTN KEYS
           MOV     R0,@FCT8
           MOV     R0,@CKT8

           LI      R0,FILE
           MOV     R0,@FCT9
           MOV     R0,@CKT9

           SCREEN  4
           DISPLAY 1,TXTCA6C,TXTCA6,TXTCA6L ;'FILE UTILITIES'
           DISPLAY 5,9,TXTCAE,15    ;'2. RECOVER FILE'
           DISPLAY 14,7,TXTRC1,TXTRC1L  ;'Recover File on Drive:'
           DISPLAY 16,7,TXTRC2,19       ;'Enter Name of File :'

RCLP1      BL      @GETVOL
           DATA    591,VDSK1,RCLP1
           LI      R1,>0100
           MOVB    R1,@SRCDRV

           LI      R0,667          ;CLEAR NAME BUFFER
           LI      R1,TBUF
           LI      R2,10
           BLWP    @VMBR

           BLWP    @GTMKEY         ;GET FILENAME
           DATA    667             ;SCREEN ADDR
           DATA    TBUF            ;BUFF ADDR
           DATA    10              ;10 CHAR
           DATA    >202E           ;INVALID CHAR (SPACE // PERIOD)

           SCREEN  1
           DISPLAY 19,TXTRC3C,TXTRC3,TXTRC3L    ;'SEARCHING VOLUME'
           MOVB    @SRCDRV,@OPDRV

           CLR     @SECTOR         ;GET BM
           BLWP    @RDSECX

           BLWP    @MOVSCT
           DATA    DSTST0

           INC     @SECTOR         ;GET LM
           BLWP    @RDSECX

           BLWP    @MOVSCT
           DATA    DSTST1

           INC     @SECTOR         ;SEARCH DISK
RCLP4      BLWP    @RDSECX

           LI      R0,PABBUF       ;GET FILENAME
           LI      R1,DSTST2
           LI      R2,10
           BLWP    @VMBR

           LI      R0,TBUF
RCLP2      CB      *R0+,*R1+       ;COMPARE FILENAMES
           JNE     RFMT030
           DEC     R2
           JNE     RCLP2

           JMP     RCLP5           ;NAME MATCHES

RFMT030      INC     @SECTOR         ;SECTOR+1
           C       @SECTOR,@DSTST0+10  ARE WE AT END OF DISK??
           JNE     RCLP4

           SCREEN  1               ;'FILE NOT FOUND'
           DISPLAY 19,12,TXTRC4,TXTRC4L
           B       @TPLP1

RCLP5      BLWP    @MOVSCT         ;GET FILE DIRECTORY
           DATA    DSTST2

           MOV     @SECTOR,R8      ;TEST FOR DUP LM POINTER
           LI      R1,DSTST1       ;LM ADDR
RCLP5B     MOV     *R1+,R0
           JEQ     RCLP5A
           C       R0,R8
           JNE     RCLP5B
           JMP     RCLP6A

RCLP5A     LI      R1,DSTST2+>1C   ;POINT TO BLOCK LINK INFO
           MOV     R1,@BLKLNK
           BL      @GETLNK

           BL      @RTX            ;RESTORE BIT MAP INFO

           MOV     @SECTOR,@STRSCT ;RESTORE LINK MAP POINTER
           CLR     @OFFSET
           BL      @RTX

           MOV     @SECTOR,R8      ;SAVE LM POINTER

           SCREEN  1
           DISPLAY 19,9,TXTRC7,21  ;'RE-BUILDING LOST FILE'

           LI      R4,DSTST1       ;LM SORT
SXLP1      MOV     *R4+,@SECTOR
           JEQ     SXLP3
           BLWP    @RDSECX

           LI      R0,PABBUF       ;GET FILENAME
           LI      R1,TBUF
           LI      R2,10
           BLWP    @VMBR

           LI      R0,DSTST2       ;COMPARE FILENAME
SXLP2      CB      *R0+,*R1+
           JGT     SXLP1
           JLT     SXLP3
           JMP     SXLP2

SXLP3      DECT    R4              ;SHUFFLE POINTERS
SXLP4      MOV     *R4,R3
           MOV     R8,*R4+
           MOV     *R4,R8
           MOV     R3,*R4+
           JNE     SXLP4

SXLP5      CLR     @SECTOR         ;WRITE BM
           BLWP    @MOVVDP
           DATA    DSTST0
SXLP6      BLWP    @WRSECX

           INC     @SECTOR         ;WRITE LM
           BLWP    @MOVVDP
           DATA    DSTST1
           BLWP    @WRSECX

RCLP6A     SCREEN  2
           DISPLAY 19,9,SPACES,21
           DISPLAY 19,12,TXTRC5,TXTRC5L ;'FILE RECOVERED'
           B       @TPLP1

RTX        MOV     R11,R10         ;SAVE RTN ADDR
           SETO    R8              ;OFFSET COUNTER

RTXLP1     MOV     @STRSCT,R1
           CLR     R0              ;R0=0 R1=QUOTIENT

           CI      R1,7            ;RANGE (0-7)?
           JGT     RTXLP3          ;NO..
           JMP     RTXLP4

RTXLP3     DIV     @D08,R0

RTXLP4     LI      R4,>0100        ;SHIFT MASK
           LI      R3,56           ;BM OFFSET
           A       R0,R3           ;R3 POINTS TO BM BYTE

           MOV     R1,R0           ;R0 IS BIT SHIFT COUNTER
           JEQ     NXSHFT          ;IF 0 THEN NO SHIFT

           SLA     R4,0            ;SHIFT R4//R0 TIMES

NXSHFT     MOVB    @DSTST0(R3),R5
           CZC     R4,R5           ;IS BIT ALREADY SET??
           JNE     RTXLP5          ;YES..FILE IS OVER WRITTEN

           SOCB    R4,@DSTST0(R3)  ;NO.SET BIT
           INC     @STRSCT         ;INC ADDR
           INC     R8
           C       R8,@OFFSET      ;ARE WE AT END
           JEQ     RTXLP2          ;YES..
           JMP     RTXLP1

RTXLP2     BL      @GETLNK         ;CHECK NEXT BLOCK LINK
           MOV     @STRSCT,R1
           JNE     RTXLP1
           B       *R10

RTXLP5     SCREEN  2
           DISPLAY 19,9,SPACES,21
           DISPLAY 19,7,TXTRC6,26
           B       @TPLP1
;----------------------------------------------------------------------
;
;  -- D S K U T L --
;
; DISK UTILITIES SECTION
;
;----------------------------------------------------------------------
DSKUTL     LWPI    MYREG1
           LIMI    0
           BLWP    @CLRSCN

           LI      R0,DSKUTL       ;SET UP FCTN KEYS
           MOV     R0,@FCT8        ;REDO=DSKUTL
           MOV     R0,@CKT8        ;REDO=DSKUTL

           LI      R0,MGR
           MOV     R0,@FCT9        ;BACK=MGR
           MOV     R0,@CKT9        ;BACK=MGR

           LI      R0,KZLP2
           MOV     R0,@FUNCT

           SCREEN  5
           DISPLAY 1,TXTDS1C,TXTDS1,TXTDS1L    'V O L U M E   U T I L I T I E S'
           DISPLAY 4,5,TXTMM4,TXTMM4L   ;'SELECT OPTION:'
           DISPLAY 6,7,TXTDS2,TXTDS2L   ;'1. Catalog     4. Rename'
           DISPLAY 8,7,TXTDS3,TXTDS3L   ;'2. Backup      5. Format'
           DISPLAY 10,7,TXTDS4,TXTDS4L  ;'3. Erase       6. List'

DSKUTL10   LI      R0,4*40+20      ;SCRN ADDR
           LI      R1,>3100
           BLWP    @GTSKEY
           LI      R2,'16'         ;IS KEY BETWEEN 1-5
           CB      R1,R2
           JLT     DSKUTL10
           SWPB    R2
           CB      R1,R2
           JGT     DSKUTL10
           SB      @ASC_1,R1        ;ADJUST FOR INDEXED BRANCH
           SRL     R1,7            ;MSB TO LSB *2
           MOV     @DSULTB(R1),R1
           LI      R0,DSKUTL
           MOV     R0,@FCT9        ;BACK=DSKUTL
           MOV     R0,@CKT9        ;BACK=DSKUTL
           B       *R1

DSULTB     DATA    CATALOG         ;CATALOG
           DATA    BACKUP          ;BACKUP
           DATA    ERASE           ;ERASE
           DATA    RENAMEVOL       ;RENAME
           DATA    FORMAT          ;FORMAT
           DATA    VOLLIST         ;LIST VOLUMES

;----------------------------------------------------------------------
;
;  -- R E N A D S --
;
;     THIS SUBROUTINE RENAMES A VOLUME
;
;----------------------------------------------------------------------
RENAMEVOL  LWPI    MYREG1
           LIMI    0
           LI      R0,RENAMEVOL    ;ADJUST FCTN KEYS
           MOV     R0,@FCT8        ;REDO=RENAME
           MOV     R0,@CKT8

           BLWP    @CLREOS
           DATA    523
           BL      @DRINFO         ;DISKNAME//FREE//USED
           SCREEN  1
           DISPLAY 17,3,TXTRE1,TXTRE1L  ;'New Disk Name :'

RENVOL10   BL      @GETVOL
           DATA    533,VDSK1,RENVOL10
           BL      @DSPVOL
           LI      R3,TXTER3       ;'  Volume Write Protected '
           BL      @CHKVOL
           DATA    DSTST0,0,VOLERR

           LI      R0,699          ;CLEAR BUFFER FOR NAME
           LI      R1,DSTST0
           LI      R2,10
           BLWP    @VMBR

           BLWP    @GTMKEY         ;GET NEW DISK NAME
           DATA    699             ;SCRN ADDR
           DATA    DSTST0          ;BUFF ADDR
           DATA    10              ;10 CHAR
           DATA    >202E           ;INVALID CHAR

           BLWP    @MOVVDP         ;MOVE BM TO VDP
           DATA    DSTST0

           BLWP    @WRSECX         ;WRITE SECTOR
           B       @DSKUTL         ;RETURN

;----------------------------------------------------------------------
;
;  -- D R I N F O --
;
;----------------------------------------------------------------------
DRINFO     SCREEN  3               ;SHOW DISKNAME//FREE//USED
           DISPLAY 13,3,TXTVOL,9   ;'Volume #:'
           DISPLAY 14,3,TXTCA0,9   ;'VOLNAME:'
           DISPLAY 15,3,TXTCAD,14  ;'FREE     USED'
           RT

;----------------------------------------------------------------------
;
;  -- F O R M A T --
;
;----------------------------------------------------------------------
FORMAT     LWPI    MYREG1          ;INITIALIZE DISK
           LIMI    0
           LI      R0,FORMAT
           MOV     R0,@FCT8        ;REDO=FORMAT

FMT010     BLWP    @CLREOS
           DATA    523

           BL      @DRINFO         ;DISKNAME//FREE//USED

FMT020     BL      @GETVOL
           DATA    533,VDSK1,FMT020
           LI      R1,>0100
           MOVB    R1,@OPDRV

           CLR     @SECTOR         ;SEE IF DISK IS ALREADY INITIALIZED
           BLWP    @RDSECT

FMT030     BLWP    @MOVSCT         ;BETTER CHECK DISK FIRST
           DATA    DSTST0

           LI      R3,TXTER3       ;'  Volume Write Protected '
           BL      @CHKVOL
           DATA    DSTST0,FMT050,VOLERR

           BL      @SHOWDN         ;SHOW DISK NAME
           JMP     FMT050

FMT040     SCREEN  1
           DISPLAY 14,13,TXTIN5,15 ;'NOT INITIALIZED'

FMT050     SCREEN  1
           DISPLAY 23,3,TXTIN0,TXTIN0L  ;'INITIALIZE DISK (Y/N)?'
           LI      R0,23*40+3+TXTIN0L+1
           MOVB    @YES,R1
           BLWP    @GTSKEY

           SCREEN  2
           DISPLAY 14,13,SPACES,15
           DISPLAY 23,3,SPACES,28

           CB      @YES,R1
           JNE     FMT010

FMT060     BLWP    @INITB          ;BRANCH TO INITIALIZE
           BL      @SHOWDN

FMT070     SCREEN  1
           DISPLAY 23,TXTCD5C,TXTCD5,TXTCD5L ;'FORMAT ANOTHER? (Y/N)?'
           LI      R0,23*40+TXTCD5C+TXTCD5L+1
           MOVB    @YES,R1
           BLWP    @GTSKEY
           CB      @YES,R1
           JEQ     FMT010
           MOV     @FCT9,R1        ;RETURN TO "BACK"
           B       *R1

ADDRS      DATA    >2000,>4000     ;HIGH/LOW
;          DATA    >DD00,>F900
           DATA    >0000

RDERR      DATA    0
WTERR      DATA    0

BMFLG      DATA    0

;----------------------------------------------------------------------
;
;  -- V O L L I S T --
;
;     THIS SUBROUTINE LISTS ALL INITIALIZED VOLUMES
;
;----------------------------------------------------------------------
TXTVTTL    TEXT    '-= LIST VOLUMES =-'
TXTVTTLL   EQU     $-TXTVTTL
TXTVTTLC   EQU     40-TXTVTTLL/2
TXTVOL1    TEXT    'VOL#    VOL NAME   FREE  USED  P'
TXTVOL1L   EQU     $-TXTVOL1
TXTVOL2    TEXT    '-----  ----------  ----  ----  -'
TXTVOL2L   EQU     $-TXTVOL2
TXTVOLN    TEXT    '#####  ##########  ####  ####  #'
TXTVOLNL   EQU     $-TXTVOLN
TXTVOLNAM  EQU     TXTVOLN+7
TXTVOLFRE  EQU     TXTVOLN+19
TXTVOLUSD  EQU     TXTVOLN+25
TXTVOLPRT  EQU     TXTVOLN+31
           EVEN

; |VOL#|VOL NAME|FREE|USED|
;   2  |   10   | 2  | 2  |
VOL.NBR    EQU     0
VOL.NAM    EQU     2
VOL.FREE   EQU     12
VOL.USED   EQU     14
VOL.LEN    EQU     16

LINE       DATA    0
VOL        DATA    0
VOLMAX     DATA    39

VOLLIST    LWPI    MYREG1
           LIMI    0

           LI      R0,VOLLIST
           MOV     R0,@FCT8

           LI      R0,VOLPRNT
           MOV     R0,@FUNCT

           BLWP    @CLRSCN
           SCREEN  3
           DISPLAY 0,TXTVTTLC,TXTVTTL,TXTVTTLL  ;'LIST VOLUMES'
           DISPLAY 1,4,TXTVOL1,TXTVOL1L         ;' VOL#   VOL NAME   AVAIL USED  P'
           DISPLAY 2,4,TXTVOL2,TXTVOL2L         ;'-----  ----------  ----- ----  -'

           CLR     @SECTOR
           MOVB    @ONE,@OPDRV
           LI      R0,1
           MOV     R0,@VOL
VLIST05    C       @VOL,@VOLMAX
           JHE     VLIST30
           BLWP    @CLREOS
           DATA    3*40
           LI      R0,3*40+8
           MOV     R0,@VLIST20
           LI      R3,20
VLIST10    LI      R0,VDSK1         ;VIRTUAL DSK1
           MOV     @VOL,R1
           BLWP    @VSBW
           SWPB    R1
           MOVB    R1,@VDPWD
           BLWP    @RDSECX
           BLWP    @MOVSCT
           DATA    SRCST0
           MOV     @VOL,R0
           BLWP    @DISP
VLIST20    DATA    611
           BL      @CHKVOL         ;CHECK IF VOLUME IS INITIALIZED
           DATA    SRCST0,VLIST25,0
           MOV     @VLIST20,R0
           AI      R0,3
           LI      R1,SRCST0
           LI      R2,10
           BLWP    @VMBW
           BL      @CALCBM
           DATA    SRCST0
           MOV     @VLIST20,R0
           AI      R0,18
           MOV     R0,@VLIST23
           MOV     @TEMPR1,R0
           BLWP    @DISP
VLIST23    DATA    0
           MOV     @VLIST20,R0
           AI      R0,24
           MOV     R0,@VLIST24
           MOV     @TEMPR2,R0
           BLWP    @DISP
VLIST24    DATA    0
           MOV     @VLIST20,R0
           AI      R0,27
           MOVB    @SRCST0+16,R1
           BLWP    @VSBW
VLIST25    C       @VOL,@VOLMAX
           JHE     VLIST30
           LI      R0,40
           A       R0,@VLIST20
           INC     @VOL
           DEC     R3
           JNE     VLIST10
VLIST30    BL      @DSRTN
VLIST35    LI      R0,960          ;LOCATION OFF SCREEN
           MOVB    @ASCLO,R1
           BLWP    @GTSKEY
           CB      R1,@ASCHI
           JLE     VLIST35
VLIST40    CB      R1,@CTRLX       ;NEXT PAGE?
           JEQ     VLIST05         ;YES
           CB      R1,@CTRLE       ;PREV PAGE?
           JNE     VLIST35         ;NO - GET KEY AGAIN
           MOV     @VOL,R0
           AI      R0,-40          ;TAKE AWAY CURRENT AND PREV. PAGE
           JGT     VLIST45
           LI      R0,1
VLIST45    MOV     R0,@VOL
           JMP     VLIST05

;----------------------------------------------------------------------
;
;  -- B A C K U P --
;
;     THIS SUBROUTINE BACKS-UP A VOLUME
;
;----------------------------------------------------------------------
BACKUP     LWPI    MYREG1          ;COPY DISK UTILITY
           LIMI    0               ;DISABLE INTERRUPTS

           LI      R0,BACKUP
           MOV     R0,@FCT8

           CLR     @RDERR
           CLR     @WTERR

           BLWP    @CLRSCN

           SCREEN  5
           DISPLAY 1,TXTDS1C,TXTDS1,TXTDS1L     ;'VOLUME UTILIES'
           DISPLAY 5,TXTDS3AC,TXTDS3A,TXTDS3AL  ;'2. BACKUP'
           DISPLAY 8,5,TXTMM4,14                ;SELECT OPTION
           DISPLAY 10,7,TXTMS4,TXTMS4L          ;1 BIT MAP
           DISPLAY 12,7,TXTMS5,TXTMS5L          ;2 SECTOR

           LI      R0,8*40+20
BKP010     LI      R1,>3200
           BLWP    @GTSKEY
           CB      R1,@ASC_1
           JNE     BKP015          ;BIT COPY
           LI      R1,TXTDSA       ;"SET COPY "BIT MAP"
           CLR     @BMFLG
           JMP     BKP020

BKP015     CB      R1,@ATWO
           JNE     BKP010

           SETO    @BMFLG          ;SECTOR COPY
           LI      R1,TXTDSB       ;'SET COPY "SECTOR"
BKP020     MOV     R1,@BKP040+2

           LI      R0,BKP030
           MOV     R0,@FCT8        ;REDO= VOL. COPY WITHOUT 1ST MENU

BKP030     BLWP    @CLRSCN

           SCREEN  9
           DISPLAY 1,TXTDS1C,TXTDS1,TXTDS1L         ;'V O L .   U T I L I T I E S'
BKP040     DISPLAY 4,10,0,TXTDSAL
           DISPLAY 6,3,TXTFRM,6    ;'MASTER'
           DISPLAY 7,3,TXTVOL,9    ;'DRIVE NO."
           DISPLAY 8,3,TXTSCT,11   ;'SECTOR'
           DISPLAY 12,3,TXTTO,6    ;'Backup'
           DISPLAY 13,3,TXTVOL,9   ;'Volume #
           DISPLAY 14,3,TXTSCT,11  ;'SECTOR'
           DISPLAY 23,2,TXTDS6,TXTDS6L ;'WARNING BACKUP VOL. WILL BE ERASED'

BKP050     BL      @GETVOL         ;GET SOURCE VOLUME AND SET IT AS VDSK1
           DATA    7*40+13,VDSK1,BKP050

           LI      R1,>0100
           MOVB    R1,@SRCDRV

BKP060     BL      @GETVOL         ;GET DESTINATION VOLUME AND SET IT AS VDSK2
           DATA    13*40+13,VDSK2,BKP060

           LI      R1,>0200
           MOVB    R1,@DSTDRV

           LWPI    MYREG6          ;WORK SPACE FOR WRITING
           CLR     R8
           LWPI    MYREG1
           CLR     R8              ;WORK SPACE FOR READING

;          SCREEN  1
;          DISPLAY 21,12,TXTCP1,17 ;'CHECKING FORMAT'

BKP070     MOVB    @SRCDRV,@OPDRV
           MOV     R8,R8
           JNE     BKP130

           CLR     @SECTOR
           BLWP    @RDSECX

           BLWP    @MOVSCT
           DATA    SRCST0

           MOV     @SRCST0+10,@OFFSET

BKP080     MOVB    @DSTDRV,@OPDRV

           CLR     @SECTOR
           BLWP    @RDSECT

           BLWP    @MOVSCT
           DATA    DSTST0

           LI      R3,TXTER3       ;'  Volume Write Protected '
           BL      @CHKVOL
           DATA    DSTST0,0,VOLERR

BKP100     SCREEN  1
           DISPLAY 21,12,SPACES,17

           MOVB    @SRCDRV,@OPDRV
           MOV     @BMFLG,@BMFLG
           JEQ     BKP120          ;IF EQ THEN BIT-MAP MODE
;
; SECTOR-BY-SECTOR MODE
;
           LI      R4,200          ;SET ALL SECTORS IN BITMAP
           SETO    R2
           LI      R1,SRCST0+>38
BKP110     MOV     R2,*R1+
           DECT    R4
           JNE     BKP110

BKP120     LI      R12,SRCST0+>38  ;BM ADDR
           LI      R4,8            ;8 BITS
           LI      R5,>0001        ;SHIFT MASK
           MOVB    *R12+,R7
           SWPB    R7

BKP130     LI      R3,ADDRS

BKP140     MOV     *R3+,R10
           JEQ     BKP210

BKP150     CZC     R5,R7           ;SECTOR NOT USED?
           JNE     BKP160          ;NO

           INC     R8
           JMP     BKP190

BKP160     MOV     R10,@BKP180
           MOV     R8,@SECTOR
           BLWP    @RDSECT

           MOV     R0,R0           ;ERROR?
           JEQ     BKP170          ;NO..

           INC     @RDERR          ;YES..

BKP170     MOV     R8,R0           ;SCREEN SECTOR
           INC     R0
           BLWP    @DISP
           DATA    8*40+13

           BLWP    @MOVSCT
BKP180     DATA    0

           INC     R8
           AI      R10,256

BKP190     SRC     R7,1            ;BIT MASK = NEXT POSITION
           DEC     R4              ;ALL 8 BITS TESTED?
           JNE     BKP200          ;NO

           MOVB    *R12+,R7        ;YES, NEXT BYTE
           SWPB    R7
           LI      R4,8            ;RESET LOOP COUNTER

BKP200     C       @OFFSET,R8
           JEQ     BKP280

           C       *R3,R10
           JNE     BKP150

           INCT    R3
           JMP     BKP140

BKP210     CLR     R10
           LI      R13,>1100
           LI      R0,PAB
           LI      R1,PDATA1
           LI      R2,>0020
           BLWP    @VMBW

           CLR     @FAC+2
           INC     @FAC+2
           MOVB    @SRCDRV,@FAC+2

BKP220     CZC     R5,R7
           JNE     BKP230

           INC     R8
           JMP     BKP260

BKP230     MOV     R13,@FAC+4
           MOV     R8,@FAC+6

           MOV     R13,@TEMPR1
           LI      R0,PAB+2
           LI      R1,TEMPR1
           LI      R2,2
           BLWP    @VMBW

           LI      R2,PAB+9
           MOV     R2,@PNTR

           BLWP    @DSRLNK
           DATA    10

           MOVB    @DSKERR,R0
           JEQ     BKP240

           INC     @RDERR

BKP240     BLWP    @KSCAN
           MOVB    @STATUS,R1
           JEQ     BKP250

           CB      @KCODE,@TWO
           JNE     BKP250
           B       @ABTMSG

BKP250     MOV     R8,R0
           INC     R0
           BLWP    @DISP
           DATA    8*40+13

           INC     R8
           INC     R10
           AI      R13,256

BKP260     SRC     R7,1
           DEC     R4
           JNE     BKP270

           MOVB    *R12+,R7
           SWPB    R7
           LI      R4,8

BKP270     C       @OFFSET,R8
           JEQ     BKP280

           CI      R10,37
           JNE     BKP220

BKP280     MOVB    @DSTDRV,@OPDRV

           LWPI    MYREG6

           MOV     R8,R8
           JNE     BKP290

           LI      R12,SRCST0+>38  ;BM ADDR
           LI      R4,8
           LI      R5,>0001
           MOVB    *R12+,R7
           SWPB    R7

BKP290     LI      R3,ADDRS

BKP300     MOV     *R3+,R10
           JEQ     BKP370

BKP310     CZC     R5,R7
           JNE     BKP320

           INC     R8
           JMP     BKP350

BKP320     MOV     R10,@BKP330
           MOV     R8,@SECTOR

           BLWP    @MOVVDP
BKP330     DATA    0

           BLWP    @WRSECT

           MOV     R0,R0           ;ERROR
           JEQ     BKP340            ;NO.

           INC     @WTERR          ;YES..

BKP340     MOV     R8,R0
           INC     R0
           BLWP    @DISP
           DATA    14*40+13

           INC     R8
           AI      R10,256

BKP350     SRC     R7,1
           DEC     R4
           JNE     BKP360

           MOVB    *R12+,R7
           SWPB    R7
           LI      R4,8

BKP360     C       @OFFSET,R8
           JEQ     BKP440

           C       *R3,R10
           JNE     BKP310

           INCT    R3
           JMP     BKP300

BKP370     CLR     R10
           LI      R13,>1100

           LI      R0,PAB
           LI      R1,PDATA1
           LI      R2,>0020
           BLWP    @VMBW

           CLR     @FAC+2
           MOVB    @DSTDRV,@FAC+2

BKP380     CZC     R5,R7
           JNE     BKP390

           INC     R8
           JMP     BKP420

BKP390     MOV     R13,@FAC+4
           MOV     R8,@FAC+6

           MOV     R13,@TEMPR1
           LI      R0,PAB+2
           LI      R1,TEMPR1
           LI      R2,2
           BLWP    @VMBW

           LI      R2,PAB+9
           MOV     R2,@PNTR

           BLWP    @DSRLNK
           DATA    10

           MOVB    @DSKERR,R0
           JEQ     BKP400

           INC     @WTERR

BKP400     BLWP    @KSCAN
           MOVB    @STATUS,R1
           JEQ     BKP410

           CB      @KCODE,@TWO
           JNE     BKP410
           B       @ABTMSG

BKP410     MOV     R8,R0
           INC     R0
           BLWP    @DISP
           DATA    573
           INC     R8
           INC     R10
           AI      R13,256

BKP420     SRC     R7,1
           DEC     R4
           JNE     BKP430
           MOVB    *R12+,R7
           SWPB    R7
           LI      R4,8

BKP430     C       @OFFSET,R8
           JEQ     BKP440
           CI      R10,37
           JNE     BKP380

           LWPI    MYREG1
           B       @BKP070

; DISPLAY ERROR RESULTS
BKP440     SCREEN  2
           DISPLAY 18,13,TXTCD1,12 ;'READ ERRORS'
           DISPLAY 19,13,TXTCD2,12 ;'WRITE ERRORS'
           MOV     @RDERR,R0
           BLWP    @DISP
           DATA    731

           MOV     @WTERR,R0
           BLWP    @DISP
           DATA    771

           CLR     @RDERR          ;CLEAR ERR COUNT
           CLR     @WTERR          ;CLEAR ERR COUNT

CONTINUE   SCREEN  2
           DISPLAY 23,0,SPACES,40
           DISPLAY 23,TXTCD3C,TXTCD3,TXTCD3L ;'PRESS ANY KEY TO CONTINUE'
CONTUE10   BLWP    @KSCAN          ;TEMP ADDR FOR TESTING
           MOVB    @STATUS,R2
           CZC     @KEYMSK,R2
           JEQ     CONTUE10
           MOV     @FCT9,R1        ;RETURN TO "BACK"
           B       *R1

;----------------------------------------------------------------------
;
;  -- C H K V O L --
;
;     CHECKS VOLUME TO SEE IF "DSK" IS SET OR IF IT IS PROTECTED
;
;----------------------------------------------------------------------
CHKVOL     MOV     *R11+,R1
           MOV     *R11+,R2
           JEQ     CHKVOL10        ;IF ZERO IGNORE CHECK
           LI      R0,TXTDSK
           CB      @13(R1),*R0+
           JNE     CHKVOL30
           CB      @14(R1),*R0+
           JNE     CHKVOL30
           CB      @15(R1),*R0+
           JNE     CHKVOL30
CHKVOL10   MOV     *R11+,R2        ;IF ZERO IGNORE CHECK
           JEQ     CHKVOL99
           CB      @16(R1),@ASC_P
           JNE     CHKVOL99
CHKVOL30   B       *R2
CHKVOL99   RT
;********   DSRLNK FOR XBASIC  ********

SCNAME     EQU     >8356
SCLEN      EQU     >8355
CRULST     EQU     >83D0
SADDR      EQU     >83D2

DSRLNK     DATA    DLNKWS,DLENTR

NAMBUF     DATA    0,0,0,0
SAVLEN     DATA    0
SAVPAB     DATA    0
SAVVER     DATA    0
SAVENT     DATA    0
SAVCRU     DATA    0
DLNKWS     DATA    0,0,0,0,0
TYPE       DATA    0,0,0,0,0,0,0,0,0,0,0

DECMAL     TEXT    '.'
HAA        BYTE    >AA

DLENTR     MOV     *R14+,R5
           SZCB    @KEYMSK,R15
           MOV     @SCNAME,R0
           MOV     R0,R9
           AI      R9,-8
           BLWP    @VSBR
           MOVB    R1,R3
           SRL     R3,8
           SETO    R4
           LI      R2,NAMBUF
LNK$LP     INC     R0
           INC     R4
           C       R4,R3
           JEQ     LNK$LN
           BLWP    @VSBR
           MOVB    R1,*R2+
           CB      R1,@DECMAL
           JNE     LNK$LP
LNK$LN     MOV     R4,R4
           JEQ     LNKERR
           CI      R4,7
           JGT     LNKERR
           CLR     @CRULST
           MOV     R4,@SCLEN-1
           MOV     R4,@SAVLEN
           INC     R4
           A       R4,@SCNAME
           MOV     @SCNAME,@SAVPAB
SROM       LWPI    GPLWS
           CLR     R1
           LI      R12,>1100
           CLR     R8
NOROM      MOV     R12,R12
           JEQ     NOOFF
           SBZ     0
NOOFF      AI      R12,>0100
           CLR     @CRULST
           CI      R12,>2000
           JNE     NOT20
           MOV     R8,R8
           JNE     NODSR
           SETO    R8
           LI      R12,>0F00
           JMP     NOROM
NOT20      MOV     R12,@CRULST
           SBO     0
           LI      R2,>4000
           CB      *R2,@HAA
           JNE     NOROM
           A       @TYPE,R2
           JMP     SGO2
SGO        MOV     @SADDR,R2
           SBO     0
SGO2       MOV     *R2,R2
           JEQ     NOROM
           MOV     R2,@SADDR
           INCT    R2
           MOV     *R2+,R9
           MOVB    @SCLEN,R5
           JEQ     NAME2
           CB      R5,*R2+
           JNE     SGO
           SRL     R5,8
           LI      R6,NAMBUF
NAME1      CB      *R6+,*R2+
           JNE     SGO
           DEC     R5
           JNE     NAME1
NAME2      INC     R1
           MOV     R1,@SAVVER
           MOV     R9,@SAVENT
           MOV     R12,@SAVCRU
           BL      *R9
           JMP     SGO
           SBZ     0
           LWPI    DLNKWS
           MOV     R9,R0
           BLWP    @VSBR
           SRL     R1,13
           JNE     IOERR
           RTWP

NODSR      LWPI    DLNKWS
LNKERR     CLR     R1
IOERR      SWPB    R1
           MOVB    R1,*R13
           SOCB    @KEYMSK,R15
           RTWP

;----------------------------------------------------------------------
;
;  -- K S C A N --
;
;----------------------------------------------------------------------
KSCAN      DATA    MYREG3,KSCAN1
KSCAN1     LWPI    GPLWS
           MOV     R11,@MYREG3+22
           BL      @>000E
           LWPI    MYREG3
           MOV     R11,@GPLWS+22
           RTWP

;----------------------------------------------------------------------
;
;  -- CATALOG --
;
;    DISK CATALOG
;
;----------------------------------------------------------------------
CATALOG    LWPI    MYREG1

           LI      R0,CATALOG      ;ADJUST FCTN KEYS
           MOV     R0,@FCT8

           LI      R0,CATPRNT      ;OK TO BRANCH NOW
           MOV     R0,@FUNCT

           BLWP    @CLRSCN         ;CLEAR SCREEN

           SCREEN  2
           DISPLAY 1,TXTDS1C,TXTDS1,TXTDS1L ;'VOLUME UTILITIES'
           DISPLAY 4,TXTCT1C,TXTCT1,TXTCT1L ;'CATALOG VOLUME'

           BL      @DRINFO         ;DISKNAME//FREE//USED
D2LP1      BL      @GETVOL
           DATA    533,VDSK1,D2LP1
           LI      R1,>0100
           MOVB    R1,@SRCDRV
           BL      @DSPVOL

           SETO    @DSTBLK         ;FLAG=FFFF CALLED FROM DISK UTILITY
           B       @FILE20

CATALOG2   CB      @DSTST0+>10,@TXTFD3  ;DISK PROTECT INDICATOR
           JNE     GTT3A
           MOVB    @TXTPLS,@TXTCA1+18
           JMP     GTT4
GTT3A      MOVB    @TXTMIN,@TXTCA1+18

GTT4       LI      R0,SCNBUF       ;CLEAR CMD FIELD
           LI      R1,>2020

P2LP1      MOV     R1,*R0
           AI      R0,40
           C       R0,@SCNEND
           JLT     P2LP1

           BLWP    @CLRSCN

           SCREEN  3
           DISPLAY 0,0,TXTCA1,40   ;'DISKNAME//FREE//USED//'
           DISPLAY 1,4,TXTCA2+4,36 ;'FILENAME//SIZE//TYPE//P'
           DISPLAY 2,4,TXTCA3+4,29 ;'-------'

           LI      R0,78           ;# OF PAGES
           MOVB    @PGCNT,R1
           AB      @H30,R1
           BLWP    @VSBW

           MOVB    @ONE,@DSPAGE
PGSHOW     BL      @DSPGS

P2LP30     LI   R0,960             ;LOCATION OFF SCREEN
           MOVB    @ASCLO,R1
           BLWP    @GTSKEY

           CB      R1,@ASCHI
           JH      P2LP40
           JMP     P2LP30

P2LP40     CB      R1,@CTRLX
           JEQ     P2LP50
           CB      R1,@CTRLE
           JNE     P2LP30

           SB      @ONE,@DSPAGE    ;SHOW PREVIOUS PAGE..IF ANY
           CB      @DSPAGE,@ONE
           JEQ     PGSHOW
           JGT     PGSHOW
           AB      @ONE,@DSPAGE
           JMP     P2LP30

P2LP50     AB      @ONE,@DSPAGE    ;SHOW NEXT PAGE ..IF ANY
           CB      @DSPAGE,@PGCNT
           JLT     PGSHOW
           JEQ     PGSHOW
           SB      @ONE,@DSPAGE
           JMP     P2LP30
;----------------------------------------------------------------------
;
;  -- E R A S E --
;
;     THIS FUNCTION ERASES A VOLUME
;
;----------------------------------------------------------------------
ERASE      LWPI    MYREG1
           LI      R0,ERASE       ;ADJUST FCTN KEYS
           MOV     R0,@FCT8

           BLWP    @CLREOS
           DATA    523

           BL      @DRINFO         ;DISPLAY VOLUME FORM

SWLP1      BL      @GETVOL         ;GET VOLUME NUMBER
           DATA    533,VDSK1,SWLP1

           BL      @DSPVOL
           LI      R3,TXTER3       ;'  Volume Write Protected '
           BL      @CHKVOL
           DATA    DSTST0,0,VOLERR

           SCREEN  1
           DISPLAY 23,7,TXTSWP,17  ;ERASE VOL. (Y/N)?

SWLP2      LI      R0,23*40+25
           MOVB    @ASC_N,R1       ;NO IS DEFAULT
           BLWP    @GTSKEY

           CB      @YES,R1
           JEQ     SWLP3
           CB      @ASC_N,R1
           JNE     SWLP2
           JMP     ERASE

SWLP3      LI      R0,1600/8       ;BM DEFAULT 1600/8 BYTES

           LI      R1,DSTST0+>38   ;START OF BM
SWLP6      CLR     *R1+
           DECT    R0
           JNE     SWLP6

           LI      R1,DSTST0+>38
           MOVB    @H03,*R1

           BLWP    @MOVVDP         ;COPY SECTOR TO VRAM
           DATA    DSTST0

SWLP8      BLWP    @WRSECX         ;WRITE BM TO DISK

           BLWP    @CLRBUF         ;CLEAR LM BUFFER
           DATA    DSTST1

           BLWP    @MOVVDP
           DATA    DSTST1

           INC     @SECTOR
           BLWP    @WRSECX         ;ERASE LINK MAP

           BL      @DSPVOL
           B       @CONTINUE

PAB2       EQU     >1E00
PDATA2     DATA    >0016,>1000,>5000,>0000,PNAMEL
PNAME      TEXT    'SIO.BA=9600.DA=7.PA=E'
PNAMEL     EQU     $-PNAME
           BSS     40-PNAMEL

;----------------------------------------------------------------------
;
; -- DSPVOL --
;
;    DISPLAY VOLUME INFORMATION
;
;----------------------------------------------------------------------
DSPVOL     MOV     R11,@DSPVOL99+2
           LI      R1,>0100        ;READ SECTOR FROM
           MOVB    R1,@OPDRV
           CLR     @SECTOR
           BLWP    @RDSECX

           BLWP    @MOVSCT         ;MOVE TO CPU RAM
           DATA    DSTST0

           BL      @CHKVOL
           DATA    DSTST0,DSPVOLERR,0
           BL      @SHOWDN         ;DISPLAY VOLUME INFORMATION
DSPVOL99   B       @0

DSPVOLERR  LI      R3,TXTER4
           B       @VOLERR
;----------------------------------------------------------------------
;
;  -- O P N P R N T --
;
;     THIS OPENS THE PRINTER PORT (AS SET BY USER)
;
;----------------------------------------------------------------------
OPNPRNT    MOV     R11,@OPNPRN99+2
           LI      R0,PAB2         ;LOAD PAB  * OPEN *
           LI      R1,PDATA2
           LI      R2,50
           BLWP    @VMBW

           LI      R4,PAB2+9
           MOV     R4,@PNTR
           BLWP    @DSRLNK
           DATA    8
OPNPRN99   B       @0

;----------------------------------------------------------------------
;
;  -- O P N O P T S --
;
;     SET PAB PARAMETERS 
;
;----------------------------------------------------------------------
OPNOPTS    MOVB    *R11+,R1
           LI      R0,PAB2+5
           BLWP    @VSBW

           MOVB    *R11+,R1
           LI      R0,PAB2
           BLWP    @VSBW           ;* WRITE OPCODE *
           RT

;----------------------------------------------------------------------
;
;  -- Z R O L I N E --
;
;     
;
;----------------------------------------------------------------------
ZROLINE    CLR     R1
           JMP     CLRLIN05

;----------------------------------------------------------------------
;
;  -- C L R L I N E --
;
;     
;
;----------------------------------------------------------------------
CLRLINE    LI      R1,>2000
CLRLIN05   LI      R0,PABBUF
           BLWP    @VSBW
           LI      R2,39
CLRLIN10   MOVB    R1,@VDPWD
           DEC     R2
           JNE     CLRLIN10
           RT

;----------------------------------------------------------------------
;
;  -- L I N E P R N T --
;
;     
;
;----------------------------------------------------------------------
LINEPRNT   LI      R4,PAB2+9
           MOV     R4,@PNTR
           BLWP    @DSRLNK
           DATA    8
           RT

;----------------------------------------------------------------------
;
;  -- F O R M F E E D --
;
;     PRINT A FORM FEED
;
;----------------------------------------------------------------------
FORMFEED   MOV     R11,@FRMFED99+2
           BL      @ZROLINE
           LI      R0,PABBUF
           LI      R1,>0C00
           BLWP    @VSBW
           BL      @LINEPRNT
FRMFED99   B       @0

;----------------------------------------------------------------------
;
;  -- V O L P R N T --
;
;     THIS ROUTINE PRINTS THE CATALOG
;
;----------------------------------------------------------------------
VOLPRNT    LI      R0,VOLLIST      ;CALLED FROM VOLLIST
           C       @FCT8,R0
           JEQ     VOLPR05         ;NO..EXIT
           RTWP
VOLPR05    BL      @OPNPRNT
           BL      @EKTEST         ;ERROR//KEY PRESSED TEST
           BL      @OPNOPTS        ;SET PAB DATA WIDTH & FUNCTION
           BYTE    40,>03
           LI      R0,1
           MOV     R0,@VOL

VOLPR10    CLR     @LINES
           BL      @CLRLINE
           LI      R0,PABBUF+TXTVTTLC
           LI      R1,TXTVTTL
           LI      R2,TXTVTTLL
           BLWP    @VMBW
           BL      @LINEPRNT

           BL      @CLRLINE
           LI      R0,PABBUF+4
           LI      R1,TXTVOL1
           LI      R2,TXTVOL1L
           BLWP    @VMBW
           BL      @LINEPRNT

           BL      @CLRLINE
           LI      R0,PABBUF+4
           LI      R1,TXTVOL2
           LI      R2,TXTVOL2L
           BLWP    @VMBW
           BL      @LINEPRNT

           CLR     @SECTOR
           MOVB    @ONE,@OPDRV

VOLPR20    LI      R0,VDSK1         ;VIRTUAL DSK1
           MOV     @VOL,R1
           BLWP    @VSBW
           SWPB    R1
           MOVB    R1,@VDPWD
           BLWP    @RDSECX
           BLWP    @MOVSCT
           DATA    SRCST0

           BL      @CLRLINE
           MOV     @VOL,R0
           BLWP    @DISP
           DATA    PABBUF+8

           BL      @CHKVOL         ;TEST DISK MARKER ("DSK")
           DATA    SRCST0,VOLPR30,0

           LI      R0,PABBUF+11    ;SET VOLUME NAME
           LI      R1,SRCST0
           LI      R2,10
           BLWP    @VMBW

           BL      @CALCBM         ;COUNT USED SECTORS
           DATA    SRCST0

           MOV     @TEMPR1,R0      ;FREE SECTORS
           BLWP    @DISP
           DATA    PABBUF+26

           MOV     @TEMPR2,R0      ;USED SECTORS
           BLWP    @DISP
           DATA    PABBUF+32

           LI      R0,PABBUF+35
           MOVB    @SRCST0+16,R1
           BLWP    @VSBW

VOLPR30    BL      @LINEPRNT
           INC     @VOL
           C       @VOL,@VOLMAX
           JH      VOLPR99
           INC     @LINES
           C       @LINES,@D00055
           JL      VOLPR20
           BL      @FORMFEED
           JMP     VOLPR10

VOLPR99    BL      @FORMFEED
           JMP     CLSPRNT

LINES      DATA    0
D00055     DATA    55
;----------------------------------------------------------------------
;
;  -- C A T P N T --
;
;     THIS ROUTINE PRINTS THE CATALOG
;
;----------------------------------------------------------------------
CATPRNT    LI      R0,CATALOG      ;CALLED FROM CATALOG
           C       @FCT8,R0
           JEQ     CATPR05         ;NO..EXIT
           RTWP

CATPR05    BL      @OPNPRNT
           BL      @EKTEST         ;ERROR//KEY PRESSED TEST

           BL      @OPNOPTS        ;SET PAB DATA WIDTH & FUNCTION
           BYTE    30,>03

           MOVB    @SCCBUF,@SCCBUF ;SEND CONTROL CODES
           JEQ     CATPR10         ;NO..

           MOVB    @SCCBUF,R1      ;# OF CODES TO SEND
           LI      R0,PAB2+5
           BLWP    @VSBW

           MOVB    R1,R2           ;BYTES TO SEND
           SRL     R2,8

           LI      R0,PABBUF
           LI      R1,SCCBUF+1
           BLWP    @VMBW

           BL      @LINEPRNT
           BL      @EKTEST

           LI      R1,>1E00
           LI      R0,PAB2+5
           BLWP    @VSBW

CATPR10    LI      R0,PABBUF       ;DISKNAME
           LI      R1,TXTCA1+8
           LI      R2,11
           BLWP    @VMBW

           A       R2,R0
           LI      R1,TXTCA1+21    ;FREE/USED
           LI      R2,19
           BLWP    @VMBW

           BL      @LINEPRNT
           BL      @EKTEST

           LI      R3,2
           LI      R1,TXTCA2+4
           LI      R2,31
CATPR20    LI      R0,PABBUF       ;FILENAME SIZE TYPE/NO. P
           BLWP    @VMBW

           BL      @LINEPRNT
           BL      @EKTEST

           AI      R1,40
           DEC     R3
           JNE     CATPR20

           LI      R1,SCNBUF+4     ;PRINT ALL FILES

CATPR30    BLWP    @VMBW

           BL      @LINEPRNT
           BL      @EKTEST

           AI      R1,40
           C       R1,@SCNEND
           JLT     CATPR30

CLSPRNT    LI      R0,PAB2         ;* CLOSE OPCODE *
           LI      R1,>0100
           BLWP    @VSBW

           SWPB    R1
           LI      R0,PAB2+5
           BLWP    @VSBW

           BL      @LINEPRNT
           BL      @EKTEST
           RTWP
;----------------------------------------------------------------------
;
;  -- E K T E S T --
;
;----------------------------------------------------------------------
EKTEST     STST    R8
           CZC     @KEYMSK,R8
           JEQ     EKTST10

           SCREEN  1
           DISPLAY 21,TXTER1C,TXTER5,TXTER1L
           B       @CONTINUE

EKTST10    BLWP    @KSCAN          ;ANY KEY WILL ABORT OUTPUT
           MOVB    @STATUS,R8
           CZC     @KEYMSK,R8
           JEQ     EKTST99

           BLWP    @CLRSCN
           B       @ABTMSG

EKTST99    RT
;----------------------------------------------------------------------
;
;  -- M S F I L E --
;
;----------------------------------------------------------------------
MSFILE     LWPI    MYREG1
           LI      R0,MSFILE       ;ADJUST FCTN KEYS
           MOV     R0,@FCT8
           LI      R0,MGR          ;ADJUST FCTN KEYS
           MOV     R0,@FCT9

           BLWP    @CLRSCN
           SCREEN  8
           DISPLAY 1,TXTMS6C,TXTMS6,TXTMS6L     ;'M I S C  U T I L I T I E S'
           DISPLAY 4,5,TXTMM4,14   ;'SELECT OPTION'
           DISPLAY 7,8,TXTMS1,26   ;'1. INSTALL DISK PROTECTION'
           DISPLAY 9,8,TXTMS2,25   ;'2. REMOVE DISK PROTECTION'
           DISPLAY 11,8,TXTMS3,23  ;'3. REMOVE XB PROTECTION'
           DISPLAY 13,8,TXTMSB,23  ;'4. CHange FOREGND COLOR'
           DISPLAY 15,8,TXTMSC,23  ;'5. CHange BACKGND COLOR'
           DISPLAY 17,8,TXTMSD,19  ;'6. CF Info/geometry'

MSKLP1     LI      R0,180          ;GET OPTION
           LI      R1,>3500
           BLWP    @GTSKEY

           LI      R2,'16'         ;VALIDATE OPTION SELECTION
           CB      R1,R2
           JLT     MSKLP1
           SWPB    R2
           CB      R1,R2
           JGT     MSKLP1

           SB      @ASC_1,R1       ;INDEXED BRANCH
           SRL     R1,7
           MOV     @MSJMP(R1),R1

           LI      R0,MSFILE       ;ADJUST FCTN KEYS
           MOV     R0,@FCT9
           MOV     R0,@CKT9
           B       *R1

MSJMP      DATA    IDPDSK          ;* INSTALL DISK PROTECTION
           DATA    RDPDSK          ;* REMOVE  DISK PROTECTION
           DATA    RXBDSK          ;* REMOVE XB PROTECTION
           DATA    FGCOL           ;* FOREGND COLOR
           DATA    BGCOL           ;* BACKGND COLOR
           DATA    CFINFO          ;* CF INFO

MCOLOR     DATA    >F000

FGCOL      CLR     R0
           MOVB    @COLBUF,R0      ;COLBUF= 25   R0=2500
           LI      R1,>1000
           CZC     @MCOLOR,R0      ;IS R0 =FXXX
           JEQ     FGOK            ;NO
           A       R1,R0           ;YES  FGCOLOR OF 0 NOT ALOWED
FGOK       A       R1,R0           ;R0=35XX
           JMP     RMGR

BGCOL      MOVB    @COLBUF,R0      ;COLBUF=25   R0=25XX
           LI      R1,>1000
           SLA     R0,4            ;R0= 5XX0
           CZC     @MCOLOR,R0      ;IS R0=FXXX
           JEQ     BGOK            ;NO
           A       R1,R0           ;YES  COLOR OF 0 NOT ALLOWED
BGOK       A       R1,R0
           SRL     R0,12           ;R0=0006
           MOVB    @COLBUF,R1      ;R1=25XX
           SRL     R1,12           ;R1=0002
           SLA     R1,4            ;R1=0020
           A       R1,R0           ;R0=0026
           SWPB    R0

RMGR       AI      R0,>0007
           MOVB    R0,@COLBUF
           SWPB    R0
           LI      R1,>2000        ;DELAY
AGN        DEC     R1
           JNE     AGN
           BLWP    @VWTR
           B       @MSFILE

;----------------------------------------------------------------------
;
;           ** COMPACT FLASH PORT ADDRESSES **
;
;----------------------------------------------------------------------
DATAR      EQU     >5F81           *DATA(READ)
STATR      EQU     >5F8F           *STATUS(READ)
DATAW      EQU     >5FC1           *DATA(WRITE)
FEATW      EQU     >5FC3           *FEATURE(WRITE)
CMDW       EQU     >5FCF           *COMMAND(WRITE)

CFID       LI      R12,>1100       ;* SET 8 BIT MODE **
           SBO     0
           LI      R0,>01EF
           MOVB    R0,@FEATW
           SWPB    R0
           MOVB    R0,@CMDW

           LI      R0,>5000        ;* IDENTIFY DRIVE **
CFID05     MOVB    @STATR,R1
           CB      R0,R1
           JNE     CFID05
           LI      R0,>EC58        ;* IDENTIFY DRIVE **
           MOVB    R0,@CMDW
           SWPB    R0
CFID10     MOVB    @STATR,R1
           CB      R1,R0
           JNE     CFID10
           LI      R0,BUF512
           LI      R1,512
CFID20     MOVB    @DATAR,R2
           SWPB    R2
           MOVB    @DATAR,R2
           MOV     R2,*R0+
           DECT    R1
           JNE     CFID20
           LI      R12,>1100       ;* SET 16-BIT MODE **
           SBO     0
           LI      R0,>81EF
           MOVB    R0,@FEATW
           SWPB    R0
           MOVB    R0,@CMDW
           MOV     @BUF512+14,R0
           MOV     @BUF512+16,R1
           DIV     @W1600,R0
           MOV     R0,@VOLMAX
           SBZ     0
           RT

W1600      DATA    1600
MSG1       TEXT    'COMPACT FLASH INFO'
MSG1L      EQU     $-MSG1
CYL        TEXT    'CYLS:'
CYLL       EQU     $-CYL
HDS        TEXT    'HEADS:'
HDSL       EQU     $-HDS
SEC        TEXT    'SECTS:'
SECL       EQU     $-SEC
SN         TEXT    'SERIAL#'
SNL        EQU     $-SN
FRMW       TEXT    'FIRMWARE:'
FRMWL      EQU     $-FRMW
MODEL      TEXT    'MODEL#'
MODELL     EQU     $-MODEL
VOLNM      TEXT    'MAX VOLS:'
VOLNML     EQU     $-VOLNM

CFINFO     BLWP    @CLREOS
           DATA    80
           BL      @CFID

           SCREEN  10
           DISPLAY 4,4,CYL,CYLL
           DISPLAY 6,4,HDS,HDSL
           DISPLAY 8,4,SEC,SECL
           DISPLAY 10,4,SN,SNL
           DISPLAY 10,14,BUF512+20,20
           DISPLAY 12,4,FRMW,FRMWL
           DISPLAY 12,14,BUF512+46,8
           DISPLAY 14,4,MODEL,MODELL
           DISPLAY 14,14,BUF512+54,26
           DISPLAY 16,4,VOLNM,VOLNML

           BL      @PUTW
           DATA    40*4+14,BUF512+2

           BL      @PUTW
           DATA    40*6+14,BUF512+6

           BL      @PUTW
           DATA    40*8+14,BUF512+12

;* DETERMINE MAX # OF VOLUMES **
           BL      @PUTW
           DATA    40*16+14,VOLMAX

           B       @CONTINUE
;----------------------------------------------------------------------
;
;
;
;
;----------------------------------------------------------------------
IDPDSK     LI      R8,>5000        ;'P FLAG'
           LI      R0,IDPDSK       ;ADJUST FCTN KEYS
           MOV     R0,@FCT8
           JMP     DSKPRT

RDPDSK     LI      R8,>2000        ;'U FLAG'
           LI      R0,RDPDSK       ;ADJUST FCTN KEYS
           MOV     R0,@FCT8

DSKPRT     BLWP    @CLREOS
           DATA    528

           BL      @DRINFO         ;GET DRIVE #
MSKLP2     BL      @GETVOL
           DATA    533,VDSK1,MSKLP2
           BL      @DSPVOL
;          LI      R1,>0100
;          MOVB    R1,@OPDRV
;          CLR     @SECTOR         ;GET BM
;          BLWP    @RDSECX
;
;          BLWP    @MOVSCT         ;SHOW DISKNAME
;          DATA    DSTST0
;          BL      @SHOWDN

           LI      R0,584          ;SHOW P/U FLAG ON SCREEN
           MOVB    R8,R1
           BLWP    @VSBW

           LI      R0,PABBUF+>10   ;PUT P/U FLAG IN BUFF
           BLWP    @VSBW
           BLWP    @WRSECX

           B       @CONTINUE       ;RTN

RXBDSK     LI      R0,RXBDSK       ;ADJUST FCTN KEYS
           MOV     R0,@FCT8
           MOV     R0,@CKT8

           BLWP    @CLREOS
           DATA    528

           SCREEN  2
           DISPLAY 14,5,TXTMS7,21  ;'XB PROGRAM ON DRIVE :'
           DISPLAY 16,5,TXTMS8,22  ;'ENTER XB PROGRAM NAME:'

RXBLP1     BL      @GETVOL
           DATA    588,VDSK1,RXBLP1
           LI      R1,>0100
           MOVB    R1,@OPDRV

           LI      R0,668          ;CLEAR NAME BUFFER
           LI      R1,TBUF
           LI      R2,10
           BLWP    @VMBR

           BLWP    @GTMKEY         ;GET PROGRAM NAME
           DATA    668
           DATA    TBUF
           DATA    10
           DATA    >202E

           LI      R1,1            ;GET LM
           MOV     R1,@SECTOR
           BLWP    @RDSECX

           BLWP    @MOVSCT
           DATA    SRCST1

           LI      R3,SRCST1       ;LM POINTERS
RXBLP4     MOV     *R3+,@SECTOR    ;GET LM POINTER
           JEQ     RXBLPA

           BLWP    @RDSECX         ;GET DIRECTORY ENTRY

           LI      R0,PABBUF       ;GET AND CHECK PROGRAM NAMES
           LI      R1,SRCST2       ;TEMP BUFFER
           LI      R2,10
           BLWP    @VMBR

           LI      R4,TBUF         ;CHECK FILENAME
RXBLP6     CB      *R1+,*R4+
           JGT     RXBLPA          ;IS IT BIGGER//THEN FILE IS NOT THERE
           JLT     RXBLP4          ;IS IT SMALLER//THEN CHECK NEXT NAME

           DEC     R2              ;MORE CHAR TO TEST
           JNE     RXBLP6          ;YES..

           BLWP    @MOVSCT         ;NO..ITS JUST RIGHT
           DATA    SRCST2

           MOVB    @SRCST2+12,R1   ;IS IT A PROGRAM
           CZC     @PRGMSK,R1
           JNE     RXBX1           ;YES..

           CLR     R1              ;1S IT VAR 254
           MOVB    @SRCST2+>11,R1
           CI      R1,>FE00
           JNE     RXBLP9          ;NO..

           LI      R1,SRCST2+>1C
           MOV     R1,@BLKLNK
           BL      @GETLNK

           MOV     @STRSCT,@SECTOR
           BLWP    @RDSECT

           LI      R0,PABBUF+7
           JMP     RXBXB3

RXBX1      LI      R1,SRCST2+>1C   ;BLOCK LINK
           MOV     R1,@BLKLNK
           BL      @GETLNK         ;GET STRSCT//OFFSET

           MOV     @STRSCT,@SECTOR
           BLWP    @RDSECX         ;GET SECTOR

           LI      R0,PABBUF       ;GET FIRST WORD
RXBXB3     LI      R1,TEMPR1
           LI      R2,2
           BLWP    @VMBR

           C       @TEMPR1,@VARMSK ;IS IT NEGATIVE?
           JL      RXBLP8

           MOV     @TEMPR1,R3      ;UNPROTECT
           NEG     R3
           MOV     R3,@TEMPR1

           BLWP    @VMBW

           BLWP    @WRSECX         ;WRITE TO DISK

RXBLP8     SCREEN  1
           DISPLAY 19,8,TXTMS9,22  ;'PROGRAM IS UNPROTECTED'
           JMP     RXBLPB

RXBLP9     SCREEN  1
           DISPLAY 19,9,TXTMSA,21  ;'NOT IN PROGRAM FORMAT'
           JMP     RXBLPB

RXBLPA     SCREEN  1               ;'FILE NOT FOUND'
           DISPLAY 19,12,TXTRC4,TXTRC4L

RXBLPB     B       @FMT070

SCCBUF     DATA    0
           BSS     30              ;CONTROL CODE BUFFER
COLBUF     BYTE    >F4             ;FGND/BGND COLOR==DEF IS WHITE/BLUE

LSTDVC     LWPI    MYREG1
           LI      R0,MGR
           C       @FCT8,R0
           JEQ     LSTDV1
           B       @MGR

LSTDV1     BLWP    @CLRSCN         ;* LIST DEVICE ROUTINE *

           SCREEN  1
           DISPLAY 3,0,TXTPP1,19   ;'ENTER LIST DEVICE :'

           LI      R0,160          ;SHOW DEFAULT LIST DEVICE ON LINE 5
           LI      R1,PNAME
           MOVB    @PDATA2+9,R2    ;BUFFER SIZE
           SRL     R2,8
           BLWP    @VMBW
           LI      R2,40
           BLWP    @VMBR           ;CLEAR BUFFER

           BLWP    @GTMKEY         ;GET LIST DEVICE
           DATA    160             ;LINE 5
           DATA    PNAME
           DATA    40
           DATA    0

           CLR     R3              ;GET LENGTH OF "LIST" DEVICE
           LI      R0,160          ;LINE 5
LSLP1      BLWP    @VSBR
           CB      R1,@ASCLO
           JEQ     LSLP2
           INC     R0
           INC     R3
           JMP     LSLP1

LSLP2      SWPB    R3              ;SAVE DEVICE LENGTH
           MOVB    R3,@PDATA2+9

           SCREEN  1
           DISPLAY 6,0,TXTPP2,25   ;'SEND CONTROL CODES (Y/N):'

LSLP4      LI      R0,266
           MOVB    @YES,R1
           BLWP    @GTSKEY

           CB      @YES,R1
           JEQ     LSLP3
           CB      @ASC_N,R1
           JNE     LSLP4

           CLR     @SCCBUF
           B       @STAR2

LSLP3      SCREEN  1
           DISPLAY 8,0,TXTPP3,35   ;'ENTER CONTROL CODES:'

LSLP7      BLWP    @CLREOS
           DATA    360             ;FROM LINE 10

           LI      R0,360          ;CLEAR BUFFER 
           LI      R1,DSTST0
           LI      R2,100
           BLWP    @VMBR

           BLWP    @GTMKEY
           DATA    360             ;LINE 10
           DATA    DSTST0
           DATA    92              ;UPTO 92 CHARS.
           DATA    0

* VALIDATE CONTROL CODES
           LI      R3,>3039        ;CHECK RANGE 0-9 DECIMAL
           LI      R2,DSTST0
LSLP5      MOVB    *R2+,R1

           CB      @STAR,R1        ;STAR= *
           JEQ     STAR1
           CB      @ASCLO,R1       ;SKIP SPACES
           JEQ     LSLP5

           CB      R1,R3
           JLT     LSLP7           ;<0 NO BKP120.
           SWPB    R3
           CB      R1,R3
           JGT     LSLP7           ;>9 NO BKP120.
           SWPB    R3
           JMP     LSLP5

STAR1      CLR     R6              ;#OF CODES TO SEND
           LI      R7,SCCBUF+1
           LI      R8,DSTST0

STAR3      CB      *R8,@STAR
           JEQ     STAR2

           MOVB    *R8+,@TBUF
           CB      @ASCLO,@TBUF
           JEQ     LSLP7           ;RESTART IF SPACE

           MOVB    *R8+,@TBUF+1
           CB      @ASCLO,@TBUF+1
           JEQ     LSLP7           ;RESTART IF SPACE
           INC     R8

           BL      @CONVRT

           SWPB R5
           MOVB    R5,*R7+
           INC     R6              ;CODE COUNTER
           JMP     STAR3

STAR2      SWPB    R6              ;SET # OF CODES
           MOVB    R6,@SCCBUF

           SCREEN  1
           DISPLAY 11,0,TXTPP4,19  ;'SAVE TO DISK (Y/N):'

STAR5      LI      R0,460          ;LINE 12, COLUMN 21
           MOVB    @YES,R1
           BLWP    @GTSKEY

           CB      @YES,R1
           JEQ     STAR4
           CB      @ASC_N,R1
           JNE     STAR5

           B       @MGR            ;NO..

STAR4      SCREEN  1               ;'PRESS ENTER.'
           DISPLAY 14,TXTPP6C,TXTPP6,TXTPP6L

           LI      R0,594
           LI      R1,>2000
           BLWP    @GTSKEY

           MOVB    @ONE,@OPDRV
           LI      R0,1
           MOV     R0,@SECTOR
           BLWP    @RDSECX

           BLWP    @MOVSCT
           DATA    SRCST1

           LI      R4,SRCST1
STAR6B     MOV     *R4+,@SECTOR
           JEQ     STAR4

           BLWP    @RDSECX

           LI      R3,TXTMGR
           LI      R0,PABBUF
           LI      R1,TBUF
           MOVB    @MGRLN,R2       ;GET LENGTH OF PROGRAM FILE NAME
           SRL     R2,8
           BLWP    @VMBR

STAR6C     CB      *R3+,*R1+
           JNE     STAR6B
           DEC     R2
           JNE     STAR6C

           LI      R0,PABBUF+>A0   ;WRITE LIST DEVICE
           LI      R1,PDATA2+9
           MOVB    @PDATA2+9,R2    ;# OF BYTES TO WRITE
           SRL     R2,8
           INC     R2              ;+1
           BLWP    @VMBW

           LI      R0,PABBUF+>D0   ;WRITE CONTROL CODES
           LI      R1,SCCBUF
           LI      R2,33           ;# OF BYTES TO WRITE
           BLWP    @VMBW

           BLWP    @WRSECX
           B       @MGR

CONVRT     CLR     R0
           CLR     R1
           CLR     R3
           CLR     R5
           LI      R4,2            ;LENGTH OF STRING

MOVN       DEC     R4
           MOVB    @TBUF(R4),R2
           SRL     R2,8
           AI      R2,->0030
           MOV     R0,R0
           JNE     EXP

           LI      R0,1
           JMP     ACCUM

EXP        MPY     @DTEN,R0
           MOV     R1,R0
           MPY     R1,R2
           MOV     R3,R2

ACCUM      A       R2,R5
           JNO     NEXT
           CLR     R5
           RT

NEXT       MOV     R4,R4
           JNE     MOVN
           RT

PDATA3     DATA    >0014,>1000,>5050,>0000,>000F
TNAME      TEXT    'DSK1.           '

CLRBF      MOV     *R14+,R3         ;CLEAR BUFFER
           LI      R5,256           ;CLEAR 256 BYTE BUFFER
           CLR     R2
SETLM      MOVB    R2,*R3+
           DEC     R5
           JNE     SETLM
           RTWP

; TPFIL=0 IF TYPE FILE <>0 IF PRINT FILE

TFIL       LWPI    MYREG1           ;SCREEN  DIS/VAR 80 FILE
           LIMI    0

           CLR     @KEYSW           ;FOR GETSKEY  ..RETURN DEFAULT ON CR

           MOVB    @SRCDRV,@TNAME+3 ;DISK DRIVE #
           AB      @H30,@TNAME+3    ;MAKE IS ASCII

           LI      R3,TNAME+5      ;CLEAR NAME BUFFER
           LI      R4,10
           LI      R2,>2000        ;SPACE
FSPA       MOVB    R2,*R3+
           DEC     R4
           JNE     FSPA

           LI      R5,SCNBUF+3     ;MOVE FILE NAME TO PAB
           A       R7,R5           ;OFFSET
           LI      R4,10
           LI      R3,TNAME+5
MFLE       MOVB    *R5+,*R3+
           DEC     R4
           JNE     MFLE

;   FIND LENGTH OF FILE NAME

           LI      R1,TNAME+5
           CLR     R0              ;# OF CHAR IN LIST DEVICE
NSP        CB      *R1+,@ASCLO
           JEQ     FDSP
           INC     R0
           JMP     NSP

FDSP       SWPB    R0              ;SAVE DEVICE LENGTH
           AB      @QT,R0          ;  ADD 5 TO NAME LENGTH

           MOVB    R0,@PDATA3+9


RFIL       BLWP    @CLRSCN

           MOVB    @TPFIL,@TPFIL   ;TYPE=0  PRINT<>0
           JNE     RF3

           SCREEN  1
           DISPLAY 4,10,TXTC8A,4   ;'TYPE'

           SCREEN  1
           DISPLAY 4,15,TNAME,15   ;'FILE NAME '

RF3        MOVB    @D40,@TRACKS    ;CLEAR FLAG
           LI      R0,PAB3         ;LOAD PAB  * OPEN *  OR REDO
           LI      R1,PDATA3
           LI      R2,25
           BLWP    @VMBW

           LI      R4,PAB3+9
           MOV     R4,@PNTR
           BLWP    @DSRLNK         ;OPEN FILE DIS/VAR 80
           DATA    8

           STST    R8              ;GET STATUS REG
           CZC     @KEYMSK,R8      ;DID WE HAVE AN ERR
           JEQ     FOK             ;NO ERROR

           LI      R0,PAB3+1       ;SET UP FOR FIXED 80 FILE
           LI      R1,>0400
           BLWP    @VSBW

           LI      R4,PAB3+9
           MOV     R4,@PNTR
           BLWP    @DSRLNK         ;OPEN FILE DIS/FIX 80
           DATA    8

           BL      @EKTEST         ;CHECK FOR ERR/ABORT

FOK        MOVB    @TWO,R1
           LI      R0,PAB3
           BLWP    @VSBW           ;SET TO READ MODE

;  OPEN AND PRINT CONTROL CODES FOR PRINTER


           MOVB    @TPFIL,@TPFIL   ;TYPE=0  PRINT<>0
           JEQ     RPAG

PFIL1      LI      R0,PAB2         ;OPEN PRINTER PAB
           LI      R1,PDATA2
           LI      R2,50
           BLWP    @VMBW

           LI      R4,PAB2+9
           MOV     R4,@PNTR
           BLWP    @DSRLNK
           DATA    8
           BL      @EKTEST         ;ERROR//KEY PRESSED TEST

           LI      R1,>5003
           SWPB    R1
           LI      R0,PAB2
           BLWP    @VSBW           ;* WRITE OPCODE *

           MOVB    @SCCBUF,@SCCBUF ;SEND CONTROL CODES
           JEQ     FSND1           ;NO..

           MOVB    @SCCBUF,R1      ;# OF CODES TO SEND
           LI      R0,PAB2+5
           BLWP    @VSBW

           MOVB    R1,R2           ;BYTES TO SEND
           SRL     R2,8

           LI      R0,PABBUF
           LI      R1,SCCBUF+1
           BLWP    @VMBW

           LI      R4,PAB2+9
           MOV     R4,@PNTR
           BLWP    @DSRLNK
           DATA    8
           BL      @EKTEST

FSND1      LI      R1,>5000
           LI      R0,PAB2+5
           BLWP    @VSBW

RPAG       LI      R5,965
           LI      R6,SCNBUF
EPAG       MOVB    @ASCLO,*R6+     ;CLEAR SCREEN BUFFER
           DEC     R5
           JNE     EPAG

           LI      R5,SCNBUF
           MOV     R5,@TEMPR0      ;SET BUFFER POINTER

           LI      R5,22

RAGN       LI      R4,PAB3+9
           MOV     R4,@PNTR
           BLWP    @DSRLNK         ;READ FILE
           DATA    8
           STST    R8
           CZC     @KEYMSK,R8      ;DO WE HAVE ERROR(EOF)
           JNE     DEOF            ;YES

           LI      R0,PAB3+5
           BLWP    @VSBR           ;GET # BYTES
           MOVB    R1,R2
           SRL     R2,8
           MOV     @TEMPR0,R1
           LI      R0,>1000        ;BUFFER ADDRES IN VDP
           BLWP    @VMBR           ;XFER FROM VDP TO CPU

;***  PRINT HERE

           MOVB    @TPFIL,@TPFIL   ;TYPE=0  PRINT<>0
           JEQ     PFIL2

           SWPB    R2              ;# OF BYTES AT MSB
           MOV     R2,R1
           SWPB    R2              ;RESET TO #BYTES AT LSB
           LI      R0,PAB2+5
           BLWP    @VSBW

           LI      R4,PAB2+9
           MOV     R4,@PNTR
           BLWP    @DSRLNK         ;PRINT FILE
           DATA    8
           BL      @EKTEST

PFIL2      C       R2,@D40
           JLE     LES
           A       @D40,@TEMPR0    ;* >0028
           DEC     R5
           JEQ     NEOF

LES        A       @D40,@TEMPR0    ; >0028
           DEC     R5
           JNE     RAGN            ;AT END OF PAGE
           JMP     NEOF

DEOF       MOVB    @ASC_1,@TRACKS   ;SET FLAG TO SHOW EOF

NEOF       BLWP    @CLRSCN
           CLR     R0
           LI      R1,SCNBUF
           LI      R2,920
           BLWP    @VMBW

           MOVB    @TPFIL,@TPFIL   ;PRINT FILE
           JNE     RF4             ;YES

           SCREEN  1
           DISPLAY 23,0,TXTCD3,35  ;'PRESS ANY KEY TO CONTINUE'

           MOVB    @TRACKS,@TRACKS ;EOF
           JEQ     NOKEY           ;NO

           SCREEN  1
           DISPLAY 23,2,TXTCD4,3   ;'EOF'

NOKEY      BLWP    @KSCAN          ;GET A KEY
           MOVB    @STATUS,R8
           CZC     @KEYMSK,R8
           JEQ     NOKEY

           CB      @KCODE,@BK      ;BACK PRESSED
           JEQ     RTFIL           ;YES

           CB      @KCODE,@RDO     ;REDO
           JEQ     RTFIL           ;YES

RF4        MOVB    @TRACKS,@TRACKS ;CHECK IF EOF
           JNE     RTFIL           ;YES

           JMP     RPAG            ;NO

RTFIL      LI      R0,PAB3         ;* CLOSE READ FILE *
           LI      R1,>0100
           BLWP    @VSBW

           SWPB    R1
           LI      R0,PAB3+5
           BLWP    @VSBW

           LI      R4,PAB3+9
           MOV     R4,@PNTR
           BLWP    @DSRLNK
           DATA    8

           MOVB    @TPFIL,@TPFIL   ;TYPE=0  PRINT<>0
           JEQ     RFIL4

           LI      R0,PAB2         ;* CLOSE PRINT FILE *
           LI      R1,>0100
           BLWP    @VSBW

           SWPB R1
           LI      R0,PAB2+5
           BLWP    @VSBW

           LI   R4,PAB2+9
           MOV     R4,@PNTR
           BLWP    @DSRLNK
           DATA    8

RFIL4      CB      @KCODE,@RDO     ;REDO
           JEQ     RF1             ;YES

           B       @CAT            ;BACK
RF1        B       @RFIL

;
;
;  XB PROGRAM IMAGE LOADER
;
;
GADD       DATA    0
IXB        DATA    >4000,>AA55

ILOAD      LWPI    MYREG1
           LIMI    0

           BLWP    @CLRSCN

           LI      R0,ILOAD        ;ADJUST FCTN KEYS
           MOV     R0,@FCT8
           MOV     R0,@CKT8

           LI      R0,FILE
           MOV     R0,@FCT9
           MOV     R0,@CKT9
           SCREEN  4               ;'FILE UTILIES'
           DISPLAY 1,TXTCA6C,TXTCA6,TXTCA6L
RIMA       DISPLAY 5,6,TXTI1,29    ;RUN PROGRAM IMAGE XB OR E/A
           DISPLAY 14,7,TXTVOL,9   ;'DRIVE NO:'
           DISPLAY 16,7,TXTRC2,19  ;'Enter Name of File :'

IDR        BL      @GETVOL
           DATA    577,VDSK1,IDR
           LI      R1,>0100
           MOVB    R1,@SRCDRV
           MOVB    R1,@INAME+1
           AB      @H30,@INAME+1

           LI      R0,667          ;SHOW LAST NAME
           LI      R1,INAME+3
           LI      R2,10
           BLWP    @VMBW

           BLWP    @GTMKEY         ;GET FILENAME
           DATA    667             ;SCREEN ADDR
           DATA    INAME+3         ;BUFF ADDR
           DATA    10              ;10 CHAR
           DATA    >202E           ;INVALID CHAR (SPACE // PERIOD)

           CLR     R0              ;# OF CHAR IN LIST DEVICE
ISP        CB      *R1+,@ASCLO
           JEQ     FLEN
           INC     R0
           JMP     ISP

FLEN       SWPB    R0              ;SAVE DEVICE LENGTH
           AB      @QT,R0          ;ADD 5 TO NAME LENGTH
           MOVB    R0,@INLEN+1


; LET'S DO IT
;
           LWPI    >8300
           LIMI    0

;
; CALL INIT FOR XBASIC
;
;
           LI      R13,>9C02
           LI      R14,>9802
           LI      R4,>5FFF
           MOVB    *R14,@GADD      ;SAVE GROM ADDRESS
           LI      R12,>9800
           MOVB    *R14,@GADD+1
           NOP
           DEC     @GADD

SAGN       INC     R4
           CLR     R0
           LI      R1,IXB
           CI      R4,>F900
           JEQ     NOXB            ;XB IS NOT INSTALLED
           MOVB    R4,*R13         ;WRITE GROM ADDRESS
           SWPB    R4
           MOVB    R4,*R13
           SWPB    R4
           MOVB    *R12,R0         ;MOVE BYTE  FROM GROM TO R0
           LI      R3,>0006
           CB      R0,*R1+         ;'>40'
           JNE     SAGN

           MOVB    *R12,R0         ;IS NEXT BYTE
           LI      R3,>0600
           CB      R0,*R1+         ;'>00'
           JNE     SAGN

           MOVB    *R12,R0         ;IS NEXT BYTE
           LI      R3,>0600
           CB      R0,*R1+         ;'>AA'
           JNE     SAGN

           MOVB    *R12,R0         ;IS NEXT BYTE
           LI      R5,>0004
           CB      R0,*R1          ;'>55'
           JNE     SAGN

           S       R5,R4           ;WE FOUND XB CALL INIT DATA AT ADDRESS R4
           MOVB    R4,*R13         ;WRITE GROM ADDRESS
           SWPB    R4
           MOVB    R4,*R13
           LI      R2,>2000
IAGN       MOVB    *R12,*R2+       ;XFER DATA FROM GROM TO LOW MEM
           DEC     R3
           JNE     IAGN

NOXB       MOVB    @GADD,*R13      ;RESET GROM ADDRESS
           NOP
           MOVB    @GADD+1,*R13    ;RESTORE GROM ADDRESS

;
;   XFER LOADER TO LOW MEMORY
           LI      R1,STLD         ;ADDRESS OF DATA
           LI      R2,>2700
           LI      R3,>FFFF
IX1        MOV     *R1+,*R2+
           C       *R1,R3
           JNE     IX1
           BLWP    @CLRSCN
           B       @>271A          ;ADDRESS IN LOW  MEM

*******************************
*                             *
* -- P U T W --               *
*                             *
* DISPLAY WORD IN DECIMAL AT  *
* LINE/COLUMN COORDINATES IN  *
* R0.                         *
*                             *
*******************************
PUTW       MOV     *R11+,R0
           MOV     *R11+,R1
           MOV     *R1,R2
           LI      R3,DECTBL
           CLR     R4
PUTW05     CLR     R1              ;CLEAR HI-WORD
           DIV     *R3+,R1
           SWPB    R1
           MOVB    R1,R1           ;IS DIGIT 0?
           JNE     PUTW10          ;NO-DISPLAY
           MOV     R4,R4           ;SUPRESSING?
           JEQ     PUTW15          ;YES-SKIP
PUTW10     SETO    R4
           AI      R1,>3000
           BLWP    @VSBW
           INC     R0
PUTW15     MOV     *R3,R1
           JNE     PUTW05
           RT

DECTBL     DATA    10000,1000,100,10,1,0

;
;    THE FOLLOWING DATA MUST BE LOCATED AT >2700+
;
STLD       DATA    >050C,>0A00,>0000,>2400
INLEN      DATA    >000B,>4453
INAME      DATA    >4B31,>2E20,>2020
           DATA    >2020,>2020,>2020,>2020
           DATA    >02E0,>27F2
           DATA    >0300,>0000,>C009,>C04A,>C08E
           DATA    >0420,>2832,>D80C,>837C,>C80F
           DATA    >8356,>C80C,>8354,>02E0,>83E0
           DATA    >C80B,>8300,>020C,>1100,>C80C
           DATA    >83D0,>1D00,>0202,>4008,>1002
           DATA    >C0A0,>83D2,>C092,>C802,>83D2
           DATA    >05C2,>C272,>9CA0,>8355,>16F6
           DATA    >C160,>8354,>0206,>270A,>9CB6
           DATA    >16F0,>0605,>16FC,>0699,>103B
           DATA    >1E00,>C2E0,>8300,>02E0,>27F2
           DATA    >0200,>0A00,>0201,>27FE,>0202
           DATA    >0006,>0420,>283A,>C104,>1601
           DATA    >C108,>0200,>0A06,>C048,>C087
           DATA    >0420,>283A,>C060,>2708,>B860
           DATA    >280D,>2709,>C186,>16B8,>D00D
           DATA    >161B,>0205,>0300,>0206,>0800
           DATA    >0201,>8300,>C08E,>0203,>0028
           DATA    >C005,>0420,>283A,>C006,>0420
           DATA    >2832,>A14E,>A18E,>0603,>16F6
           DATA    >0200,>030E,>0420,>283E,>0200
           DATA    >0401,>0420,>283E,>0694,>0420
           DATA    >0000,>0000,>1111,>2222,>3333
           DATA    >0000,>5555,>6666,>7777,>8888
           DATA    >0820,>2700,>02E0,>0004
IFLAG      DATA    >0001,>0020,>082E,>0000,>0000        ;IFAG=0 FOR E/A VDP
           DATA    >0000,>0000,>0000,>0000              ;    <>0 FOR XB VDP
           DATA    >0000,>0000,>0000,>0000,>0000
           DATA    >0000,>0000,>0000,>0000,>0000
           DATA    >2812,>2842,>2812,>2850,>2812
           DATA    >285C,>2812,>286A,>06A0,>287C
           DATA    >D831,>8C00,>0602,>16FC,>0380
           DATA    >06A0,>2882,>DB60,>8800,>0002
           DATA    >0380,>06A0,>2882,>DC60,>8800
           DATA    >0602,>16FC,>0380,>C05D,>D82D
           DATA    >0001,>8C02,>0261,>8000,>D801
           DATA    >8C02,>0380,>0201,>4000,>1001
           DATA    >04C1,>C09D,>D820,>2817,>8C02
           DATA    >E081,>D802,>8C02,>C06D,>0002
           DATA    >C0AD,>0004
           DATA    >045B,>FFFF

SLAST      END