home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Distributions / ucb / spencer_2bsd.tar.gz / 2bsd.tar / src / px / 30iosubs.s < prev    next >
Text File  |  1980-02-17  |  3KB  |  217 lines

  1. /
  2. / IO SUBROUTINES
  3. /
  4.     .globl    _getc,_putc
  5. _pmessage:
  6.     mov    r3,-(sp)
  7.     mov    _file,r3
  8.     mov    $_unit2,r0
  9.     jsr    pc,unit
  10.     mov    r3,_file
  11.     mov    fchain,r3    / flush all files
  12. 1:
  13.     tst    r3
  14.     beq    2f
  15.     bit    $FWRITE,FUNIT(r3)
  16.     beq    3f
  17.     mov    FBUF(r3),-(sp)
  18.     jsr    pc,_fflush
  19.     tst    (sp)+
  20. 3:
  21.     mov    FCHAIN(r3),r3
  22.     br    1b
  23. 2:
  24.     mov    $_unit1,r3
  25.     mov    FBUF(r3),-(sp)
  26.     jsr    pc,_fflush
  27.     tst    (sp)+
  28.     mov    (sp)+,r3
  29.     rts    pc
  30. _pputch:
  31.     mov    2(sp),*buf
  32.     jsr    pc,put
  33.     rts    pc
  34. /
  35. / iosync insures that
  36. / a useable image is in
  37. / the buffer window.
  38. /
  39. 2:
  40.     mov    (sp)+,r3
  41.     mov    (sp)+,r2
  42.     mov    (sp)+,r1
  43.     rts    pc
  44. iosync:
  45.     mov    buf,r0
  46.     bit    $SYNC,FUNIT(r0)        / dirty bit
  47.     bne    1f
  48.     rts    pc
  49. 1:
  50.     mov    r1,-(sp)
  51.     mov    r2,-(sp)
  52.     mov    r3,-(sp)
  53.     mov    r0,r2
  54.     bic    $SYNC,FUNIT(r2)
  55.     bit    $EOF,FUNIT(r2)
  56.     bne    pasteof
  57.     mov    FSIZE(r2),r3
  58. 1:
  59.     mov    buf,r0
  60.     mov    FBUF(r0),-(sp)
  61.     jsr    pc,_getc
  62.     tst    (sp)+
  63.     tst    r0
  64.     bmi    eof
  65.     movb    r0,(r2)+
  66.     sob    r3,1b
  67.     mov    buf,r0
  68.     bic    $EOLN,FUNIT(r0)
  69.     bit    $FTEXT,FUNIT(r0)
  70.     beq    2b
  71.     cmpb    *buf,$'\n
  72.     bne    2b
  73.     bis    $EOLN,FUNIT(r0)
  74.     movb    $' ,*buf
  75.     br    2b
  76. eof:
  77.     mov    buf,r0
  78.     bis    $EOF,FUNIT(r0)
  79.     br    2b
  80. pasteof:
  81.     mov    $EPASTEOF,_perrno
  82.     error    EPASTEOF
  83. /
  84. / get insures that
  85. / something is in the window
  86. / and then sets the dirty
  87. / bit effectively throwing the
  88. / windowed data away
  89. /
  90. get:
  91.     mov    r1,-(sp)
  92.     mov    buf,r1
  93.     bit    $FREAD,FUNIT(r1)
  94.     bne    1f
  95.     mov    $EREADIT,_perrno
  96.     error    EREADIT
  97. 1:
  98.     jsr    pc,iosync
  99.     bis    $SYNC,FUNIT(r1)
  100.     mov    (sp)+,r1
  101.     rts    pc
  102. put:
  103.     cmp    buf,$_unit2
  104.     beq    6f
  105.     mov    r2,-(sp)
  106.     mov    r3,-(sp)
  107.     mov    buf,r2
  108.     bit    $FWRITE,FUNIT(r2)
  109.     bne    1f
  110.     mov    $EWRITEIT,_perrno
  111.     error    EWRITEIT
  112. 1:
  113.     mov    FSIZE(r2),r3
  114. 1:
  115.     mov    buf,r0
  116.     mov    FBUF(r0),-(sp)    / the hidden buffer
  117.     movb    (r2)+,-(sp)    / the character to write
  118.     jsr    pc,_putc
  119.     cmp    (sp)+,(sp)+
  120.     tst    _errno        / error occurred?
  121.     bne    9f
  122.     sob    r3,1b
  123.     mov    (sp)+,r3
  124.     mov    (sp)+,r2
  125.     rts    pc
  126. 9:
  127.     mov    $EWRITE,_perrno
  128.     error    EWRITE
  129. 6:
  130.     mov    $2,r0
  131.     sys    write; _unit2; 1
  132.     bes    9b
  133.     cmp    r0,$1
  134.     bne    9b
  135.     rts    pc
  136. unit:
  137.     mov    r0,buf
  138.     beq    1f
  139.     tst    FUNIT(r0)
  140.     bmi    1f
  141.     mov    PFNAME(r0),_file
  142.     rts    pc
  143. 1:
  144.     mov    $EREFINAF,_perrno
  145.     error    EREFINAF
  146. /
  147. / standard files
  148. /
  149. .data
  150. /
  151. / unit 0 for "input"
  152. /
  153. u0buf:    .=.+518.
  154.     .-518.        / buffer pointer
  155.     0
  156.     0
  157.     stdin
  158.     0        / file name
  159.     FTEXT+FREAD+SYNC+0        / flags & unit number
  160.     1        / size of items
  161. _unit0:
  162.     0        / window
  163. /
  164. / unit 1 for "output"
  165. /
  166. u1buf:    1        / file descriptor for putc
  167. _draino:
  168. u1cnt:    .=.+516.
  169.     u1buf        / putc buffer pointer
  170.     0
  171.     0
  172.     stdout
  173.     0
  174.     FTEXT+FWRITE+1+EOF
  175.     1
  176. _unit1:
  177.     0
  178. /
  179. / unit2 for <message>
  180. /
  181.     0
  182.     0
  183.     0
  184.     mesgf
  185.     0
  186.     FTEXT+FWRITE+2
  187.     1
  188. _unit2:
  189.     0
  190. /
  191. FBUF = -14.
  192. FCHAIN = -12.
  193. FLEV = -10.
  194. PFNAME = -8.
  195. FNAME = -6
  196. FUNIT = -4
  197. FSIZE = -2
  198. nextu:    '0        / next temp file
  199. tnam:    <tmp.x\0>
  200. .even
  201. .bss
  202. buf:    .=.+2
  203. fchain:    .=.+2
  204. .data
  205. bufopt:    1
  206. stdin:    <standard input\0>
  207. stdout:    <standard output\0>
  208. mesgf:    <message file\0>
  209. .text
  210. EOF = 400
  211. EOLN = 1000
  212. SYNC = 2000
  213. TEMP = 4000
  214. FREAD = 10000
  215. FWRITE = 20000
  216. FTEXT = 40000
  217.