-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathCPTI2B2.S
97 lines (84 loc) · 2.74 KB
/
CPTI2B2.S
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
;---------------------------------------------------------------
; 25/11/91
;
; cpti (version >64Ko)
;
; compactage de fichier
;
; entree: d0 taille (en octets) forcement paire
; a0 adresse du fichier
; a1 adresse du buffer (meme taille que fichier)
;sortie: d0 taille du fichier compacte
;
;
cpti:: move.l d0,d1 ;recherche du nombre de mots a "0" ou "1"
subq.l #1,d1 ;resultat dans [d3]
movea.l a0,a2
clr.w d3
boucle: move.b (a2)+,d2
beq plus
cmpi.b #$ff,d2
beq.s plus
; dbra d1,boucle
subq.l #1,d1
bge boucle
retour: addi.l #15,d3
andi.w #$fff0,d3
lsr.l #3,d3 ;d3 taille en nombre d'octets zone 2eme passe
move.l d0,d4
addi.l #15,d4
andi.w #$fff0,d4
lsr.l #3,d4 ;d4 taille zone 1ere passe
movea.l a1,a2
move.l d0,(a1)+
move.l d4,(a1)+
move.l d3,(a1)+
move.l d3,d1
add.l d4,d1
lsr.l #1,d1
subq.w #1,d1
clear:
clr.w (a1)+
; dbra d1,clear
subq.l #1,d1
bge.s clear
; ;[a1] pointe sur zone donnee
movea.l a2,a3
addq.l #6,a3 ;[a3] pointe sur zone 1ere passe
moveq.l #7,d3 ;[d3] No bit dans le mot
movea.l a3,a4
adda.l d4,a4 ;[a4] pointe sur zone 2eme passe
moveq.l #7,d4 ;[d4] No bit dans le mot
move.l d0,d1
subq.l #1,d1
loop: move.b (a0)+,d2
beq.s zero
cmpi.b #$ff,d2
beq.s un
move.b d2,(a1)+
suite2: subq.w #1,d3
bge.s suite6
moveq.l #7,d3
addq.w #1,a3
suite6:
; dbra d1,loop
subq.l #1,d1
bge loop
suba.l a2,a1
; moveq.l #0,d0
move.l a1,d0
rts
zero: bset d3,(a3)
bra.s bitplus
un: bset d3,(a3)
bset d4,(a4)
bitplus: subq.w #1,d4
bge.s suite2
move.w #7,d4
addq.l #1,a4
bra.s suite2
plus: addq.l #1,d3
; dbra d1,boucle
subq.l #1,d1
bge boucle
bra.s retour