;       FIXSEL.ASM      10/20/86
;
;       BY: MARTY L. WILLIAMS
;           VALLEY VIEW APTS
;           B8 A15
;           WATERVLIET, NY  12189
;           (518)786-1157
;
;       PROBLEM:
;       -WHEN A SELECT ERROR OCCURS, CP/M WILL
;        NOT RETURN YOU TO THE DRIVE YOU WERE ON.
;
;       SOLUTION:
;       -SAVE THE CURRENT DRIVE PRIOR TO SELECTING
;        THE NEXT DRIVE. IF A SELECT ERROR OCCURS,
;        RETURN TO THE CCP WITH THE LAST GOOD
;        DISK SELECTED.
;
;       NOTES:
;       -SOME BYTES ARE ROBBED FROM THE CCP INPUT
;        BUFFER. I DON'T THINK THIS SHOULD BE MUCH
;        OF A PROBLEM. I'VE NEVER HAD TO USE ALL
;        THOSE BYTES.
;       -YOU ARE RETURNED TO USER 0.
;       -WRITTEN FOR A KAYPRO 4/83.
;
;       IMPLEMENTATION: (63K SYSTEM)
;       A0>MOVCPM 63 *
;       A0>SAVE 34 CPM63.COM
;       A0>ASM SELFIX.AAZ
;       A0>DDT CPM63.COM
;       -ISELFIX.HEX
;       -R2980
;       G0 (OR ^C)
;       A0>SAVE 34 CPM63.COM
;       A0>SYSGEN CPM63.COM
;
;       PUT YOUR STARTING LOCATIONS HERE
;
CCP     EQU     0E000H          ;CCP START  63K SYSTEM
BDOS    EQU     0E800H          ;BDOS START 63K SYSTEM
;
ERRMSG  EQU     BDOS + 00E5H    ;ERR MSG OUTPUT
CURDSK  EQU     BDOS + 0342H    ;BDOS CURRENT DISK
SELDSK  EQU     BDOS + 0C45H    ;BDOS ORGINAL SELECT
                               ; DISK ADDRESS
;
       ORG     CCP  + 06H      ;START OF CCP COMMAND BUFFER
       DB      67H             ;SHORTEN THE COMMAND BUFFER
                               ; THIS GIVES YOU A BUFFER
                               ; OF 102 DECIMAL BYTES.
                               ; THIS SHOULD BE PLENTY.
;
       ORG     CCP  + 70H      ;START OF COMMAND BUFFER
                               ; THAT HAS BEEN TURNED INTO
                               ; A PATCH AREA
SAVCUR: LDA     CURDSK          ;GET CURRENT DISK PRIOR TO
                               ; SELECTING A NEW DISK
       STA     LSTDSK          ;SAVE IT AS THE LAST GOOD DISK
       JMP     SELDSK          ;ORIGINAL BDOS SELECT DISK FUNC
;
;       INSTEAD OF JUMPING TO REBOOT WHEN A SELECT ERROR
;       OCCURS (ORIGINAL CODE), JUMP TO ROUTINE BELOW
;
SELERR: CALL    ERRMSG          ;OUTPUT SELECT ERROR MESSAGE
       LDA     LSTDSK          ;GET LAST DISK SELECTED
                               ; PRIOR TO SELECT ERROR
       MOV     C,A             ;PUT IN 'C' FOR CCP TO USE
       JMP     CCP  + 03H      ;JUMP TO CCP
;
LSTDSK: DB      00H             ;STORAGE FOR LAST DISK
;
       ORG     BDOS + 63H      ;BDOS COMMAND VECTOR TABLE
       DW      SAVCUR          ;NEW COMMAND VECTOR FOR
                               ; SELECT DISK
       ORG     BDOS + 0A8H
       JMP     SELERR          ;JUMP TO NEW TAIL END SELECT
                               ; ERROR PROCESSING
       END