changeset 1282:c1f7d686924e

Now back-ported to OS-9 Level One and assembled from there.
author boisy
date Wed, 27 Aug 2003 23:47:59 +0000
parents a248b7df616a
children 132859392c04
files level2/modules/kernel/fmove.asm level2/modules/pipeman.asm
diffstat 2 files changed, 5 insertions(+), 407 deletions(-) [+]
line wrap: on
line diff
--- a/level2/modules/kernel/fmove.asm	Wed Aug 27 23:45:37 2003 +0000
+++ b/level2/modules/kernel/fmove.asm	Wed Aug 27 23:47:59 2003 +0000
@@ -5,6 +5,11 @@
          rts
          ENDC
 
+* A = source task #
+* B = destination task #
+* Y = bytes to move
+* X = source pointer
+* U = destination pointer
 FMove    ldd   R$D,u        get source & destination task #'s
 L0B25    ldy   R$Y,u        Get # bytes to move
          beq   L0A01        None, exit without error
--- a/level2/modules/pipeman.asm	Wed Aug 27 23:45:37 2003 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,407 +0,0 @@
-********************************************************************
-* PipeMan - OS-9 Level Two Pipe File Manager
-*
-* $Id$
-*
-*
-* 'show grf.3.a | eat'  (eat is cat, but just does a I$ReadLn, and not I$WritLn)
-* April 10, 1996  14:05:15
-* April 10, 1996  14:07:47
-*          15.2 seconds per iteration
-*          i.e. everything but the screen writes
-* 
-* fast SCF+fast pipe
-* 'show grf.3.a | cat', 10 times
-* April 10, 1996  13:17:54
-* April 10, 1996  13:21:57
-*          24.3 seconds per iteration
-*          9.1 solely for pipes
-* 
-* fast SCF+old slow pipe
-* April 10, 1996  13:30:24
-* April 10, 1996  13:38:04
-*          46.0 seconds per iteration
-*          30.8 solely for pipes
-* 
-*          speedup percent is (30.8-9.1)/30.8 = 70%
-* 
-*          Pipes are more than doubled in speed!
-*
-* 32 byte read and write buffers
-*
-* Ed.    Comments                                       Who YY/MM/DD
-* ------------------------------------------------------------------
-*   4    Enhanced and re-written                        ADK ??/??/??
-
-         nam   PipeMan
-         ttl   OS-9 Level Two Pipe File Manager
-
-         ifp1
-         use   defsfile
-         use   pipedefs
-         endc
-
-tylg     set   FlMgr+Objct   
-atrv     set   ReEnt+Rev
-rev      set   $03
-edition  set   4
-
-         mod   eom,name,tylg,atrv,start,size
-
-         rmb   $0000
-size     equ   .
-
-
-         org   $0000
-P.CPR    rmb   1          process ID
-P.CNT    rmb   1          count
-P.SIG    rmb   1          signal code
-P.FLAG   rmb   1          raw/edit flag
-
-name     fcs   /PipeMan/
-         fcb   edition
-
-start    lbra  Create
-         lbra  Open
-         lbra  MakDir
-         lbra  ChgDir
-         lbra  Delete
-Seek     clrb
-         rts
-         nop
-         lbra  Read
-         lbra  Write
-         lbra  ReadLn
-         lbra  WritLn
-
-GetStt   clrb
-         rts
-         nop
-
-SetStt   clrb
-         rts
-         nop
-
-Close    lda   PD.CNT,y
-         bne   L008E
-         ldu   PD.BUF,y   if no one's using it,
-         clrb
-         inca
-         os9   F$SRtMem   return the memory
-         clrb
-         rts
-
-L008E    leax  PD.Read,y
-         cmpa  PD.Read+P.CNT,y is the read count zero?
-         beq   L009C
-
-         cmpa  PD.Writ+P.CNT,y is the write count zero?
-         bne   L00A9
-         leax  PD.Writ,y
-
-L009C    lda   P.CPR,x    get process ID that's reading/writing
-         beq   L00A9      if none
-         ldb   P.SIG,x    get signal code
-         beq   L00A9
-         clr   P.SIG,x
-         os9   F$Send     send a wake-up signal to the process
-L00A9    clrb  
-         rts   
-
-MakDir   equ   *
-ChgDir   equ   *
-Delete   equ   *
-         comb  
-         ldb   #E$UnkSVC
-         rts   
-
-Create   equ   *
-Open     equ   *
-         ldx   R$X,u        get address of filename to open
-         pshs  y            save PD pointer
-         os9   F$PrsNam   parse /pipe
-         bcs   L007B        exit on error
-         IFGT  Level-1
-         ldx   <D.Proc      current process ptr
-         ldb   P$Task,x     get task number for call, below
-         leax  -$01,y       back up one character
-         os9   F$LDABX    get last character of the filename
-         tsta               check the character
-         ELSE
-         leax  -1,y
-         lda   ,y
-         ENDC
-         bmi   L0060      if high bit set, it's OK
-         leax  ,y           point to next bit
-         os9   F$PrsNam   else parse name
-         bcc   L007B      if no error, it's a sub-dir, and we error out
-L0060    sty   R$X,u        save new pathname ptr
-         puls  y            restore PD pointer
-         ldd   #$0100
-         os9   F$SRqMem   request one page for the pipe
-         bcs   L007A        exit on error
-         stu   PD.BUF,y     save ptr to the buffer
-         stu   <PD.NxtI,y save write pointer
-         stu   <PD.NxtO,y and read pointer
-         leau  d,u          point to the end of the buffer
-         stu   <PD.End,y    save save the ptr
-L007A    rts   
-
-L007B    comb  
-         ldb   #E$BPNam   bad path name
-         puls  pc,y
-
-ReadLn   ldb   #$0D
-         fcb   $21	skip one byte
-
-Read     clrb
-         stb   PD.Read+P.FLAG,y  raw read
-         leax  PD.Read,y
-         lbsr  L0160      send wakeup signals to process
-         bcs   L0100      on error, wake up writing process
-         ldx   R$Y,u
-         beq   L0100      if no bytes to rwad
-         ldd   R$X,u      start address to read from
-         leax  d,x        add in number of bytes: end address
-
-* NOTE: PD.RGS,Y will change as the processes read/write the pipe,
-* and sleep.
-         pshs  u            save current caller's register stack
-         leas  -32,s        reserve a 32-byte buffer on the stack
-         leau  ,s           point to the start of the buffer
-         pshs  d,x        save start, end to read
-
-         clrb               no bytes read to user yet
-         puls  x            restore number of data bytes read, read address
-L00DB    bsr   L01F2        are we blocked?
-         bcs   L00C8        yes, send a signal
-         sta   b,u          store the byte in the internal read buffer
-         leax  $01,x        go up by one byte
-         incb               one more byte in the buffer
-         cmpb  #32          reached maximum size of the buffer?
-         blo   L00E0        no, continue
-         bsr   read.out     read 32 bytes of data to the caller
-
-L00E0    tst   PD.Read+P.FLAG,Y  was it a raw read?
-         beq   L00ED      skip ahead if raw
-         cmpa  #C$CR      was the character a CR?
-         beq   L00F1      yes, we're done: flush and exit
-L00ED    cmpx  ,s         or at end of data to read?
-         blo   L00DB        no, keep reading
-
-L00F1    bsr   read.out     flush the rest of the pipe buffer to the user
-L00F2    tfr   x,d        this is how far we got
-         subd  ,s++       take out start of buffer
-         leas  32,s         kill our on-stack buffer
-         puls  u            restore caller's register stack ptr: NOT PD.RGS,Y
-         addd  R$Y,u      add in number of bytes
-         std   R$Y,u      save bytes read
-         bne   L00FF      if not zero
-         ldb   #E$EOF     zero bytes read:EOF error
-         fcb   $21          skip one byte
-
-L00FF    clrb               no errors
-L0100    leax  PD.Read,y    read data ptr
-         lbra  L01BD      signal other it's OK to go ahead
-
-read.out pshs  a,x,y,u      save registers
-         tstb               any data to write?
-         beq   read.ex      no, skip ahead
-         clra               make 16-bit data length
-         tfr   d,y          number of data bytes to read to user
-         negb               make it negative
-         leax  b,x          back up TO pointer
-         pshs  x            save it
-         leax  ,u           point to the start of the buffer
-         IFGT  Level-1
-         ldu   <D.Proc      current process pointer
-         ldb   P$Task,u     A=$00 from above, already
-         puls  u            restore TO pointer
-
-         os9   F$Move       move the data over
-         ELSE
-         ENDC
-         clrb               no bytes read to the caller yet
-read.ex  puls  a,x,y,u,pc   restore registers and exit
-
-L00C8    pshs  x            save read pointer
-         bsr   read.out     dump data out to the user
-         pshs  b            save number of bytes read
-         leax  PD.Read,y    read data area ptr
-         lbsr  L018B      setup for signal
-         puls  x,b          restore registers: note B=$00, but we CANNOT do a
-         bcc   L00DB        clrb, because this line needs CC.C!
-         bra   L00F2        don't write data out again, but exit
-
-* Check if we're blocked
-L01F2    lda   <PD.RFlg,y  we blocked?
-         bne   L01F9        no, skip ahead
-         coma               set flag: blocked
-         rts                and return to the caller
-
-L01F9    pshs  x            save read ptr
-         ldx   <PD.NxtO,y   where to read from in the buffer
-         lda   ,x+        get a byte
-         cmpx  <PD.End,y  at the end of the buffer?
-         blo   L0207        no, skip ahesd
-         ldx   PD.BUF,y   yes, go to start
-L0207    stx   <PD.NxtO,y   save new read ptr
-         cmpx  <PD.NxtI,y caught up to the write pointer yet?
-         bne   L0212        no, skeip ahead
-         clr   <PD.RFlg,y yes, set read is blocked
-L0212    andcc #^Carry      no errors
-         puls  pc,x         restore regs and exit
-
-L0160    lda   P.CPR,x      get current process
-         beq   L0185        none, exit
-         cmpa  PD.CPR,y   current process ID
-         beq   L0189        none, exit
-         inc   P.CNT,x    one more process using this pipe
-         ldb   P.CNT,x
-         cmpb  PD.CNT,y   same as the number for this path?
-         bne   L0173        no, skip ahead
-         lbsr  L009C      no, send a wake-up signal
-L0173    os9   F$IOQu     and insert it in the others IO queue
-         dec   P.CNT,x    decrement count
-         pshs  x
-         ldx   <D.Proc      current process ptr
-         ldb   <P$Signal,x  signal code
-         puls  x
-         beq   L0160      if no signal code sent, do another process
-         coma               otherwise return CC.C set, and B=signal code
-         rts   
-
-L0185    ldb   PD.CPR,y     grab current PD process
-         stb   P.CPR,x      save as current reading/writing process
-L0189    clrb               no errors
-         rts                and exit
-
-L01CC    pshs  b,x          save regs
-         ldx   <PD.NxtI,y
-         ldb   <PD.RFlg,y 0=READ, 1=WRITE
-         beq   L01DE      was reading, set to write and continue
-         cmpx  <PD.NxtO,y caught up to the read pointer yet?
-         bne   L01E3
-         comb  
-         puls  pc,x,b
-
-L01DE    inc   <PD.RFlg,y set to writing into the pipe
-L01E3    sta   ,X+        save the byte
-         cmpx  <PD.End,y  if at the end of the buffer
-         blo   L01EC
-         ldx   PD.BUF,y   reset to the beginning
-L01EC    stx   <PD.NxtI,y
-         clrb  
-         puls  pc,x,b
-
-write.in pshs  a,x,y        save registers
-         leau  -32,u      point to the start of the buffer again
-         IFGT  Level-1
-         ldx   <D.Proc      current process pointer
-         lda   P$Task,x   get FROM task number for this process
-         ldx   1,s        get FROM pointer
-         ldy   #32        16 bytes to grab
-         clrb             TO the system task
-         os9   F$Move
-         ELSE
-         ENDC
-         ldb   #32        16 bytes in the buffer
-         puls  a,x,y,pc
-
-WritLn   ldb   #$0D
-         fcb   $21        skip one byte
-
-Write    clrb
-         stb   <PD.Writ+P.FLAG,y
-         leax  PD.Writ,y
-         bsr   L0160      make sure it's OK
-         bcs   L015C
-         ldx   R$Y,u      get number of bytes to write
-         beq   L015C
-         ldd   R$X,u      start address
-         leax  d,x        add in number of bytes
-         pshs  u
-         leau  ,s           point to the end of the buffer
-         leas  -32,s
-         pshs  d,x        save start, end
-
-         ldx   ,s           get initial start pointer
-         bsr   write.in     fill the write buffer
-
-         puls  x
-L0137    lda   ,u
-         bsr   L01CC      save it in the buffer
-         bcs   L0124      caught up to reading process yet?
-         leax  $01,x      up by one byte
-         leau  1,u
-         decb
-         bne   L0138
-         bsr   write.in     fill the buffer again
-
-L0138    tst   <PD.Writ+P.FLAG,y
-         beq   L014B
-         cmpa  #C$CR      at the end of a line to output?
-         beq   L014F
-L014B    cmpx  ,S         at end yet?
-         blo   L0137      if not, read more data
-L014F    clrb             clear carry and error
-L0150    ldu   2+32,s       skip END, 32-byte write buffer, get U
-         pshs  b,cc
-         tfr   x,d
-         subd  $02,s      take out end address
-         addd  R$Y,u      add in number of bytes
-         std   R$Y,u      save bytes written
-         puls  x,b,cc
-         leas  32,s         kill write buffer
-         puls  u
-
-L015C    leax  PD.Writ,y
-* can probably lose saving 'U' in next few lines... but only minor difference
-* Signal read/write it's OK to go ahead
-L01BD    pshs  u,b,cc
-         clr   P.CPR,x    NO process currently using this device
-         bsr   Other      signal other process to start
-         puls  pc,u,b,cc
-
-L0124    pshs  x,b
-         leax  PD.Writ,y
-         bsr   L018B      send signal to other
-         tfr   b,a          save error code, if applicable
-         puls  x,b          restore pointer, byte count
-         bcc   L0137        continue if OK
-         tfr   a,b          otherwise restore error code
-         bra   L0150        exit, returning the error code to the user
-
-L018B    ldb   P.CNT,x
-         incb  
-         cmpb  PD.CNT,y
-         beq   L01B9
-         stb   P.CNT,x
-         ldb   #$01
-         stb   P.SIG,x
-         clr   PD.CPR,y
-         pshs  x
-         bsr   Other
-         ldx   #$0000       make X=0
-         os9   F$Sleep    sleep forever
-         ldx   <D.Proc
-         ldb   <P$Signal,x  get signal code
-         puls  x
-         dec   P.CNT,x
-         tstb  
-         bne   L01BB      if a signal, we can't wake up
-         clrb             the writing process
-         rts   
-
-L01B9    ldb   #E$Write   write error
-L01BB    coma  
-         rts   
-
-Other    exg   x,d
-         eorb  #$04       if r/w go to w/r
-         exg   d,x
-         lbra  L009C
-
-         emod
-eom      equ   *
-         end