Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
129 mikedld 1
func color_24_to_4_bits
2
begin
3
	push	edx
4
	mov	dl,0
384 mikedld 5
	cmp	al,85		  ; blue
129 mikedld 6
	jbe	.p13green
7
	or	dl,0x01
8
	cmp	al,170
9
	jbe	.p13green
10
	or	dl,0x08
11
  .p13green:
12
	shr	eax,8
384 mikedld 13
	cmp	al,85		  ; green
129 mikedld 14
	jbe	.p13red
15
	or	dl,0x02
16
	cmp	al,170
17
	jbe	.p13red
18
	or	dl,0x08
19
  .p13red:
384 mikedld 20
	cmp	ah,85		  ; red
129 mikedld 21
	jbe	.p13cont
22
	or	dl,0x04
23
	cmp	ah,170
24
	jbe	.p13cont
25
	or	dl,0x08
26
  .p13cont:
27
	mov	eax,edx
28
	pop	edx
29
	ret
30
endf
31
 
32
;-----------------------------------------------------------------------------
33
func vm_mike_draw_rect.04 ;///////////////////////////////////////////////////
34
;-----------------------------------------------------------------------------
35
; eax - x start
36
; ebx - y start
37
; ecx - x end
38
; edx - y end
39
; edi - color
40
;-----------------------------------------------------------------------------
41
;- eax(ebx) [x start]*65536 + [x size]
42
;- ebx(ecx) [y start]*65536 + [y size]
43
;- ecx(edx) color 0x00RRGGBB
44
;-----------------------------------------------------------------------------
45
begin
46
	pushad
47
	cli
48
	jif	eax,e,ecx,.exit
49
	jif	ebx,e,edx,.exit
50
 
51
	call	get_cursor_rect
52
 
53
	push	eax
54
	mov	eax,edi
55
	call	color_24_to_4_bits
56
	mov	edi,eax
57
	pop	eax
58
 
384 mikedld 59
	mov	ebp,[TASK_BASE]
60
	movsx	esi,word[ebp-CURRENT_TASK+0]
129 mikedld 61
	add	eax,esi
62
	add	ecx,esi
384 mikedld 63
	movsx	esi,word[ebp-CURRENT_TASK+4]
129 mikedld 64
	add	ebx,esi
65
	add	edx,esi
384 mikedld 66
;       add     eax,[ebp-CURRENT_TASK+0]
67
;       add     ebx,[ebp-CURRENT_TASK+4]
68
;       add     ecx,[ebp-CURRENT_TASK+0]
69
;       add     edx,[ebp-CURRENT_TASK+4]
129 mikedld 70
 
384 mikedld 71
	mov	esi,[CURRENT_TASK]
129 mikedld 72
	mov	esi,[CLIP_RECTS+esi*4]
73
	mov	ebp,[esi]
74
	or	ebp,ebp
75
	jz	.exit
76
	add	esi,4
77
  .nx:	jif	ecx,le,[rr.left],.skip
78
	jif	eax,ge,[rr.right],.skip
79
	jif	edx,le,[rr.top],.skip
80
	jif	ebx,ge,[rr.bottom],.skip
81
	pushad
82
	jif	eax,ge,[rr.left],@f
83
	mov	eax,[rr.left]
84
    @@: jif	ebx,ge,[rr.top],@f
85
	mov	ebx,[rr.top]
86
    @@: jif	ecx,l,[rr.right],@f
87
	mov	ecx,[rr.right]
88
    @@: jif	edx,l,[rr.bottom],@f
89
	mov	edx,[rr.bottom]
90
    @@: call	is_intersect_rc
91
	jc	.put
384 mikedld 92
	cmp	byte[MOUSE_VISIBLE],0
93
	je	.put
129 mikedld 94
	call	[SF.draw_mouse_under]
384 mikedld 95
	mov	byte[MOUSE_VISIBLE],0
129 mikedld 96
  .put: sub	edx,ebx
97
	push	edx edi ebx eax
98
	mov	edi,ebx
99
	shl	edi,6
100
	shl	ebx,4
101
	add	edi,ebx
102
	shr	eax,3
103
	add	edi,eax
384 mikedld 104
	add	edi,VGABasePtr
129 mikedld 105
	pop	eax ebx
106
 
107
	mov	ebx,eax
108
	mov	esi,ecx
109
	sub	esi,eax
110
	mov	dx,0x03CE
111
 
112
;edi = Offset in VMem
113
;esi = Length
114
;ebx = x
115
; dx = Graphix Controller
116
 
384 mikedld 117
  mov	cl,bl		; Get StartBit
118
  and	ecx,07h
129 mikedld 119
 
384 mikedld 120
  mov	eax,esi
121
  add	eax,ecx
122
  cmp	eax,8		; Is x+Length
123
  jb	.D_One
129 mikedld 124
 
384 mikedld 125
  mov	ax,0xff08	; 11111111b | BitMask Register
126
  shr	ah,cl		; BitMask
127
  out	dx,ax		; Write BitMask
128
  push	ecx
129
  mov	ah,[esp+4]
130
  mov	ecx,[esp+4+4]
131
  push	edi
129 mikedld 132
.D_LL:			; Draw Left of Box
384 mikedld 133
  mov	al,[edi]
134
  mov	[edi],ah
135
  add	edi,80		; edi:=edi+80
136
  dec	ecx
137
  jnz	.D_LL
138
  pop	edi
139
  inc	edi
140
  pop	ecx
129 mikedld 141
 
384 mikedld 142
  mov	ax,0xFF08	; BitMask Register
143
  out	dx,ax		; Write BitMask
129 mikedld 144
 
384 mikedld 145
  mov	eax,esi
146
  mov	ch,8
147
  sub	ch,cl
129 mikedld 148
  movzx ecx,ch
384 mikedld 149
  sub	eax,ecx
150
  shr	eax,3		; Length div 8
129 mikedld 151
 
384 mikedld 152
  push	edi ebx
153
  mov	ebx,[esp+8+4]
154
  mov	edx,eax
155
  mov	al,[esp+8]
129 mikedld 156
.D_LC:
384 mikedld 157
  mov	ecx,edx
158
  rep	stosb
159
  add	edi,80
160
  sub	edi,edx
161
  dec	ebx
162
  jnz	.D_LC
163
  pop	ebx edi
164
  add	edi,edx
129 mikedld 165
 
384 mikedld 166
  mov	ecx,ebx 	; ecx:=x+Length
167
  add	ecx,esi
168
  and	ecx,07h 	; ecx and 07
169
  mov	ah,0ffh
170
  shr	ah,cl		; BitMask
171
  jz	.D_End
129 mikedld 172
 
384 mikedld 173
  not	ah
174
  mov	al,8		; BitMask Register
175
  mov	dx,03ceh	; Graphics Controller
176
  out	dx,ax		; Write BitMask
177
  mov	ecx,[esp+4]
178
  mov	al,[esp]
129 mikedld 179
.D_LR:
384 mikedld 180
  mov	ah,[edi]
181
  mov	[edi],al
182
  add	edi,80
183
  dec	ecx
184
  jnz	.D_LR
129 mikedld 185
 
384 mikedld 186
  jmp	.D_End
129 mikedld 187
 
188
.D_One:
384 mikedld 189
  mov	ah,0ffh
190
  shr	ah,cl		; Left BitMask
129 mikedld 191
 
384 mikedld 192
  add	ebx,esi
193
  dec	ebx
194
  and	ebx,07h
129 mikedld 195
 
384 mikedld 196
  mov	ecx,7
197
  sub	ecx,ebx
129 mikedld 198
 
384 mikedld 199
  mov	bl,0ffh
200
  shl	bl,cl		; Right BitMask
129 mikedld 201
 
384 mikedld 202
  and	ah,bl		; Full  BitMask
203
  mov	al,8		; BitMask Register
204
  out	dx,ax		; Write BitMask
205
  mov	ecx,[esp+4]
206
  mov	al,[esp]
129 mikedld 207
.D_L:
384 mikedld 208
  mov	dl,[edi]	; Fill Latches
209
  mov	[edi],al	; Write Pixel
210
  add	edi,80
211
  dec	ecx
212
  jnz	.D_L
129 mikedld 213
.D_End:
214
	pop	edi
215
	add	esp,4
216
	popad
217
  .skip:
218
	add	esi,SR
219
	dec	ebp
220
	jnz	.nx
221
 
222
  .exit:
223
	sti
224
	popad
225
	retn
226
endf
227
 
228
;-----------------------------------------------------------------------------
229
func vm_mike_draw_line.04 ;///////////////////////////////////////////////////
230
;-----------------------------------------------------------------------------
231
; eax(ebx)  [x start] shl 16 + [x end]
232
; ebx(ecx)  [y start] shl 16 + [y end]
233
; ecx(edx)  colour 0x00RRGGBB
234
; edi = 0x00000001 force
235
;-----------------------------------------------------------------------------
236
begin
237
	push	0
238
	pushad
239
	cli
240
 
241
	test	ecx,0x01000000
242
	jnz	.exit
243
 
244
	call	get_cursor_rect
245
 
246
	mov	eax,ecx
247
	call	color_24_to_4_bits
384 mikedld 248
;       mov     [esp+4*8],ecx
129 mikedld 249
	mov	[esp+4*8],al
250
 
251
	movsx	eax,word[esp+4*7]  ; x end
252
	cmp	ax,[esp+4*7+2]	   ; x start
253
	je	dl.vert_line
254
	movsx	eax,word[esp+4*4]  ; y end
255
	cmp	ax,[esp+4*4+2]	   ; y start
256
	je	dl.horz_line
257
 
258
  .exit:
259
	sti
260
	popad
261
	add	esp,4
262
	retn
263
 
264
  dl.vert_line:
265
	push	eax
266
	mov	cl,al
267
	and	cl,7
268
	mov	ax,0x8008
269
	shr	ah,cl
270
	mov	dx,0x03CE
271
	out	dx,ax
272
	pop	eax
273
	mov	ecx,[esp+4*8]
274
 
275
	test	edi,1
276
	jnz	.forced
384 mikedld 277
	mov	esi,[CURRENT_TASK]
129 mikedld 278
	mov	esi,[CLIP_RECTS+esi*4]
279
	mov	edi,[esi]
280
	or	edi,edi
281
	jz	.exit
282
	add	esi,4
283
  .nx:	movsx	ebx,word[esp+4*4+2]  ; y start
284
	movsx	edx,word[esp+4*4]    ; y end
285
	cmp	ebx,edx
286
	je	.exit
287
	jl	@f
288
	xchg	ebx,edx
289
    @@: jif	eax,l,[rr.left],.skip
290
	jif	eax,ge,[rr.right],.skip
291
	jif	edx,l,[rr.top],.skip
292
	jif	ebx,ge,[rr.bottom],.skip
293
	jif	ebx,ge,[rr.top],@f
294
	mov	ebx,[rr.top]
295
    @@: jif	edx,l,[rr.bottom],@f
296
	mov	edx,[rr.bottom]
297
	dec	edx
298
  .draw:
299
    @@: call	is_intersect_vln
300
	jc	.put
384 mikedld 301
	cmp	byte[MOUSE_VISIBLE],0
302
	je	.put
129 mikedld 303
	call	[SF.draw_mouse_under]
384 mikedld 304
	mov	byte[MOUSE_VISIBLE],0
129 mikedld 305
  .put: push	ebx eax
306
	mov	ebp,ebx
307
	shl	ebp,6
308
	shl	ebx,4
309
	add	ebp,ebx
310
	shr	eax,3
311
	add	ebp,eax
384 mikedld 312
	add	ebp,VGABasePtr
129 mikedld 313
	pop	eax ebx
314
    @@: mov	ch,[ebp]
315
	mov	[ebp],cl
316
	add	ebp,80
317
	inc	ebx
318
	cmp	ebx,edx
319
	jle	@b
320
  .skip:
321
	add	esi,SR
322
	dec	edi
323
	jnz	.nx
324
  .exit:
325
	sti
326
	popad
327
	add	esp,4
328
	retn
329
  .forced:
330
	jif	eax,l,[viewport.left],.exit
331
	jif	eax,ge,[viewport.right],.exit
332
	movsx	ebx,word[esp+4*4+2]  ; y start
333
	movsx	edx,word[esp+4*4]    ; y end
334
	jif	ebx,e,edx,.exit
335
	jl	@f
336
	xchg	ebx,edx
337
    @@: jif	edx,l,[viewport.top],.exit
338
	jif	ebx,ge,[viewport.bottom],.exit
339
	jif	ebx,ge,[viewport.top],@f
340
	mov	ebx,[viewport.top]
341
    @@: jif	edx,l,[viewport.bottom],@f
342
	mov	edx,[viewport.bottom]
343
	dec	edx
344
    @@: mov	edi,1
345
	jmp	.draw
346
 
347
  dl.horz_line:
348
	cld
349
	mov	ecx,[esp+4*8]
350
	test	edi,1
351
	jnz	.forced
384 mikedld 352
	mov	esi,[CURRENT_TASK]
129 mikedld 353
	mov	esi,[CLIP_RECTS+esi*4]
354
	mov	edi,[esi]
355
	or	edi,edi
356
	jz	.exit
357
	add	esi,4
358
  .nx:	movsx	ebx,word[esp+4*7+2]  ; x start
359
	movsx	edx,word[esp+4*7]    ; x end
360
	cmp	ebx,edx
361
	je	.exit
362
	jl	@f
363
	xchg	ebx,edx
364
    @@: jif	eax,l,[rr.top],.skip
365
	jif	eax,ge,[rr.bottom],.skip
366
	jif	edx,l,[rr.left],.skip
367
	jif	ebx,ge,[rr.right],.skip
368
	jif	ebx,ge,[rr.left],@f
369
	mov	ebx,[rr.left]
370
    @@: jif	edx,l,[rr.right],@f
371
	mov	edx,[rr.right]
372
	dec	edx
373
  .draw:
374
    @@: call	is_intersect_hln
375
	jc	.put
384 mikedld 376
	cmp	byte[MOUSE_VISIBLE],0
377
	je	.put
129 mikedld 378
	call	[SF.draw_mouse_under]
384 mikedld 379
	mov	byte[MOUSE_VISIBLE],0
380
  .put: push	edi ebx eax
129 mikedld 381
	mov	edi,eax
382
	shl	edi,6
383
	shl	eax,4
384
	add	edi,eax
385
	shr	ebx,3
386
	add	edi,ebx
384 mikedld 387
	add	edi,VGABasePtr
129 mikedld 388
	pop	eax ebx
389
 
390
	push	eax ebx edx esi ecx
391
	mov	esi,edx
392
	sub	esi,ebx
393
	inc	esi
394
	mov	dx,0x03CE
395
;edi = Offset in VMem
396
;esi = Length
397
;ebx = x
398
; dx = Graphix Controller
384 mikedld 399
  mov	cl,bl		; Get StartBit
400
  and	ecx,07h
129 mikedld 401
 
384 mikedld 402
  mov	eax,esi
403
  add	eax,ecx
404
  cmp	eax,8		; Is x+Length
405
  jb	.D_One
129 mikedld 406
 
384 mikedld 407
  mov	ax,0xFF08	; 11111111b | BitMask Register
408
  shr	ah,cl		; BitMask
409
  out	dx,ax		; Write BitMask
410
  mov	al,[edi]
411
  mov	eax,[esp]
412
  mov	[edi],al
413
  inc	edi
129 mikedld 414
 
384 mikedld 415
  mov	ax,0xFF08	; BitMask | BitMask Register
416
  out	dx,ax		; Write BitMask
129 mikedld 417
 
384 mikedld 418
  mov	eax,esi
419
  mov	ch,8
420
  sub	ch,cl
421
  mov	cl,ch
422
  xor	ch,ch
423
  sub	eax,ecx
424
  shr	eax,3		; Length div 8
425
  mov	ecx,eax
426
  mov	eax,[esp]
427
  rep	stosb
129 mikedld 428
 
384 mikedld 429
  mov	ecx,ebx 	; ecx:=x+Length
430
  add	ecx,esi
431
  and	ecx,07h 	; ecx and 07
432
  mov	ah,0ffh
433
  shr	ah,cl		; BitMask
434
  jz	.D_End
129 mikedld 435
 
384 mikedld 436
  not	ah
437
  mov	al,8		; BitMask Register
438
  out	dx,ax		; Write BitMask
439
  mov	cl,[edi]
440
  mov	eax,[esp]
441
  mov	[edi],al
442
  jmp	.D_End
129 mikedld 443
 
444
.D_One:
384 mikedld 445
  mov	ax,0xff08	; | BitMask Register
446
  shr	ah,cl		; Left BitMask
129 mikedld 447
 
384 mikedld 448
  add	ebx,esi
449
  dec	ebx
450
  and	ebx,07h
129 mikedld 451
 
384 mikedld 452
  mov	ecx,7
453
  sub	ecx,ebx
129 mikedld 454
 
384 mikedld 455
  mov	bl,0ffh
456
  shl	bl,cl		; Right BitMask
129 mikedld 457
 
384 mikedld 458
  and	ah,bl		; Full  BitMask
459
  out	dx,ax		; Write BitMask
129 mikedld 460
 
384 mikedld 461
  mov	dl,[edi]	; Fill Latches
462
  mov	eax,[esp]
463
  mov	[edi],al	; Write Pixel
129 mikedld 464
.D_End:
465
	pop	ecx esi edx ebx eax edi
466
 
384 mikedld 467
;       mov     ebp,[BytesPerScanLine]
468
;       imul    ebp,eax
469
;       lea     ebp,[ebp+ebx*4]
470
;       add     ebp,[LFBAddress]
471
;    @@: test   ecx,0x01000000
472
;       jz      .dr
473
;       mov     ecx,[ebp]
474
;       not     ecx
475
;       or      ecx,0x01000000
476
;  .dr: mov     [ebp],ecx
477
;       add     ebp,4
478
;       inc     ebx
479
;       cmp     ebx,edx
480
;       jle     @b
129 mikedld 481
  .skip:
482
	add	esi,SR
483
	dec	edi
484
	jnz	.nx
485
  .exit:
486
	sti
487
	popad
488
	add	esp,4
489
	retn
490
  .forced:
491
	jif	eax,l,[viewport.top],.exit
492
	jif	eax,ge,[viewport.bottom],.exit
493
	movsx	ebx,word[esp+4*7+2]  ; x start
494
	movsx	edx,word[esp+4*7]    ; x end
495
	cmp	ebx,edx
496
	je	.exit
497
	jl	@f
498
	xchg	ebx,edx
499
    @@: jif	edx,l,[viewport.left],.exit
500
	jif	ebx,ge,[viewport.right],.exit
501
	jif	ebx,ge,[viewport.left],@f
502
	mov	ebx,[viewport.left]
503
    @@: jif	edx,l,[viewport.right],@f
504
	mov	edx,[viewport.right]
505
	dec	edx
506
    @@: mov	edi,1
507
	jmp	.draw
508
endf
509
 
510
;-----------------------------------------------------------------------------
511
func vm_mike_put_pixel.04 ;///////////////////////////////////////////////////
512
;-----------------------------------------------------------------------------
513
; eax = x coordinate
514
; ebx = y coordinate
515
; ecx = ?? RR GG BB    ; 0x01000000 negation
516
; edi = 0x00000001 force
517
;-----------------------------------------------------------------------------
518
begin
519
	pushad
520
	cli
384 mikedld 521
;       mov     edx,[BytesPerScanLine]
522
;       imul    edx,ebx
523
;       lea     edx,[edx+eax*4]
524
;       add     edx,[LFBAddress]
525
;       test    ecx,0x01000000
526
;       jz      @f
527
;       mov     ecx,[edx]
528
;       not     ecx
129 mikedld 529
    @@: test	edi,1
530
	jnz	.forced
384 mikedld 531
	mov	esi,[CURRENT_TASK]
129 mikedld 532
	mov	esi,[CLIP_RECTS+esi*4]
533
	mov	edi,[esi]
534
	or	edi,edi
535
	jz	.exit
536
	add	esi,4
537
    @@: jif	eax,l,[rr.left],.skip
538
	jif	eax,ge,[rr.right],.skip
539
	jif	ebx,l,[rr.top],.skip
540
	jif	ebx,ge,[rr.bottom],.skip
541
	call	get_cursor_rect
542
	call	is_intersect_pt
543
	jc	.put
384 mikedld 544
	cmp	byte[MOUSE_VISIBLE],0
545
	je	.put
129 mikedld 546
	call	[SF.draw_mouse_under]
384 mikedld 547
	mov	byte[MOUSE_VISIBLE],0
548
  .put:;mov     [edx],ecx
129 mikedld 549
;  mov   ax,SegA000      {Calculate Offset}
550
;  mov   es,ax
551
; mov   bx,[y]
384 mikedld 552
  mov	edi,ebx
553
  shl	edi,6		 ; 80*y
554
  shl	ebx,4
555
  add	edi,ebx
129 mikedld 556
 
384 mikedld 557
  push	ecx
558
  mov	cl,al
559
  shr	eax,3		 ; /8
560
  add	edi,eax 	 ; 80*y + (x/8)
129 mikedld 561
 
384 mikedld 562
  and	cl,7		 ; Get Bit that Changes
563
  mov	ax,0x8008
564
  shr	ah,cl
565
  mov	dx,0x03CE
566
  out	dx,ax
567
  add	edi,VGABasePtr
129 mikedld 568
 
569
  call	color_24_to_4_bits
384 mikedld 570
  mov	ah,[edi]	   ; dummy read
571
  mov	[edi],al
129 mikedld 572
 
573
  .exit:
574
	sti
575
	popad
576
	retn
577
  .skip:
578
	add	esi,SR
579
	dec	edi
580
	jnz	@b
581
	jmp	.exit
582
  .forced:
583
	jif	eax,l,[viewport.left],.exit
584
	jif	ebx,l,[viewport.top],.exit
585
	jif	eax,ge,[viewport.right],.exit
586
	jif	ebx,ge,[viewport.bottom],.exit
587
 
588
;  mov   ax,SegA000      {Calculate Offset}
589
;  mov   es,ax
590
; mov   bx,[y]
384 mikedld 591
  mov	edi,ebx
592
  shl	edi,6		 ; 80*y
593
  shl	ebx,4
594
  add	edi,ebx
129 mikedld 595
 
384 mikedld 596
  push	ecx
597
  mov	cl,al
598
  shr	eax,3		 ; /8
599
  add	edi,eax 	 ; 80*y + (x/8)
129 mikedld 600
 
384 mikedld 601
  and	cl,7		 ; Get Bit that Changes
602
  mov	ax,0x8008
603
  shr	ah,cl
604
  mov	dx,0x03CE
605
  out	dx,ax
606
  add	edi,VGABasePtr
129 mikedld 607
 
608
	pop	eax
609
	call	color_24_to_4_bits
384 mikedld 610
	mov	ah,[edi]	   ; dummy read
129 mikedld 611
	mov	[edi],al
612
 
613
	sti
614
	popad
615
	retn
616
endf
617
 
618
;-----------------------------------------------------------------------------
619
func vm_mike_get_pixel.04 ;///////////////////////////////////////////////////
620
;-----------------------------------------------------------------------------
621
; eax = x coordinate
622
; ebx = y coordinate
623
;-----------------------------------------------------------------------------
624
 
625
clr_table dd \
626
  0x00000000,0x00000080,0x00008000,0x00008080,\
627
  0x00800000,0x00800080,0x00808000,0x00808080,\
628
  0x00CCCCCC,0x000000FF,0x0000FF00,0x0000FFFF,\
629
  0x00FF0000,0x00FF00FF,0x00FFFF00,0x00FFFFFF
630
 
631
begin
632
	pushad
633
	cli
634
 
384 mikedld 635
  mov	edi,ebx
636
  shl	edi,6		 ; 80*y
637
  shl	ebx,4
638
  add	edi,ebx
639
  mov	cl,al
640
  shr	eax,3		 ; /8
641
  add	edi,eax 	 ; 80*y + (x/8)
642
  add	edi,VGABasePtr
129 mikedld 643
 
384 mikedld 644
  and	  ecx,7
645
  neg	  ecx
646
  add	  cl,7
647
  mov	  dx,0x03CE
648
  xor	  bl,bl
649
  mov	  ah,3
129 mikedld 650
@1:
384 mikedld 651
  mov	  al,4
652
  out	  dx,al
653
  inc	  dx
654
  mov	  al,ah
655
  out	  dx,al
656
  dec	  dx
657
  mov	  al,[edi]
658
  shr	  al,cl
659
  and	  al,1
660
  xchg	  cl,ah
661
  shl	  al,cl
662
  xchg	  cl,ah
663
  or	  bl,al
664
  dec	  ah
665
  jns	  @1
129 mikedld 666
 
667
	and	ebx,0x0000000F
668
	mov	eax,[ebx*4+clr_table]
669
	mov	[esp+4*6],eax
670
 
671
	sti
672
	popad
673
	retn
674
endf
675
 
676
;-----------------------------------------------------------------------------
677
func vm_mike_put_image.04 ;///////////////////////////////////////////////////
678
;-----------------------------------------------------------------------------
679
; eax(ebx) pointer to image in memory - RRGGBBRRGGBB..
680
; ebx(ecx) image size [x]*65536+[y]
681
; ecx(edx) image position in window [x]*65536+[y]
682
; ret: eax 0 succesful, 1 overlapped
683
;-----------------------------------------------------------------------------
684
begin
685
	mov	eax,ebx
686
	mov	ebx,ecx
687
	mov	ecx,edx
688
  .direct:
689
	pushad
690
	cli
691
	jif	ebx,z,0x0000FFFF,.exit,test
692
	jif	ebx,z,0xFFFF0000,.exit,test
693
 
694
	cld
695
 
696
	call	get_cursor_rect
697
 
698
	mov	ebp,eax
699
	movsx	eax,word[esp+4*6+2]
700
	movsx	ebx,word[esp+4*6]
701
	movsx	ecx,word[esp+4*4+2]
702
	movsx	edx,word[esp+4*4]
703
	lea	edi,[ecx*3]
704
	push	edi
705
	add	ecx,eax
706
	add	edx,ebx
384 mikedld 707
	mov	edi,[TASK_BASE]
708
	movsx	esi,word[edi-CURRENT_TASK+0]
129 mikedld 709
	add	eax,esi
710
	add	ecx,esi
384 mikedld 711
	movsx	esi,word[edi-CURRENT_TASK+4]
129 mikedld 712
	add	ebx,esi
713
	add	edx,esi
384 mikedld 714
;       add     eax,[esi-CURRENT_TASK+0]
715
;       add     ebx,[esi-CURRENT_TASK+4]
716
;       add     ecx,[esi-CURRENT_TASK+0]
717
;       add     edx,[esi-CURRENT_TASK+4]
129 mikedld 718
 
384 mikedld 719
	mov	esi,[CURRENT_TASK]
129 mikedld 720
	mov	esi,[CLIP_RECTS+esi*4]
721
	mov	edi,[esi]
722
	or	edi,edi
723
	jz	.exit
724
	add	esi,4
725
	cld
726
  .nx:	jif	ecx,l,[rr.left],.skip
727
	jif	eax,ge,[rr.right],.skip
728
	jif	edx,l,[rr.top],.skip
729
	jif	ebx,ge,[rr.bottom],.skip
730
	pushad
731
	jif	eax,ge,[rr.left],@f
732
	mov	eax,[rr.left]
733
    @@: jif	ebx,ge,[rr.top],@f
734
	mov	ebx,[rr.top]
735
    @@: jif	ecx,l,[rr.right],@f
736
	mov	ecx,[rr.right]
737
    @@: jif	edx,l,[rr.bottom],@f
738
	mov	edx,[rr.bottom]
739
    @@: call	is_intersect_rc
740
	jc	.put
384 mikedld 741
	cmp	byte[MOUSE_VISIBLE],0
742
	je	.put
129 mikedld 743
	call	[SF.draw_mouse_under]
384 mikedld 744
	mov	byte[MOUSE_VISIBLE],0
129 mikedld 745
  .put:
746
	mov	esi,ebx
747
	sub	esi,[esp+4*4]
748
	imul	esi,[esp+4*8]
749
	mov	edi,eax
750
	sub	edi,[esp+4*7]
751
	lea	edi,[edi*3]
752
	add	esi,edi
753
	add	esi,ebp
384 mikedld 754
  mov	edi,ebx
755
  mov	ebp,ebx
756
  shl	edi,6		 ; 80*y
757
  shl	ebp,4
758
  add	edi,ebp
759
  add	edi,VGABasePtr
129 mikedld 760
  .xxx: push	eax edx esi edi ebx eax
761
	or	ebp,-1
762
	mov	edx,0x03CE
763
    @@: mov	eax,[esp]
764
	push	ecx edi
384 mikedld 765
  mov	cl,al
766
  shr	eax,3		 ; /8
767
  add	edi,eax 	 ; 80*y + (x/8)
129 mikedld 768
 
384 mikedld 769
  mov	eax,0x8008
770
  and	cl,7		 ; Get Bit that Changes
771
  shr	ah,cl
772
  out	dx,ax
129 mikedld 773
 
774
	lodsd
775
	dec	esi
776
	and	eax,0x00FFFFFF
777
	cmp	eax,ebp
778
	jne	.ppp
779
	mov	cl,bl
780
	jmp	.ppp.2
781
  .ppp:
782
	mov	ebp,eax
783
	call	color_24_to_4_bits
784
	mov	bl,al
785
  .ppp.2:
384 mikedld 786
 mov	al,[edi]	   ; dummy read
787
 mov	[edi],cl
129 mikedld 788
	pop	edi ecx
789
	inc	dword[esp]
790
	cmp	[esp],ecx
791
	jl	@b
792
	pop	eax ebx edi esi edx eax
793
	inc	ebx
794
	add	esi,[esp+4*8]
795
	add	edi,80
796
	cmp	ebx,edx
797
	jl	.xxx
798
	popad
799
  .skip:
800
	add	esi,SR
801
	dec	edi
802
	jnz	.nx
803
 
804
  .exit:
384 mikedld 805
	add	esp,4
129 mikedld 806
	sti
807
	popad
808
	xor	eax,eax
809
	retn
810
endf
811
 
812
;-----------------------------------------------------------------------------
813
func vm_mike_draw_bg.04 ;/////////////////////////////////////////////////////
814
;-----------------------------------------------------------------------------
815
begin
816
	pushad
817
 
818
	cmp	byte[0x460000-12],1
819
	je	.tiled
820
 
821
	mov	eax,[viewport.left]
822
	mov	ebx,[viewport.top]
823
	mov	ecx,[viewport.right]
824
	mov	edx,[viewport.bottom]
825
	mov	edi,[0x00300000]
826
 
827
	cli
828
	jif	eax,e,ecx,.exit
829
	jif	ebx,e,edx,.exit
830
 
831
	call	get_cursor_rect
832
 
833
	push	eax
834
	mov	eax,edi
835
	call	color_24_to_4_bits
836
	mov	edi,eax
837
	pop	eax
838
 
839
	mov	esi,[CLIP_RECTS+4]
840
	mov	ebp,[esi]
841
	or	ebp,ebp
842
	jz	.exit
843
	add	esi,4
844
  .nx:	jif	ecx,le,[rr.left],.skip
845
	jif	eax,ge,[rr.right],.skip
846
	jif	edx,le,[rr.top],.skip
847
	jif	ebx,ge,[rr.bottom],.skip
848
	pushad
849
	jif	eax,ge,[rr.left],@f
850
	mov	eax,[rr.left]
851
    @@: jif	ebx,ge,[rr.top],@f
852
	mov	ebx,[rr.top]
853
    @@: jif	ecx,l,[rr.right],@f
854
	mov	ecx,[rr.right]
855
    @@: jif	edx,l,[rr.bottom],@f
856
	mov	edx,[rr.bottom]
857
    @@: call	is_intersect_rc
858
	jc	.put
384 mikedld 859
	cmp	byte[MOUSE_VISIBLE],0
860
	je	.put
129 mikedld 861
	call	[SF.draw_mouse_under]
384 mikedld 862
	mov	byte[MOUSE_VISIBLE],0
129 mikedld 863
  .put: sub	edx,ebx
864
	push	edx edi ebx eax
865
	mov	edi,ebx
866
	shl	edi,6
867
	shl	ebx,4
868
	add	edi,ebx
869
	shr	eax,3
870
	add	edi,eax
384 mikedld 871
	add	edi,VGABasePtr
129 mikedld 872
	pop	eax ebx
873
 
874
	mov	ebx,eax
875
	mov	esi,ecx
876
	sub	esi,eax
877
	mov	dx,0x03CE
878
 
879
;edi = Offset in VMem
880
;esi = Length
881
;ebx = x
882
; dx = Graphix Controller
883
 
384 mikedld 884
  mov	cl,bl		; Get StartBit
885
  and	ecx,07h
129 mikedld 886
 
384 mikedld 887
  mov	eax,esi
888
  add	eax,ecx
889
  cmp	eax,8		; Is x+Length
890
  jb	.D_One
129 mikedld 891
 
384 mikedld 892
  mov	ax,0xff08	; 11111111b | BitMask Register
893
  shr	ah,cl		; BitMask
894
  out	dx,ax		; Write BitMask
895
  push	ecx
896
  mov	ah,[esp+4]
897
  mov	ecx,[esp+4+4]
898
  push	edi
129 mikedld 899
.D_LL:			; Draw Left of Box
384 mikedld 900
  mov	al,[edi]
901
  mov	[edi],ah
902
  add	edi,80		; edi:=edi+80
903
  dec	ecx
904
  jnz	.D_LL
905
  pop	edi
906
  inc	edi
907
  pop	ecx
129 mikedld 908
 
384 mikedld 909
  mov	ax,0xFF08	; BitMask Register
910
  out	dx,ax		; Write BitMask
129 mikedld 911
 
384 mikedld 912
  mov	eax,esi
913
  mov	ch,8
914
  sub	ch,cl
129 mikedld 915
  movzx ecx,ch
384 mikedld 916
  sub	eax,ecx
917
  shr	eax,3		; Length div 8
129 mikedld 918
 
384 mikedld 919
  push	edi ebx
920
  mov	ebx,[esp+8+4]
921
  mov	edx,eax
922
  mov	al,[esp+8]
129 mikedld 923
.D_LC:
384 mikedld 924
  mov	ecx,edx
925
  rep	stosb
926
  add	edi,80
927
  sub	edi,edx
928
  dec	ebx
929
  jnz	.D_LC
930
  pop	ebx edi
931
  add	edi,edx
129 mikedld 932
 
384 mikedld 933
  mov	ecx,ebx 	; ecx:=x+Length
934
  add	ecx,esi
935
  and	ecx,07h 	; ecx and 07
936
  mov	ah,0ffh
937
  shr	ah,cl		; BitMask
938
  jz	.D_End
129 mikedld 939
 
384 mikedld 940
  not	ah
941
  mov	al,8		; BitMask Register
942
  mov	dx,03ceh	; Graphics Controller
943
  out	dx,ax		; Write BitMask
944
  mov	ecx,[esp+4]
945
  mov	al,[esp]
129 mikedld 946
.D_LR:
384 mikedld 947
  mov	ah,[edi]
948
  mov	[edi],al
949
  add	edi,80
950
  dec	ecx
951
  jnz	.D_LR
129 mikedld 952
 
384 mikedld 953
  jmp	.D_End
129 mikedld 954
 
955
.D_One:
384 mikedld 956
  mov	ah,0ffh
957
  shr	ah,cl		; Left BitMask
129 mikedld 958
 
384 mikedld 959
  add	ebx,esi
960
  dec	ebx
961
  and	ebx,07h
129 mikedld 962
 
384 mikedld 963
  mov	ecx,7
964
  sub	ecx,ebx
129 mikedld 965
 
384 mikedld 966
  mov	bl,0ffh
967
  shl	bl,cl		; Right BitMask
129 mikedld 968
 
384 mikedld 969
  and	ah,bl		; Full  BitMask
970
  mov	al,8		; BitMask Register
971
  out	dx,ax		; Write BitMask
972
  mov	ecx,[esp+4]
973
  mov	al,[esp]
129 mikedld 974
.D_L:
384 mikedld 975
  mov	dl,[edi]	; Fill Latches
976
  mov	[edi],al	; Write Pixel
977
  add	edi,80
978
  dec	ecx
979
  jnz	.D_L
129 mikedld 980
.D_End:
981
	pop	edi
982
	add	esp,4
983
	popad
984
  .skip:
985
	add	esi,SR
986
	dec	ebp
987
	jnz	.nx
988
 
989
  .exit:
990
	sti
991
	popad
992
	retn
993
 
994
  .tiled:
384 mikedld 995
	mov	eax,IMG_BACKGROUND
129 mikedld 996
	mov	ebx,[bg_width-2]
997
	mov	bx,word[bg_height]
998
	xor	ecx,ecx
999
	xor	edx,edx
1000
  .lp1: push	eax
1001
	call	vm_mike_put_image.04.direct
1002
	pop	eax
1003
	add	edx,[bg_width]
384 mikedld 1004
	cmp	edx,[ScreenWidth]
129 mikedld 1005
	jae	@f
1006
	shl	edx,16
1007
	add	ecx,edx
1008
	shr	edx,16
1009
	jmp	.lp1
1010
    @@: and	ecx,0x0000FFFF
1011
	xor	edx,edx
1012
	add	ecx,[bg_height]
384 mikedld 1013
	cmp	ecx,[ScreenHeight]
1014
	jb	.lp1
129 mikedld 1015
	popad
1016
	retn
1017
endf