-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathunlzsa3_from_bp.s
More file actions
150 lines (128 loc) · 3.17 KB
/
Copy pathunlzsa3_from_bp.s
File metadata and controls
150 lines (128 loc) · 3.17 KB
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# vim: set tabstop=4 :
# optimized LZSA3 decompressor for PDP-011 by Manwe and Ivanq
# Thanks to Ivan Gorodetsky
# Usage:
# MOV $CPB1DT,R1
# MOV $dst_adr,R2
# MOV $CBPADR,R4
# MOV $src_adr,(R4)
# CALL Unpack
#.global Unpack
UnpackFromBP:
CLR R5 # no nibbles sign
UnpackFromBP.Token:
MOVB (R1),R3 # read token
INC (R4)
UnpackFromBP.Liter:
MOV R3,R0
BIC $0177774,R0 # get 2 bits
BEQ UnpackFromBP.Decode
CMP R0,$3 # literals length
BNE UnpackFromBP.Copy
CALL UnpackFromBP.Extend
UnpackFromBP.Copy:
MOVB (R1),(R2)+ # literals length in R0
INC (R4)
SOB R0,UnpackFromBP.Copy
UnpackFromBP.Decode:
PUSH R3
ROLB R3 # get 2 bits
ROL R0
ROLB R3
ROL R0
ASL R0
ADD R0,PC # run subroutine
BR UnpackFromBP.oOther
BR UnpackFromBP.o9bit
BR UnpackFromBP.o13bit
UnpackFromBP.o5bit:
CALL UnpackFromBP.Nibble # get nibble in R0
ROLB R3
ROL R0
INC R0
UnpackFromBP.Save:
MOV R0,UnpackFromBP.offset # save offset for future
UnpackFromBP.Match:
POP R0
ASR R0
ASR R0
BIC $0177770,R0 # get 3 bits
CMP R0,$7
BNE UnpackFromBP.Clone
CALL UnpackFromBP.Extend
TSTB R0 # match length
BEQ UnpackFromBP.Exit
UnpackFromBP.Clone:
MOV R2,R3
.equiv UnpackFromBP.offset, .+2
SUB $0,R3
MOVB (R3)+,(R2)+
INC R0
1$:
MOVB (R3)+,(R2)+
SOB R0,1$
BR UnpackFromBP.Token
UnpackFromBP.o9bit:
CLR R0
BISB (R1),R0
INC (R4)
ROLB R3
ROL R0
INC R0
BR UnpackFromBP.Save
UnpackFromBP.o13bit:
CALL UnpackFromBP.Nibble # get nibble in R0
ROLB R3
ROL R0
SWAB R0
BISB (R1),R0 # 8 bits
INC (R4)
ADD $513,R0
BR UnpackFromBP.Save
UnpackFromBP.oOther:
ROLB R3
BCS UnpackFromBP.Match
BISB (R1),R0 # read 016 bits
INC (R4)
SWAB R0
BISB (R1),R0
INC (R4)
BR UnpackFromBP.Save
UnpackFromBP.Nibble:
COM R5
BMI 1$
MOV R5,R0
CLR R5
BR 2$
1$: BICB (R1),R5 # read 2 nibbles
INC (R4)
MOV R5,R0
ASR R0
ASR R0
ASR R0
ASR R0
2$: BIC $0177760,R0 # leave 4 low bits
RETURN
UnpackFromBP.Extend:
PUSH R0 # save original value
CALL UnpackFromBP.Nibble # get nibble in R0
BNE UnpackFromBP.Ext2
BISB (R1),R0
INC (R4)
TST R0
BNZ UnpackFromBP.Ext1
# unnecessary for short files
BISB (R1),R0 # read high byte
INC (R4)
SWAB R0
BISB (R1),R0 # read low byte
INC (R4)
TST (SP)+ # skip saved R0
RETURN
UnpackFromBP.Ext1:
ADD $15,R0
UnpackFromBP.Ext2:
DEC R0
ADD (SP)+,R0 # add original value
UnpackFromBP.Exit:
RETURN