ùúùú                                        **************************************************
*      SCM SSUR-Cruncher
*      For Scanner V4.0
*      by SNIPER/LSI 1995
*
            INCLUDE ScannerV46.i

            Dc.L    SCM_TAGSTART                  
            Dc.L    SCM_CHECK,CHECKSSUR           
FOUND:      Dc.L    SCM_FOUNDFLAG,0               
DATAADR:    Dc.L    SCM_DATAADR,0                 
DATASIZE:   Dc.L    SCM_DATASIZE,0                
SCANADR:    Dc.L    SCM_SCANADR,0                 
            Dc.L    SCM_VERSION,1<<16!00          
            Dc.L    SCM_CREATORSTRING,AUTORSTRING 
            Dc.L    SCM_INFOSTRING,INFOSTRING     
            Dc.L    SCM_FORMATSTRING,FORMATSTRING       
            Dc.L    SCM_APPSTRING,APPSTRING             
            Dc.L    SCM_APPFLAG,0                       
            Dc.L    SCM_SPECIALSTRING,MYSTRING	
ENDFILE:    Dc.L    SCM_ENDFILE,0                       
            Dc.L    SCM_TAGEND                          

_LVOAllocMem	EQU	-$C6
_LVOFreeMem	EQU	-210

; D0 = Current Adresse , D1 = BlockLen-1

CHECKSSUR:  Move.L  D0,A0
            Move.L  D1,D7
            Lea     FOUND+4,A1
            Clr.L   (A1)
checkloop:
            Cmp.L   #"SSUR",(A0)
            Beq     gefunden
checkweiter:
            Addq.L  #1,A0
            Dbra    D7,checkloop
            Clr.L   (A1)
            Rts
            
gefunden:   Moveq.l #0,D0	
            Move.b  7(A0),D0            ; Entpackte Länge
            LSL.L   #8,D0		; Bytes vetauscht
            Move.b  6(A0),D0
            LSL.L   #8,D0
            Move.b  5(A0),D0
            LSL.L   #8,D0
            Move.b  4(A0),D0
       	    Tst.l   D0
	    Beq	    checkfehler	    
	    Bmi     checkfehler
	    Move.l  D0,Decru 	
	    Move.l  D0,Size		; Speicher anfordern
	    Moveq.l #0,D1
	    Move.l  4.w,A6
	    Move.l  A0,-(A7)	
            Jsr	    _LVOAllocMem(A6)
            Move.l  (A7)+,A0
            Move.l  D0,Adr		
            Beq	    MemError	
            Move.l  D0,A1
;----------------------------------------
	    Movem.l A0/A1,-(A7) 	
	    Bsr	    SSURDec		; Entpacken		
	    Tst.l   D0
	    Beq     SSURError1
	    Move.l  A0,D0
	    Move.l  D0,D2
	    Movem.l (A7)+,A0/A1
	    Sub.l   A0,D0		; und Testen
	    Move.l  DECRU,D1
	    Cmp.l   D1,D0
	    Bgt	    SSURError
	    tst.l   D0
	    beq	    SSURError
	    bmi     SSURError
	    Move.l  ENDFILE+4,A1
	    Cmp.l   A1,D2
	    Bgt	    SSURError		 			    
;----------------------------------------
SSUROk:	    Movem.l D0/A0,-(A7)	
	    Move.l  Size,D0
	    Move.l  Adr,A1
	    Move.l  4,A6	
	    Jsr	    _LVOFreeMem(A6)
	    Movem.l (A7)+,D0/A0 
	    Bra     Save

SSURError1: Movem.l (A7)+,A0/A1
SSURError:  Movem.l D0/A0,-(A7)	
	    Move.l  Size,D0
	    Move.l  Adr,A1
	    Move.l  4,A6	
	    Jsr	    _LVOFreeMem(A6)
	    Movem.l (A7)+,D0/A0 
	    Bra     checkfehler
    			    			    	
;**************************************************************
Save:       Move.L  D0,DATASIZE+4
	    Move.L  D0,CRU 	
            Move.L  A0,DATAADR+4
            Add.L   D0,A0
            Move.L  A0,SCANADR+4           ; am Ende der Daten weitermachen
            Move.L  #-1,FOUND+4            ; Ok Alles Klar
            Rts

checkfehler:                            
            Clr.L   FOUND+4
            Bra     checkweiter

MemError:   Move.l  #FOUND_FAIL,FOUND+4
	    Rts		

;**************************************************************

; A0=Data A1=Buffer
SSURDec	MOVEM.L	D2-D7/A2,-(SP)
	Addq.l  #4,A0		; auf Datas	 	
	MOVEQ	#8,D5
	MOVEA.L	A1,A2
	bsr	lbC0001FE
	ADDA.L	D7,A1
	bsr	lbC0001FE
	MOVE.L	D7,D6
	MOVEQ	#0,D2
	bsr	lbC0001F0
	BCS.S	lbC0001A2
lbC000136
	bsr	lbC0001C6
	MOVE.W	D0,D2
	MOVE.W	D0,D3
	SUBQ.W	#1,D2
lbC000140	
	CLR.W	D0
	ADD.L	D7,D7
	BNE.S	lbC00014A
	bsr	lbC0001F0
lbC00014A
	ADDX.W	D0,D0
	ADD.L	D7,D7
	BNE.S	lbC000154
	bsr	lbC0001F0
lbC000154
	ADDX.W	D0,D0
	ADD.L	D7,D7
	BNE.S	lbC00015E
	bsr	lbC0001F0
lbC00015E
	ADDX.W	D0,D0
	ADD.L	D7,D7
	BNE.S	lbC000168
	bsr	lbC0001F0
lbC000168
	ADDX.W	D0,D0
	ADD.L	D7,D7
	BNE.S	lbC000172
	bsr	lbC0001F0
lbC000172
	ADDX.W	D0,D0
	ADD.L	D7,D7
	BNE.S	lbC00017A
	BSR.S	lbC0001F0
lbC00017A	
	ADDX.W	D0,D0
	ADD.L	D7,D7
	BNE.S	lbC000182
	BSR.S	lbC0001F0
lbC000182
	ADDX.W	D0,D0
	ADD.L	D7,D7
	BNE.S	lbC00018A
	BSR.S	lbC0001F0
lbC00018A	
	ADDX.W	D0,D0
	MOVE.B	D0,-(A1)
	CMPA.L	A2,A1			; Goto Ready
	BLE.S	lbC0001B8
	DBRA	D2,lbC000140
	NOT.W	D3
	BNE.S	lbC0001A2
lbC00019A
	ADD.L	D7,D7
	BNE.S	lbC0001A0
	BSR.S	lbC0001F0
lbC0001A0	
	BCC.S	lbC000136
lbC0001A2	
	BSR.S	lbC0001C6
	MOVE.W	D0,D2
	BSR.S	lbC0001C6
	MOVE.W	D0,D3
	ADDQ.W	#2,D3
lbC0001AC
	MOVE.B	-1(A1,D2.L),-(A1)
	DBRA	D3,lbC0001AC
	CMPA.L	A2,A1		; wenn nicht Goto Ready
	BGT.S	lbC00019A
lbC0001B8			; Ready	
	MOVEQ	#-1,D0
	TST.L	D6
	BEQ.S	skip2
skip1	MOVEQ	#0,D0
skip2	MOVEM.L	(SP)+,D2-D7/A2
	RTS

lbC0001C6
	CLR.W	D0
	CLR.W	D1
	ADD.L	D7,D7
	BNE.S	lbC0001D0
	BSR.S	lbC0001F0
lbC0001D0	
	ADDX.W	D1,D1
	ADD.L	D7,D7
	BNE.S	lbC0001D8
	BSR.S	lbC0001F0
lbC0001D8
	ADDX.W	D1,D1
	ADDQ.W	#1,D1
	ADD.W	D1,D1
	ADD.W	D1,D1
	SUBQ.W	#1,D1
lbC0001E2	
	ADD.L	D7,D7
	BNE.S	lbC0001E8
	BSR.S	lbC0001F0
lbC0001E8
	ADDX.W	D0,D0
	DBRA	D1,lbC0001E2
	RTS

lbC0001F0	
	BSR.S	lbC0001FE
	NOT.L	D7
	SUB.L	D7,D6
	ORI.B	#$10,CCR
	ADDX.L	D7,D7
	RTS

lbC0001FE
	MOVE.B	(A0)+,D7
	ROR.L	D5,D7
	MOVE.B	(A0)+,D7
	ROR.L	D5,D7
	MOVE.B	(A0)+,D7
	ROR.L	D5,D7
	MOVE.B	(A0)+,D7
	ROR.L	D5,D7
	RTS

;***********************************************************

Size	    dc.l	0
Adr         dc.l        0	

AUTORSTRING:
	    Dc.B    "SNIPER of Lightstorm INC.",0
            Even
            Dc.B    "$VER: 29.8.95 Extended Scanner Module for "
FORMATSTRING: 
	    Dc.B    "SSUR-Cruncher",0
            Even
INFOSTRING: Dc.B    "Crunched  : \d"
CRU:	    Dc.L    0			
            Dc.B    "\nDecrunched: \d"
DECRU:	    Dc.L    0		            
            Dc.B    0
            Even

APPSTRING:  Dc.B    "SSUR",0
            Even

MYSTRING:  dc.b "A Data Cruncher (F29)"
	   dc.b 0   
	   Even	
