Files
Digital-Research-Source-Code/CPM OPERATING SYSTEMS/CPM 86/CONCURRENT/CCPM-86 3.1 SOURCE/D5/STATLIN.A86
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

193 lines
3.9 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

title 'Status Line module'
include system.lib
include sysdat.lib
include chrcomm.equ
include serdata.equ
dseg
extrn vccb_tbl:word
extrn ocdesctbl:word
extrn f30_tbl:word
cseg
public io_statline
;public update_stl
extrn usart_on:near
;===========
io_statline:
;===========
;
; CCP/M's entry point for status line updates
;
; ENTRY: DL = physical console
;
xor bx,bx
mov bl,dl ; physical console number
;fill in status line info here !!
push es ; save the UDA
push dx ; save the Pcon
mov ax,ds ; set up for subsequent string
mov es,ax ; moves
xor bx, bx ; get the Xmit Q control stucture
mov bl, dl
shl bx, 1
mov bx, ocdesctbl[bx] ; bx -> Xmit Q control Structure
mov bl, CUR_VCON[bx] ; al = current Vcon for this Pcon
xor bh,bh
shl bx,1
; and al, 0fh
mov ax,f30_tbl[bx]
test ax,0010H ; no update if in gen. graphic mode
jz update
;
pop dx
pop es
ret
; Going to update status line
update: ;*** fill in console owner name
mov si, vccb_tbl[bx] ; si -> VCCB for this Pcon's
; current Vcon
mov si, [si] ; get pd addr from ccb
add si, P_NAME ; move console owners
mov di, offset st_name ; name into status line
mov cx,4
cld
rep movsw
;*** update Vcon field
shr bx,1 ; get back Vcon number
add bl,'0'
mov vcon_numb,bl
mov al, dl ;*** fill in the physical console
; and al, 0fh
add al, '0'
mov pcon_numb, al
mov di,offset st_open ;*** fill in open file drive letters
mov cx, 6 ; 6 drives
mov al,' ' ; clear open file string
rep stosb
mov dx,open_vector
mov di,offset st_open
update0:
shr dx,1! jnc update1
mov al,cl
add al,'A'
stosb ;store drive letter
update1:
inc cx
or dx,dx
jnz update0 ;any more drives?
;
; Send the status line to the console
;
pop dx ; get the Pcon back
pushf
cli
; check for room in the con-out circular buffer
; if ( omsgs - omsgcnt > st_len ) display the status line
; also check for not being in the middle of an escape sequence
; get the physical Q control structure
xor dh, dh ; clear the high byte
mov bx, dx
shl bx, 1
mov bx, ocdesctbl[bx] ; bx -> Xmit Queue control
mov ax, ONMSGS
sub ax, OMSGCNT[bx]
cmp ax, ST_LEN ! jb stl_ret
cmp OESC_CNT[bx], 0 ! jne stl_ret
stl_now:
mov cx, ST_LEN - 1 ; length of the status line
mov si, offset st_line ; addr of the status line
mov dx, OMSGCNT[bx] ; the chars in Q
mov bp, OMSGOUT[bx] ; current output pointer
st_line_lp:
mov di, bp ; current char ptr => index reg
add di, dx ; add in the number of chars waiting
and di, (ONMSGS - 1) ; circular buffer...
lodsb ; get a char from the st line
mov OBUFFER[di+bx], al ; stuff the character
inc dx ; bump char waiting count
loop st_line_lp ; do it until the entire status line
; is moved into the con out buffer
mov OMSGCNT[bx], dx ; put the updated number of chars
; waiting to go out into the Q
; control structure.
call usart_on ; start the engine ( if necessary )
stl_ret:
popf
pop es ; es = UDA
exit:
ret
dseg
st_line db esc,'j' ;save cursor position
db 0,0,0,0 ; wait for the Z 19
db esc,'x1' ;enable status line
db esc,'Y' ;direct cursor address
db 31+25,31+1 ; line 25, column 1
db 'Pcon='
pcon_numb db '0' ;ascii Pcon number
db ' ' ; visual delimiter
db 'Vcon='
vcon_numb db '0' ; ascii Vcon number
db ' ' ; visual delimiter
st_name db ' ' ;console owner process name
db ' ' ; visual delimiter
st_open db 'xxxxxx' ;drives with open files
; db ;additional bytes for status line
db esc,'k' ;restore cursor position
db 0,0,0,0
db 0ffh
st_len equ (offset $-1) - (offset st_line)
; table to indicate if special status line is being displayed currently
end