mirror of
https://github.com/GnoConsortium/gno.git
synced 2024-12-22 14:30:29 +00:00
416 lines
7.8 KiB
NASM
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
|