home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / tt / vmem11 / vmemdemo / decrunch.s next >
Text File  |  1991-06-08  |  4KB  |  139 lines

  1.             EXPORT    decrunch
  2.             
  3.             IMPORT    vm_address
  4.  
  5. ;************************************************************
  6. ;* Entpacken einer IMG-Datei:                               *
  7. ;*                                                          *
  8. ;* A0: Zeiger auf die Quelldaten im physikalischen Speicher *
  9. ;* A1: Startadresse im virtuellen Speicher                  *
  10. ;************************************************************
  11.  
  12. decrunch:
  13.             movem.l d3-d7/a2-a6,-(sp)    ; Register retten
  14.             move.l    a0,a3                ; Quelldaten (phys. Speicher)
  15.             move.l    d0,a4                ; Puffer (virt. Speicher);
  16.  
  17.             movea.l a3,a5
  18.             move.w    2(a3),d0            ; Headergröße in WORD
  19.             add.w    d0,d0
  20.             lea     0(a3,d0.w),a3        ; Zeiger auf gepackte Daten
  21.  
  22.             move.w    6(a5),d5            ; Länge eines Musters in Bytes
  23.             subq.w    #1,d5                ; - 1 wegen DBRA
  24.  
  25.             moveq    #0,d6
  26.             move.w    12(a5),d6            ; Bildbreite in Punkten
  27.             addq.w    #7,d6                ; auf Bytes aufrunden
  28.             lsr.w    #3,d6                ; Zeilenbreite in Bytes
  29.             move.w    d6,a6
  30.             btst    #0,d6                ; Breite auf WORD aufrunden
  31.             beq.b    no_corr1
  32.             addq.w    #1,d6
  33. no_corr1:
  34.             move.w    14(a5),d7            ; Anzahl der Zeilen
  35.             subq.w    #1,d7                ; - 1 wegen DBRA
  36.  
  37. main3:        
  38.             move.l    a4,d0                ; V_ADR
  39.             lea        window_size,a0        ; Zeiger auf Fenstergröße
  40.             moveq    #4,d1                ; Zugriff im WRITE-Modus
  41.             jsr        vm_address            ; virt. Speicher adressieren
  42.  
  43.             lea     0(a0,a6.w),a1        ; Zeiger auf nächste Zeile
  44.             lea        0(a4,d6.w),a4        ; V_ADR += Zeilenbreite
  45.  
  46.             moveq    #0,d2
  47.  
  48.             tst.b    (a3)                ; 1. Byte = 0 ?
  49.             bne.b    main1                ; nein
  50.             tst.b    1(a3)                ; 2. Byte = 0 ?
  51.             bne.b    main1                ; nein
  52.             cmpi.b    #$FF,2(a3)            ; 3. Byte = $FF ?
  53.             bne.b    main1                ; nein
  54.             addq.l    #3,a3                ; sonst Zeilenwiederholung
  55.             move.b    (a3)+,d2            ; Anzahl Wiederholungen
  56.             subq.w    #1,d2                ; - 1 wegen DBRA
  57.  
  58. main1:        bsr.b    subrout             ; Daten entpacken
  59.             cmpa.l    a1,a0                ; Zeilenende erreicht ?
  60.             blt.b    main1                ; nein => weitermachen
  61.             subq.w    #1,d7                ; alle Zeilen entpackt ?
  62.             bmi.b    ende                ; ja => Ende
  63.  
  64.             tst.w    d2                    ; nur eine Zeile ??
  65.             beq.b    main3                ; dann neue Zeile beginnen
  66.  
  67.             move.w    d2,d3                ; ansonsten die vorherige Zeile
  68.             subq.w    #1,d3                ; kopieren
  69.  
  70. main2:        move.l    a4,d0                ; V_ADR
  71.             sub.l    d6,d0                ; minus Zeilenbreite
  72.             lea        window_size,a0        ; Zeiger auf Fenstergröße
  73.             moveq    #4,d1                ; Zugriff im WRITE-Modus
  74.             jsr        vm_address            ; virt. Speicher adressieren
  75.  
  76.             lea     0(a0,d6.w),a1        ; Zeiger auf nächste Zeile
  77.             lea        0(a4,d6.w),a4        ; V_ADR += Zeilenbreite
  78.  
  79.             move.w     d6,d0
  80.             subq.w    #1,d0
  81. main4:        move.b    (a0)+,(a1)+            ; Zeile kopieren
  82.             dbra    d0,main4
  83.  
  84.             subq.w    #1,d7                ; alle Zeilen entpackt ?
  85.             bmi.b    ende                ; ja => Ende
  86.             dbra    d3,main2            ; noch eine Zeile kopieren ?
  87.             bra.b    main3                ; sonst neue Zeile beginnen
  88.  
  89. ende:        movem.l (sp)+,d3-d7/a2-a6    ; Register restaurieren
  90.             rts
  91.  
  92.  
  93. ;**************************************
  94. ;* Entpackroutinen für eine Bildzeile *
  95. ;**************************************
  96.  
  97. subrout:    moveq    #0,d0
  98.             move.b    (a3)+,d0            ; Byte holen
  99.             beq.b    special                ; = 0, dann Musterwiederholung
  100.             smi     d1                    ; D1 = $FF, falls Bit 7 gesetzt
  101.             tst.b    d0                    ; D0 > 0 ??
  102.             bpl.b    fill                ; dann Füllroutine aufrufen
  103.             and.b    #$7F,d0                ; Bit 6 - Bit 0 = 0 ??
  104.             beq.b    normal                ; dann Bytes kopieren
  105.  
  106. fill:        subq.w    #1,d0                ; Anzahl - 1 wegen DBRA
  107. fillloop:    move.b    d1,(a0)+            ; Füllwert (0 oder $FF) schreiben
  108.             dbra    d0,fillloop
  109.             rts
  110.  
  111. normal:     move.b    (a3)+,d0            ; Anzahl holen
  112.             subq.w    #1,d0                ; - 1 wegen DBRA
  113. normalloop: move.b    (a3)+,(a0)+         ; Bytes kopieren
  114.             dbra    d0,normalloop
  115.             rts
  116.  
  117. special:    move.b    (a3)+,d0            ; Anzahl der Wiederholungen
  118.             subq.w    #1,d0                ; - 1 wegen DBRA
  119.  
  120.             cmp.b    #1,d5                ; Muster 2 Bytes breit ?
  121.             beq.b    special2            ; dann Spezialbehandlung
  122.  
  123.             movea.l a3,a2
  124. speciall2:    movea.l a2,a3
  125.             move.w    d5,d1
  126. speciall1:    move.b    (a3)+,(a0)+         ; Muster kopieren
  127.             dbra    d1,speciall1
  128.             dbra    d0,speciall2        ; Muster wiederholen
  129.             rts
  130.  
  131. special2:    move.b    (a3)+,d3            ; Muster (2 Bytes) holen
  132.             move.b    (a3)+,d4
  133. special2l:    move.b    d3,(a0)+            ; 1. Byte schreiben
  134.             move.b    d4,(a0)+            ; 2. Byte schreiben
  135.             dbra    d0,special2l        ; Muster wiederholen
  136.             rts
  137.  
  138. window_size:    dc.l    2000            ; Größe des Windows
  139.