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 | } |