home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Oakland CPM Archive
/
oakcpm.iso
/
sigm
/
sigmv068.ark
/
TURNKEY.PGM
< prev
next >
Wrap
Text File
|
1984-04-29
|
9KB
|
215 lines
; 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