gno/kern/drivers/console.asm
1998-02-02 08:20:59 +00:00

506 lines
7.8 KiB
NASM

* $Id: console.asm,v 1.1 1998/02/02 08:17:54 taubert Exp $
************************************************************
*
* CONSOLE device driver
*
************************************************************
case on
mcopy ../drivers/port.mac
copy ../gno/inc/tty.inc
copy ../drivers/console.equates
copy ../drivers/kern.equates
**************************************************************************
consoleSem gequ $3C ; output code semaphore
ConsoleHeader START
contty ENTRY
ds t_open
* Line Discipline entry points
dc i4'ConInit'
dc i4'ConDeInit'
dc i4'ConIOCTL'
dc i4'0' ; ttread and ttwrite must be
dc i4'0' ; set up by InstallDriver
dc i4'CON_mutex'
dc i4'CON_demutex'
dc i4'CON_out_enq'
dc i4'CON_in_enq'
dc i4'CON_out_deq'
dc i4'CON_in_deq'
dc i4'CON_size_inq'
dc i4'CON_size_outq'
ds t_signalIO-editInd
dc i4'CON_signalIO'
dc i2'$FFFF' ; noone selecting
dc i4'CON_select'
dc i4'0' ; t_selwakeup set during install
END
CON_mutex START KERN2
CON_demutex ENTRY
CON_in_enq ENTRY
CON_out_deq ENTRY
rtl
END
CON_in_deq START KERN2
; using InOutData
; phd
; lda >InOutDP
; tcd
jsl KEYIN
; pld
rtl
END
CON_select START KERN2
res equ 0
subroutine (2:ttyn,2:which,2:pid),2
lda #1
sta res
lda which ; which I/O to check?
cmp #SEL_READ
bne trywrite
jsl CON_size_inq ; # bytes in in q
cmp #0
bne done
willwait anop
* record that the process wants to do I/O
lda >contty+t_select_proc ; see if someone's here already
cmp #$FFFF ; nope
beq nocollision
cmp pid ; is it us?
beq nocollision
lda >contty+privFlags
ora #TS_RCOLL
sta >contty+privFlags
bra none
nocollision anop
lda pid ; set select_proc field to
sta >contty+t_select_proc ; current process ID
bra none
trywrite cmp #SEL_WRITE
bne doexcept
bra done ; we can always write to console
doexcept anop ; there are no exceptions on console
none lda #0 ; no data, return 0
sta res
done anop
return 2:res
END
CON_size_inq START KERN2
using ADBData
php
sei
short m
lda >head
sec
sbc >tail
long m
and #$00FF
plp
rtl
END
CON_size_outq START KERN2
lda #0
rtl
END
CON_out_enq START KERN2
; using InOutData
; phd
; lda >InOutDP
; tcd
; lda 6,s
lda 4,s
jsl COUT
; pld
lda 2,s
sta 4,s
lda 1,s
sta 3,s
pla
rtl
END
* This function does nothing in the console driver
CON_signalIO START KERN2
lda 2,s
sta 4,s
lda 1,s
sta 3,s
pla
rtl
END
ConInit START
dTermioPtr equ 0
result equ 4
subroutine (2:devNum),6
ld4 contty,dTermioPtr
stz result
* Initialize default values for terminal settings
ldy #sg_flags
lda #CRMOD+ECHO
sta [dTermioPtr],y
short m
lda #0
sta [dTermioPtr] ; ispeed
ldy #sg_ospeed
sta [dTermioPtr],y ; ospeed
ldy #t_intrc
lda #'C'-64
sta [dTermioPtr],y ; t_intrc
ldy #t_suspc
lda #'Z'-64
sta [dTermioPtr],y
ldy #t_quitc
lda #'\'-64
sta [dTermioPtr],y
ldy #t_startc
lda #'Q'-64
sta [dTermioPtr],y
ldy #t_stopc
lda #'S'-64
sta [dTermioPtr],y
ldy #t_eofc
lda #'D'-64
sta [dTermioPtr],y
ldy #t_brkc
lda #-1
sta [dTermioPtr],y
ldy #t_dsuspc
lda #'Y'-64
sta [dTermioPtr],y
ldy #t_rprntc
lda #'R'-64
sta [dTermioPtr],y
ldy #sg_erase
lda #$7F
sta [dTermioPtr],y
long m
ldy #local
lda #LCRTERA+LCTLECH
sta [dTermioPtr],y
ldy #ws_row
lda #24
sta [dTermioPtr],y
ldy #ws_col
lda #80
sta [dTermioPtr],y
ldy #ws_xpixel
lda #0
sta [dTermioPtr],y
ldy #ws_ypixel
sta [dTermioPtr],y
return 2:result
END
ConDeInit START
subroutine (2:devNum),0
return
END
* Character translation & such is handled here, to keep it out
* of TextTool's silly assumptions. Fortunately, pipes donna have this
* prollem.
ConIOCTL START KERN2
using ADBData
using InOutData
retval equ 0
subroutine (4:tioc,4:dataPtr,2:devNum),2
lda tioc
and #$FF00
xba
cmp #'f'
beq chkfile
cmp #'t'
beq tioctl
err lda #-1
sta retval
jmp goaway
chkfile lda tioc
and #$7F
cmp #127
bne err
php
sei
short m
lda >head
sec
sbc >tail
long m
and #$00FF
* bpl okey
* eor #$FFFF
* inc a
*okey anop
sta [dataPtr]
plp
stz retval
jmp goaway
tioctl anop
lda tioc
and #$7F
cmp #25
bcc okay2
eor #$7F
cmp #26
bcc okay1
jmp invalid
okay1 anop
asl a
asl a
inc a
inc a
tax
jmp (tNTable,x)
okay2 anop
asl a
asl a
inc a
inc a
tax
jmp (tPTable,x)
goaway return 2:retval
tPTable anop
dc i2'0',a2'TIOCGETD'
dc i2'1',a2'TIOCSETD'
dc i2'-1',a2'invalid'
dc i2'-1',a2'invalid'
dc i2'-1',a2'invalid'
dc i2'-1',a2'invalid'
dc i2'-1',a2'invalid'
dc i2'-1',a2'invalid'
dc i2'8',a2'TIOCGETP'
dc i2'9',a2'TIOCSETP'
dc i2'10',a2'TIOCSETN'
dc i2'-1',a2'invalid'
dc i2'-1',a2'invalid'
dc i2'-1',a2'invalid'
dc i2'-1',a2'invalid'
dc i2'-1',a2'invalid'
dc i2'16',a2'TIOCFLUSH'
dc i2'-1',a2'invalid'
dc i2'-1',a2'invalid'
dc i2'19',a2'TIOCSETK'
dc i2'20',a2'TIOCGETK'
dc i2'-1',a2'invalid'
dc i2'-1',a2'invalid'
dc i2'23',a2'TIOCSVECT'
dc i2'24',a2'TIOCGVECT'
tNTable anop
dc i2'127',a2'invalid'
dc i2'126',a2'invalid'
dc i2'125',a2'invalid'
dc i2'124',a2'invalid'
dc i2'123',a2'invalid'
dc i2'122',a2'invalid'
dc i2'121',a2'invalid'
dc i2'120',a2'invalid'
dc i2'119',a2'invalid'
dc i2'118',a2'invalid'
dc i2'117',a2'invalid'
dc i2'116',a2'invalid'
dc i2'115',a2'TIOCOUTQ'
dc i2'114',a2'TIOCSTI'
dc i2'113',a2'invalid'
dc i2'-1',a2'invalid'
dc i2'111',a2'TIOCSTOP'
dc i2'110',a2'TIOCSTART'
dc i2'109',a2'invalid'
dc i2'108',a2'invalid'
dc i2'107',a2'invalid'
dc i2'106',a2'invalid'
dc i2'-1',a2'invalid'
dc i2'104',a2'invalid'
dc i2'103',a2'invalid'
invalid lda #-1
sta retval
jmp goaway
*****************************************************
dc i2'0',a2'TIOCGETD'
dc i2'1',a2'TIOCSETD'
dc i2'-1',a2'invalid'
dc i2'-1',a2'invalid'
dc i2'-1',a2'invalid'
dc i2'-1',a2'invalid'
dc i2'-1',a2'invalid'
dc i2'-1',a2'invalid'
dc i2'8',a2'TIOCGETP'
dc i2'9',a2'TIOCSETP'
dc i2'10',a2'TIOCSETN'
TIOCGETD anop
TIOCSETD anop
TIOCSETN anop
TIOCSETP anop
TIOCGETP stz retval
jmp goaway
TIOCGVECT anop
php
sei
lda >COUT+1
sta [dataPtr]
ldy #2
lda >COUT+3
and #$00FF
sta [dataPtr],y
ldy #4
lda >KEYIN+1
sta [dataPtr],y
ldy #6
lda >KEYIN+3
and #$00FF
sta [dataPtr],y
plp
stz retval
jmp goaway
TIOCSVECT anop
php
sei
lda [dataPtr]
sta >COUT+1
ldy #1
lda [dataPtr],y
sta >COUT+2
ldy #4
lda [dataPtr],y
sta >KEYIN+1
iny
lda [dataPtr],y
sta >KEYIN+2
plp
stz retval
jmp goaway
TIOCOUTQ lda #0
sta [dataPtr]
stz retval
jmp goaway
TIOCSTOP lda >OutStopped
bne isStopped
lda #1
sta >OutStopped
isStopped stz retval
jmp goaway
TIOCSTART lda >OutStopped
beq isStopped
lda #0
sta >OutStopped
bra isStopped
TIOCFLUSH php
sei
short m
lda >tail
sta >head
long m
plp
stz retval
jmp goaway
* simulate terminal input (this code is borrowed from INOUT.ASM/OurADB
TIOCSTI anop
php
sei
phd
lda >InOutDP
tcd
short m
lda >head
tax
lda [dataPtr]
sta >keybuf,x
ldy #1
lda [dataPtr],y
sta >modbuf,x
inx
txa
sta >head
; this chunk unblocks any process that was waiting on keyboard input
long ai
lda >blockCP
cmp #$FFFF
beq check4select
ldy #2
lda [IODP_procPtr],y
cmp #pBlocked ; is it still blocked?
bne done ; nope, leave it alone
lda #pReady
sta [IODP_procPtr],y ; restart the process
lda #$FFFF
sta >blockCP
; check for select here.
check4select lda >contty+t_select_proc
cmp #$FFFF
beq done
* someone is selecting on us, so call selwakeup with the process ID
* and our collision flag
pha
lda >contty+privFlags
and #TS_RCOLL
pha
jsl contty+t_selwakeup
lda >contty+privFlags
and #TS_RCOLL.EOR.$FFFF
sta >contty+privFlags
lda #$FFFF
sta >contty+t_select_proc
done anop
pld
plp
stz retval
jmp goaway
TIOCSETK anop
lda [dataPtr]
sta >keyMaps
stz retval
jmp goaway
TIOCGETK anop
lda >keyMaps
sta [dataPtr]
stz retval
jmp goaway
END