-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathunlzsa3.s
More file actions
119 lines (98 loc) · 2.32 KB
/
Copy pathunlzsa3.s
File metadata and controls
119 lines (98 loc) · 2.32 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
# vim: set tabstop=4 :
# optimized LZSA3 decompressor for PDP-011 by Manwe and Ivanq
# Thanks to Ivan Gorodetsky
# Usage:
# MOV $src_adr,R1
# MOV $dst_adr,R2
# CALL Unpack
#.global Unpack
Unpack: CLR R5 # no nibbles sign
Token: MOVB (R1)+,R3 # read token
Liter: MOV R3,R0
BIC $0177774,R0 # get 2 bits
BEQ Decode
CMP R0,$3 # literals length
BNE Copy
CALL Extend
Copy:
MOVB (R1)+,(R2)+ # literals length in R0
SOB R0,Copy
Decode: PUSH R3
ROLB R3 # get 2 bits
ROL R0
ROLB R3
ROL R0
ASL R0
ADD R0,PC # run subroutine
BR oOther
BR o9bit
BR o13bit
o5bit: CALL Nibble # get nibble in R0
ROLB R3
ROL R0
INC R0
Save: MOV R0,R4 # save offset for future
Match: POP R0
ASR R0
ASR R0
BIC $0177770,R0 # get 3 bits
CMP R0,$7
BNE Clone
CALL Extend
TSTB R0 # match length
BEQ Exit
Clone: MOV R2,R3
SUB R4,R3
MOVB (R3)+,(R2)+
INC R0
1$:
MOVB (R3)+,(R2)+
SOB R0,1$
BR Token
o9bit: CLR R0
BISB (R1)+,R0
ROLB R3
ROL R0
INC R0
BR Save
o13bit: CALL Nibble # get nibble in R0
ROLB R3
ROL R0
SWAB R0
BISB (R1)+,R0 # 8 bits
ADD $513,R0
BR Save
oOther: ROLB R3
BCS Match
BISB (R1)+,R0 # read 016 bits
SWAB R0
BISB (R1)+,R0
BR Save
Nibble: COM R5
BMI 1$
MOV R5,R0
CLR R5
BR 2$
1$: BICB (R1)+,R5 # read 2 nibbles
MOV R5,R0
ASR R0
ASR R0
ASR R0
ASR R0
2$: BIC $0177760,R0 # leave 4 low bits
RETURN
Extend: PUSH R0 # save original value
CALL Nibble # get nibble in R0
BNE Ext2
BISB (R1)+,R0
BNE Ext1
# unnecessary for short files
BISB (R1)+,R0 # read high byte
SWAB R0
BISB (R1)+,R0 # read low byte
TST (SP)+ # skip saved R0
RETURN
Ext1: ADD $15,R0
Ext2: DEC R0
ADD (SP)+,R0 # add original value
Exit: RETURN