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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
|
AREA |ARM$$code|,CODE,READONLY
IMPORT messages_get
IMPORT realloc
IMPORT strcpy
IMPORT |__rt_stkovf_split_big|
EXPORT awrender_init
EXPORT awrender_render
aw_rsz_block * 0
aw_rsz_size * 4
aw_fixed_block * 8
aw_fixed_size * 12
aw_sl * 16
aw_fp * 20
sizeof_aw * 24
; os_error *awrender_init(byte **doc, size_t *doc_size, void *init_routine, void *init_workspace);
awrender_init MOV ip,sp
STMFD sp!,{a1,a2,v1,v2,fp,ip,lr,pc}
SUB fp,ip,#4
SUB ip,sp,#512
CMP ip,sl
BLMI |__rt_stkovf_split_big|
LDR v2,=aw_temp
LDR a1,[a1]
MOV v1,a3
LDR a3,[a2]
MOV ip,a4
STR a1,[v2,#aw_rsz_block]
STR a3,[v2,#aw_rsz_size]
MOV a2,#-1
STR a2,[v2,#aw_fixed_block]
STR a3,[v2,#aw_fixed_size]
STR sl,[v2,#aw_sl]
STR fp,[v2,#aw_fp]
ADR a2,aw_callback
MOV lr,pc
MOV pc,v1
MOVVC a1,#0
;return updated block ptr & size to caller
LDR a2,[fp,#-28]
LDR a3,[fp,#-24]
LDR ip,[v2,#aw_rsz_block]
LDR lr,[v2,#aw_rsz_size]
STR ip,[a2]
STR lr,[a3]
LDMEA fp,{v1,v2,fp,sp,pc}
; os_error *awrender_render(const char *doc,
; const struct awinfo_block *info,
; const os_trfm *trans,
; const int *vdu_vars,
; char **rsz_block,
; size_t *rsz_size,
; int wysiwyg_setting,
; int output_dest,
; size_t doc_size,
; void *routine,
; void *workspace);
awrender_render MOV ip,sp
STMFD sp!,{v1-v4,fp,ip,lr,pc}
SUB fp,ip,#4
SUB ip,sp,#512
CMP ip,sl
BLMI |__rt_stkovf_split_big|
LDR R12,[fp,#20]
LDR R14,=aw_temp
LDR R5,[fp,#4]
LDR R6,[fp,#12]
LDR R4,[R5] ;resizable block
LDR R7,[fp,#16]
STR R4,[R14,#aw_rsz_block]
STR R0,[R14,#aw_fixed_block] ;document ptr
STR R12,[R14,#aw_fixed_size] ;document size
LDR R12,[fp,#8]
STR R5,[sp,#-4]! ;ptr to receive block
STR R12,[sp,#-4]! ;ptr to receive size
LDR R12,[R12]
ADR R5,aw_callback
STR R12,[R14,#aw_rsz_size]
STR sl,[R14,#aw_sl]
STR fp,[R14,#aw_fp]
LDR R12,[fp,#28]
MOV lr,pc
LDR pc,[fp,#24]
MOVVC a1,#0
;return updated block ptr & size to caller
LDR R7,=aw_temp
LDR R12,[sp],#4
LDR R4,[sp],#4
LDR R5,[R7,#aw_rsz_size]
LDR R6,[R7,#aw_rsz_block]
STR R5,[R12]
STR R6,[R4]
LDMEA fp,{v1-v4,fp,sp,pc}
; Callback routine for block resizing
; (passed to AWRender init and render routines)
;
; entry R11 = reason code
; 0 = CallBackReason_Memory
; exit R0 => base of resizable block
; R1 = size of resizable block
; R2 => base of fixed block (or -1 if no fixed block)
; R3 = size of fixed block (or document in resizable block)
; VC if resize successful, VS and R0 => error otherwise
aw_callback TEQ R11,#0
LDREQ R11,=aw_temp
MOVNE PC,R14
CMP R0,#-1 ;read block size?
LDRNE R2,[R11,#aw_rsz_size]
MOVNE R1,R0 ;new block size
LDR R0,[R11,#aw_rsz_block]
BEQ aw_read
; Note: because ArtworksRenderer seems to call
; this routine for every scanline rendered
; we never call realloc unless we have to in
; order to expand the block. Also it calls
; us with a size request of 0 which we must
; safely ignore otherwise rendering will stop.
CMP R1,R2
BLS aw_read
STMFD R13!,{R1,R10-R12,R14}
LDR sl,[R11,#aw_sl]
LDR fp,[R11,#aw_fp]
BL realloc
LDMFD R13!,{R1,R10-R12,R14}
CMP R0,#0 ;did it work?
BEQ aw_nomem
STR R0,[R11]
STR R1,[R11,#aw_rsz_size]
aw_read ; return details of fixed block
LDR R2,[R11,#aw_fixed_block]
LDR R3,[R11,#aw_fixed_size]
SUBS R11,R11,R11 ;clear V
MOV PC,R14
aw_nomem STMFD R13!,{R10,R12,R14}
LDR sl,[R11,#aw_sl]
LDR fp,[R11,#aw_fp]
ADR R0,tok_nomem
BL messages_get
MOV a2,a1
LDR a1,=errblk + 4
BL strcpy
SUB R0,R0,#4 ;error number already 0
MOV R11,#0 ;restore reason code
CMP PC,#1<<31 ;set V
LDMFD R13!,{R10,R12,PC}
tok_nomem = "NoMemory",0
ALIGN
AREA |ARM$$zidata|,DATA,NOINIT
aw_temp % sizeof_aw
errblk % 256
END
|