home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / enterprs / c128 / util / sfxsrc.arc / UPDATE.A < prev   
Encoding:
Text File  |  1990-02-12  |  6.5 KB  |  302 lines

  1. ; update.a
  2. ;──────────────────────────────────────────────────────────────────────────────
  3. ; LHARC self extraction code for C64/C128 -     Copyright 1990 Chris Smeets
  4. ;──────────────────────────────────────────────────────────────────────────────
  5. ; Update() is the function responsible for the majority of the execution time
  6. ; during extraction.
  7.  
  8.             INSTXT "sfx.i"
  9.  
  10.             EXT freq
  11.             EXT prnt
  12.             EXT son
  13.             EXT Reconst
  14.  
  15.             PUBLIC Update
  16.  
  17. PNT         EQU T0                  ; Zpage temps
  18. I           EQU T1
  19. C           EQU T2
  20. J           EQU T3
  21. K           EQU T4
  22. L           EQU T5
  23. C2          EQU T6                  ; 2*c
  24. L2          EQU T7                  ; 2*l
  25.  
  26. Update
  27.             lda freq+Rstar2         ; if (freq[R] == 0x8000)
  28.             cmp #<MAX_FREQ          ;    reconst();
  29.             bne upd0
  30.             lda freq+Rstar2+1
  31.             cmp #>MAX_FREQ
  32.             bne upd0
  33.             txa
  34.             pha
  35.             tya
  36.             pha
  37.             jsr Reconst
  38.             pla
  39.             tay
  40.             pla
  41.             tax
  42.  
  43. upd0        stx C
  44.             sty C+1
  45.             ldx #0
  46.             ldy #1
  47.             asl C
  48.             rol C+1
  49.             clc                     ; C = prnt[T+c]
  50.             lda #<prnt+Tstar2
  51.             adc C
  52.             sta PNT
  53.             lda #>prnt+Tstar2
  54.             adc C+1
  55.             sta PNT+1
  56.             lda (PNT,x)
  57.             asl a
  58.             sta C
  59.             lda (PNT),y
  60.             rol a
  61.             sta C+1
  62.  
  63. do          clc                     ; k = ++freq[c]
  64.             lda #<freq
  65.             adc C
  66.             sta PNT
  67.             lda #>freq
  68.             adc C+1
  69.             sta PNT+1
  70.             clc
  71.             lda (PNT,x)
  72.             adc #1
  73.             sta (PNT,x)
  74.             sta K
  75.             lda (PNT),y
  76.             adc #0
  77.             sta (PNT),y
  78.             sta K+1
  79.  
  80. if          clc                     ; l = c+1
  81.             lda C
  82.             adc #2
  83.             sta L
  84.             lda C+1
  85.             adc #0
  86.             sta L+1
  87.  
  88.             clc
  89.             lda L
  90.             adc #<freq
  91.             sta PNT                 ; if (k>freq[l])
  92.             lda L+1
  93.             adc #>freq
  94.             sta PNT+1
  95. upd1        lda (PNT,x)
  96.             cmp K
  97.             lda (PNT),y
  98.             sbc K+1
  99.             bcc while
  100.             jmp endif
  101.  
  102. while       clc                     ;    while(k>freq[++l])
  103.             lda L                   ;       ;
  104.             adc #2
  105.             sta L
  106.             bcc upd2
  107.             inc L+1
  108. upd2        clc
  109.             lda L
  110.             adc #<freq
  111.             sta PNT
  112.             lda L+1
  113.             adc #>freq
  114.             sta PNT+1
  115.             lda (PNT,x)
  116.             cmp K
  117.             lda (PNT),y
  118.             sbc K+1
  119.             bcc while
  120.  
  121.             sec
  122.             lda L                   ;    l--
  123.             sbc #2
  124.             sta L
  125.             lda L+1
  126.             sbc #0
  127.             sta L+1
  128.  
  129.             clc                     ; freq[c] = freq[l]
  130.             lda C
  131.             adc #<freq
  132.             sta C2
  133.             lda C+1
  134.             adc #>freq
  135.             sta C2+1
  136.             clc
  137.             lda L
  138.             adc #<freq
  139.             sta L2
  140.             lda L+1
  141.             adc #>freq
  142.             sta L2+1
  143.             lda (L2,x)
  144.             sta (C2,x)
  145.             lda (L2),y
  146.             sta (C2),y
  147.  
  148.             lda K                   ; freq[l] = k
  149.             sta (L2,x)
  150.             lda K+1
  151.             sta (L2),y
  152.  
  153.             clc                     ; i=son[c]
  154.             lda C
  155.             adc #<son
  156.             sta C2
  157.             lda C+1
  158.             adc #>son
  159.             sta C2+1
  160.             lda (C2,x)
  161.             asl a
  162.             sta I
  163.             lda (C2),y
  164.             rol a
  165.             sta I+1
  166.  
  167.             clc                     ; prnt[i] = l
  168.             lda I
  169.             adc #<prnt
  170.             sta PNT
  171.             lda I+1
  172.             adc #>prnt
  173.             sta PNT+1
  174.             lda L+1
  175.             lsr a
  176.             sta (PNT),y
  177.             lda L
  178.             ror a
  179.             sta (PNT,x)
  180.  
  181.             lda I                   ; if (i<T)
  182.             cmp #<Tstar2
  183.             lda I+1
  184.             sbc #>Tstar2
  185.             bcs upd5                ; its not
  186.             ldy #3                  ;    prnt[i+1] = l
  187.             lda L+1
  188.             lsr a
  189.             sta (PNT),y
  190.             dey
  191.             lda L
  192.             ror a
  193.             sta (PNT),y
  194.             dey
  195.  
  196. upd5        clc                     ; j=son[l]
  197.             lda L
  198.             adc #<son
  199.             sta L2
  200.             lda L+1
  201.             adc #>son
  202.             sta L2+1
  203.             lda (L2,x)
  204.             asl a
  205.             sta J
  206.             lda (L2),y
  207.             rol a
  208.             sta J+1
  209.  
  210.             lda I+1                 ; son[l] = i
  211.             lsr a
  212.             sta (L2),y
  213.             lda I
  214.             ror a
  215.             sta (L2,x)
  216.  
  217.             clc                     ; prnt[j] = c
  218.             lda J
  219.             adc #<prnt
  220.             sta PNT
  221.             lda J+1
  222.             adc #>prnt
  223.             sta PNT+1
  224.             lda C+1
  225.             lsr a
  226.             sta (PNT),y
  227.             lda C
  228.             ror a
  229.             sta (PNT,x)
  230.  
  231.             lda J                   ; if (j<T)
  232.             cmp #<Tstar2
  233.             lda J+1
  234.             sbc #>Tstar2
  235.             bcs upd6
  236.             ldy #3                  ;    prnt[j+1] = c
  237.             lda C+1
  238.             lsr a
  239.             sta (PNT),y
  240.             dey
  241.             lda C
  242.             ror a
  243.             sta (PNT),y
  244.             dey
  245.  
  246. upd6        clc                     ; son[c] = j
  247.             lda C
  248.             adc #<son
  249.             sta C2
  250.             lda C+1
  251.             adc #>son
  252.             sta C2+1
  253.             lda J+1
  254.             lsr a
  255.             sta (C2),y
  256.             lda J
  257.             ror a
  258.             sta (C2,x)
  259.  
  260.             lda L+1                 ; c = l
  261.             sta C+1
  262.             lda L
  263.             sta C
  264. endif       clc                     ; do { .. } while (c=prnt[c] != 0)
  265.             lda C
  266.             adc #<prnt
  267.             sta C2
  268.             lda C+1
  269.             adc #>prnt
  270.             sta C2+1
  271.             lda (C2,x)
  272.             sta C
  273.             lda (C2),y
  274.             sta C+1
  275.             ora C
  276.             beq finally
  277.             asl C
  278.             rol C+1
  279.             jmp do
  280.  
  281. finally     rts
  282.  
  283.             END
  284.  
  285.  
  286.  
  287.  
  288.  
  289.  
  290.  
  291.  
  292.  
  293.  
  294.  
  295.  
  296.  
  297.  
  298.  
  299.  
  300.  
  301.  
  302.