gno/bin/gsh/prompt.asm

416 lines
7.8 KiB
NASM

*************************************************************************
*
* The GNO Shell Project
*
* Developed by:
* Jawaid Bazyar
* Tim Meekins
*
**************************************************************************
*
* PROMPT.ASM
* By Tim Meekins
*
* This displays the command-line prompt
*
**************************************************************************
keep o/prompt
mcopy m/prompt.mac
WritePrompt START
using HistoryData
prompt equ 0
hour equ prompt+4
minute equ hour+2
offset equ minute+2
pfx equ offset+2
space equ pfx+4
year equ hour
monday equ minute
precmd equ prompt
subroutine (0:dummy),space
ph4 #precmdstr
jsl findalias
sta precmd
stx precmd+2
ora precmd+2
beq getvar
pei (precmd+2)
pei (precmd)
ph2 #0
jsl execute
getvar Read_Variable promptparm
php
sei ;interrupt free environment
lda promptbuf
and #$FF
bne parseprompt
ldx #^dfltPrompt
lda #dfltPrompt
jsr puts
bra donemark2
precmdstr dc c'precmd',h'00'
parseprompt anop
ph4 #promptbuf
jsr p2cstr
phx ;for disposal
pha
stx prompt+2
sta prompt
promptloop lda [prompt]
inc prompt
and #$FF
beq done
cmp #'%'
beq special
cmp #'!'
jeq phist
cmp #'\'
jeq quoteit
_putchar jsr putchar
bra promptloop
done jsr standend
jsr cursoron
jsl nullfree
donemark2 plp
jsr flush
return
special lda [prompt]
inc prompt
and #$FF
beq done
cmp #'%'
beq _putchar
cmp #'h'
beq phist
cmp #'!'
beq phist
cmp #'t'
beq ptime
cmp #'@'
beq ptime
cmp #'S'
jeq pstandout
cmp #'s'
jeq pstandend
cmp #'U'
jeq punderline
cmp #'u'
jeq punderend
cmp #'d'
jeq pcwd
cmp #'/'
jeq pcwd
cmp #'c'
jeq pcwdend
cmp #'C'
jeq pcwdend
cmp #'.'
jeq pcwdend
cmp #'n'
jeq puser
cmp #'W'
jeq pdate1
cmp #'D'
jeq pdate2
cmp #'~'
jeq ptilde
jmp promptloop
;
; Put history number
;
phist lda lasthist
inc a
jsr WriteNum
jmp promptloop
;
; Print current time
;
ptime ReadTimeHex (minute,hour,@a,@a)
lda hour
and #$FF
if2 @a,cc,#13,ptime2
sub2 @a,#12,@a
ptime2 if2 @a,ne,#0,ptime2b
lda #12
ptime2b jsr WriteNum
lda #':'
jsr putchar
lda minute
xba
and #$FF
pha
cmp #10
bcs ptime2a
lda #'0'
jsr putchar
ptime2a pla
jsr WriteNum
lda hour
and #$FF
if2 @a,cs,#12,ptime3
ptime5 lda #'a'
bra ptime4
ptime3 lda #'p'
ptime4 jsr putchar
lda #'m'
jmp _putchar
;
; Set Stand Out
;
pstandout jsr standout
jmp promptloop
;
; UnSet Stand Out
;
pstandend jsr standend
jmp promptloop
;
; Set Underline
;
punderline jsr underline
jmp promptloop
;
; UnSet Underline
;
punderend jsr underend
jmp promptloop
;
; Current working directory
;
pcwd jsl alloc1024
sta pfx
stx pfx+2
sta GPpfx
stx GPpfx+2
lda #1024
sta [pfx]
GetPrefix GPParm
ldy #2
lda [pfx],y
clc
adc #3
sta offset
ldy #4
pcwd1 lda [pfx],y
and #$FF
jsr toslash
phy
jsr putchar
ply
iny
cpy offset
bcc pcwd1
ldx pfx+2
lda pfx
jsl free1024
jmp promptloop
;
; Current tail of working directory
;
pcwdend anop
jsl alloc1024
sta pfx
stx pfx+2
sta GPpfx
stx GPpfx+2
lda #1024
sta [pfx]
GetPrefix GPParm
ldy #2
lda [pfx],y
clc
adc #3
sta offset
tay
pcwdend1 dey
bmi pcwdend2
lda [pfx],y
and #$FF
cmp #':'
bne pcwdend1
pcwdend2 iny
cpy offset
beq pcwdend3
lda [pfx],y
and #$FF
cmp #':'
beq pcwdend3
phy
jsr putchar
ply
bra pcwdend2
pcwdend3 ldx pfx+2
lda pfx
jsl free1024
jmp promptloop
;
; Current working directory substituting '~' if necessary
;
ptilde anop
jsl alloc1024
sta pfx
stx pfx+2
sta GPpfx
stx GPpfx+2
lda #1024
sta [pfx]
GetPrefix GPParm
ldy #2
lda [pfx],y
clc
adc #4
tay
lda #0
sta [pfx],y
pei (pfx+2)
lda pfx
clc
adc #4
pha
jsl path2tilde
phx
pha
jsr puts
jsl ~DISPOSE
ldx pfx+2
lda pfx
jsl free1024
jmp promptloop
;
; Write user name
;
puser Read_Variable userparm
ldx #^buf2
lda #buf2
jsr putp
jmp promptloop
;
; Write date as mm/dd/yy
;
pdate1 ReadTimeHex (@a,year,monday,@a)
lda monday
and #$FF00
xba
inc a
jsr WriteNum
lda #'/'
jsr putchar
lda monday
and #$FF
inc a
jsr WriteNum
lda #'/'
jsr putchar
lda year
and #$FF00
xba
jsr WriteNum
jmp promptloop
;
; Write date as yy-mm-dd
;
pdate2 ReadTimeHex (@a,year,monday,@a)
lda year
and #$FF00
xba
jsr WriteNum
lda #'-'
jsr putchar
lda monday
and #$FF00
xba
inc a
jsr WriteNum
lda #'-'
jsr putchar
lda monday
and #$FF
inc a
jsr WriteNum
jmp promptloop
;
; check for \ quote
;
quoteit lda [prompt]
inc prompt
and #$FF
jeq done
cmp #'n'
beq newline
cmp #'r'
beq newline
cmp #'t'
beq tab
cmp #'b'
beq backspace
jmp _putchar
newline lda #13
jmp _putchar
tab lda #9
jmp _putchar
backspace lda #8
jmp _putchar
;
; Write a number between 0 and 9,999
;
WriteNum cmp #10
bcs write1
adc #'0'
jmp putchar
write1 cmp #100
bcs write2
Int2Dec (@a,#num+2,#2,#0)
ldx #^num+2
lda #num+2
jmp puts
write2 cmp #1000
bcs write3
Int2Dec (@a,#num+1,#3,#0)
ldx #^num+1
lda #num+1
jmp puts
write3 Int2Dec (@a,#num,#4,#0)
ldx #^num
lda #num
jmp puts
GPParm dc i2'2'
dc i2'0'
GPpfx dc a4'0'
promptparm dc a4'promptname'
dc a4'promptbuf'
promptname str 'prompt'
dfltPrompt dc c'% ',h'00'
num dc c'0000',h'00'
promptbuf ds 256
userparm dc a4'user'
dc a4'buf2'
user str 'user'
buf2 ds 256
END