forked from mtuomi/SecondReality
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTWEAK.ASM
executable file
·350 lines (260 loc) · 4.21 KB
/
TWEAK.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
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
IDEAL
MODEL large
P386
CODESEG
PUBLIC C tw_opengraph, C tw_putpixel, C tw_setpalette, C tw_setstart
PUBLIC C tw_pictovmem, C tw_closegraph, C tw_waitvr, C tw_setrgbpalette
PUBLIC C tw_clrscr, C tw_setpalarea, C tw_getpixel, C tw_opengraph2
PUBLIC C scr_seg ; videomuistin alku segmentti
planetau db 1,2,4,8
scr_seg dw 0a000h
; avaa 320x200 tweak tilan, 4 sivua, 4 planea
PROC tw_opengraph
mov dx, 03c4h
mov ax, 0f02h
out dx, ax
mov dx, 0a000h
mov es, dx
xor di, di
xor ax, ax
mov cx, 8000h
rep stosw ; clear vmem
mov dx, 3d4h
mov ax, 0209h
out dx, ax ; 134 y
mov ax, 5013h
out dx, ax ; 640 wide
ret
ENDP
PROC tw_opengraph2
mov dx, 03c4h
mov ax, 0604h
out dx, ax ; chain4 off
mov ax, 0f02h
out dx, ax
mov dx, 0a000h
mov es, dx
xor di, di
xor ax, ax
mov cx, 8000h
rep stosw ; clear vmem
mov dx, 03d4h
mov ax, 0014h
out dx, ax ; crtc long off
mov ax, 0e317h
out dx, ax ; crtc byte on
mov ax, 0009h
out dx, ax ; 400
mov ax, 3013h
out dx, ax ; 384 wide
ret
ENDP
PROC tw_clrscr
mov dx, 3c4h
mov ax, 0f02h
out dx, ax
mov dx, [cs:scr_seg]
mov es, dx
xor di, di
xor eax, eax
mov cx, 1000h
rep stosd ; clear vmem
ret
ENDP
PROC tw_closegraph
mov ax, 03h
int 10h
ret
ENDP
; piirt„„ pisteen ruudulle
PROC tw_putpixel
ARG x:word, y:word, color:word
push bp
mov bp, sp
mov ax, [cs:scr_seg]
mov es, ax
mov dx, 03c4h
mov bx, [x]
and bx, 03h
mov ah, [cs:planetau+bx]
mov al, 02h
out dx, ax ; select plane
mov bx, [x]
shr bx, 2
mov ax, [y]
shl ax, 4
add bx, ax
shl ax, 1
add bx, ax
shl ax, 2
add bx, ax
mov cx, [color]
mov [es:bx], cl
pop bp
ret
ENDP
PROC tw_getpixel
ARG x:word, y:word
push bp
mov bp, sp
mov ax, [scr_seg]
mov es, ax
mov dx, 03ceh
mov ax, [x]
and ax, 03h
mov ah, al
mov al, 04h
out dx, ax ; select plane
mov ax, [y]
shl ax, 4
mov bx, ax
shl ax, 1
add bx, ax
shl ax, 2
add bx, ax
mov ax, [x]
shr ax, 2
add bx, ax
xor ax, ax
mov al,[es:bx]
pop bp
ret
ENDP
; vaihtaa koko paletin
PROC tw_setpalette
ARG pal:dword
push bp
mov bp, sp
push si ds
lds si,[pal]
cld
mov cx, 300h
mov dx, 03c8h
mov al, 0
out dx, al
inc dx
rep outsb
pop ds si
pop bp
ret
ENDP
PROC C tw_setpalarea
ARG pal:dword, start:word, cnt:word
push si ds
lds si,[pal]
cld
mov cx, [cnt]
mov ax, cx
add cx, ax
add cx, ax
mov dx, 03c8h
mov ax, [start]
out dx, al
inc dx
rep outsb
pop ds si
ret
ENDP
; asettaa videomuistin alun
PROC tw_setstart
ARG start:word
push bp
mov bp,sp
mov bx, [start]
mov dx, 03d4h
mov al, 0dh
mov ah, bl
out dx, ax
mov al, 0ch
mov ah, bh
out dx, ax
pop bp
ret
ENDP
; kopioi muistista unpacked 1bpl kuvan 4planen kuvaksi videomuistiin
; void tw_pictovmem(char far *pic, unsigned int vstart, unsigned int bytes);
PROC tw_pictovmem
ARG pic:dword,to:word,len:word
push bp
mov bp,sp
push ds es si di
mov es, [scr_seg]
mov di, [to]
lds si, [pic]
mov cx, [len]
mov dx,03ceh
mov ax,4005h ; w-mode 0
out dx,ax
mov dx, 03c4h
mov al, 02h
mov ah, 1h
out dx, ax
shr cx, 2
@@l1:
movsb
add si, 3
loop @@l1
lds si, [pic]
add si, 1d
mov di, [to]
mov cx, [len]
mov ax, 0202h
out dx, ax
shr cx, 2
@@l2:
movsb
add si, 3
loop @@l2
lds si, [pic]
add si, 2d
mov di, [to]
mov cx, [len]
mov ax, 0402h
out dx, ax
shr cx, 2
@@l3:
movsb
add si, 3
loop @@l3
lds si, [pic]
add si, 3d
mov di, [to]
mov cx, [len]
mov ax, 0802h
out dx, ax
shr cx, 2
@@l4:
movsb
add si, 3
loop @@l4
pop di si es ds
pop bp
ret
ENDP
PROC tw_waitvr
mov dx, 03dah
@@loop1:
in al, dx
test al, 08h
jnz @@loop1
@@loop2:
in al, dx
test al, 08h
jz @@loop2
ret
ENDP
PROC C tw_setrgbpalette
ARG pal:word, r:word, g:word, b:word
mov dx, 3c8h
mov ax, [pal]
out dx, al
inc dx
mov ax, [r]
out dx, al
mov ax, [g]
out dx, al
mov ax, [b]
out dx, al
ret
ENDP
END