; **************************************************************
; *                                                            *
; *  ENTPACK ROUTINE FUER                                      *
; *                ComPack v0.1                                *
; *                              (C) 7/87 H.SCHMIDT            *
; *                                                            *
; **************************************************************
;
execbase = 4
openlib = -30 -378
closelib = -30 -384
;
open = -30 - 0
close = -30 -6
read = -30 -12
;
start:
 move.l execbase,a6
 lea.l dosname,a1
 jsr openlib(a6)
 move.l d0,dosbase
;
 move.l #$60000,d0  ; adresse, an die das prg geladen werden soll
 move.l #fname,d1   ; zeiger auf filename
 bsr readpacked     ; sprung in die lade und entpack routine
;
 move.l dosbase,a1
 move.l execbase,a6
 jsr closelib(a6)
;
 rts
;
dosbase: dc.l 0
dosname: dc.b 'dos.library',0
even
;
readpacked:            ; lade und entpack routine
 move.l d0,loadto
 move.l dosbase,a6
 move.l #1005,d2
 jsr open(a6)          ; file oeffnen
 move.l d0,fhandle
;
 move.l d0,d1
 move.l #buffer,d2
 move.l #11,d3
 jsr read(a6)          ; hier werden 11 bytes gelesen die den
                       ; header des gepackten prg's bilden
            ; der header ist wie folgt aufgebaut :
    ; 4 bytes  laenge des gepackten prg's
    ; 4 bytes  original laenge
    ; 1 byte   packmarkierung 1 (sich wiederholende bytes)
    ; 1 byte   packmarkierung 2 (mark. meistes byte)
    ; 1 byte   most byte        (am meisten vorhandenes byte)
;
 move.l loadto,d0      ; startadresse +  
 lea.l buffer,a0       ; original laenge
 add.l 4(a0),d0        ; - gepackte laenge
 sub.l (a0),d0         ;
;
 move.l fhandle,d1
 move.l d0,d2
 move.l (a0),d3        ; an diese addresse
 jsr read(a6)          ; laden
;
 move.l fhandle,d1
 jsr close(a6)         ; file schliessen
;
 lea.l buffer,a2
 move.l loadto,a1
 move.l loadto,d0
 add.l 4(a2),d0
 move.l d0,d7
 sub.l (a2),d0
 move.l d0,a0
;
unpack:
 clr.l d4
 clr.l d5
 clr.l d6
 move.b 8(a2),d4 ; packmark 1
 move.b 9(a2),d5 ; packmark 2
 move.b 10(a2),d6 ; mostbyte
;
unpack1:
 cmp.l a0,d7
 beq endunpack
 move.b (a0)+,d0
 cmp.b d4,d0      ; packmark 1 ??
 beq mark1
 cmp.b d5,d0      ;    "     2 ??
 beq mark2
 move.b d0,(a1)+  ; nicht gepackt
 move.w d0,$dff180
 bra unpack1
mark1:
 move.b (a0)+,d1  ; anz. der gleichen bytes
 move.b (a0)+,d0  ; byte
 tst.b d1
 bne mark1w
 move.b d0,(a1)+
 bra unpack1
mark1w:
 and.w #$00ff,d1
 move.b d0,(a1)+
 move.w d1,$dff180
 dbra d1,mark1w
 bra unpack1
mark2:
 move.b (a0)+,d1 ; anz. der 'mostbytes'
 move.b d6,d0    ; mostbyte
 bra mark1w
;
endunpack:
 rts
;
loadto: dc.l 0
fhandle: dc.l 0
buffer: dc.b 12,0
fname: dc.b ':intro.pc',0
even
