trunk/src/emu/video/pc_vga.c
r18195 | r18196 | |
208 | 208 | UINT8 enable_8514; |
209 | 209 | UINT8 cr53; |
210 | 210 | UINT16 current_cmd; |
211 | | INT16 dest_x; |
212 | | INT16 dest_y; |
213 | | INT16 curr_x; |
214 | | INT16 curr_y; |
215 | | INT16 prev_x; |
216 | | INT16 prev_y; |
217 | 211 | UINT16 src_x; |
218 | 212 | UINT16 src_y; |
219 | | INT16 line_axial_step; |
220 | | INT16 line_diagonal_step; |
221 | | INT16 line_errorterm; |
222 | 213 | UINT16 rect_width; |
223 | 214 | UINT16 rect_height; |
224 | 215 | UINT32 fgcolour; |
r18195 | r18196 | |
277 | 268 | UINT16 ec3; |
278 | 269 | bool gpbusy; |
279 | 270 | bool data_avail; |
| 271 | INT16 dest_x; |
| 272 | INT16 dest_y; |
| 273 | INT16 curr_x; |
| 274 | INT16 curr_y; |
| 275 | INT16 prev_x; |
| 276 | INT16 prev_y; |
| 277 | INT16 line_axial_step; |
| 278 | INT16 line_diagonal_step; |
| 279 | INT16 line_errorterm; |
280 | 280 | int state; |
281 | 281 | |
282 | 282 | UINT8 wait_vector_len; |
r18195 | r18196 | |
3151 | 3151 | UINT8 src = 0; |
3152 | 3152 | |
3153 | 3153 | // check clipping rectangle |
3154 | | if(s3.curr_x < s3.scissors_left || s3.curr_x > s3.scissors_right || s3.curr_y < s3.scissors_top || s3.curr_y > s3.scissors_bottom) |
| 3154 | if(ibm8514.curr_x < s3.scissors_left || ibm8514.curr_x > s3.scissors_right || ibm8514.curr_y < s3.scissors_top || ibm8514.curr_y > s3.scissors_bottom) |
3155 | 3155 | return; // do nothing |
3156 | 3156 | |
3157 | 3157 | // determine source |
r18195 | r18196 | |
3168 | 3168 | break; |
3169 | 3169 | case 0x0060: |
3170 | 3170 | // video memory - presume the memory is sourced from the current X/Y co-ords |
3171 | | src = vga.memory[((s3.curr_y * VGA_LINE_LENGTH) + s3.curr_x) % vga.svga_intf.vram_size]; |
| 3171 | src = vga.memory[((ibm8514.curr_y * VGA_LINE_LENGTH) + ibm8514.curr_x) % vga.svga_intf.vram_size]; |
3172 | 3172 | break; |
3173 | 3173 | } |
3174 | 3174 | |
r18195 | r18196 | |
3232 | 3232 | UINT8 src = 0; |
3233 | 3233 | |
3234 | 3234 | // check clipping rectangle |
3235 | | if(s3.curr_x < s3.scissors_left || s3.curr_x > s3.scissors_right || s3.curr_y < s3.scissors_top || s3.curr_y > s3.scissors_bottom) |
| 3235 | if(ibm8514.curr_x < s3.scissors_left || ibm8514.curr_x > s3.scissors_right || ibm8514.curr_y < s3.scissors_top || ibm8514.curr_y > s3.scissors_bottom) |
3236 | 3236 | return; // do nothing |
3237 | 3237 | |
3238 | 3238 | // determine source |
r18195 | r18196 | |
3249 | 3249 | break; |
3250 | 3250 | case 0x0060: |
3251 | 3251 | // video memory - presume the memory is sourced from the current X/Y co-ords |
3252 | | src = vga.memory[((s3.curr_y * VGA_LINE_LENGTH) + s3.curr_x) % vga.svga_intf.vram_size]; |
| 3252 | src = vga.memory[((ibm8514.curr_y * VGA_LINE_LENGTH) + ibm8514.curr_x) % vga.svga_intf.vram_size]; |
3253 | 3253 | break; |
3254 | 3254 | } |
3255 | 3255 | |
r18195 | r18196 | |
3316 | 3316 | { |
3317 | 3317 | case 0x0000: // Foreground Mix only |
3318 | 3318 | // check clipping rectangle |
3319 | | if(s3.curr_x < s3.scissors_left || s3.curr_x > s3.scissors_right || s3.curr_y < s3.scissors_top || s3.curr_y > s3.scissors_bottom) |
| 3319 | if(ibm8514.curr_x < s3.scissors_left || ibm8514.curr_x > s3.scissors_right || ibm8514.curr_y < s3.scissors_top || ibm8514.curr_y > s3.scissors_bottom) |
3320 | 3320 | return; // do nothing |
3321 | 3321 | s3_write_fg(offset); |
3322 | 3322 | break; |
r18195 | r18196 | |
3373 | 3373 | */ |
3374 | 3374 | READ16_HANDLER(s3_line_error_r) |
3375 | 3375 | { |
3376 | | return s3.line_errorterm; |
| 3376 | return ibm8514.line_errorterm; |
3377 | 3377 | } |
3378 | 3378 | |
3379 | 3379 | WRITE16_HANDLER(s3_line_error_w) |
3380 | 3380 | { |
3381 | | s3.line_errorterm = data; |
| 3381 | ibm8514.line_errorterm = data; |
3382 | 3382 | if(LOG_8514) logerror("S3: Line Parameter/Error Term write %04x\n",data); |
3383 | 3383 | } |
3384 | 3384 | |
r18195 | r18196 | |
3422 | 3422 | |
3423 | 3423 | while(x <= len) |
3424 | 3424 | { |
3425 | | offset = (s3.curr_y * VGA_LINE_LENGTH) + s3.curr_x; |
| 3425 | offset = (ibm8514.curr_y * VGA_LINE_LENGTH) + ibm8514.curr_x; |
3426 | 3426 | if(draw) |
3427 | 3427 | s3_write(offset,offset); |
3428 | 3428 | switch(dir) |
3429 | 3429 | { |
3430 | 3430 | case 0: // 0 degrees |
3431 | | s3.curr_x++; |
| 3431 | ibm8514.curr_x++; |
3432 | 3432 | break; |
3433 | 3433 | case 1: // 45 degrees |
3434 | | s3.curr_x++; |
3435 | | s3.curr_y--; |
| 3434 | ibm8514.curr_x++; |
| 3435 | ibm8514.curr_y--; |
3436 | 3436 | break; |
3437 | 3437 | case 2: // 90 degrees |
3438 | | s3.curr_y--; |
| 3438 | ibm8514.curr_y--; |
3439 | 3439 | break; |
3440 | 3440 | case 3: // 135 degrees |
3441 | | s3.curr_y--; |
3442 | | s3.curr_x--; |
| 3441 | ibm8514.curr_y--; |
| 3442 | ibm8514.curr_x--; |
3443 | 3443 | break; |
3444 | 3444 | case 4: // 180 degrees |
3445 | | s3.curr_x--; |
| 3445 | ibm8514.curr_x--; |
3446 | 3446 | break; |
3447 | 3447 | case 5: // 225 degrees |
3448 | | s3.curr_x--; |
3449 | | s3.curr_y++; |
| 3448 | ibm8514.curr_x--; |
| 3449 | ibm8514.curr_y++; |
3450 | 3450 | break; |
3451 | 3451 | case 6: // 270 degrees |
3452 | | s3.curr_y++; |
| 3452 | ibm8514.curr_y++; |
3453 | 3453 | break; |
3454 | 3454 | case 7: // 315 degrees |
3455 | | s3.curr_y++; |
3456 | | s3.curr_x++; |
| 3455 | ibm8514.curr_y++; |
| 3456 | ibm8514.curr_x++; |
3457 | 3457 | break; |
3458 | 3458 | } |
3459 | 3459 | x++; |
r18195 | r18196 | |
3586 | 3586 | { |
3587 | 3587 | ibm8514.state = IBM8514_DRAWING_LINE; |
3588 | 3588 | ibm8514.data_avail = true; |
3589 | | if(LOG_8514) logerror("S3: Command (%04x) - Vector Line (WAIT) %i,%i \n",s3.current_cmd,s3.curr_x,s3.curr_y); |
| 3589 | if(LOG_8514) logerror("S3: Command (%04x) - Vector Line (WAIT) %i,%i \n",s3.current_cmd,ibm8514.curr_x,ibm8514.curr_y); |
3590 | 3590 | } |
3591 | 3591 | else |
3592 | 3592 | { |
3593 | 3593 | ibm8514_draw_vector(s3.rect_width,(data & 0x00e0) >> 5,(data & 0010) ? true : false); |
3594 | | if(LOG_8514) logerror("S3: Command (%04x) - Vector Line - %i,%i \n",s3.current_cmd,s3.curr_x,s3.curr_y); |
| 3594 | if(LOG_8514) logerror("S3: Command (%04x) - Vector Line - %i,%i \n",s3.current_cmd,ibm8514.curr_x,ibm8514.curr_y); |
3595 | 3595 | } |
3596 | 3596 | } |
3597 | 3597 | else |
3598 | 3598 | { |
3599 | 3599 | // Not perfect, but will do for now. |
3600 | 3600 | INT16 dx = s3.rect_width; |
3601 | | INT16 dy = s3.line_axial_step >> 1; |
3602 | | INT16 err = s3.line_errorterm; |
| 3601 | INT16 dy = ibm8514.line_axial_step >> 1; |
| 3602 | INT16 err = ibm8514.line_errorterm; |
3603 | 3603 | int sx = (data & 0x0020) ? 1 : -1; |
3604 | 3604 | int sy = (data & 0x0080) ? 1 : -1; |
3605 | 3605 | int count = 0; |
3606 | 3606 | INT16 temp; |
3607 | 3607 | |
3608 | 3608 | if(LOG_8514) logerror("S3: Command (%04x) - Line (Bresenham) - %i,%i Axial %i, Diagonal %i, Error %i, Major Axis %i, Minor Axis %i\n",s3.current_cmd, |
3609 | | s3.curr_x,s3.curr_y,s3.line_axial_step,s3.line_diagonal_step,s3.line_errorterm,s3.rect_width,s3.rect_height); |
| 3609 | ibm8514.curr_x,ibm8514.curr_y,ibm8514.line_axial_step,ibm8514.line_diagonal_step,ibm8514.line_errorterm,s3.rect_width,s3.rect_height); |
3610 | 3610 | |
3611 | 3611 | if((data & 0x0040)) |
3612 | 3612 | { |
r18195 | r18196 | |
3614 | 3614 | } |
3615 | 3615 | for(;;) |
3616 | 3616 | { |
3617 | | s3_write(s3.curr_x + (s3.curr_y * VGA_LINE_LENGTH),s3.curr_x + (s3.curr_y * VGA_LINE_LENGTH)); |
| 3617 | s3_write(ibm8514.curr_x + (ibm8514.curr_y * VGA_LINE_LENGTH),ibm8514.curr_x + (ibm8514.curr_y * VGA_LINE_LENGTH)); |
3618 | 3618 | if (count > s3.rect_width) break; |
3619 | 3619 | count++; |
3620 | 3620 | if((err*2) > -dy) |
3621 | 3621 | { |
3622 | 3622 | err -= dy; |
3623 | | s3.curr_x += sx; |
| 3623 | ibm8514.curr_x += sx; |
3624 | 3624 | } |
3625 | 3625 | if((err*2) < dx) |
3626 | 3626 | { |
3627 | 3627 | err += dx; |
3628 | | s3.curr_y += sy; |
| 3628 | ibm8514.curr_y += sy; |
3629 | 3629 | } |
3630 | 3630 | } |
3631 | 3631 | } |
r18195 | r18196 | |
3637 | 3637 | //ibm8514.gpbusy = true; // DirectX 5 keeps waiting for the busy bit to be clear... |
3638 | 3638 | s3.bus_size = (data & 0x0600) >> 9; |
3639 | 3639 | ibm8514.data_avail = true; |
3640 | | if(LOG_8514) logerror("S3: Command (%04x) - Rectangle Fill (WAIT) %i,%i Width: %i Height: %i Colour: %08x\n",s3.current_cmd,s3.curr_x, |
3641 | | s3.curr_y,s3.rect_width,s3.rect_height,s3.fgcolour); |
| 3640 | if(LOG_8514) logerror("S3: Command (%04x) - Rectangle Fill (WAIT) %i,%i Width: %i Height: %i Colour: %08x\n",s3.current_cmd,ibm8514.curr_x, |
| 3641 | ibm8514.curr_y,s3.rect_width,s3.rect_height,s3.fgcolour); |
3642 | 3642 | break; |
3643 | 3643 | } |
3644 | | if(LOG_8514) logerror("S3: Command (%04x) - Rectangle Fill %i,%i Width: %i Height: %i Colour: %08x\n",s3.current_cmd,s3.curr_x, |
3645 | | s3.curr_y,s3.rect_width,s3.rect_height,s3.fgcolour); |
| 3644 | if(LOG_8514) logerror("S3: Command (%04x) - Rectangle Fill %i,%i Width: %i Height: %i Colour: %08x\n",s3.current_cmd,ibm8514.curr_x, |
| 3645 | ibm8514.curr_y,s3.rect_width,s3.rect_height,s3.fgcolour); |
3646 | 3646 | off = 0; |
3647 | | off += (VGA_LINE_LENGTH * s3.curr_y); |
3648 | | off += s3.curr_x; |
| 3647 | off += (VGA_LINE_LENGTH * ibm8514.curr_y); |
| 3648 | off += ibm8514.curr_x; |
3649 | 3649 | for(y=0;y<=s3.rect_height;y++) |
3650 | 3650 | { |
3651 | 3651 | for(x=0;x<=s3.rect_width;x++) |
r18195 | r18196 | |
3656 | 3656 | s3_write((off-x) % vga.svga_intf.vram_size,(off-x) % vga.svga_intf.vram_size); |
3657 | 3657 | if(s3.current_cmd & 0x0020) |
3658 | 3658 | { |
3659 | | s3.curr_x++; |
3660 | | if(s3.curr_x > s3.prev_x + s3.rect_width) |
| 3659 | ibm8514.curr_x++; |
| 3660 | if(ibm8514.curr_x > ibm8514.prev_x + s3.rect_width) |
3661 | 3661 | { |
3662 | | s3.curr_x = s3.prev_x; |
| 3662 | ibm8514.curr_x = ibm8514.prev_x; |
3663 | 3663 | s3.src_x = 0; |
3664 | 3664 | if(s3.current_cmd & 0x0080) |
3665 | | s3.curr_y++; |
| 3665 | ibm8514.curr_y++; |
3666 | 3666 | else |
3667 | | s3.curr_y--; |
| 3667 | ibm8514.curr_y--; |
3668 | 3668 | } |
3669 | 3669 | } |
3670 | 3670 | else |
3671 | 3671 | { |
3672 | | s3.curr_x--; |
3673 | | if(s3.curr_x < s3.prev_x - s3.rect_width) |
| 3672 | ibm8514.curr_x--; |
| 3673 | if(ibm8514.curr_x < ibm8514.prev_x - s3.rect_width) |
3674 | 3674 | { |
3675 | | s3.curr_x = s3.prev_x; |
| 3675 | ibm8514.curr_x = ibm8514.prev_x; |
3676 | 3676 | s3.src_x = 0; |
3677 | 3677 | if(s3.current_cmd & 0x0080) |
3678 | | s3.curr_y++; |
| 3678 | ibm8514.curr_y++; |
3679 | 3679 | else |
3680 | | s3.curr_y--; |
| 3680 | ibm8514.curr_y--; |
3681 | 3681 | } |
3682 | 3682 | } |
3683 | 3683 | } |
r18195 | r18196 | |
3691 | 3691 | break; |
3692 | 3692 | case 0xc000: // BitBLT |
3693 | 3693 | if(LOG_8514) logerror("S3: Command (%04x) - BitBLT from %i,%i to %i,%i Width: %i Height: %i\n",s3.current_cmd, |
3694 | | s3.curr_x,s3.curr_y,s3.dest_x,s3.dest_y,s3.rect_width,s3.rect_height); |
| 3694 | ibm8514.curr_x,ibm8514.curr_y,ibm8514.dest_x,ibm8514.dest_y,s3.rect_width,s3.rect_height); |
3695 | 3695 | off = 0; |
3696 | | off += (VGA_LINE_LENGTH * s3.dest_y); |
3697 | | off += s3.dest_x; |
| 3696 | off += (VGA_LINE_LENGTH * ibm8514.dest_y); |
| 3697 | off += ibm8514.dest_x; |
3698 | 3698 | src = 0; |
3699 | | src += (VGA_LINE_LENGTH * s3.curr_y); |
3700 | | src += s3.curr_x; |
| 3699 | src += (VGA_LINE_LENGTH * ibm8514.curr_y); |
| 3700 | src += ibm8514.curr_x; |
3701 | 3701 | for(y=0;y<=s3.rect_height;y++) |
3702 | 3702 | { |
3703 | 3703 | for(x=0;x<=s3.rect_width;x++) |
r18195 | r18196 | |
3708 | 3708 | vga.memory[(off-x) % vga.svga_intf.vram_size] = vga.memory[(src-x) % vga.svga_intf.vram_size]; |
3709 | 3709 | if(s3.current_cmd & 0x0020) |
3710 | 3710 | { |
3711 | | s3.curr_x++; |
3712 | | if(s3.curr_x > s3.prev_x + s3.rect_width) |
| 3711 | ibm8514.curr_x++; |
| 3712 | if(ibm8514.curr_x > ibm8514.prev_x + s3.rect_width) |
3713 | 3713 | { |
3714 | | s3.curr_x = s3.prev_x; |
| 3714 | ibm8514.curr_x = ibm8514.prev_x; |
3715 | 3715 | s3.src_x = 0; |
3716 | 3716 | if(s3.current_cmd & 0x0080) |
3717 | | s3.curr_y++; |
| 3717 | ibm8514.curr_y++; |
3718 | 3718 | else |
3719 | | s3.curr_y--; |
| 3719 | ibm8514.curr_y--; |
3720 | 3720 | } |
3721 | 3721 | } |
3722 | 3722 | else |
3723 | 3723 | { |
3724 | | s3.curr_x--; |
3725 | | if(s3.curr_x < s3.prev_x - s3.rect_width) |
| 3724 | ibm8514.curr_x--; |
| 3725 | if(ibm8514.curr_x < ibm8514.prev_x - s3.rect_width) |
3726 | 3726 | { |
3727 | | s3.curr_x = s3.prev_x; |
| 3727 | ibm8514.curr_x = ibm8514.prev_x; |
3728 | 3728 | s3.src_x = 0; |
3729 | 3729 | if(s3.current_cmd & 0x0080) |
3730 | | s3.curr_y++; |
| 3730 | ibm8514.curr_y++; |
3731 | 3731 | else |
3732 | | s3.curr_y--; |
| 3732 | ibm8514.curr_y--; |
3733 | 3733 | } |
3734 | 3734 | } |
3735 | 3735 | } |
r18195 | r18196 | |
3749 | 3749 | break; |
3750 | 3750 | case 0xe000: // Pattern Fill |
3751 | 3751 | if(LOG_8514) logerror("S3: Command (%04x) - Pattern Fill - source %i,%i dest %i,%i Width: %i Height: %i\n",s3.current_cmd, |
3752 | | s3.curr_x,s3.curr_y,s3.dest_x,s3.dest_y,s3.rect_width,s3.rect_height); |
| 3752 | ibm8514.curr_x,ibm8514.curr_y,ibm8514.dest_x,ibm8514.dest_y,s3.rect_width,s3.rect_height); |
3753 | 3753 | off = 0; |
3754 | | off += (VGA_LINE_LENGTH * s3.dest_y); |
3755 | | off += s3.dest_x; |
| 3754 | off += (VGA_LINE_LENGTH * ibm8514.dest_y); |
| 3755 | off += ibm8514.dest_x; |
3756 | 3756 | src = 0; |
3757 | | src += (VGA_LINE_LENGTH * s3.curr_y); |
3758 | | src += s3.curr_x; |
| 3757 | src += (VGA_LINE_LENGTH * ibm8514.curr_y); |
| 3758 | src += ibm8514.curr_x; |
3759 | 3759 | if(data & 0x0020) |
3760 | 3760 | pattern_x = 0; |
3761 | 3761 | else |
r18195 | r18196 | |
3840 | 3840 | 0-13 (80 x+) LINE PARAMETER AXIAL STEP CONSTANT. Se above |
3841 | 3841 | |
3842 | 3842 | */ |
3843 | | READ16_HANDLER( s3_8ae8_r ) |
| 3843 | READ16_HANDLER( ibm8514_desty_r ) |
3844 | 3844 | { |
3845 | | return s3.line_axial_step; |
| 3845 | return ibm8514.line_axial_step; |
3846 | 3846 | } |
3847 | 3847 | |
3848 | | WRITE16_HANDLER( s3_8ae8_w ) |
| 3848 | WRITE16_HANDLER( ibm8514_desty_w ) |
3849 | 3849 | { |
3850 | | s3.line_axial_step = data; |
3851 | | s3.dest_y = data; |
3852 | | if(LOG_8514) logerror("S3: Line Axial Step / Destination Y write %04x\n",data); |
| 3850 | ibm8514.line_axial_step = data; |
| 3851 | ibm8514.dest_y = data; |
| 3852 | if(LOG_8514) logerror("8514/A: Line Axial Step / Destination Y write %04x\n",data); |
3853 | 3853 | } |
3854 | 3854 | |
3855 | 3855 | /* |
r18195 | r18196 | |
3865 | 3865 | 0-13 (80x +) LINE PARAMETER DIAGONAL STEP CONSTANT. Se above |
3866 | 3866 | |
3867 | 3867 | */ |
3868 | | READ16_HANDLER( s3_8ee8_r ) |
| 3868 | READ16_HANDLER( ibm8514_destx_r ) |
3869 | 3869 | { |
3870 | | return s3.line_diagonal_step; |
| 3870 | return ibm8514.line_diagonal_step; |
3871 | 3871 | } |
3872 | 3872 | |
3873 | | WRITE16_HANDLER( s3_8ee8_w ) |
| 3873 | WRITE16_HANDLER( ibm8514_destx_w ) |
3874 | 3874 | { |
3875 | | s3.line_diagonal_step = data; |
3876 | | s3.dest_x = data; |
3877 | | if(LOG_8514) logerror("S3: Line Diagonal Step / Destination X write %04x\n",data); |
| 3875 | ibm8514.line_diagonal_step = data; |
| 3876 | ibm8514.dest_x = data; |
| 3877 | if(LOG_8514) logerror("8514/A: Line Diagonal Step / Destination X write %04x\n",data); |
3878 | 3878 | } |
3879 | 3879 | |
3880 | 3880 | /* |
r18195 | r18196 | |
3949 | 3949 | |
3950 | 3950 | if(ibm8514.state == IBM8514_DRAWING_SSV_1 || ibm8514.state == IBM8514_DRAWING_SSV_2) |
3951 | 3951 | { |
3952 | | offset = (s3.curr_y * VGA_LINE_LENGTH) + s3.curr_x; |
| 3952 | offset = (ibm8514.curr_y * VGA_LINE_LENGTH) + ibm8514.curr_x; |
3953 | 3953 | if(draw) |
3954 | 3954 | s3_write(offset,offset); |
3955 | 3955 | switch(dir) |
3956 | 3956 | { |
3957 | 3957 | case 0: // 0 degrees |
3958 | | s3.curr_x++; |
| 3958 | ibm8514.curr_x++; |
3959 | 3959 | break; |
3960 | 3960 | case 1: // 45 degrees |
3961 | | s3.curr_x++; |
3962 | | s3.curr_y--; |
| 3961 | ibm8514.curr_x++; |
| 3962 | ibm8514.curr_y--; |
3963 | 3963 | break; |
3964 | 3964 | case 2: // 90 degrees |
3965 | | s3.curr_y--; |
| 3965 | ibm8514.curr_y--; |
3966 | 3966 | break; |
3967 | 3967 | case 3: // 135 degrees |
3968 | | s3.curr_y--; |
3969 | | s3.curr_x--; |
| 3968 | ibm8514.curr_y--; |
| 3969 | ibm8514.curr_x--; |
3970 | 3970 | break; |
3971 | 3971 | case 4: // 180 degrees |
3972 | | s3.curr_x--; |
| 3972 | ibm8514.curr_x--; |
3973 | 3973 | break; |
3974 | 3974 | case 5: // 225 degrees |
3975 | | s3.curr_x--; |
3976 | | s3.curr_y++; |
| 3975 | ibm8514.curr_x--; |
| 3976 | ibm8514.curr_y++; |
3977 | 3977 | break; |
3978 | 3978 | case 6: // 270 degrees |
3979 | | s3.curr_y++; |
| 3979 | ibm8514.curr_y++; |
3980 | 3980 | break; |
3981 | 3981 | case 7: // 315 degrees |
3982 | | s3.curr_y++; |
3983 | | s3.curr_x++; |
| 3982 | ibm8514.curr_y++; |
| 3983 | ibm8514.curr_x++; |
3984 | 3984 | break; |
3985 | 3985 | } |
3986 | 3986 | } |
r18195 | r18196 | |
4061 | 4061 | |
4062 | 4062 | if(ibm8514.state == IBM8514_DRAWING_LINE) |
4063 | 4063 | { |
4064 | | offset = (s3.curr_y * VGA_LINE_LENGTH) + s3.curr_x; |
| 4064 | offset = (ibm8514.curr_y * VGA_LINE_LENGTH) + ibm8514.curr_x; |
4065 | 4065 | if(draw) |
4066 | 4066 | s3_write(offset,offset); |
4067 | 4067 | switch(dir) |
4068 | 4068 | { |
4069 | 4069 | case 0: // 0 degrees |
4070 | | s3.curr_x++; |
| 4070 | ibm8514.curr_x++; |
4071 | 4071 | break; |
4072 | 4072 | case 1: // 45 degrees |
4073 | | s3.curr_x++; |
4074 | | s3.curr_y--; |
| 4073 | ibm8514.curr_x++; |
| 4074 | ibm8514.curr_y--; |
4075 | 4075 | break; |
4076 | 4076 | case 2: // 90 degrees |
4077 | | s3.curr_y--; |
| 4077 | ibm8514.curr_y--; |
4078 | 4078 | break; |
4079 | 4079 | case 3: // 135 degrees |
4080 | | s3.curr_y--; |
4081 | | s3.curr_x--; |
| 4080 | ibm8514.curr_y--; |
| 4081 | ibm8514.curr_x--; |
4082 | 4082 | break; |
4083 | 4083 | case 4: // 180 degrees |
4084 | | s3.curr_x--; |
| 4084 | ibm8514.curr_x--; |
4085 | 4085 | break; |
4086 | 4086 | case 5: // 225 degrees |
4087 | | s3.curr_x--; |
4088 | | s3.curr_y++; |
| 4087 | ibm8514.curr_x--; |
| 4088 | ibm8514.curr_y++; |
4089 | 4089 | break; |
4090 | 4090 | case 6: // 270 degrees |
4091 | | s3.curr_y++; |
| 4091 | ibm8514.curr_y++; |
4092 | 4092 | break; |
4093 | 4093 | case 7: // 315 degrees |
4094 | | s3.curr_y++; |
4095 | | s3.curr_x++; |
| 4094 | ibm8514.curr_y++; |
| 4095 | ibm8514.curr_x++; |
4096 | 4096 | break; |
4097 | 4097 | } |
4098 | 4098 | } |
r18195 | r18196 | |
4119 | 4119 | if(LOG_8514) logerror("S3: Major Axis Pixel Count / Rectangle Width write %04x\n",data); |
4120 | 4120 | } |
4121 | 4121 | |
4122 | | READ16_HANDLER(s3_currentx_r) |
| 4122 | READ16_HANDLER(ibm8514_currentx_r) |
4123 | 4123 | { |
4124 | | return s3.curr_x; |
| 4124 | return ibm8514.curr_x; |
4125 | 4125 | } |
4126 | 4126 | |
4127 | | WRITE16_HANDLER(s3_currentx_w) |
| 4127 | WRITE16_HANDLER(ibm8514_currentx_w) |
4128 | 4128 | { |
4129 | | s3.curr_x = data; |
4130 | | s3.prev_x = data; |
4131 | | if(LOG_8514) logerror("S3: Current X set to %04x (%i)\n",data,s3.curr_x); |
| 4129 | ibm8514.curr_x = data; |
| 4130 | ibm8514.prev_x = data; |
| 4131 | if(LOG_8514) logerror("8514/A: Current X set to %04x (%i)\n",data,ibm8514.curr_x); |
4132 | 4132 | } |
4133 | 4133 | |
4134 | | READ16_HANDLER(s3_currenty_r) |
| 4134 | READ16_HANDLER(ibm8514_currenty_r) |
4135 | 4135 | { |
4136 | | return s3.curr_y; |
| 4136 | return ibm8514.curr_y; |
4137 | 4137 | } |
4138 | 4138 | |
4139 | | WRITE16_HANDLER(s3_currenty_w) |
| 4139 | WRITE16_HANDLER(ibm8514_currenty_w) |
4140 | 4140 | { |
4141 | | s3.curr_y = data; |
4142 | | s3.prev_y = data; |
4143 | | if(LOG_8514) logerror("S3: Current Y set to %04x (%i)\n",data,s3.curr_y); |
| 4141 | ibm8514.curr_y = data; |
| 4142 | ibm8514.prev_y = data; |
| 4143 | if(LOG_8514) logerror("8514/A: Current Y set to %04x (%i)\n",data,ibm8514.curr_y); |
4144 | 4144 | } |
4145 | 4145 | |
4146 | 4146 | READ16_HANDLER(s3_fgcolour_r) |
r18195 | r18196 | |
4290 | 4290 | if(s3.bus_size == 2) // 32-bit |
4291 | 4291 | data_size = 32; |
4292 | 4292 | off = 0; |
4293 | | off += (VGA_LINE_LENGTH * s3.curr_y); |
4294 | | off += s3.curr_x; |
| 4293 | off += (VGA_LINE_LENGTH * ibm8514.curr_y); |
| 4294 | off += ibm8514.curr_x; |
4295 | 4295 | if(s3.current_cmd & 0x02) // "across plane mode" |
4296 | 4296 | { |
4297 | 4297 | for(x=0;x<data_size;x++) |
r18195 | r18196 | |
4300 | 4300 | if(s3.current_cmd & 0x0020) |
4301 | 4301 | { |
4302 | 4302 | off++; |
4303 | | s3.curr_x++; |
4304 | | if(s3.curr_x > s3.prev_x + s3.rect_width) |
| 4303 | ibm8514.curr_x++; |
| 4304 | if(ibm8514.curr_x > ibm8514.prev_x + s3.rect_width) |
4305 | 4305 | { |
4306 | | s3.curr_x = s3.prev_x; |
| 4306 | ibm8514.curr_x = ibm8514.prev_x; |
4307 | 4307 | s3.src_x = 0; |
4308 | 4308 | if(s3.current_cmd & 0x0080) |
4309 | 4309 | { |
4310 | | s3.curr_y++; |
4311 | | if(s3.curr_y > s3.prev_y + s3.rect_height) |
| 4310 | ibm8514.curr_y++; |
| 4311 | if(ibm8514.curr_y > ibm8514.prev_y + s3.rect_height) |
4312 | 4312 | { |
4313 | 4313 | ibm8514.state = IBM8514_IDLE; |
4314 | 4314 | ibm8514.data_avail = false; |
r18195 | r18196 | |
4317 | 4317 | } |
4318 | 4318 | else |
4319 | 4319 | { |
4320 | | s3.curr_y--; |
4321 | | if(s3.curr_y < s3.prev_y - s3.rect_height) |
| 4320 | ibm8514.curr_y--; |
| 4321 | if(ibm8514.curr_y < ibm8514.prev_y - s3.rect_height) |
4322 | 4322 | { |
4323 | 4323 | ibm8514.state = IBM8514_IDLE; |
4324 | 4324 | ibm8514.data_avail = false; |
r18195 | r18196 | |
4331 | 4331 | else |
4332 | 4332 | { |
4333 | 4333 | off--; |
4334 | | s3.curr_x--; |
4335 | | if(s3.curr_x < s3.prev_x - s3.rect_width) |
| 4334 | ibm8514.curr_x--; |
| 4335 | if(ibm8514.curr_x < ibm8514.prev_x - s3.rect_width) |
4336 | 4336 | { |
4337 | | s3.curr_x = s3.prev_x; |
| 4337 | ibm8514.curr_x = ibm8514.prev_x; |
4338 | 4338 | s3.src_x = 0; |
4339 | 4339 | if(s3.current_cmd & 0x0080) |
4340 | 4340 | { |
4341 | | s3.curr_y++; |
4342 | | if(s3.curr_y > s3.prev_y + s3.rect_height) |
| 4341 | ibm8514.curr_y++; |
| 4342 | if(ibm8514.curr_y > ibm8514.prev_y + s3.rect_height) |
4343 | 4343 | { |
4344 | 4344 | ibm8514.state = IBM8514_IDLE; |
4345 | 4345 | ibm8514.gpbusy = false; |
r18195 | r18196 | |
4348 | 4348 | } |
4349 | 4349 | else |
4350 | 4350 | { |
4351 | | s3.curr_y--; |
4352 | | if(s3.curr_y < s3.prev_y - s3.rect_height) |
| 4351 | ibm8514.curr_y--; |
| 4352 | if(ibm8514.curr_y < ibm8514.prev_y - s3.rect_height) |
4353 | 4353 | { |
4354 | 4354 | ibm8514.state = IBM8514_IDLE; |
4355 | 4355 | ibm8514.gpbusy = false; |
r18195 | r18196 | |
4371 | 4371 | if(s3.current_cmd & 0x0020) |
4372 | 4372 | { |
4373 | 4373 | off++; |
4374 | | s3.curr_x++; |
4375 | | if(s3.curr_x > s3.prev_x + s3.rect_width) |
| 4374 | ibm8514.curr_x++; |
| 4375 | if(ibm8514.curr_x > ibm8514.prev_x + s3.rect_width) |
4376 | 4376 | { |
4377 | | s3.curr_x = s3.prev_x; |
| 4377 | ibm8514.curr_x = ibm8514.prev_x; |
4378 | 4378 | s3.src_x = 0; |
4379 | 4379 | if(s3.current_cmd & 0x0080) |
4380 | 4380 | { |
4381 | | s3.curr_y++; |
4382 | | if(s3.curr_y > s3.prev_y + s3.rect_height) |
| 4381 | ibm8514.curr_y++; |
| 4382 | if(ibm8514.curr_y > ibm8514.prev_y + s3.rect_height) |
4383 | 4383 | { |
4384 | 4384 | ibm8514.state = IBM8514_IDLE; |
4385 | 4385 | ibm8514.gpbusy = false; |
r18195 | r18196 | |
4388 | 4388 | } |
4389 | 4389 | else |
4390 | 4390 | { |
4391 | | s3.curr_y--; |
4392 | | if(s3.curr_y < s3.prev_y - s3.rect_height) |
| 4391 | ibm8514.curr_y--; |
| 4392 | if(ibm8514.curr_y < ibm8514.prev_y - s3.rect_height) |
4393 | 4393 | { |
4394 | 4394 | ibm8514.state = IBM8514_IDLE; |
4395 | 4395 | ibm8514.gpbusy = false; |
r18195 | r18196 | |
4402 | 4402 | else |
4403 | 4403 | { |
4404 | 4404 | off--; |
4405 | | s3.curr_x--; |
4406 | | if(s3.curr_x < s3.prev_x - s3.rect_width) |
| 4405 | ibm8514.curr_x--; |
| 4406 | if(ibm8514.curr_x < ibm8514.prev_x - s3.rect_width) |
4407 | 4407 | { |
4408 | | s3.curr_x = s3.prev_x; |
| 4408 | ibm8514.curr_x = ibm8514.prev_x; |
4409 | 4409 | s3.src_x = 0; |
4410 | 4410 | if(s3.current_cmd & 0x0080) |
4411 | 4411 | { |
4412 | | s3.curr_y++; |
4413 | | if(s3.curr_y > s3.prev_y + s3.rect_height) |
| 4412 | ibm8514.curr_y++; |
| 4413 | if(ibm8514.curr_y > ibm8514.prev_y + s3.rect_height) |
4414 | 4414 | { |
4415 | 4415 | ibm8514.state = IBM8514_IDLE; |
4416 | 4416 | ibm8514.gpbusy = false; |
r18195 | r18196 | |
4419 | 4419 | } |
4420 | 4420 | else |
4421 | 4421 | { |
4422 | | s3.curr_y--; |
4423 | | if(s3.curr_y < s3.prev_y - s3.rect_height) |
| 4422 | ibm8514.curr_y--; |
| 4423 | if(ibm8514.curr_y < ibm8514.prev_y - s3.rect_height) |
4424 | 4424 | { |
4425 | 4425 | ibm8514.state = IBM8514_IDLE; |
4426 | 4426 | ibm8514.gpbusy = false; |
r18195 | r18196 | |
4589 | 4589 | { |
4590 | 4590 | case 0x8100: |
4591 | 4591 | case 0x82e8: |
4592 | | s3.curr_y = (s3.curr_y & 0xff00) | data; |
4593 | | s3.prev_y = (s3.prev_y & 0xff00) | data; |
| 4592 | ibm8514.curr_y = (ibm8514.curr_y & 0xff00) | data; |
| 4593 | ibm8514.prev_y = (ibm8514.prev_y & 0xff00) | data; |
4594 | 4594 | break; |
4595 | 4595 | case 0x8101: |
4596 | 4596 | case 0x82e9: |
4597 | | s3.curr_y = (s3.curr_y & 0x00ff) | (data << 8); |
4598 | | s3.prev_y = (s3.prev_y & 0x00ff) | (data << 8); |
| 4597 | ibm8514.curr_y = (ibm8514.curr_y & 0x00ff) | (data << 8); |
| 4598 | ibm8514.prev_y = (ibm8514.prev_y & 0x00ff) | (data << 8); |
4599 | 4599 | break; |
4600 | 4600 | case 0x8102: |
4601 | 4601 | case 0x86e8: |
4602 | | s3.curr_x = (s3.curr_x & 0xff00) | data; |
4603 | | s3.prev_x = (s3.prev_x & 0xff00) | data; |
| 4602 | ibm8514.curr_x = (ibm8514.curr_x & 0xff00) | data; |
| 4603 | ibm8514.prev_x = (ibm8514.prev_x & 0xff00) | data; |
4604 | 4604 | break; |
4605 | 4605 | case 0x8103: |
4606 | 4606 | case 0x86e9: |
4607 | | s3.curr_x = (s3.curr_x & 0x00ff) | (data << 8); |
4608 | | s3.prev_x = (s3.prev_x & 0x00ff) | (data << 8); |
| 4607 | ibm8514.curr_x = (ibm8514.curr_x & 0x00ff) | (data << 8); |
| 4608 | ibm8514.prev_x = (ibm8514.prev_x & 0x00ff) | (data << 8); |
4609 | 4609 | break; |
4610 | 4610 | case 0x8108: |
4611 | 4611 | case 0x8ae8: |
4612 | | s3.line_axial_step = (s3.line_axial_step & 0xff00) | data; |
4613 | | s3.dest_y = (s3.dest_y & 0xff00) | data; |
| 4612 | ibm8514.line_axial_step = (ibm8514.line_axial_step & 0xff00) | data; |
| 4613 | ibm8514.dest_y = (ibm8514.dest_y & 0xff00) | data; |
4614 | 4614 | break; |
4615 | 4615 | case 0x8109: |
4616 | 4616 | case 0x8ae9: |
4617 | | s3.line_axial_step = (s3.line_axial_step & 0x00ff) | ((data & 0x3f) << 8); |
4618 | | s3.dest_y = (s3.dest_y & 0x00ff) | (data << 8); |
| 4617 | ibm8514.line_axial_step = (ibm8514.line_axial_step & 0x00ff) | ((data & 0x3f) << 8); |
| 4618 | ibm8514.dest_y = (ibm8514.dest_y & 0x00ff) | (data << 8); |
4619 | 4619 | break; |
4620 | 4620 | case 0x810a: |
4621 | 4621 | case 0x8ee8: |
4622 | | s3.line_diagonal_step = (s3.line_diagonal_step & 0xff00) | data; |
4623 | | s3.dest_x = (s3.dest_x & 0xff00) | data; |
| 4622 | ibm8514.line_diagonal_step = (ibm8514.line_diagonal_step & 0xff00) | data; |
| 4623 | ibm8514.dest_x = (ibm8514.dest_x & 0xff00) | data; |
4624 | 4624 | break; |
4625 | 4625 | case 0x810b: |
4626 | 4626 | case 0x8ee9: |
4627 | | s3.line_diagonal_step = (s3.line_diagonal_step & 0x00ff) | ((data & 0x3f) << 8); |
4628 | | s3.dest_x = (s3.dest_x & 0x00ff) | (data << 8); |
| 4627 | ibm8514.line_diagonal_step = (ibm8514.line_diagonal_step & 0x00ff) | ((data & 0x3f) << 8); |
| 4628 | ibm8514.dest_x = (ibm8514.dest_x & 0x00ff) | (data << 8); |
4629 | 4629 | break; |
4630 | 4630 | case 0x8118: |
4631 | 4631 | case 0x9ae8: |
r18195 | r18196 | |
5280 | 5280 | switch(ati.linedraw) |
5281 | 5281 | { |
5282 | 5282 | case 0: // Set current X |
5283 | | s3.curr_x = data; |
| 5283 | ibm8514.curr_x = data; |
5284 | 5284 | ati.linedraw++; |
5285 | 5285 | break; |
5286 | 5286 | case 1: // Set current Y |
5287 | | s3.curr_y = data; |
| 5287 | ibm8514.curr_y = data; |
5288 | 5288 | ati.linedraw++; |
5289 | 5289 | break; |
5290 | 5290 | case 2: // Line end X |
5291 | | s3.curr_x = data; |
| 5291 | ibm8514.curr_x = data; |
5292 | 5292 | ati.linedraw++; |
5293 | 5293 | break; |
5294 | 5294 | case 3: // Line end Y |
5295 | | s3.curr_y = data; |
| 5295 | ibm8514.curr_y = data; |
5296 | 5296 | ati.linedraw = 2; |
5297 | 5297 | break; |
5298 | 5298 | case 4: // Set current X |
5299 | | s3.curr_x = data; |
| 5299 | ibm8514.curr_x = data; |
5300 | 5300 | ati.linedraw++; |
5301 | 5301 | break; |
5302 | 5302 | case 5: // Set current Y |
5303 | | s3.curr_y = data; |
| 5303 | ibm8514.curr_y = data; |
5304 | 5304 | ati.linedraw = 4; |
5305 | 5305 | break; |
5306 | 5306 | } |