Subversion Repositories Kolibri OS

Rev

Rev 384 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
129 mikedld 1
;-----------------------------------------------------------------------------
2
func vm_mike_draw_rect.15 ;///////////////////////////////////////////////////
3
;-----------------------------------------------------------------------------
4
; eax - x start
5
; ebx - y start
6
; ecx - x end
7
; edx - y end
8
; edi - color
9
;-----------------------------------------------------------------------------
10
;- eax(ebx) [x start]*65536 + [x size]
11
;- ebx(ecx) [y start]*65536 + [y size]
12
;- ecx(edx) color 0x00RRGGBB
13
;-----------------------------------------------------------------------------
14
begin
15
	pushad
16
	cli
17
	jif	eax,e,ecx,.exit
18
	jif	ebx,e,edx,.exit
19
 
20
	call	get_cursor_rect
21
 
384 mikedld 22
	mov	ebp,[TASK_BASE]
23
	movsx	esi,word[ebp-CURRENT_TASK+0]
129 mikedld 24
	add	eax,esi
25
	add	ecx,esi
384 mikedld 26
	movsx	esi,word[ebp-CURRENT_TASK+4]
129 mikedld 27
	add	ebx,esi
28
	add	edx,esi
384 mikedld 29
;       add     eax,[ebp-CURRENT_TASK+0]
30
;       add     ebx,[ebp-CURRENT_TASK+4]
31
;       add     ecx,[ebp-CURRENT_TASK+0]
32
;       add     edx,[ebp-CURRENT_TASK+4]
129 mikedld 33
 
34
	push	eax
35
	mov	eax,edi
36
	shr	eax,3
37
	shl	ax,3
38
	shr	eax,3
39
	shl	al,3
40
	shr	eax,3
41
	mov	di,ax
42
	pop	eax
43
 
384 mikedld 44
	mov	esi,[CURRENT_TASK]
129 mikedld 45
	mov	esi,[CLIP_RECTS+esi*4]
46
	mov	ebp,[esi]
47
	or	ebp,ebp
48
	jz	.exit
49
	add	esi,4
50
  .nx:	jif	ecx,l,[rr.left],.skip
51
	jif	eax,ge,[rr.right],.skip
52
	jif	edx,l,[rr.top],.skip
53
	jif	ebx,ge,[rr.bottom],.skip
54
	pushad
55
	jif	eax,ge,[rr.left],@f
56
	mov	eax,[rr.left]
57
    @@: jif	ebx,ge,[rr.top],@f
58
	mov	ebx,[rr.top]
59
    @@: jif	ecx,l,[rr.right],@f
60
	mov	ecx,[rr.right]
61
    @@: jif	edx,l,[rr.bottom],@f
62
	mov	edx,[rr.bottom]
63
    @@: call	is_intersect_rc
64
	jc	.put
384 mikedld 65
	cmp	byte[MOUSE_VISIBLE],0
66
	je	.put
129 mikedld 67
	call	[SF.draw_mouse_under]
384 mikedld 68
	mov	byte[MOUSE_VISIBLE],0
69
  .put: mov	ebp,[BytesPerScanLine]
129 mikedld 70
	imul	ebp,ebx
71
	lea	ebp,[ebp+eax*2]
384 mikedld 72
	add	ebp,[LFBAddress]
129 mikedld 73
  .xxx: push	eax ebp
74
    @@: push	ebp
75
	call	[set_bank]
76
	mov	[ebp],di
77
	pop	ebp
384 mikedld 78
;       mov     [ebp],di
129 mikedld 79
	add	ebp,2
80
	inc	eax
81
	cmp	eax,ecx
82
	jl	@b
83
	pop	ebp eax
384 mikedld 84
	add	ebp,[BytesPerScanLine]
129 mikedld 85
	inc	ebx
86
	cmp	ebx,edx
87
	jl	.xxx
88
	popad
89
  .skip:
90
	add	esi,SR
91
	dec	ebp
92
	jnz	.nx
93
 
94
  .exit:
95
	sti
96
	popad
97
	retn
98
endf
99
 
100
;-----------------------------------------------------------------------------
101
func vm_mike_draw_line.15 ;///////////////////////////////////////////////////
102
;-----------------------------------------------------------------------------
103
; eax(ebx)  [x start] shl 16 + [x end]
104
; ebx(ecx)  [y start] shl 16 + [y end]
105
; ecx(edx)  colour 0x00RRGGBB
106
; edi = 0x00000001 force
107
;-----------------------------------------------------------------------------
108
begin
109
	pushad
110
	cli
111
 
112
	call	get_cursor_rect
113
 
114
	mov	eax,ecx
115
	shr	ecx,3
116
	shl	cx,3
117
	shr	ecx,3
118
	shl	cl,3
119
	shr	ecx,3
120
	and	eax,0x01000000
121
	or	ecx,eax
122
 
123
	movsx	eax,word[esp+4*7]  ; x end
124
	cmp	ax,[esp+4*7+2]	   ; x start
125
	je	dl.15.vert_line
126
	movsx	eax,word[esp+4*4]  ; y end
127
	cmp	ax,[esp+4*4+2]	   ; y start
128
	je	dl.15.horz_line
129
 
130
	sti
131
	popad
132
	retn
133
 
134
  dl.15.vert_line:
135
	test	edi,1
136
	jnz	.forced
384 mikedld 137
	mov	esi,[CURRENT_TASK]
129 mikedld 138
	mov	esi,[CLIP_RECTS+esi*4]
139
	mov	edi,[esi]
140
	or	edi,edi
141
	jz	.exit
142
	add	esi,4
143
  .nx:	movsx	ebx,word[esp+4*4+2]  ; y start
144
	movsx	edx,word[esp+4*4]    ; y end
145
	cmp	ebx,edx
146
	je	.exit
147
	jl	@f
148
	xchg	ebx,edx
149
    @@: jif	eax,l,[rr.left],.skip
150
	jif	eax,ge,[rr.right],.skip
151
	jif	edx,l,[rr.top],.skip
152
	jif	ebx,ge,[rr.bottom],.skip
153
	jif	ebx,ge,[rr.top],@f
154
	mov	ebx,[rr.top]
155
    @@: jif	edx,l,[rr.bottom],@f
156
	mov	edx,[rr.bottom]
157
	dec	edx
158
  .draw:
159
    @@: call	is_intersect_vln
160
	jc	.put
384 mikedld 161
	cmp	byte[MOUSE_VISIBLE],0
162
	je	.put
129 mikedld 163
	call	[SF.draw_mouse_under]
384 mikedld 164
	mov	byte[MOUSE_VISIBLE],0
165
  .put: mov	ebp,[BytesPerScanLine]
129 mikedld 166
	imul	ebp,ebx
167
	lea	ebp,[ebp+eax*2]
384 mikedld 168
	add	ebp,[LFBAddress]
129 mikedld 169
    @@: push	ebp
170
	call	[set_bank]
171
	test	ecx,0x01000000
172
	jz	.dr
173
	mov	cx,[ebp]
174
	not	cx
175
  .dr:	mov	[ebp],cx
176
	pop	ebp
384 mikedld 177
;       test    ecx,0x01000000
178
;       jz      .dr
179
;       mov     cx,[ebp]
180
;       not     cx
181
;  .dr: mov     [ebp],cx
182
	add	ebp,[BytesPerScanLine]
129 mikedld 183
	inc	ebx
184
	cmp	ebx,edx
185
	jle	@b
186
  .skip:
187
	add	esi,SR
188
	dec	edi
189
	jnz	.nx
190
  .exit:
191
	sti
192
	popad
193
	retn
194
  .forced:
195
	jif	eax,l,[viewport.left],.exit
196
	jif	eax,ge,[viewport.right],.exit
197
	movsx	ebx,word[esp+4*4+2]  ; y start
198
	movsx	edx,word[esp+4*4]    ; y end
199
	jif	ebx,e,edx,.exit
200
	jl	@f
201
	xchg	ebx,edx
202
    @@: jif	edx,l,[viewport.top],.exit
203
	jif	ebx,ge,[viewport.bottom],.exit
204
	jif	ebx,ge,[viewport.top],@f
205
	mov	ebx,[viewport.top]
206
    @@: jif	edx,l,[viewport.bottom],@f
207
	mov	edx,[viewport.bottom]
208
	dec	edx
209
    @@: mov	edi,1
210
	jmp	.draw
211
 
212
  dl.15.horz_line:
213
	test	edi,1
214
	jnz	.forced
384 mikedld 215
	mov	esi,[CURRENT_TASK]
129 mikedld 216
	mov	esi,[CLIP_RECTS+esi*4]
217
	mov	edi,[esi]
218
	or	edi,edi
219
	jz	.exit
220
	add	esi,4
221
  .nx:	movsx	ebx,word[esp+4*7+2]  ; x start
222
	movsx	edx,word[esp+4*7]    ; x end
223
	cmp	ebx,edx
224
	je	.exit
225
	jl	@f
226
	xchg	ebx,edx
227
    @@: jif	eax,l,[rr.top],.skip
228
	jif	eax,ge,[rr.bottom],.skip
229
	jif	edx,l,[rr.left],.skip
230
	jif	ebx,ge,[rr.right],.skip
231
	jif	ebx,ge,[rr.left],@f
232
	mov	ebx,[rr.left]
233
    @@: jif	edx,l,[rr.right],@f
234
	mov	edx,[rr.right]
235
	dec	edx
236
  .draw:
237
    @@: call	is_intersect_hln
238
	jc	.put
384 mikedld 239
	cmp	byte[MOUSE_VISIBLE],0
240
	je	.put
129 mikedld 241
	call	[SF.draw_mouse_under]
384 mikedld 242
	mov	byte[MOUSE_VISIBLE],0
243
  .put: mov	ebp,[BytesPerScanLine]
129 mikedld 244
	imul	ebp,eax
245
	lea	ebp,[ebp+ebx*2]
384 mikedld 246
	add	ebp,[LFBAddress]
129 mikedld 247
    @@: push	ebp
248
	call	[set_bank]
249
	test	ecx,0x01000000
250
	jz	.dr
251
	mov	cx,[ebp]
252
	not	cx
253
  .dr:	mov	[ebp],cx
254
	pop	ebp
384 mikedld 255
;       test    ecx,0x01000000
256
;       jz      .dr
257
;       mov     cx,[ebp]
258
;       not     cx
259
;  .dr: mov     [ebp],cx
129 mikedld 260
	add	ebp,2
261
	inc	ebx
262
	cmp	ebx,edx
263
	jle	@b
264
  .skip:
265
	add	esi,SR
266
	dec	edi
267
	jnz	.nx
268
  .exit:
269
	sti
270
	popad
271
	retn
272
  .forced:
273
	jif	eax,l,[viewport.top],.exit
274
	jif	eax,ge,[viewport.bottom],.exit
275
	movsx	ebx,word[esp+4*7+2]  ; x start
276
	movsx	edx,word[esp+4*7]    ; x end
277
	cmp	ebx,edx
278
	je	.exit
279
	jl	@f
280
	xchg	ebx,edx
281
    @@: jif	edx,l,[viewport.left],.exit
282
	jif	ebx,ge,[viewport.right],.exit
283
	jif	ebx,ge,[viewport.left],@f
284
	mov	ebx,[viewport.left]
285
    @@: jif	edx,l,[viewport.right],@f
286
	mov	edx,[viewport.right]
287
	dec	edx
288
    @@: mov	edi,1
289
	jmp	.draw
290
endf
291
 
292
;-----------------------------------------------------------------------------
293
func vm_mike_put_pixel.15 ;///////////////////////////////////////////////////
294
;-----------------------------------------------------------------------------
295
; eax = x coordinate
296
; ebx = y coordinate
297
; ecx = ?? RR GG BB    ; 0x01000000 negation
298
; edi = 0x00000001 force
299
;-----------------------------------------------------------------------------
300
begin
301
	pushad
302
	cli
384 mikedld 303
	mov	edx,[BytesPerScanLine]
129 mikedld 304
	imul	edx,ebx
305
	lea	edx,[edx+eax*2]
384 mikedld 306
	add	edx,[LFBAddress]
129 mikedld 307
	test	edi,1
308
	jnz	.forced
384 mikedld 309
	mov	esi,[CURRENT_TASK]
129 mikedld 310
	mov	esi,[CLIP_RECTS+esi*4]
311
	mov	edi,[esi]
312
	or	edi,edi
313
	jz	.exit
314
	add	esi,4
315
    @@: jif	eax,l,[rr.left],.skip
316
	jif	eax,ge,[rr.right],.skip
317
	jif	ebx,l,[rr.top],.skip
318
	jif	ebx,ge,[rr.bottom],.skip
319
	call	get_cursor_rect
320
	call	is_intersect_pt
321
	jc	.put
384 mikedld 322
	cmp	byte[MOUSE_VISIBLE],0
323
	je	.put
129 mikedld 324
	call	[SF.draw_mouse_under]
384 mikedld 325
	mov	byte[MOUSE_VISIBLE],0
129 mikedld 326
  .put: push	edx
327
	call	[set_bank]
328
	pop	edx
329
	test	ecx,0x01000000
330
	jz	.lp1
331
	not	word[ebp]
332
	jmp	.exit
333
  .lp1: shr	ecx,3
334
	shl	cx,3
335
	shr	ecx,3
336
	shl	cl,3
337
	shr	ecx,3
338
	mov	[ebp],cx
339
  .exit:
340
	sti
341
	popad
342
	retn
343
  .skip:
344
	add	esi,SR
345
	dec	edi
346
	jnz	@b
347
	jmp	.exit
348
  .forced:
349
	jif	eax,l,[viewport.left],.exit
350
	jif	ebx,l,[viewport.top],.exit
351
	jif	eax,ge,[viewport.right],.exit
352
	jif	ebx,ge,[viewport.bottom],.exit
353
	push	edx
354
	call	[set_bank]
355
	pop	edx
356
	test	ecx,0x01000000
357
	jz	@f
358
	not	word[ebp]
359
	jmp	.exit
360
    @@: shr	ecx,3
361
	shl	cx,3
362
	shr	ecx,3
363
	shl	cl,3
364
	shr	ecx,3
365
	mov	[ebp],cx
366
	jmp	.exit
367
endf
368
 
369
;-----------------------------------------------------------------------------
370
func vm_mike_get_pixel.15 ;///////////////////////////////////////////////////
371
;-----------------------------------------------------------------------------
372
; eax = x coordinate
373
; ebx = y coordinate
374
;-----------------------------------------------------------------------------
375
begin
376
	pushad
377
	cli
378
 
384 mikedld 379
	imul	ebx,[BytesPerScanLine]
129 mikedld 380
	shl	eax,1
381
	add	eax,ebx
384 mikedld 382
	add	eax,[LFBAddress]
129 mikedld 383
	push	eax
384
	call	[set_bank]
385
	pop	eax
386
	movzx	eax,word[ebp]
387
 
388
	shl	eax,3
389
	shr	al,3
390
	shl	eax,3
391
	shr	ax,3
392
	shl	eax,3
393
 
394
	and	eax,0x00FFFFFF
395
	mov	[esp+4*6],eax
396
 
397
	sti
398
	popad
399
	retn
400
endf
401
 
402
;-----------------------------------------------------------------------------
403
func vm_mike_put_image.15 ;///////////////////////////////////////////////////
404
;-----------------------------------------------------------------------------
405
; eax(ebx) pointer to image in memory - RRGGBBRRGGBB..
406
; ebx(ecx) image size [x]*65536+[y]
407
; ecx(edx) image position in window [x]*65536+[y]
408
; ret: eax 0 succesful, 1 overlapped
409
;-----------------------------------------------------------------------------
410
begin
411
	mov	eax,ebx
412
	mov	ebx,ecx
413
	mov	ecx,edx
414
  .direct:
415
	pushad
416
	cli
417
	jif	ebx,z,0x0000FFFF,.exit,test
418
	jif	ebx,z,0xFFFF0000,.exit,test
419
 
420
	call	get_cursor_rect
421
 
422
	mov	ebp,eax
423
	movsx	eax,word[esp+4*6+2]
424
	movsx	ebx,word[esp+4*6]
425
	movsx	ecx,word[esp+4*4+2]
426
	movsx	edx,word[esp+4*4]
427
	lea	edi,[ecx*3]
428
	push	edi
429
	add	ecx,eax
430
	add	edx,ebx
384 mikedld 431
	mov	edi,[TASK_BASE]
432
	movsx	esi,word[edi-CURRENT_TASK+0]
129 mikedld 433
	add	eax,esi
434
	add	ecx,esi
384 mikedld 435
	movsx	esi,word[edi-CURRENT_TASK+4]
129 mikedld 436
	add	ebx,esi
437
	add	edx,esi
384 mikedld 438
;       add     eax,[esi-CURRENT_TASK+0]
439
;       add     ebx,[esi-CURRENT_TASK+4]
440
;       add     ecx,[esi-CURRENT_TASK+0]
441
;       add     edx,[esi-CURRENT_TASK+4]
129 mikedld 442
 
384 mikedld 443
	mov	esi,[CURRENT_TASK]
129 mikedld 444
	mov	esi,[CLIP_RECTS+esi*4]
445
	mov	edi,[esi]
446
	or	edi,edi
447
	jz	.exit
448
	add	esi,4
449
	cld
450
  .nx:	jif	ecx,l,[rr.left],.skip
451
	jif	eax,ge,[rr.right],.skip
452
	jif	edx,l,[rr.top],.skip
453
	jif	ebx,ge,[rr.bottom],.skip
454
	pushad
455
	jif	eax,ge,[rr.left],@f
456
	mov	eax,[rr.left]
457
    @@: jif	ebx,ge,[rr.top],@f
458
	mov	ebx,[rr.top]
459
    @@: jif	ecx,l,[rr.right],@f
460
	mov	ecx,[rr.right]
461
    @@: jif	edx,l,[rr.bottom],@f
462
	mov	edx,[rr.bottom]
463
    @@: call	is_intersect_rc
464
	jc	.put
384 mikedld 465
	cmp	byte[MOUSE_VISIBLE],0
466
	je	.put
129 mikedld 467
	call	[SF.draw_mouse_under]
384 mikedld 468
	mov	byte[MOUSE_VISIBLE],0
129 mikedld 469
  .put: mov	esi,ebx
470
	sub	esi,[esp+4*4]
471
	imul	esi,[esp+4*8]
472
	mov	edi,eax
473
	sub	edi,[esp+4*7]
474
	lea	edi,[edi*3]
475
	add	esi,edi
476
	add	esi,ebp
384 mikedld 477
	mov	edi,[BytesPerScanLine]
129 mikedld 478
	imul	edi,ebx
479
	lea	edi,[edi+eax*2]
384 mikedld 480
	add	edi,[LFBAddress]
129 mikedld 481
  .xxx: push	eax esi edi eax
482
    @@: lodsd
483
	shr	eax,3
484
	shl	ax,3
485
	shr	eax,3
486
	shl	al,3
487
	shr	eax,3
488
 
489
	push	ebp edi
490
	call	[set_bank]
491
	mov	[ebp],ax
492
	pop	edi ebp
493
	add	edi,2
494
 
495
	dec	esi
496
	inc	dword[esp]
497
	cmp	[esp],ecx
498
	jl	@b
499
	pop	eax edi esi eax
500
	add	esi,[esp+4*8]
384 mikedld 501
	add	edi,[BytesPerScanLine]
129 mikedld 502
	inc	ebx
503
	cmp	ebx,edx
504
	jl	.xxx
505
	popad
506
  .skip:
507
	add	esi,SR
508
	dec	edi
509
	jnz	.nx
510
 
511
  .exit:
384 mikedld 512
	add	esp,4
129 mikedld 513
	sti
514
	popad
515
	xor	eax,eax
516
	retn
517
endf
518
 
519
;-----------------------------------------------------------------------------
520
func vm_mike_draw_bg.15 ;/////////////////////////////////////////////////////
521
;-----------------------------------------------------------------------------
522
begin
523
	pushad
524
 
525
	cmp	byte[bg_type],BGT_TILE
526
	je	.tiled
527
 
528
	mov	eax,[bg_width]
384 mikedld 529
	cmp	eax,[ScreenWidth]
129 mikedld 530
	jne	@f
531
	mov	eax,[bg_height]
384 mikedld 532
	cmp	eax,[ScreenHeight]
129 mikedld 533
	je	.tiled
534
    @@:
535
	imul	eax,[bg_width],3
384 mikedld 536
	mov	[bg_BytesPerScanLine],eax
129 mikedld 537
 
538
	mov	eax,[viewport.left]
539
	mov	ebx,[viewport.top]
540
	mov	ecx,[viewport.right]
541
	mov	edx,[viewport.bottom]
542
 
543
	cmp	[bg_width],1
544
	jne	@f
545
	cmp	[bg_height],1
546
	je	.color
547
    @@:
548
	cli
549
 
550
	call	[SF.draw_mouse_under]
384 mikedld 551
	mov	byte[MOUSE_VISIBLE],0
129 mikedld 552
 
553
	mov	esi,[CLIP_RECTS+4]
554
	mov	ebp,[esi]
555
	or	ebp,ebp
556
	jz	.exit
557
	add	esi,4
558
  .nx:	jif	ecx,l,[rr.left],.skip
559
	jif	eax,ge,[rr.right],.skip
560
	jif	edx,l,[rr.top],.skip
561
	jif	ebx,ge,[rr.bottom],.skip
562
	pushad
563
	jif	eax,ge,[rr.left],@f
564
	mov	eax,[rr.left]
565
    @@: jif	ebx,ge,[rr.top],@f
566
	mov	ebx,[rr.top]
567
    @@: jif	ecx,l,[rr.right],@f
568
	mov	ecx,[rr.right]
569
    @@: jif	edx,l,[rr.bottom],@f
570
	mov	edx,[rr.bottom]
384 mikedld 571
    @@: ;call   is_intersect_rc
572
	;jc     .put
573
	;cmp    [mouse_invisible],0
574
	;jne    .put
575
	;call   [SF.draw_mouse_under]
576
	;mov    [mouse_invisible],1
577
  .put: mov	ebp,[BytesPerScanLine]
129 mikedld 578
	imul	ebp,ebx
579
	lea	ebp,[ebp+eax*2]
384 mikedld 580
	add	ebp,[LFBAddress]
129 mikedld 581
  .xxx: push	eax ebp
582
    @@: push	ebp
583
	call	[set_bank]
584
	push	eax edx
585
	mul	[bg_width]
384 mikedld 586
	div	dword[ScreenWidth]
129 mikedld 587
	lea	edi,[eax*3]
588
	mov	eax,ebx
589
	mul	[bg_height]
384 mikedld 590
	div	dword[ScreenHeight]
591
	mul	[bg_BytesPerScanLine]
129 mikedld 592
	add	edi,eax
384 mikedld 593
	add	edi,IMG_BACKGROUND
129 mikedld 594
	mov	eax,[edi]
595
	shr	eax,3
596
	shl	ax,3
597
	shr	eax,3
598
	shl	al,3
599
	shr	eax,3
600
	mov	[ebp],ax
384 mikedld 601
	pop	edx eax
129 mikedld 602
	pop	ebp
603
	inc	ebp
604
	inc	ebp
605
	inc	eax
606
	cmp	eax,ecx
607
	jl	@b
608
	pop	ebp eax
384 mikedld 609
	add	ebp,[BytesPerScanLine]
129 mikedld 610
	inc	ebx
611
	cmp	ebx,edx
612
	jl	.xxx
613
	popad
614
  .skip:
615
	add	esi,SR
616
	dec	ebp
617
	jnz	.nx
618
 
619
  .exit:
620
	sti
621
	popad
622
	retn
623
 
624
  .tiled:
384 mikedld 625
	mov	eax,IMG_BACKGROUND
129 mikedld 626
	mov	ebx,[bg_width-2]
627
	mov	bx,word[bg_height]
628
	xor	ecx,ecx
629
  .lp1: push	eax
630
	call	vm_mike_put_image.15.direct
631
	pop	eax
632
	rol	ecx,16
633
	add	cx,word[bg_width]
384 mikedld 634
	cmp	cx,word[ScreenWidth]
129 mikedld 635
	jae	@f
636
	rol	ecx,16
637
	jmp	.lp1
638
    @@: shr	ecx,16
639
	add	ecx,[bg_height]
384 mikedld 640
	cmp	ecx,[ScreenHeight]
129 mikedld 641
	jb	.lp1
642
	popad
643
	retn
644
 
645
  .color:
384 mikedld 646
	mov	edi,[IMG_BACKGROUND]
129 mikedld 647
	and	edi,0x00FFFFFF
648
	call	vm_mike_draw_rect.15
649
	popad
650
	retn
651
endf