* INSTALL_DBS CODE SECTION - PROVIDES CHECKING AND INSTALLATION FUNCTIONS
* INSTALL A PRINTER DRIVER
D$       SETSTR   [.LEFT(.FILE,4)]
         INCLUDE  [D$]_QDOS_TRAP_IN
         INCLUDE  [D$]_QDOS_VECT_IN
         INCLUDE  [D$]_QDOS_DATA_IN
         INCLUDE  [D$]_DATA_IN
         INCLUDE  [D$]_INST_IN
         XDEF     INSTALL,I_DRIVE$,I_DRIVE
         XREF     CHK_CODE,CK_BAUD2,CK_PAR,CK_CONT,CK_255
SD.SETIN EQU      $29
*
         SECTION  CODE
* THE DEFAULT DRIVE ON WHICH TO STORE THE INSTALLATION DATA
I_DRIVE$ DC.W     I_DRIVE.-I_DRIVE_  STORAGE SIZE
I_DRIVE  DC.W     5                 NAME LENGTH
I_DRIVE_
         DC.B     'FLP1_'           NAME
         DCB.B    14,0              EXTRA STORAGE
I_DRIVE.
         DS.W     1                 ALIGN ON A WORD BOUNDARY
* THE FIXED PART OF THE DRIVER
I_DATA
         DC.W     6+9+1+18+1+1+1+4
         DC.B     'prt1'
ID_LEN   EQU      *-I_DATA+INS_BUFL
         DC.B     0,' '
ID_DRV   EQU      *-I_DATA+INS_BUFL
ID.DRV   EQU      9
         DCB.B    ID.DRV,' '        THE DRIVER NAME
ID_PORT  EQU      *-I_DATA+INS_BUFL
ID.PORT  EQU      17
         DC.B     0                 PORT: 0=PAR.. 1=SER1 2=SER2
         DC.B     0                 PORT NAME LENGTH / PARITY
         DCB.B    ID.PORT,' '       PORT NAME / BAUD RATE
ID_SPEC  EQU      *-I_DATA+INS_BUFL
         DC.B     0,0,0             PAGE,WIDTH,CONTINUOUS
         DCB.B    4,' '
ID.FIXLN EQU      *-I_DATA-2
         DS.W     0                 ALIGN ON A WORD BOUNDARY
* THE PROGRAM
INSTALL
         MOVE.L   A4,-(SP)
         LEA      INS_BUFL(A3),A1   COPY THE FIXED PART TO THE INSTALL STRING
         LEA      I_DATA(PC),A0
         MOVE.W   (A0)+,D1          STORE THE LENGTH
         MOVE.W   D1,(A1)+
         SUBQ.W   #1,D1             BALANCE THE DBRA
I_INITLP
         MOVE.B   (A0)+,(A1)+
         DBRA     D1,I_INITLP
*
         MOVE.L   DBASE(A3),A4
         MOVE.L   DATABASE(A3),A0
*
         LEA      ID_DRV(A3),A1     BUFFER TO GET DRIVER NAME INTO
         MOVEQ    #ID.DRV,D2        LENGTH OF BUFFER
         MOVEQ    #2,D1             FIELD NO.
         JSR      FSD.GET(A4)
         BNE.L    I_RTS
*
         LEA      ID_PORT+2(A3),A1  BUFFER TO GET PORT NAME INTO
         MOVEQ    #ID.PORT,D2       LENGTH OF BUFFER
         MOVEQ    #4,D1             FIELD NO.
         JSR      FSD.GET(A4)
         BNE.L    I_RTS
*
         MOVE.B   D1,ID_PORT+1(A3)  STORE THE NAME LENGTH
         CMPI.B   #4,D1
         BNE.L    I_NSER            JUMP IF NOT SER1/SER2
*
         MOVEP.W  ID_PORT+2(A3),D1  D1.L=..AC  (NAME=ABCD)
         LSL.L    #8,D1             D1.L=.AC.
         MOVE.B   ID_PORT+3(A3),D1  D1.L=.ACB
         ROL.W    #8,D1             D1.L=.ABC
         LSL.L    #8,D1             D1.L=ABC.
         MOVE.B   ID_PORT+5(A3),D1  D1.L=ABCD
         ANDI.L   #$DFDFDFFF,D1     MAKE A, B & C UPPERCASE
         MOVEQ    #1,D2             NEW VALUE IF SER1
         CMPI.L   #'SER1',D1
         BEQ.S    I_SERIAL          JUMP IF SER1
         MOVEQ    #2,D2
         CMPI.L   #'SER2',D1
         BNE.S    I_NSER            JUMP IF NOT SER2
* INSTALL A SERIAL PORT
I_SERIAL
         MOVE.B   D2,ID_PORT(A3)    SAVE PORT NUMBER
         LEA      INS_FILE+2(A3),A1 USE THIS BUFFER TO GET PARITY
         MOVEQ    #20,D2            LENGTH OF BUFFER
         MOVEQ    #6,D1             FIELD NO.
         JSR      FSD.GET(A4)
         BNE.L    I_RTS
         MOVE.W   D1,-(A1)          STORE THE LENGTH
*
         BSR.L    CK_PAR            CHECK AND EVALUATE PARITY
         BNE.L    I_RTS             EXIT IF ERROR
         LEA      E_PARITY(PC),A2
         TST.W    D1
         BNE.L    I_ERROR           PRINT MESSAGE IF ERROR
         MOVE.B   BUFF(A3),ID_PORT+1(A3)  STORE THE PARITY NUMBER
*
         MOVE.L   DATABASE(A3),A0
         LEA      INS_FILE(A3),A1   USE THIS BUFFER TO GET BAUD RATE
         MOVEQ    #20,D2            LENGTH OF BUFFER
         MOVEQ    #5,D1             FIELD NO.
         JSR      FSD.GET(A4)
         BNE.L    I_RTS
         MOVE.W   (A1),D1           GET THE BAUD RATE
*
         BSR.L    CK_BAUD2          CHECK THE BAUD RATE
         BNE.L    I_RTS             EXIT IF ERROR
         LEA      E_BAUD(PC),A2
         TST.W    D1
         BNE.L    I_ERROR           PRINT MESSAGE IF ERROR
         MOVE.B   BUFF(A3),ID_PORT+2(A3)  STORE THE BAUD RATE
         MOVE.B   BUFF+1(A3),ID_PORT+3(A3)
         MOVE.B   #' ',ID_PORT+4(A3)  OVERWRITE 'R'
         MOVE.B   #' ',ID_PORT+5(A3)  OVERWRITE PORT NUMBER
* NOW FILL IN PAGE SIZE, WIDTH AND CONINUOUSNESS
I_NSER
         LEA      INS_FILE(A3),A1   USE THIS BUFFER TO GET PAGE LENGTH
         MOVEQ    #20,D2            LENGTH OF BUFFER
         MOVEQ    #8,D1             FIELD NO.
         JSR      FSD.GET(A4)
         BNE.L    I_RTS
*
         LEA      E_PAGEL(PC),A2    ERROR MESSAGE
         MOVE.W   (A1),D1           GET THE LENGTH
         CMPI.W   #255,D1           MUST NOT EXCEED 255
         BHI.L    I_ERROR
         MOVE.B   D1,ID_SPEC(A3)    STORE IT
*
         LEA      INS_FILE(A3),A1   USE THIS BUFFER TO GET WIDTH
         MOVEQ    #20,D2            LENGTH OF BUFFER
         MOVEQ    #9,D1             FIELD NO.
         JSR      FSD.GET(A4)
         BNE.L    I_RTS
*
         LEA      E_WIDTH(PC),A2    ERROR MESSAGE
         MOVE.W   (A1),D1           GET THE LENGTH
         CMPI.W   #255,D1           MUST NOT EXCEED 255
         BHI.L    I_ERROR
         MOVE.B   D1,ID_SPEC+1(A3)  STORE IT
*
         LEA      INS_FILE+2(A3),A1 USE THIS BUFFER TO GET CONTINUOUSNESS
         MOVEQ    #20,D2            LENGTH OF BUFFER
         MOVEQ    #7,D1             FIELD NO.
         JSR      FSD.GET(A4)
         BNE.L    I_RTS
         MOVE.W   D1,-(A1)          STORE THE LENGTH
*
         BSR.L    CK_CONT
         BNE.L    I_RTS             EXIT IF ERROR
         LEA      E_CONT(PC),A2
         TST.W    D1
         BNE.L    I_ERROR           PRINT MESSAGE IF ERROR
         MOVE.B   BUFF(A3),ID_SPEC+2(A3)
* NOW GET ALL THE PRINTER STRINGS
         MOVE.W   #REC.FLD+(9*RCF.LEN),D3  D3 POINTS TO FIELD DESCRIPTOR
         MOVEQ    #21-1,D2          NUMBER OF FIELDS
I_PSLOOP
         MOVE.L   DATABASE(A3),A0
         MOVE.W   RCF.STOF(A0,D3.W),A1  USE THE (DATABASE) STORED STRING
         ADDA.L   REC.CHP(A0),A1
         BSR.L    CHK_CODE          APPEND CODES TO INSTALL STRING
         BNE.L    I_RTS             EXIT IF ERROR
         TST.W    D1
         BNE.S    I_ERR_PS          PRINT MESSAGE IF ERROR
         ADDQ.W   #RCF.LEN,D3       NEXT FIELD DESCRIPTOR
         DBRA     D2,I_PSLOOP
*
         LEA      E_LONG(PC),A2
         MOVE.W   INS_BUFL(A3),D3
         MOVE.B   #$0A,INS_BUFF(A3,D3.W)  APPEND A LF
         SUBI.W   #ID.FIXLN,D3
         CMPI.W   #255,D3           CODES MUST NOT EXCEED 255
         BEQ.S    I_ERROR
         MOVE.B   D3,ID_LEN(A3)     STORE THE CODES LENGTH
         ADDQ.W   #1,INS_BUFL(A3)   RECORD LF SPACE
*
         MOVE.L   (SP)+,A4
         BRA.L    I_FILE            STORE THE INSTALLATION IN A FILE
* COME HERE IF A PRINTER STRING ERROR
I_ERR_PS
         LEA      IP_ERR$(PC),A0    ERROR MESSAGE FIXED PART
         LEA      INS_FILE(A3),A1   PLACE TO STORE MESSAGE
         MOVE.W   (A0)+,D2
         MOVE.W   D2,(A1)+          SET THE LENGTH TO THIS
         BRA.S    I_ERR_LE
I_ERR_LP
         MOVE.B   (A0)+,(A1)+       COPY THE MESSAGE
I_ERR_LE DBRA     D2,I_ERR_LP
*
         SUB.W    #REC.FLD-RCF.LEN,D3
         EXT.L    D3
         DIVU     #RCF.LEN,D3
         MOVE.W   D3,D1             GET FIELD NUMBER IN D1
         MOVEQ    #20,D2            BUFFER LENGTH IN D2
         MOVE.L   RT_FNAME(A3),A2   APPEND THE FIELD NAME
         JSR      (A2)
         BNE.S    I_RTS
         MOVE.B   #10,(A1)          APPEND A LF
         ADDQ.W   #1,D1
*
         LEA      INS_FILE(A3),A2
         ADD.W    D1,(A2)           UPDATE THE STRING LENGTH
* COME HERE IF AN ERROR MESSAGE IS TO BE PRINTED
I_ERROR
         MOVE.L   WINDOW(A3),A0
         MOVEQ    #-1,D3
         MOVE.B   ERR_INK(A3),D1    ERROR INK
         MOVEQ    #SD.SETIN,D0
         TRAP     #3
         MOVE.L   A2,A1             TEXT TO PRINT POINTED TO BY A1
         MOVE.L   A3,-(SP)
         MOVE.W   UT.MTEXT,A2       PRINT THE TEXT
         JSR      (A2)
         MOVE.L   (SP)+,A3
         MOVEQ    #-1,D3
         MOVE.B   NORM_INK(A3),D1   NORMAL INK
         MOVEQ    #SD.SETIN,D0
         TRAP     #3
*
         LEA      PRESSKEY(PC),A1   PRINT 'PRESS A KEY.'
         MOVE.L   A3,-(SP)
         MOVE.W   UT.MTEXT,A2       PRINT THE TEXT
         JSR      (A2)
         MOVE.L   (SP)+,A3
         MOVEQ    #-1,D3            PAUSE TILL KEYPRESS
         MOVEQ    #IO.FBYTE,D0
         TRAP     #3
I_RTS
         MOVE.L   (SP)+,A4
         TST.L    D0
         RTS
*
* OPEN THE CORRECT FILE, AND STORE THE INSTALLATION DATA WITHIN
MS_FNAME DC.W     MS_FNAM.-MS_FNAM_
MS_FNAM_
         DC.B     'Please enter the filename.',10
         DC.B     'Press ENTER when done, or ESC to exit.',10
MS_FNAM.
         DS.W     0                 ALIGN ON A WORD BOUNDARY
*
I_FILE
         LEA      I_DRIVE(PC),A0    DEFAULT DRIVE NAME
         LEA      INS_FILE(A3),A1   FILE NAME STORAGE
         MOVE.W   (A0)+,D1
         MOVE.W   D1,(A1)+          SET THE FILE NAME LENGTH TO THIS
         BRA.S    F_DRV_LE
F_DRV_LP
         MOVE.B   (A0)+,(A1)+       COPY THE DRIVE NAME
F_DRV_LE DBRA     D1,F_DRV_LP
*
         MOVE.L   DATABASE(A3),A0   APPEND THE REST OF THE FILENAME
         MOVE.L   DBASE(A3),A2
         MOVEQ    #50,D2
         SUB.W    INS_FILE(A3),D2   D2=BUFFER LENGTH REMAINING
         MOVEQ    #1,D1             D1=FIELD NUMBER
         JSR      FSD.GET(A2)       GET THE FILENAME
         BNE.L    F_RTS             EXIT IF AN ERROR OCCURS
         ADD.W    D1,INS_FILE(A3)   UPDATE ITS LENGTH
*
         MOVE.L   WINDOW(A3),A0
         LEA      MS_FNAME(PC),A1   EDIT FILENAME PROMPT
         MOVE.L   A3,-(SP)
         MOVE.W   UT.MTEXT,A2       PRINT THE MESSAGE
         JSR      (A2)
         MOVE.L   (SP)+,A3
         BNE.S    F_RTS
*
F_EDIT
         LEA      INS_FILE(A3),A1   POINT TO THE FILENAME
         MOVE.L   RT_EDIT(A3),A2
         MOVEQ    #1,D1
         JSR      (A2)              EDIT THE FILENAME
         BNE.S    F_RTS
*
         CMPI.B   #27,D1            IF ESC, EXIT
         BEQ.S    F_RTS
         CMPI.B   #10,D1            IF ENTER, INSTALL
         BNE.S    F_EDIT
*
         MOVEQ    #-1,D1            FOR MYSELF
         LEA      INS_FILE(A3),A0
         MOVEQ    #IO.DELET,D0      DELETE THE ORIGINAL FILE
         TRAP     #2
         CMPI.L   #ERR.NF,D0        NOT FOUND IS OK
         BEQ.S    F_OPEN
         TST.L    D0
         BNE.S    F_ERRPRT          IF ERROR, PRINT IT AND ASK AGAIN
*
F_OPEN
         MOVEQ    #-1,D1            FOR MYSELF
         MOVEQ    #IO.NEW,D3        A NEW FILE
         LEA      INS_FILE(A3),A0
         MOVEQ    #IO.OPEN,D0       OPEN THE FILE
         TRAP     #2
         TST.L    D0
         BNE.S    F_ERRPRT          IF ERROR, PRINT IT AND ASK AGAIN
*
         LEA      INS_BUFL(A3),A1
         MOVE.W   UT.MTEXT,A2       SAVE THE INSTALLATION DATA
         JSR      (A2)
*
         MOVE.L   D0,-(SP)          SAVE ANY ERROR CODE
         MOVEQ    #IO.CLOSE,D0      CLOSE THE CHANNEL
         TRAP     #2
         MOVE.L   (SP)+,D0          RESTORE THE ERROR CODE
*
         TST.L    D0
         BEQ.S    F_RTS
* COME HERE TO PRINT OUT THE ERROR MESSAGE
F_ERRPRT
         MOVE.L   D0,-(SP)
         MOVEQ    #-1,D3
         MOVE.L   WINDOW(A3),A0
         MOVE.B   ERR_INK(A3),D1    ERROR INK
         MOVEQ    #SD.SETIN,D0
         TRAP     #3
         MOVEQ    #10,D1
         MOVEQ    #IO.SBYTE,D0      PRINT A LF
         TRAP     #3
         MOVE.L   (SP)+,D0
         MOVE.W   UT.ERR,A2         PRINT THE ERROR MESSAGE
         JSR      (A2)
         MOVE.B   NORM_INK(A3),D1   ERROR INK
         MOVEQ    #SD.SETIN,D0
         TRAP     #3
         BRA.S    F_EDIT            EDIT THE FILENAME AGAIN
* COME HERE WHEN DONE
F_RTS    TST.L    D0
         RTS
* ERROR MESSAGES   123456789 123456789 123456789
E_PARITY DC.W     20
         DC.B     'Invalid parity type',10
         DS.W     0
E_BAUD   DC.W     18
         DC.B     'Invalid baud rate',10
         DS.W     0
E_PAGEL  DC.W     24
         DC.B     'Page length maximum 255',10
         DS.W     0
E_WIDTH  DC.W     18
         DC.B     'Width maximum 255',10
         DS.W     0
E_LONG   DC.W     27
         DC.B     'Installation data too long',10
         DS.W     0
E_CONT   DC.W     29
         DC.B     'Continuous must be YES or NO',10
         DS.W     0
IP_ERR$  DC.W     16
         DC.B     'Bad definition: '
         DS.W     0
PRESSKEY DC.W     20
         DC.B     'Please press a key.',10
         DS.W     0
         END
