1 2 %macro draw_pixel_norm 2 3 mov edx,eax 4 shr edx,%1 5 and edx,0x0000000F 6 jz %%end 7 mov dx,[edx*4+ebx] 8 mov word [edi],dx 9align 2 10%%end: 11 add edi,2 12 %endmacro 13 14 %macro draw_pixel_50 2 15 mov edx,eax 16 shr edx,%1 17 and edx,0x0000000F 18 jz %%end 19 mov dx,[edx*4+ebx] 20 and word [edi],0xf7de 21 and dx,0xf7de 22 shr word [edi],1 23 shr dx,1 24 add word [edi],dx 25align 2 26%%end: 27 add edi,2 28 %endmacro 29 30 %macro draw_pixel_xzoom_norm 2 31 ;; x zoom processing 32 mov edx,%2 33 add edx,[dda_x_skip] 34 mov dl,byte [edx] 35 cmp dl,0 36 jz %%zoom_end 37 38 draw_pixel_norm %1,0 39align 2 40%%zoom_end: 41 %endmacro 42 43 %macro draw_pixel_xzoom_50 2 44 ;; x zoom processing 45 mov edx,%2 46 add edx,[dda_x_skip] 47 mov dl,byte [edx] 48 cmp dl,0 49 jz %%zoom_end 50 51 draw_pixel_50 %1,0 52align 2 53%%zoom_end: 54 %endmacro 55 56 %macro inc_edi_std_norm 0 57 add edi,BUFX_2_MINUS_32 58 %endmacro 59 %macro inc_edi_std_xzoom_norm 0 60 add edi,BUFX_2 61 sub edi,[ebp + %$zx] 62 sub edi,[ebp + %$zx] 63 %endmacro 64 65 %macro inc_edi_yflip_norm 0 66 sub edi,BUFX_2_PLUS_32 67 %endmacro 68 %macro inc_edi_yflip_xzoom_norm 0 69 sub edi,BUFX_2 70 sub edi,[ebp + %$zx] 71 sub edi,[ebp + %$zx] 72 %endmacro 73 74 %macro inc_edi_std_50 0 75 inc_edi_std_norm 76 %endmacro 77 %macro inc_edi_std_xzoom_50 0 78 inc_edi_std_xzoom_norm 79 %endmacro 80 81 %macro inc_edi_yflip_50 0 82 inc_edi_yflip_norm 83 %endmacro 84 %macro inc_edi_yflip_xzoom_50 0 85 inc_edi_yflip_xzoom_norm 86 %endmacro 87 88 %macro draw_line_std 1 89 mov eax,[ebp + %$zy] 90 mov esi,full_y_skip 91 cmp eax,16 92 jz %%full_zoom 93 mov esi,dda_y_skip 94align 2 95%%full_zoom: 96 97 push edx 98 neg edx 99 add edx,eax 100 xor eax,eax 101 mov al, byte [esi + edx] ; 1 ou 0 102 shl eax,3 103 add ecx,eax 104 105 mov eax,[ecx] 106 draw_pixel_%1 28,0 107 draw_pixel_%1 24,1 108 draw_pixel_%1 20,2 109 draw_pixel_%1 16,3 110 draw_pixel_%1 12,4 111 draw_pixel_%1 8,5 112 draw_pixel_%1 4,6 113 draw_pixel_%1 0,7 114 115 mov eax,[ecx+4] 116 draw_pixel_%1 28,8 117 draw_pixel_%1 24,9 118 draw_pixel_%1 20,10 119 draw_pixel_%1 16,11 120 draw_pixel_%1 12,12 121 draw_pixel_%1 8,13 122 draw_pixel_%1 4,14 123 draw_pixel_%1 0,15 124 ;; add edi,BUFX_2_MINUS_32 125 inc_edi_std_%1 126 pop edx 127 %endmacro 128 129 130 %macro draw_line_yflip 1 131 mov eax,[ebp + %$zy] 132 mov esi,full_y_skip 133 cmp eax,16 134 jz %%full_zoom 135 mov esi,dda_y_skip 136align 2 137%%full_zoom: 138 push edx 139 neg edx 140 add edx,eax 141 xor eax,eax 142 mov al, byte [esi + edx] ; 1 ou 0 143 shl eax,3 144 add ecx,eax 145 146 mov eax,[ecx] 147 draw_pixel_%1 28,0 148 draw_pixel_%1 24,1 149 draw_pixel_%1 20,2 150 draw_pixel_%1 16,3 151 draw_pixel_%1 12,4 152 draw_pixel_%1 8,5 153 draw_pixel_%1 4,6 154 draw_pixel_%1 0,7 155 156 mov eax,[ecx+4] 157 draw_pixel_%1 28,8 158 draw_pixel_%1 24,9 159 draw_pixel_%1 20,10 160 draw_pixel_%1 16,11 161 draw_pixel_%1 12,12 162 draw_pixel_%1 8,13 163 draw_pixel_%1 4,14 164 draw_pixel_%1 0,15 165 166 ;; sub edi,BUFX_2_PLUS_32 167 inc_edi_yflip_%1 168 pop edx 169 %endmacro 170 171 %macro draw_line_xflip 1 172 mov eax,[ebp + %$zy] 173 mov esi,full_y_skip 174 cmp eax,16 175 jz %%full_zoom 176 mov esi,dda_y_skip 177align 2 178%%full_zoom: 179 push edx 180 neg edx 181 add edx,eax 182 xor eax,eax 183 mov al, byte [esi + edx] ; 1 ou 0 184 shl eax,3 185 add ecx,eax 186 187 mov eax,[ecx+4] 188 draw_pixel_%1 0,0 189 draw_pixel_%1 4,1 190 draw_pixel_%1 8,2 191 draw_pixel_%1 12,3 192 draw_pixel_%1 16,4 193 draw_pixel_%1 20,5 194 draw_pixel_%1 24,6 195 draw_pixel_%1 28,7 196 197 mov eax,[ecx] 198 draw_pixel_%1 0,8 199 draw_pixel_%1 4,9 200 draw_pixel_%1 8,10 201 draw_pixel_%1 12,11 202 draw_pixel_%1 16,12 203 draw_pixel_%1 20,13 204 draw_pixel_%1 24,14 205 draw_pixel_%1 28,15 206 207 ;; add edi,BUFX_2_MINUS_32 208 inc_edi_std_%1 209 pop edx 210 %endmacro 211 212 %macro draw_line_xflip_yflip 1 213 mov eax,[ebp + %$zy] 214 mov esi,full_y_skip 215 cmp eax,16 216 jz %%full_zoom 217 mov esi,dda_y_skip 218align 2 219%%full_zoom: 220 push edx 221 neg edx 222 add edx,eax 223 xor eax,eax 224 mov al, byte [esi + edx] ; 1 ou 0 225 shl eax,3 226 add ecx,eax 227 228 mov eax,[ecx+4] 229 draw_pixel_%1 0,0 230 draw_pixel_%1 4,1 231 draw_pixel_%1 8,2 232 draw_pixel_%1 12,3 233 draw_pixel_%1 16,4 234 draw_pixel_%1 20,5 235 draw_pixel_%1 24,6 236 draw_pixel_%1 28,7 237 238 mov eax,[ecx] 239 draw_pixel_%1 0,8 240 draw_pixel_%1 4,9 241 draw_pixel_%1 8,10 242 draw_pixel_%1 12,11 243 draw_pixel_%1 16,12 244 draw_pixel_%1 20,13 245 draw_pixel_%1 24,14 246 draw_pixel_%1 28,15 247 ;;sub edi,BUFX_2_PLUS_32 248 inc_edi_yflip_%1 249 pop edx 250 %endmacro 251 252 %macro get_dest_buf 0 253 mov edx,BUFX_2 254 mov eax,[ebp + %$sy] 255 mov edi,[ebp + %$sx] 256 mul edx 257 shl edi,1 258 add edi,eax 259 add edi,[ebp + %$dest] ; edi = poiteur sur la ligne a dessiner 260 %endmacro 261 262 %macro get_dest_buf_yflip 0 263 mov eax,[ebp + %$zy] 264 mov edx,BUFX_2 265 sub eax,1 266 mov edi,[ebp + %$sx] 267 add eax,[ebp + %$sy] 268 mul edx 269 shl edi,1 270 add edi,eax 271 add edi,[ebp + %$dest] ; edi = poiteur sur la ligne a dessiner 272 %endmacro 273 274 %macro draw_tile_i386 1 275 ;; start of the function 276 proc draw_tile_i386_%1 277 %$tileno arg 278 %$sx arg 279 %$sy arg 280 %$zx arg 281 %$zy arg 282 %$color arg 283 %$xflip arg 284 %$yflip arg 285 %$dest arg ; destination buffer (352x256x16) 286 287 pusha 288 289 ;; pointeur sur la tile 290 mov eax,[ebp + %$tileno] 291 mov ecx,[mem_gfx] 292 shl eax,7 293 mov ecx,[ecx] 294 add ecx,eax ; ecx = pointeur sur la tile 295 296 ;; pointeur sur la palette 297 mov eax,[ebp + %$color] 298 mov ebx,[current_pc_pal] 299 shl eax,6 300 add ebx,eax ; ebx = pointeur sur la palette 301 302 ;; xzoom? 303 cmp byte [ebp + %$zx],16 304 jnz NEAR %%.draw_xzoom 305 306 ;; xflip? 307 cmp byte [ebp + %$xflip],0 308 jnz NEAR %%.draw_xflip 309 310 ;; yflip? 311 cmp byte [ebp + %$yflip],0 312 jnz NEAR %%.draw_yflip 313 314 315;;; draw a tile with yzoom 316 get_dest_buf 317 mov edx,[ebp + %$zy] ; dx = conteur de zx a 0 318 cmp dx,0 319 jz NEAR %%.end 320align 2 321%%.loop_next_y: 322 draw_line_std %1 323 324 dec dx 325 jnz NEAR %%.loop_next_y 326 jmp %%.end 327 328;;; draw a tile with yzoom+yflip 329align 2 330%%.draw_yflip 331 get_dest_buf_yflip 332 mov edx,[ebp + %$zy] ; dx = conteur de zx a 0 333 cmp dx,0 334 jz NEAR %%.end 335align 2 336%%.yflip_loop_next_y: 337 draw_line_yflip %1 338 339 dec dx 340 jnz NEAR %%.yflip_loop_next_y 341 jmp %%.end 342 343align 2 344;;; draw a tile with yzoom+xflip 345%%.draw_xflip: 346 347 cmp byte [ebp + %$yflip],0 348 jnz NEAR %%.draw_xflip_yflip 349 350 get_dest_buf 351 mov edx,[ebp + %$zy] ; dx = conteur de zx a 0 352 cmp dx,0 353 jz NEAR %%.end 354align 2 355%%.xflip_loop_next_y: 356 draw_line_xflip %1 357 358 dec dx 359 jnz NEAR %%.xflip_loop_next_y 360 jmp %%.end 361 362align 2 363%%.draw_xflip_yflip 364 get_dest_buf_yflip 365 mov edx,[ebp + %$zy] ; dx = conteur de zx a 0 366 cmp dx,0 367 jz NEAR %%.end 368align 2 369%%.xflip_yflip_loop_next_y: 370 draw_line_xflip_yflip %1 371 372 dec dx 373 jnz NEAR %%.xflip_yflip_loop_next_y 374 jmp %%.end 375 376align 2 377%%.draw_xzoom 378 cmp byte [ebp + %$xflip],0 379 jnz NEAR %%.xzoom_draw_xflip 380 381 cmp byte [ebp + %$yflip],0 382 jnz NEAR %%.xzoom_draw_yflip 383 384 385;;; draw a tile with yzoom+xzoom 386 get_dest_buf 387 mov edx,[ebp + %$zy] ; dx = conteur de zx a 0 388 cmp dx,0 389 jz NEAR %%.end 390align 2 391%%.xzoom_loop_next_y: 392 draw_line_std xzoom_%1 393 394 dec dx 395 jnz NEAR %%.xzoom_loop_next_y 396 jmp %%.end 397 398align 2 399;;; draw a tile with xzoom+yzoom+yflip 400%%.xzoom_draw_yflip 401 get_dest_buf_yflip 402 mov edx,[ebp + %$zy] ; dx = conteur de zx a 0 403 cmp dx,0 404 jz NEAR %%.end 405align 2 406%%.xzoom_yflip_loop_next_y: 407 draw_line_yflip xzoom_%1 408 409 dec dx 410 jnz NEAR %%.xzoom_yflip_loop_next_y 411 jmp %%.end 412 413align 2 414;;; draw a tile with xzoom_yzoom+xflip 415%%.xzoom_draw_xflip: 416 417 cmp byte [ebp + %$yflip],0 418 jnz NEAR %%.xzoom_draw_xflip_yflip 419 420 get_dest_buf 421 mov edx,[ebp + %$zy] ; dx = conteur de zx a 0 422 cmp dx,0 423 jz NEAR %%.end 424 425align 2 426%%.xzoom_xflip_loop_next_y: 427 draw_line_xflip xzoom_%1 428 dec dx 429 jnz NEAR %%.xzoom_xflip_loop_next_y 430 jmp %%.end 431 432align 2 433%%.xzoom_draw_xflip_yflip 434 get_dest_buf_yflip 435 mov edx,[ebp + %$zy] ; dx = conteur de zx a 0 436 cmp dx,0 437 jz NEAR %%.end 438 439align 2 440%%.xzoom_xflip_yflip_loop_next_y: 441 draw_line_xflip_yflip xzoom_%1 442 dec dx 443 jnz NEAR %%.xzoom_xflip_yflip_loop_next_y 444 jmp %%.end 445 446align 2 447%%.end: 448 popa 449 endproc 450%endmacro 451 452 453 454;; scanline rendering 455 %macro scan_draw_line_std 1 456 457 mov eax,[ecx] 458 draw_pixel_%1 28,0 459 draw_pixel_%1 24,1 460 draw_pixel_%1 20,2 461 draw_pixel_%1 16,3 462 draw_pixel_%1 12,4 463 draw_pixel_%1 8,5 464 draw_pixel_%1 4,6 465 draw_pixel_%1 0,7 466 467 mov eax,[ecx+4] 468 draw_pixel_%1 28,8 469 draw_pixel_%1 24,9 470 draw_pixel_%1 20,10 471 draw_pixel_%1 16,11 472 draw_pixel_%1 12,12 473 draw_pixel_%1 8,13 474 draw_pixel_%1 4,14 475 draw_pixel_%1 0,15 476 %endmacro 477 478 %macro scan_draw_line_xflip 1 479 480 mov eax,[ecx+4] 481 draw_pixel_%1 0,0 482 draw_pixel_%1 4,1 483 draw_pixel_%1 8,2 484 draw_pixel_%1 12,3 485 draw_pixel_%1 16,4 486 draw_pixel_%1 20,5 487 draw_pixel_%1 24,6 488 draw_pixel_%1 28,7 489 490 mov eax,[ecx] 491 draw_pixel_%1 0,8 492 draw_pixel_%1 4,9 493 draw_pixel_%1 8,10 494 draw_pixel_%1 12,11 495 draw_pixel_%1 16,12 496 draw_pixel_%1 20,13 497 draw_pixel_%1 24,14 498 draw_pixel_%1 28,15 499 %endmacro 500 501 502 %macro draw_scanline_tile_i386 1 503 ;; start of the function 504 proc draw_scanline_tile_i386_%1 505 %$tileno arg 506 %$yoffs arg 507 %$sx arg 508 %$sy arg 509 %$zx arg 510 %$color arg 511 %$xflip arg 512 %$dest arg ; destination buffer (352x256x16) 513 514 pusha 515 516 ;; pointeur sur la tile 517 mov eax,[ebp + %$tileno] 518 mov ecx,[mem_gfx] 519 mov edx,[ebp + %$yoffs] 520 shl eax,7 521 mov ecx,[ecx] 522 shl edx,3 523 add ecx,eax ; ecx = pointeur sur la tile 524 add ecx,edx 525 526 ;; pointeur sur la palette 527 mov eax,[ebp + %$color] 528 mov ebx,[current_pc_pal] 529 shl eax,6 530 add ebx,eax ; ebx = pointeur sur la palette 531 532 get_dest_buf 533 534 535 ;; xzoom? 536 cmp byte [ebp + %$zx],16 537 jnz NEAR %%.draw_xzoom 538 539 ;; xflip? 540 cmp byte [ebp + %$xflip],0 541 jnz NEAR %%.draw_xflip 542 543 ;; draw a line wit zx==16 544 scan_draw_line_std %1 545 jmp %%.end 546 547%%.draw_xflip: 548 ;; draw a line wit zx==16 and xflip 549 scan_draw_line_xflip %1 550 jmp %%.end 551 552%%.draw_xzoom: 553 cmp byte [ebp + %$xflip],0 554 jnz NEAR %%.xzoom_draw_xflip 555 556 ;; draw a line with zx!=16 557 scan_draw_line_std xzoom_%1 558 jmp %%.end 559 560%%.xzoom_draw_xflip 561 ;; draw a line with zx!=16 and xflip 562 scan_draw_line_xflip xzoom_%1 563 564align 2 565%%.end: 566 popa 567 endproc 568%endmacro 569