Newer
Older
uBix-Retro / dump / oa-2.0.9 / sysapps / mon / mon.a65
/****************************************************************************
   
    OS/A65 Version 2.0.0
    Multitasking Operating System for 6502 Computers

    Copyright (C) 1989-1998 Andre Fachat 

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

****************************************************************************/


/**********************************************************************/
/*                            Shell-Prg                               */
/*                                                                    */
/* wird aufgerufen mit :                                              */
/*   SHORTMON       = Dis-/Assembler aus                              */
/*   NOSYSFKT       = im Monitor nix mit Files/System-Aufrufen        */
/*   NOMON          = kein Monitor                                    */
/*   NOSH           = keine Shell                                     */
/*   NOMMU          = sysmem/syszp werden 'durchgereicht'             */
/*   ROM            = wird fuer Startrom assembliert                  */
/*   NOPRG          = wird zum laden und testen ohne PRG-Header ass.  */
/*   SHORTLINE      = if set, 8 bytes per line in hex dump at start   */
/*                                                                    */
/*nicht erlaubt sind :                                                */
/*   NOMON && NOSH                                                    */
/*   NOSYSFKT && !NOSH                                                */
/**********************************************************************/

/*
 * This is a monitor only - we should use NOSH anyway!
 */
/* #define NOSH */
#undef MON_USE_STDLIB

/*
 * We have a new kernel...
 */

#define	GETBLK	notimp
#define	GETMEM	notimp
#define	GETENV	notimp
#define	WRITE	notimp
#define	FREMEM	notimp
#define	FREENV	notimp
#define	WTERM	notimp

/*************************************************************************/

#ifndef ROM

/*
#define SHORTMON
/*#define NOMON*/
/*#define NOSH*/
/*#define NOSYSFKT*/
#define NOPRG
/*#define STDTST*/
/*#define SHOW*/
*/
#define	SHORTLINE
#define NOSH 

#endif	/* ROM */

#ifdef MON_USE_STDLIB

#define	  OUT	    Fputc
#define	  IN	    Fgetc
#define	  HEXOUT    Hexout
#define   SEROUT    Putc
#define   SERIN     Getc
#define   SERBRK    Serbrk
#define   CRLFOUT   Crlfout
#define   TSERO     Txtout
#define	  DEZOUT    Dezbout

#else

#define	  Usedir    usedir
#define	  Chdir	    mchdir
#define	  Getname   getname
#define	  Set2name  set2name

#endif	/* MON_USE_STDLIB */

          .(
#ifdef ROM

#ifndef MON_SHDEV
#define	MON_SHDEV		0
#endif
#ifndef MON_MONDEV
#define	MON_MONDEV		7
#endif
#ifndef MON_SHEXE
#define	MON_SHEXE 		$80
#endif
#ifndef MON_MONEXE
#define	MON_MONEXE		$80
#endif

/* 
 * These have both the same execution start address - works only
 * with MMU
 */
start     .word start2			; pointer to end of file in ROM
          .byt  MON_SHEXE		; file type = prg + auto-execute bit
          .word PRG1			; execution start
          .byt  16			; RAM size in 256-byte blocks
          .byt  >$ff-ROMSTART; $ff-start ; shared mem size in 256-byte blocks
          .byt  0              	 	; priority
          .byt  MON_SHDEV, MON_SHDEV	; stdin, stdout/stderr device number
          .asc  "shell",0,"b",0,"c:auto.bat",0,0 ; command line

start2    .word PRGEND			; pointer to end of file in ROM
          .byt  MON_MONEXE		; file type = prg + auto-execute bit
          .word PRG2			; execution start
          .byt  16			; RAM size in 256-byte blocks
          .byt  >$ff-ROMSTART; $ff-start2 ; shared mem size in 256-byte blocks
          .byt  0               	; priority
          .byt  MON_MONDEV, MON_MONDEV	; stdin, stdout/stderr device number
          .asc  "mon",0,0		; command line

#else /* ROM ------------------------------------------------------------*/

#include  "kdefs.i65"
#include  "kernel.i65"
#include  "fdefs.i65"

#define	RETRTS		/* return from program with RTS */

+main	jmp as_stdproc

#endif /* ROM */

/**********************************************************************/

#ifndef VSA
#define   MAXLEN    82
#define   VSA       1
#define   VSB       3
#define   INDEPTH   8
#endif

	.data
LZEI      .byt 0
IOBUF     .dsb MAXLEN
	.text


          .(
#ifndef NOSH
MESSAGE   ="#"
	.data
bef       .byt 0
	.text
#endif

&notimp	lda #E_NOTIMP
	sec
	rts

#ifdef ROM
	.data
offs	.byt 0
s1	.byt 0
	.text

&PRG1	ldy #0
	.byt $2c
&PRG2	ldy #start2-start
	lda start+2,y
	and #3
	cmp #3
	bne as_stdproc
;.byt 2	
	sty offs
	jsr GETSTR
	bcs nostr1
	stx s1
	ldx offs
        lda start+8,x
	pha
	tax
	ldy s1
        lda #DC_PS
        jsr DEVCMD
	pla
	tax
        lda #DC_RX_ON
        jsr DEVCMD
        sec
        ldx #STDIN
        lda s1
        jsr DUP

        jsr GETSTR
        bcs nostr1
        stx s1
        ldx offs
        lda start+9,x
        tax
	pha
        ldy s1
        lda #DC_GS
        jsr DEVCMD
	pla
	tax
        lda #DC_TX_ON
        jsr DEVCMD
        sec 
        ldx #STDOUT
        lda s1
        jsr DUP
	ldx s1
	lda #SC_REG_WR
	jsr STRCMD
	sec
	ldx #STDERR
	lda s1
	jsr DUP
	jmp as_initproc
nostr1	jmp xterm	
#endif
&as_stdproc	
/*
	; see if we can read the command line 
	.(
	lda #<PCBUF+FORK_NAME
	ldy #>PCBUF+FORK_NAME
	jsr TSERO
	jsr CRLFOUT
	ldy #FORK_NAME+1
l0	lda PCBUF-1,y
	beq ok
	iny
	bne l0
ok	tya
	ldy #>PCBUF
	jsr TSERO
	jsr CRLFOUT
	.)
*/
	; we now have to release PCBUF, which we inherited from FORK
	ldx #SEM_SENDBUF
	jsr VSEM

as_initproc

	jsr initsig

	lda #TC_ECHO
	jsr SEROUT		; switch terminal to full screen mode

#ifndef NOSYSFKT
          jsr inipfad
#endif
#ifndef NOSH
          jsr inistdin
#endif
#ifndef NOSYSFKT
          jsr inistdout
#endif
#ifndef NOSH
          lda #<initxt
          ldy #>initxt
          jsr TSERO

          lda #<metxt
          ldy #>metxt
          jsr TSERO
#ifndef NOMMU
          jsr copycmd
          bcs p2
          bcc p1
#else
	  jmp p2
#endif

ploop     jsr checksig
	  lda #<metxt
          ldy #>metxt
          jsr TSERO
p2        jsr MLINEIN:
;.byt 2
	  bcs sterm
p1        jsr CHRGOT
	  jmp px1
px2       jsr CHRGET
px1       beq ploop
          cmp #MESSAGE
          beq px2
          jsr testbef
          bcs pll
          jsr exebef
          jmp pl2
pll       
;.byt 2
	  jsr loadbef
;.byt 2
pl2       php
          jsr oldoutstr
          plp
          bcs ple
          jsr CRLFOUT
          jmp ploop
ple       lda #<errtxt
          ldy #>errtxt
          jsr TSERO
          jmp ploop

LOGOFF    pla
          pla
sterm      ;jsr clrpfad
          jsr clrbatch
#else
          jsr MONITOR
#endif
xterm
#ifdef NOPRG
          RTS
#else
#ifdef RETRTS
          rts 	
#else
	  jmp TERM
#endif
#endif


#ifndef NOSH
exebef    txa
          asl
          tay
          lda befadr+1,y
          pha
          lda befadr,y
          pha
          rts

testbef   ldx #0
          stx bef
tb1       ldy LZEI
tb0       lda beftab,x
          beq tbok
          eor IOBUF,y
          beq tb2a
          cmp #$20
          bne tb2
tb2a      inx
          iny
          bne tb0
tb2       inc bef
          lda bef
          cmp #anzbef
          bcs tbx
tb3       lda beftab,x
          inx
          cmp #0
          bne tb3
          beq tb1
tbok      lda IOBUF,y
          beq tbok1
          cmp #" "
          beq tbok1
          cmp #"/"
          bne tb2 
tbok1     sty LZEI
          clc
          ldx bef
tbx       rts

#ifdef NOMON
anzbef    =23
#else
anzbef    =24
#endif

#ifndef ROM
	 .data
#endif

beftab    .asc "DIR^@TYPE^@DEL^@FORMAT^@CHKDSK^@RENAME^@"
          .asc "B^@BATCH^@"
#ifndef NOMON
&montxt   .asc "MONITOR^@"
#endif
          .asc "LOGOFF^@"
          .asc "COPYCON^@DUP^@CD^@DEVCMD^@COPY^@"
          .asc "GETSTR^@FRESTR^@SETMEM^@"
          .asc "INFO^@KILL^@MKDIR^@RMDIR^@CHDIR^@"

befadr    .word DIRECTORY-1,TYPE-1,DELETE-1,FORMAT-1,CHKDSK-1
          .word RENAME-1,BATCH-1,BATCH-1
#ifndef NOMON
          .word MONITOR-1
#endif
          .word LOGOFF-1,COPYCON-1,PDUP-1,CD-1
          .word PDEVCMD-1,COPY-1,PGETSTR-1,PFRESTR-1
          .word SETMEM-1,PINFO-1,PKILL-1
          .word MKDIR-1,RMDIR-1,CD-1

initxt    .asc "^M^JSHELL V"
          .byt VSA+"0",".",VSB+"0"
          .asc "^M^J(C) 1990-97 BY A.FACHAT^M^J^@"
errtxt    .asc " ?^M^J^@"
metxt     .asc "^M^J"
          .byt MESSAGE,0
#endif
	.text

          .)
#ifndef NOMON
#include  "sysapps/mon/shmon.a65"
#endif
#ifndef NOSYSFKT 
#include  "sysapps/mon/shdir.a65"
#endif

#ifndef NOSH
PINFO     .(
	.data
cnt       .byt 0
zei       .byt 0
	.text

          ldy #0
i0        lda it,y
          beq info
          jsr SEROUT
          iny
          bne i0
          
info      .(
#ifdef NOMMU
	  clc
	  ldx #SEM_SENDBUF
	  jsr PSEM
#endif
	  jsr GETINFO
          ldx #0
          stx cnt
	  stx zei
infoloop  
          ldx zei
	  lda PCBUF+TN_PID,x
          jsr HEXOUT
          jsr SSPOUT
          ldx zei
          lda PCBUF+TN_NTHREADS,x
          bne name
          ldx #TNAMLEN
i1        jsr SSPOUT
          dex
          bne i1
          beq i2
name      ldy #0
          ldx zei
i4        lda PCBUF+TN_NAME,x
          beq i3
          jsr SEROUT
          iny
          inx
          cpy #TNAMLEN
          bcc i4
i3        cpy #TNAMLEN
          bcs i2
          jsr SSPOUT
          iny
          bne i3
i2        jsr SSPOUT

          ldx zei
          lda PCBUF+TN_NTHREADS,x
	  jsr HEXOUT
	  jsr SSPOUT
          lda PCBUF+TN_ENV,x
	  jsr HEXOUT
	  jsr SSPOUT
	  lda PCBUF+TN_PARENT,x
	  jsr HEXOUT
;          asl
;          asl
;          tax
;          ldy #4
;i5        lda st,x
;          jsr SEROUT
;          inx
;          dey
;          bne i5
          jsr SSPOUT
          ldx zei
          lda PCBUF+TN_MEM,x
          jsr HEXOUT
          jsr SSPOUT
	  lda PCBUF+TN_SIGMASK,x
          jsr HEXOUT
          jsr SSPOUT
	  lda PCBUF+TN_SIGNAL+1,x
	  jsr HEXOUT
	  lda PCBUF+TN_SIGNAL,x
	  jsr HEXOUT
	  jsr SSPOUT
          lda PCBUF+TN_STDIN,x
          jsr HEXOUT
          jsr SSPOUT
          lda PCBUF+TN_STDOUT,x
          jsr HEXOUT
          jsr SSPOUT
          lda PCBUF+TN_STDERR,x
          jsr HEXOUT
          jsr SSPOUT
          jsr CRLFOUT
	  lda zei
	  clc
	  adc #TN_SLEN
	  sta zei
          inc cnt
          lda cnt
          cmp #ANZ_ENV
          bcs ie
          jmp infoloop
ie        
#ifdef NOMMU
	  ldx #SEM_SENDBUF
	  jsr VSEM
#endif
	  clc
          rts
	  .)
          
; st        .asc "FRE ENV IBRKBRK RDY IRQ WFRXWFTXWSEMWTRM"
it        .asc "^M^JPID Name"
	  .dsb TNAMLEN-5, 32
	  .asc " Th En Pa Me Sm SigA In OutErr^M^J",0

&PKILL    jsr GETADR
          bcs pke
          sta cnt
          jsr GETADR
          ldx cnt
          jsr KILL
pke       rts
          .)
#endif            
          .(
	.data
Z0        .byt 0
Z1        .byt 0
	.text

#ifndef NOSH
&SETMEM   jsr GETADR
          bcs MOP1
#endif
#ifndef NOMON
&Setmem   
#endif
          cmp #0
          beq MOP1
#if 0
          cmp #(PRG>>12)&$f ; bis maximal Programmstart umsetzen erlauben
          bcs MOP1
#endif
          sta Z0
          lda #7 
          sta Z1
mop5      clc
          ldx #OWNTASK
          ldy Z1
          jsr SETBLK
          ldx Z1
          cpx Z0
          bcc mopram
          tax
          jsr FREMEM
          lda #$0f
          bne mopset
mopram    cmp #$0f
          bne mopnext
          jsr GETMEM
          bcs mopnext
          txa
mopset    sec
          ldx #OWNTASK
          ldy Z1
          jsr SETBLK
mopnext   dec Z1
          bpl mop5
          clc
MOP1      RTS
          .)
          
TOUPPER   .(
          cmp #"a"
          bcc tok
          cmp #"z"+1
          bcs tok
          sbc #$1f
tok       rts
          .)

LINEFEED  LDA #10:.BYT $2C
#ifndef NOSYSFKT
PNTOUT    lda #".":.byt $2c
#endif
#ifndef NOMON
CROUT     LDA #13:.BYT $2C
#endif
SSPOUT    LDA #" ":JMP SEROUT

          .(
	.data
div       .byt 0
Z0        .word 0
	.text

&CHRGET   inc LZEI
&CHRGOT   sty div
          ldy LZEI
          LDA IOBUF,Y
          LDY div
          CMP #" "
          BEQ CHRGET
          CMP #0
          RTS

&GETADR   LDY LZEI:LDA #0:STA Z0:STA Z0+1
GA1       LDA IOBUF,Y:bne get
          jmp GAE
get       INY
          CMP #" ":BEQ GA1

          CMP #"%"
          BEQ GETBIN
          cmp #"."
          beq GETDEZ1
          cmp #"$"
          beq GETHEX
          cmp #"&"
          beq GETOKT
          DEY
          JMP GETHEX

GETDEZ1   jmp GETDEZ

GETHEX    lda IOBUF,y
          jsr tsthex
          bcs gae
GA2       INY
          ASL Z0:ROL Z0+1:ASL Z0:ROL Z0+1
          ASL Z0:ROL Z0+1:ASL Z0:ROL Z0+1
          ORA Z0:STA Z0
          LDA IOBUF,Y
          jsr tsthex
          bcc GA2
          jmp GAE1

gae       jmp GAE

gb1       SEC:SBC #"0"
          CMP #2
          BCS GAE1
          iny
          lsr
          rol Z0:rol Z0+1
GETBIN    lda IOBUF,Y
          beq GAE1
          bne gb1

go1       sec:sbc #"0"
          cmp #8
          bcs GAE1
          iny
          asl Z0:rol Z0+1
          asl Z0:rol Z0+1
          asl Z0:rol Z0+1
          ora Z0:sta Z0
GETOKT    lda IOBUF,y
          beq GAE1
          bne go1
          
gd1       sec:sbc #"0"
          cmp #10
          bcs GAE1
          iny
          pha
          asl Z0:rol Z0+1
          lda Z0:ldx Z0+1
          asl Z0:rol Z0+1
          asl Z0:rol Z0+1
          clc:adc Z0:sta Z0
          txa:adc Z0+1:sta Z0+1
          pla
          clc
          adc Z0
          sta Z0
          bcc GETDEZ
          inc Z0+1
GETDEZ    lda IOBUF,y
          beq GAE1
          bne gd1

GAE1      LDA Z0:LDX Z0+1
          CLC:sty LZEI
          rts

GAE       SEC
          lda IOBUF,y
          STY LZEI
          RTS
/*
+TSERO    .(
	.zero
ZEI       .word 0
	.text

          STA ZEI:STY ZEI+1
          LDY #0
TSO1      LDA (ZEI),Y:BEQ TSO2
          JSR SEROUT:INY:BNE TSO1
TSO2      RTS
          .)
*/
&tsthex   .(
          cmp #"A"-1
          bcs th1
          sbc #"0"-1
          cmp #10
          bcc thok
therr     sec
          rts
th1       beq therr
          and #%00011111
          cmp #7
          bcs therr
          adc #9
thok      clc
          rts
          .)

&MLINEIN  .(
#ifndef NOSH
	.data
li1       .byt 0
	.text

#endif
          LDY #0
MO1       JSR SERIN
          bcc mo1a
#ifndef NOSH
          sty li1
          jsr clstdin
          ldy li1
          bcc MO1
#endif
          bcs MO2S

mo1a     ; cmp #127		; delete
	 ; beq del
	  cmp #$1f
          bcs MO1A

          CMP #TC_CR:BEQ MO2

          CMP #TC_BS:BNE MO1
del	 ; lda #TC_BS
	  cpy #0:beq MO1
          dey
          jsr SEROUT
/*#ifdef SHOW         
          ldx #STDERR
          jsr OUT
#endif*/
          jmp MO1

MO1A      STA IOBUF,Y
          jsr SEROUT
/*#ifdef SHOW
     ldx #STDERR
     jsr OUT
#endif*/
          INY:CPY #MAXLEN
          BCC MO1:bcs MO2
MO2S      sec:.byt $24
MO2       CLC
/*#ifdef SHOW
          php
          lda #13
          ldx #STDERR
          jsr OUT
          lda #10
          jsr OUT
          plp
#endif*/
          LDA #0:STA IOBUF,Y
          sta LZEI
          RTS
          .)
#ifndef NOMMU
#ifndef NOSH
&copycmd  .(
          ldx #<-1
          ldy #0
          lda #" "
          sta LZEI
cc1       inx
          lda PCBUF,x
          beq cce
          cmp #" "
          beq cc1
          cmp #34
          bne cc2c
          sta LZEI
          inx
cc2c  
#ifndef NOMON
          lda PCBUF,x
          cmp #"m"
          bne cc2d
          ldx #0
cc2a      lda montxt,x
          sta IOBUF,x
          beq cc2b
          jsr SEROUT
          inx
          bne cc2a 
#else
          dex
#endif
cc2       inx
cc2d      lda PCBUF,x
          beq cce   
          cmp LZEI
          bne cc2
cc3       inx
          lda PCBUF,x
          beq cce
          cmp #" "
          beq cc3
cc4       lda PCBUF,x
          sta IOBUF,y
          jsr SEROUT
          iny
cc2b      inx
          cmp #0
          bne cc4
          lda #0
          sta LZEI
          clc
          rts
cce       sec
          rts
          .)
#endif
#endif
          .)
#ifndef NOSH
          .(
	.data
insp      .byt 0
inst      .dsb INDEPTH
	.text

&inistdin .(
          lda #0
          sta insp
          rts
          .)

&&setin    .(
          jsr CHRGOT
          cmp #"<"
          beq s1
s2        rts
s1        inc LZEI
          jsr ropenfile
          bcs s2
          txa  
	  ; jmp opstdin
          .)

&opstdin  .(        /* a=neuer StdIn-Stream  */
          ldx insp
          cpx #INDEPTH
          bcs ope
          ldx #STDIN
          sec
          jsr DUP
          ldx insp
          sta inst,x
          inc insp
          clc
ope       rts
          .)

&clstdin  .(
          ldx insp
          sec
          beq ope
          dex
          lda inst,x
          stx insp
          sec
          ldx #STDIN
          jsr DUP
          tax
          lda #SC_NUL
          jsr STRCMD
          clc
&ope      rts
          .)

&clrbatch .(
          ldx insp
          beq ope
          dex
          lda inst,x
          stx insp
          tax
          lda #SC_NUL
          jsr STRCMD
          jmp clrbatch
          .)
          .)
#endif

#ifdef NOSYSFKT
setout    rts
#else
          .(
	.data
outstr    .byt 0
	.text

&inistdout .(
          lda #<-1
          sta outstr
          rts
          .)

&setout   .(
          jsr CHRGOT
          cmp #">"
          beq s1
s2        rts
s1        inc LZEI
          jsr wopenfile
          bcs s2
          txa  
          ldx #STDOUT
          sec
          jsr DUP
          sta outstr
          rts
          .)

&oldoutstr .(
          lda outstr
          bmi o1
          jsr CRLFOUT
          lda outstr
          sec
          ldx #STDOUT
          jsr DUP
          tax
          lda #SC_EOF
          jsr STRCMD
          lda #<-1
          sta outstr
o1        rts
          .)
          .)
#endif

#ifndef NOSYSFKT
ldezout   .(

	.zero
da        .word 0
lb        .byt 0
lo        .byt 0
w         .word 0,0
out       .byt 0
cnt       .byt 0
	.text

          sta da
          sty da+1
          stx lb
          ldx #39

l1        ldy #3
l1c       lda dtab,x
          sta w,y
          dex
          dey
          bpl l1c
          stx lo
          iny
          sty out
          sty cnt
l2a       ldy #3
l2        lda (da),y
          cmp w,y
          bcc sloop
          bne shift
          dey
          bpl l2
          bmi xsub
shift     ldy #0
          ldx #4
          clc
h1        lda w,y
          rol
          sta w,y
          iny
          dex
          bne h1
          bcs ende
          inc cnt
          bne l2a

sloop     dec cnt
          bmi end
          ldy #3
          clc
s0        lda w,y
          ror
          sta w,y
          dey
          bpl s0

xsub      ldy #3
x0        lda (da),y
          cmp w,y
          bcc d0
          bne d1
          dey
          bpl x0
d1        ldy #0
          ldx #4
          sec
d1a       lda (da),y
          sbc w,y
          sta (da),y
          iny
          dex
          bne d1a
          sec
          .byt $24
d0        clc
          rol out
          jmp sloop
         
end       lda out
          beq e3
          ldx #0
          stx lb
          beq e1
e3        bit lo
          bmi e1
          lda lb
          bne e2
e1        ora #"0"
e2        jsr SEROUT
          
          ldx lo
          bmi l1b
          jmp l1
l1b ende  rts                   
          
dtab      .word 1,0
          .word 10,0
          .word 100,0
          .word 1000,0
          .word 10000,0
          .word 34464,1
          .word 16960,15
          .word 38528,152
          .word 57600,1525
          .word 51712,15258
          .)
#endif

#ifndef MON_USE_STDLIB

	.(
	.zero
tx	.byt 0
ty	.byt 0
zp	.word 0
	.text

&HEXOUT	.(
	pha
	lsr
	lsr
	lsr
	lsr
	jsr nibble
	pla
nibble	and #$0f
	clc
	adc #"0"
	cmp #"9"+1
	bcc nibok
	adc #6
nibok	jmp SEROUT
	.)

&CRLFOUT .(
	lda #13
	jsr SEROUT
	lda #10
&&SEROUT
	stx tx
	ldx #STDOUT
	.byt $2c
&&OUT	stx tx
loop	pha
	jsr PUTC
	bcc ok
	cmp #E_NUL
	beq ok
	jsr YIELD
	pla
	jmp loop
ok	pla
	ldx tx
	rts
	.)

&SERIN	.(
	stx tx
	ldx #STDIN
	.byt $2c
&&IN	stx tx
loop	jsr GETC
	bcc ok
	cmp #E_EOF
	beq ok
	jsr YIELD
	jmp loop
ok	
	ldx tx
	rts
	.)

&TSERO	.(
	sta zp
	sty zp+1
	ldy #0
l0	lda (zp),y
	beq end
	jsr SEROUT
	iny
	bne l0
end	rts
	.)

&SERBRK	.(
	stx tx
	sty ty
	ldx #STDIN
	lda #SC_ESTAT
	jsr STRCMD
	cmp #E_EOF
	beq err
	tya
	and #SCE_BRK
	beq ok2
	lda #SC_CSTAT
	ldy #SCE_BRK
	jsr STRCMD
err	sec
	.byt $24
ok	clc
	ldy ty
	ldx tx
	rts

ok2	ldx #STDOUT
	lda #SC_STAT
	jsr STRCMD
	cmp #E_NUL
	beq err
	bne ok
	.)

&DEZOUT   .(
l1        tay
          sec
          sbc #100
          bcs l1
          lda #0
          sta tx
          tya
l2        tay
          sec
          sbc #10
          bcc l3
          inc tx
          bcs l2
l3        asl tx
          asl tx
          asl tx
          asl tx
          tya
          ora tx
	jmp HEXOUT
	.)

#if 1	/* ndef NOSH */

/* Taken directly from Stdlib */

/***********************************************************************
 * Warning! The following routines (Directory stuff, assigntab) are
 * _not_ thread-save!
 */

#ifndef PATH_DRV
#define   PATH_DRV  0
#define   PATH_NAME (PATH_DRV+1)   /* ohne abschliessendes DIRSIGN    */
#endif

	.zero
d         .byt 0
maxpath   .byt 0
	.text
	
          .(

&&usedir   sta zp
          sty zp+1
          lda PCBUF+FS_OPEN_DRV
          bpl ok         ; Laufwerk angegeben, war nix
          
          ldy #PATH_DRV
          lda (zp),y
          sta PCBUF+FS_OPEN_DRV

          ldx #FS_OPEN_NAME
          lda PCBUF,x
          cmp #DIRSIGN   ; Pfad absolut angegeben
          beq ok         ; war auch nix
          
ud2       iny
          lda (zp),y
          bne ud2
          sty d          
ud4       lda PCBUF,x
          beq ud3
          inx
          bne ud4
ud3       inx
          txa
          clc
          adc d
          sta d
          bcs nerr
          tay
ud5       lda PCBUF,x
          sta PCBUF,y
          dey
          dex
          cpx #FS_OPEN_NAME
          bcs ud5
          ldy #PATH_NAME
ud6       lda (zp),y
          sta PCBUF+FS_OPEN_NAME-PATH_NAME,y
          beq ud7
          iny
          bne ud6
ud7       lda #DIRSIGN
          sta PCBUF+FS_OPEN_NAME-PATH_NAME,y
          ldx d
          clc
          rts
nerr      sec
          rts
ok        ldx #FS_OPEN_NAME
ok1       lda PCBUF,x
          beq oke
          inx
          bne ok1
oke       inx
          clc
          rts
          .)
          
          .(
&&mchdir    sta zp
          sty zp+1
          stx maxpath
          lda PCBUF+FS_CMD_DRV
          bmi nodrive
          ldy #PATH_DRV
          cmp (zp),y
          beq nodrive
          sta (zp),y
          iny
          lda #0
          sta (zp),y
nodrive   inc zp
          bne nd1
          inc zp+1
          ldy #0
                         ; Name untersuchen
nd1       ldx #FS_CMD_NAME
          lda PCBUF,x
          bne ndrx       ; kein Name dann Pfad l”schen
          sta (zp),y
          clc
          rts
ndrx
          cmp #DIRSIGN   ; Name beginnt mit DIRSIGN
          bne nd2
          lda #0         ; dann Pfad l”schen
          sta (zp),y
          
nd2a      inx
nd2       lda PCBUF,x    ; weiter Name anschauen
          beq ndr        ; kein Name dann Ende
          cmp #DIRSIGN
          beq nd2a       ; DIRSIGN �berlesen
          cmp #"."
          bne nameok     ; kein '.' dann ok
          inx
          lda PCBUF,x    ; hier mindestens ein '.'
          beq ndr        ; Null dann Ende
          cmp #DIRSIGN   ; DIRSIGN,
          beq nd2a       ; dann '.' ignorieren
          cmp #"."       ; noch'n Punkt ?
          bne nerrx      ; nein, dann 
          jsr getpos
          ldy d          ; Position des letzten DIRSIGNs
          lda #0
          sta (zp),y     ; l”schen = eine Verzeichnis-Ebene h”her
          beq nd2a       ; (absolut)

nerrx     dex
nameok    jsr getpos     ; y=L„nge des alten Pfads
          sty d          ; hier Verzeichnis-Name an Pfad anh„ngen
no        iny
          cpy maxpath
          bcs nerr
          lda PCBUF,x
          beq nr
          cmp #DIRSIGN
          beq nr
          sta (zp),y
          inx
          bne no
nr        lda #0
          sta (zp),y
          ldy d
          lda #DIRSIGN   ; alles ok, dann Nullbyte (Ende alter Pfad) mit
          sta (zp),y     ; DIRSIGN �berschreiben
          lda PCBUF,x    ; Ende des neuen Verzeichnisses
          bne nd2a       ; nein, dann wieder nach oben
ndr       clc
          rts
nerr      sec
          rts
getpos    ldy #0         ; holt y=L„nge des alten Pfadnamens
          sty d          ; und d=Position des letzten DIRSIGNs
no0       lda (zp),y
          beq no1
          cmp #DIRSIGN
          bne no2
          sty d
no2       iny
          bne no0          
no1       rts
          .)          
           
          .(

&&getname  sta zp
          sty zp+1
          lda #0
          sta PCBUF+FS_OPEN_NAME
          ldy #<-1
          sty PCBUF+FS_OPEN_DRV
g1        iny
          lda (zp),y
          beq gr
          cmp #" "
          beq g1
          cmp #":"
          beq g1
          cmp #34        ; "
          beq g2
          iny
          lda (zp),y
          dey
          cmp #":"
          bne g2
          lda (zp),y
          cmp #"A"
          bcc g3
          sbc #1
g3        and #$0f
          sta PCBUF+FS_OPEN_DRV
          iny
          iny
g2        dey
          ldx #FS_OPEN_NAME
          bne g2a

&&set2name     /* x=iobuf, y=pcbuf */
          sta zp
          sty zp+1
          ldy #<-1
g2a       lda #" "
          sta d
gn1       iny
          lda (zp),y
          beq gn3
          cmp #" "
          beq gn1
          cmp #">"
          beq gn3
          cmp #34   ; "
          bne gn2
          iny
          sta d
gn2       lda (zp),y
          beq gn3
          cmp d
          beq gn3a
          sta PCBUF,x
          inx
          iny
          bne gn2

gn3a      iny
gn3       lda #0
          sta PCBUF,x
          inx
gr        rts
          .)

#endif /* NOSH */

/******************************************************************/

#undef	  Usedir 
#undef	  Chdir	
#undef	  Getname
#undef	  Set2name
	.)
#endif

	.(
	.data
pidtab	.dsb 10,0
pidn	.byte 0
	.text

&initsig .(
	lda #0
	sta pidn
	lda #<sigaddr
	ldy #>sigaddr
	sec
	jsr SETSIG
	lda #SIG_CHLD
	clc
	jsr SETSIG
	rts
	.)

sigaddr	.(
	tya
	pha
	txa
	pha
	jsr CHECKCHLD
	bcs nochld
	txa
	ldy pidn
	sta pidtab,y
	iny
	cpy #10
	bcs nochld
	inc pidn
nochld	pla
	tax
	pla
	tay
	pla
	rti
	.)

&checksig .(
	ldy pidn
	bne gotone
	rts
gotone	; output task ID
	lda #<sigt
	ldy #>sigt
	jsr TSERO
	lda pidtab
	jsr HEXOUT	; DEZOUT
	jsr CRLFOUT

	jsr decpids
	jmp checksig
sigt	.asc "Got child t","erm si","gnal from task ",0
	.)
	
decpids	.(
	ldy #0
	php
	sei
l0
	lda pidtab+1,y
	sta pidtab,y
	iny
	cpy pidn
	bcc l0
	dec pidn
	plp
	rts
	.)

&waitpid .(
	jsr YIELD
	ldy pidn
	beq waitpid
	cmp pidtab
	beq found
	pha
	jsr decpids
	pla
	jmp waitpid
found	jmp decpids
	.)

	.)

PRGEND    .)