;**************************** AMUS Program Label ******************************
;* Filename: RECALL.LIT Date: 27/09/91
;* Category: UTIL Hash Code: 203-422-501-727 Version: 1.1 (103)
;* Initials: WBCL/AM Name: Chris Davenport
;* Company: Willow Blue Chip Limited Telephone #: +44 935 22221
;* Related Files:
;* Min. Op. Sys.: AMOS 1.3D / AMOS 2.1 Expertise Level: BEG
;* Special:
;* Description: Displays all AMOS line editor buffers and allows selection
;* of any buffer by number. Also allows all buffers to be cleared.
;* Similar to the VAX/VMS recall command.
;*****************************************************************************
; To avoid excessive keystrokes it is recommended that RECALL.LIT is renamed
; to something shorter (eg. R.LIT). It is distributed as RECALL to reduce
; the chances of it clashing with other software.
; This program was written by: Chris Davenport
; 57 Lyde Road,
; Yeovil,
; Somerset,
; England
; + 44 935 72541
;
; This is a private submission by the author and is not connected in any
; way with Willow Blue Chip Ltd except through that firms' corporate
; membership of AMUS. Willow Blue Chip Ltd does not accept any responsibility
; whatsoever for this software.
; Permission is granted to any individual or institution to copy or use this
; software and the routines described in it, except for explicitly commercial
; purposes. This software must not be sold to any person or institution.
;;;;;;;;;;;;;;;;;;;;;;;;;;;; D I S C L A I M E R ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; No warranty of the software or of the accuracy of the documentation ;;
;; surrounding it is expressed or implied, and author does not acknowledge ;;
;; any liability resulting from program or documentation errors. ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Edit History
; *** Version 1.0 ***
; [100] on 22 August 1991 by Chris Davenport.
; Original.
;
; [101] on 27 September 1991 by Chris Davenport.
; Changed the help message and added label and disclaimer
; information to prepare for its debut on the AMUS network.
; 1.0 (101) 743-745-551-743
;
; *** Version 1.1 ***
; [102] on 4 October 1991 by Chris Davenport.
; Why do I make life difficult for myself? In trying to
; keep the similarity with VMS recall, I blinded myself
; to the much easier and more friendly way of doing things.
; Now prompts user for buffer number instead of dropping
; down to AMOS and requiring a further command to do the
; actual buffer recall.
; Update help message and changed it so that it always
; displays the current program name regardless of what
; the user renames it to.
; 1.1 (102) 402-217-337-666
;
; [103} on 6 October 1991 by Chris Davenport.
; Changed wording of prompt. Support for backspace and
; Control-C added. Clear screen before displaying help.
; 1.1 (103) 203-422-501-727
; Usage: RECALL will display contents of recall buffers
; and prompt user to specify one.
; RECALL/C will clear all recall buffers.
; RECALL/H will display help information.
phdr -1, 0, PH$REE!PH$REU ; Re-entrant and re-usable
jobidx a0 ; Index our JCB
mov JOBTRM(a0), a5 ; Index our TCB
mov T.LED(a5), d7 ; Index line editor stuff
bne 10$ ; - line editor active so continue
typecr <?No line editor for this terminal>
exit
10$: mov d7, a4 ; Index recall buffers
mov 6(a4), d7
bne 20$ ; - recall buffers have been allocated
typecr <?No recall buffers allocated>
exit
20$: mov d7, a3 ; Index the top recall buffer
byp ; Bypass white space
lin ; End of line?
bne 22$ ; - no, parameters specified
call LIST ; List all line editor buffers [102]
call GETNUM ; Get buffer number from user [102]
call NUMBER ; Process buffer number [102]
call LOCATE ; Locate buffer requested [102]
call FORCE ; Force into input buffer [102]
exit ; Exit to AMOS [102]
22$: ; Process switches if any.
; Valid switches are:- /C to clear all line editor buffers.
; /H for help with R.
cmpb @a2, #'/ ; Do we have a switch?
bne 25$ ; - no
add #1, a2 ; Skip past slash
movb @a2, d1 ; Get switch
ucs ; Fold to upper case
cmpb d1, #'C ; Is it a /C (for CLEAR) ?
beq 30$ ; - yes
cmpb d1, #'H ; Is it a /H (for HELP) ?
beq 35$ ; - yes
25$: typecr <?Illegal switch>
exit
35$: call HELP ; Display simple help information
exit
LIST: ; ************************************
; * LIST ALL LINE EDITOR BUFFERS *
; ************************************
; No parameters specified so we display a full list of the
; current contents of all the line editor buffers.
; Requires: A4 indexing the recall buffer area of our TCB.
; A3 indexing the first recall buffer.
; Returns : Nothing.
clr d2 ; Pre-clear counter
clr d3 ; Pre-clear work register
movb 16(a4), d3 ; Get number of recall buffers
10$: call DBUF ; Display recall buffer
mov @a3, a3 ; Index next buffer
dbf d3, 10$ ; and get next one
rtn
GETNUM: ; ***********************************
; * GET BUFFER NUMBER FROM USER *
; ***********************************
; Requires: Nothing.
; Returns : User response in BUF(a0).
getimp IMPSIZ, a0 ; Get some impure space [102]
; Put terminal into data mode and then process each character [102]
; entered using a little data entry routine. In this way the [102]
; users' response does not get put into one of the line editor [102]
; buffers and so we don't have to make adjustments to cope. [102]
trmrst d1 ; Get terminal status word [102]
orw #T$DAT!T$ECS, d1 ; Terminal to data mode w/o echo [102]
trmwst d1 ; Put terminal status word [102]
typesp <Enter number of buffer required:> ; Prompt [103] [102]
clr d0 ; Initialise count of characters[102]
lea a2, WSPACE(a0) ; Index character workspace [102]
90$: kbd ABORT ; Get a character from user [102]
cmpb d1, #CTRLC ; Control-C? [103]
beq ABORT ; - yes, abort program [103]
cmpb d1, #BSPACE ; Backspace? [103]
beq 150$ ; - yes, erase last character [103]
movb d1, @a2 ; Put character into workspace [102]
lin ; Line terminator? [102]
beq 110$ ; - yes, process user entry [102]
num ; Is character numeric? [102]
beq 100$ ; - yes, continue [102]
DING ; - no, send user a bell [102]
br 90$ ; Go get another character [102]
100$: ; Character is valid. Check that there is room in our line
; buffer and put the character into the buffer if there is.
cmp d0, #9. ; Buffer full? [102]
blo 105$ ; - no, okay to continue [102]
DING ; - yes, send user a bell [102]
br 90$ ; Go get another character [102]
105$: ; Put character into our line buffer in the impure area.
movb d1, BUF(a0)[~d0] ; Put character into our buffer [102]
tty ; Echo back to user also [102]
add #1, d0 ; Increment counter [102]
clrb BUF(a0)[~d0] ; Null terminate [102]
br 90$ ; Go wait for next character [102]
110$: crlf ; New line [102]
rtn
150$: ; Process backspace. [103]
tst d0 ; Is there anything to rubout? [103]
beq 90$ ; - no, go wait for next char [103]
sub #1, d0 ; Decrement counter [103]
clrb BUF(a0)[~d0] ; Rubout character from buffer [103]
vdu CURLFT ; Move cursor left one column [103]
mov #SPACE, d1 ; Get a space character [103]
tty ; Put space on top of character [103]
vdu CURLFT ; Reposition cursor [103]
br 90$ ; And go wait for next character[103]
ABORT: DING ; Echo a bell to user [103]
typecr <^C> ; Make it look real [103]
exit
NUMBER: ; *******************************
; * RECALL <number> COMMAND *
; *******************************
;
; Process RECALL <number> command.
; Get the number of the buffer required from our special
; input buffer in the impure area.
; Requires: BUF(a0) containing user response.
; Returns : D1 containing buffer number entered.
; Exits to AMOS if no number entered or if user
; entered a number larger than the number of buffers.
lea a2, BUF(a0) ; Index character workspace [102]
gtdec ; Get line number required
tst d1 ; Did user enter anything? [102]
bne 10$ ; Non-zero so proceed [102]
exit ; User just pressed RETURN [102]
10$: clr d3 ; Pre-clear work register [102]
movb 16(a4), d3 ; Get number of recall buffers [102]
addb #1, d3 ; There's actually 1 more [102]
cmp d1, d3 ; Is number within range? [102]
blos 20$ ; - yes, proceed [102]
typecr <?No such buffer number>; [102]
exit
; Now scan down the line editor buffer chain until we find the
; buffer we are interested in.
; Returns : A3 indexing the line editor buffer required.
clr d2 ; Pre-clear counter
clr d3 ; Pre-clear work register
movb 16(a4), d3 ; Get number of recall buffers
10$: lea a2, 10(a3) ; index start of recall buffer
tstb @a2 ; is buffer in use?
beq 20$ ; - no, skip it
add #1, d2 ; Increment buffer number
cmp d1, d2 ; Is this the one?
beq 30$ ; - yes
20$: mov @a3, a3 ; Index next buffer
dbf d3, 10$ ; and get next one
30$: rtn
FORCE: ; ********************************
; * FORCE LINE EDITOR BUFFER *
; ********************************
;
; Force line editor buffer into our input buffer.
; Requires: A3 indexing the line editor buffer required.
jobidx a0 ; Index our JCB
mov JOBTRM(a0), a5 ; Index our TCB
mov T.IBS(a5), d4 ; get size of buffer
lea a2, 10(a3) ; index start of recall buffer
tstb @a2 ; is buffer in use?
beq 20$ ; - no, skip it
10$: movb (a2)+, d1 ; get a byte
beq 20$ ; null byte terminates
cmpb d1, #CR ; carriage-return?
beq 20$ ; - yes, also terminates
trmicp ; force into our input buffer
sub #1, d4 ; decrement buffer size counter
bne 10$ ; not finished with buffer yet
20$: rtn
DBUF: ; **********************************************
; * DISPLAY CONTENTS OF LINE EDITOR BUFFER *
; **********************************************
;
; Requires: A5 indexing our TCB.
; A3 indexing the recall buffer to be displayed.
; D2 containing recall buffer number.
; Returns : D2 incremented if recall buffer is in use.
; Uses : A2, D1, D4
mov T.IBS(a5), d4 ; get size of each buffer
lea a2, 10(a3) ; index start of recall buffer
tstb @a2 ; is buffer in use?
beq 20$ ; - no, skip it
add #1, d2 ; Increment recall buffer number
mov d2, d1 ; Get recall buffer number
dcvt 0, OT$TRM ; Display buffer number
typesp <. >
10$: movb (a2)+, d1 ; get a byte
beq 20$ ; null byte terminates
tty ; send it to user
sub #1, d4 ; decrement buffer size counter
bne 10$ ; not finished this buffer yet
20$: rtn
jobidx a0 ; Index our JCB
mov JOBTRM(a0), a0 ; Index our TCB
mov T.LED(a0), d7 ; Index line editor stuff
beq 90$ ; - no line editor active
mov d7, a0 ; Index recall buffers
mov 6(a0), d7 ; Look at top recall buffer
beq 90$ ; - no recall buffers allocated
mov d7, a6 ; Index the top recall buffer
clr d3 ; Pre-clear work register
movb 16(a0), d3 ; get number of recall buffers
10$: clrb 10(a6) ; clear recall buffer
mov @a6, a6 ; index next buffer
dbf d3, 10$ ; and get next one
90$: rtn
vdu CLRSCR ; Clear screen [103]
call DSPPRG ; Display program name [102]
type < - Recall AMOS line editor buffers>
tab
tab
typesp <Version>
lea a5, RECALL ; Index this program [102]
vcvt PH.VER(a5), OT$TRM ; Display version number[102]
crlf
crlf
typesp <Enter>
call DSPPRG ; Display program name [102]
typecr < with no switches to get a list of the current contents>
typecr <of each of the line editor buffers. Against each item will be a>
typecr <number. You will then be prompted to enter the number of one of the>
typecr <lines listed. If you just press RETURN you will be returned to AMOS.>
typecr <When you enter the number of one of the buffers the contents of that>
typecr <buffer will become your current command line. You can then amend>
typecr <the line or press RETURN to execute it as normal.>
crlf
typecr <Switches:->
call DSPPRG ; Display program name [102]
ttyi
ascii ./.
even
typecr <C will clear all line editor buffers.>
call DSPPRG ; Display program name [102]
ttyi
ascii ./.
even
typecr <H will display this help information.>
crlf
typecr <This program was written by Chris Davenport who may be>
typecr <contacted at 57 Lyde Road, Yeovil, Somerset, England.>
typecr <There is no warranty on this software and the author>
typecr <does not acknowledge any liability resulting from its>
typecr <use. It is freely donated to all Alpha Micro users.>
typecr <Permission is granted to use this software at no charge>
typecr <provided that this message is not changed or deleted from>
typecr <any copy of this software.>
crlf
rtn
DSPPRG: ; ************************************
; * DISPLAY CURRENT PROGRAM NAME *
; ************************************
; It is quite possible that the user has followed our recommendation
; and renamed the RECALL program to something shorter. Since we may
; not know what it is we pick up the program name from the JCB.
; Requires: Nothing.
; Returns : Nothing.
jobidx a5 ; Index our JCB [102]
lea a1, jobprg(a5) ; Index current program name [102]
push ; save some room for unpack [102]
push ; ditto [102]
mov sp, a2 ; index space for RAD50 convert [102]
unpack ; convert [102]
unpack ; ditto [102]
mov sp, a2 ; index ASCII program name [102]
ttyl @a2 ; display program name [102]
pop ; restore stack [102]
pop ; ditto [102]
rtn