;       T U R N K E Y . A S M

               ; THIS PROGRAM USED EITHER IN CONJUNCTION WITH
               ; ANY CPM SYSGEN PROGRAM OR PATCHED INTO SYSGEN VERS 2.0

               ; IT ALLOWS THE OPERATOR INPUT OF EITHER OR BOTH A COLD
               ; BOOT COMMAND PROGRAM AND/OR A WARM BOOT COMMAND PROGRAM
               ; WHICH CAN BE THE SAME OR DIFFERENT.  IT FUNCTIONS BY
               ; RESERVING A BUFFER SPACE JUST BEFORE BIOS FOR THE COLD BOOT
               ; COMMAND, WITH A SMALL ROUTINE RUN AT COLD BOOT TIME
               ; TO COPY THE BUFFER TO THE CCP BUFFER FOR EXECUTION AT
               ; COLD BOOT.  BY ALLOWING THIS SPACE THIS PROGRAM TRANSFERRS
               ; OPERATOR INPUT TO THIS BUFFER AND DIRECTLY TO THE
               ; CCP BUFFER DURING A SYSGEN OPERATION.  THUS WHEN THE
               ; SYSTEM IS PUT WITH SYSGEN IT CONTAINS THE NEW COLD
               ; AND OR WARM BOOT COMMANDS.  THE OPERATOR NEED ONLY
               ; RUN SYSGEN 2.0 OR A COMBINATION IF NOT 2.0 TO CHANGE
               ; THE COLD AND/OR WARM BOOT COMMANDS.


               ; WRITTEN BY:

               ;       JAMES K. OFFENBECHER
               ;               813 B. LAUREL HILL
               ;                       FORT DIX, NEW JERSEY
               ;                               08640
               ;       TELEPHONE  (609)-723-7529

               ;CONDITIONAL ASSEMBLY EQUATES - SET THE
               ;APPROPRIATE ONE TO BE A -1

0000 =         ALONE   EQU     0       ;SET TO -1 IF STANDALONE
FFFF =         SYSGEN  EQU     -1      ;SET TO -1 IF PATCH TO SYSGEN


               ;       BDOS EQUATES

0005 =         BDOS    EQU     5       ;BDOS CALL LOCATION
0001 =         CONIN   EQU     1       ;CONSOLE INPUT FUNCTION
0002 =         CONOUT  EQU     2       ;CONSOLE OUTPUT FUNCTION
000A =         INLINE  EQU     10      ;READ CONSOLE BUFFER FUNCTION
0000 =         WBOOT   EQU     0       ;WARM BOOT ADDRESS

               ; MISCELLANEOUS EQUATES

000D =         CR      EQU     0DH     ;ASCII CARRIAGE RETURN
000A =         LF      EQU     0AH     ;ASCII LINE FEED
0020 =         BUFLEN  EQU     32      ;LENGTH OF INPUT BUFFER
               ; NOTE:  THE BUFLEN EQUATE SHOULD BE THE SAME AS IN
               ;        THE BIOS PATCH.

               ; MEMORY IMAGE PATCH POINTS
0980 =         CCP     EQU     0980H   ;START OF CCP IN MEMORY
0987 =         CCPBUF  EQU     CCP+7   ;COMMAND LINE IN BDOS
1F80 =         BIOS    EQU     CCP+1600H       ;START OF BIOS
1F5D =         BIOBUF  EQU     BIOS-BUFLEN-3   ;SET UP BUFFER BEFORE BIOS

               ;CONDITIONAL EQUATES (IF PATCHING SYSGEN 2.0)

                       IF      SYSGEN

019A =         MSGOUT  EQU     019AH   ;SUBR LOC IN SYSGEN

                       ENDIF

               ; THIS IS THE STARTING POINT OF THE STANDALONE VERSION
               ; IT SETS THE STACK POINTER UP WHICH IS NOT NEEDED
               ; WITH THE PATCHED VERSION SINCE SYSGEN 2.0'S STACK
               ; IS BIG ENOUGH.

                       IF      ALONE

                       ORG     100H            ;IF STANDALONE ONLY

                       LXI     SP,STACK        ;SET UP STACK POINTER

                       ENDIF

               ; THIS IS THE STARTING POINT IF A PATCH TO SYSGEN IS USED.
               ; SYSGEN'S STACK IS USED AND IT IS ORGED PAST SYSGEN WITH
               ; A FEW BYTES TO SPARE.  TO PATCH SYSGEN  LOCATIONS MUST
               ; BE CHANGED AS FOLLOWS:
               ;       LOC     WAS     CHANGE TO
               ;       0320H   95H     00H
               ;       0321H   01H     05H
               ; USE DDT TO OVERLAY BOOTER.HEX OVER SYSGEN AFTER CHANGES
               ; AND SAVE WITH 'SAVE 5 SYSBOOT.COM'.

                       IF      SYSGEN

0500                   ORG     500H

0500 E5                PUSH    H               ;SAVE H/L FROM SYSGEN

                       ENDIF

               ; COMMON SEGMENT OF PROGRAM STARTS HERE

0501 CD5405    CBOT:   CALL    ZLOOP           ;CLEAR THE BUFFER
0504 218505            LXI     H,CBOOTM        ;POINT TO COLD BOOT REQUEST
0507 CD9A01            CALL    MSGOUT          ;PUT IT ON CONSOLE
050A 11E405            LXI     D,IBUF          ;POINT TO INPUT BUFFER
050D 0E0A              MVI     C,INLINE        ;GET FUNCTION IN C
050F CD0500            CALL    BDOS            ;PUT INPUT IN BUFFER
0512 3AE505    CO      LDA     IBUF+1          ;GET # OF CHARS ENTERED
0515 FE1F              CPI     BUFLEN-1        ;GET # OF CHARS ALLOWED
0517 DA2305            JC      COK             ;BYPASS ERROR IF OK
051A 21BD05            LXI     H,TOLONG        ;POINT TO ERROR MESSAGE
051D CD9A01            CALL    MSGOUT          ;PRINT IT
0520 C30105            JMP     CBOT            ;TRY AGAIN
0523 215D1F    COK:    LXI     H,BIOBUF        ;POINT TO BIOS BUFFER
0526 CD6105            CALL    COPY            ;GO PUT IT INTO THE BIOS
0529 CD5405    WBOT:   CALL    ZLOOP           ;RE-CLEAR THE BUFFER
052C 21A105            LXI     H,WBOOTM        ;POINT TO WARM BOOT REQUEST
052F CD9A01            CALL    MSGOUT          ;PUT IT ON CONSOLE
0532 11E405            LXI     D,IBUF          ;POINT TO INPUT BUFFER
0535 0E0A              MVI     C,INLINE        ;GET FUNCTION IN C
0537 CD0500            CALL    BDOS            ;GO PUT MESSAGE IN BUFFER
053A 3AE505            LDA     IBUF+1          ;GET # OF CHARS ENTERED
053D FE1F              CPI     BUFLEN-1        ;GET # OF CHARS ALLOWED
053F DA4B05            JC      WOK             ;BYPASS ERROR IF OK
0542 21BD05            LXI     H,TOLONG        ;POINT TO ERROR MESSAGE
0545 CD9A01            CALL    MSGOUT          ;PRINT IT
0548 C32905            JMP     WBOT            ;TRY AGAIN
054B 218709    WOK:    LXI     H,CCPBUF        ;POINT TO BUFFER IN CCP
054E CD6105            CALL    COPY            ;GO PUT MESSAGE IN CCP
0551 C37B05            JMP     EXIT            ;EXIT TO CPM OR SYSGEN

               ; THIS ROUTINE CLEARS THE INPUT BUFFER TO ALL ZEROS

0554 AF        ZLOOP:  XRA     A               ;CLEAR A
0555 0E20              MVI     C,BUFLEN        ;SET THE COUNT
0557 21E505            LXI     H,IBUF+1        ;POINT PAST THE MAX LENGTH
055A 77        ZLOOP1: MOV     M,A             ;CLEAR THE BYTE
055B 23                INX     H               ;POINT TO NEXT
055C 0D                DCR     C               ;ONE LESS TO DO
055D C25A05            JNZ     ZLOOP1          ;LOOP TILL DONE
0560 C9                RET

               ; THIS ROUTINE COPIES THE INPUT BUFFER TO THE SPECIFIED
               ; SYSTEM BUFFER CLEARING ANY OLD COMMANDS PRESENT.

0561 11E505    COPY:   LXI     D,IBUF+1        ;POINT TO # OF CHARS INPUT
0564 0E20              MVI     C,BUFLEN        ;PUT COUNT IN C
0566 1A        COPY1:  LDAX    D               ;GET BYTE FROM INPUT BUFFER
0567 FE61              CPI     'A'+20H         ;LESS THAN LOWER CASE A
0569 DA7305            JC      CHROK           ;DON'T NEED CONVERT
056C FE7B              CPI     'Z'+20H+1       ;HIGHER THAN LOWER CASE Z
056E D27305            JNC     CHROK           ;DON'T NEED CONVERT
0571 E65F              ANI     05FH            ;CONVERT TO LOWER CASE
0573 77        CHROK:  MOV     M,A             ;PUT IN OUTPUT
0574 23                INX     H               ;BUMP OUTPUT
0575 13                INX     D               ;BUMP INPUT TOO
0576 0D                DCR     C               ;ONE LESS TO DO
0577 C26605            JNZ     COPY1           ;LOOP TILL DONE
057A C9                RET

                       IF      ALONE

               ; THIS ROUTINE OUTPUTS A MESSAGE TO THE CONSOLE DEVICE
               ; BY CHARACTER UNTIL A ZERO IS ENCOUNTERED.
               ; ALSO INCLUDES STANDALONE EXIT ROUTINE.

               MSGOUT: MOV     A,M             ;GET BYTE IN A
                       ORA     A               ;SET Z FLAG IF END
                       RZ                      ;RETURN IF DONE
                       PUSH    H               ;SAVE THE POINTER
                       MOV     E,A             ;PUT CHAR IN E FOR BDOS
                       MVI     C,CONOUT        ;GET FUNCTION IN C
                       CALL    BDOS            ;GO PUT THE CHAR ON CONSOLE
                       POP     H               ;RESTORE POINTER
                       INX     H               ;POINT TO NEXT BYTE
                       JMP     MSGOUT          ;LOOP TILL DONE

               EXIT:   JMP     WBOOT

                       ENDIF

                       IF      SYSGEN

057B 21E105    EXIT:   LXI     H,NEWLIN        ;POINT TO NEW LINE MESSAGE
057E CD9A01            CALL    MSGOUT          ;PRINT IT
0581 E1                POP     H               ;RESTORE H/L FROM SYSGEN
0582 C39A01            JMP     MSGOUT          ;JUMP BACK INTO SYSGEN

                       ENDIF

               ; SYSTEM MESSAGES

0585 0D0A454E54CBOOTM: DB      CR,LF,'ENTER COLD BOOT COMMAND',CR,LF,0

05A1 0D0A454E54WBOOTM: DB      CR,LF,'ENTER WARM BOOT COMMAND',CR,LF,0

05BD 0D0A544F4FTOLONG: DB      CR,LF,'TOO MANY CHARACTERS - TRY AGAIN',CR,LF,0

05E1 0D0A00    NEWLIN: DB      CR,LF,0

               ; INPUT BUFFER STORAGE

05E4 20        IBUF:   DB      BUFLEN  ;BUFFER LENGTH FOR BDOS CALL
05E5                   DS      BUFLEN  ;THE ACTUAL STORAGE LOCS

               ; STACK SPACE IF STANDALONE ONLY (USE SYSGEN STACK IF OK)

                       IF      ALONE

                       DS      31
               STACK:  DS      1

                       ENDIF

0605                   END