home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / texmf / source / TeX / amiga / amiasm0.asm next >
Encoding:
Assembly Source File  |  1993-10-31  |  8.3 KB  |  456 lines

  1.     SECTION "amiasm0.asm"
  2.  
  3.     XREF    _zzzaa
  4.     XREF    _avail
  5.     XREF    _memend
  6.     XREF    _memmax
  7.     XREF    _himemmin
  8.     XREF    _lomemmax
  9.     XREF    _runaway        ; function
  10.     XREF    _overflow        ; function
  11.     XREF    _dynused
  12.     XREF    _rover
  13.     XREF    _varused
  14.     XREF    _getnode_grow        ; function
  15.  
  16.  
  17. _getavail:
  18.  
  19.     movea.l    _zzzaa(a4),a0
  20.  
  21.     moveq    #0,d0
  22.     move.w    _avail(a4),d0        ; p = avail
  23.     beq.b    L_growavail
  24.  
  25.     move.l    d0,d1
  26.     asl.l    #2,d1
  27.     ;move.w    a0_(d1:l),_avail
  28.     move.w    00(a0,d1.l),_avail(a4)
  29.     bra.b    L_getavailend
  30.  
  31. L_growavail:
  32.     move.w _memend(a4),d0    ; p = memend
  33.     cmp.l _memmax(a4),d0
  34.     bge.b L_growdown
  35.  
  36.     addq.w #1,d0        ; kann nicht groesser als 65534 werden
  37.     move.w d0,_memend(a4)
  38.     bra.b L_beforeend
  39.  
  40. L_growdown:
  41.     subq.w #1,_himemmin(a4)
  42.     move.w _himemmin(a4),d0
  43.     move.w _lomemmax(a4),d1
  44.     cmp.w d0,d1
  45.     bcs.b L_beforeend
  46.  
  47.     jsr _runaway(pc)
  48.     move.l _memmax(a4),d1
  49.     addq.l #1,d1
  50.     move.l d1,-(sp)
  51.     pea (3).w
  52.     jsr _overflow(pc)
  53.     ; Not reached
  54.  
  55. L_beforeend:
  56.     move.l d0,d1
  57.     asl.l #2,d1
  58.  
  59. L_getavailend:
  60.     ;clr.w a0_(d1:l)
  61.     clr.w 00(a0,d1.l)
  62.     addq.l #1,_dynused(a4)
  63.     rts
  64.  
  65.  
  66. ;halfword getavail ( void )
  67. ;{ getavail_regmem
  68. ;  register halfword p ;
  69. ;
  70. ;  p = avail ;
  71. ;  if ( p != 0 ) {
  72. ;    avail = link ( p /* avail */ ) ;
  73. ;    link ( p ) = 0 ;
  74. ;  } else {
  75. ;    if ( memend < memmax ) {
  76. ;      incr ( memend ) ;
  77. ;      p = memend ;
  78. ;    } else {
  79. ;      decr ( himemmin ) ;
  80. ;      p = himemmin ;
  81. ;      if ( himemmin <= lomemmax ) {
  82. ;    runaway () ;
  83. ;    overflow ( 298 , memmax + 1 - memmin ) ;
  84. ;      }
  85. ;    }
  86. ;    link ( p ) = 0 ;
  87. ;  }
  88. ;
  89. ;#ifdef STAT
  90. ;  incr ( dynused ) ;
  91. ;#endif /* STAT */
  92. ;  return(p) ;
  93. ;}
  94.  
  95.  
  96.  
  97. _flushlist:
  98.     moveq #0,d0        ; [hi-word(d0) = 0  for this function]
  99.     move.l d0,a1        ; count = 0
  100.  
  101.     ;move.w sp_(6),d0        ; Argument (halfword) p
  102.     move.w 6(sp),d0            ; Argument (halfword) p
  103.     beq.b L_endflush
  104.  
  105.     move.l _zzzaa(a4),a0
  106.  
  107. L_loop:
  108.     addq.w #1,a1
  109.  
  110.     move.l d0,d1           ; q = r  ( = p )
  111.     asl.l  #2,d1
  112.     ;move.w a0_(d1:l),d0     ; r = link(q)
  113.     move.w 00(a0,d1.l),d0     ; r = link(q)
  114.     bne.b L_loop
  115.  
  116.     ;move.w _avail(a4),a0_(d1:l)
  117.     move.w _avail(a4),00(a0,d1.l)
  118.     ;move.w sp_(6),_avail(a4)
  119.     move.w 6(sp),_avail(a4)
  120.  
  121.     move.l a1,d0
  122.     sub.l  d0,_dynused(a4)
  123.  
  124. L_endflush:
  125.     rts
  126.  
  127. ;void flushlist ( halfword p )
  128. ;{ flushlist_regmem
  129. ;
  130. ;  if ( p != 0 ) {
  131. ;    register unsigned long /* halfword */ q, r;
  132. ;    register int count = 0L;
  133. ;
  134. ;    r = p ;
  135. ;    do {
  136. ;#ifdef STAT
  137. ;      /* decr ( dynused ) ; */
  138. ;      count++;
  139. ;#endif /* STAT */
  140. ;      q = r ;
  141. ;      r = link ( q /* r */ ) ;
  142. ;    } while ( r != 0 );
  143. ;
  144. ;    link ( q ) = avail ;
  145. ;    avail = p ;
  146. ;#ifdef STAT
  147. ;    dynused -= count;
  148. ;#endif /* STAT */
  149. ;  }
  150. ;}
  151.  
  152.  
  153. _getnode:
  154.     movem.l d2/d3/d4,-(sp)    ; #0x3800
  155.  
  156. L_restart:
  157.     move.l _zzzaa(a4),a0
  158.  
  159.     lea _rover(a4),a1        ; a1 = &rover
  160. ;/*
  161. ; Damit nicht laufend mit 'moveq #0,di ; move.w X,di' X auf long gebracht
  162. ; werden muss, wurde mit Vorsicht(!) die Hi-Words von d1 und d2 auf 0
  163. ; gelassen. (Bei Aenderungen beachten, da sonst nur ??? herauskommt)
  164. ;*/
  165.     moveq #0,d2
  166.     ;move.w a1_,d2        ; p = rover    /* hi_word = 0 */
  167.     move.w (a1),d2        ; p = rover    /* hi_word = 0 */
  168.  
  169. L_repeatloop:
  170.     move.l d2,d1        ; q = p        /* hi_word = 0 */
  171.  
  172. L_whileloop:
  173.     move.l d1,d0
  174.     asl.l  #2,d0        ; Adr(q)
  175.  
  176.     ;add.w a0_(2,d0:l),d1    ; q += nodesize(q)
  177.     add.w 2(a0,d0.l),d1    ; q += nodesize(q)
  178.  
  179.     move.l d1,d0        ; /* hi_word(q) ist noch 0 */
  180.     asl.l  #2,d0        ; Adr(q)
  181.  
  182.     ;cmp.w #65535,a0_(d0:l)
  183.     cmp.w #65535,00(a0,d0.l)
  184.     bne.b L_exitwhile
  185.  
  186.     moveq #0,d3
  187.     ;move.w a0_(4,d0:l),d3    ; t = rlink(q)
  188.     move.w 4(a0,d0.l),d3    ; t = rlink(q)
  189.  
  190.     cmp.w (a1),d1
  191.     bne.b L_notrover        ; if( q = rover )
  192.     move.w d3,(a1)        ;   rover = t;
  193. L_notrover:
  194.  
  195.     move.l d3,d4
  196.     asl.l  #2,d4        ; Adr(t)
  197.  
  198.     ;move.w a0_(6,d0:l),a0_(6,d4:l)    ; llink(t) = llink(q)
  199.     move.w 6(a0,d0.l),6(a0,d4.l)    ; llink(t) = llink(q)
  200.  
  201.     moveq #0,d4
  202.     ;move.w a0_(6,d0:l),d4    ; d4 = llink(q)
  203.     move.w 6(a0,d0.l),d4    ; d4 = llink(q)
  204.     asl.l #2,d4
  205.     ;move.w d3,a0_(4,d4:l)    ; rlink(d4) = t
  206.     move.w d3,4(a0,d4.l)    ; rlink(d4) = t
  207.  
  208.     bra.b L_whileloop
  209.  
  210. L_exitwhile:
  211.     ;move.l sp_(16),d4    ; !!! --->>>> hole Argument (long) s
  212.     move.l 16(sp),d4    ; !!! --->>>> hole Argument (long) s
  213.     move.l d1,d0
  214.     sub.l d4,d0        ; r = q - s ,  /* q in d1 */
  215.  
  216.     move.l d2,d3    ; d3 = p + 1
  217.     addq.l #1,d3
  218.     cmp.l d0,d3    ; if ( r > p + 1 )
  219.     bge.b L_too_short
  220.  
  221.     ;
  222.     ; es passt rein:
  223.     ;
  224.     move.l d2,d3
  225.     asl.l #2,d3        ; Adr(p)
  226.  
  227.     move.l d0,d1
  228.     sub.l d2,d1        ; d4 = r - p
  229.     ;move.w d1,a0_(2,d3:l)    ; nodesize(p) = r - p
  230.     move.w d1,2(a0,d3.l)    ; nodesize(p) = r - p
  231.  
  232.     move.w d2,(a1)        ; rover = p
  233.     ;
  234.     ; r ist jetzt in d0, s in d4
  235.     bra.b L_found
  236.  
  237. L_too_short:
  238.     cmp.l d0,d2        ; if ( r == p )
  239.     bne.b L_nextwhile
  240.  
  241.     move.l d2,d3
  242.     asl.l #2,d3
  243.     ;cmp.w a0_(4,d3:l),d2    ; if ( rlink(p) != p )
  244.     cmp.w 4(a0,d3.l),d2    ; if ( rlink(p) != p )
  245.     beq.b L_nextwhile
  246.  
  247.     moveq #0,d1
  248.     ;move.w a0_(4,d3:l),d1
  249.     move.w 4(a0,d3.l),d1
  250.     move.w d1,(a1)        ; rover = rlink(p)
  251.  
  252.     ;move.w a0_(6,d3:l),d2    ; t = llink(p)
  253.     move.w 6(a0,d3.l),d2    ; t = llink(p)
  254.  
  255.     asl.l #2,d1
  256.     ;move.w d2,a0_(6,d1:l)    ; llink(rover) = t
  257.     move.w d2,6(a0,d1.l)    ; llink(rover) = t
  258.  
  259.     asl.l #2,d2
  260.     ;move.w a1_,a0_(4,d2:l)    ; rlink(t) = rover
  261.     move.w (a1),4(a0,d2.l)    ; rlink(t) = rover
  262.     ;
  263.     ; r ist jetzt in d0, s in d4
  264.     bra.b L_found
  265.  
  266. L_nextwhile:
  267.     move.l d2,d3
  268.     asl.l #2,d3        ; Adr(p)
  269.  
  270.     sub.l d2,d1
  271.     ;move.w d1,a0_(2,d3:l)    ; nodesize(p) = q - p
  272.     move.w d1,2(a0,d3.l)    ; nodesize(p) = q - p
  273.  
  274.     ;move.w a0_(4,d3:l),d2    ; p = rlink(p)
  275.     move.w 4(a0,d3.l),d2    ; p = rlink(p)
  276.     cmp.w (a1),d2
  277.     bne.w L_repeatloop
  278.  
  279.     cmp.l #1073741824,d4
  280.     bne.b L_growmem
  281.  
  282.     move.l #65535,d0
  283.     bra.b L_exitgetnode
  284.  
  285. L_growmem:    ; wird nur sehr selten durchlaufen, ...
  286.     jsr _getnode_grow(pc)
  287.     bra.w L_restart
  288.  
  289.  
  290. L_found:            ; r ist in d0:l, s in d4:l
  291.     move.l d0,d1
  292.     asl.l  #2,d1
  293.     ;clr.w a0_(d1:l)        ; link(r) = 0
  294.     clr.w  00(a0,d1.l)        ; link(r) = 0
  295.  
  296.     add.l d4,_varused(a4)
  297.  
  298. L_exitgetnode:
  299.     movem.l (sp)+,d2/d3/d4    ; #0x3c
  300.     rts
  301.  
  302. ;halfword getnode ( integer s )
  303. ;{ getnode_regmem
  304. ;  register integer r;
  305. ;
  306. ;lab20:
  307. ;  { register halfword p;
  308. ;    register halfword q;
  309. ;    register halfword *roverPTR = &rover;
  310. ;#define rover  (*roverPTR)
  311. ;
  312. ;  p = rover ;
  313. ;  do {
  314. ;#if 0
  315. ;    q = p + nodesize ( p ) ;
  316. ;    while ( isempty ( q ) ) {
  317. ;      register halfword t;
  318. ;
  319. ;      t = rlink ( q ) ;
  320. ;      if ( q == rover )
  321. ;        rover = t ;
  322. ;      llink ( t ) = llink ( q ) ;
  323. ;      rlink ( llink ( q ) ) = t ;
  324. ;      q += nodesize ( q ) ;
  325. ;    }
  326. ;#else
  327. ;    q = p;
  328. ;    while(1) {
  329. ;      register halfword r;
  330. ;
  331. ;      q += nodesize ( q ) ;
  332. ;
  333. ;      if( ! isempty ( q ) )
  334. ;    break;
  335. ;
  336. ;      r = rlink ( q ) ;
  337. ;      if ( q == rover )
  338. ;        rover = r ;
  339. ;      llink ( r ) = llink ( q ) ;
  340. ;      rlink ( llink ( q ) ) = r ;
  341. ;    }
  342. ;#endif
  343. ;    r = q - s ;
  344. ;    if ( r > toint ( p + 1 ) ) {
  345. ;      nodesize ( p ) = r - p ;
  346. ;      rover = p ;
  347. ;      goto lab40 ;
  348. ;    }
  349. ;    if ( r == p ) {
  350. ;      if ( p != rlink ( p ) ) {
  351. ;#if 0
  352. ;    register integer t;
  353. ;
  354. ;    rover = rlink ( p ) ;
  355. ;    t = llink ( p ) ;
  356. ;    llink ( rover ) = t ;
  357. ;    rlink ( t ) = rover ;
  358. ;#else
  359. ;    q = llink ( p ) ;
  360. ;    p /* rover */ = rlink ( p ) ;
  361. ;    rlink ( q ) = p /* rover */ ;
  362. ;    llink ( p /* rover */ ) = q ;
  363. ;    rover = p;
  364. ;#endif
  365. ;    goto lab40 ;
  366. ;      }
  367. ;    }
  368. ;    nodesize ( p ) = q - p ;
  369. ;    p = rlink ( p ) ;
  370. ;  } while ( p != rover );
  371. ;
  372. ;  if ( s == 1073741824L )
  373. ;    return(maxhalfword);
  374. ;
  375. ;#undef rover
  376. ;  }
  377. ;
  378. ;  getnode_grow();
  379. ;  goto lab20;
  380. ;
  381. ;lab40:
  382. ;#ifdef STAT
  383. ;  varused += s ;
  384. ;#endif /* STAT */
  385. ;  link ( r ) = 0 ;
  386. ;  return(r);
  387. ;}
  388.  
  389.  
  390. _freenode:
  391.  
  392.     move.l _zzzaa(a4),a0
  393.  
  394.     moveq #0,d0
  395.     move.w 6(sp),d0        ; Argument (halfword) p
  396.  
  397.     move.l d0,d1
  398.     asl.l #2,d1
  399.     ;lea a0_(d1:l),a1    ; Adr. von p
  400.     lea 00(a0,d1.l),a1    ; Adr. von p
  401.  
  402.     moveq #0,d1
  403.     move.w 10(sp),d1    ; Argument (halfword) s
  404.  
  405.     sub.l d1,_varused(a4)    ; varused -= s
  406.  
  407.     move.w #65535,(a1)+    ; link(p) = emptyflag
  408.     move.w d1,(a1)+        ; nodesize(p) = s
  409.  
  410.     move.w _rover(a4),d1
  411.     move.w d1,(a1)+        ; rlink(p) = rover
  412.  
  413.     move.l d2,-(sp)
  414.  
  415.     move.l d1,d2
  416.     asl.l #2,d2
  417.     ;move.w a0_(6,d2:l),d1    ; q = llink(rover)
  418.     move.w 6(a0,d2.l),d1    ; q = llink(rover)
  419.     ;move.w d0,a0_(6,d2:l)    ; llink(rover) = p
  420.     move.w d0,6(a0,d2.l)    ; llink(rover) = p
  421.  
  422.     move.l (sp)+,d2
  423.  
  424.     move.w d1,(a1)        ; llink(p) = q
  425.     asl.l #2,d1
  426.     ;move.w d0,a0_(4,d1:l)    ; rlink(q) = p
  427.     move.w d0,4(a0,d1.l)    ; rlink(q) = p
  428.     rts
  429.  
  430. ;void freenode ( halfword p, halfword s )
  431. ;{ freenode_regmem
  432. ;
  433. ;#ifdef STAT
  434. ;  varused -= s ;
  435. ;#endif /* STAT */
  436. ;  nodesize ( p ) = s ;
  437. ;  link ( p ) = emptyflag ;
  438. ;
  439. ;  { register halfword q ;
  440. ;    register halfword r_rover = rover;    /* (br) constant */
  441. ;
  442. ;  q = llink ( r_rover ) ;
  443. ;  rlink ( p ) = r_rover ;
  444. ;  llink ( p ) = q ;
  445. ;  rlink ( q ) = p ;
  446. ;  llink ( r_rover ) = p ;
  447. ;  }
  448. ;}
  449.  
  450.     XDEF    _getavail
  451.     XDEF    _flushlist
  452.     XDEF    _getnode
  453.     XDEF    _freenode
  454.  
  455.     END
  456.