Subversion Repositories Kolibri OS

Rev

Rev 2322 | Rev 2470 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2322 Rev 2461
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
7
 
8
$Revision: 2322 $
8
$Revision: 2461 $
9
 
9
 
10
; // Alver 22.06.2008 // {
10
; // Alver 22.06.2008 // {
11
align 4
11
align 4
12
dtext_asciiz_esi:			   ; for skins title out
12
dtext_asciiz_esi:			   ; for skins title out
13
    push eax
13
    push eax
14
    xor eax, eax
14
    xor eax, eax
15
    inc eax
15
    inc eax
16
    jmp    dtext.1
16
    jmp    dtext.1
17
; } \\ Alver \\
17
; } \\ Alver \\
18
 
18
 
19
align 4
19
align 4
20
dtext:	; Text String Output (rw by Johnny_B[john@kolibrios.org])
20
dtext:	; Text String Output (rw by Johnny_B[john@kolibrios.org])
21
	; ebx x & y
21
	; ebx x & y
22
	; ecx style ( 0xX0000000 ) & color ( 0x00RRGGBB )
22
	; ecx style ( 0xX0000000 ) & color ( 0x00RRGGBB )
23
	; X = ABnnb:
23
	; X = ABnnb:
24
	; nn = font
24
	; nn = font
25
	; A = 0 <=> output esi characters; otherwise output ASCIIZ string
25
	; A = 0 <=> output esi characters; otherwise output ASCIIZ string
26
	; B = 1 <=> fill background with color eax
26
	; B = 1 <=> fill background with color eax
27
	; edx start of text
27
	; edx start of text
28
	; edi 1 force
28
	; edi 1 force
29
 
29
 
30
; // Alver 22.06.2008 // {
30
; // Alver 22.06.2008 // {
31
       push eax
31
       push eax
32
	xor	eax, eax
32
	xor	eax, eax
33
.1:
33
.1:
34
; } \\ Alver \\
34
; } \\ Alver \\
35
	pushad
35
	pushad
36
	call	[_display.disable_mouse]
36
	call	[_display.disable_mouse]
37
 
37
 
38
	movsx	eax, bx 	; eax=y
38
	movsx	eax, bx 	; eax=y
39
	sar	ebx, 16 	; ebx=x
39
	sar	ebx, 16 	; ebx=x
40
	xchg	eax, ebx	; eax=x, ebx=y
40
	xchg	eax, ebx	; eax=x, ebx=y
41
	cmp	esi, 255
41
	cmp	esi, 255
42
	jb	.loop
42
	jb	.loop
43
	mov	esi, 255
43
	mov	esi, 255
44
.loop:
44
.loop:
45
	test	ecx, ecx
45
	test	ecx, ecx
46
	js	.test_asciiz
46
	js	.test_asciiz
47
	dec	esi
47
	dec	esi
48
	js	.end
48
	js	.end
49
	jmp	@f
49
	jmp	@f
50
.test_asciiz:
50
.test_asciiz:
51
	cmp	byte [edx], 0
51
	cmp	byte [edx], 0
52
	jz	.end
52
	jz	.end
53
; // Alver 22.06.2008 // {
53
; // Alver 22.06.2008 // {
54
	cmp byte [esp+28], 1	;  was the entry point = dtext.1 ?
54
	cmp byte [esp+28], 1	;  was the entry point = dtext.1 ?
55
	jne   @f
55
	jne   @f
56
	dec	esi
56
	dec	esi
57
	js	  .end
57
	js	  .end
58
; } \\ Alver \\
58
; } \\ Alver \\
59
@@:
59
@@:
60
	inc	edx
60
	inc	edx
61
	pushad			; esp -= 64 !
61
	pushad			; esp -= 64 !
62
	movzx	edx, byte [edx-1]
62
	movzx	edx, byte [edx-1]
63
	test	ecx, 0x10000000
63
	test	ecx, 0x10000000
64
	jnz	.font2
64
	jnz	.font2
65
	mov	esi, 9
65
	mov	esi, 9
66
	lea	ebp, [FONT_I+8*edx+edx]
66
	lea	ebp, [FONT_I+8*edx+edx]
67
.symloop1:
67
.symloop1:
68
	mov	dl, byte [ebp]
68
	mov	dl, byte [ebp]
69
	or	dl, 1 shl 6
69
	or	dl, 1 shl 6
70
.pixloop1:
70
.pixloop1:
71
	shr	dl, 1
71
	shr	dl, 1
72
	jz	.pixloop1end
72
	jz	.pixloop1end
73
	jnc	.nopix
73
	jnc	.nopix
74
	call	[putpixel]
74
	call	[putpixel]
75
	jmp	.pixloop1cont
75
	jmp	.pixloop1cont
76
.nopix:
76
.nopix:
77
	test	ecx, 0x40000000
77
	test	ecx, 0x40000000
78
	jz	.pixloop1cont
78
	jz	.pixloop1cont
79
	push	ecx
79
	push	ecx
80
	mov	ecx, [esp+4+20h+20h]	; original eax?
80
	mov	ecx, [esp+4+20h+20h]	; original eax?
81
	call	[putpixel]
81
	call	[putpixel]
82
	pop	ecx
82
	pop	ecx
83
.pixloop1cont:
83
.pixloop1cont:
84
	inc	eax
84
	inc	eax
85
	jmp	.pixloop1
85
	jmp	.pixloop1
86
.pixloop1end:
86
.pixloop1end:
87
	sub	eax, 6
87
	sub	eax, 6
88
	inc	ebx
88
	inc	ebx
89
	inc	ebp
89
	inc	ebp
90
	dec	esi
90
	dec	esi
91
	jnz	.symloop1
91
	jnz	.symloop1
92
	popad
92
	popad
93
	add	eax, 6
93
	add	eax, 6
94
	jmp	.loop
94
	jmp	.loop
95
.font2:
95
.font2:
96
	add	edx, edx
96
	add	edx, edx
97
	lea	ebp, [FONT_II+4*edx+edx+1]
97
	lea	ebp, [FONT_II+4*edx+edx+1]
98
	push	9
98
	push	9
99
	movzx	esi, byte [ebp-1]
99
	movzx	esi, byte [ebp-1]
100
.symloop2:
100
.symloop2:
101
	mov	dl, byte [ebp]
101
	mov	dl, byte [ebp]
102
	push	esi
102
	push	esi
103
.pixloop2:
103
.pixloop2:
104
	shr	dl, 1
104
	shr	dl, 1
105
	jnc	.nopix2
105
	jnc	.nopix2
106
	call	[putpixel]
106
	call	[putpixel]
107
	jmp	.pixloop2cont
107
	jmp	.pixloop2cont
108
.nopix2:
108
.nopix2:
109
	test	ecx, 0x40000000
109
	test	ecx, 0x40000000
110
	jz	.pixloop2cont
110
	jz	.pixloop2cont
111
	push	ecx
111
	push	ecx
112
	mov	ecx, [esp+12+20h+20h]
112
	mov	ecx, [esp+12+20h+20h]
113
	call	[putpixel]
113
	call	[putpixel]
114
	pop	ecx
114
	pop	ecx
115
.pixloop2cont:
115
.pixloop2cont:
116
	inc	eax
116
	inc	eax
117
	dec	esi
117
	dec	esi
118
	jnz	.pixloop2
118
	jnz	.pixloop2
119
	pop	esi
119
	pop	esi
120
	sub	eax, esi
120
	sub	eax, esi
121
	inc	ebx
121
	inc	ebx
122
	inc	ebp
122
	inc	ebp
123
	dec	dword [esp]
123
	dec	dword [esp]
124
	jnz	.symloop2
124
	jnz	.symloop2
125
	pop	eax
125
	pop	eax
126
	add	dword [esp+28], esi
126
	add	dword [esp+28], esi
127
	popad
127
	popad
128
	jmp	.loop
128
	jmp	.loop
129
.end:
129
.end:
130
	popad
130
	popad
131
	pop  eax		; << // Alver 22.06.2008 // <<
131
	pop  eax		; << // Alver 22.06.2008 // <<
132
	ret
132
	ret
133
 
133
 
134
diff10 "old font  code size",dtext,$
134
diff10 "old font  code size",dtext,$
135
 
135
 
136
;=====================================================
136
;=====================================================
137
; NEW FONTS
137
; NEW FONTS
138
;_____________________________________________________
138
;_____________________________________________________
139
;
139
;
140
 
140
 
141
align 8
141
align 8
142
sdsh_data:
142
sdsh_data:
-
 
143
 
-
 
144
diff16 "sdsh_data      : ",0,$
143
 
145
 
144
include 'fonts/sd_data.asm'
146
include 'fonts/sd_data.asm'
145
 
147
 
146
sdsh_code:
148
sdsh_code:
147
 
149
 
148
; eax	=	if (bit[31]) 
150
; eax   =       if (bit[31])
149
;				then lower 31 bits points to the user-selected font
151
;                               then lower 31 bits points to the user-selected font
150
;				else ax = number of preloaded system font 
152
;                               else ax = number of preloaded system font
151
; ebx	=	x<<16 + y
153
; ebx   =       x<<16 + y
152
; ecx	=	0x00RRGGBB
154
; ecx   =       0x00RRGGBB
153
; edx	=	if (bits[31:8] == 0)
155
; edx   =       if (bits[31:8] == 0)
154
;				then dl = single char to write 
156
;                               then dl = single char to write
-
 
157
;                               else edx= pointer to asciiz-string
-
 
158
 
155
;				else edx= pointer to asciiz-string
159
diff16 "draw_char      : ",0,$
156
 
160
 
157
draw_char:
161
draw_char:
158
; font test
162
; font test
159
; bl=y; bh=x
163
; bl=y; bh=x
160
; dl=ascii
164
; dl=ascii
161
        movzx   eax, bh
165
	movzx	eax, bh
162
        movzx   ebx, bl
166
	movzx	ebx, bl
163
        movzx   ecx, dl
167
	movzx	ecx, dl
164
        xor     edi, edi
168
	xor	edi, edi
165
        mov     ebp, edi
169
	mov	ebp, edi
-
 
170
 
166
         
171
 
167
sdsh_draw_char:
172
sdsh_draw_char:
168
; eax = left side X
173
; eax = left side X
169
; ebx = bottom Y
174
; ebx = bottom Y
170
; edi = color 0x0RRGGBB
175
; edi = color 0x0RRGGBB
171
; ebp = font@ 
176
; ebp = font@
172
; ecx = ascii, zero-extended to 32bits
177
; ecx = ascii, zero-extended to 32bits
173
        push    ecx
178
	push	ecx
174
        push    edx 
179
	push	edx
175
        push    ebp
180
	push	ebp
176
        shl     ebp, 4
181
	shl	ebp, 4
177
        add     ebp, sdsh_data.info
182
	add	ebp, sdsh_data.info
178
        call	ch_checkscreen
183
;        call   ch_checkscreen
179
        jb		.exit
184
;        jb             .exit
180
        call	ch_checkwin
185
;        call   ch_checkwin
181
        jc		.exit
186
;        jc             .exit
182
        xor		ch, ch
-
 
183
        mov     edx, [ebp + 4]              ; chartable addr
187
	mov	edx, [ebp + 4]		    ; chartable addr
184
        mov		cx, word[edx + ecx*2]       ; tick info
188
	mov	cx, word[edx + ecx*2]	    ; tick info
185
        mov		edx, ecx
189
	mov	edx, ecx
186
        and     ecx, 7                      ; cl = number of ticks
190
	and	ecx, 7			    ; cl = number of ticks
187
        jz      .blank
191
	jz	.blank
188
        shr     edx, 4                      ; offset in the chartable
192
	shr	edx, 4			    ; offset in the chartable
189
        add     edx, [sdsh_data.chars]      ; edx -> the char's ticklist 
193
	add	edx, sdsh_data.chars	    ; edx -> the char's ticklist
190
.next_tick:
194
.next_tick:
191
        call    parse_tick
195
	call	parse_tick
192
        add     edx, 4
196
	add	edx, 2
193
        dec     cl
197
	dec	cl
194
        jnz     .next_tick
198
	jnz	.next_tick
195
.blank:
199
.blank:
196
.exit:
200
.exit:
197
        pop     ebp 
201
	pop	ebp
198
        pop     edx 
202
	pop	edx
199
        pop     ecx
203
	pop	ecx
200
        ret
204
	ret
201
 
205
 
202
 
206
 
203
parse_tick:
207
parse_tick:
-
 
208
diff16 "parse_tick     : ",0,$
204
; eax = left side X
209
; eax = left side X
205
; ebx = bottom Y
210
; ebx = bottom Y
206
; edx ->tickinfo
211
; edx ->tickinfo
207
; edi = color 0x0RRGGBB
212
; edi = color 0x0RRGGBB
208
; ebp = font's header 
213
; ebp = font's header
209
        pushad    
214
	pushad
210
        xor     ecx, ecx
215
	xor	ecx, ecx
211
        mov     dx, word[edx]
216
	mov	dx, word[edx]
212
        mov     cl, dl
217
	mov	cl, dl
213
        test    dl, 0xE0            ; ticks #32..255
218
	test	dl, 0xE0	    ; ticks #32..255
214
        jz      .lntick.short
219
	jz	.lntick.short
215
        cmp     dl, 0xE0
220
	cmp	dl, 0xE0
216
        jae     .lntick.long
221
	jae	.lntick.long
217
        cmp     dl, 0xC0
222
	cmp	dl, 0xC0
218
        jae     .cstick
223
	jae	.cstick
219
.gptick:
224
.gptick:
220
        push    edx
225
	push	edx
221
        mov     cl, dh
226
	mov	cl, dh
222
        shr     cl, 3               ; orig.#
227
	shr	cl, 3		    ; orig.#
223
        mov     edx, [ebp+8]        ; orig. table
228
	mov	edx, [ebp+8]	    ; orig. table
224
        mov     ch, byte[edx+ecx]   ; orig. coords
229
	mov	ch, byte[edx+ecx]   ; orig. coords
225
        pop     edx
230
	pop	edx
226
        mov     cl, dh
231
	mov	cl, dh
227
        and     cl, 7                   ; three rotation bits
232
	and	cl, 7			; three rotation bits
228
        and     edx, 0xFF               ; dl = gptick#
233
	and	edx, 0xFF		; dl = gptick#
229
        sub     dl, 32
234
	sub	dl, 32
230
        cmp     dl, (sdsh_data.v5-sdsh_data.v1)
235
	cmp	dl, (sdsh_data.v5-sdsh_data.v1)
231
        jae     .gptick.2
236
	jae	.gptick.2
232
.gptick.1:
237
.gptick.1:
233
        mov     esi, sdsh_data.tick_table
238
	mov	esi, sdsh_data.tick_table
234
        add     esi, edx                ;  1-byte tickgroups .v1-v4:
239
	add	esi, edx		;  1-byte tickgroups .v1-v4:
235
        inc     dh
240
	inc	dh
236
        sub     dl, 2                   ; .v1 : 2 ticks only (#32, 33) 
241
	sub	dl, 2			; .v1 : 2 ticks only (#32, 33)
237
        jae     @f
242
	jae	@f
238
        mov     dl, dh
243
	mov	dl, dh
239
        jmp     .gptick.done
244
	jmp	.gptick.done
240
@@:     inc     dh
245
@@:	inc	dh
241
        shr     dl, 3                   ; tickgroups .v2-v4 : 8 ticks each
246
	shr	dl, 3			; tickgroups .v2-v4 : 8 ticks each
242
        add     dl, dh
247
	add	dl, dh
243
        jmp     .gptick.done        
248
	jmp	.gptick.done
244
.gptick.2:
249
.gptick.2:
245
        sub     dl, (sdsh_data.v5-sdsh_data.v1)
250
	sub	dl, (sdsh_data.v5-sdsh_data.v1)
246
        cmp     dl, (sdsh_data.v9-sdsh_data.v5)
251
	cmp	dl, (sdsh_data.v9-sdsh_data.v5)
247
        jae     .gptick.3
252
	jae	.gptick.3
248
        mov     esi, sdsh_data.v5
253
	mov	esi, sdsh_data.v5
249
        lea     esi, [esi+edx*2]        ; 2-byte tickgroups .v5-v8: 8 ticks each
254
	lea	esi, [esi+edx*2]	; 2-byte tickgroups .v5-v8: 8 ticks each
250
        mov     dh, 5
255
	mov	dh, 5
251
        shr     dl, 3                 
256
	shr	dl, 3
252
        add     dl, dh
257
	add	dl, dh
253
        jmp     .gptick.done        
258
	jmp	.gptick.done
254
.gptick.3:
259
.gptick.3:
255
        sub     dl, (sdsh_data.v9-sdsh_data.v5)
260
	sub	dl, (sdsh_data.v9-sdsh_data.v5)
256
        cmp     dl, (sdsh_data.v13-sdsh_data.v9)
261
	cmp	dl, (sdsh_data.v13-sdsh_data.v9)
257
        jae     .gptick.4
262
	jae	.gptick.4
258
        mov     esi, sdsh_data.v9
263
	mov	esi, sdsh_data.v9
259
        lea     esi,[esi+edx*2]
264
	lea	esi,[esi+edx*2]
260
        add     esi, edx                ; 3-byte tickgroups .v9-12: 4 ticks each 
265
	add	esi, edx		; 3-byte tickgroups .v9-12: 4 ticks each
261
        mov     dh, 9
266
	mov	dh, 9
262
        shr     dl, 2                
267
	shr	dl, 2
263
        add     dl, dh
268
	add	dl, dh
264
        jmp     .gptick.done         
269
	jmp	.gptick.done
265
.gptick.4:
270
.gptick.4:
266
        sub     dl, (sdsh_data.v13-sdsh_data.v9)
271
	sub	dl, (sdsh_data.v13-sdsh_data.v9)
267
        cmp     dl, 16
272
	cmp	dl, 16
268
        jae     .exit
273
	jae	.exit
269
        mov     esi, sdsh_data.v13
274
	mov	esi, sdsh_data.v13
270
        lea     esi,[esi+edx*4]         ; 4-byte tickgroups .v13-16: 4 ticks each
275
	lea	esi,[esi+edx*4] 	; 4-byte tickgroups .v13-16: 4 ticks each
271
        mov     dh, 13
276
	mov	dh, 13
272
        shr     dl, 2                 
277
	shr	dl, 2
273
        add     dl, dh
278
	add	dl, dh
274
.gptick.done:
279
.gptick.done:
275
        mov     dh, ch                  ; dh = orig.XY;     dl = numvert
280
	mov	dh, ch			; dh = orig.XY;     dl = numvert
276
        jmp     .draw                   ; cl = rotation
281
	jmp	.draw			; cl = rotation
277
        
282
 
278
.cstick:
283
.cstick:
279
        and     cl, 4
284
	and	cl, 4
280
        shr     cl, 2                   ; only one rotational bit
285
	shr	cl, 2			; only one rotational bit
281
        and     dl, 3
286
	and	dl, 3
282
        inc     dl
287
	inc	dl
283
        dec     dl
288
	dec	dl
284
        jz      .cstick.0
289
	jz	.cstick.0
285
        dec     dl
290
	dec	dl
286
        jnz     @f
291
	jnz	@f
287
        mov     dl, 6
292
	mov	dl, 6
288
        jz      .cstick.1
293
	jz	.cstick.1
289
@@:     dec     dl
294
@@:	dec	dl
290
        jz      .cstick.2
295
	jz	.cstick.2
291
.cstick.3:
296
.cstick.3:
292
        mov     esi, sdsh_data.cs3      ; 12pix-ring
297
	mov	esi, sdsh_data.cs3	; 12pix-ring
293
        mov     dl, 10
298
	mov	dl, 10
294
        jmp     .draw
299
	jmp	.draw
295
.cstick.2:
300
.cstick.2:
296
        mov     dl, 7
301
	mov	dl, 7
297
.cstick.1:
302
.cstick.1:
298
        mov     esi, sdsh_data.cs2      ; the square
303
	mov	esi, sdsh_data.cs2	; the square
299
        jmp     .draw
304
	jmp	.draw
300
.cstick.0:
305
.cstick.0:
301
        mov     esi, sdsh_data.cs0      ; 4pix-square
306
	mov	esi, sdsh_data.cs0	; 4pix-square
302
        mov     dl, 3
307
	mov	dl, 3
303
        jmp     .draw
308
	jmp	.draw
304
 
309
 
305
.ritick:
310
.ritick:
306
        test    dl, 1
311
	test	dl, 1
307
        jnz     .ritick.1
312
	jnz	.ritick.1
308
.ritick.0:
313
.ritick.0:
309
        mov     cl, dh              ; y
314
	mov	cl, dh		    ; y
310
        and     cl, 0x0F
315
	and	cl, 0x0F
311
        sub     ebx, ecx
316
	sub	ebx, ecx
312
        mov     cl, dh
317
	mov	cl, dh
313
        shr     cl, 4               ; x
318
	shr	cl, 4		    ; x
314
        add     eax, ecx
319
	add	eax, ecx
315
        call    ch_putpixel
320
	call	ch_putpixel
316
        jmp     .exit
321
	jmp	.exit
317
.ritick.1:
322
.ritick.1:
318
        mov     esi, sdsh_data.ri1  ; 8pix-ring
323
	mov	esi, sdsh_data.ri1  ; 8pix-ring
319
        mov     dl, 4 
324
	mov	dl, 4
320
        xor     cl, cl
325
	xor	cl, cl
321
        jmp     .draw 
326
	jmp	.draw
322
        
327
 
323
.lntick.short:
328
.lntick.short:
324
        test    dl, 0x06            ; ticks #0, 1 are reserved for 
329
	test	dl, 0x06	    ; ticks #0, 1 are reserved for
325
        jz      .ritick             ;             rotational invariants     
330
	jz	.ritick 	    ;             rotational invariants
326
        and     dl, 0x07            ; dl = line length
331
	and	dl, 0x07	    ; dl = line length
327
        jmp     .lntick.both
332
	jmp	.lntick.both
328
.lntick.long:
333
.lntick.long:
329
        and     dl, 0x07
334
	and	dl, 0x07
330
        add     dl, 8
335
	add	dl, 8
331
.lntick.both:
336
.lntick.both:
332
        sub     dl, 2               ; num_vertice = num_points - 2
337
	sub	dl, 2		    ; num_vertice = num_points - 2
333
        and     cl, 0x18            ; two rotation bits
338
	and	cl, 0x18	    ; two (lower) rotation bits
334
        shr     cl, 3
339
	shr	cl, 3
335
        mov     esi, sdsh_data.blank 
340
	mov	esi, sdsh_data.blank
336
.draw:
341
.draw:
337
; cl = rot; dl = numvert; dh = orig.xy 
342
; cl = rot; dl = numvert; dh = orig.xy
338
        push    ecx
343
	push	ecx
339
        mov     cl, dh              ; y
344
	mov	cl, dh		    ; y
340
        and     cl, 0x0F
345
	and	cl, 0x0F
341
        sub     ebx, ecx
346
	sub	ebx, ecx
342
        mov     cl, dh
347
	mov	cl, dh
343
        shr     cl, 4               ; x
348
	shr	cl, 4		    ; x
344
        add     eax, ecx
349
	add	eax, ecx
345
        pop     ecx
350
	pop	ecx
346
        call    draw_tick
351
	call	draw_tick
347
.gptick.5:
352
.gptick.5:
348
.exit:
353
.exit:
349
        popad
354
	popad
-
 
355
	ret
-
 
356
 
-
 
357
 
350
        ret
-
 
351
 
-
 
352
                
358
diff16 "draw_tick      : ",0,$
353
	
359
 
354
draw_tick:
360
draw_tick:
355
; eax = x-origin
361
; eax = x-origin
356
; ebx = y-origin
362
; ebx = y-origin
357
; edi = 0x0RRGGBB 
363
; edi = 0x0RRGGBB
358
;  cl = direction (0..7)  
364
;  cl = direction (0..7)
359
;  dl = number of vertices  (dl)
365
;  dl = number of vertice  (dl)
360
; esi -> tick bitfield  
366
; esi -> tick bitfield
361
 
367
 
362
	pushad
-
 
363
    inc     dl                      ; -- that's to count down to 0 
368
	pushad
364
	call	ch_putpixel		        ; the point of origin
369
	call	ch_putpixel			; the point of origin
-
 
370
	and	ecx, 7
365
	and		ecx, 7
371
	lea	ebp, [.move000+ ecx*4]
366
	call	[.moves + ecx*4]        ; basic vector
372
	call	ebp		      ; basic vector
367
	call	ch_putpixel		
373
	call	ch_putpixel
368
    dec     dl
374
        and     edx, 15
369
    jz      .done                   ; 2pix lines only
375
        jz	.done		       ; no vertex (2pix line)
370
    mov     esi, dword [esi]        ; max 16 vertice bitfield limit
376
        mov     esi, dword [esi]       ; 15 vertice will easily fit to 1dw
371
    xchg    esi, edx 
377
        xchg    esi, edx
372
.move_and_draw:
378
.move_and_draw:
373
    mov     ch, dl
379
        mov     ch, dl
374
    and     ch, 3
380
        and     ch, 3
-
 
381
        jz	.moved
-
 
382
        dec     ch
375
    jz      .moved
383
        jz      .1
376
    btc     ecx, 8
384
        dec     ch
-
 
385
        jz      .2
-
 
386
.3: 
377
    jz      .2
387
        dec     cl
378
.1:
-
 
379
    dec     cl                      ; right turns (1 and 3)
-
 
380
    and     cl, 7
-
 
381
@@: btc     ecx, 9                  ; straight angle (3) ?
388
.1:
382
    jc      .1
389
        dec     cl
383
    jmp     .moved
390
        jmp     .wipe_it
384
.2:
391
.2:
-
 
392
        inc     cl
385
    inc     cl                      ; left turn (2)
393
.wipe_it:
386
    and     cl, 7
-
 
387
    btc     ecx, 9                  ; just to zero ah
394
        and     ecx, 7
-
 
395
.moved:
-
 
396
diff16 "moved          : ",0,$
388
.moved:
397
	lea	ebp, [.move000+ ecx*4]
389
	call	[.moves + ecx*4]        ; go new way
398
	call	ebp		    ; go new way
390
	call	ch_putpixel	
399
	call	ch_putpixel
391
    shr     edx, 2	
400
        shr     edx, 2
392
    dec     esi
401
        dec     esi
-
 
402
        jnz     .move_and_draw
393
    jnz     .move_and_draw	         
403
diff16 "done           : ",0,$
394
.done:
404
.done:
395
	popad
405
	popad
396
	ret
406
	ret
-
 
407
 
-
 
408
; WARNING! The order matters! ------
-
 
409
align 4
397
 
410
diff16 "move000        : ",0,$
398
.move000:
411
.move000:
399
	inc		eax
412
	inc		eax
400
	ret
413
	ret
-
 
414
align 4
401
.move001:
415
.move001:
402
	inc		eax
416
	inc		eax
403
	dec		ebx
417
	dec		ebx
404
	ret
418
	ret
-
 
419
align 4
405
.move010:
420
.move010:
406
	dec		ebx
421
	dec		ebx
407
	ret
422
	ret
-
 
423
align 4
408
.move011:
424
.move011:
409
	dec		eax
425
	dec		eax
410
	dec		ebx
426
	dec		ebx
411
	ret
427
	ret
-
 
428
align 4
412
.move100:
429
.move100:
413
	dec		eax
430
	dec		eax
414
	ret
431
	ret
-
 
432
align 4
415
.move101:
433
.move101:
416
	dec		eax
434
	dec		eax
417
	inc		ebx
435
	inc		ebx
418
	ret
436
	ret
-
 
437
align 4
419
.move110:
438
.move110:
420
	inc		ebx
439
	inc		ebx
421
	ret
440
	ret
-
 
441
 
-
 
442
align 4
-
 
443
diff10 "move111-move000 (must be 28!)  : ",.move000,$
422
.move111:
444
.move111:
423
	inc		eax
445
	inc		eax
424
	inc		ebx
446
	inc		ebx
425
	ret
447
	ret
426
 
448
 
427
align 4
-
 
428
.moves dd .move000, .move001, .move010, .move011, .move100, .move101, .move110, .move111
-
 
429
 
-
 
430
;)
449
;) ---------------
-
 
450
 
431
 
451
align 4
432
align 4
452
diff16 "checkscreen    : ",0,$
433
ch_checkscreen:
453
ch_checkscreen:
434
     cmp	[Screen_Max_X], eax
454
     cmp	[Screen_Max_X], eax
435
     jb		.getout
455
     jb 	.getout
436
     cmp	[Screen_Max_Y], ebx
456
     cmp	[Screen_Max_Y], ebx
437
.getout:
457
.getout:
438
     ret
458
     ret
439
 
459
 
440
align 4
460
align 4
-
 
461
diff16 "checkwin       : ",0,$
441
ch_checkwin:
462
ch_checkwin:
442
; eax = x coordinate
463
; eax = x coordinate
443
; ebx = y coordinate
464
; ebx = y coordinate
444
; ebp -> font info
465
; ebp -> font info
445
;!destroys ch, edx! 
466
;!destroys ch, edx!
446
        push    eax
467
	push	eax
447
        push    ebx
468
	push	ebx
448
        mov     ch,  byte[CURRENT_TASK]
469
	mov	ch,  byte[CURRENT_TASK]
449
        mov     al,  byte [ebp]	            ; char X-width
470
	mov	al,  byte [ebp] 	    ; char X-width
450
        mov     edx, [_display.width]       ; screen X-size
471
	mov	edx, [_display.width]	    ; screen X-size
451
        imul    edx, ebx
472
	imul	edx, ebx
452
        add     edx, [_WinMapAddress]
473
	add	edx, [_WinMapAddress]
453
        add     edx, eax
474
	add	edx, eax
454
        cmp     ch,  byte [edx]
475
	cmp	ch,  byte [edx]
455
        jne     .fail
476
	jne	.fail
456
        movzx   eax, byte [ebp]
477
	movzx	eax, byte [ebp]
457
        cmp     ch,  byte [edx+eax]
478
	cmp	ch,  byte [edx+eax]
458
        jne     .fail
479
	jne	.fail
459
        movzx   ebx, byte [ebp+1]
480
	movzx	ebx, byte [ebp+1]
460
        imul    ebx, [_display.width]
481
	imul	ebx, [_display.width]
461
        cmp     ch,  byte [edx+ebx]
482
	cmp	ch,  byte [edx+ebx]
462
        jne     .fail
483
	jne	.fail
463
        add     edx, eax
484
	add	edx, eax
464
        cmp     ch,  byte [edx+ebx]
485
	cmp	ch,  byte [edx+ebx]
465
        clc
486
	clc
466
        je     .done
487
	je     .done
467
.fail:  
488
.fail:
468
        stc                                 ; CF means the charbox is invisible
489
	stc				    ; CF means the charbox is invisible
469
.done:
490
.done:
470
        pop     ebx
491
	pop	ebx
471
        pop     eax
492
	pop	eax
472
        ret
493
	ret
473
 
494
 
-
 
495
align 4
474
align 4
496
diff16 "ch_putpix      : ",0,$
475
ch_putpixel:
497
ch_putpixel:
476
; eax = x coordinate
498
; eax = x coordinate
477
; ebx = y coordinate
499
; ebx = y coordinate
478
; edi = 0x0RRGGBB    
500
; edi = 0x0RRGGBB
479
     push   edx
501
     push   edx
480
	 mov	edx, ebx
502
	 mov	edx, ebx
481
     imul	edx, [BytesPerScanLine]
503
     imul	edx, [BytesPerScanLine]
482
     lea	edx, [edx+eax*4]
504
     lea	edx, [edx+eax*4]
483
     mov   [LFB_BASE+edx], edi
505
     mov   [LFB_BASE+edx], edi
484
     pop    edx
506
     pop    edx
485
     ret
507
     ret
486
;)
508
;)
487
 
509
 
488
 
510
 
489
diff10 "new font  code size",sdsh_code,$
511
diff10 "new font  code size",sdsh_code,$
490
>
512
>
491
>
513
>