-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathobjects.asm
267 lines (244 loc) · 3.91 KB
/
objects.asm
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
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
keep obj/objects
mcopy objects.macros
****************************************************************
*
* Object Libraries
*
* These libraries are for use with the 65816 ORCA/Pascal
* native code compiler.
*
* Copyright 1993
* Byte Works, Inc.
* All rights reserved.
*
* By Mike Westerfield
* February 1993
*
****************************************************************
*
Dummy start
end
****************************************************************
*
* ~NewOjbect - Allocate and initialize a new object
*
* Inputs:
* Inputs are pushed on teh stack as follows:
* addr - address of the object variable
* family - (word) family number
* size - (long) size of the object
* methods - For each method, two longs are pushed:
* function address
* disp in object
* count - number of method parameters
*
****************************************************************
*
~NewObject start
tsc set up two pointer workspaces
sec
sbc #8
tcs
phd
tcd
lda 12 push the object family
asl A
asl A
asl A
tax
lda 18,X
pha
lda 16,X push the size of the object, twice
tay
lda 14,X
phy
pha
phy
pha
lda 20,X save the address of the pointer
sta 5
lda 22,X
sta 7
jsl ~New allocate memory (uses one size from stack)
sta 1 save the pointer
stx 3
sta [5]
txa
ldy #2
sta [5],Y
ora 1 handle an out of memory error
bne lb1
ph2 #5
jsl SystemError
pla
pla
pla
pld
pla
pla
pla
pla
phb
plx
ply
pla
asl A
asl A
asl A
adc #12
pha
tsc
clc
adc 1,S
tcs
phy
phx
plb
rtl
lb1 pla set the object size
sta [1]
ldy #2
pla
sta [1],Y
ldy #4 set the object generation
pla
sta [1],Y
lda 12 for each method do
beq lb3
phb
phk
plb
sta count
ldx #14
ldy #2
lb2 clc find the save address
lda 0,X
adc 1
sta 5
lda 2,X
adc 3
sta 7
lda 4,X save the method address
sta [5]
lda 6,X
sta [5],Y
txa X += 8
clc
adc #8
tax
dec count loop
bne lb2
plb
lb3 lda 12 fix the stack and return
asl A
asl A
asl A
clc
adc #20
tax
lda 10
sta 2,X
lda 9
sta 1,X
pld
tsc
phx
clc
adc 1,S
tcs
rtl
count ds 2 loop counter
end
****************************************************************
*
* function Member (object: tObject; generation: boolean): boolean
*
* parameters:
* object - object to check
* generation - generation of the object type
*
****************************************************************
*
~Member start
result equ 1 result of the call
genDisp equ 4 disp of generation in an object
sub (4:object,2:generation),2
stz result
lda object
ora object+2
beq lb1
ldy #genDisp
lda generation
beq lb1
cmp [object],Y
bgt lb1
inc result
lb1 ret 2:result
end
****************************************************************
*
* function Clone: tObject
*
* Creates a copy of an object
*
****************************************************************
*
tObject~Clone start
jml tObject~ShallowClone
end
****************************************************************
*
* procedure Free
*
* Disposes of an object
*
****************************************************************
*
tObject~Free start
jml tObject~ShallowFree
end
****************************************************************
*
* function ShallowClone: tObject
*
* Creates a copy of an object
*
****************************************************************
*
tObject~ShallowClone start
object equ 1 copy of the object
sub (4:self),4
ldy #2 allocate space for the copy
lda [self],Y
pha
lda [self]
pha
jsl ~New
sta object
stx object+2
ora object+2 check for out of memory error
bne lb1
ph2 #5 out of memory
jsl SystemError
bra lb2
lb1 ph4 object copy the object contents
ph4 self
ldy #2
lda [self],Y
pha
lda [self]
pha
jsl ~LongMove
lb2 ret 4:object
end
****************************************************************
*
* procedure ShallowFree
*
* Disposes of an object
*
****************************************************************
*
tObject~ShallowFree start
jml ~Dispose
end