home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V6 / usr / source / s1 / form5.s < prev    next >
Encoding:
Text File  |  1975-05-13  |  9.5 KB  |  742 lines

  1. .globl b1
  2. .globl hblk
  3. .globl headers
  4. .globl    initl
  5. .globl asmem
  6. .globl b1s
  7. .globl b1e
  8. .globl w1
  9. .globl stats
  10. .globl    lookchar
  11. .globl    flush
  12. .globl    fsfile
  13. .globl    seekchar
  14. .globl    backspace
  15. .globl    alterchar
  16. .globl    zero
  17. .globl    getchar
  18. .globl    putchar
  19. .globl    copy
  20. .globl    rewind
  21. .globl    create
  22. .globl    allocate
  23. .globl    release
  24. .globl    collect
  25. .globl    w,r,a,l
  26. .globl    getword
  27. .globl    putword
  28. .globl    backword
  29. .globl    alterword
  30. /
  31. /
  32. /    routine to read next character from string
  33. /    pointer to by r1; character returned in r0
  34. /    c-bit set if character not availiable (eof)
  35. /
  36. /    mov    ...,r1
  37. /    jsr    pc,getchar
  38. /    movb    r0,...
  39. /
  40. getchar:
  41.     jsr    pc,lookchar
  42.     bes    1f
  43.     inc    r(r1)
  44.     tst    r0        /clears c-bit
  45. 1:    rts    pc
  46. /
  47. /
  48. /    routine to read a string backwards
  49. /    the read pointer is decremented before reading
  50. /
  51. /    mov    ...,r1
  52. /    jsr    pc,backspace
  53. /    mov    r0,...
  54. /
  55. backspace:
  56.     cmp    a(r1),r(r1)
  57.     bhis    nochc
  58.     dec    r(r1)
  59.     jsr    pc,lookchar
  60.     rts    pc
  61. nochc:    clr    r0
  62.     sec
  63.     rts    pc
  64. /
  65. /
  66. /    routine to put a word onto the string
  67. /
  68. /    mov    ...,r1
  69. /    mov    ...,r0
  70. /    jsr    pc,putword
  71. /
  72. putword:
  73.     mov    r0,-(sp)
  74.     sub    $hblk,r0
  75.     jsr    pc,putchar
  76.     swab    r0
  77.     jsr    pc,putchar
  78.     mov    (sp)+,r0
  79.     rts    pc
  80. /
  81. /
  82. /    routine to get a word from the string
  83. /
  84. /    mov    ...,r1
  85. /    jsr    pc,getword
  86. /    mov    r0,...
  87. /
  88. getword:
  89.     jsr    pc,lookchar
  90.     bes    1f
  91.     movb    r0,nchar
  92.     inc    r(r1)
  93.     jsr    pc,lookchar
  94.     bes    1f
  95.     movb    r0,nchar+1
  96.     inc    r(r1)
  97.     mov    nchar,r0
  98.     add    $hblk,r0
  99. 1:    rts    pc
  100. /
  101. /
  102. /    routine to alter the word pointed to by r(r1)
  103. /    by replacing the word there with r0
  104. /
  105. /    mov    wd,r0
  106. /    mov    ...,r1
  107. /    jsr    pc,alterword
  108. /
  109. alterword:
  110.     mov    r0,-(sp)
  111.     sub    $hblk,r0
  112.     jsr    pc,alterchar
  113.     swab    r0
  114.     jsr    pc,alterchar
  115.     mov    (sp)+,r0
  116.     rts    pc
  117. /
  118. /
  119. /    routine to get words backwards from string
  120. /
  121. /    mov    ...,r1
  122. /    jsr    pc,backword
  123. /    mov    r0,...
  124. /
  125. backword:
  126.     cmp    a(r1),r(r1)
  127.     bhis    nochw
  128.     dec    r(r1)
  129.     jsr    pc,lookchar
  130.     movb    r0,nchar+1
  131.     cmp    a(r1),r(r1)
  132.     bhis    nochw
  133.     dec    r(r1)
  134.     jsr    pc,lookchar
  135.     movb    r0,nchar
  136.     mov    nchar,r0
  137.     add    $hblk,r0
  138.     rts    pc
  139. /
  140. nochw:
  141.     clr    r0
  142.     sec
  143.     rts    pc
  144. /
  145. /
  146. /    routine to copy the contents of one string
  147. /    to another.
  148. /
  149. /    mov    source,r0
  150. /    mov    dest,r1
  151. /    jsr    pc,copy
  152. /    mov    r1,...
  153. /
  154. /    on return, r1 points to the new string and should
  155. /    be saved.  r0 is preserved.
  156. /
  157. copy:
  158.     inc    stats+12.
  159.     mov    r0,-(sp)
  160.     mov    r1,-(sp)
  161.     mov    r2,-(sp)
  162.     mov    r3,-(sp)
  163.     mov    w(r0),r2
  164.     sub    a(r0),r2    /W-A (old)
  165.     mov    l(r1),r3
  166.     sub    a(r1),r3    /L-A (new)
  167.     cmp    r2,r3
  168.     blos    1f
  169.     mov    r2,r0
  170.     jsr    pc,allocate
  171.     mov    4(sp),r0    /new
  172.     jsr    pc,swap
  173.     jsr    pc,release
  174.     mov    r0,r1
  175.     mov    0(sp),r0    /old
  176. 1:
  177.     mov    a(r1),w(r1)    /rewind w pointer
  178.     cmp    r2,$512.
  179.     blos    copy1        /is a short string
  180. /
  181.     jsr    pc,flush
  182.     jsr    pc,reset
  183. /
  184.     mov    a(r0),-(sp)
  185. 4:
  186.     mov    (sp),0f
  187.     mov    afi,r0
  188.     sys    seek;0:.. ;0    /set input pointer
  189.     cmp    r2,$512.
  190.     blos    2f
  191.     mov    $512.,r3    /# output this time
  192.     mov    r3,0f
  193.     mov    r3,3f
  194.     add    r3,(sp)
  195.     sub    r3,r2    /# left to output
  196.     br    1f
  197. 2:
  198.     mov    r2,0f
  199.     mov    r2,3f
  200.     mov    r2,r3
  201.     clr    r2
  202. 1:
  203.     mov    afi,r0
  204.     sys    read;b1;0:..
  205.     bes    bad
  206.     cmp    r0,r3
  207.     bne    bad
  208.     mov    afout,r0
  209.     mov    (r1),0f
  210.     add    r3,(r1)
  211.     sys    seek;0:.. ;0
  212.     sys    write;b1;3:..
  213.     bes    bad
  214.     tst    r2
  215.     bgt    4b
  216.     tst    (sp)+
  217. /
  218. /    fix up read ptr of new string
  219. /
  220. copy2:
  221.     mov    6(sp),r0    /restore r0
  222.     mov    r(r0),r2
  223.     sub    a(r0),r2
  224.     add    a(r1),r2
  225.     mov    r2,r(r1)
  226. /
  227. /    restore and return
  228. /
  229.     mov    (sp)+,r3
  230.     mov    (sp)+,r2
  231.     mov    (sp)+,r1
  232.     mov    (sp)+,r0
  233.     rts    pc
  234. /
  235. bad:    mov    $1,r0
  236.     sys write;1f;2f-1f
  237.     4
  238. 1:    <error on copy\n>
  239. 2:    .even
  240. /
  241. swap:
  242.     mov    w(r1),-(sp)
  243.     mov    w(r0),w(r1)
  244.     mov    (sp),w(r0)
  245.     mov    r(r1),(sp)
  246.  
  247.     mov    r(r0),r(r1)
  248.     mov    (sp),r(r0)
  249.     mov    a(r1),(sp)
  250.     mov    a(r0),a(r1)
  251.     mov    (sp),a(r0)
  252.     mov    l(r1),(sp)
  253.     mov    l(r0),l(r1)
  254.     mov    (sp)+,l(r0)
  255.     rts    pc
  256. /
  257. /    copy a short string
  258. /
  259. copy1:
  260.     mov    r(r0),-(sp)
  261.     mov    a(r0),r(r0)
  262.     mov    nchar,-(sp)
  263.     mov    r0,r2        /old
  264.     mov    r1,r3        /new
  265. 1:
  266.     mov    r2,r1
  267.     jsr    pc,getchar
  268.     bes    1f
  269.     mov    r3,r1
  270.     jsr    pc,putchar
  271.     br    1b
  272. 1:
  273.     mov    r2,r0
  274.     mov    (sp)+,nchar
  275.     mov    (sp)+,r(r0)
  276.     mov    r3,r1
  277.     br    copy2
  278. /
  279. /
  280. /
  281. /
  282. /
  283. /    routine to rewind read pointer of string
  284. /    pointed to by r1
  285. /
  286. /    mov    ...,r1
  287. /    jsr    pc,rewind
  288. /
  289. rewind:
  290.     mov    a(r1),r(r1)
  291.     rts    pc
  292. /
  293. /
  294. /    routine to rewind write pointer of string
  295. /    pointed to by r1
  296. /
  297. /    mov    ...,r1
  298. /    jsr    pc,create
  299. /
  300. create:
  301.     mov    a(r1),w(r1)
  302.     mov    a(r1),r(r1)
  303.     rts    pc
  304. /
  305. /
  306. /    routine to zero a string
  307. /
  308. /    mov    ...,r1
  309. /    jsr    pc,zero
  310. /
  311. zero:
  312.     mov    r0,-(sp)
  313.     .if testing
  314.     jsr    pc,preposterous
  315.     .endif
  316.     mov    a(r1),w(r1)
  317.     clrb    r0
  318. 1:    cmp    w(r1),l(r1)
  319.     bhis    1f
  320.     jsr    pc,putchar
  321.     br    1b
  322. 1:    mov    a(r1),w(r1)
  323.     mov    (sp)+,r0
  324.     rts    pc
  325. /
  326. /
  327. /
  328. /    routine to move the read pointer of a string to the
  329. /    relative position indicated by r0.  the string is
  330. /    extended if necessary - there is no error return.
  331. /
  332. /    mov    position,r0
  333. /    mov    ...,r1
  334. /    jsr    pc,seekchar
  335. /
  336. seekchar:
  337.     mov    r1,-(sp)
  338.     mov    r0,-(sp)
  339.     .if testing
  340.     jsr    pc,preposterous
  341.     .endif
  342.     inc    stats+10.
  343. 1:
  344.     mov    (sp),r0
  345.     add    a(r1),r0
  346.     cmp    r0,l(r1)
  347.     bhi    3f
  348.     mov    r0,r(r1)
  349.     cmp    r0,w(r1)
  350.     blo    1f
  351.     mov    r0,w(r1)
  352.     br    1f
  353. 3:
  354.     mov    (sp),r0
  355.     jsr    pc,allocate
  356.     mov    2(sp),r0
  357.     jsr    pc,copy
  358.     jsr    pc,swap
  359.     jsr    pc,release
  360.     mov    2(sp),r1
  361.     br    1b
  362. 1:
  363.     mov    (sp)+,r0
  364.     mov    (sp)+,r1
  365.     rts    pc
  366. /
  367. /
  368. /    routine to move read pointer of string to end of string
  369. /
  370. /    mov    ...,r1
  371. /    jsr    pc,fsfile
  372. /
  373. fsfile:
  374.     mov    r0,-(sp)
  375.     .if testing
  376.     jsr    pc,preposterous
  377.     .endif
  378.     inc    stats+10.
  379.     mov    w(r1),r(r1)
  380.     mov    (sp)+,r0
  381.     rts    pc
  382. /
  383. /
  384. /    routine to place the character in r0 at the current
  385. /    position of the read pointer - the read pointer
  386. /    is not moved.
  387. /
  388. /    movb    ch,r0
  389. /    mov    ...,r1
  390. /    jsr    pc,alterchar
  391. /    mov    r1,...
  392. /
  393. alterchar:
  394.     mov    r2,-(sp)
  395.     mov    r1,-(sp)
  396.     mov    r0,nchar
  397.     .if testing
  398.     jsr    pc,preposterous
  399.     .endif
  400.     inc    stats+8.
  401. 1:    cmp    r(r1),l(r1)    /W,L
  402.     blo    3f
  403.     mov    l(r1),r0
  404.     inc    r0
  405.     sub    a(r1),r0    /W-A+1
  406.     jsr    pc,allocate
  407.     mov    (sp),r0
  408.     jsr    pc,copy
  409.     jsr    pc,swap
  410.     jsr    pc,release
  411.     mov    (sp),r1
  412. 3:
  413.     mov    r(r1),r0
  414.     jsr    pc,bufchar
  415.     bec    2f
  416.     jsr    pc,getbuf
  417.  
  418. 2:    movb    nchar,(r0)
  419.     mov    $1,w1(r2)
  420.     mov    nchar,r0    /to preserve r0 for user
  421.     inc    r(r1)
  422.     cmp    r(r1),w(r1)
  423.     blos    3f
  424.     mov    r(r1),w(r1)
  425. 3:
  426.     mov    (sp)+,r1
  427.     mov    (sp)+,r2
  428.     rts    pc
  429. /
  430. /
  431. /    routine to look at next character from string
  432. /    pointed to by r1;  character returned in r0
  433. /    c-bit set if character not available (end of file)
  434. /    r1 is preserved
  435. /
  436. /    mov    ...,r1
  437. /    jsr    pc,lookchar
  438. /    movb    r0,...
  439. /
  440. lookchar:
  441.     mov    r2,-(sp)
  442.     inc    stats+6.
  443.     .if testing
  444.     jsr    pc,preposterous
  445.     .endif
  446.     cmp    w(r1),r(r1)    /W,R
  447.     blos    noch
  448.     mov    r(r1),r0
  449.     jsr    pc,bufchar
  450.     bec    2f
  451.     jsr    pc,getbuf
  452. /
  453. 2:
  454.     inc    flag
  455.     bne    2f
  456.     jsr    pc,fixct
  457.     br    1f
  458. 2:
  459.     mov    flag,u1(r2)
  460. 1:
  461.     mov    (sp)+,r2
  462.     movb    (r0),r0
  463.     tst    r0    /clears c-bit
  464.     rts    pc
  465. /
  466. noch:
  467.     mov    (sp)+,r2
  468.     clr    r0
  469.     sec
  470.     rts    pc
  471. /
  472. /
  473. /    routine to put a character into the string
  474. /    pointed to by r1;  character in r0
  475. /    r0 is preserved; r1 points to the string
  476. /    after return and must be saved.
  477. /
  478. /    movb    ch,r0
  479. /    mov    ...,r1
  480. /    jsr    pc,putchar
  481. /    mov    r1,...
  482. /
  483. putchar:
  484.     mov    r2,-(sp)
  485.     mov    r1,-(sp)
  486.     mov    r0,nchar
  487.     .if testing
  488.     jsr    pc,preposterous
  489.     .endif
  490.     inc    stats+8.
  491. 1:    cmp    w(r1),l(r1)    /W,L
  492.     blo    3f
  493.     mov    w(r1),r0
  494.     inc    r0
  495.     sub    a(r1),r0    /W-A+1
  496.     jsr    pc,allocate
  497.     mov    (sp),r0
  498.     jsr    pc,copy
  499.     jsr    pc,swap
  500.     jsr    pc,release
  501.     mov    (sp),r1
  502. 3:
  503.     mov    w(r1),r0
  504.     jsr    pc,bufchar
  505.     bec    2f
  506.     jsr    pc,getbuf
  507. 2:    movb    nchar,(r0)
  508.     mov    $1,w1(r2)
  509.     mov    nchar,r0    /to preserve r0 for user
  510.     inc    w(r1)
  511.     inc    flag
  512.     bne    2f
  513.     jsr    pc,fixct
  514.     br    1f
  515. 2:
  516.     mov    flag,u1(r2)
  517. 1:
  518.     mov    (sp)+,r1
  519.     mov    (sp)+,r2
  520.     rts    pc
  521. /
  522. /
  523. /    routine to flush contents of all buffers.
  524. /
  525. /    jsr    pc,flush
  526. /
  527. flush:
  528.     mov    r1,-(sp)
  529.     mov    r2,-(sp)
  530.     mov    r3,-(sp)
  531.     clr    r3
  532. 1:
  533.     cmp    r3,$numb
  534.     bhis    1f
  535.     mov    r3,r2
  536.     asl    r2
  537.     tst    w1(r2)
  538.     ble    2f
  539.     mov    r3,r1
  540.     ashc    $9.,r1
  541.     bic    $777,r1
  542.     add    $b1,r1
  543.     jsr    pc,clean
  544. 2:
  545.     inc    r3
  546.     br    1b
  547. 1:
  548.     mov    (sp)+,r3
  549.     mov    (sp)+,r2
  550.     mov    (sp)+,r1
  551.     rts    pc
  552. /
  553. /
  554. reset:
  555.     mov    r3,-(sp)
  556.     mov    r2,-(sp)
  557.     clr    r3
  558. 1:
  559.     cmp    r3,$numb
  560.     bge    1f
  561.     mov    r3,r2
  562.     asl    r2
  563.     mov    $-1.,w1(r2)
  564.     clr    b1s(r2)
  565.     clr    b1e(r2)
  566.     clr    u1(r2)
  567.     inc    r3
  568.     br    1b
  569. 1:
  570.     clr    flag
  571.     mov    (sp)+,r2
  572.     mov    (sp)+,r3
  573.     rts    pc
  574. /
  575. /
  576. /    routine to read from disc to a buffer
  577. /    wcing the buffer if necessary
  578. /
  579. /    mov    disc addr,r0
  580. /    mov    buffer addr,r2
  581. /    jsr    pc,getb
  582. /
  583. /    on return r0 = addr of byte in buffer
  584. /
  585. getb:
  586.     mov    r3,-(sp)
  587.     mov    r1,-(sp)
  588.     mov    r0,-(sp)
  589.     mov    r2,r3
  590.     asr    r3
  591.     mov    r3,r1
  592.     ashc    $9.,r1
  593.     bic    $777,r1
  594.     add    $b1,r1
  595.     tst    w1(r2)    / w
  596.     ble    1f
  597.  
  598.     jsr    pc,clean
  599.  
  600. 1:    mov    (sp),r0
  601.     bic    $777,r0        /get lowest multiple of 512.
  602.     mov    r0,0f
  603.     mov    r0,b1s(r2)    /set start
  604.     mov    afi,r0
  605.     sys    seek;0:..;0
  606.     mov    r1,0f
  607.     sys    read;0:..;512.
  608.  
  609.     mov    b1s(r2),b1e(r2)
  610.     add    $512.,b1e(r2)    / set end
  611.     clr    w1(r2)        /clear w
  612.     mov    (sp)+,r0
  613.     sub    b1s(r2),r0
  614.     add    r1,r0        / set r0=byte addr in buffer
  615.     mov    (sp)+,r1
  616.     mov    (sp)+,r3
  617.     rts    pc
  618. /
  619. /
  620. /    routine to wc a buffer
  621. /
  622. /    mov    buffer addr,r2
  623. /    mov    buffer addr+6,r1    beginning of buffer
  624. /    jsr    pc,clean
  625. /
  626. clean:
  627.     inc    stats+24.
  628.     mov    r0,-(sp)
  629.     mov    b1s(r2),0f
  630.     mov    afout,r0
  631.     sys    seek;0:..;0
  632.     mov    r1,0f
  633.     sys    write;0:..;512.
  634.  
  635.     clr    w1(r2)    /clear w
  636.     mov    (sp)+,r0
  637.     rts    pc
  638. /
  639. /
  640. /    routine to get buffer addr of byte whose disc
  641. /    addr is in r0 - also returns addr of write
  642. /    flag for buffer in r2
  643. /
  644. /    mov    disc addr,r0
  645. /    jsr    pc,bufchar
  646. /    mov    (r0),r0    for read
  647. /    inc    (r2)    for write must inc w
  648. /
  649. /    c-bit set if char not in either buffer
  650. /
  651. bufchar:
  652.     mov    r1,-(sp)
  653.     mov    r3,-(sp)
  654.     clr    r3
  655. 1:
  656.     mov    r3,r2
  657.     asl    r2
  658.     cmp    r0,b1s(r2)
  659.     blo    2f
  660.     cmp    r0,b1e(r2)
  661.     bhis    2f
  662.     sub    b1s(r2),r0
  663.     mov    r3,r1
  664.     ashc    $9.,r1
  665.     bic    $777,r1
  666.     add    r1,r0
  667.     add    $b1,r0
  668.     mov    (sp)+,r3
  669.     mov    (sp)+,r1
  670.     clc
  671.     rts    pc
  672. 2:
  673.     inc    r3
  674.     cmp    r3,$numb
  675.     blt    1b
  676.     mov    (sp)+,r3
  677.     mov    (sp)+,r1
  678.     sec
  679.     rts    pc
  680. /
  681. /
  682. /    routine to get a buffer
  683. /
  684. /    mov    disc addr,r0
  685. /    jsr    pc,getbuf
  686. /    mov    (r0),r0        (for read)
  687. /    inc    (r2)        must inc w for w
  688. /
  689. getbuf:
  690.     mov    r4,-(sp)
  691.     mov    r3,-(sp)
  692.     mov    $2,r3
  693.     clr    r2
  694.     mov    $1,r4
  695. 1:
  696.     cmp    r4,$numb
  697.     bge    1f
  698.     cmp    u1(r3),u1(r2)
  699.     bhis    2f
  700.     mov    r3,r2
  701. 2:
  702.     inc    r4
  703.     add    $2.,r3
  704.     br    1b
  705. 1:
  706.     mov    r2,r3
  707.     jsr    pc,getb
  708.     add    $stats+14.,r3
  709.     inc    (r3)
  710.     mov    (sp)+,r3
  711.     mov    (sp)+,r4
  712.     rts    pc
  713. /
  714. /
  715. /    this routine renumbers the time used cell u1(r2)
  716. /    of the buffers when the clock overflows
  717. /
  718. fixct:
  719.     mov    r1,-(sp)
  720.     mov    r3,-(sp)
  721.     mov    $numb,r1
  722.     mov    $numb,flag
  723. 2:
  724.     mov    r1,u1(r2)
  725.     dec    r1
  726.     bge    1f
  727.     mov    (sp)+,r3
  728.     mov    (sp)+,r1
  729.     rts    pc
  730. 1:
  731.     clr    r2
  732.     mov    $2,r3
  733. 1:
  734.     cmp    r3,$numb2
  735.     bge    2b
  736.     cmp    u1(r3),u1(r2)
  737.     blo    2f
  738.     mov    r3,r2
  739. 2:
  740.     add    $2,r3
  741.     br    1b
  742.