home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / sys / conf / mch.s < prev    next >
Encoding:
Text File  |  1998-02-03  |  12.4 KB  |  1,059 lines

  1. / machine language assist
  2. / for 11/45 or 11/70 CPUs
  3.  
  4.  
  5. / non-UNIX instructions
  6. mfpi    = 6500^tst
  7. stst    = 170300^tst
  8. mtpi    = 6600^tst
  9. mfpd    = 106500^tst
  10. mtpd    = 106600^tst
  11. spl    = 230
  12. ldfps    = 170100^tst
  13. stfps    = 170200^tst
  14. wait    = 1
  15. rtt    = 6
  16. reset    = 5
  17.  
  18. .PROFIL    = 0
  19. HIPRI    = 340
  20. HIGH    = 7
  21.     .if    .PROFIL
  22. HIGH    = 6
  23. HIPRI    = 300
  24.     .endif
  25.  
  26. / Mag tape dump
  27. / save registers in low core and
  28. / write all core onto mag tape.
  29. / entry is thru 44 abs
  30.  
  31. .data
  32. .globl    dump
  33. dump:
  34.  
  35. / save regs r0,r1,r2,r3,r4,r5,r6,KIA6
  36. / starting at abs location 4
  37.  
  38.     mov    r0,4
  39.     mov    $6,r0
  40.     mov    r1,(r0)+
  41.     mov    r2,(r0)+
  42.     mov    r3,(r0)+
  43.     mov    r4,(r0)+
  44.     mov    r5,(r0)+
  45.     mov    sp,(r0)+
  46.     mov    KDSA6,(r0)+
  47.  
  48. / dump all of core (ie to first mt error)
  49. / onto mag tape. (9 track or 7 track 'binary')
  50.  
  51. .if HTDUMP
  52.     mov    $HTCS1,r0
  53.     mov    $40,*$HTCS2
  54.     mov    $2300,*$HTTC
  55.     clr    *$HTBA
  56.     mov    $1,(r0)
  57. 1:
  58.     mov    $-512.,*$HTFC
  59.     mov    $-256.,*$HTWC
  60.     movb    $61,(r0)
  61. 2:
  62.     tstb    (r0)
  63.     bge    2b
  64.     bit    $1,(r0)
  65.     bne    2b
  66.     bit    $40000,(r0)
  67.     beq    1b
  68.     mov    $27,(r0)
  69. .endif
  70. HT    = 0172440
  71. HTCS1    = HT+0
  72. HTWC    = HT+2
  73. HTBA    = HT+4
  74. HTFC    = HT+6
  75. HTCS2    = HT+10
  76. HTTC    = HT+32
  77.  
  78. MTC = 172522
  79. .if TUDUMP
  80.     mov    $MTC,r0
  81.     mov    $60004,(r0)+
  82.     clr    2(r0)
  83. 1:
  84.     mov    $-512.,(r0)
  85.     inc    -(r0)
  86. 2:
  87.     tstb    (r0)
  88.     bge    2b
  89.     tst    (r0)+
  90.     bge    1b
  91.     reset
  92.  
  93. / end of file and loop
  94.  
  95.     mov    $60007,-(r0)
  96. .endif
  97.     br    .
  98.  
  99. .text
  100. .globl    start, _end, _edata, _etext, _main
  101.  
  102. / 11/45 and 11/70 startup.
  103. / entry is thru 0 abs.
  104. / since core is shuffled,
  105. / this code can be executed but once
  106.  
  107. start:
  108.     bit    $1,SSR0
  109.     beq    1f
  110.     mov    $trap,34
  111.     mov    $trap,0
  112.     mov    $340+15.,2
  113.     bit    $20,SSR3
  114.     beq    9f
  115.     mov    $70.,_cputype
  116.     mov    $3,*$MSCR
  117. 9:
  118.     clr    PS
  119.     br    9f
  120. 1:
  121.     inc    $-1
  122.     bne    .
  123.     reset
  124. / Set loc. 0 to trap to system, in case of
  125. / hardware glitch
  126.     mov    $trap,0        / in case of bad trap through 0
  127.     mov    $340+15.,2    / high pri, trap type 15
  128.     clr    PS
  129.  
  130. / set KI0 to physical 0
  131.  
  132.     mov    $77406,r3
  133.     mov    $KISA0,r0
  134.     mov    $KISD0,r1
  135.     clr    (r0)+
  136.     mov    r3,(r1)+
  137.  
  138. / set KI1-6 to eventual text resting place
  139.  
  140.     mov    $_end+63.,r2
  141.     ash    $-6,r2
  142.     bic    $!1777,r2
  143. 1:
  144.     mov    r2,(r0)+
  145.     mov    r3,(r1)+
  146.     add    $200,r2
  147.     cmp    r0,$KISA7
  148.     blos    1b
  149.  
  150. / set KI7 to IO seg for escape
  151.  
  152.     mov    $IO,-(r0)
  153.  
  154. / set KD0-7 to physical
  155.  
  156.     mov    $KDSA0,r0
  157.     mov    $KDSD0,r1
  158.     clr    r2
  159. 1:
  160.     mov    r2,(r0)+
  161.     mov    r3,(r1)+
  162.     add    $200,r2
  163.     cmp    r0,$KDSA7
  164.     blos    1b
  165.  
  166. / initialization
  167. / get a temp (1-word) stack
  168. / turn on segmentation
  169. / copy text to I space
  170. / clear bss in D space
  171.  
  172.     mov    $stk+2,sp
  173.     mov    $65,SSR3        / 22-bit, map, K+U sep
  174.     bit    $20,SSR3
  175.     beq    1f
  176.     mov    $70.,_cputype
  177.     mov    $3,*$MSCR        / Disable UNIBUS traps, non-fatal traps
  178. 1:
  179.     inc    SSR0
  180.     mov    $_etext+100,r2
  181.     mov    $_edata+100,r1
  182.     add    $_etext-8192.,r1
  183. 1:
  184.     mov    -(r1),-(sp)
  185.     mtpi    -(r2)
  186.     cmp    r1,$_edata
  187.     bhi    1b
  188. 1:
  189.     clr    (r1)+
  190.     cmp    r1,$_end
  191.     blo    1b
  192.  
  193. / use KI escape to set KD7 to IO seg
  194. / set KD6 to first available core
  195. / If profiling, snag supervisor registers.
  196.  
  197.     mov    $IO,-(sp)
  198.     mtpi    *$KDSA7
  199. 9:
  200.     mov    $_etext-8192.+63.,r2
  201.     ash    $-6,r2
  202.     bic    $!1777,r2
  203.     add    KISA1,r2
  204.     .if    .PROFIL
  205.     mov    r2,SISA2
  206.     mov    r2,_proloc
  207.     mov    $77406,SISD2
  208.     add    $200,r2
  209.     mov    r2,SISA2+2
  210.     mov    $77406,SISD2+2
  211.     add    $200,r2
  212.     .endif
  213.     mov    r2,KDSA6
  214.  
  215. / Turn off write permission on kernel text
  216. / Take stuff above data out of address space
  217.  
  218.     mov    $KISD0,r0
  219. 1:
  220.     mov    $77402,(r0)+
  221.     cmp    r0,$KISD7
  222.     blos    1b
  223.  
  224.     mov    $_end+63.,r0
  225.     ash    $-6,r0
  226.     bic    $!1777,r0
  227.     mov    $KDSD0,r1
  228. 1:
  229.     cmp    r0,$200
  230.     bge    2f
  231.     dec    r0
  232.     bge    4f
  233.     clr    (r1)
  234.     br    3f
  235. 4:
  236.     movb    r0,1(r1)
  237.     br    3f
  238. 2:
  239.     movb    $177,1(r1)
  240. 3:
  241.     tst    (r1)+
  242.     sub    $200,r0
  243.     cmp    r1,$KDSD5
  244.     blos    1b
  245.  
  246. / set up supervisor D registers
  247.  
  248. 9:
  249.     mov    $6,SISD0
  250.     mov    $6,SISD1
  251.  
  252. / set up real sp
  253. / clear user block
  254. / test for floating point hardware
  255.  
  256.     mov    $_u+[usize*64.],sp
  257.     mov    $1f,nofault
  258.     setd            / jump to 1f if this traps
  259.     inc    fpp
  260. 1:
  261.     clr    nofault
  262.     mov    $_u,r0
  263. 1:
  264.     clr    (r0)+
  265.     cmp    r0,sp
  266.     blo    1b
  267.     .if    .PROFIL
  268.     mov    $40000,r0
  269.     mov    $10000,PS    / prev = super
  270. 1:
  271.     clr    -(sp)
  272.     mtpi    (r0)+
  273.     cmp    r0,$100000
  274.     blo    1b
  275.     jsr    pc,_isprof
  276.     .endif
  277.  
  278. / set up previous mode and call main
  279. / on return, enter user mode at 0R
  280.  
  281.     mov    $30000,PS
  282.     jsr    pc,_main
  283.     mov    $170000,-(sp)
  284.     clr    -(sp)
  285.     rtt
  286.  
  287. .globl    _rkboot, _rpboot
  288. _rkboot:
  289.     jmp    *$173000
  290.  
  291. _rpboot:
  292.     jmp    *$173006
  293.  
  294.  
  295. .globl    trap, call
  296. .globl    _trap
  297.  
  298. / all traps and interrupts are
  299. / vectored thru this routine.
  300.  
  301. trap:
  302.     mov    PS,saveps
  303.     tst    nofault
  304.     bne    1f
  305.     mov    SSR0,ssr
  306.     mov    SSR1,ssr+2
  307.     mov    SSR2,ssr+4
  308.     mov    $1,SSR0
  309.     jsr    r0,call1; jmp _trap
  310.     / no return
  311. 1:
  312.     mov    $1,SSR0
  313.     mov    nofault,(sp)
  314.     rtt
  315. .text
  316.  
  317. .globl    _runrun
  318. call1:
  319.     mov    saveps,-(sp)
  320.     spl    0
  321.     br    1f
  322.  
  323. call:
  324.     mov    PS,-(sp)
  325. 1:
  326.     mov    r1,-(sp)
  327.     mfpd    sp
  328.     mov    4(sp),-(sp)
  329.     bic    $!37,(sp)
  330.     bit    $30000,PS
  331.     beq    1f
  332.     jsr    pc,(r0)+
  333.     tstb    _runrun
  334.     beq    2f
  335.     mov    $12.,(sp)        / trap 12 is give up cpu
  336.     jsr    pc,_trap
  337. 2:
  338.     tst    (sp)+
  339.     mtpd    sp
  340.     br    2f
  341. 1:
  342.     bis    $30000,PS
  343.     jsr    pc,(r0)+
  344.     cmp    (sp)+,(sp)+
  345. 2:
  346.     mov    (sp)+,r1
  347.     tst    (sp)+
  348.     mov    (sp)+,r0
  349.     rtt
  350.  
  351. .globl    _savfp
  352. _savfp:
  353.     tst    fpp
  354.     beq    9f        / No FP hardware
  355.     mov    2(sp),r1
  356.     stfps    (r1)+
  357.     setd
  358.     movf    fr0,(r1)+
  359.     movf    fr1,(r1)+
  360.     movf    fr2,(r1)+
  361.     movf    fr3,(r1)+
  362.     movf    fr4,fr0
  363.     movf    fr0,(r1)+
  364.     movf    fr5,fr0
  365.     movf    fr0,(r1)+
  366. 9:
  367.     rts    pc
  368.  
  369. .globl    _restfp
  370. _restfp:
  371.     tst    fpp
  372.     beq    9f
  373.     mov    2(sp),r1
  374.     mov    r1,r0
  375.     setd
  376.     add    $8.+2.,r1
  377.     movf    (r1)+,fr1
  378.     movf    (r1)+,fr2
  379.     movf    (r1)+,fr3
  380.     movf    (r1)+,fr0
  381.     movf    fr0,fr4
  382.     movf    (r1)+,fr0
  383.     movf    fr0,fr5
  384.     movf    2(r0),fr0
  385.     ldfps    (r0)
  386. 9:
  387.     rts    pc
  388.  
  389. .globl    _stst
  390. _stst:
  391.     tst    fpp
  392.     beq    9f
  393.     stst    r0
  394.     mov    r0,*2(sp)
  395. 9:
  396.     rts    pc
  397.  
  398. .globl    _addupc
  399. _addupc:
  400.     mov    r2,-(sp)
  401.     mov    6(sp),r2    / base of prof with base,leng,off,scale
  402.     mov    4(sp),r0    / pc
  403.     sub    4(r2),r0    / offset
  404.     clc
  405.     ror    r0
  406.     mov    6(r2),r1
  407.     clc
  408.     ror    r1
  409.     mul    r1,r0        / scale
  410.     ashc    $-14.,r0
  411.     inc    r1
  412.     bic    $1,r1
  413.     cmp    r1,2(r2)    / length
  414.     bhis    1f
  415.     add    (r2),r1        / base
  416.     mov    nofault,-(sp)
  417.     mov    $2f,nofault
  418.     mfpd    (r1)
  419.     add    12.(sp),(sp)
  420.     mtpd    (r1)
  421.     br    3f
  422. 2:
  423.     clr    6(r2)
  424. 3:
  425.     mov    (sp)+,nofault
  426. 1:
  427.     mov    (sp)+,r2
  428.     rts    pc
  429.  
  430. .globl    _display
  431. _display:
  432.     dec    dispdly
  433.     bge    2f
  434.     clr    dispdly
  435.     mov    PS,-(sp)
  436.     mov    $HIPRI,PS
  437.     mov    CSW,r1
  438.     bit    $1,r1
  439.     beq    1f
  440.     bis    $30000,PS
  441.     dec    r1
  442. 1:
  443.     jsr    pc,fuword
  444.     mov    r0,CSW
  445.     mov    (sp)+,PS
  446.     cmp    r0,$-1
  447.     bne    2f
  448.     mov    $120.,dispdly        / 2 sec delay after CSW fault
  449. 2:
  450.     rts    pc
  451.  
  452. .globl    _backup
  453. .globl    _regloc
  454. _backup:
  455.     mov    2(sp),r0
  456.     movb    ssr+2,r1
  457.     jsr    pc,1f
  458.     movb    ssr+3,r1
  459.     jsr    pc,1f
  460.     movb    _regloc+7,r1
  461.     asl    r1
  462.     add    r0,r1
  463.     mov    ssr+4,(r1)
  464.     clr    r0
  465. 2:
  466.     rts    pc
  467. 1:
  468.     mov    r1,-(sp)
  469.     asr    (sp)
  470.     asr    (sp)
  471.     asr    (sp)
  472.     bic    $!7,r1
  473.     movb    _regloc(r1),r1
  474.     asl    r1
  475.     add    r0,r1
  476.     sub    (sp)+,(r1)
  477.     rts    pc
  478.  
  479.  
  480. .globl    _fubyte, _subyte
  481. .globl    _fuword, _suword
  482. .globl    _fuibyte, _suibyte
  483. .globl    _fuiword, _suiword
  484. _fuibyte:
  485.     mov    2(sp),r1
  486.     bic    $1,r1
  487.     jsr    pc,giword
  488.     br    2f
  489.  
  490. _fubyte:
  491.     mov    2(sp),r1
  492.     bic    $1,r1
  493.     jsr    pc,gword
  494.  
  495. 2:
  496.     cmp    r1,2(sp)
  497.     beq    1f
  498.     swab    r0
  499. 1:
  500.     bic    $!377,r0
  501.     rts    pc
  502.  
  503. _suibyte:
  504.     mov    2(sp),r1
  505.     bic    $1,r1
  506.     jsr    pc,giword
  507.     mov    r0,-(sp)
  508.     cmp    r1,4(sp)
  509.     beq    1f
  510.     movb    6(sp),1(sp)
  511.     br    2f
  512. 1:
  513.     movb    6(sp),(sp)
  514. 2:
  515.     mov    (sp)+,r0
  516.     jsr    pc,piword
  517.     clr    r0
  518.     rts    pc
  519.  
  520. _subyte:
  521.     mov    2(sp),r1
  522.     bic    $1,r1
  523.     jsr    pc,gword
  524.     mov    r0,-(sp)
  525.     cmp    r1,4(sp)
  526.     beq    1f
  527.     movb    6(sp),1(sp)
  528.     br    2f
  529. 1:
  530.     movb    6(sp),(sp)
  531. 2:
  532.     mov    (sp)+,r0
  533.     jsr    pc,pword
  534.     clr    r0
  535.     rts    pc
  536.  
  537. _fuiword:
  538.     mov    2(sp),r1
  539. fuiword:
  540.     jsr    pc,giword
  541.     rts    pc
  542.  
  543. _fuword:
  544.     mov    2(sp),r1
  545. fuword:
  546.     jsr    pc,gword
  547.     rts    pc
  548.  
  549. giword:
  550.     mov    PS,-(sp)
  551.     spl    HIGH
  552.     mov    nofault,-(sp)
  553.     mov    $err,nofault
  554.     mfpi    (r1)
  555.     mov    (sp)+,r0
  556.     br    1f
  557.  
  558. gword:
  559.     mov    PS,-(sp)
  560.     spl    HIGH
  561.     mov    nofault,-(sp)
  562.     mov    $err,nofault
  563.     mfpd    (r1)
  564.     mov    (sp)+,r0
  565.     br    1f
  566.  
  567. _suiword:
  568.     mov    2(sp),r1
  569.     mov    4(sp),r0
  570. suiword:
  571.     jsr    pc,piword
  572.     rts    pc
  573.  
  574. _suword:
  575.     mov    2(sp),r1
  576.     mov    4(sp),r0
  577. suword:
  578.     jsr    pc,pword
  579.     rts    pc
  580.  
  581. piword:
  582.     mov    PS,-(sp)
  583.     spl    HIGH
  584.     mov    nofault,-(sp)
  585.     mov    $err,nofault
  586.     mov    r0,-(sp)
  587.     mtpi    (r1)
  588.     br    1f
  589.  
  590. pword:
  591.     mov    PS,-(sp)
  592.     spl    HIGH
  593.     mov    nofault,-(sp)
  594.     mov    $err,nofault
  595.     mov    r0,-(sp)
  596.     mtpd    (r1)
  597. 1:
  598.     mov    (sp)+,nofault
  599.     mov    (sp)+,PS
  600.     rts    pc
  601.  
  602. err:
  603.     mov    (sp)+,nofault
  604.     mov    (sp)+,PS
  605.     tst    (sp)+
  606.     mov    $-1,r0
  607.     rts    pc
  608.  
  609. .globl    _copyin, _copyout
  610. .globl    _copyiin, _copyiout
  611. _copyiin:
  612.     jsr    pc,copsu
  613. 1:
  614.     mfpi    (r0)+
  615.     mov    (sp)+,(r1)+
  616.     sob    r2,1b
  617.     br    2f
  618.  
  619. _copyin:
  620.     jsr    pc,copsu
  621. 1:
  622.     mfpd    (r0)+
  623.     mov    (sp)+,(r1)+
  624.     sob    r2,1b
  625.     br    2f
  626.  
  627. _copyiout:
  628.     jsr    pc,copsu
  629. 1:
  630.     mov    (r0)+,-(sp)
  631.     mtpi    (r1)+
  632.     sob    r2,1b
  633.     br    2f
  634.  
  635. _copyout:
  636.     jsr    pc,copsu
  637. 1:
  638.     mov    (r0)+,-(sp)
  639.     mtpd    (r1)+
  640.     sob    r2,1b
  641. 2:
  642.     mov    (sp)+,nofault
  643.     mov    (sp)+,r2
  644.     clr    r0
  645.     rts    pc
  646.  
  647. copsu:
  648.     mov    (sp)+,r0
  649.     mov    r2,-(sp)
  650.     mov    nofault,-(sp)
  651.     mov    r0,-(sp)
  652.     mov    10(sp),r0
  653.     mov    12(sp),r1
  654.     mov    14(sp),r2
  655.     asr    r2
  656.     mov    $1f,nofault
  657.     rts    pc
  658.  
  659. 1:
  660.     mov    (sp)+,nofault
  661.     mov    (sp)+,r2
  662.     mov    $-1,r0
  663.     rts    pc
  664.  
  665. .globl    _idle, _waitloc
  666. _idle:
  667.     mov    PS,-(sp)
  668.     spl    0
  669.     wait
  670. waitloc:
  671.     mov    (sp)+,PS
  672.     rts    pc
  673.  
  674.     .data
  675. _waitloc:
  676.     waitloc
  677.     .text
  678.  
  679. .globl    _save
  680. _save:
  681.     mov    (sp)+,r1
  682.     mov    (sp),r0
  683.     mov    r2,(r0)+
  684.     mov    r3,(r0)+
  685.     mov    r4,(r0)+
  686.     mov    r5,(r0)+
  687.     mov    sp,(r0)+
  688.     mov    r1,(r0)+
  689.     clr    r0
  690.     jmp    (r1)
  691.  
  692.     .globl    _resume
  693. _resume:
  694.     mov    2(sp),r0        / new process
  695.     mov    4(sp),r1        / new stack
  696.     spl    7
  697.     mov    r0,KDSA6        / In new process
  698.     mov    (r1)+,r2
  699.     mov    (r1)+,r3
  700.     mov    (r1)+,r4
  701.     mov    (r1)+,r5
  702.     mov    (r1)+,sp
  703.     mov    $1,r0
  704.     spl    0
  705.     jmp    *(r1)+
  706.  
  707. .globl    _spl0, _spl1, _spl4, _spl5, _spl6, _spl7, _splx
  708. _spl0:
  709.     mov    PS,r0
  710.     spl    0
  711.     rts    pc
  712.  
  713. _spl1:
  714.     mov    PS,r0
  715.     spl    1
  716.     rts    pc
  717.  
  718. _spl4:
  719.     mov    PS,r0
  720.     spl    4
  721.     rts    pc
  722.  
  723. _spl5:
  724.     mov    PS,r0
  725.     spl    5
  726.     rts    pc
  727.  
  728. _spl6:
  729.     mov    PS,r0
  730.     spl    6
  731.     rts    pc
  732.  
  733. _spl7:
  734.     mov    PS,r0
  735.     spl    HIGH
  736.     rts    pc
  737.  
  738. _splx:
  739.     mov    2(sp),PS
  740.     rts    pc
  741.  
  742. .globl    _copyseg
  743. _copyseg:
  744.     mov    PS,-(sp)
  745.     mov    4(sp),SISA0
  746.     mov    6(sp),SISA1
  747.     mov    $10000+HIPRI,PS
  748.     mov    r2,-(sp)
  749.     clr    r0
  750.     mov    $8192.,r1
  751.     mov    $32.,r2
  752. 1:
  753.     mfpd    (r0)+
  754.     mtpd    (r1)+
  755.     sob    r2,1b
  756.     mov    (sp)+,r2
  757.     mov    (sp)+,PS
  758.     rts    pc
  759.  
  760. .globl    _clearseg
  761. _clearseg:
  762.     mov    PS,-(sp)
  763.     mov    4(sp),SISA0
  764.     mov    $10000+HIPRI,PS
  765.     clr    r0
  766.     mov    $32.,r1
  767. 1:
  768.     clr    -(sp)
  769.     mtpd    (r0)+
  770.     sob    r1,1b
  771.     mov    (sp)+,PS
  772.     rts    pc
  773.  
  774. / Long quotient
  775.  
  776.     .globl    ldiv
  777. ldiv:
  778.     jsr    r5,csv
  779.     mov    10.(r5),r3
  780.     sxt    r4
  781.     bpl    1f
  782.     neg    r3
  783. 1:
  784.     cmp    r4,8.(r5)
  785.     bne    hardldiv
  786.     mov    6.(r5),r2
  787.     mov    4.(r5),r1
  788.     bge    1f
  789.     neg    r1
  790.     neg    r2
  791.     sbc    r1
  792.     com    r4
  793. 1:
  794.     mov    r4,-(sp)
  795.     clr    r0
  796.     div    r3,r0
  797.     mov    r0,r4        /high quotient
  798.     mov    r1,r0
  799.     mov    r2,r1
  800.     div    r3,r0
  801.     bvc    1f
  802.     sub    r3,r0        / this is the clever part
  803.     div    r3,r0
  804.     tst    r1
  805.     sxt    r1
  806.     add    r1,r0        / cannot overflow!
  807. 1:
  808.     mov    r0,r1
  809.     mov    r4,r0
  810.     tst    (sp)+
  811.     bpl    9f
  812.     neg    r0
  813.     neg    r1
  814.     sbc    r0
  815. 9:
  816.     jmp    cret
  817.  
  818. hardldiv:
  819.     4
  820.  
  821. / Long remainder
  822.  
  823.     .globl    lrem
  824. lrem:
  825.     jsr    r5,csv
  826.     mov    10.(r5),r3
  827.     sxt    r4
  828.     bpl    1f
  829.     neg    r3
  830. 1:
  831.     cmp    r4,8.(r5)
  832.     bne    hardlrem
  833.     mov    6.(r5),r2
  834.     mov    4.(r5),r1
  835.     mov    r1,r4
  836.     bge    1f
  837.     neg    r1
  838.     neg    r2
  839.     sbc    r1
  840. 1:
  841.     clr    r0
  842.     div    r3,r0
  843.     mov    r1,r0
  844.     mov    r2,r1
  845.     div    r3,r0
  846.     bvc    1f
  847.     sub    r3,r0
  848.     div    r3,r0
  849.     tst    r1
  850.     beq    9f
  851.     add    r3,r1
  852. 1:
  853.     tst    r4
  854.     bpl    9f
  855.     neg    r1
  856. 9:
  857.     sxt    r0
  858.     jmp    cret
  859.  
  860. / The divisor is known to be >= 2^15.  Only 16 cycles are
  861. / needed to get a remainder.
  862. hardlrem:
  863.     4
  864.  
  865. /.globl    lmul
  866. /lmul:
  867. /    mov    r2,-(sp)
  868. /    mov    r3,-(sp)
  869. /    mov    8(sp),r2
  870. /    sxt    r1
  871. /    sub    6(sp),r1
  872. /    mov    12.(sp),r0
  873. /    sxt    r3
  874. /    sub    10.(sp),r3
  875. /    mul    r0,r1
  876. /    mul    r2,r3
  877. /    add    r1,r3
  878. /    mul    r2,r0
  879. /    sub    r3,r0
  880. /    mov    (sp)+,r3
  881. /    mov    (sp)+,r2
  882. /    rts    pc
  883.  
  884. .globl    csv
  885. csv:
  886.     mov    r5,r0
  887.     mov    sp,r5
  888.     mov    r4,-(sp)
  889.     mov    r3,-(sp)
  890.     mov    r2,-(sp)
  891.     jsr    pc,(r0)
  892.  
  893. .globl    cret
  894. cret:
  895.     mov    r5,r2
  896.     mov    -(r2),r4
  897.     mov    -(r2),r3
  898.     mov    -(r2),r2
  899.     mov    r5,sp
  900.     mov    (sp)+,r5
  901.     rts    pc
  902.  
  903. .globl    _u
  904. _u    = 140000
  905. usize    = 16.
  906.  
  907. CSW    = 177570
  908. PS    = 177776
  909. SSR0    = 177572
  910. SSR1    = 177574
  911. SSR2    = 177576
  912. SSR3    = 172516
  913. KISA0    = 172340
  914. KISA1    = 172342
  915. KISA7    = 172356
  916. KISD0    = 172300
  917. KISD7    = 172316
  918. KDSA0    = 172360
  919. KDSA6    = 172374
  920. KDSA7    = 172376
  921. KDSD0    = 172320
  922. KDSD5    = 172332
  923. SISA0    = 172240
  924. SISA1    = 172242
  925. SISA2    = 172244
  926. SISD0    = 172200
  927. SISD1    = 172202
  928. SISD2    = 172204
  929. MSCR    = 017777746    / 11/70 memory control register
  930. IO    = 177600
  931.  
  932. SWR    = 177570
  933. .data
  934. .globl    _ka6
  935. .globl    _cputype
  936.  
  937. _ka6:    KDSA6
  938. _cputype:45.
  939. stk:    0
  940.  
  941. .bss
  942. nofault:.=.+2
  943. fpp:    .=.+2
  944. ssr:    .=.+6
  945. dispdly:.=.+2
  946. saveps:    .=.+2
  947.  
  948. .text
  949. / system profiler
  950. /  Expects to have a KW11-P in addition to the line-frequency
  951. /  clock, and it should be set to BR7.
  952. /  Uses supervisor I space register 2&3 (40000-100000)
  953. /  to maintain the profile.
  954.  
  955.     .if    .PROFIL
  956. CCSB    = 172542
  957. CCSR    = 172540
  958.  
  959. .globl    _sprof, _xprobuf, _probsiz, _mode
  960. _probsiz = 37777
  961.  
  962. _isprof:
  963.     mov    $1f,nofault
  964.     mov    $_sprof,104    / interrupt
  965.     mov    $340,106    / pri
  966.     mov    $100.,CCSB    / count set = 100
  967.     mov    $113,CCSR    / count down, 10kHz, repeat
  968. 1:
  969.     clr    nofault
  970.     rts    pc
  971.  
  972. _sprof:
  973.     mov    r0,-(sp)
  974.     mov    PS,r0
  975.     ash    $-10.,r0
  976.     bic    $!14,r0
  977.     add    $1,_mode+2(r0)
  978.     adc    _mode(r0)
  979.     cmp    r0,$14        / user
  980.     beq    done
  981.     mov    2(sp),r0    / pc
  982.     asr    r0
  983.     asr    r0
  984.     bic    $140001,r0
  985.     cmp    r0,$_probsiz
  986.     blo    1f
  987.     inc    _outside
  988.     br    done
  989. 1:
  990.     mov    $10340,PS        / prev = super
  991.     mfpi    40000(r0)
  992.     inc    (sp)
  993.     mtpi    40000(r0)
  994.     bne    done
  995.     mov    r1,-(sp)
  996.     mov    $_xprobuf,r1
  997. 2:
  998.     cmp    (r1)+,r0
  999.     bne    3f
  1000.     inc    (r1)
  1001.     br    4f
  1002. 3:
  1003.     tst    (r1)+
  1004.     bne    2b
  1005.     sub    $4,r1
  1006.     mov    r0,(r1)+
  1007.     mov    $1,(r1)+
  1008. 4:
  1009.     mov    (sp)+,r1
  1010. done:
  1011.     mov    (sp)+,r0
  1012.     mov    $113,CCSR
  1013.     rtt
  1014.  
  1015. / count subroutine calls during profiling
  1016. /  of the system.
  1017.  
  1018. .globl    mcount, _profcnts, _profsize
  1019.  
  1020. .bss
  1021. _profcnts:
  1022.     .=.+[6*340.]
  1023.  
  1024. .globl countbase
  1025. .data
  1026. countbase:
  1027.     _profcnts
  1028. _profsize:
  1029.     340.
  1030. .text
  1031.  
  1032. mcount:
  1033.     mov    (r0),r1
  1034.     bne    1f
  1035.     mov    countbase,r1
  1036.     beq    2f
  1037.     add    $6,countbase
  1038.     cmp    countbase,$_profcnts+[6*340.]
  1039.     blo    3f
  1040.     clr    countbase
  1041.     rts    pc
  1042. 3:
  1043.     mov    (sp),(r1)+
  1044.     mov    r1,(r0)
  1045. 1:
  1046.     inc    2(r1)
  1047.     bne    2f
  1048.     inc    (r1)
  1049. 2:
  1050.     rts    pc
  1051.  
  1052. .bss
  1053. _xprobuf:.=.+512.
  1054. _proloc:.=.+2
  1055. _mode:    .=.+16.
  1056. _outside: .=.+2
  1057.  
  1058.     .endif
  1059.