*
* CHGDISK: Change the disk between load and execution
*
* ?COPY.TXT 1983-2005 Dave Dunfield
* **See COPY.TXT**.
*
* DIRECTORY STRUCTURE
    ORG 0
DPREFIX RMB 8
DNAME   RMB 8
DTYPE   RMB 3
DDADR   RMB 2       DISK ADDRESS
DRADR   RMB 2       RUN ADDRESS
DATTR   RMB 1       FILE ATTRIBUTES
* ATTRIBUTE DEFINITIONS
RPERM   EQU %10000000   READ PERMISSION
WPERM   EQU %01000000   WRITE PERMISSSION
EPERM   EQU %00100000   EXECUTE PERMISSION
DPERM   EQU %00010000   DELETE PERMISSION
* RETURN CODES
RCPRO   EQU 3       PROTECTION VIOLATION
*
    ORG OSUTIL-512
*
CHGDISK CMPA    #'?'        HELP REQUEST?
    BNE MAIN        NO, START IT UP
    SSR 25      MESSAGE
    FCCZ    'Use: CHGDISK [<command string>]'
ABORT   RTS
MAIN    SSR 4       COMMAND SUPPLIED?
    BNE CMDSUP      YES
    SSR 88      CLEAR DOS DISK BUFFERS
    SSR 25      OUTPUT MESSAGE
    FCCZ    'Insert command disk, and enter command:'
    SSR 1       GET INPUT LINE
    SSR 4       IS IT ENTERED?
    BEQ ABORT       NO, EXIT
* WE HAVE COMMAND TO EXECUTE
CMDSUP  SSR 12      GET COMMAND NAME
    LDD #'EX'       FIRST TO OF 'EXE'
    STD ,X      SET TYPE
    STA 2,X     SET LAST 'E'
    SSR 69      LOOKUP IN DIRECTORY
    BNE ABORT       ERROR
    LDA DATTR,X     GET FILE ATTRIBUTES
    BITA    #EPERM      ALLOWED TO EXECUTE?
    BNE EXEOK       OK TO EXECUTE
    SSR 45      ISSUE PROTECTION ERROR
    RTS
* LOAD IN FILE & EXECUTE
EXEOK   LDD DDADR,X     GET DISK ADDRESS
    LDX DRADR,X     GET RUN ADDRESS
    STX >EXEADR     SAVE ADDRESS
    SSR 78      LOAD IN FILE
* WE HAVE FILE IN RAM, PROMPT FOR DISK CHANGE, AND EXECUTE
    SSR 88      CLEAR DOS DISK BUFFERS
    SSR 24      ISSUE MESSAGE
    FCCZ    'Insert disks for command execution, press <return>:'
CHKRET  SSR 34      GET CHAR
    CMPA    #$0D        CR?
    BNE CHKRET      NO, WAIT FOR IT
    SSR 22      NEW LINE
    JMP [EXEADR]    EXECUTE COMMAND
* MISC LOCAL VARIABLES
EXEADR  RMB 2       EXECUTION ADDRESS OF COMMAND
