English Amiga Board


Go Back   English Amiga Board > Coders > Coders. General

 
 
Thread Tools
Old 23 December 2019, 17:28   #1
kamelito
Zone Friend
kamelito's Avatar
 
Join Date: May 2006
Location: France
Posts: 1,040
Why does this code crash?

Hi
I typed the code of this page that is an iff display program.
It is crashing I guess in the uncompress part of the code anyone see the pb?
Thanks


http://obligement.free.fr/articles/a...images_iff.php

Code below.

Code:
; ShowIFFs

; Par Max - Mai 1990

; Version Devpac II uniquement

; (pour Seka, allez au diable)
;incdir "Devpac2:Include

* FUNCDEF macro definition for 'exec/exec_lib.i'

FUNCDEF     MACRO    *function
_LVO\1      EQU      FUNC_CNT
FUNC_CNT    SET      FUNC_CNT-6
            ENDM
FUNC_CNT    SET      5*-6

	INCDIR  "C:\Users\kamel\Desktop\vbcc\NDK_3.1\Includes_Libs\include_i\"
	INCLUDE	"exec/exec.i"
	INCLUDE "exec/exec_lib.i"
	INCLUDE "exec/memory.i"
	INCLUDE "intuition/intuition_lib.i"
	INCLUDE "intuition/intuition.i"
	INCLUDE "graphics/graphics_lib.i"
	INCLUDE "graphics/view.i"
	INCLUDE "graphics/gfx.i"
	INCLUDE "libraries/dos_lib.i"
	INCLUDE "libraries/dos.i"



; Définition de la structure BMHD facon Include

	rsreset
BMHD	               rs.b 0
bmhd_w:                rs.w 1
bmhd_h:                rs.w 1
bmhd_x:	               rs.w 1
bmhd_y:                rs.w 1
bmhd_nPlanes:          rs.b 1
bmhd_masking:          rs.b 1
bmhd_compression:      rs.b 1
bmhd_pad1:             rs.b 1
bmhd_transparentColor: rs.w 1
bmhd_xAspect:          rs.b 1 
bmhd_yAspect:          rs.b 1
bmhd_pageWidth:        rs.w 1
bmhd_pageHeight:       rs.w 1
bmhd_SIZEOF:           rs.w 0

; Définition des bits inutiles du CAMG
;en vue du masquage pour ViewModes
CAMGMASK EQU ((~(V_SPRITES|GENLOCK_VIDEO))&$FFFF)
;ExecBase EQU 4
; Petite macro pour nous simplifier la vie CALL
CALL	MACRO
	jsr	_LVO\1(a6)
	ENDM
	
; C'est parti mon kiki !; **************************************

Start:	
		move.l  $4.w,a6
		move.b #0,-1(a0,d0.w)
		subq #1,d0
		beq NoArg
		move.l a0,FileName
		
; Ouverture de l'intuition library
		lea IntName(pc),a1
		moveq #0,d0
		CALL OpenLibrary
		move  d0,IntBase
		beq.s Nolnt
		
; Ouverture de la graphics.library
		lea GfxName(pc),a1
		moveq #0,d0
		CALL OpenLibrary
		move.l  d0,GfxBase
		beq.s NoGfx

; Ouverture de la dos.library
		lea DosName(pc),a1
		moveq #0,d0
		CALL OpenLibrary
		move.l d0,DosBase
		beq.s NoDos

; Charge l'image IFF
		bsr.s LoadPic
		tst.l d7
; Erreur de chargement ?
		beq.s NoPic
; Et l'affiche
		bsr DisplayIFF
; Libére la mémoire du fichier

		move.l  $4.w,a6
		move.l	Picture(pc),a1
		move.l	FileSize(pc),d0
		CALL FreeMem
		
; Ferme la dos.library 
NoPic:	move.l  DosBase(pc),a1
		CALL CloseLibrary
		
; Ferme la graphics.library 
NoDos:	move.l  GfxBase(pc),a1
		CALL CloseLibrary; Ferme intuition library 
NoGfx:	move.l IntBase(pc),a1
		CALL CloseLibrary
		
Nolnt:
NoArg: rts
; *************************************
; * Routine de chargement du fichier  *
; * IFF en mémoire.				      *
; * en sortie, d7 sert de flag:       *
; * d7=0 -> une erreur est survenue   *
; * d7<>0 -> tout s'est bien passé    *
; *************************************

LoadPic: 
		moveq #0,d7	;d7=0 -> erreur sinon Ok
; Réserve 260 octets de CHIP-RAM pour Examine()
		move.l	#fib_SIZEOF,d0
		move.l #MEMF_PUBLIC|MEMF_CLEAR,d1
		CALL AllocMem
		tst.l d0
		beq NoMem
		move.l d0,a5
		
; Obtient un Lock sur le fichier !
		move.l  DosBase(pc),a6
		move.l	FileName(pc),d1
		moveq	#ACCESS_READ,d2
		CALL 	Lock
		move.l d0,filelock_an
		beq.s 	NoLock
		
; Fichier inexistant

; Examine() le fichier
		move.l d0,d1
		move.l  a5,d2
		CALL Examine
		
; Est-ce un répertoire ?
		tst.l fib_DirEntryType(a5)
		bpl.s IsDir
; Oui!
		move.l	fib_Size(a5),FileSize
; Sinon, sauve sa taille

; Réserve de la mémoire pour charger le fichier
		move.l	$4.w,a6
		move.l	FileSize(pc),d0
		moveq	#MEMF_PUBLIC,d1
		CALL	AllocMem
		move.l	d0,Picture
		beq.s	NoMem2

; Ouvre le fichier
		move.l	DosBase(pc),a6
		move.l	FileName(pc),d1
		move.l	#MODE_OLDFILE,d2
		CALL 	Open
		move.l	d0,d6
		beq		OpenErr
		
; Erreur d'ouverture
; Charge le fichier en mémoire
		move.l	d0,d1
		move.l	Picture(pc),d2
		move.l	FileSize(pc),d3
		CALL	Read
		
; Ferme le fichier
		move.l  d6,d1
		CALL	Close
		moveq 	#-1,d7
		
;d7<>0 -> Tout s'est bien passé
IsDir:
NoMem2:
OpenErr:; Libére le Lock du fichier
		move.l	filelock_an,d1
		CALL	UnLock
		
; Libère la mémoire d'Examine() 
NoLock:	move.l	$4.w,a6
		move.l	a5,a1
		move.l	#fib_SIZEOF,d0
		CALL	FreeMem
NoMem:	rts

;************************************************
;* Routine d'atfichage de l'image IFF           *
;* Gére les modes compacté et étendu            *
;************************************************
;* Algorythme de compactage :                   *
;* tester l'octet de contrôle n; si n égale:    *
;* 0...127 : copier n+1 octets de données       *
;* -1...-127 : répéter -n+1 fois l'octet suivant*
;*  -128: ne rien faire (ah bon ?}              * 
;************************************************

DisplayIFF:
		move.l Picture(pc),a5
;a5=image FF
		lea ScreenDefs(pc),a4
;a4=structure NewSereen
		cmpi.l #'FORM',(a5)+
; Vérifie si c’est un fichier IFF
		bne IFFErr
;Non!
		move.l	(a5)+,d0
		add.l 	a5,d0
; Sauve sa taille
		move.l 	d0,FormEnd
		cmpi.l	#'ILBM',(a5)+
; Vérifie si c'est un fichier ILBM
		bne IFFErr
;Non!
; Boucle principale 
Do:		move.l	(a5)+,d7
;d7=ChunkName
		move.l	(a5)+,d6
;d6=ChunkSize ,
cBMHD:	
		cmpi.l #'BMHD',d7
		bne.s cCMAP
; Chunk BMHD (Bitmap Header)
		move.w bmhd_w(a5),ns_Width(a4)
; Largeur
		move.w bmhd_h(a5),ns_Height(a4)
; Hauteur
		move.b bmhd_nPlanes(a5),ns_Depth+1(a4)
; Profondeur
		tst.b bmhd_compression(a5)
; Fichier compressé ?
		sne Compress
; Oui -> positionne le flag
		bra Loop
; Prochain chunk
cCMAP:	cmpi.l #'CMAP',d7
		bne.s cCAMG
; Chunk CMAP (Color Map)
		move.w  d6,d7
		ext.l	d7
		divu #3,d7
;d7 = nombre de couleurs
		cmpi.w  #32,d7
; Plus de 32 couleurs ?
		ble.s	CoulOk
		moveq #32,d7
; Oui -> 32 couleurs max (c'est moi !) 
CoulOk: move.w d7,NbCoul
; Sauve le nombre de couleurs
		lea Palette(pc),a2
		moveq #0,d5
		subq #1,d7
CoLoop: move.b (a5)+,d5
; Composante Rouge
		lsl.w #4,d5
		or.b (a5)+,d5
; Composante Vert
		lsl.w #4,d5
		or.b (a5)+,d5
; Composante Bleu
		lsr.w #4,d5
		move.w  d5,(a2)+
; Sauve le RVB dans la palette
		dbra d7,CoLoop
; prochaine couleur
		moveq #0,d6
		bra Loop
; Prochain chunk
cCAMG:	cmp.l #'CAMG',d7
		bne.s cBODY
; Chunk CAMG (Commodore Amiga)
		move.l (a5),d0
		andi.l #CAMGMASK,d0
; Masque les bits indésirables
		move.w  d0,ns_ViewModes(a4)
; Mode d'écran dans Ia structure
		bra Loop
; NewScreen (HAM, EHB, etc.)
cBODY:	
		cmp.l #'BODY',d7
		bne Loop
; Chunk BODY (données graphiques) STOP :
		move.l IntBase(pc),a6
; Ouvre l'écran
		lea ScreenDefs(pc),a0
		move.w  #CUSTOMSCREEN|SCREENQUIET,ns_Type(a0)
		CALL OpenScreen
		move.l  d0,ScrHandle
		beq IFFErr
; Si erreur, on stoppe tout

; Charge la palette de couleurs
		move.l  GfxBase(pc),a6
		move.l d0,a0
;:a0 = ScreenHandle
		lea sc_ViewPort(a0),a0
		lea Palette(pc),a1
		move.w NbCoul(pc),d0
; Nombre de couleurs
		ext.l d0
		CALL LoadRGB4
; C'est parti !
; Le vrai boulot commence ici
		move.w ns_Width(a4),d5
; Largeur en pixels
		lsr.w #3,d5
;/8 = largeur en octets
		moveq #0,d0
;Compteurlignes 
Lignes: move.l  ScrHandle(pc),a3
		lea sc_BitMap+bm_Planes(a3),a3
		move.w ns_Depth(a4),d1
; Compteur bitplanes
		subq.w #1,d1
;-1 pour dbra 
Planes: move.l (a3)+,a0
;a0 = bitplane en cours
		move.w d0,d2
		mulu d5,d2
		lea (a0,d2.l),a0
; pointe la bonne ligne
		moveq #0,d2
		tst.b Compress
; image compressée ?
		beq Normal
;non
; Au cas ou l'image est compressée 
Comp:	moveq #0,d3
		move.b  (a5)+,d3
; octet de controle dans d3
		bmi.s Crunch
; négatif -> décompresser
		ext.w d3
		add.w d3,d2
		addq.w #1,d2
CompL: 	
		move.b (a5)+,(a0)+
; sinon copier n octets
		dbra d3,CompL
		bra.s NextByte
; au suivant !
Crunch: cmpi.b  #$80,d3
; n=>128 ($80) ?
		beq.s NextByte
; oui -> rien a faire
		neg.b d3
;sinon n=-n
		ext.w d3
		add.w d3,d2
		addq.w #1,d2
		move.b (a5)+,d4
; prendre octet de donnée 
CrunchL:
		move.b  d4,(a0)+
; et le répéter n+1 fois
		dbra d3,CrunchL
; (+1 car dbra)
NextByte:
		cmp.w  d5,d2
; fin de ligne atteinte ?
		blt.s Comp
; pas encore
		bra.s NextL
; si oui passe au plan suivant
; Cas d'une image "étendue" (IFF-Converter) 
Normal:	move.w d5,d4
; largeur en octets
		subq.w #1,d4
;-1 pour dbra
NLoop:
		move.b  (a5)+,(a0)+
; copier les données
		dbra d4,NLoop
; une ligne complète
; Une ligne est atfichée,
; on passe au plan suivant 
NextL:	dbra d1,Planes
; Quand tous les plans de la ligne sont traités
; on passe à Ia ligne suivante
		addq.w #1,d0
; compteur de lignes incrémenté
		cmp.w ns_Height(a4),d0
; la hauteur est atieinte ?
		blt.s Lignes
; Non, on continue
		moveq #0,d6
;si oui on a fini; On arrive ici quand un chunk a été traité
; (ou ignoré pour ceux qui ne sont pas gérés) 
Loop:	adda.l d6,a5
; Saute le chunk
; quon vient de traiter
		move.l a5,d6
; Vérifie qu'a5 est pair
		andi.b #1,d6
		beq.s Pair
		addq.l #1,a5
; Si impair, on l'incrémente 
Pair:	cmpa.l  FormEnd(pc),a5
; Fin de la FORM?
		blt Do
; Pas encore
; Attend ALT-Gauche 
Wait:	cmp.b #$37,$bfec01
		bne.s Wait
; Ferme l'écran
		move.l IntBase(pc),a6
		move.l ScrHandle(pc),a0
		CALL CloseScreen
; Retour à l'envoyeur 
IFFErr:		rts
; Variables diverses 
FormEnd:
		   dc.l 0
;          Taille de la FORM 
Compress:  dc.b 0,0
NbCoul:    dc.w 0
;          Nombre de couleurs 
Palette:   ds.w 32
;          Palette de 32 couleurs 
IntBase:     dc.l 0
GfxBase:     dc.l 0
DosBase:     dc.l 0
ScrHandle:   dc.l 0
FileName:    dc.l 0
filelock_an:    dc.l 0
filehandle_an:  dc.l 0
FileSize:    dc.l 0
Picture:     dc.l 0
IntName: 
		dc.b "intuition.library",0
		even
GfxName: 
		dc.b "graphics.library",0
		even
DosName: 
		dc.b "dos.library",0
		even
; Structure NewScreen 
ScreenDefs: ds.b ns_SIZEOF
END
kamelito is offline  
Old 23 December 2019, 18:33   #2
Don_Adan
Registered User
 
Join Date: Jan 2008
Location: Warsaw/Poland
Age: 51
Posts: 1,186
Perhaps odd address problem?
Don_Adan is offline  
Old 23 December 2019, 18:44   #3
kamelito
Zone Friend
kamelito's Avatar
 
Join Date: May 2006
Location: France
Posts: 1,040
it freeze the OS, I put enforcer and it didn't show any hit.
This line was on the site : move.w CUSTOMSCREEN|SCREENQUIET,ns_Type(a0) but devpac don't like it while vasm yes. I put "move.w #CUSTOMSCREEN|SCREENQUIET,ns_Type(a0)" instead.
How do you track odd address pb?
kamelito is offline  
Old 23 December 2019, 18:52   #4
ross
Per aspera ad astra

ross's Avatar
 
Join Date: Mar 2017
Location: Crossing the Rubicon
Age: 49
Posts: 2,425
move  d0,IntBase
ross is offline  
Old 23 December 2019, 19:04   #5
kamelito
Zone Friend
kamelito's Avatar
 
Join Date: May 2006
Location: France
Posts: 1,040
that is 451 lines of code from a website listing from images
Of course I've made typo, good catch thanks.
There's maybe more
It still crash when I quit but the image is displayed
kamelito is offline  
Old 23 December 2019, 19:11   #6
Exodous
Registered User

 
Join Date: Sep 2019
Location: Leicester / England
Posts: 27
The instruction you have highlighted:

Code:
move.w CUSTOMSCREEN|SCREENQUIET,ns_Type(a0)
attempts to move the value stored at memory address CUSTOMSCREEN|SCREENQUIET into ns_Type(a0).

CUSTOMSCREEN = 0x000f
SCREENQUIET = 0x0100

CUSTOMSCREEN|SCREENQUIET = 0x010f = 271

You're attempting to move a word from an odd address. The 68000/010 doesn't like this, but 68020+ allow word/long accesses at odd addresses.

As you suggested, you should use:

Code:
move.w #CUSTOMSCREEN|SCREENQUIET,ns_Type(a0)
Which moves the value 0x010f to ns_Type(a0).


Devpac has the CPU set as a 68000, so it is warning you that your code may break. The default Devpac options also warn you when you may have meant to move an immediate value, rather than a memory address.

I've not used vasm, but I assume it either has the CPU set as 68020+ mode so isn't warning you.


You can't protect completely against word writes to odd addresses at the assembler level as you could always load an odd address into an address registered and then, for example, move.w #value,(reg), but obvious mistakes can be caught by the assembler warnings.
Exodous is offline  
Old 23 December 2019, 19:12   #7
Exodous
Registered User

 
Join Date: Sep 2019
Location: Leicester / England
Posts: 27
Quote:
Originally Posted by ross View Post
move  d0,IntBase

IntBase is a label lower down the code, so this just moves the result of OpenLibrary (on the intuition.library) into a memory location within the program/data space.
Exodous is offline  
Old 23 December 2019, 19:16   #8
kamelito
Zone Friend
kamelito's Avatar
 
Join Date: May 2006
Location: France
Posts: 1,040
yep but it needed and move.l d0, Intbase.
kamelito is offline  
Old 23 December 2019, 19:38   #9
kamelito
Zone Friend
kamelito's Avatar
 
Join Date: May 2006
Location: France
Posts: 1,040
working version

fixed version, thanks for your help.

Code:
; ShowIFFs

; Par Max - Mai 1990

; Version Devpac II uniquement

; (pour Seka, allez au diable)
;incdir "Devpac2:Include

* FUNCDEF macro definition for 'exec/exec_lib.i'

FUNCDEF     MACRO    *function
_LVO\1      EQU      FUNC_CNT
FUNC_CNT    SET      FUNC_CNT-6
            ENDM
FUNC_CNT    SET      5*-6

	INCDIR  "C:\Users\kamel\Desktop\vbcc\NDK_3.1\Includes_Libs\include_i\"
	INCLUDE	"exec/exec.i"
	INCLUDE "exec/exec_lib.i"
	INCLUDE "exec/memory.i"
	INCLUDE "intuition/intuition_lib.i"
	INCLUDE "intuition/intuition.i"
	INCLUDE "graphics/graphics_lib.i"
	INCLUDE "graphics/view.i"
	INCLUDE "graphics/gfx.i"
	INCLUDE "libraries/dos_lib.i"
	INCLUDE "libraries/dos.i"



; Définition de la structure BMHD facon Include

	rsreset
BMHD	               rs.b 0
bmhd_w:                rs.w 1
bmhd_h:                rs.w 1
bmhd_x:	               rs.w 1
bmhd_y:                rs.w 1
bmhd_nPlanes:          rs.b 1
bmhd_masking:          rs.b 1
bmhd_compression:      rs.b 1
bmhd_pad1:             rs.b 1
bmhd_transparentColor: rs.w 1
bmhd_xAspect:          rs.b 1 
bmhd_yAspect:          rs.b 1
bmhd_pageWidth:        rs.w 1
bmhd_pageHeight:       rs.w 1
bmhd_SIZEOF:           rs.w 0

; Définition des bits inutiles du CAMG
;en vue du masquage pour ViewModes
CAMGMASK EQU ((~(V_SPRITES|GENLOCK_VIDEO))&$FFFF)
;ExecBase EQU 4
; Petite macro pour nous simplifier la vie CALL
CALL	MACRO
	jsr	_LVO\1(a6)
	ENDM
	
; C'est parti mon kiki !; **************************************

Start:	
		move.l  $4.w,a6
		move.b #0,-1(a0,d0.w)
		subq #1,d0
		beq NoArg
		move.l a0,FileName
		
; Ouverture de l'intuition library
		lea IntName(pc),a1
		moveq #0,d0
		CALL OpenLibrary
		move.l  d0,IntBase
		beq.s Nolnt
		
; Ouverture de la graphics.library
; Ouverture de la graphics.library
		lea GfxName(pc),a1
		moveq #0,d0
		CALL OpenLibrary
		move.l  d0,GfxBase
		beq.s NoGfx

; Ouverture de la dos.library
		lea DosName(pc),a1
		moveq #0,d0
		CALL OpenLibrary
		move.l d0,DosBase
		beq.s NoDos

; Charge l'image IFF
		bsr.s LoadPic
		tst.l d7
; Erreur de chargement ?
		beq.s NoPic
; Et l'affiche
		bsr DisplayIFF
; Libére la mémoire du fichier

		move.l  $4.w,a6
		move.l	Picture(pc),a1
		move.l	FileSize(pc),d0
		CALL FreeMem
		
; Ferme la dos.library 
NoPic:	move.l  DosBase(pc),a1
		CALL CloseLibrary
		
; Ferme la graphics.library 
NoDos:	move.l  GfxBase(pc),a1
		CALL CloseLibrary
NoGfx:	move.l IntBase(pc),a1
		CALL CloseLibrary
		
Nolnt:
NoArg: rts
; *************************************
; * Routine de chargement du fichier  *
; * IFF en mémoire.				      *
; * en sortie, d7 sert de flag:       *
; * d7=0 -> une erreur est survenue   *
; * d7<>0 -> tout s'est bien passé    *
; *************************************

LoadPic: 
		moveq #0,d7	;d7=0 -> erreur sinon Ok
; Réserve 260 octets de CHIP-RAM pour Examine()
		move.l	#fib_SIZEOF,d0
		move.l #MEMF_PUBLIC|MEMF_CLEAR,d1
		CALL AllocMem
		tst.l d0
		beq NoMem
		move.l d0,a5
		
; Obtient un Lock sur le fichier !
		move.l  DosBase(pc),a6
		move.l	FileName(pc),d1
		moveq	#ACCESS_READ,d2
		CALL 	Lock
		move.l d0,filelock_an
		beq.s 	NoLock
		
; Fichier inexistant

; Examine() le fichier
		move.l d0,d1
		move.l  a5,d2
		CALL Examine
		
; Est-ce un répertoire ?
		tst.l fib_DirEntryType(a5)
		bpl.s IsDir
; Oui!
		move.l	fib_Size(a5),FileSize
; Sinon, sauve sa taille

; Réserve de la mémoire pour charger le fichier
		move.l	$4.w,a6
		move.l	FileSize(pc),d0
		moveq	#MEMF_PUBLIC,d1
		CALL	AllocMem
		move.l	d0,Picture
		beq.s	NoMem2

; Ouvre le fichier
		move.l	DosBase(pc),a6
		move.l	FileName(pc),d1
		move.l	#MODE_OLDFILE,d2
		CALL 	Open
		move.l	d0,d6
		beq		OpenErr
		
; Erreur d'ouverture
; Charge le fichier en mémoire
		move.l	d0,d1
		move.l	Picture(pc),d2
		move.l	FileSize(pc),d3
		CALL	Read
		
; Ferme le fichier
		move.l  d6,d1
		CALL	Close
		moveq 	#-1,d7
		
;d7<>0 -> Tout s'est bien passé
IsDir:
NoMem2:
OpenErr:; Libére le Lock du fichier
		move.l	filelock_an,d1
		CALL	UnLock
		
; Libère la mémoire d'Examine() 
NoLock:	move.l	$4.w,a6
		move.l	a5,a1
		move.l	#fib_SIZEOF,d0
		CALL	FreeMem
NoMem:	rts

;************************************************
;* Routine d'atfichage de l'image IFF           *
;* Gére les modes compacté et étendu            *
;************************************************
;* Algorythme de compactage :                   *
;* tester l'octet de contrôle n; si n égale:    *
;* 0...127 : copier n+1 octets de données       *
;* -1...-127 : répéter -n+1 fois l'octet suivant*
;*  -128: ne rien faire (ah bon ?}              * 
;************************************************

DisplayIFF:
		move.l Picture(pc),a5
;a5=image FF
		lea ScreenDefs(pc),a4
;a4=structure NewSereen
		cmpi.l #'FORM',(a5)+
; Vérifie si c’est un fichier IFF
		bne IFFErr
;Non!
		move.l	(a5)+,d0
		add.l 	a5,d0
; Sauve sa taille
		move.l 	d0,FormEnd
		cmpi.l	#'ILBM',(a5)+
; Vérifie si c'est un fichier ILBM
		bne IFFErr
;Non!
; Boucle principale 
Do:		move.l	(a5)+,d7
;d7=ChunkName
		move.l	(a5)+,d6
;d6=ChunkSize ,
cBMHD:	
		cmpi.l #'BMHD',d7
		bne.s cCMAP
; Chunk BMHD (Bitmap Header)
		move.w bmhd_w(a5),ns_Width(a4)
; Largeur
		move.w bmhd_h(a5),ns_Height(a4)
; Hauteur
		move.b bmhd_nPlanes(a5),ns_Depth+1(a4)
; Profondeur
		tst.b bmhd_compression(a5)
; Fichier compressé ?
		sne Compress
; Oui -> positionne le flag
		bra Loop
; Prochain chunk
cCMAP:	cmpi.l #'CMAP',d7
		bne.s cCAMG
; Chunk CMAP (Color Map)
		move.w  d6,d7
		ext.l	d7
		divu #3,d7
;d7 = nombre de couleurs
		cmpi.w  #32,d7
; Plus de 32 couleurs ?
		ble.s	CoulOk
		moveq #32,d7
; Oui -> 32 couleurs max (c'est moi !) 
CoulOk: move.w d7,NbCoul
; Sauve le nombre de couleurs
		lea Palette(pc),a2
		moveq #0,d5
		subq #1,d7
CoLoop: move.b (a5)+,d5
; Composante Rouge
		lsl.w #4,d5
		or.b (a5)+,d5
; Composante Vert
		lsl.w #4,d5
		or.b (a5)+,d5
; Composante Bleu
		lsr.w #4,d5
		move.w  d5,(a2)+
; Sauve le RVB dans la palette
		dbra d7,CoLoop
; prochaine couleur
		moveq #0,d6
		bra Loop
; Prochain chunk
cCAMG:	cmp.l #'CAMG',d7
		bne.s cBODY
; Chunk CAMG (Commodore Amiga)
		move.l (a5),d0
		andi.l #CAMGMASK,d0
; Masque les bits indésirables
		move.w  d0,ns_ViewModes(a4)
; Mode d'écran dans Ia structure
		bra Loop
; NewScreen (HAM, EHB, etc.)
cBODY:	
		cmp.l #'BODY',d7
		bne Loop
; Chunk BODY (données graphiques) STOP :
		move.l IntBase(pc),a6
; Ouvre l'écran
		lea ScreenDefs(pc),a0
		move.w  #CUSTOMSCREEN|SCREENQUIET,ns_Type(a0)
		CALL OpenScreen
		move.l  d0,ScrHandle
		beq IFFErr
; Si erreur, on stoppe tout

; Charge la palette de couleurs
		move.l  GfxBase(pc),a6
		move.l d0,a0
;:a0 = ScreenHandle
		lea sc_ViewPort(a0),a0
		lea Palette(pc),a1
		move.w NbCoul(pc),d0
; Nombre de couleurs
		ext.l d0
		CALL LoadRGB4
; C'est parti !
; Le vrai boulot commence ici
		move.w ns_Width(a4),d5
; Largeur en pixels
		lsr.w #3,d5
;/8 = largeur en octets
		moveq #0,d0
;Compteurlignes 
Lignes: move.l  ScrHandle(pc),a3
		lea sc_BitMap+bm_Planes(a3),a3
		move.w ns_Depth(a4),d1
; Compteur bitplanes
		subq.w #1,d1
;-1 pour dbra 
Planes: move.l (a3)+,a0
;a0 = bitplane en cours
		move.w d0,d2
		mulu d5,d2
		lea (a0,d2.l),a0
; pointe la bonne ligne
		moveq #0,d2
		tst.b Compress
; image compressée ?
		beq Normal
;non
; Au cas ou l'image est compressée 
Comp:	moveq #0,d3
		move.b  (a5)+,d3
; octet de controle dans d3
		bmi.s Crunch
; négatif -> décompresser
		ext.w d3
		add.w d3,d2
		addq.w #1,d2
CompL: 	
		move.b (a5)+,(a0)+
; sinon copier n octets
		dbra d3,CompL
		bra.s NextByte
; au suivant !
Crunch: cmpi.b  #$80,d3
; n=>128 ($80) ?
		beq.s NextByte
; oui -> rien a faire
		neg.b d3
;sinon n=-n
		ext.w d3
		add.w d3,d2
		addq.w #1,d2
		move.b (a5)+,d4
; prendre octet de donnée 
CrunchL:
		move.b  d4,(a0)+
; et le répéter n+1 fois
		dbra d3,CrunchL
; (+1 car dbra)
NextByte:
		cmp.w  d5,d2
; fin de ligne atteinte ?
		blt.s Comp
; pas encore
		bra.s NextL
; si oui passe au plan suivant
; Cas d'une image "étendue" (IFF-Converter) 
Normal:	move.w d5,d4
; largeur en octets
		subq.w #1,d4
;-1 pour dbra
NLoop:
		move.b  (a5)+,(a0)+
; copier les données
		dbra d4,NLoop
; une ligne complète
; Une ligne est atfichée,
; on passe au plan suivant 
NextL:	dbra d1,Planes
; Quand tous les plans de la ligne sont traités
; on passe à Ia ligne suivante
		addq.w #1,d0
; compteur de lignes incrémenté
		cmp.w ns_Height(a4),d0
; la hauteur est atieinte ?
		blt.s Lignes
; Non, on continue
		moveq #0,d6
;si oui on a fini; On arrive ici quand un chunk a été traité
; (ou ignoré pour ceux qui ne sont pas gérés) 
Loop:	adda.l d6,a5
; Saute le chunk
; quon vient de traiter
		move.l a5,d6
; Vérifie qu'a5 est pair
		andi.b #1,d6
		beq.s Pair
		addq.l #1,a5
; Si impair, on l'incrémente 
Pair:	cmpa.l  FormEnd(pc),a5
; Fin de la FORM?
		blt Do
; Pas encore
; Attend ALT-Gauche 
Wait:	cmp.b #$37,$bfec01
		bne.s Wait
; Ferme l'écran
		move.l IntBase(pc),a6
		move.l ScrHandle(pc),a0
		CALL CloseScreen
; Retour à l'envoyeur 
IFFErr:		rts
; Variables diverses 
FormEnd:
		   dc.l 0
;          Taille de la FORM 
Compress:  dc.b 0,0
NbCoul:    dc.w 0
;          Nombre de couleurs 
Palette:   ds.w 32
;          Palette de 32 couleurs 
IntBase:     dc.l 0
GfxBase:     dc.l 0
DosBase:     dc.l 0
ScrHandle:   dc.l 0
FileName:    dc.l 0
filelock_an:    dc.l 0
filehandle_an:  dc.l 0
FileSize:    dc.l 0
Picture:     dc.l 0
IntName: 
		dc.b "intuition.library",0
		even
GfxName: 
		dc.b "graphics.library",0
		even
DosName: 
		dc.b "dos.library",0
		even
; Structure NewScreen 
ScreenDefs: ds.b ns_SIZEOF
END
kamelito is offline  
 


Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
 
Thread Tools

Similar Threads
Thread Thread Starter Forum Replies Last Post
'Harald Haardtand' whdload crash code 103 hippox89 support.FS-UAE 24 04 July 2017 05:40
2.5.30 to 2.4.1 crash... mjnurney support.FS-UAE 3 10 April 2015 14:04
1.0 Crash Methanoid support.WinUAE 0 21 June 2005 00:08
3D code and/or internet code for Blitz Basic 2.1 EdzUp Retrogaming General Discussion 0 10 February 2002 12:40
crash?? Unregistered support.WinUAE 2 31 May 2001 15:32

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT +2. The time now is 14:59.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2020, vBulletin Solutions Inc.
Page generated in 0.08042 seconds with 13 queries