ScriptedAmigaEmulator/sae/playfield.js
Rupert Hausberger ea1d34267e update 0.9.0
2016-07-30 01:31:36 +02:00

20037 lines
600 KiB
JavaScript

/*-------------------------------------------------------------------------
| SAE - Scripted Amiga Emulator
| https://github.com/naTmeg/ScriptedAmigaEmulator
|
| Copyright (C) 2012-2016 Rupert Hausberger
|
| This program is free software; you can redistribute it and/or
| modify it under the terms of the GNU General Public License
| as published by the Free Software Foundation; either version 2
| of the License, or (at your option) any later version.
|
| This program is distributed in the hope that it will be useful,
| but WITHOUT ANY WARRANTY; without even the implied warranty of
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
| GNU General Public License for more details.
|
| Note: ported from WinUAE 3.2.x
-------------------------------------------------------------------------*/
/* global constants */
var SAEC_Playfield_CLOCK_PAL = 3546895;
var SAEC_Playfield_CLOCK_NTSC = 3579545;
/*---------------------------------*/
/* global variables */
var SAEV_Playfield_fake_vblank_hz = 0.0;
var SAEV_Playfield_frame_rendered = false;
var SAEV_Playfield_frame_shown = false;
var SAEV_Playfield_picasso_requested_on = false;
var SAEV_Playfield_picasso_on = false;
/*---------------------------------*/
/* global references */
var SAER_Playfield_gfxvidinfo = null;
var SAER_Playfield_isvsync_chipset = null;
var SAER_Playfield_isvsync = null;
var SAER_Playfield_init_row_map = null;
/*---------------------------------*/
function SAEF_Playfield_getvsyncrate(hz, result) { //double getvsyncrate(double hz, int *mult)
if (hz < 0) {
result.mult = 0;
result.hz = 0;
}
else if (hz > 85) {
result.mult = -1;
result.hz = hz / 2;
}
else if (hz < 35 && hz > 0) {
var ap = SAEV_config.video.apmode[SAEV_Playfield_picasso_on ? 1 : 0];
result.mult = ap.gfx_interlaced ? 0 : 1;
result.hz = hz * 2;
} else {
result.mult = 0;
result.hz = hz;
}
}
/*---------------------------------*/
function SAEO_Playfield() {
/* SECT drawing defs */
const SMART_UPDATE = true; //OPT
const SPEEDUP = true;
const MAX_SPRITES = 8;
//#ifdef AGA
const MAX_PLANES = 8;
/*#else
const MAX_PLANES = 6;
#endif*/
/* 100 words give you 1600 horizontal pixels. Should be more than enough for
* superhires. Don't forget to update the definition in genp2c.c as well.
* needs to be larger for superhires support */
const MAX_WORDS_PER_LINE = 100;
/* maximums for statically allocated tables */
/*#ifdef UAE_MINI
const MAXHPOS = 227; //absolute minimums for basic A500/A1200-emulation
const MAXVPOS = 312;
#else*/
const MAXHPOS = 256;
const MAXVPOS = 592;
//#endif
//-->SAEC_Config_Video_HResolution_LoRes const RES_LORES = 0;
//-->SAEC_Config_Video_HResolution_HiRes const RES_HIRES = 1;
//-->SAEC_Config_Video_HResolution_SuperHiRes const RES_SUPERHIRES = 2;
const RES_MAX = 2;
//-->SAEC_Config_Video_VResolution_NonDouble const VRES_NONDOUBLE = 0;
//-->SAEC_Config_Video_VResolution_Double const VRES_DOUBLE = 1;
const VRES_QUAD = 2;
const VRES_MAX = 1;
/*const NEWHSYNC = 0;
#ifdef NEWHSYNC
const DIW_DDF_OFFSET = 9;
const HBLANK_OFFSET = 13;
const DISPLAY_LEFT_SHIFT = 0x40;
#else*/
/* According to the HRM, pixel data spends a couple of cycles somewhere in the chips before it appears on-screen. (TW: display emulation now does this automatically) */
const DIW_DDF_OFFSET = 1;
/* this many cycles starting from hpos=0 are visible on right border */
const HBLANK_OFFSET = 9;
/* We ignore that many lores pixels at the start of the display. These are invisible anyway due to hardware DDF limits. */
const DISPLAY_LEFT_SHIFT = 0x38;
//#endif
//enum diw_states
const DIW_WAITING_START = 0;
const DIW_WAITING_STOP = 1;
function PIXEL_XPOS(HPOS) { return ((HPOS * 2 - DISPLAY_LEFT_SHIFT + DIW_DDF_OFFSET - 1) << lores_shift); }
const min_diwlastword = 0;
function max_diwlastword() { return PIXEL_XPOS(0x1d4 >> 1); } //ATT
function coord_hw_to_window_x(x) {
x -= DISPLAY_LEFT_SHIFT;
return x << lores_shift;
}
function coord_window_to_hw_x(x) {
x >>= lores_shift;
return x + DISPLAY_LEFT_SHIFT;
}
function coord_diw_to_window_x(x) {
return (x - DISPLAY_LEFT_SHIFT + DIW_DDF_OFFSET - 1) << lores_shift;
}
function coord_window_to_diw_x(x) {
x = coord_window_to_hw_x(x);
return x - DIW_DDF_OFFSET;
}
/* color values in two formats: 12 (OCS/ECS) or 24 (AGA) bit Amiga RGB (color_regs),
* and the native color value; both for each Amiga hardware color register.
* !!! See color_reg_xxx functions below before touching !!! */
const CE_BORDERBLANK = 0;
const CE_BORDERNTRANS = 1;
const CE_BORDERSPRITE = 2;
const CE_SHRES_DELAY = 4;
function ce_is_borderblank(data) {
return (data & (1 << CE_BORDERBLANK)) != 0;
}
function ce_is_bordersprite(data) {
return (data & (1 << CE_BORDERSPRITE)) != 0;
}
function ce_is_borderntrans(data) {
return (data & (1 << CE_BORDERNTRANS)) != 0;
}
function color_entry() {
this.color_regs_ecs = new Uint16Array(32); //u16
/*#ifndef AGA
this.acolors = new Uint32Array(32); //u32
#else*/
this.acolors = new Uint32Array(256); //u32
this.color_regs_aga = new Uint32Array(256); //u32
//#endif
this.extra = 0; //u8
};
/* convert 24 bit AGA Amiga RGB to native color, warning: this is still ugly, but now works with either byte order */
/*#ifdef AGA
#ifdef WORDS_BIGENDIAN
#define CONVERT_RGB(c) ( xbluecolors[((uae_u8*)(&c))[3]] | xgreencolors[((uae_u8*)(&c))[2]] | xredcolors[((uae_u8*)(&c))[1]] )
#else
#define CONVERT_RGB(c) ( xbluecolors[((uae_u8*)(&c))[0]] | xgreencolors[((uae_u8*)(&c))[1]] | xredcolors[((uae_u8*)(&c))[2]] )
#endif
#else
#define CONVERT_RGB(c) 0
#endif*/
function CONVERT_RGB(c) {
if (SAEC_LITTLE_ENDIAN)
return (xbluecolors[c & 0xff] | xgreencolors[(c >>> 8) & 0xff] | xredcolors[(c >>> 16) & 0xff]) >>> 0;
else
return (xbluecolors[(c >>> 24) & 0xff] | xgreencolors[(c >>> 16) & 0xff] | xredcolors[(c >>> 8) & 0xff]) >>> 0;
}
function getxcolor(c) {
//#ifdef AGA
if (direct_rgb)
return CONVERT_RGB(c);
else
//#endif
return xcolors[c];
}
/* functions for reading, writing, copying and comparing struct color_entry */
function color_reg_get(ce, c) {
//#ifdef AGA
if (aga_mode)
return ce.color_regs_aga[c];
else
//#endif
return ce.color_regs_ecs[c];
}
function color_reg_set(ce, c, v) {
//#ifdef AGA
if (aga_mode)
ce.color_regs_aga[c] = v;
else
//#endif
ce.color_regs_ecs[c] = v;
}
function color_reg_cmp(ce1, ce2) {
//#ifdef AGA
if (aga_mode) {
for (var i = 0; i < 256; i++) {
if (ce1.color_regs_aga[i] != ce2.color_regs_aga[i]) return 1;
}
} else {
//#endif
for (var i = 0; i < 32; i++) {
if (ce1.color_regs_ecs[i] != ce2.color_regs_ecs[i]) return 1;
}
}
return (ce1.extra == ce2.extra) ? 0 : 1;
}
/* ugly copy hack, is there better solution? */
function color_reg_cpy(dst, src) {
//#ifdef AGA
if (aga_mode) {
/* copy acolors and color_regs_aga */
for (var i = 0; i < 256; i++) {
dst.acolors[i] = src.acolors[i];
dst.color_regs_aga[i] = src.color_regs_aga[i];
}
} else {
//#endif
/* copy first 32 acolors and color_regs_ecs */
for (var i = 0; i < 32; i++) {
dst.color_regs_ecs[i] = src.color_regs_ecs[i];
dst.acolors[i] = src.acolors[i];
}
}
dst.extra = src.extra;
}
/*
* The idea behind this code is that at some point during each horizontal
* line, we decide how to draw this line. There are many more-or-less
* independent decisions, each of which can be taken at a different horizontal
* position.
* Sprites and color changes are handled specially: There isn"t a single decision,
* but a list of structures containing information on how to draw the line.
*/
const COLOR_CHANGE_BRDBLANK = 0x80000000;
const COLOR_CHANGE_SHRES_DELAY = 0x40000000;
function color_change() {
this.linepos = 0; //int
this.regno = 0; //int
this.value = 0; //uint
};
function cpy_color_change(d, s) { //OWN
d.linepos = s.linepos;
d.regno = s.regno;
d.value = s.value;
}
function cmp_color_change(cc1, cc2) { //OWN
return cc1.linepos == cc2.linepos && cc1.regno == cc2.regno && cc1.value == cc2.value ? 0 : 1;
}
/* 440 rather than 880, since sprites are always lores. */
/*#ifdef UAE_MINI
const MAX_PIXELS_PER_LINE = 880;
#else*/
const MAX_PIXELS_PER_LINE = 1760;
//#endif
/* No divisors for MAX_PIXELS_PER_LINE; we support AGA and SHRES sprites */
const MAX_SPR_PIXELS = ((MAXVPOS + 1) * 2 + 1) * MAX_PIXELS_PER_LINE;
function sprite_entry() {
this.pos = 0; //ushort
this.max = 0; //ushort
this.first_pixel = 0; //uint
this.has_attached = false; //bool
};
/*union sps_union {
uae_u8 bytes[2 * MAX_SPR_PIXELS];
uae_u32 words[2 * MAX_SPR_PIXELS / 4];
};*/
function sps_union() {
this.bytes = new Uint8Array(2 * MAX_SPR_PIXELS); //u8
};
/* Way too much... */
const MAX_REG_CHANGE = (MAXVPOS + 1) * 2 * MAXHPOS;
/* struct decision contains things we save across drawing frames for comparison (smart update stuff). */
function decision() {
this.plfleft = 0; this.plfright = 0; this.plflinelen = 0; //int /* Records the leftmost access of BPL1DAT. */
this.diwfirstword = 0; this.diwlastword = 0; //int /* Display window: native coordinates, depend on lores state. */
this.ctable = 0; //int
this.bplcon0 = 0; this.bplcon2 = 0; //u16
//#ifdef AGA
this.bplcon3 = 0; this.bplcon4 = 0; //u16
//#endif
this.nr_planes = 0; //u8
this.bplres = 0; //u8
this.ehb_seen = false; //bool
this.ham_seen = false; //bool
this.ham_at_start = false; //bool
this.bordersprite_seen = false; //bool
this.clr = function() {
this.plfleft = 0;
this.plfright = 0;
this.plflinelen = 0;
this.diwfirstword = 0;
this.diwlastword = 0;
this.ctable = 0;
this.bplcon0 = 0;
this.bplcon2 = 0;
//#ifdef AGA
this.bplcon3 = 0;
this.bplcon4 = 0;
//#endif
this.nr_planes = 0;
this.bplres = 0;
this.ehb_seen = false;
this.ham_seen = false;
this.ham_at_start = false;
this.bordersprite_seen = false;
}
};
function cpy_decision(d, s) { //OWN
d.plfleft = s.plfleft;
d.plfright = s.plfright;
d.plflinelen = s.plflinelen;
d.diwfirstword = s.diwfirstword;
d.diwlastword = s.diwlastword;
d.ctable = s.ctable;
d.bplcon0 = s.bplcon0;
d.bplcon2 = s.bplcon2;
//#ifdef AGA
d.bplcon3 = s.bplcon3;
d.bplcon4 = s.bplcon4;
//#endif
d.nr_planes = s.nr_planes;
d.bplres = s.bplres;
d.ehb_seen = s.ehb_seen;
d.ham_seen = s.ham_seen;
d.ham_at_start = s.ham_at_start;
d.bordersprite_seen = s.bordersprite_seen;
};
/* Anything related to changes in hw registers during the DDF for one line. */
function draw_info() {
this.first_sprite_entry = 0; //all int
this.last_sprite_entry = 0;
this.first_color_change = 0;
this.last_color_change = 0;
this.nr_color_changes = 0;
this.nr_sprites = 0;
this.clr = function() {
this.first_sprite_entry = 0;
this.last_sprite_entry = 0;
this.first_color_change = 0;
this.last_color_change = 0;
this.nr_color_changes = 0;
this.nr_sprites = 0;
}
};
/* Determine how to draw a scan line. */
//enum nln_how
const nln_normal = 0; /* All lines on a non-doubled display. */
const nln_doubled = 1; /* Non-interlace, doubled display. */
const nln_upper = 2; /* Interlace, doubled display, upper line. */
const nln_lower = 3; /* Interlace, doubled display, lower line. */
const nln_nblack = 4; /* This line normal, next one black. */
const nln_upper_black = 5;
const nln_lower_black = 6;
const nln_upper_black_always = 7;
const nln_lower_black_always = 8;
const IHF_SCROLLLOCK = 0;
const IHF_QUIT_PROGRAM = 1;
const IHF_PICASSO = 2;
function set_inhibit_frame(bit) {
inhibit_frame |= 1 << bit;
}
function clear_inhibit_frame(bit) {
inhibit_frame &= ~(1 << bit);
}
function toggle_inhibit_frame(bit) {
inhibit_frame ^= 1 << bit;
}
/* drawing defs */
/*-----------------------------------------------------------------------*/
/*-----------------------------------------------------------------------*/
/*-----------------------------------------------------------------------*/
/* SECT drawing code */
/* There are a couple of concepts of "coordinates" in this file.
- DIW coordinates
- DDF coordinates (essentially cycles, resolution lower than lores by a factor of 2)
- Pixel coordinates
* in the Amiga"s resolution as determined by BPLCON0 ("Amiga coordinates")
* in the window resolution as determined by the preferences ("window coordinates").
* in the window resolution, and with the origin being the topmost left corner of
the window ("native coordinates")
One note about window coordinates. The visible area depends on the width of the
window, and the centering code. The first visible horizontal window coordinate is
often _not_ 0, but the value of VISIBLE_LEFT_BORDER instead.
One important thing to remember: DIW coordinates are in the lowest possible
resolution.
To prevent extremely bad things (think pixels cut in half by window borders) from
happening, all ports should restrict window widths to be multiples of 16 pixels. */
const BG_COLOR_DEBUG = 0;
var lores_factor = 0; //int
var lores_shift = 0; //global int
function lores_set(lores) {
var old = lores;
lores_shift = lores;
if (lores_shift != old)
pfield_set_linetoscr();
}
function lores_reset() {
lores_factor = SAEV_config.video.hresolution ? 2 : 1;
lores_set(SAEV_config.video.hresolution);
if (doublescan > 0) {
if (lores_shift < 2)
lores_shift++;
lores_factor = 2;
lores_set(lores_shift);
}
sprite_buffer_res = SAEV_config.video.hresolution;
if (doublescan > 0 && sprite_buffer_res < SAEC_Config_Video_HResolution_SuperHiRes)
sprite_buffer_res++;
}
var aga_mode = false; //global bool /* mirror of chipset_mask & SAEC_Config_Chipset_Mask_AGA */
var direct_rgb = false; //global bool
/* The shift factor to apply when converting between Amiga coordinates and window
coordinates. Zero if the resolution is the same, positive if window coordinates
have a higher resolution (i.e. we"re stretching the image), negative if window
coordinates have a lower resolution (i.e. we"re shrinking the image). */
var res_shift = 0; //int
var linedbl = 0, linedbld = 0; //int
var interlace_seen = 0; //int
const AUTO_LORES_FRAMES = 10;
var can_use_lores = 0, frame_res = 0, frame_res_lace = 0; //int
var resolution_count = new Int32Array(RES_MAX + 1); //int
var lines_count = 0; //int
var center_reset = false; //bool
var need_genlock_data = false; //bool
var init_genlock_data = false; //bool
/* Lookup tables for dual playfields. The dblpf_*1 versions are for the case
that playfield 1 has the priority, dbplpf_*2 are used if playfield 2 has
priority. If we need an array for non-dual playfield mode, it has no number. */
/* The dbplpf_ms? arrays contain a shift value. plf_spritemask is initialized
to contain two 16 bit words, with the appropriate mask if pf1 is in the
foreground being at bit offset 0, the one used if pf2 is in front being at
offset 16. */
const dblpfofs = [0, 2, 4, 8, 16, 32, 64, 128]; //int
var dblpf_ms1 = null, dblpf_ms2 = null, dblpf_ms = null; //int [256]
var dblpf_ind1 = null, dblpf_ind2 = null; //int [256]
var dblpf_2nd1 = null, dblpf_2nd2 = null; //int [256]
//#ifdef AGA /* AGA mode color lookup tables */
var dblpf_ind1_aga = null, dblpf_ind2_aga = null; //int [256]
/*#else
var dblpf_ind1_aga = null, dblpf_ind2_aga = null; //int [1]
#endif*/
var sprite_offs = null; //int [256]
var clxtab = null; //u32 [256]
/* The graphics code has a choice whether it wants to use a large buffer
* for the whole display, or only a small buffer for a single line.
* If you use a large buffer:
* - set bufmem to point at it
* - set linemem to 0
* - if memcpy within bufmem would be very slow, i.e. because bufmem is
* in graphics card memory, also set emergmem to point to a buffer
* that is large enough to hold a single line.
* - implement flush_line to be a no-op.
* If you use a single line buffer:
* - set bufmem and emergmem to 0
* - set linemem to point at your buffer
* - implement flush_line to copy a single line to the screen
*/
function vidbuffer() {
/* Function implemented by graphics driver */
this.flush_line = function(gfxinfo, vb, line_no) {};
this.flush_block = function(gfxinfo, vb, first_line, last_line) {};
this.flush_screen = function(gfxinfo, vb, first_line, last_line) {};
this.flush_clear_screen = function(gfxinfo, vb) {};
this.lockscr = function(gfxinfo, vb) { return 1; };
this.unlockscr = function(gfxinfo, vb) {};
this.linemem = null; //u8 *
this.emergmem = null; //u8 *
this.bufmem = null; //u8 *
this.bufmem_pos = 0; //OWN
this.bufmemend = 0; //u8 *
this.bufmemend_pos = 0; //OWN
this.realbufmem = null; //u8 *
this.bufmem_allocated = null; //u8 *
this.bufmem_lockable = false; //bool
this.rowbytes = 0; //int /* Bytes per row in the memory pointed at by bufmem. */
this.pixbytes = 0; //int /* Bytes per pixel. */
this.width_allocated = 0; //int /* size of this buffer */
this.height_allocated = 0; //int
this.outwidth = 0; //int /* size of max visible image */
this.outheight = 0; //int
this.inwidth = 0; //int /* nominal size of image for centering */
this.inheight = 0; //int
this.inwidth2 = 0; //int /* same but doublescan multiplier included */
this.inheight2 = 0; //int
this.nativepositioning = false; //bool /* use drawbuffer instead */
this.tempbufferinuse = false; //bool /* tempbuffer in use */
this.extrawidth = 0; //int /* extra width, chipset hpos extra in right border */
this.xoffset = 0; //int /* superhires pixels from left edge */
this.yoffset = 0; //int /* lines from top edge */
this.inxoffset = 0; //int /* positive if sync positioning */
this.inyoffset = 0; //int
this.clr = function() {
this.linemem = null;
this.emergmem = null;
this.bufmem = null;
this.bufmem_pos = 0;
this.bufmemend = 0;
this.bufmemend_pos = 0;
this.realbufmem = null;
this.bufmem_allocated = null;
this.bufmem_lockable = false;
this.rowbytes = 0;
this.pixbytes = 0;
this.width_allocated = 0;
this.height_allocated = 0;
this.outwidth = 0;
this.outheight = 0;
this.inwidth = 0;
this.inheight = 0;
this.inwidth2 = 0;
this.inheight2 = 0;
this.nativepositioning = false;
this.tempbufferinuse = false;
this.extrawidth = 0;
this.xoffset = 0;
this.yoffset = 0;
this.inxoffset = 0;
this.inyoffset = 0;
}
};
/* Video buffer description structure. Filled in by the graphics system dependent code. */
function vidbuf_description() {
this.maxblocklines = 0; //int /* Set to 0 if you want calls to flush_line after each drawn line, or the number of lines that flush_block wants to/can handle (it isn"t really useful to use another value than maxline here). */
this.drawbuffer = new vidbuffer(); //struct vidbuffer
this.tempbuffer = new vidbuffer(); //struct vidbuffer /* output buffer when using A2024 emulation */
this.inbuffer = null; //struct vidbuffer *
this.outbuffer = null; //struct vidbuffer *
this.gfx_resolution_reserved = 0; //int
this.gfx_vresolution_reserved = 0; //int
this.xchange = 0; //int /* how many superhires pixels in one pixel in buffer */
this.ychange = 0; //int /* how many interlaced lines in one line in buffer */
};
var gfxvidinfo = new vidbuf_description(); //struct vidbuf_description
SAER_Playfield_gfxvidinfo = gfxvidinfo;
function spritepixelsbuf() {
this.attach = 0; //u8
this.stdata = 0; //u8
this.data = 0; //u16
this.clr = function() {
this.attach = 0;
this.stdata = 0;
this.data = 0;
}
};
var spritepixels_buffer = new Array(MAX_PIXELS_PER_LINE); //struct spritepixelsbuf [MAX_PIXELS_PER_LINE]
for (var vi = 0; vi < MAX_PIXELS_PER_LINE; vi++)
spritepixels_buffer[vi] = new spritepixelsbuf();
var spritepixels = null; //struct spritepixelsbuf *
var spritepixels_pos = 0; //OWN
var sprite_first_x = 0, sprite_last_x = 0; //int
/* OCS/ECS color lookup table */
//typedef uae_u32 xcolnr;
var xcolors = new Uint32Array(4096); //xcolnr
/* AGA mode color lookup tables */
var xredcolors = new Uint32Array(256); //global uint
var xgreencolors = new Uint32Array(256); //global uint
var xbluecolors = new Uint32Array(256); //global uint
var xredcolor_s = 0, xredcolor_b = 0, xredcolor_m = 0; //global int
var xgreencolor_s = 0, xgreencolor_b = 0, xgreencolor_m = 0; //global int
var xbluecolor_s = 0, xbluecolor_b = 0, xbluecolor_m = 0; //global int
var colors_for_drawing = new color_entry(); //global struct color_entry
var direct_colors_for_drawing = new color_entry(); //struct color_entry
var p_acolors = null; //xcolnr *
var p_xcolors = null; //xcolnr *
/* The size of these arrays is pretty arbitrary; it was chosen to be "more
than enough". The coordinates used for indexing into these arrays are
almost, but not quite, Amiga coordinates (there"s a constant offset). */
/*static union {
double uupzuq;
long int cruxmedo;
uae_u8 apixels[MAX_PIXELS_PER_LINE * 2];
uae_u16 apixels_w[MAX_PIXELS_PER_LINE * 2 / sizeof (uae_u16)];
uae_u32 apixels_l[MAX_PIXELS_PER_LINE * 2 / sizeof (uae_u32)];
} pixdata;*/
function pixdata_union() {
this.apixelsBuffer = new ArrayBuffer(MAX_PIXELS_PER_LINE * 2);
this.apixels = new Uint8Array(this.apixelsBuffer);
this.apixels_l = new Uint32Array(this.apixelsBuffer);
}
var pixdata = new pixdata_union();
var refresh_indicator_buffer = null; //u8 *
var refresh_indicator_changed = null, refresh_indicator_changed_prev = null; //u8 *
var refresh_indicator_height = 0; //int
var spixels = new Uint16Array(2 * MAX_SPR_PIXELS);
/* Eight bits for every pixel. */
var spixstate = new sps_union(); //global union sps_union
var ham_linebuf = new Uint32Array(MAX_PIXELS_PER_LINE * 2); //u32
var real_bplpt = new Array(8); //u8 *
var all_ones = new Uint8Array(MAX_PIXELS_PER_LINE); //u8
SAEF_memset(all_ones,0, 0xff, MAX_PIXELS_PER_LINE);
var all_zeros = new Uint8Array(MAX_PIXELS_PER_LINE); //u8
var xlinebuffer = null;//, xlinebuffer_genlock = null; //u8 *
var xlinebuffer_pos = 0; //OWN
var amiga2aspect_line_map = null, native2amiga_line_map = null; //int *
var max_drawn_amiga_line = 0; //int
var row_map = null; //u8 **
//var row_map_genlock = null; //global u8 **
//var row_map_genlock_buffer = null; //u8 *
var row_map_color_burst_buffer = null; //global u8 *
var row_tmp = new ArrayBuffer(MAX_PIXELS_PER_LINE * 32 / 8); //u8 []
/* line_draw_funcs: pfield_do_linetoscr, pfield_do_fill_line, decode_ham */
//typedef void (*line_draw_func)(int, int, bool);
var line_draw_func = function(a,b,c) {}; //func *
const LINE_UNDECIDED = 1;
const LINE_DECIDED = 2;
const LINE_DECIDED_DOUBLE = 3;
const LINE_AS_PREVIOUS = 4;
const LINE_BLACK = 5;
const LINE_REMEMBERED_AS_BLACK = 6;
const LINE_DONE = 7;
const LINE_DONE_AS_PREVIOUS = 8;
const LINE_REMEMBERED_AS_PREVIOUS = 9;
const LINESTATE_SIZE = (MAXVPOS + 2) * 2 + 1;
var linestate = new Uint8Array(LINESTATE_SIZE); //u8
const MAX_WORDS_PER_LINE_FULL = MAX_WORDS_PER_LINE * 2 >> 2; //OWN
var line_data = new Array((MAXVPOS + 2) * 2); //u8 [(MAXVPOS + 2) * 2][MAX_PLANES * MAX_WORDS_PER_LINE * 2]
for (var vi = 0; vi < line_data.length; vi++)
line_data[vi] = new Uint32Array(MAX_PLANES * MAX_WORDS_PER_LINE_FULL); //u8
/* Centering variables. */
var min_diwstart = 0, max_diwstop = 0; //int
/* The visible window: VISIBLE_LEFT_BORDER contains the left border of the visible area, VISIBLE_RIGHT_BORDER the right border. These are in window coordinates. */
var visible_left_border = 0, visible_right_border = 0; //global int
/* Pixels outside of visible_start and visible_stop are always black */
var visible_left_start = 0, visible_right_stop = 0; //int
var visible_top_start = 0, visible_bottom_stop = 0; //int
/* same for hblank */
var hblank_left_start = 0, hblank_right_stop = 0; //int
var linetoscr_x_adjust_pixbytes = 0, linetoscr_x_adjust_pixels = 0; //int
var thisframe_y_adjust = 0; //int
var thisframe_y_adjust_real = 0, max_ypos_thisframe = 0, min_ypos_for_screen = 0; //int
var thisframe_first_drawn_line = 0, thisframe_last_drawn_line = 0; //global int
/* A frame counter that forces a redraw after at least one skipped frame in interlace mode. */
var last_redraw_point = 0; //int
const MAX_STOP = 30000;
var first_drawn_line = 0, last_drawn_line = 0; //int
//var first_block_line = 0, last_block_line = 0; //int, OWN flush_block() is not used
const NO_BLOCK = -3;
/* These are generated by the drawing code from the line_decisions array for
each line that needs to be drawn. These are basically extracted out of
bit fields in the hardware registers. */
var bplehb = false, bplham = false, bpldualpf = false, bpldualpfpri = false, bpldualpf2of = 0, bplplanecnt = 0, ecsshres = false; //int
var bplbypass = false, bplcolorburst = false, bplcolorburst_field = false; //int
var issprites = false; //bool
var bplres = 0; //int
var plf1pri = 0, plf2pri = 0, bplxor = 0, bpland = 0, bpldelay_sh = 0; //int
var plf_sprite_mask = 0; //u32
var sbasecol = [16, 16]; //int
var hposblank = 0; //int
var specialmonitoron = false; //bool
var ecs_genlock_features_active = false; //bool
var ecs_genlock_features_mask = 0; //u8
var ecs_genlock_features_colorkey = false; //bool
//var picasso_requested_on = false; --> SAEV_Playfield_picasso_requested_on
//var picasso_on = false; -> SAEV_Playfield_picasso_on
var inhibit_frame = 0; //global int
var framecnt = 0; //global int
var custom_frame_redraw_necessary = 0; //global int
var frame_redraw_necessary = 0; //int
var picasso_redraw_necessary = 0; //int
var warned_pfield_draw_line = 0; //OWN
/*-----------------------------------------------------------------------*/
var gamma = new Array(256 * 3); //u32 [256 * 3][3]
for (var vi = 0; vi < 256 * 3; vi++)
gamma[vi] = new Uint32Array(3);
var blur_lf = 0, blur_hf = 0; //int
/*extern uae_s32 tyhrgb[65536];
extern uae_s32 tylrgb[65536];
extern uae_s32 tcbrgb[65536];
extern uae_s32 tcrrgb[65536];
extern uae_u32 redc[3 * 256], grec[3 * 256], bluc[3 * 256];*/
function bits_in_mask(mask) {
var n = 0;
while (mask) {
n += mask & 1;
mask >>>= 1;
}
return n;
}
function mask_shift(mask) {
var n = 0;
if (!mask)
return 0;
while (!(mask & 1)) {
n++;
mask >>>= 1;
}
return n;
}
function doMask(p, bits, shift) {
if (bits == 0) return 0;
/* scale to 0..255, shift to align msb with mask, and apply mask */
//if (flashscreen) p ^= 0xff;
var val = p << 24;
val >>>= (32 - bits);
val <<= shift;
return val >>> 0;
}
/*function doMask256(p, bits, shift) {
if (bits == 0) return 0;
* p is a value from 0 to 255 (Amiga color value)
* shift to align msb with mask, and apply mask
var val = p * 0x01010101 >>> 0;
val >>= (32 - bits);
val <<= shift;
return val;
}*/
function doColor(i, bits, shift) {
//if (flashscreen) i = (i ^ 0xffffffff) >>> 0;
if (bits >= 8)
return (i << shift) >>> 0;
else
return ((i >> (8 - bits)) << shift) >>> 0;
}
function doAlpha(alpha, bits, shift) {
return ((alpha & ((1 << bits) - 1)) << shift) >>> 0;
}
function calc_gamma(value, gamma, bri, con) { //video_gamma() all float
value += bri;
value *= con;
if (value <= 0.0)
return 0.0;
var factor = Math.pow(255.0, 1.0 - gamma); //double
var ret = factor * Math.pow(value, gamma); //float
if (ret < 0.0)
ret = 0.0;
return ret;
}
function calc_gammatable() { //video_calc_gammatable()
var bri = SAEV_config.video.luminance * (128 / 1000);
var con = (SAEV_config.video.contrast + 1000) / 1000;
var gam = (1000 - SAEV_config.video.gamma) / 1000;
var gams = new Array(3);
gams[0] = gam + (1000 - SAEV_config.video.gammaCh[0]) / 1000;
gams[1] = gam + (1000 - SAEV_config.video.gammaCh[1]) / 1000;
gams[2] = gam + (1000 - SAEV_config.video.gammaCh[2]) / 1000;
blur_lf = Math.floor(64 * SAEV_config.video.gf[SAEV_Playfield_picasso_on ? 1 : 0].gfx_filter_blur / 1000);
//blur_lf = 0;
blur_hf = 256 - blur_lf * 2;
for (var i = 0; i < (256 * 3); i++) {
for (var j = 0; j < 3; j++) {
var v = calc_gamma(i - 256, gams[j], bri, con);
//var vi = Math.floor(v);
var vi = v >>> 0;
if (SAEV_config.video.luminance == 0 && SAEV_config.video.contrast == 0 && SAEV_config.video.gamma == 0)
vi = i & 0xff;
//if (currprefs.gfx_threebitcolors) vi *= 2;
if (vi > 255)
vi = 255;
gamma[i][j] = vi;
//SAEF_log("video.calc_gammatable() %03x : %08x (%f)", i, vi, v);
}
}
}
/*static uae_u32 limit256 (double v) {
v = v * (double)(SAEV_config.video.gf[SAEV_Playfield_picasso_on ? 1 : 0].gfx_filter_contrast + 1000) / 1000.0 + SAEV_config.video.gf[SAEV_Playfield_picasso_on ? 1 : 0].gfx_filter_luminance / 10.0;
if (v < 0)
v = 0;
if (v > 255)
v = 255;
return ((uae_u32)v) & 0xff;
}
static uae_u32 limit256rb (double v) {
v *= (double)(SAEV_config.video.gf[SAEV_Playfield_picasso_on ? 1 : 0].gfx_filter_saturation + 1000) / 1000.0;
if (v < -128)
v = -128;
if (v > 127)
v = 127;
return ((uae_u32)v) & 0xff;
}
static double get_y (int r, int g, int b) {
return 0.2989f * r + 0.5866f * g + 0.1145f * b;
}
static uae_u32 get_yh (int r, int g, int b) {
return limit256(get_y (r, g, b) * blur_hf / 256);
}
static uae_u32 get_yl (int r, int g, int b) {
return limit256(get_y (r, g, b) * blur_lf / 256);
}
static uae_u32 get_cb (int r, int g, int b) {
return limit256rb(-0.168736f * r - 0.331264f * g + 0.5f * b);
}
static uae_u32 get_cr (int r, int g, int b) {
return limit256rb(0.5f * r - 0.418688f * g - 0.081312f * b);
}*/
function lowbits(v, shift, lsize) {
return ((v >>> shift) & ((1 << lsize) - 1)) >>> 0;
}
/*void alloc_colors_picasso (int rw, int gw, int bw, int rs, int gs, int bs, int rgbfmt) {
#ifdef PICASSO96
int byte_swap = 0;
int i;
int red_bits = 0, green_bits, blue_bits;
int red_shift, green_shift, blue_shift;
int bpp = rw + gw + bw;
switch (rgbfmt)
{
case RGBFB_R5G6B5PC:
red_bits = 5;
green_bits = 6;
blue_bits = 5;
red_shift = 11;
green_shift = 5;
blue_shift = 0;
break;
case RGBFB_R5G5B5PC:
red_bits = green_bits = blue_bits = 5;
red_shift = 10;
green_shift = 5;
blue_shift = 0;
break;
case RGBFB_R5G6B5:
red_bits = 5;
green_bits = 6;
blue_bits = 5;
red_shift = 11;
green_shift = 5;
blue_shift = 0;
byte_swap = 1;
break;
case RGBFB_R5G5B5:
red_bits = green_bits = blue_bits = 5;
red_shift = 10;
green_shift = 5;
blue_shift = 0;
byte_swap = 1;
break;
case RGBFB_B5G6R5PC:
red_bits = 5;
green_bits = 6;
blue_bits = 5;
red_shift = 0;
green_shift = 5;
blue_shift = 11;
break;
case RGBFB_B5G5R5PC:
red_bits = green_bits = blue_bits = 5;
red_shift = 0;
green_shift = 5;
blue_shift = 10;
break;
default:
red_bits = rw;
green_bits = gw;
blue_bits = bw;
red_shift = rs;
green_shift = gs;
blue_shift = bs;
break;
}
#ifdef WORDS_BIGENDIAN
byte_swap = !byte_swap;
#endif
memset (p96_rgbx16, 0, sizeof p96_rgbx16);
if (red_bits) {
int lrbits = 8 - red_bits;
int lgbits = 8 - green_bits;
int lbbits = 8 - blue_bits;
int lrmask = (1 << red_bits) - 1;
int lgmask = (1 << green_bits) - 1;
int lbmask = (1 << blue_bits) - 1;
for (i = 65535; i >= 0; i--) {
uae_u32 r, g, b, c;
uae_u32 j = byte_swap ? bswap_16 (i) : i;
r = (((j >> red_shift) & lrmask) << lrbits) | lowbits (j, red_shift, lrbits);
g = (((j >> green_shift) & lgmask) << lgbits) | lowbits (j, green_shift, lgbits);
b = (((j >> blue_shift) & lbmask) << lbbits) | lowbits (j, blue_shift, lbbits);
c = doMask(r, rw, rs) | doMask(g, gw, gs) | doMask(b, bw, bs);
if (bpp <= 16)
c *= 0x00010001;
p96_rgbx16[i] = c;
}
}
#endif
}*/
this.alloc_colors_rgb = function(rw, gw, bw, rs, gs, bs, aw, as, alpha, byte_swap, rc, gc, bc) {
var bpp = rw + gw + bw + aw;
for (var i = 0; i < 256; i++) {
var j = 0;
if (SAEV_config.video.blackerThanBlack)
j = Math.floor(i * 15 / 16) + 15;
else
j = i;
j += 256;
rc[i] = doColor(gamma[j][0], rw, rs) | doAlpha(alpha, aw, as);
gc[i] = doColor(gamma[j][1], gw, gs) | doAlpha(alpha, aw, as);
bc[i] = doColor(gamma[j][2], bw, bs) | doAlpha(alpha, aw, as);
if (byte_swap) {
if (bpp <= 16) {
rc[i] = SAEF_bswap16(rc[i]);
gc[i] = SAEF_bswap16(gc[i]);
bc[i] = SAEF_bswap16(bc[i]);
} else {
rc[i] = SAEF_bswap32(rc[i]);
gc[i] = SAEF_bswap32(gc[i]);
bc[i] = SAEF_bswap32(bc[i]);
}
}
if (bpp <= 16) {
/* Fill upper 16 bits of each colour value with a copy of the colour */
rc[i] = (rc[i] * 0x00010001) >>> 0;
gc[i] = (gc[i] * 0x00010001) >>> 0;
bc[i] = (bc[i] * 0x00010001) >>> 0;
}
//SAEF_log("playfield.alloc_colors_rgb() %02x : %08x %08x %08x", i, rc[i], gc[i], bc[i]);
}
}
this.alloc_colors64k = function(rw, gw, bw, rs, gs, bs, aw, as, alpha, byte_swap) {
var bpp = rw + gw + bw + aw;
calc_gammatable();
var j = 256;
for (var i = 0; i < 4096; i++) {
var r = ((i >> 8) << 4) | (i >> 8);
var g = (((i >> 4) & 0xf) << 4) | ((i >> 4) & 0x0f);
var b = ((i & 0xf) << 4) | (i & 0x0f);
r = gamma[r + j][0];
g = gamma[g + j][1];
b = gamma[b + j][2];
xcolors[i] = doMask(r, rw, rs) | doMask(g, gw, gs) | doMask(b, bw, bs) | doAlpha(alpha, aw, as);
if (byte_swap) {
if (bpp <= 16)
xcolors[i] = SAEF_bswap16(xcolors[i]);
else
xcolors[i] = SAEF_bswap32(xcolors[i]);
}
if (bpp <= 16)
xcolors[i] = ((xcolors[i] * 0x00010001) | xcolors[i]) >>> 0;
}
//#if defined(AGA) || defined(GFXFILTER)
this.alloc_colors_rgb(rw, gw, bw, rs, gs, bs, aw, as, alpha, byte_swap, xredcolors, xgreencolors, xbluecolors);
/* copy original color table */
/*for (i = 0; i < 256; i++) {
redc[0 * 256 + i] = xredcolors[0];
grec[0 * 256 + i] = xgreencolors[0];
bluc[0 * 256 + i] = xbluecolors[0];
redc[1 * 256 + i] = xredcolors[i];
grec[1 * 256 + i] = xgreencolors[i];
bluc[1 * 256 + i] = xbluecolors[i];
redc[2 * 256 + i] = xredcolors[255];
grec[2 * 256 + i] = xgreencolors[255];
bluc[2 * 256 + i] = xbluecolors[255];
}*/
/*if (usedfilter !== null && usedfilter.yuv) {
// create internal 5:6:5 color tables
for (i = 0; i < 256; i++) {
j = i + 256;
xredcolors[i] = doColor(gamma[j][0], 5, 11);
xgreencolors[i] = doColor(gamma[j][1], 6, 5);
xbluecolors[i] = doColor(gamma[j][2], 5, 0);
if (bpp <= 16) {
xredcolors [i] = (xredcolors [i] * 0x00010001) >>> 0;
xgreencolors[i] = (xgreencolors[i] * 0x00010001) >>> 0;
xbluecolors [i] = (xbluecolors [i] * 0x00010001) >>> 0;
}
}
for (i = 0; i < 4096; i++) {
var r = ((i >> 8) << 4) | (i >> 8);
var g = (((i >> 4) & 0xf) << 4) | ((i >> 4) & 0x0f);
var b = ((i & 0xf) << 4) | (i & 0x0f);
r = gamma[r + 256][0];
g = gamma[g + 256][1];
b = gamma[b + 256][2];
xcolors[i] = doMask(r, 5, 11) | doMask(g, 6, 5) | doMask(b, 5, 0);
if (byte_swap) {
if (bpp <= 16)
xcolors[i] = SAEF_bswap16(xcolors[i]);
else
xcolors[i] = SAEF_bswap32(xcolors[i]);
}
if (bpp <= 16)
xcolors[i] = ((xcolors[i] * 0x00010001) | xcolors[i]) >>> 0;
}
// create RGB 5:6:5 -> YUV tables
for (i = 0; i < 65536; i++) {
uae_u32 r, g, b;
r = (((i >> 11) & 31) << 3) | lowbits (i, 11, 3);
r = gamma[r + 256][0];
g = (((i >> 5) & 63) << 2) | lowbits (i, 5, 2);
g = gamma[g + 256][1];
b = (((i >> 0) & 31) << 3) | lowbits (i, 0, 3);
b = gamma[b + 256][2];
tyhrgb[i] = get_yh (r, g, b) * 256 * 256;
tylrgb[i] = get_yl (r, g, b) * 256 * 256;
tcbrgb[i] = ((uae_s8)get_cb (r, g, b)) * 256;
tcrrgb[i] = ((uae_s8)get_cr (r, g, b)) * 256;
}
}*/
//#endif
//used by playfield.merge_2pixel16()
xredcolor_b = rw;
xgreencolor_b = gw;
xbluecolor_b = bw;
xredcolor_s = rs;
xgreencolor_s = gs;
xbluecolor_s = bs;
xredcolor_m = (((1 << rw) - 1) << xredcolor_s) >>> 0;
xgreencolor_m = (((1 << gw) - 1) << xgreencolor_s) >>> 0;
xbluecolor_m = (((1 << bw) - 1) << xbluecolor_s) >>> 0;
}
/*-----------------------------------------------------------------------*/
function clearbuffer(dst) {
if (dst.bufmem_allocated !== null) {
/*uae_u8 *p = dst->bufmem_allocated;
for (int y = 0; y < dst->height_allocated; y++) {
memset(p, 0, dst->width_allocated * dst->pixbytes);
p += dst->rowbytes;
}*/
for (var i = 0; i < dst.bufmem_allocated.length; i++)
dst.bufmem_allocated[i] = 0;
}
}
function reset_decision_table() {
//for (var i = 0; i < sizeof linestate / sizeof *linestate; i++)
for (var i = 0; i < LINESTATE_SIZE; i++)
linestate[i] = LINE_UNDECIDED;
}
function count_frame() {
framecnt++;
if (framecnt >= SAEV_config.video.framerate)
framecnt = 0;
if (inhibit_frame)
framecnt = 1;
}
function xshift(x, shift) {
if (shift < 0)
return x >> (-shift);
else
return x << shift;
}
function coord_native_to_amiga_x(x) {
x += visible_left_border;
x = xshift(x, 1 - lores_shift);
return x + 2 * DISPLAY_LEFT_SHIFT - 2 * DIW_DDF_OFFSET;
}
function coord_native_to_amiga_y(y) {
return native2amiga_line_map[y] + thisframe_y_adjust - minfirstline;
}
function res_shift_from_window(x) {
if (res_shift >= 0)
return x >> res_shift;
return x << (-res_shift);
}
function res_shift_from_amiga(x) {
if (res_shift >= 0)
return x >> res_shift;
return x << (-res_shift);
}
function notice_screen_contents_lost() {
picasso_redraw_necessary = 1;
frame_redraw_necessary = 2;
}
const MIN_DISPLAY_W = 256;
const MIN_DISPLAY_H = 192;
const MAX_DISPLAY_W = 362;
const MAX_DISPLAY_H = 283;
var gclow = 0, gcloh = 0, gclox = 0, gcloy = 0, gclorealh = 0; //int
var stored_left_start = 0, stored_top_start = 0, stored_width = 0, stored_height = 0; //int
this.isnativevidbuf = function() {
if (gfxvidinfo.outbuffer === null)
return false;
if (gfxvidinfo.outbuffer === gfxvidinfo.drawbuffer)
return true;
return gfxvidinfo.outbuffer.nativepositioning;
}
/*void get_custom_topedge(int *xp, int *yp, bool max) {
if (this.isnativevidbuf() && !max) {
var x, y;
x = visible_left_border + (DISPLAY_LEFT_SHIFT << SAEV_config.video.hresolution);
y = minfirstline << SAEV_config.video.vresolution;
#if 0
var dbl1, dbl2;
dbl2 = dbl1 = SAEV_config.video.vresolution;
if (doublescan > 0 && interlace_seen <= 0) {
dbl1--; dbl2--;
}
x = -(visible_left_border + (DISPLAY_LEFT_SHIFT << SAEV_config.video.hresolution));
y = -minfirstline << SAEV_config.video.vresolution;
y = xshift(y, dbl2);
#endif
*xp = x;
*yp = y;
} else {
*xp = 0;
*yp = 0;
}
}*/
function reset_custom_limits() { //global
gclow = gcloh = gclox = gcloy = 0;
gclorealh = -1;
center_reset = true;
}
function set_blanking_limits() { //global
hblank_left_start = visible_left_start;
hblank_right_stop = visible_right_stop;
if (programmedmode) {
if (hblank_left_start < coord_hw_to_window_x(hsyncendpos * 2))
hblank_left_start = coord_hw_to_window_x(hsyncendpos * 2);
if (hblank_right_stop > coord_hw_to_window_x(hsyncstartpos * 2))
hblank_right_stop = coord_hw_to_window_x(hsyncstartpos * 2);
}
}
/*void get_custom_raw_limits (int *pw, int *ph, int *pdx, int *pdy) {
if (stored_width > 0) {
*pw = stored_width;
*ph = stored_height;
*pdx = stored_left_start;
*pdy = stored_top_start;
} else {
int x = visible_left_border;
if (x < visible_left_start)
x = visible_left_start;
*pdx = x;
int x2 = visible_right_border;
if (x2 > visible_right_stop)
x2 = visible_right_stop;
*pw = x2 - x;
int y = min_ypos_for_screen;
if (y < visible_top_start)
y = visible_top_start;
*pdy = y;
int y2 = max_ypos_thisframe;
if (y2 > visible_bottom_stop)
y2 = visible_bottom_stop;
*ph = y2 - y;
}
}*/
this.check_custom_limits = function() {
var vls = visible_left_start;
var vrs = visible_right_stop;
var vts = visible_top_start;
var vbs = visible_bottom_stop;
var fd = SAEV_config.video.gf[0];
var left = fd.gfx_filter_left_border >> (RES_MAX - SAEV_config.video.hresolution);
var right = fd.gfx_filter_right_border >> (RES_MAX - SAEV_config.video.hresolution);
var top = fd.gfx_filter_top_border;
var bottom = fd.gfx_filter_bottom_border;
if (left > visible_left_start)
visible_left_start = left;
if (right > left && right < visible_right_stop)
visible_right_stop = right;
if (top > visible_top_start)
visible_top_start = top;
if (bottom > top && bottom < visible_bottom_stop)
visible_bottom_stop = bottom;
set_blanking_limits();
}
this.set_custom_limits = function(w, h, dx, dy) {
var vls = visible_left_start;
var vrs = visible_right_stop;
var vts = visible_top_start;
var vbs = visible_bottom_stop;
if (w <= 0 || dx < 0) {
visible_left_start = 0;
visible_right_stop = MAX_STOP;
} else {
visible_left_start = visible_left_border + dx;
visible_right_stop = visible_left_start + w;
}
if (h <= 0 || dy < 0) {
visible_top_start = 0;
visible_bottom_stop = MAX_STOP;
} else {
visible_top_start = min_ypos_for_screen + dy;
visible_bottom_stop = visible_top_start + h;
}
if (vls != visible_left_start || vrs != visible_right_stop || vts != visible_top_start || vbs != visible_bottom_stop)
notice_screen_contents_lost();
this.check_custom_limits();
}
this.store_custom_limits = function(w, h, x, y) {
stored_left_start = x;
stored_top_start = y;
stored_width = w;
stored_height = h;
}
/*int get_custom_limits (int *pw, int *ph, int *pdx, int *pdy, int *prealh) {
int w, h, dx, dy, y1, y2, dbl1, dbl2;
int ret = 0;
if (!pw || !ph || !pdx || !pdy) {
reset_custom_limits();
return 0;
}
if (!this.isnativevidbuf()) {
*pw = gfxvidinfo.outbuffer->outwidth;
*ph = gfxvidinfo.outbuffer->outheight;
*pdx = 0;
*pdy = 0;
*prealh = -1;
return 1;
}
*pw = gclow;
*ph = gcloh;
*pdx = gclox;
*pdy = gcloy;
*prealh = gclorealh;
if (gclow > 0 && gcloh > 0)
ret = -1;
if (interlace_seen) {
static int interlace_count;
// interlace = only use long frames
if (lof_store && (interlace_count & 1) == 0)
interlace_count++;
if (!lof_store && (interlace_count & 1) != 0)
interlace_count++;
if (interlace_count < 3)
return ret;
if (!lof_store)
return ret;
interlace_count = 0;
// program may have set last visible line as last possible line (CD32 boot screen)
if (last_planes_vpos < maxvpos)
last_planes_vpos++;
if (plflastline_total < maxvpos)
plflastline_total++;
}
if (plflastline_total < 4)
plflastline_total = last_planes_vpos;
ddffirstword_total = coord_hw_to_window_x (ddffirstword_total * 2 + DIW_DDF_OFFSET);
ddflastword_total = coord_hw_to_window_x (ddflastword_total * 2 + DIW_DDF_OFFSET);
if (doublescan <= 0 && !programmedmode) {
int min = coord_diw_to_window_x (92);
int max = coord_diw_to_window_x (460);
if (diwfirstword_total < min)
diwfirstword_total = min;
if (diwlastword_total > max)
diwlastword_total = max;
if (ddffirstword_total < min)
ddffirstword_total = min;
if (ddflastword_total > max)
ddflastword_total = max;
if (0 && !(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA)) {
if (ddffirstword_total > diwfirstword_total)
diwfirstword_total = ddffirstword_total;
if (ddflastword_total < diwlastword_total)
diwlastword_total = ddflastword_total;
}
}
w = diwlastword_total - diwfirstword_total;
dx = diwfirstword_total - visible_left_border;
y2 = plflastline_total;
if (y2 > last_planes_vpos)
y2 = last_planes_vpos;
y1 = plffirstline_total;
if (first_planes_vpos > y1)
y1 = first_planes_vpos;
if (minfirstline > y1)
y1 = minfirstline;
dbl2 = dbl1 = SAEV_config.video.vresolution;
if (doublescan > 0 && interlace_seen <= 0) {
dbl1--;
dbl2--;
}
h = y2 - y1;
dy = y1 - minfirstline;
if (first_planes_vpos == 0) {
// no planes enabled during frame
if (ret < 0)
return 1;
h = SAEV_config.chipset.ntsc ? 200 : 240;
w = 320 << SAEV_config.video.hresolution;
dy = 36 / 2;
dx = 58;
}
if (dx < 0)
dx = 0;
*prealh = -1;
if (!programmedmode && first_planes_vpos) {
int th = (maxvpos - minfirstline) * 95 / 100;
if (th > h) {
th = xshift (th, dbl1);
*prealh = th;
}
}
dy = xshift (dy, dbl2);
h = xshift (h, dbl1);
if (w == 0 || h == 0)
return 0;
if (doublescan <= 0 && !programmedmode) {
if ((w >> SAEV_config.video.hresolution) < MIN_DISPLAY_W) {
dx += (w - (MIN_DISPLAY_W << SAEV_config.video.hresolution)) / 2;
w = MIN_DISPLAY_W << SAEV_config.video.hresolution;
}
if ((h >> dbl1) < MIN_DISPLAY_H) {
dy += (h - (MIN_DISPLAY_H << dbl1)) / 2;
h = MIN_DISPLAY_H << dbl1;
}
if ((w >> SAEV_config.video.hresolution) > MAX_DISPLAY_W) {
dx += (w - (MAX_DISPLAY_W << SAEV_config.video.hresolution)) / 2;
w = MAX_DISPLAY_W << SAEV_config.video.hresolution;
}
if ((h >> dbl1) > MAX_DISPLAY_H) {
dy += (h - (MAX_DISPLAY_H << dbl1)) / 2;
h = MAX_DISPLAY_H << dbl1;
}
}
if (gclow == w && gcloh == h && gclox == dx && gcloy == dy)
return ret;
if (w <= 0 || h <= 0 || dx < 0 || dy < 0)
return ret;
if (doublescan <= 0 && !programmedmode) {
if (dx > gfxvidinfo.outbuffer->inwidth / 3)
return ret;
if (dy > gfxvidinfo.outbuffer->inheight / 3)
return ret;
}
gclow = w;
gcloh = h;
gclox = dx;
gcloy = dy;
gclorealh = *prealh;
*pw = w;
*ph = h;
*pdx = dx;
*pdy = dy;
center_reset = true;
return 1;
}*/
/*void get_custom_mouse_limits (int *pw, int *ph, int *pdx, int *pdy, int dbl) {
int delay1, delay2;
int w, h, dx, dy, dbl1, dbl2, y1, y2;
w = diwlastword_total - diwfirstword_total;
dx = diwfirstword_total - visible_left_border;
y2 = plflastline_total;
if (y2 > last_planes_vpos)
y2 = last_planes_vpos;
y1 = plffirstline_total;
if (first_planes_vpos > y1)
y1 = first_planes_vpos;
if (minfirstline > y1)
y1 = minfirstline;
h = y2 - y1;
dy = y1 - minfirstline;
if (*pw > 0)
w = *pw;
w = xshift (w, res_shift);
if (*ph > 0)
h = *ph;
delay1 = (firstword_bplcon1 & 0x0f) | ((firstword_bplcon1 & 0x0c00) >> 6);
delay2 = ((firstword_bplcon1 >> 4) & 0x0f) | (((firstword_bplcon1 >> 4) & 0x0c00) >> 6);
// if (delay1 == delay2)
// dx += delay1;
dx = xshift (dx, res_shift);
dbl2 = dbl1 = SAEV_config.video.vresolution;
if ((doublescan > 0 || interlace_seen > 0) && !dbl) {
dbl1--;
dbl2--;
}
if (interlace_seen > 0)
dbl2++;
if (interlace_seen <= 0 && dbl)
dbl2--;
h = xshift (h, dbl1);
dy = xshift (dy, dbl2);
if (w < 1)
w = 1;
if (h < 1)
h = 1;
if (dx < 0)
dx = 0;
if (dy < 0)
dy = 0;
*pw = w; *ph = h;
*pdx = dx; *pdy = dy;
}*/
var dp_for_drawing = null; //struct decision *
var dip_for_drawing = null; //struct draw_info *
/* Record DIW of the current line for use by centering code. */
function record_diw_line(plfstrt, first, last) {
if (last > max_diwstop)
max_diwstop = last;
if (first < min_diwstart) {
min_diwstart = first;
/*if (plfstrt * 2 > min_diwstart)
min_diwstart = plfstrt * 2;*/
}
}
function get_shdelay_add() {
if (bplres == SAEC_Config_Video_HResolution_SuperHiRes)
return 0;
/*var add = bpldelay_sh;
add >>= RES_MAX - SAEV_config.video.hresolution;
return add;*/
return bpldelay_sh >> (RES_MAX - SAEV_config.video.hresolution);
}
/*
* Screen update macros/functions
*/
/* The important positions in the line: where do we start drawing the left border,
where do we start drawing the playfield, where do we start drawing the right border.
All of these are forced into the visible window (VISIBLE_LEFT_BORDER .. VISIBLE_RIGHT_BORDER).
PLAYFIELD_START and PLAYFIELD_END are in window coordinates. */
var playfield_start = 0, playfield_end = 0; //int
var real_playfield_start = 0, real_playfield_end = 0; //int
var sprite_playfield_start = 0; //int
var may_require_hard_way = false; //bool
var linetoscr_diw_start = 0, linetoscr_diw_end = 0; //int
var native_ddf_left = 0, native_ddf_right = 0; //int
var pixels_offset = 0; //int
var src_pixel = 0; //int
var unpainted = 0; //int /* How many pixels in window coordinates which are to the left of the left border. */
function getbgc(blank) {
/*#if BG_COLOR_DEBUG
if (blank)
return xcolors[0x088];
else if (hposblank == 1)
return xcolors[0xf00];
else if (hposblank == 2)
return xcolors[0x0f0];
else if (hposblank == 3)
return xcolors[0x00f];
else if (ce_is_borderblank(colors_for_drawing.extra))
return xcolors[0x880];
//return colors_for_drawing.acolors[0];
return xcolors[0xf0f];
#endif*/
return (blank || hposblank || ce_is_borderblank(colors_for_drawing.extra)) ? 0 : colors_for_drawing.acolors[0];
}
function set_res_shift(shift) {
var old = res_shift;
res_shift = shift;
if (res_shift != old)
pfield_set_linetoscr();
}
/* Initialize the variables necessary for drawing a line. This involves setting up start/stop positions and display window borders. */
function pfield_init_linetoscr(border) {
/* First, get data fetch start/stop in DIW coordinates. */
var ddf_left = dp_for_drawing.plfleft * 2 + DIW_DDF_OFFSET;
var ddf_right = dp_for_drawing.plfright * 2 + DIW_DDF_OFFSET;
var leftborderhidden;
var native_ddf_left2;
if (border)
ddf_left = DISPLAY_LEFT_SHIFT;
/* Compute datafetch start/stop in pixels; native display coordinates. */
native_ddf_left = coord_hw_to_window_x(ddf_left);
native_ddf_right = coord_hw_to_window_x(ddf_right);
// Blerkenwiegel/Scoopex workaround
native_ddf_left2 = native_ddf_left;
if (native_ddf_left < 0)
native_ddf_left = 0;
if (native_ddf_right < native_ddf_left)
native_ddf_right = native_ddf_left;
linetoscr_diw_start = dp_for_drawing.diwfirstword;
linetoscr_diw_end = dp_for_drawing.diwlastword;
/* Perverse cases happen. */
if (linetoscr_diw_end < linetoscr_diw_start)
linetoscr_diw_end = linetoscr_diw_start;
set_res_shift(lores_shift - bplres);
playfield_start = linetoscr_diw_start;
playfield_end = linetoscr_diw_end;
if (playfield_start < native_ddf_left)
playfield_start = native_ddf_left;
if (playfield_end > native_ddf_right)
playfield_end = native_ddf_right;
if (playfield_start < visible_left_border)
playfield_start = visible_left_border;
if (playfield_start > visible_right_border)
playfield_start = visible_right_border;
if (playfield_end < visible_left_border)
playfield_end = visible_left_border;
if (playfield_end > visible_right_border)
playfield_end = visible_right_border;
real_playfield_start = playfield_start;
sprite_playfield_start = playfield_start;
real_playfield_end = playfield_end;
// Sprite hpos don't include DIW_DDF_OFFSET and can appear 1 lores pixel
// before first bitplane pixel appears.
// This means "bordersprite" condition is possible under OCS/ECS too. Argh!
if (dip_for_drawing.nr_sprites) {
if (!ce_is_borderblank(colors_for_drawing.extra)) {
/* bordersprite off or not supported: sprites are visible until diw_end */
if (playfield_end < linetoscr_diw_end && hblank_right_stop > playfield_end) {
playfield_end = linetoscr_diw_end;
}
var left = coord_hw_to_window_x(dp_for_drawing.plfleft * 2);
if (left < visible_left_border)
left = visible_left_border;
if (left < playfield_start && left >= linetoscr_diw_start) {
playfield_start = left;
}
} else {
sprite_playfield_start = 0;
if (playfield_end < linetoscr_diw_end && hblank_right_stop > playfield_end) {
playfield_end = linetoscr_diw_end;
}
}
}
//#ifdef AGA
may_require_hard_way = false;
if (dp_for_drawing.bordersprite_seen && !ce_is_borderblank(colors_for_drawing.extra) && dip_for_drawing.nr_sprites) {
var min = visible_right_border, max = visible_left_border, i;
for (i = 0; i < dip_for_drawing.nr_sprites; i++) {
var x;
x = curr_sprite_entries[dip_for_drawing.first_sprite_entry + i].pos;
if (x < min)
min = x;
// include max extra pixels, sprite may be 2x or 4x size: 4x - 1.
x = curr_sprite_entries[dip_for_drawing.first_sprite_entry + i].max + (4 - 1);
if (x > max)
max = x;
}
min = coord_hw_to_window_x(min >> sprite_buffer_res) + (DIW_DDF_OFFSET << lores_shift);
max = coord_hw_to_window_x(max >> sprite_buffer_res) + (DIW_DDF_OFFSET << lores_shift);
if (min < playfield_start)
playfield_start = min;
if (playfield_start < visible_left_border)
playfield_start = visible_left_border;
if (max > playfield_end)
playfield_end = max;
if (playfield_end > visible_right_border)
playfield_end = visible_right_border;
sprite_playfield_start = 0;
may_require_hard_way = true;
}
//#endif
unpainted = visible_left_border < playfield_start ? 0 : visible_left_border - playfield_start;
unpainted = res_shift_from_window(unpainted);
var first_x = sprite_first_x;
var last_x = sprite_last_x;
if (first_x < last_x) {
if (dp_for_drawing.bordersprite_seen && !ce_is_borderblank(colors_for_drawing.extra)) {
if (first_x > visible_left_border)
first_x = visible_left_border;
if (last_x < visible_right_border)
last_x = visible_right_border;
}
if (first_x < 0)
first_x = 0;
if (last_x > MAX_PIXELS_PER_LINE - 2)
last_x = MAX_PIXELS_PER_LINE - 2;
if (first_x < last_x) {
//memset(spritepixels + first_x, 0, sizeof (struct spritepixelsbuf) * (last_x - first_x + 1));
for (var i = first_x; i <= last_x; i++) spritepixels[i].clr();
}
}
sprite_last_x = 0;
sprite_first_x = MAX_PIXELS_PER_LINE - 1;
/* Now, compute some offsets. */
ddf_left -= DISPLAY_LEFT_SHIFT;
pixels_offset = MAX_PIXELS_PER_LINE - (ddf_left << bplres);
ddf_left <<= bplres;
leftborderhidden = playfield_start - native_ddf_left2;
if (hblank_left_start > playfield_start)
leftborderhidden += hblank_left_start - playfield_start;
src_pixel = MAX_PIXELS_PER_LINE + res_shift_from_window(leftborderhidden);
if (dip_for_drawing.nr_sprites == 0)
return;
if (aga_mode) {
var add = get_shdelay_add();
if (add) {
if (sprite_playfield_start > 0)
sprite_playfield_start -= add;
else
playfield_start -= add;
}
}
/* We need to clear parts of apixels. */
if (linetoscr_diw_start < native_ddf_left) {
var len = res_shift_from_window(native_ddf_left - linetoscr_diw_start);
var start = MAX_PIXELS_PER_LINE - len;
var end = start + len;
for (var i = start; i < end; i++) pixdata.apixels[i] = 0;
linetoscr_diw_start = native_ddf_left;
}
if (linetoscr_diw_end > native_ddf_right) {
var start = MAX_PIXELS_PER_LINE + res_shift_from_window(native_ddf_right - native_ddf_left);
var end = start + res_shift_from_window(linetoscr_diw_end - native_ddf_right);
for (var i = start; i < end; i++) pixdata.apixels[i] = 0;
linetoscr_diw_start = native_ddf_left;
}
}
// erase sprite graphics in pixdata if they were outside of ddf
function pfield_erase_hborder_sprites() {
if (sprite_first_x < native_ddf_left) {
var len = res_shift_from_window(native_ddf_left - sprite_first_x);
var start = MAX_PIXELS_PER_LINE - len;
var end = start + len;
for (var i = start; i < end; i++) pixdata.apixels[i] = 0;
}
if (sprite_last_x > native_ddf_right) {
var start = MAX_PIXELS_PER_LINE + res_shift_from_window(native_ddf_right - native_ddf_left);
var end = start + res_shift_from_window(sprite_last_x - native_ddf_right);
for (var i = start; i < end; i++) pixdata.apixels[i] = 0;
}
}
// erase whole viewable area if sprite in upper or lower border
function pfield_erase_vborder_sprites() {
if (visible_right_border <= visible_left_border)
return;
var pos = 0, len = 0;
if (visible_left_border < native_ddf_left) {
len = res_shift_from_window(native_ddf_left - visible_left_border);
pos = -len;
}
if (visible_right_border > native_ddf_left)
len += res_shift_from_window(visible_right_border - native_ddf_left);
var start = MAX_PIXELS_PER_LINE - pos;
var end = start + len;
for (var i = start; i < end; i++) pixdata.apixels[i] = 0;
}
/*STATIC_INLINE void fill_line_16 (uae_u8 *buf, int start, int stop, bool blank) {
uae_u16 *b = (uae_u16 *)buf;
unsigned int i;
unsigned int rem = 0;
xcolnr col = getbgc (blank);
if (((uintptr_t)&b[start]) & 1)
b[start++] = (uae_u16) col;
if (start >= stop)
return;
if (((uintptr_t)&b[stop]) & 1) {
rem++;
stop--;
}
for (i = start; i < stop; i += 2) {
uae_u32 *b2 = (uae_u32 *)&b[i];
*b2 = col;
}
if (rem)
b[stop] = (uae_u16)col;
}
STATIC_INLINE void fill_line_32 (uae_u8 *buf, int start, int stop, bool blank) {
uae_u32 *b = (uae_u32 *)buf;
unsigned int i;
xcolnr col = getbgc (blank);
for (i = start; i < stop; i++)
b[i] = col;
}
static void pfield_do_fill_line (int start, int stop, bool blank) {
switch (gfxvidinfo.drawbuffer.pixbytes) {
case 2: fill_line_16 (xlinebuffer, start, stop, blank); break;
case 4: fill_line_32 (xlinebuffer, start, stop, blank); break;
}
if (need_genlock_data)
memset(xlinebuffer_genlock + start, 0, stop - start);
}*/
function pfield_do_fill_line(start, stop, blank) {
//xlinebuffer.fill(getbgc(blank), start + xlinebuffer_pos, stop + xlinebuffer_pos);
//SAEF_memset(xlinebuffer,start + xlinebuffer_pos, getbgc(blank), stop - start);
var col = getbgc(blank);
for (var i = start + xlinebuffer_pos, j = stop + xlinebuffer_pos; i < j; i++) xlinebuffer[i] = col;
/*if (need_genlock_data)
memset(xlinebuffer_genlock + start, 0, stop - start);*/
}
/*static void fill_line2 (int startpos, int len) {
int shift, nints, nrem, *start;
xcolnr val;
shift = 0;
if (gfxvidinfo.drawbuffer.pixbytes == 2) shift = 1;
if (gfxvidinfo.drawbuffer.pixbytes == 4) shift = 2;
nints = len >> (2 - shift);
nrem = nints & 7;
nints &= ~7;
start = (int *)(((uae_u8*)xlinebuffer) + (startpos << shift));
val = getbgc (false);
for (; nints > 0; nints -= 8, start += 8) {
*start = val;
*(start+1) = val;
*(start+2) = val;
*(start+3) = val;
*(start+4) = val;
*(start+5) = val;
*(start+6) = val;
*(start+7) = val;
}
switch (nrem) {
case 7: *start++ = val;
case 6: *start++ = val;
case 5: *start++ = val;
case 4: *start++ = val;
case 3: *start++ = val;
case 2: *start++ = val;
case 1: *start = val;
}
}*/
/*function fill_line2(startpos, len) {
var shift = 0;
if (gfxvidinfo.drawbuffer.pixbytes == 2) shift = 1;
if (gfxvidinfo.drawbuffer.pixbytes == 4) shift = 2;
var nints = len >> (2 - shift);
var nrem = nints & 7;
nints &= ~7;
//var start = (int *)(((uae_u8*)xlinebuffer) + (startpos << shift));
var start = startpos + xlinebuffer_pos;
var val = getbgc(false);
for (; nints > 0; nints -= 8, start += 8) {
xlinebuffer[start ] = val;
xlinebuffer[start + 1] = val;
xlinebuffer[start + 2] = val;
xlinebuffer[start + 3] = val;
xlinebuffer[start + 4] = val;
xlinebuffer[start + 5] = val;
xlinebuffer[start + 6] = val;
xlinebuffer[start + 7] = val;
}
switch (nrem) {
case 7: xlinebuffer[start++] = val;
case 6: xlinebuffer[start++] = val;
case 5: xlinebuffer[start++] = val;
case 4: xlinebuffer[start++] = val;
case 3: xlinebuffer[start++] = val;
case 2: xlinebuffer[start++] = val;
case 1: xlinebuffer[start] = val;
}
}*/
function fill_line2(startpos, len) {
//xlinebuffer.fill(getbgc(false), startpos + xlinebuffer_pos, startpos + xlinebuffer_pos + len);
//SAEF_memset(xlinebuffer,startpos + xlinebuffer_pos, getbgc(false), len);
var col = getbgc(false);
for (var i = startpos + xlinebuffer_pos, j = startpos + xlinebuffer_pos + len; i < j; i++) xlinebuffer[i] = col;
}
function fill_line_border(lineno) {
var lastpos = visible_left_border;
var endpos = visible_left_border + gfxvidinfo.drawbuffer.inwidth;
if (lineno < visible_top_start || lineno >= visible_bottom_stop) {
var b = hposblank;
hposblank = 3;
fill_line2(lastpos, gfxvidinfo.drawbuffer.inwidth);
/*if (need_genlock_data) {
memset(xlinebuffer_genlock + lastpos, 0, gfxvidinfo.drawbuffer.inwidth);
}*/
hposblank = b;
return;
}
// full hblank
if (hposblank) {
hposblank = 3;
fill_line2(lastpos, gfxvidinfo.drawbuffer.inwidth);
/*if (need_genlock_data) {
memset(xlinebuffer_genlock + lastpos, 0, gfxvidinfo.drawbuffer.inwidth);
}*/
return;
}
// hblank not visible
if (hblank_left_start <= lastpos && hblank_right_stop >= endpos) {
fill_line2(lastpos, gfxvidinfo.drawbuffer.inwidth);
/*if (need_genlock_data) {
memset(xlinebuffer_genlock + lastpos, 0, gfxvidinfo.drawbuffer.inwidth);
}*/
return;
}
// left, right or both hblanks visible
if (lastpos < hblank_left_start) {
var t = hblank_left_start < endpos ? hblank_left_start : endpos;
pfield_do_fill_line(lastpos, t, true);
lastpos = t;
}
if (lastpos < hblank_right_stop) {
var t = hblank_right_stop < endpos ? hblank_right_stop : endpos;
pfield_do_fill_line(lastpos, t, false);
lastpos = t;
}
if (lastpos < endpos)
pfield_do_fill_line(lastpos, endpos, true);
}
var sprite_shdelay = 0; //int
function render_sprites(pos, dualpf, apixel, aga) {
//struct spritepixelsbuf *spb = &spritepixels[pos];
var spb = spritepixels[pos];
var v = spb.data; //uint
var shift_lookup = dualpf ? (bpldualpfpri ? dblpf_ms2 : dblpf_ms1) : dblpf_ms; //int *
var maskshift, plfmask; //int
// shdelay hack, above &spritepixels[pos] is correct.
pos += sprite_shdelay;
/* The value in the shift lookup table is _half_ the shift count we
need. This is because we can't shift 32 bits at once (undefined behaviour in C). */
maskshift = shift_lookup[apixel];
plfmask = (plf_sprite_mask >>> maskshift) >>> maskshift;
v &= ~plfmask;
/* Extra 1 sprite pixel at DDFSTRT is only possible if at least 1 plane is active */
if ((bplplanecnt > 0 || pos >= sprite_playfield_start) && v != 0) {
var vlo, vhi, col; //uint
var v1 = v & 255; //uint
/* OFFS determines the sprite pair with the highest priority that has
any bits set. E.g. if we have 0xFF00 in the buffer, we have sprite
pairs 01 and 23 cleared, and pairs 45 and 67 set, so OFFS will
have a value of 4.
2 * OFFS is the bit number in V of the sprite pair, and it also
happens to be the color offset for that pair.
*/
var offs;
if (v1 == 0)
offs = 4 + sprite_offs[v >> 8];
else
offs = sprite_offs[v1];
/* Shift highest priority sprite pair down to bit zero. */
v >>>= offs * 2;
v &= 15;
if (spb.attach && (spb.stdata & (3 << offs))) {
col = v;
if (aga)
col += sbasecol[1];
else
col += 16;
} else {
/* This sequence computes the correct color value. We have to select
either the lower-numbered or the higher-numbered sprite in the pair.
We have to select the high one if the low one has all bits zero.
If the lower-numbered sprite has any bits nonzero, (VLO - 1) is in
the range of 0..2, and with the mask and shift, VHI will be zero.
If the lower-numbered sprite is zero, (VLO - 1) is a mask of
0xFFFFFFFF, and we select the bits of the higher numbered sprite in VHI.
This is _probably_ more efficient than doing it with branches. */
vlo = v & 3;
//vhi = (v & (vlo - 1)) >> 2; col = vlo | vhi; //ATT
vhi = v >> 2;
if (vlo)
col = vlo;
else
col = vhi;
if (aga) {
if (vhi > 0)
col += sbasecol[1];
else
col += sbasecol[0];
} else {
col += 16;
}
col += offs * 2;
}
return col;
}
return 0;
}
function get_genlock_very_rare_and_complex_case(v) {
// border color without BRDNTRAN bit set = transparent
if (v == 0 && !ce_is_borderntrans(colors_for_drawing.extra))
return false;
if (ecs_genlock_features_colorkey) {
// color key match?
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA) {
if (colors_for_drawing.color_regs_aga[v] & 0x80000000)
return false;
} else {
if (colors_for_drawing.color_regs_ecs[v] & 0x8000)
return false;
}
}
// plane mask match?
if (v & ecs_genlock_features_mask)
return false;
return true;
}
// false = transparent
function get_genlock_transparency(v) {
if (!ecs_genlock_features_active) {
if (v == 0)
return false;
return true;
} else
return get_genlock_very_rare_and_complex_case(v);
}
function merge_2pixel16(p1, p2) {
return ( //u16
(((((p1 >> xredcolor_s) & xredcolor_m) + ((p2 >> xredcolor_s) & xredcolor_m)) >> 1) << xredcolor_s) |
(((((p1 >> xbluecolor_s) & xbluecolor_m) + ((p2 >> xbluecolor_s) & xbluecolor_m)) >> 1) << xbluecolor_s) |
(((((p1 >> xgreencolor_s) & xgreencolor_m) + ((p2 >> xgreencolor_s) & xgreencolor_m)) >> 1) << xgreencolor_s)
);
}
function merge_2pixel32(p1, p2) {
return ( //u32
(((((p1 >> 16) & 0xff) + ((p2 >> 16) & 0xff)) >> 1) << 16) |
(((((p1 >> 8) & 0xff) + ((p2 >> 8) & 0xff)) >> 1) << 8) |
(((((p1 >> 0) & 0xff) + ((p2 >> 0) & 0xff)) >> 1) << 0)
) >>> 0;
}
//typedef int(*call_linetoscr)(int spix, int dpix, int dpix_end);
var pfield_do_linetoscr_normal = function(spix, dpix, dpix_end) {}; //call_linetoscr
var pfield_do_linetoscr_sprite = function(spix, dpix, dpix_end) {};
var pfield_do_linetoscr_spriteonly = function(spix, dpix, dpix_end) {};
function pfield_do_linetoscr(start, stop, blank) {
src_pixel = pfield_do_linetoscr_normal(src_pixel, start, stop);
}
function pfield_do_linetoscr_spr(start, stop, blank) {
src_pixel = pfield_do_linetoscr_sprite(src_pixel, start, stop);
}
function pfield_do_nothing(start, stop, blank) {
return start;
}
/* AGA subpixel delay hack */
var pfield_do_linetoscr_shdelay_normal = function(a,b,c) {}; //call_linetoscr
var pfield_do_linetoscr_shdelay_sprite = function(a,b,c) {};
function pfield_do_linetoscr_normal_shdelay(spix, dpix, dpix_end) {
var add = get_shdelay_add();
//var add2 = add * gfxvidinfo.drawbuffer.pixbytes;
if (add)
pfield_do_linetoscr_shdelay_sprite(spix, dpix, dpix + add);
//xlinebuffer += add2; //ORG
xlinebuffer_pos += add; //OWN
var out = pfield_do_linetoscr_shdelay_normal(spix, dpix, dpix_end);
//xlinebuffer -= add2; //ORG
xlinebuffer_pos -= add; //OWN
return out;
}
function pfield_do_linetoscr_sprite_shdelay(spix, dpix, dpix_end) {
var out = spix;
if (dpix < real_playfield_start && dpix_end > real_playfield_start) {
// Crosses real_playfield_start.
// Render only from dpix to real_playfield_start.
var len = real_playfield_start - dpix;
out = pfield_do_linetoscr_spriteonly(out, dpix, dpix + len);
dpix = real_playfield_start;
} else if (dpix_end <= real_playfield_start) {
// Does not cross real_playfield_start, nothing special needed.
out = pfield_do_linetoscr_spriteonly(out, dpix, dpix_end);
return out;
}
// Render bitplane with subpixel scroll, from real_playfield_start to end.
var add = get_shdelay_add();
//var add2 = add * gfxvidinfo.drawbuffer.pixbytes;
if (add)
pfield_do_linetoscr_shdelay_sprite(out, dpix, dpix + add);
sprite_shdelay = add;
//spritepixels += add;
spritepixels_pos += add; //OWN
//xlinebuffer += add2;
xlinebuffer_pos += add; //OWN
out = pfield_do_linetoscr_shdelay_sprite(out, dpix, dpix_end);
//xlinebuffer -= add2; //ORG
xlinebuffer_pos -= add; //OWN
//spritepixels -= add;
spritepixels_pos -= add; //OWN
sprite_shdelay = 0;
return out;
}
function pfield_set_linetoscr() {
p_acolors = colors_for_drawing.acolors;
p_xcolors = xcolors;
bpland = 0xff;
if (bplbypass)
p_acolors = direct_colors_for_drawing.acolors;
spritepixels = spritepixels_buffer;
spritepixels_pos = 0; //OWN
pfield_do_linetoscr_spriteonly = pfield_do_nothing;
//#ifdef AGA
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA) {
if (res_shift == 0) {
switch (gfxvidinfo.drawbuffer.pixbytes) {
case 2:
pfield_do_linetoscr_normal = need_genlock_data ? linetoscr_16_aga_genlock : linetoscr_16_aga;
pfield_do_linetoscr_sprite = need_genlock_data ? linetoscr_16_aga_spr_genlock : linetoscr_16_aga_spr;
pfield_do_linetoscr_spriteonly = linetoscr_16_aga_spronly;
break;
case 4:
pfield_do_linetoscr_normal = need_genlock_data ? linetoscr_32_aga_genlock : linetoscr_32_aga;
pfield_do_linetoscr_sprite = need_genlock_data ? linetoscr_32_aga_spr_genlock : linetoscr_32_aga_spr;
pfield_do_linetoscr_spriteonly = linetoscr_32_aga_spronly;
break;
}
} else if (res_shift == 2) {
switch (gfxvidinfo.drawbuffer.pixbytes) {
case 2:
pfield_do_linetoscr_normal = need_genlock_data ? linetoscr_16_stretch2_aga_genlock : linetoscr_16_stretch2_aga;
pfield_do_linetoscr_sprite = need_genlock_data ? linetoscr_16_stretch2_aga_spr_genlock : linetoscr_16_stretch2_aga_spr;
pfield_do_linetoscr_spriteonly = linetoscr_16_stretch2_aga_spronly;
break;
case 4:
pfield_do_linetoscr_normal = need_genlock_data ? linetoscr_32_stretch2_aga_genlock : linetoscr_32_stretch2_aga;
pfield_do_linetoscr_sprite = need_genlock_data ? linetoscr_32_stretch2_aga_spr_genlock : linetoscr_32_stretch2_aga_spr;
pfield_do_linetoscr_spriteonly = linetoscr_32_stretch2_aga_spronly;
break;
}
} else if (res_shift == 1) {
switch (gfxvidinfo.drawbuffer.pixbytes) {
case 2:
pfield_do_linetoscr_normal = need_genlock_data ? linetoscr_16_stretch1_aga_genlock : linetoscr_16_stretch1_aga;
pfield_do_linetoscr_sprite = need_genlock_data ? linetoscr_16_stretch1_aga_spr_genlock : linetoscr_16_stretch1_aga_spr;
pfield_do_linetoscr_spriteonly = linetoscr_16_stretch1_aga_spronly;
break;
case 4:
pfield_do_linetoscr_normal = need_genlock_data ? linetoscr_32_stretch1_aga_genlock : linetoscr_32_stretch1_aga;
pfield_do_linetoscr_sprite = need_genlock_data ? linetoscr_32_stretch1_aga_spr_genlock : linetoscr_32_stretch1_aga_spr;
pfield_do_linetoscr_spriteonly = linetoscr_32_stretch1_aga_spronly;
break;
}
} else if (res_shift == -1) {
if (SAEV_config.video.lores_mode) {
switch (gfxvidinfo.drawbuffer.pixbytes) {
case 2:
pfield_do_linetoscr_normal = need_genlock_data ? linetoscr_16_shrink1f_aga_genlock : linetoscr_16_shrink1f_aga;
pfield_do_linetoscr_sprite = need_genlock_data ? linetoscr_16_shrink1f_aga_spr_genlock : linetoscr_16_shrink1f_aga_spr;
pfield_do_linetoscr_spriteonly = linetoscr_16_shrink1f_aga_spronly;
break;
case 4:
pfield_do_linetoscr_normal = need_genlock_data ? linetoscr_32_shrink1f_aga_genlock : linetoscr_32_shrink1f_aga;
pfield_do_linetoscr_sprite = need_genlock_data ? linetoscr_32_shrink1f_aga_spr_genlock : linetoscr_32_shrink1f_aga_spr;
pfield_do_linetoscr_spriteonly = linetoscr_32_shrink1f_aga_spronly;
break;
}
} else {
switch (gfxvidinfo.drawbuffer.pixbytes) {
case 2:
pfield_do_linetoscr_normal = need_genlock_data ? linetoscr_16_shrink1_aga_genlock : linetoscr_16_shrink1_aga;
pfield_do_linetoscr_sprite = need_genlock_data ? linetoscr_16_shrink1_aga_spr_genlock : linetoscr_16_shrink1_aga_spr;
pfield_do_linetoscr_spriteonly = linetoscr_16_shrink1_aga_spronly;
break;
case 4:
pfield_do_linetoscr_normal = need_genlock_data ? linetoscr_32_shrink1_aga_genlock : linetoscr_32_shrink1_aga;
pfield_do_linetoscr_sprite = need_genlock_data ? linetoscr_32_shrink1_aga_spr_genlock : linetoscr_32_shrink1_aga_spr;
pfield_do_linetoscr_spriteonly = linetoscr_32_shrink1_aga_spronly;
break;
}
}
} else if (res_shift == -2) {
if (SAEV_config.video.lores_mode) {
switch (gfxvidinfo.drawbuffer.pixbytes) {
case 2:
pfield_do_linetoscr_normal = need_genlock_data ? linetoscr_16_shrink2f_aga_genlock : linetoscr_16_shrink2f_aga;
pfield_do_linetoscr_sprite = need_genlock_data ? linetoscr_16_shrink2f_aga_spr_genlock : linetoscr_16_shrink2f_aga_spr;
pfield_do_linetoscr_spriteonly = linetoscr_16_shrink2f_aga_spronly;
break;
case 4:
pfield_do_linetoscr_normal = need_genlock_data ? linetoscr_32_shrink2f_aga_genlock : linetoscr_32_shrink2f_aga;
pfield_do_linetoscr_sprite = need_genlock_data ? linetoscr_32_shrink2f_aga_spr_genlock : linetoscr_32_shrink2f_aga_spr;
pfield_do_linetoscr_spriteonly = linetoscr_32_shrink2f_aga_spronly;
break;
}
} else {
switch (gfxvidinfo.drawbuffer.pixbytes) {
case 2:
pfield_do_linetoscr_normal = need_genlock_data ? linetoscr_16_shrink2_aga_genlock : linetoscr_16_shrink2_aga;
pfield_do_linetoscr_sprite = need_genlock_data ? linetoscr_16_shrink2_aga_spr_genlock : linetoscr_16_shrink2_aga_spr;
pfield_do_linetoscr_spriteonly = linetoscr_16_shrink2_aga_spronly;
break;
case 4:
pfield_do_linetoscr_normal = need_genlock_data ? linetoscr_32_shrink2_aga_genlock : linetoscr_32_shrink2_aga;
pfield_do_linetoscr_sprite = need_genlock_data ? linetoscr_32_shrink2_aga_spr_genlock : linetoscr_32_shrink2_aga_spr;
pfield_do_linetoscr_spriteonly = linetoscr_32_shrink2_aga_spronly;
break;
}
}
}
if (get_shdelay_add()) {
pfield_do_linetoscr_shdelay_normal = pfield_do_linetoscr_normal;
pfield_do_linetoscr_shdelay_sprite = pfield_do_linetoscr_sprite;
pfield_do_linetoscr_normal = pfield_do_linetoscr_normal_shdelay;
pfield_do_linetoscr_sprite = pfield_do_linetoscr_sprite_shdelay;
}
}
//#endif /* AGA */
//#ifdef ECS_DENISE
if (!(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA) && ecsshres) {
// TODO: genlock support
if (res_shift == 0) {
switch (gfxvidinfo.drawbuffer.pixbytes) {
case 2:
pfield_do_linetoscr_normal = linetoscr_16_sh;
pfield_do_linetoscr_sprite = linetoscr_16_sh_spr;
break;
case 4:
pfield_do_linetoscr_normal = linetoscr_32_sh;
pfield_do_linetoscr_sprite = linetoscr_32_sh_spr;
break;
}
} else if (res_shift == -1) {
if (SAEV_config.video.lores_mode) {
switch (gfxvidinfo.drawbuffer.pixbytes) {
case 2:
pfield_do_linetoscr_normal = linetoscr_16_shrink1f_sh;
pfield_do_linetoscr_sprite = linetoscr_16_shrink1f_sh_spr;
break;
case 4:
pfield_do_linetoscr_normal = linetoscr_32_shrink1f_sh;
pfield_do_linetoscr_sprite = linetoscr_32_shrink1f_sh_spr;
break;
}
} else {
switch (gfxvidinfo.drawbuffer.pixbytes) {
case 2:
pfield_do_linetoscr_normal = linetoscr_16_shrink1_sh;
pfield_do_linetoscr_sprite = linetoscr_16_shrink1_sh_spr;
break;
case 4:
pfield_do_linetoscr_normal = linetoscr_32_shrink1_sh;
pfield_do_linetoscr_sprite = linetoscr_32_shrink1_sh_spr;
break;
}
}
} else if (res_shift == -2) {
if (SAEV_config.video.lores_mode) {
switch (gfxvidinfo.drawbuffer.pixbytes) {
case 2:
pfield_do_linetoscr_normal = linetoscr_16_shrink2f_sh;
pfield_do_linetoscr_sprite = linetoscr_16_shrink2f_sh_spr;
break;
case 4:
pfield_do_linetoscr_normal = linetoscr_32_shrink2f_sh;
pfield_do_linetoscr_sprite = linetoscr_32_shrink2f_sh_spr;
break;
}
} else {
switch (gfxvidinfo.drawbuffer.pixbytes) {
case 2:
pfield_do_linetoscr_normal = linetoscr_16_shrink2_sh;
pfield_do_linetoscr_sprite = linetoscr_16_shrink2_sh_spr;
break;
case 4:
pfield_do_linetoscr_normal = linetoscr_32_shrink2_sh;
pfield_do_linetoscr_sprite = linetoscr_32_shrink2_sh_spr;
break;
}
}
}
}
//#endif /* ECS_DENISE */
if (!(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA) && !ecsshres) {
if (res_shift == 0) {
switch (gfxvidinfo.drawbuffer.pixbytes) {
case 2:
pfield_do_linetoscr_normal = need_genlock_data ? linetoscr_16_genlock : linetoscr_16;
pfield_do_linetoscr_sprite = need_genlock_data ? linetoscr_16_spr_genlock : linetoscr_16_spr;
break;
case 4:
pfield_do_linetoscr_normal = need_genlock_data ? linetoscr_32_genlock : linetoscr_32;
pfield_do_linetoscr_sprite = need_genlock_data ? linetoscr_32_spr_genlock : linetoscr_32_spr;
break;
}
} else if (res_shift == 2) {
switch (gfxvidinfo.drawbuffer.pixbytes) {
case 2:
pfield_do_linetoscr_normal = need_genlock_data ? linetoscr_16_stretch2_genlock : linetoscr_16_stretch2;
pfield_do_linetoscr_sprite = need_genlock_data ? linetoscr_16_stretch2_spr_genlock : linetoscr_16_stretch2_spr;
break;
case 4:
pfield_do_linetoscr_normal = need_genlock_data ? linetoscr_32_stretch2_genlock : linetoscr_32_stretch2;
pfield_do_linetoscr_sprite = need_genlock_data ? linetoscr_32_stretch2_spr_genlock : linetoscr_32_stretch2_spr;
break;
}
} else if (res_shift == 1) {
switch (gfxvidinfo.drawbuffer.pixbytes) {
case 2:
pfield_do_linetoscr_normal = need_genlock_data ? linetoscr_16_stretch1_genlock : linetoscr_16_stretch1;
pfield_do_linetoscr_sprite = need_genlock_data ? linetoscr_16_stretch1_spr_genlock : linetoscr_16_stretch1_spr;
break;
case 4:
pfield_do_linetoscr_normal = need_genlock_data ? linetoscr_32_stretch1_genlock : linetoscr_32_stretch1;
pfield_do_linetoscr_sprite = need_genlock_data ? linetoscr_32_stretch1_spr_genlock : linetoscr_32_stretch1_spr;
break;
}
} else if (res_shift == -1) {
if (SAEV_config.video.lores_mode) {
switch (gfxvidinfo.drawbuffer.pixbytes) {
case 2:
pfield_do_linetoscr_normal = need_genlock_data ? linetoscr_16_shrink1f_genlock : linetoscr_16_shrink1f;
pfield_do_linetoscr_sprite = need_genlock_data ? linetoscr_16_shrink1f_spr_genlock : linetoscr_16_shrink1f_spr;
break;
case 4:
pfield_do_linetoscr_normal = need_genlock_data ? linetoscr_32_shrink1f_genlock : linetoscr_32_shrink1f;
pfield_do_linetoscr_sprite = need_genlock_data ? linetoscr_32_shrink1f_spr_genlock : linetoscr_32_shrink1f_spr;
break;
}
} else {
switch (gfxvidinfo.drawbuffer.pixbytes) {
case 2:
pfield_do_linetoscr_normal = need_genlock_data ? linetoscr_16_shrink1_genlock : linetoscr_16_shrink1;
pfield_do_linetoscr_sprite = need_genlock_data ? linetoscr_16_shrink1_spr_genlock : linetoscr_16_shrink1_spr;
break;
case 4:
pfield_do_linetoscr_normal = need_genlock_data ? linetoscr_32_shrink1_genlock : linetoscr_32_shrink1;
pfield_do_linetoscr_sprite = need_genlock_data ? linetoscr_32_shrink1_spr_genlock : linetoscr_32_shrink1_spr;
break;
}
}
}
}
}
// left or right AGA border sprite
function pfield_do_linetoscr_bordersprite_aga(start, stop, blank) {
if (blank) {
pfield_do_fill_line(start, stop, blank);
return;
}
pfield_do_linetoscr_spriteonly(src_pixel, start, stop);
}
function dummy_worker(start, stop, blank) {}
var ham_decode_pixel = 0; //int
var ham_lastcolor = 0; //uint
/* Decode HAM in the invisible portion of the display (left of VISIBLE_LEFT_BORDER),
* but don't draw anything in. This is done to prepare HAM_LASTCOLOR for later, when decode_ham runs. */
function init_ham_decoding() {
var unpainted_amiga = unpainted;
ham_decode_pixel = src_pixel;
ham_lastcolor = color_reg_get(colors_for_drawing, 0);
if (!bplham) {
if (unpainted_amiga > 0) {
var pv = pixdata.apixels[ham_decode_pixel + unpainted_amiga - 1];
//#ifdef AGA
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA)
ham_lastcolor = colors_for_drawing.color_regs_aga[pv ^ bplxor] & 0xffffff;
else
//#endif
ham_lastcolor = colors_for_drawing.color_regs_ecs[pv] & 0xfff;
}
//#ifdef AGA
} else if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA) {
if (bplplanecnt >= 7) { /* AGA mode HAM8 */
while (unpainted_amiga-- > 0) {
var pv = pixdata.apixels[ham_decode_pixel++] ^ bplxor;
switch (pv & 0x3) {
case 0x0: ham_lastcolor = colors_for_drawing.color_regs_aga[pv >> 2] & 0xffffff; break;
case 0x1: ham_lastcolor &= 0xFFFF03; ham_lastcolor |= (pv & 0xFC); break;
case 0x2: ham_lastcolor &= 0x03FFFF; ham_lastcolor |= (pv & 0xFC) << 16; break;
case 0x3: ham_lastcolor &= 0xFF03FF; ham_lastcolor |= (pv & 0xFC) << 8; break;
}
}
} else { /* AGA mode HAM6 */
while (unpainted_amiga-- > 0) {
var pv = pixdata.apixels[ham_decode_pixel++] ^ bplxor;
switch (pv & 0x30) {
case 0x00: ham_lastcolor = colors_for_drawing.color_regs_aga[pv] & 0xffffff; break;
case 0x10: ham_lastcolor &= 0xFFFF00; ham_lastcolor |= (pv & 0xF) << 4; break;
case 0x20: ham_lastcolor &= 0x00FFFF; ham_lastcolor |= (pv & 0xF) << 20; break;
case 0x30: ham_lastcolor &= 0xFF00FF; ham_lastcolor |= (pv & 0xF) << 12; break;
}
}
}
//#endif
} else {
/* OCS/ECS mode HAM6 */
while (unpainted_amiga-- > 0) {
var pv = pixdata.apixels[ham_decode_pixel++];
switch (pv & 0x30) {
case 0x00: ham_lastcolor = colors_for_drawing.color_regs_ecs[pv] & 0xfff; break;
case 0x10: ham_lastcolor &= 0xFF0; ham_lastcolor |= (pv & 0xF); break;
case 0x20: ham_lastcolor &= 0x0FF; ham_lastcolor |= (pv & 0xF) << 8; break;
case 0x30: ham_lastcolor &= 0xF0F; ham_lastcolor |= (pv & 0xF) << 4; break;
}
}
}
}
function decode_ham(pix, stoppos, blank) {
var todraw_amiga = res_shift_from_window(stoppos - pix);
var hdp = ham_decode_pixel;
if (!bplham) {
while (todraw_amiga-- > 0) {
var pv = pixdata.apixels[ham_decode_pixel];
//#ifdef AGA
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA)
ham_lastcolor = colors_for_drawing.color_regs_aga[pv ^ bplxor] & 0xffffff;
else
//#endif
ham_lastcolor = colors_for_drawing.color_regs_ecs[pv] & 0xfff;
ham_linebuf[ham_decode_pixel++] = ham_lastcolor;
}
//#ifdef AGA
} else if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA) {
if (bplplanecnt >= 7) { /* AGA mode HAM8 */
while (todraw_amiga-- > 0) {
var pv = pixdata.apixels[ham_decode_pixel] ^ bplxor;
switch (pv & 0x3) {
case 0x0: ham_lastcolor = colors_for_drawing.color_regs_aga[pv >> 2] & 0xffffff; break;
case 0x1: ham_lastcolor &= 0xFFFF03; ham_lastcolor |= (pv & 0xFC); break;
case 0x2: ham_lastcolor &= 0x03FFFF; ham_lastcolor |= (pv & 0xFC) << 16; break;
case 0x3: ham_lastcolor &= 0xFF03FF; ham_lastcolor |= (pv & 0xFC) << 8; break;
}
ham_linebuf[ham_decode_pixel++] = ham_lastcolor;
}
} else { /* AGA mode HAM6 */
while (todraw_amiga-- > 0) {
var pv = pixdata.apixels[ham_decode_pixel] ^ bplxor;
switch (pv & 0x30) {
case 0x00: ham_lastcolor = colors_for_drawing.color_regs_aga[pv] & 0xffffff; break;
case 0x10: ham_lastcolor &= 0xFFFF00; ham_lastcolor |= (pv & 0xF) << 4; break;
case 0x20: ham_lastcolor &= 0x00FFFF; ham_lastcolor |= (pv & 0xF) << 20; break;
case 0x30: ham_lastcolor &= 0xFF00FF; ham_lastcolor |= (pv & 0xF) << 12; break;
}
ham_linebuf[ham_decode_pixel++] = ham_lastcolor;
}
}
//#endif
} else {
/* OCS/ECS mode HAM6 */
while (todraw_amiga-- > 0) {
var pv = pixdata.apixels[ham_decode_pixel];
switch (pv & 0x30) {
case 0x00: ham_lastcolor = colors_for_drawing.color_regs_ecs[pv] & 0xfff; break;
case 0x10: ham_lastcolor &= 0xFF0; ham_lastcolor |= (pv & 0xF); break;
case 0x20: ham_lastcolor &= 0x0FF; ham_lastcolor |= (pv & 0xF) << 8; break;
case 0x30: ham_lastcolor &= 0xF0F; ham_lastcolor |= (pv & 0xF) << 4; break;
}
ham_linebuf[ham_decode_pixel++] = ham_lastcolor;
}
}
}
/*function erase_ham_right_border(pix, stoppos, blank) {
if (stoppos < playfield_end)
return;
// erase right border in HAM modes or old HAM data may be visible
// if DDFSTOP < DIWSTOP (Uridium II title screen)
var todraw_amiga = res_shift_from_window(stoppos - pix);
while (todraw_amiga-- > 0)
ham_linebuf[ham_decode_pixel++] = 0;
}*/
function gen_pfield_tables() {
if (dblpf_ms1 !== null)
return;
dblpf_ms1 = new Array(256)
dblpf_ms2 = new Array(256)
dblpf_ms = new Array(256);
dblpf_ind1 = new Array(256)
dblpf_ind2 = new Array(256);
dblpf_2nd1 = new Array(256)
dblpf_2nd2 = new Array(256);
//#ifdef AGA
dblpf_ind1_aga = new Array(256);
dblpf_ind2_aga = new Array(256);
//#endif
sprite_offs = new Array(256);
clxtab = new Uint32Array(256);
for (var i = 0; i < 256; i++) {
var plane1 = ((i >> 0) & 1) | ((i >> 1) & 2) | ((i >> 2) & 4) | ((i >> 3) & 8);
var plane2 = ((i >> 1) & 1) | ((i >> 2) & 2) | ((i >> 3) & 4) | ((i >> 4) & 8);
dblpf_2nd1[i] = plane1 == 0 && plane2 != 0;
dblpf_2nd2[i] = plane2 != 0;
//#ifdef AGA
dblpf_ind1_aga[i] = plane1 == 0 ? plane2 : plane1;
dblpf_ind2_aga[i] = plane2 == 0 ? plane1 : plane2;
//#endif
dblpf_ms1[i] = plane1 == 0 ? (plane2 == 0 ? 16 : 8) : 0;
dblpf_ms2[i] = plane2 == 0 ? (plane1 == 0 ? 16 : 0) : 8;
dblpf_ms[i] = i == 0 ? 16 : 8;
if (plane2 > 0)
plane2 += 8;
dblpf_ind1[i] = i >= 128 ? i & 0x7F : (plane1 == 0 ? plane2 : plane1);
dblpf_ind2[i] = i >= 128 ? i & 0x7F : (plane2 == 0 ? plane1 : plane2);
// Hack for OCS/ECS-only dualplayfield chipset bug.
// If PF2P2 is invalid (>5), playfield color becomes transparent but
// playfield still hides playfield under it! (if plfpri is set)
if (i & 64) {
dblpf_ind2[i] = 0;
dblpf_ind1[i] = 0;
}
sprite_offs[i] = (i & 15) ? 0 : 2;
clxtab[i] = ((((i & 3) && (i & 12)) << 9)
| (((i & 3) && (i & 48)) << 10)
| (((i & 3) && (i & 192)) << 11)
| (((i & 12) && (i & 48)) << 12)
| (((i & 12) && (i & 192)) << 13)
| (((i & 48) && (i & 192)) << 14));
}
//memset(all_ones, 0xff, MAX_PIXELS_PER_LINE);
//SAEF_memset(all_ones,0, 0xff, MAX_PIXELS_PER_LINE);
}
/* When looking at this function and the ones that inline it, bear in mind
what an optimizing compiler will do with this code. All callers of this
function only pass in constant arguments (except for E). This means
that many of the if statements will go away completely after inlining. */
/*STATIC_INLINE void draw_sprites_1 (struct sprite_entry *e, int dualpf, int has_attach) {
uae_u16 *buf = spixels + e->first_pixel;
uae_u8 *stbuf = spixstate.bytes + e->first_pixel;
int spr_pos, pos;
buf -= e->pos;
stbuf -= e->pos;
spr_pos = e->pos + ((DIW_DDF_OFFSET - DISPLAY_LEFT_SHIFT) << sprite_buffer_res);
if (spr_pos < sprite_first_x)
sprite_first_x = spr_pos;
for (pos = e->pos; pos < e->max; pos++, spr_pos++) {
if (spr_pos >= 0 && spr_pos < MAX_PIXELS_PER_LINE) {
spritepixels[spr_pos].data = buf[pos];
spritepixels[spr_pos].stdata = stbuf[pos];
spritepixels[spr_pos].attach = has_attach;
}
}
if (spr_pos > sprite_last_x)
sprite_last_x = spr_pos;
}*/
function draw_sprites_1(e, dualpf, has_attach) {
/*uae_u16 *buf = spixels + e->first_pixel;
uae_u8 *stbuf = spixstate.bytes + e->first_pixel;
buf -= e->pos;
stbuf -= e->pos;*/
var spr_pos = e.pos + ((DIW_DDF_OFFSET - DISPLAY_LEFT_SHIFT) << sprite_buffer_res);
if (spr_pos < sprite_first_x)
sprite_first_x = spr_pos;
for (var pos = e.pos; pos < e.max; pos++, spr_pos++) {
if (spr_pos >= 0 && spr_pos < MAX_PIXELS_PER_LINE) {
//spritepixels[spr_pos].data = buf[pos];
//spritepixels[spr_pos].stdata = stbuf[pos];
//spritepixels[spr_pos].attach = has_attach;
spritepixels[spr_pos].data = spixels[e.first_pixel - e.pos + pos];
spritepixels[spr_pos].stdata = spixstate.bytes[e.first_pixel - e.pos + pos];
spritepixels[spr_pos].attach = has_attach;
}
}
if (spr_pos > sprite_last_x)
sprite_last_x = spr_pos;
}
/* OPT inline, ok
function draw_sprites_normal_sp_nat(e) { draw_sprites_1(e, 0, 0); }
function draw_sprites_normal_dp_nat(e) { draw_sprites_1(e, 1, 0); }
function draw_sprites_normal_sp_at(e) { draw_sprites_1(e, 0, 1); }
function draw_sprites_normal_dp_at(e) { draw_sprites_1(e, 1, 1); }
function draw_sprites_ecs(e) {
if (e->has_attached) {
if (bpldualpf)
draw_sprites_normal_dp_at(e);
else
draw_sprites_normal_sp_at(e);
} else {
if (bpldualpf)
draw_sprites_normal_dp_nat(e);
else
draw_sprites_normal_sp_nat(e);
}
}*/
/*OPT inline, ok
function draw_sprites_ecs(e) {
draw_sprites_1(e, bpldualpf, e.has_attached);
}
//#ifdef AGA
function draw_sprites_aga(e, aga) {
draw_sprites_1(e, bpldualpf, e.has_attached);
}
//#endif*/
//#ifdef AGA
/* clear possible bitplane data outside DIW area */
function clear_bitplane_border_aga() {
const v = 0;
var shift = res_shift;
var i, start, end;
if (shift < 0) {
shift = -shift;
start = pixels_offset + (playfield_start << shift);
end = start + ((real_playfield_start - playfield_start) << shift);
for (i = start; i < end; i++) pixdata.apixels[i] = v;
start = pixels_offset + (real_playfield_end << shift),
end = start + ((playfield_end - real_playfield_end) << shift);
for (i = start; i < end; i++) pixdata.apixels[i] = v;
} else {
start = pixels_offset + (playfield_start >> shift);
end = start + ((real_playfield_start - playfield_start) >> shift);
for (i = start; i < end; i++) pixdata.apixels[i] = v;
start = pixels_offset + (real_playfield_end >> shift);
end = start + ((playfield_end - real_playfield_end) >> shift);
for (i = start; i < end; i++) pixdata.apixels[i] = v;
}
}
//#endif
function weird_bitplane_fix(start, end) {
var sh = lores_shift;
//uae_u8 *p = pixdata.apixels + pixels_offset;
start >>= sh;
end >>= sh;
/*if (bplplanecnt == 5 && !bpldualpf) {
for (var i = start; i < end; i++) {
if (p[i] & 16) p[i] = 16;
}
} else if (bpldualpf && bpldualpfpri) {
for (var i = start; i < end; i++) {
if (p[i] & (2 | 8 | 32)) p[i] |= 0x40;
}
} else if (bpldualpf && !bpldualpfpri) {
for (var i = start; i < end; i++) {
p[i] &= ~(2 | 8 | 32);
}
}*/
if (bplplanecnt == 5 && !bpldualpf) {
/* emulate OCS/ECS only undocumented "SWIV" hardware feature */
for (var i = pixels_offset + start; i < pixels_offset + end; i++) {
if (pixdata.apixels[i] & 16) pixdata.apixels[i] = 16;
}
} else if (bpldualpf && bpldualpfpri) {
/* in dualplayfield mode this feature is even more strange.. */
for (var i = pixels_offset + start; i < pixels_offset + end; i++) {
if (pixdata.apixels[i] & (2 | 8 | 32)) pixdata.apixels[i] |= 0x40;
}
} else if (bpldualpf && !bpldualpfpri) {
for (var i = pixels_offset + start; i < pixels_offset + end; i++) {
pixdata.apixels[i] &= ~(2 | 8 | 32);
}
}
}
/* We use the compiler"s inlining ability to ensure that PLANES is in effect a compile time
constant. That will cause some unnecessary code to be optimized away.
Don't touch this if you don't know what you are doing. */
/*#define MERGE(a,b,mask,shift) do {\
uae_u32 tmp = mask & (a ^ (b >> shift)); \
a ^= tmp; \
b ^= (tmp << shift); \
} while (0)
#define GETLONG(P) (*(uae_u32 *)P)
STATIC_INLINE void pfield_doline_1 (uae_u32 *pixels, int wordcount, int planes) {
while (wordcount-- > 0) {
uae_u32 b0, b1, b2, b3, b4, b5, b6, b7;
b0 = 0, b1 = 0, b2 = 0, b3 = 0, b4 = 0, b5 = 0, b6 = 0, b7 = 0;
switch (planes) {
#ifdef AGA
case 8: b0 = GETLONG (real_bplpt[7]); real_bplpt[7] += 4;
case 7: b1 = GETLONG (real_bplpt[6]); real_bplpt[6] += 4;
#endif
case 6: b2 = GETLONG (real_bplpt[5]); real_bplpt[5] += 4;
case 5: b3 = GETLONG (real_bplpt[4]); real_bplpt[4] += 4;
case 4: b4 = GETLONG (real_bplpt[3]); real_bplpt[3] += 4;
case 3: b5 = GETLONG (real_bplpt[2]); real_bplpt[2] += 4;
case 2: b6 = GETLONG (real_bplpt[1]); real_bplpt[1] += 4;
case 1: b7 = GETLONG (real_bplpt[0]); real_bplpt[0] += 4;
}
MERGE (b0, b1, 0x55555555, 1);
MERGE (b2, b3, 0x55555555, 1);
MERGE (b4, b5, 0x55555555, 1);
MERGE (b6, b7, 0x55555555, 1);
MERGE (b0, b2, 0x33333333, 2);
MERGE (b1, b3, 0x33333333, 2);
MERGE (b4, b6, 0x33333333, 2);
MERGE (b5, b7, 0x33333333, 2);
MERGE (b0, b4, 0x0f0f0f0f, 4);
MERGE (b1, b5, 0x0f0f0f0f, 4);
MERGE (b2, b6, 0x0f0f0f0f, 4);
MERGE (b3, b7, 0x0f0f0f0f, 4);
MERGE (b0, b1, 0x00ff00ff, 8);
MERGE (b2, b3, 0x00ff00ff, 8);
MERGE (b4, b5, 0x00ff00ff, 8);
MERGE (b6, b7, 0x00ff00ff, 8);
MERGE (b0, b2, 0x0000ffff, 16);
do_put_mem_long (pixels, b0);
do_put_mem_long (pixels + 4, b2);
MERGE (b1, b3, 0x0000ffff, 16);
do_put_mem_long (pixels + 2, b1);
do_put_mem_long (pixels + 6, b3);
MERGE (b4, b6, 0x0000ffff, 16);
do_put_mem_long (pixels + 1, b4);
do_put_mem_long (pixels + 5, b6);
MERGE (b5, b7, 0x0000ffff, 16);
do_put_mem_long (pixels + 3, b5);
do_put_mem_long (pixels + 7, b7);
pixels += 8;
}
}
// See above for comments on inlining. These functions should _not_ be inlined themselves.
static void NOINLINE pfield_doline_n1 (uae_u32 *data, int count) { pfield_doline_1 (data, count, 1); }
static void NOINLINE pfield_doline_n2 (uae_u32 *data, int count) { pfield_doline_1 (data, count, 2); }
static void NOINLINE pfield_doline_n3 (uae_u32 *data, int count) { pfield_doline_1 (data, count, 3); }
static void NOINLINE pfield_doline_n4 (uae_u32 *data, int count) { pfield_doline_1 (data, count, 4); }
static void NOINLINE pfield_doline_n5 (uae_u32 *data, int count) { pfield_doline_1 (data, count, 5); }
static void NOINLINE pfield_doline_n6 (uae_u32 *data, int count) { pfield_doline_1 (data, count, 6); }
#ifdef AGA
static void NOINLINE pfield_doline_n7 (uae_u32 *data, int count) { pfield_doline_1 (data, count, 7); }
static void NOINLINE pfield_doline_n8 (uae_u32 *data, int count) { pfield_doline_1 (data, count, 8); }
#endif
static void pfield_doline (int lineno) {
int wordcount = dp_for_drawing->plflinelen;
uae_u32 *data = pixdata.apixels_l + MAX_PIXELS_PER_LINE / 4;
#ifdef SMART_UPDATE
#define DATA_POINTER(n) ((debug_bpl_mask & (1 << n)) ? (line_data[lineno] + (n) * MAX_WORDS_PER_LINE * 2) : (debug_bpl_mask_one ? all_ones : all_zeros))
real_bplpt[0] = DATA_POINTER (0);
real_bplpt[1] = DATA_POINTER (1);
real_bplpt[2] = DATA_POINTER (2);
real_bplpt[3] = DATA_POINTER (3);
real_bplpt[4] = DATA_POINTER (4);
real_bplpt[5] = DATA_POINTER (5);
#ifdef AGA
real_bplpt[6] = DATA_POINTER (6);
real_bplpt[7] = DATA_POINTER (7);
#endif
#endif
switch (bplplanecnt) {
default: break;
case 0: memset (data, 0, wordcount * 32); break;
case 1: pfield_doline_n1 (data, wordcount); break;
case 2: pfield_doline_n2 (data, wordcount); break;
case 3: pfield_doline_n3 (data, wordcount); break;
case 4: pfield_doline_n4 (data, wordcount); break;
case 5: pfield_doline_n5 (data, wordcount); break;
case 6: pfield_doline_n6 (data, wordcount); break;
#ifdef AGA
case 7: pfield_doline_n7 (data, wordcount); break;
case 8: pfield_doline_n8 (data, wordcount); break;
#endif
}
if (refresh_indicator_buffer && refresh_indicator_height > lineno) {
uae_u8 *opline = refresh_indicator_buffer + lineno * MAX_PIXELS_PER_LINE * 2;
wordcount *= 32;
if (!memcmp(opline, data, wordcount)) {
if (refresh_indicator_changed[lineno] != 0xff) {
refresh_indicator_changed[lineno]++;
if (refresh_indicator_changed[lineno] > refresh_indicator_changed_prev[lineno]) {
refresh_indicator_changed_prev[lineno] = refresh_indicator_changed[lineno];
}
}
} else {
memcpy(opline, data, wordcount);
if (refresh_indicator_changed[lineno] != refresh_indicator_changed_prev[lineno])
refresh_indicator_changed_prev[lineno] = 0;
refresh_indicator_changed[lineno] = 0;
}
}
}*/
const PLANE_OFFS1 = MAX_WORDS_PER_LINE_FULL * 1;
const PLANE_OFFS2 = MAX_WORDS_PER_LINE_FULL * 2;
const PLANE_OFFS3 = MAX_WORDS_PER_LINE_FULL * 3;
const PLANE_OFFS4 = MAX_WORDS_PER_LINE_FULL * 4;
const PLANE_OFFS5 = MAX_WORDS_PER_LINE_FULL * 5;
const PLANE_OFFS6 = MAX_WORDS_PER_LINE_FULL * 6;
const PLANE_OFFS7 = MAX_WORDS_PER_LINE_FULL * 7;
function pfield_doline(lineno) {
var wordcount = dp_for_drawing.plflinelen;
//var pixels = MAX_PIXELS_PER_LINE;
var pixels_l = MAX_PIXELS_PER_LINE >> 2;
if (bplplanecnt == 0) {
//for (var i = pixels, j = pixels + wordcount * 32; i < j; i++) pixdata.apixels[i] = 0;
for (var i = pixels_l, j = pixels_l + wordcount * 8; i < j; i++) pixdata.apixels_l[i] = 0;
return;
}
var data = line_data[lineno];
var off0 = 0;
var off1 = PLANE_OFFS1;
var off2 = PLANE_OFFS2;
var off3 = PLANE_OFFS3;
var off4 = PLANE_OFFS4;
var off5 = PLANE_OFFS5;
var off6 = PLANE_OFFS6;
var off7 = PLANE_OFFS7;
while (wordcount-- > 0) {
var b0 = 0, b1 = 0, b2 = 0, b3 = 0, b4 = 0, b5 = 0, b6 = 0, b7 = 0; //u32
switch (bplplanecnt) {
case 8: b0 = data[off7++];
case 7: b1 = data[off6++];
case 6: b2 = data[off5++];
case 5: b3 = data[off4++];
case 4: b4 = data[off3++];
case 3: b5 = data[off2++];
case 2: b6 = data[off1++];
case 1: b7 = data[off0++];
}
var tmp = (b0 ^ (b1 >>> 1)) & 0x55555555; b0 ^= tmp; b1 ^= (tmp << 1);
tmp = (b2 ^ (b3 >>> 1)) & 0x55555555; b2 ^= tmp; b3 ^= (tmp << 1);
tmp = (b4 ^ (b5 >>> 1)) & 0x55555555; b4 ^= tmp; b5 ^= (tmp << 1);
tmp = (b6 ^ (b7 >>> 1)) & 0x55555555; b6 ^= tmp; b7 ^= (tmp << 1);
tmp = (b0 ^ (b2 >>> 2)) & 0x33333333; b0 ^= tmp; b2 ^= (tmp << 2);
tmp = (b1 ^ (b3 >>> 2)) & 0x33333333; b1 ^= tmp; b3 ^= (tmp << 2);
tmp = (b4 ^ (b6 >>> 2)) & 0x33333333; b4 ^= tmp; b6 ^= (tmp << 2);
tmp = (b5 ^ (b7 >>> 2)) & 0x33333333; b5 ^= tmp; b7 ^= (tmp << 2);
tmp = (b0 ^ (b4 >>> 4)) & 0x0f0f0f0f; b0 ^= tmp; b4 ^= (tmp << 4);
tmp = (b1 ^ (b5 >>> 4)) & 0x0f0f0f0f; b1 ^= tmp; b5 ^= (tmp << 4);
tmp = (b2 ^ (b6 >>> 4)) & 0x0f0f0f0f; b2 ^= tmp; b6 ^= (tmp << 4);
tmp = (b3 ^ (b7 >>> 4)) & 0x0f0f0f0f; b3 ^= tmp; b7 ^= (tmp << 4);
tmp = (b0 ^ (b1 >>> 8)) & 0x00ff00ff; b0 ^= tmp; b1 ^= (tmp << 8);
tmp = (b2 ^ (b3 >>> 8)) & 0x00ff00ff; b2 ^= tmp; b3 ^= (tmp << 8);
tmp = (b4 ^ (b5 >>> 8)) & 0x00ff00ff; b4 ^= tmp; b5 ^= (tmp << 8);
tmp = (b6 ^ (b7 >>> 8)) & 0x00ff00ff; b6 ^= tmp; b7 ^= (tmp << 8);
tmp = (b0 ^ (b2 >>> 16)) & 0x0000ffff; b0 ^= tmp; b2 ^= (tmp << 16);
tmp = (b1 ^ (b3 >>> 16)) & 0x0000ffff; b1 ^= tmp; b3 ^= (tmp << 16);
tmp = (b4 ^ (b6 >>> 16)) & 0x0000ffff; b4 ^= tmp; b6 ^= (tmp << 16);
tmp = (b5 ^ (b7 >>> 16)) & 0x0000ffff; b5 ^= tmp; b7 ^= (tmp << 16);
/*pixdata.apixels[pixels ] = b0 >>> 24;
pixdata.apixels[pixels + 1] = b0 >>> 16;
pixdata.apixels[pixels + 2] = b0 >>> 8;
pixdata.apixels[pixels + 3] = b0;
pixdata.apixels[pixels + 4] = b4 >>> 24;
pixdata.apixels[pixels + 5] = b4 >>> 16;
pixdata.apixels[pixels + 6] = b4 >>> 8;
pixdata.apixels[pixels + 7] = b4;
pixdata.apixels[pixels + 8] = b1 >>> 24;
pixdata.apixels[pixels + 9] = b1 >>> 16;
pixdata.apixels[pixels + 10] = b1 >>> 8;
pixdata.apixels[pixels + 11] = b1;
pixdata.apixels[pixels + 12] = b5 >>> 24;
pixdata.apixels[pixels + 13] = b5 >>> 16;
pixdata.apixels[pixels + 14] = b5 >>> 8;
pixdata.apixels[pixels + 15] = b5;
pixdata.apixels[pixels + 16] = b2 >>> 24;
pixdata.apixels[pixels + 17] = b2 >>> 16;
pixdata.apixels[pixels + 18] = b2 >>> 8;
pixdata.apixels[pixels + 19] = b2;
pixdata.apixels[pixels + 20] = b6 >>> 24;
pixdata.apixels[pixels + 21] = b6 >>> 16;
pixdata.apixels[pixels + 22] = b6 >>> 8;
pixdata.apixels[pixels + 23] = b6;
pixdata.apixels[pixels + 24] = b3 >>> 24;
pixdata.apixels[pixels + 25] = b3 >>> 16;
pixdata.apixels[pixels + 26] = b3 >>> 8;
pixdata.apixels[pixels + 27] = b3;
pixdata.apixels[pixels + 28] = b7 >>> 24;
pixdata.apixels[pixels + 29] = b7 >>> 16;
pixdata.apixels[pixels + 30] = b7 >>> 8;
pixdata.apixels[pixels + 31] = b7;
pixels += 32;
*/
if (SAEC_LITTLE_ENDIAN) { //byte-swap
pixdata.apixels_l[pixels_l ] = ((b0 & 0x000000ff) << 24) | ((b0 & 0x0000ff00) << 8) | ((b0 & 0x00ff0000) >>> 8) | ((b0 & 0xff000000) >>> 24);
pixdata.apixels_l[pixels_l + 1] = ((b4 & 0x000000ff) << 24) | ((b4 & 0x0000ff00) << 8) | ((b4 & 0x00ff0000) >>> 8) | ((b4 & 0xff000000) >>> 24);
pixdata.apixels_l[pixels_l + 2] = ((b1 & 0x000000ff) << 24) | ((b1 & 0x0000ff00) << 8) | ((b1 & 0x00ff0000) >>> 8) | ((b1 & 0xff000000) >>> 24);
pixdata.apixels_l[pixels_l + 3] = ((b5 & 0x000000ff) << 24) | ((b5 & 0x0000ff00) << 8) | ((b5 & 0x00ff0000) >>> 8) | ((b5 & 0xff000000) >>> 24);
pixdata.apixels_l[pixels_l + 4] = ((b2 & 0x000000ff) << 24) | ((b2 & 0x0000ff00) << 8) | ((b2 & 0x00ff0000) >>> 8) | ((b2 & 0xff000000) >>> 24);
pixdata.apixels_l[pixels_l + 5] = ((b6 & 0x000000ff) << 24) | ((b6 & 0x0000ff00) << 8) | ((b6 & 0x00ff0000) >>> 8) | ((b6 & 0xff000000) >>> 24);
pixdata.apixels_l[pixels_l + 6] = ((b3 & 0x000000ff) << 24) | ((b3 & 0x0000ff00) << 8) | ((b3 & 0x00ff0000) >>> 8) | ((b3 & 0xff000000) >>> 24);
pixdata.apixels_l[pixels_l + 7] = ((b7 & 0x000000ff) << 24) | ((b7 & 0x0000ff00) << 8) | ((b7 & 0x00ff0000) >>> 8) | ((b7 & 0xff000000) >>> 24);
} else {
pixdata.apixels_l[pixels_l ] = b0;
pixdata.apixels_l[pixels_l + 1] = b4;
pixdata.apixels_l[pixels_l + 2] = b1;
pixdata.apixels_l[pixels_l + 3] = b5;
pixdata.apixels_l[pixels_l + 4] = b2;
pixdata.apixels_l[pixels_l + 5] = b6;
pixdata.apixels_l[pixels_l + 6] = b3;
pixdata.apixels_l[pixels_l + 7] = b7;
}
pixels_l += 8;
}
if (refresh_indicator_buffer !== null && refresh_indicator_height > lineno) {
wordcount = dp_for_drawing.plflinelen;
//uae_u8 *opline = refresh_indicator_buffer + lineno * MAX_PIXELS_PER_LINE * 2;
//wordcount *= 32;
var opline = new Uint32Array(refresh_indicator_buffer, lineno * MAX_PIXELS_PER_LINE * 2);
wordcount *= 8; // * 32 / 4
var same = true;
for (var i = 0; i < wordcount; i++) {
if (opline[i] != data[i]) {
same = false;
break;
}
}
//if (!memcmp(opline, data, wordcount)) {
if (same) {
if (refresh_indicator_changed[lineno] != 0xff) {
refresh_indicator_changed[lineno]++;
if (refresh_indicator_changed[lineno] > refresh_indicator_changed_prev[lineno]) {
refresh_indicator_changed_prev[lineno] = refresh_indicator_changed[lineno];
}
}
} else {
//memcpy(opline, data, wordcount);
for (i = 0; i < wordcount; i++)
opline[i] = data[i];
if (refresh_indicator_changed[lineno] != refresh_indicator_changed_prev[lineno])
refresh_indicator_changed_prev[lineno] = 0;
refresh_indicator_changed[lineno] = 0;
}
}
}
var oldbufmem = null; //u8 *
var oldheight = 0, oldpitch = 0; //int
var oldgenlock = false; //bool
function init_row_map() {
//static uae_u8 *oldbufmem;
//static int oldheight, oldpitch;
//static bool oldgenlock;
var vb = gfxvidinfo.drawbuffer;
var bpp16 = vb.pixbytes == 2; //OWN
var i, j;
if (vb.height_allocated > SAEC_Video_MAX_UAE_HEIGHT) {
SAEF_fatal(SAEE_Internal, "playfield.init_row_map() resolution too high, aborting...");
//abort();
}
if (row_map === null) {
//row_map = xmalloc(uae_u8*, SAEC_Video_MAX_UAE_HEIGHT + 1);
//row_map_genlock = xmalloc(uae_u8*, SAEC_Video_MAX_UAE_HEIGHT + 1);
row_map = new Array(SAEC_Video_MAX_UAE_HEIGHT + 1);
//row_map_genlock = new Array(SAEC_Video_MAX_UAE_HEIGHT + 1);
}
if (oldbufmem !== null && oldbufmem === vb.bufmem &&
oldheight == vb.height_allocated &&
oldpitch == vb.rowbytes &&
oldgenlock == init_genlock_data
) return;
/*xfree(row_map_genlock_buffer);
row_map_genlock_buffer = null;
if (init_genlock_data)
row_map_genlock_buffer = xcalloc(uae_u8, vb.width_allocated * (vb.height_allocated + 2));*/
//xfree(row_map_color_burst_buffer);
row_map_color_burst_buffer = null;
/*if (currprefs.cs_color_burst) {
//row_map_color_burst_buffer = xcalloc(uae_u8, vb.height_allocated + 2);
row_map_color_burst_buffer = new Uint8Array(vb.height_allocated + 2);
}*/
j = oldheight == 0 ? SAEC_Video_MAX_UAE_HEIGHT : oldheight;
for (i = vb.height_allocated; i < SAEC_Video_MAX_UAE_HEIGHT + 1 && i < j + 1; i++) {
//row_map[i] = row_tmp;
if (bpp16)
row_map[i] = new Uint16Array(row_tmp);
else
row_map[i] = new Uint32Array(row_tmp);
//row_map_genlock[i] = row_tmp;
}
if (vb.bufmem !== null) {
var maxbytes = vb.bufmem.byteLength;
//try {
for (i = 0, j = vb.bufmem_pos; i < vb.height_allocated; i++, j += vb.rowbytes) {
//row_map[i] = vb.bufmem + j; //ATT +
if (j + vb.rowbytes <= maxbytes) {
if (bpp16)
row_map[i] = new Uint16Array(vb.bufmem, j, vb.rowbytes >> 1);
else
row_map[i] = new Uint32Array(vb.bufmem, j, vb.rowbytes >> 2);
} else {
if (bpp16)
row_map[i] = new Uint16Array(row_tmp);
else
row_map[i] = new Uint32Array(row_tmp);
}
/*if (init_genlock_data)
row_map_genlock[i] = row_map_genlock_buffer + vb.width_allocated * (i + 1); //ATT +
else
row_map_genlock[i] = null;*/
}
/*} catch(e) {
throw e;
}*/
}
oldbufmem = vb.bufmem;
oldheight = vb.height_allocated;
oldpitch = vb.rowbytes;
oldgenlock = init_genlock_data;
}
SAER_Playfield_init_row_map = init_row_map;
function init_aspect_maps() {
var i, maxl, h;
h = gfxvidinfo.drawbuffer.height_allocated;
if (h == 0) /* Do nothing if the gfx driver hasn"t initialized the screen yet */
return;
linedbld = linedbl = SAEV_config.video.vresolution;
if (doublescan > 0 && interlace_seen <= 0) {
linedbl = 0;
linedbld = 1;
}
//if (native2amiga_line_map) xfree (native2amiga_line_map);
//if (amiga2aspect_line_map) xfree (amiga2aspect_line_map);
/* At least for this array the +1 is necessary. */
//amiga2aspect_line_map = xmalloc (int, (MAXVPOS + 1) * 2 + 1);
//native2amiga_line_map = xmalloc (int, h);
amiga2aspect_line_map = new Array((MAXVPOS + 1) * 2 + 1);
native2amiga_line_map = new Array(h);
maxl = (MAXVPOS + 1) << linedbld;
min_ypos_for_screen = minfirstline << linedbl;
max_drawn_amiga_line = -1;
for (i = 0; i < maxl; i++) {
var v = i - min_ypos_for_screen;
if (v >= h && max_drawn_amiga_line < 0)
max_drawn_amiga_line = v;
if (i < min_ypos_for_screen || v >= h)
v = -1;
amiga2aspect_line_map[i] = v;
}
if (max_drawn_amiga_line < 0)
max_drawn_amiga_line = maxl - min_ypos_for_screen;
for (i = 0; i < h; i++)
native2amiga_line_map[i] = -1;
for (i = maxl - 1; i >= min_ypos_for_screen; i--) {
if (amiga2aspect_line_map[i] == -1)
continue;
for (var j = amiga2aspect_line_map[i]; j < h && native2amiga_line_map[j] == -1; j++)
native2amiga_line_map[j] = i >> linedbl;
}
gfxvidinfo.xchange = 1 << (RES_MAX - SAEV_config.video.hresolution);
gfxvidinfo.ychange = linedbl ? 1 : 2;
visible_left_start = 0;
visible_right_stop = MAX_STOP;
visible_top_start = 0;
visible_bottom_stop = MAX_STOP;
set_blanking_limits();
}
/* A raster line has been built in the graphics buffer. Tell the graphics code to do anything necessary to display it. */
/* OWN flush_line() and flush_block() is not used
function do_flush_line(vb, lineno) { //do_flush_line_1()
if (lineno < first_drawn_line)
first_drawn_line = lineno;
if (lineno > last_drawn_line)
last_drawn_line = lineno;
if (gfxvidinfo.maxblocklines == 0) {
SAER.video.flush_line(vb, lineno);
} else {
if ((last_block_line + 2) < lineno) {
if (first_block_line != NO_BLOCK)
SAER.video.flush_block(vb, first_block_line, last_block_line);
first_block_line = lineno;
}
last_block_line = lineno;
if (last_block_line - first_block_line >= gfxvidinfo.maxblocklines) {
SAER.video.flush_block(vb, first_block_line, last_block_line);
first_block_line = last_block_line = NO_BLOCK;
}
}
}*/
/*function do_flush_line(vb, lineno) { //OPT inline ok
if (vb) do_flush_line_1(vb, lineno);
}*/
/* One drawing frame has been finished. Tell the graphics code about it.
* Note that the actual flush_screen() call is a no-op for all reasonable systems. */
function do_flush_screen(vb, start, stop) {
/* TODO: this flush operation is executed outside locked state! Should be corrected. (sjo 26.9.99) */
if (vb !== gfxvidinfo.outbuffer)
return;
/* OWN flush_block() is not used
if (gfxvidinfo.maxblocklines != 0 && first_block_line != NO_BLOCK)
SAER.video.flush_block(vb, first_block_line, last_block_line); */
SAER.video.unlockscr(vb);
/* OWN flush_screen() is not used
if (start <= stop)
SAER.video.flush_screen(vb, start, stop);
else if (isvsync_chipset())
SAER.video.flush_screen(vb, 0, 0); //vsync mode
*/
}
/* We only save hardware registers during the hardware frame. Now, when
* drawing the frame, we expand the data into a slightly more useful form. */
function pfield_expand_dp_bplcon() {
var pfield_mode_changed = false;
bplres = dp_for_drawing.bplres;
bplplanecnt = dp_for_drawing.nr_planes;
bplham = dp_for_drawing.ham_seen;
bplehb = dp_for_drawing.ehb_seen;
if ((SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_DENISE) != 0 && (dp_for_drawing.bplcon2 & 0x0200) != 0)
bplehb = false;
issprites = dip_for_drawing.nr_sprites > 0;
bplcolorburst = (dp_for_drawing.bplcon0 & 0x200) != 0;
if (!bplcolorburst)
bplcolorburst_field = false;
//#ifdef ECS_DENISE
var oecsshres = ecsshres;
ecsshres = bplres == SAEC_Config_Video_HResolution_SuperHiRes && (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_DENISE) != 0 && (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA) == 0;
pfield_mode_changed = oecsshres != ecsshres;
//#endif
plf1pri = dp_for_drawing.bplcon2 & 7;
plf2pri = (dp_for_drawing.bplcon2 >> 3) & 7;
plf_sprite_mask = 0xFFFF0000 << (4 * plf2pri);
plf_sprite_mask |= (0x0000FFFF << (4 * plf1pri)) & 0xFFFF;
plf_sprite_mask >>>= 0; //OWN
bpldualpf = (dp_for_drawing.bplcon0 & 0x400) == 0x400;
bpldualpfpri = (dp_for_drawing.bplcon2 & 0x40) == 0x40;
//#ifdef AGA
// BYPASS: HAM and EHB select bits are ignored
if (bplbypass != ((dp_for_drawing.bplcon0 & 0x20) != 0)) {
bpland = 0xff;
bplbypass = (dp_for_drawing.bplcon0 & 0x20) != 0;
pfield_mode_changed = true;
}
if (bplbypass) {
if (bplham && bplplanecnt == 6)
bpland = 0x0f;
if (bplham && bplplanecnt == 8)
bpland = 0xfc;
bplham = false;
if (bplehb)
bpland = 31;
bplehb = false;
}
bpldualpf2of = (dp_for_drawing.bplcon3 >> 10) & 7;
sbasecol[0] = ((dp_for_drawing.bplcon4 >> 4) & 15) << 4;
sbasecol[1] = ((dp_for_drawing.bplcon4 >> 0) & 15) << 4;
bplxor = dp_for_drawing.bplcon4 >> 8;
var sh = (colors_for_drawing.extra >> CE_SHRES_DELAY) & 3;
if (sh != bpldelay_sh) {
bpldelay_sh = sh;
pfield_mode_changed = true;
}
//#endif
ecs_genlock_features_active = (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_DENISE) && ((dp_for_drawing.bplcon2 & 0x0c00) || ce_is_borderntrans(colors_for_drawing.extra)) ? 1 : 0;
if (ecs_genlock_features_active) {
ecs_genlock_features_colorkey = false;
ecs_genlock_features_mask = 0;
if (dp_for_drawing.bplcon3 & 0x0800) {
ecs_genlock_features_mask = 1 << ((dp_for_drawing.bplcon2 >> 12) & 7);
}
if (dp_for_drawing.bplcon3 & 0x0400) {
ecs_genlock_features_colorkey = true;
}
}
if (pfield_mode_changed)
pfield_set_linetoscr();
}
function isham(bplcon0) {
var p = GET_PLANES(bplcon0);
if (!(bplcon0 & 0x800))
return 0;
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA) {
// AGA only has 6 or 8 plane HAM
if (p == 6 || p == 8)
return 1;
} else {
// OCS/ECS also supports 5 plane HAM
if (GET_RES_DENISE(bplcon0) > 0)
return 0;
if (p >= 5)
return 1;
}
return 0;
}
function pfield_expand_dp_bplconx(regno, v) {
if (regno == 0xffff) {
hposblank = 1;
return;
}
regno -= 0x1000;
switch (regno) {
case 0x100: // BPLCON0
dp_for_drawing.bplcon0 = v;
dp_for_drawing.bplres = GET_RES_DENISE(v);
dp_for_drawing.nr_planes = GET_PLANES(v);
dp_for_drawing.ham_seen = isham(v);
break;
case 0x104: // BPLCON2
dp_for_drawing.bplcon2 = v;
break;
//#ifdef ECS_DENISE
case 0x106: // BPLCON3
dp_for_drawing.bplcon3 = v;
break;
//#endif
//#ifdef AGA
case 0x10c: // BPLCON4
dp_for_drawing.bplcon4 = v;
break;
//#endif
}
pfield_expand_dp_bplcon();
set_res_shift(lores_shift - bplres);
}
var drawing_color_matches = 0; //int
//static enum {
const color_match_acolors = 0;
const color_match_full = 1;
//} color_match_type;
var color_match_type = 0;
/* Set up colors_for_drawing to the state at the beginning of the currently drawn line.
Try to avoid copying color tables around whenever possible. */
function adjust_drawing_colors(ctable, need_full) {
if (drawing_color_matches != ctable || need_full < 0) {
if (need_full) {
color_reg_cpy(colors_for_drawing, curr_color_tables[ctable]);
color_match_type = color_match_full;
} else {
for (var i = 0; i < colors_for_drawing.acolors.length; i++)
colors_for_drawing.acolors[i] = curr_color_tables[ctable].acolors[i];
colors_for_drawing.extra = curr_color_tables[ctable].extra;
color_match_type = color_match_acolors;
}
drawing_color_matches = ctable;
} else if (need_full && color_match_type != color_match_full) {
color_reg_cpy(colors_for_drawing, curr_color_tables[ctable]);
color_match_type = color_match_full;
}
}
function playfield_hard_way(worker_pfield, first, last) {
if (first < real_playfield_start) {
var next = last < real_playfield_start ? last : real_playfield_start;
var diff = next - first;
pfield_do_linetoscr_bordersprite_aga(first, next, false);
if (res_shift >= 0)
diff >>= res_shift;
else
diff <<= res_shift;
src_pixel += diff;
first = next;
}
worker_pfield(first, last < real_playfield_end ? last : real_playfield_end, false);
if (last > real_playfield_end)
pfield_do_linetoscr_bordersprite_aga(real_playfield_end, last, false);
}
function do_color_changes(worker_border, worker_pfield, vp) {
var lastpos = visible_left_border;
var endpos = visible_left_border + gfxvidinfo.drawbuffer.inwidth;
for (var i = dip_for_drawing.first_color_change; i <= dip_for_drawing.last_color_change; i++) {
var regno = curr_color_changes[i].regno;
var value = curr_color_changes[i].value;
var nextpos, nextpos_in_range;
if (i == dip_for_drawing.last_color_change)
nextpos = endpos;
else
nextpos = coord_hw_to_window_x(curr_color_changes[i].linepos);
nextpos_in_range = nextpos;
if (nextpos > endpos)
nextpos_in_range = endpos;
// left hblank (left edge to hblank end)
if (nextpos_in_range > lastpos && lastpos < hblank_left_start) {
var t = nextpos_in_range <= hblank_left_start ? nextpos_in_range : hblank_left_start;
worker_border(lastpos, t, true);
lastpos = t;
}
// left border (hblank end to playfield start)
if (nextpos_in_range > lastpos && lastpos < playfield_start) {
var t = nextpos_in_range <= playfield_start ? nextpos_in_range : playfield_start;
worker_border(lastpos, t, false);
lastpos = t;
}
// playfield
if (nextpos_in_range > lastpos && lastpos >= playfield_start && lastpos < playfield_end) {
var t = nextpos_in_range <= playfield_end ? nextpos_in_range : playfield_end;
if (plf2pri > 5 && !(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA))
weird_bitplane_fix(lastpos, t);
if (bplxor && may_require_hard_way && worker_pfield !== pfield_do_linetoscr_bordersprite_aga)
playfield_hard_way(worker_pfield, lastpos, t);
else
worker_pfield(lastpos, t, false);
lastpos = t;
}
// right border (playfield end to hblank start)
if (nextpos_in_range > lastpos && lastpos >= playfield_end) {
var t = nextpos_in_range <= hblank_right_stop ? nextpos_in_range : hblank_right_stop;
worker_border(lastpos, t, false);
lastpos = t;
}
// right hblank (hblank start to right edge, hblank start may be earlier than playfield end)
if (nextpos_in_range > hblank_right_stop) {
worker_border(hblank_right_stop, nextpos_in_range, true);
lastpos = nextpos_in_range;
}
if (regno >= 0x1000) {
pfield_expand_dp_bplconx(regno, value);
} else if (regno >= 0) {
if (regno == 0 && (value & COLOR_CHANGE_BRDBLANK)) {
colors_for_drawing.extra &= ~(1 << CE_BORDERBLANK);
colors_for_drawing.extra &= ~(1 << CE_BORDERNTRANS);
colors_for_drawing.extra &= ~(1 << CE_BORDERSPRITE);
colors_for_drawing.extra |= (value & 1) != 0 ? (1 << CE_BORDERBLANK) : 0;
colors_for_drawing.extra |= (value & 3) == 2 ? (1 << CE_BORDERSPRITE) : 0;
colors_for_drawing.extra |= (value & 5) == 4 ? (1 << CE_BORDERNTRANS) : 0;
} else if (regno == 0 && (value & COLOR_CHANGE_SHRES_DELAY)) {
colors_for_drawing.extra &= ~(1 << CE_SHRES_DELAY);
colors_for_drawing.extra &= ~(1 << (CE_SHRES_DELAY + 1));
colors_for_drawing.extra |= (value & 3) << CE_SHRES_DELAY;
pfield_expand_dp_bplcon();
} else {
color_reg_set(colors_for_drawing, regno, value);
colors_for_drawing.acolors[regno] = getxcolor(value);
}
}
if (lastpos >= endpos)
break;
}
//#if 1
if (vp < visible_top_start || vp >= visible_bottom_stop) {
// outside of visible area
// Just overwrite with black. Above code needs to run because of custom registers,
// not worth the trouble for separate code path just for max 10 lines or so
worker_border(visible_left_border, visible_left_border + gfxvidinfo.drawbuffer.inwidth, true);
}
//#endif
}
function is_color_changes(di) {
var regno = curr_color_changes[di.first_color_change].regno;
var changes = di.nr_color_changes;
return changes > 1 || (changes == 1 && regno != 0xffff && regno != -1);
}
//enum double_how
const dh_buf = 0;
const dh_line = 1;
const dh_emerg = 2;
function pfield_draw_line(vb, lineno, gfx_ypos, follow_ypos) {
var border = 0;
var do_double = 0;
var have_color_changes;
var dh = 0;
var ls = linestate[lineno];
dp_for_drawing = line_decisions[lineno];
dip_for_drawing = curr_drawinfo[lineno];
if (dp_for_drawing.plfleft >= 0) {
lines_count++;
resolution_count[dp_for_drawing.bplres]++;
}
switch (ls) {
case LINE_REMEMBERED_AS_PREVIOUS: {
// happens when program messes up with VPOSW
if (!warned_pfield_draw_line) {
SAEF_warn("playfield.pfield_draw_line() Shouldn't get here... this is a bug.");
warned_pfield_draw_line++;
}
return;
}
case LINE_BLACK: {
linestate[lineno] = LINE_REMEMBERED_AS_BLACK;
border = -1;
break;
}
case LINE_REMEMBERED_AS_BLACK:
return;
case LINE_AS_PREVIOUS: {
//dp_for_drawing--; //ORG
//dip_for_drawing--; //ORG
dp_for_drawing = line_decisions[lineno - 1];
dip_for_drawing = curr_drawinfo[lineno - 1];
linestate[lineno] = LINE_DONE_AS_PREVIOUS;
if (dp_for_drawing.plfleft < 0)
border = 1;
break;
}
case LINE_DONE_AS_PREVIOUS:
/* fall through */
case LINE_DONE:
return;
case LINE_DECIDED_DOUBLE: {
if (follow_ypos >= 0) {
do_double = 1;
linestate[lineno + 1] = LINE_DONE_AS_PREVIOUS;
}
/* fall through */
}
default:
if (dp_for_drawing.plfleft < 0)
border = 1;
linestate[lineno] = LINE_DONE;
break;
}
have_color_changes = is_color_changes(dip_for_drawing);
xlinebuffer = null;
xlinebuffer_pos = 0; //OWN
if (gfxvidinfo.drawbuffer.linemem !== null) {
dh = dh_line;
if (gfxvidinfo.drawbuffer.pixbytes == 2)
xlinebuffer = new Uint16Array(gfxvidinfo.drawbuffer.linemem);
else
xlinebuffer = new Uint32Array(gfxvidinfo.drawbuffer.linemem);
}
if (xlinebuffer === null && gfxvidinfo.drawbuffer.emergmem !== null && do_double && (border == 0 || have_color_changes)) {
dh = dh_emerg;
if (gfxvidinfo.drawbuffer.pixbytes == 2)
xlinebuffer = new Uint16Array(gfxvidinfo.drawbuffer.emergmem);
else
xlinebuffer = new Uint32Array(gfxvidinfo.drawbuffer.emergmem);
}
if (xlinebuffer === null) {
dh = dh_buf;
xlinebuffer = row_map[gfx_ypos];
}
//xlinebuffer -= linetoscr_x_adjust_pixbytes;
xlinebuffer_pos -= linetoscr_x_adjust_pixels; //OWN
//xlinebuffer_genlock = row_map_genlock[gfx_ypos] - linetoscr_x_adjust_pixels;
if (row_map_color_burst_buffer !== null)
row_map_color_burst_buffer[gfx_ypos] = bplcolorburst;
if (border == 0) {
pfield_expand_dp_bplcon();
pfield_init_linetoscr(false);
pfield_doline(lineno);
adjust_drawing_colors(dp_for_drawing.ctable, dp_for_drawing.ham_seen || bplehb || ecsshres);
/* The problem is that we must call decode_ham() BEFORE we do the sprites. */
if (dp_for_drawing.ham_seen) {
var ohposblank = hposblank;
init_ham_decoding();
do_color_changes(dummy_worker, decode_ham, lineno);
if (have_color_changes) {
// do_color_changes() did color changes, reset colors back to original state
adjust_drawing_colors(dp_for_drawing.ctable, -1);
pfield_expand_dp_bplcon();
}
hposblank = ohposblank;
ham_decode_pixel = src_pixel;
bplham = dp_for_drawing.ham_at_start;
}
if (dip_for_drawing.nr_sprites) {
var i, e;
//#ifdef AGA
if (ce_is_bordersprite(colors_for_drawing.extra) && dp_for_drawing.bordersprite_seen && !ce_is_borderblank(colors_for_drawing.extra))
clear_bitplane_border_aga();
//#endif
/*for (i = 0; i < dip_for_drawing.nr_sprites; i++) {
//#ifdef AGA
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA)
//draw_sprites_aga(curr_sprite_entries + dip_for_drawing.first_sprite_entry + i, 1);
draw_sprites_aga(curr_sprite_entries[dip_for_drawing.first_sprite_entry + i], 1);
else
//#endif
//draw_sprites_ecs(curr_sprite_entries + dip_for_drawing.first_sprite_entry + i);
draw_sprites_ecs(curr_sprite_entries[dip_for_drawing.first_sprite_entry + i]);
}*/
for (i = 0; i < dip_for_drawing.nr_sprites; i++) {
e = curr_sprite_entries[dip_for_drawing.first_sprite_entry + i];
draw_sprites_1(e, bpldualpf, e.has_attached);
}
}
//#ifdef AGA
if (dip_for_drawing.nr_sprites && ce_is_bordersprite(colors_for_drawing.extra) && !ce_is_borderblank(colors_for_drawing.extra) && dp_for_drawing.bordersprite_seen)
do_color_changes(pfield_do_linetoscr_bordersprite_aga, pfield_do_linetoscr_spr, lineno);
else
//#endif
do_color_changes(pfield_do_fill_line, dip_for_drawing.nr_sprites ? pfield_do_linetoscr_spr : pfield_do_linetoscr, lineno);
if (dh == dh_emerg) {
//memcpy(row_map[gfx_ypos], xlinebuffer + linetoscr_x_adjust_pixbytes, gfxvidinfo.drawbuffer.pixbytes * gfxvidinfo.drawbuffer.inwidth);
row_map[gfx_ypos].set(xlinebuffer.subarray(0, gfxvidinfo.drawbuffer.inwidth));
}
//do_flush_line(vb, gfx_ypos);
if (do_double) {
if (dh == dh_emerg) {
//memcpy(row_map[follow_ypos], xlinebuffer + linetoscr_x_adjust_pixbytes, gfxvidinfo.drawbuffer.pixbytes * gfxvidinfo.drawbuffer.inwidth);
row_map[follow_ypos].set(xlinebuffer.subarray(0, gfxvidinfo.drawbuffer.inwidth));
} else if (dh == dh_buf) {
//memcpy(row_map[follow_ypos], row_map[gfx_ypos], gfxvidinfo.drawbuffer.pixbytes * gfxvidinfo.drawbuffer.inwidth);
row_map[follow_ypos].set(row_map[gfx_ypos].subarray(0, gfxvidinfo.drawbuffer.inwidth));
}
/*if (need_genlock_data)
memcpy(row_map_genlock[follow_ypos], row_map_genlock[gfx_ypos], gfxvidinfo.drawbuffer.inwidth);*/
//do_flush_line(vb, follow_ypos);
}
if (dip_for_drawing.nr_sprites)
pfield_erase_hborder_sprites();
} else if (border > 0) { // border > 0: top or bottom border
var dosprites = false;
adjust_drawing_colors(dp_for_drawing.ctable, 0);
//#ifdef AGA /* this makes things complex.. */
if (dp_for_drawing.bordersprite_seen && !ce_is_borderblank(colors_for_drawing.extra) && dip_for_drawing.nr_sprites) {
dosprites = true;
pfield_expand_dp_bplcon();
pfield_init_linetoscr(true);
pfield_erase_vborder_sprites();
}
//#endif
if (!dosprites && !have_color_changes) {
if (dp_for_drawing.plfleft < -1) {
// blanked border line
var tmp = hposblank;
hposblank = 1;
fill_line_border(lineno);
hposblank = tmp;
} else {
// normal border line
fill_line_border(lineno);
}
//do_flush_line(vb, gfx_ypos);
if (do_double) {
if (dh == dh_buf) {
//xlinebuffer = row_map[follow_ypos] - linetoscr_x_adjust_pixbytes;
xlinebuffer = row_map[follow_ypos];
xlinebuffer_pos = 0 - linetoscr_x_adjust_pixels; //OWN
//xlinebuffer_genlock = row_map_genlock[follow_ypos] - linetoscr_x_adjust_pixels;
fill_line_border(lineno);
}
/* If dh == dh_line, do_flush_line will re-use the rendered line from linemem. */
//do_flush_line(vb, follow_ypos);
}
return;
}
//#ifdef AGA
if (dosprites) {
for (var i = 0; i < dip_for_drawing.nr_sprites; i++) {
//draw_sprites_aga(curr_sprite_entries + dip_for_drawing->first_sprite_entry + i, 1);
//draw_sprites_aga(curr_sprite_entries[dip_for_drawing.first_sprite_entry + i], 1);
var e = curr_sprite_entries[dip_for_drawing.first_sprite_entry + i];
draw_sprites_1(e, bpldualpf, e.has_attached);
}
do_color_changes(pfield_do_linetoscr_bordersprite_aga, pfield_do_linetoscr_bordersprite_aga, lineno);
/*#else
if (0) {
#endif*/
} else {
playfield_start = visible_right_border;
playfield_end = visible_right_border;
do_color_changes(pfield_do_fill_line, pfield_do_fill_line, lineno);
}
if (dh == dh_emerg) {
//memcpy(row_map[gfx_ypos], xlinebuffer + linetoscr_x_adjust_pixbytes, gfxvidinfo.drawbuffer.pixbytes * gfxvidinfo.drawbuffer.inwidth);
row_map[gfx_ypos].set(xlinebuffer.subarray(0, gfxvidinfo.drawbuffer.inwidth));
}
//do_flush_line(vb, gfx_ypos);
if (do_double) {
if (dh == dh_emerg) {
//memcpy(row_map[follow_ypos], xlinebuffer + linetoscr_x_adjust_pixbytes, gfxvidinfo.drawbuffer.pixbytes * gfxvidinfo.drawbuffer.inwidth);
row_map[follow_ypos].set(xlinebuffer.subarray(0, gfxvidinfo.drawbuffer.inwidth));
} else if (dh == dh_buf) {
//memcpy(row_map[follow_ypos], row_map[gfx_ypos], gfxvidinfo.drawbuffer.pixbytes * gfxvidinfo.drawbuffer.inwidth);
row_map[follow_ypos].set(row_map[gfx_ypos].subarray(0, gfxvidinfo.drawbuffer.inwidth));
}
/*if (need_genlock_data)
memcpy(row_map_genlock[follow_ypos], row_map_genlock[gfx_ypos], gfxvidinfo.drawbuffer.inwidth);*/
//do_flush_line(vb, follow_ypos);
}
} else {
// top or bottom blanking region
var tmp = hposblank;
hposblank = 1;
fill_line_border(lineno);
hposblank = tmp;
//do_flush_line(vb, gfx_ypos);
}
}
function center_image() {
var prev_x_adjust = visible_left_border;
var prev_y_adjust = thisframe_y_adjust;
var w = gfxvidinfo.drawbuffer.inwidth;
if (SAEV_config.video.xcenter && max_diwstop > 0 && !SAEV_config.video.gf[0].gfx_filter_autoscale) {
if (max_diwstop - min_diwstart < w && SAEV_config.video.xcenter == 2)
/* Try to center. */
visible_left_border = Math.truncate((max_diwstop - min_diwstart - w) / 2) + min_diwstart; //ATT
else
visible_left_border = max_diwstop - w - Math.truncate((max_diwstop - min_diwstart - w) / 2); //ATT
visible_left_border &= ~((xshift (1, lores_shift)) - 1);
//#if 1
if (!center_reset && !vertical_changed) {
/* Would the old value be good enough? If so, leave it as it is if we want to be clever. */
if (SAEV_config.video.xcenter == 2) {
if (visible_left_border < prev_x_adjust && prev_x_adjust < min_diwstart && min_diwstart - visible_left_border <= 32)
visible_left_border = prev_x_adjust;
}
}
//#endif
} else if (gfxvidinfo.drawbuffer.extrawidth) {
visible_left_border = max_diwlastword() - w;
if (gfxvidinfo.drawbuffer.extrawidth > 0)
visible_left_border += gfxvidinfo.drawbuffer.extrawidth << SAEV_config.video.hresolution;
} else {
if (gfxvidinfo.drawbuffer.inxoffset < 0) {
visible_left_border = 0;
} else {
visible_left_border = gfxvidinfo.drawbuffer.inxoffset - DISPLAY_LEFT_SHIFT;
}
}
if (visible_left_border > max_diwlastword() - 32)
visible_left_border = max_diwlastword() - 32;
if (visible_left_border < 0)
visible_left_border = 0;
visible_left_border &= ~((xshift (1, lores_shift)) - 1);
//SAEF_log("playfield.center_image() %d %d %d %d %d", max_diwlastword(), gfxvidinfo.drawbuffer.inwidth, lores_shift, SAEV_config.video.hresolution, visible_left_border);
linetoscr_x_adjust_pixels = visible_left_border;
linetoscr_x_adjust_pixbytes = linetoscr_x_adjust_pixels * gfxvidinfo.drawbuffer.pixbytes;
visible_right_border = visible_left_border + w;
if (visible_right_border > max_diwlastword())
visible_right_border = max_diwlastword();
var max_drawn_amiga_line_tmp = max_drawn_amiga_line;
if (max_drawn_amiga_line_tmp > gfxvidinfo.drawbuffer.inheight)
max_drawn_amiga_line_tmp = gfxvidinfo.drawbuffer.inheight;
max_drawn_amiga_line_tmp >>= linedbl;
thisframe_y_adjust = minfirstline;
if (SAEV_config.video.ycenter && thisframe_first_drawn_line >= 0 && !SAEV_config.video.gf[0].gfx_filter_autoscale) {
if (thisframe_last_drawn_line - thisframe_first_drawn_line < max_drawn_amiga_line_tmp && SAEV_config.video.ycenter == 2)
thisframe_y_adjust = Math.truncate((thisframe_last_drawn_line - thisframe_first_drawn_line - max_drawn_amiga_line_tmp) / 2) + thisframe_first_drawn_line; //ATT
else
thisframe_y_adjust = thisframe_first_drawn_line;
//#if 1
/* Would the old value be good enough? If so, leave it as it is if we want to be clever. */
if (!center_reset && !horizontal_changed) {
if (SAEV_config.video.ycenter == 2 && thisframe_y_adjust != prev_y_adjust) {
if (prev_y_adjust <= thisframe_first_drawn_line && prev_y_adjust + max_drawn_amiga_line_tmp > thisframe_last_drawn_line)
thisframe_y_adjust = prev_y_adjust;
}
}
//#endif
}
/* Make sure the value makes sense */
if (thisframe_y_adjust + max_drawn_amiga_line_tmp > maxvpos + (maxvpos >> 1)) //ORG / 2
thisframe_y_adjust = maxvpos + (maxvpos >> 1) - max_drawn_amiga_line_tmp;
if (thisframe_y_adjust < 0)
thisframe_y_adjust = 0;
thisframe_y_adjust_real = thisframe_y_adjust << linedbl;
max_ypos_thisframe = (maxvpos_display - minfirstline + 1) << linedbl;
if (prev_x_adjust != visible_left_border || prev_y_adjust != thisframe_y_adjust) {
var redraw = interlace_seen > 0 && linedbl ? 2 : 1;
if (redraw > frame_redraw_necessary)
frame_redraw_necessary = redraw;
}
max_diwstop = 0;
min_diwstart = MAX_STOP;
gfxvidinfo.drawbuffer.xoffset = (DISPLAY_LEFT_SHIFT << RES_MAX) + (visible_left_border << (RES_MAX - SAEV_config.video.hresolution));
gfxvidinfo.drawbuffer.yoffset = thisframe_y_adjust << VRES_MAX;
center_reset = false;
horizontal_changed = false;
vertical_changed = false;
}
var frame_res_cnt = 0; //int
var autoswitch_old_resolution = 0; //int
function init_drawing_frame() {
var i, maxline;
//static int frame_res_old;
/*if (SAEV_config.video.hresolution == changed_prefs.gfx_resolution && lines_count > 0) {
int largest_count = 0;
int largest_count_res = 0;
int largest_res = 0;
for (int i = 0; i <= RES_MAX; i++) {
if (resolution_count[i])
largest_res = i;
if (resolution_count[i] >= largest_count) {
largest_count = resolution_count[i];
largest_count_res = i;
}
}
if (currprefs.gfx_autoresolution_vga && programmedmode && gfxvidinfo.gfx_resolution_reserved >= SAEC_Config_Video_HResolution_HiRes && gfxvidinfo.gfx_vresolution_reserved >= SAEC_Config_Video_VResolution_Double) {
if (largest_res == SAEC_Config_Video_HResolution_SuperHiRes && (gfxvidinfo.gfx_resolution_reserved < SAEC_Config_Video_HResolution_SuperHiRes || gfxvidinfo.gfx_vresolution_reserved < 1)) {
// enable full doubling/superhires support if programmed mode. It may be "half-width" only and may fit in normal display window.
gfxvidinfo.gfx_resolution_reserved = SAEC_Config_Video_HResolution_SuperHiRes;
gfxvidinfo.gfx_vresolution_reserved = SAEC_Config_Video_VResolution_Double;
graphics_reset(false);
}
int newres = largest_res;
if (htotal < 190)
newres = largest_res + 1;
if (newres < SAEC_Config_Video_HResolution_HiRes)
newres = SAEC_Config_Video_HResolution_HiRes;
if (newres > RES_MAX)
newres = RES_MAX;
if (changed_prefs.gfx_resolution != newres) {
autoswitch_old_resolution = SAEC_Config_Video_HResolution_HiRes;
SAEF_log("Programmed mode autores = %d -> %d (%d)", changed_prefs.gfx_resolution, newres, largest_res);
changed_prefs.gfx_resolution = newres;
set_config_changed();
return;
}
} else if (autoswitch_old_resolution == SAEC_Config_Video_HResolution_HiRes) {
autoswitch_old_resolution = 0;
if (changed_prefs.gfx_resolution != SAEC_Config_Video_HResolution_HiRes) {
changed_prefs.gfx_resolution = SAEC_Config_Video_HResolution_HiRes;
set_config_changed();
return;
}
}
if (currprefs.gfx_autoresolution) {
int frame_res_detected;
int frame_res_lace_detected = frame_res_lace;
if (currprefs.gfx_autoresolution == 1 || currprefs.gfx_autoresolution >= 100)
frame_res_detected = largest_res;
else if (largest_count * 100 / lines_count >= currprefs.gfx_autoresolution)
frame_res_detected = largest_count_res;
else
frame_res_detected = largest_count_res - 1;
if (frame_res_detected < 0)
frame_res_detected = 0;
#if 0
static int delay;
delay--;
if (delay < 0) {
delay = 50;
SAEF_log("playfield.init_drawing_frame() %d %d, %d %d %d, %d %d, %d %d", currprefs.gfx_autoresolution, lines_count, resolution_count[0], resolution_count[1], resolution_count[2],
largest_count, largest_count_res, frame_res_detected, frame_res_lace_detected);
}
#endif
if (frame_res_detected >= 0 && frame_res_lace_detected >= 0) {
if (frame_res_cnt > 0 && frame_res_old == frame_res_detected * 2 + frame_res_lace_detected) {
frame_res_cnt--;
if (frame_res_cnt == 0) {
int m = frame_res_detected * 2 + frame_res_lace_detected;
struct wh *dst = SAEV_config.video.apmode[0].gfx_fullscreen ? &changed_prefs.gfx_size_fs : &changed_prefs.gfx_size_win;
while (m < 3 * 2) {
struct wh *src = SAEV_config.video.apmode[0].gfx_fullscreen ? &currprefs.gfx_size_fs_xtra[m] : &currprefs.gfx_size_win_xtra[m];
if ((src->width > 0 && src->height > 0) || (SAEV_config.video.api == SAEC_Config_Video_API_WebGL || SAEV_config.video.gf[0].gfx_filter > 0)) {
int nr = m >> 1;
int nl = (m & 1) == 0 ? 0 : 1;
int nr_o = nr;
int nl_o = nl;
if (currprefs.gfx_autoresolution >= 100 && nl == 0 && nr > 0) {
nl = 1;
}
if (currprefs.gfx_autoresolution_minh < 0) {
if (nr < nl)
nr = nl;
} else if (nr < currprefs.gfx_autoresolution_minh) {
nr = currprefs.gfx_autoresolution_minh;
}
if (currprefs.gfx_autoresolution_minv < 0) {
if (nl < nr)
nl = nr;
} else if (nl < currprefs.gfx_autoresolution_minv) {
nl = currprefs.gfx_autoresolution_minv;
}
if (nr > gfxvidinfo.gfx_resolution_reserved)
nr = gfxvidinfo.gfx_resolution_reserved;
if (nl > gfxvidinfo.gfx_vresolution_reserved)
nl = gfxvidinfo.gfx_vresolution_reserved;
if (changed_prefs.gfx_resolution != nr || changed_prefs.gfx_vresolution != nl) {
changed_prefs.gfx_resolution = nr;
changed_prefs.gfx_vresolution = nl;
SAEF_log("playfield.init_drawing_frame() RES -> %d (%d) LINE -> %d (%d) (%d - %d, %d - %d)", nr, nr_o, nl, nl_o,
currprefs.gfx_autoresolution_minh, currprefs.gfx_autoresolution_minv,
gfxvidinfo.gfx_resolution_reserved, gfxvidinfo.gfx_vresolution_reserved);
set_config_changed ();
}
if (src->width > 0 && src->height > 0) {
if (memcmp (dst, src, sizeof *dst)) {
*dst = *src;
set_config_changed ();
}
}
break;
}
m++;
}
frame_res_cnt = currprefs.gfx_autoresolution_delay;
}
} else {
frame_res_old = frame_res_detected * 2 + frame_res_lace_detected;
frame_res_cnt = currprefs.gfx_autoresolution_delay;
if (frame_res_cnt <= 0)
frame_res_cnt = 1;
}
}
}
}*/
for (i = 0; i <= RES_MAX; i++)
resolution_count[i] = 0;
lines_count = 0;
frame_res = -1;
frame_res_lace = 0;
if (can_use_lores > AUTO_LORES_FRAMES && 0) {
lores_factor = 1;
lores_set(0);
} else {
can_use_lores++;
lores_reset();
}
init_hardware_for_drawing_frame();
if (thisframe_first_drawn_line < 0)
thisframe_first_drawn_line = minfirstline;
if (thisframe_first_drawn_line > thisframe_last_drawn_line)
thisframe_last_drawn_line = thisframe_first_drawn_line;
maxline = ((maxvpos_display + 1) << linedbl) + 2;
if (SMART_UPDATE) {
for (i = 0; i < maxline; i++) {
var ls = linestate[i];
switch (ls) {
case LINE_DONE_AS_PREVIOUS:
linestate[i] = LINE_REMEMBERED_AS_PREVIOUS;
break;
case LINE_REMEMBERED_AS_BLACK:
break;
default:
linestate[i] = LINE_UNDECIDED;
}
}
} else {
for (i = 0; i < maxline; i++)
linestate[i] = LINE_UNDECIDED;
}
last_drawn_line = 0;
first_drawn_line = 32767;
//first_block_line = last_block_line = NO_BLOCK; //OWN flush_line() and flush_block() is not used
if (frame_redraw_necessary) {
reset_decision_table();
custom_frame_redraw_necessary = 1;
frame_redraw_necessary--;
} else
custom_frame_redraw_necessary = 0;
center_image();
thisframe_first_drawn_line = -1;
thisframe_last_drawn_line = -1;
drawing_color_matches = -1;
}
function putpixel(buf, bpp, x, c8, opaq) {
if (x <= 0)
return;
switch (bpp) {
case 1:
buf[x] = c8 & 0xff;
break;
case 2: {
//uae_u16 *p = (uae_u16*)buf + x; *p = (uae_u16)c8;
buf[x] = c8 & 0xffff;
break;
}
case 3: //no 24 bit yet
break;
case 4: {
if (1 || opaq || SAEV_config.video.gf[0].gfx_filter == 0) {
//uae_u32 *p = (uae_u32*)buf + x; *p = c8;
buf[x] = c8;
} else {
for (var i = 0; i < 4; i++) {
var v1 = buf[i + bpp * x];
var v2 = (c8 >> (i * 8)) & 255;
v1 = (v1 * 2 + v2 * 3) / 5;
if (v1 > 255)
v1 = 255;
buf[i + bpp * x] = v1;
}
}
break;
}
}
}
/*var statusbar_y1, statusbar_y2; //int
[...] statusline.cpp
static uae_u8 *status_line_ptr(int line) {
int y;
y = line - (gfxvidinfo.drawbuffer.outheight - TD_TOTAL_HEIGHT);
xlinebuffer = gfxvidinfo.drawbuffer.linemem;
if (xlinebuffer == 0)
xlinebuffer = row_map[line];
xlinebuffer_genlock = row_map_genlock[line];
return xlinebuffer;
}
static void draw_status_line (int line, int statusy) {
uae_u8 *buf = status_line_ptr(line);
if (!buf)
return;
if (statusy < 0)
statusline_render(buf, gfxvidinfo.drawbuffer.pixbytes, gfxvidinfo.drawbuffer.rowbytes, gfxvidinfo.drawbuffer.outwidth, TD_TOTAL_HEIGHT, xredcolors, xgreencolors, xbluecolors, NULL);
else
draw_status_line_single(buf, gfxvidinfo.drawbuffer.pixbytes, statusy, gfxvidinfo.drawbuffer.outwidth, xredcolors, xgreencolors, xbluecolors, NULL);
}
static void draw_debug_status_line (int line) {
xlinebuffer = gfxvidinfo.drawbuffer.linemem;
if (xlinebuffer == 0)
xlinebuffer = row_map[line];
xlinebuffer_genlock = row_map_genlock[line];
debug_draw(xlinebuffer, gfxvidinfo.drawbuffer.pixbytes, line, gfxvidinfo.drawbuffer.outwidth, gfxvidinfo.drawbuffer.outheight, xredcolors, xgreencolors, xbluecolors);
}
const LIGHTPEN_HEIGHT = 12;
const LIGHTPEN_WIDTH = 17;
static const char *lightpen_cursor = {
"------.....------"
"------.xxx.------"
"------.xxx.------"
"------.xxx.------"
".......xxx......."
".xxxxxxxxxxxxxxx."
".xxxxxxxxxxxxxxx."
".......xxx......."
"------.xxx.------"
"------.xxx.------"
"------.xxx.------"
"------.....------"
};
var lightpen_y1, lightpen_y2; //int
static void draw_lightpen_cursor (int x, int y, int line, int onscreen)
{
int i;
const char *p;
int color1 = onscreen ? 0xff0 : 0xf00;
int color2 = 0x000;
xlinebuffer = gfxvidinfo.drawbuffer.linemem;
if (xlinebuffer == 0)
xlinebuffer = row_map[line];
xlinebuffer_genlock = row_map_genlock[line];
p = lightpen_cursor + y * LIGHTPEN_WIDTH;
for (i = 0; i < LIGHTPEN_WIDTH; i++) {
int xx = x + i - LIGHTPEN_WIDTH / 2;
if (*p != "-" && xx >= 0 && xx < gfxvidinfo.drawbuffer.outwidth)
putpixel (xlinebuffer, gfxvidinfo.drawbuffer.pixbytes, xx, *p == "x" ? xcolors[color1] : xcolors[color2], 1);
p++;
}
}
static void lightpen_update (struct vidbuffer *vb)
{
int i;
if (lightpen_x < LIGHTPEN_WIDTH + 1)
lightpen_x = LIGHTPEN_WIDTH + 1;
if (lightpen_x >= gfxvidinfo.drawbuffer.inwidth - LIGHTPEN_WIDTH - 1)
lightpen_x = gfxvidinfo.drawbuffer.inwidth - LIGHTPEN_WIDTH - 2;
if (lightpen_y < LIGHTPEN_HEIGHT + 1)
lightpen_y = LIGHTPEN_HEIGHT + 1;
if (lightpen_y >= gfxvidinfo.drawbuffer.inheight - LIGHTPEN_HEIGHT - 1)
lightpen_y = gfxvidinfo.drawbuffer.inheight - LIGHTPEN_HEIGHT - 2;
if (lightpen_y >= max_ypos_thisframe - LIGHTPEN_HEIGHT - 1)
lightpen_y = max_ypos_thisframe - LIGHTPEN_HEIGHT - 2;
lightpen_cx = (((lightpen_x + visible_left_border) >> lores_shift) >> 1) + DISPLAY_LEFT_SHIFT - DIW_DDF_OFFSET;
lightpen_cy = lightpen_y;
lightpen_cy >>= linedbl;
lightpen_cy += minfirstline;
if (lightpen_cx < 0x18)
lightpen_cx = 0x18;
if (lightpen_cx >= maxhpos)
lightpen_cx -= maxhpos;
if (lightpen_cy < minfirstline)
lightpen_cy = minfirstline;
if (lightpen_cy >= maxvpos)
lightpen_cy = maxvpos - 1;
for (i = 0; i < LIGHTPEN_HEIGHT; i++) {
int line = lightpen_y + i - LIGHTPEN_HEIGHT / 2;
if (line >= 0 || line < max_ypos_thisframe) {
if (lightpen_active > 0)
draw_lightpen_cursor (lightpen_x, i, line, lightpen_cx > 0);
SAER.video.flush_line(vb, line);
}
}
lightpen_y1 = lightpen_y - LIGHTPEN_HEIGHT / 2 - 1 + min_ypos_for_screen;
lightpen_y2 = lightpen_y1 + LIGHTPEN_HEIGHT + 2;
if (lightpen_active < 0)
lightpen_active = 0;
}*/
const refresh_indicator_colors = [ 0x777, 0x0f0, 0x00f, 0xff0, 0xf0f ];
function refresh_indicator_init() {
//xfree(refresh_indicator_buffer);
refresh_indicator_buffer = null;
//xfree(refresh_indicator_changed);
refresh_indicator_changed = null;
//xfree(refresh_indicator_changed_prev);
refresh_indicator_changed_prev = null;
if (!SAEV_config.video.refreshIndicator)
return;
refresh_indicator_height = 600;
/*refresh_indicator_buffer = xcalloc(uae_u8, MAX_PIXELS_PER_LINE * 2 * refresh_indicator_height);
refresh_indicator_changed = xcalloc(uae_u8, refresh_indicator_height);
refresh_indicator_changed_prev = xcalloc(uae_u8, refresh_indicator_height);*/
refresh_indicator_buffer = new ArrayBuffer(MAX_PIXELS_PER_LINE * 2 * refresh_indicator_height);
refresh_indicator_changed = new Uint8Array(refresh_indicator_height);
refresh_indicator_changed_prev = new Uint8Array(refresh_indicator_height);
}
function refresh_indicator_update(vb) {
for (var i = 0; i < max_ypos_thisframe; i++) {
var i1 = i + min_ypos_for_screen;
var line = i + thisframe_y_adjust_real;
var whereline = amiga2aspect_line_map[i1];
var wherenext = amiga2aspect_line_map[i1 + 1];
if (whereline >= vb.inheight)
break;
if (whereline < 0)
continue;
if (line >= refresh_indicator_height)
break;
xlinebuffer = row_map[whereline];
var pixel = refresh_indicator_changed_prev[line];
if (wherenext >= 0)
pixel = refresh_indicator_changed_prev[line & ~1];
var color1 = 0;
var color2 = 0;
if (pixel <= 4) {
color1 = color2 = refresh_indicator_colors[pixel];
} else if (pixel <= 8) {
color2 = refresh_indicator_colors[pixel - 5];
}
for (var x = 0; x < 8; x++) {
putpixel(xlinebuffer, gfxvidinfo.drawbuffer.pixbytes, x, xcolors[color1], 1);
}
for (var x = 8; x < 16; x++) {
putpixel(xlinebuffer, gfxvidinfo.drawbuffer.pixbytes, x, xcolors[color2], 1);
}
}
}
//const LARGEST_LINE_DEBUG = 0;
//var xvbin = null, xvbout = null; //struct vidbuffer *
function draw_frame2(vbin, vbout) {
//xvbin = vbin;
//xvbout = vbout;
//if (LARGEST_LINE_DEBUG) var largest = 0;
for (var i = 0; i < max_ypos_thisframe; i++) {
var i1 = i + min_ypos_for_screen;
var line = i + thisframe_y_adjust_real;
var whereline = amiga2aspect_line_map[i1];
var wherenext = amiga2aspect_line_map[i1 + 1];
if (whereline >= vbin.inheight)
break;
if (whereline < 0)
continue;
//if (LARGEST_LINE_DEBUG && largest < whereline) largest = whereline;
hposblank = 0;
pfield_draw_line(vbout, line, whereline, wherenext);
}
//if (LARGEST_LINE_DEBUG) SAEF_log("playfield.draw_frame2() largest line %d", largest);
}
/*bool draw_frame (struct vidbuffer *vb) {
uae_u8 oldstate[LINESTATE_SIZE];
struct vidbuffer oldvb;
memcpy (&oldvb, &gfxvidinfo.drawbuffer, sizeof (struct vidbuffer));
memcpy (&gfxvidinfo.drawbuffer, vb, sizeof (struct vidbuffer));
clearbuffer (vb);
init_row_map();
memcpy (oldstate, linestate, LINESTATE_SIZE);
for (int i = 0; i < LINESTATE_SIZE; i++) {
uae_u8 v = linestate[i];
if (v == LINE_REMEMBERED_AS_PREVIOUS) {
linestate[i - 1] = LINE_DECIDED_DOUBLE;
v = LINE_AS_PREVIOUS;
} else if (v == LINE_DONE_AS_PREVIOUS) {
linestate[i - 1] = LINE_DECIDED_DOUBLE;
v = LINE_AS_PREVIOUS;
} else if (v == LINE_REMEMBERED_AS_BLACK) {
v = LINE_BLACK;
} else if (v == LINE_DONE) {
v = LINE_DECIDED;
}
linestate[i] = v;
}
last_drawn_line = 0;
first_drawn_line = 32767;
drawing_color_matches = -1;
draw_frame2(vb, NULL);
last_drawn_line = 0;
first_drawn_line = 32767;
drawing_color_matches = -1;
memcpy (linestate, oldstate, LINESTATE_SIZE);
memcpy (&gfxvidinfo.drawbuffer, &oldvb, sizeof (struct vidbuffer));
init_row_map();
return true;
}*/
function setnativeposition(vb) {
vb.inwidth = gfxvidinfo.drawbuffer.inwidth;
vb.inheight = gfxvidinfo.drawbuffer.inheight;
vb.inwidth2 = gfxvidinfo.drawbuffer.inwidth2;
vb.inheight2 = gfxvidinfo.drawbuffer.inheight2;
vb.outwidth = gfxvidinfo.drawbuffer.outwidth;
vb.outheight = gfxvidinfo.drawbuffer.outheight;
}
function setspecialmonitorpos(vb) {
vb.extrawidth = gfxvidinfo.drawbuffer.extrawidth;
vb.xoffset = gfxvidinfo.drawbuffer.xoffset;
vb.yoffset = gfxvidinfo.drawbuffer.yoffset;
vb.inxoffset = gfxvidinfo.drawbuffer.inxoffset;
vb.inyoffset = gfxvidinfo.drawbuffer.inyoffset;
}
function init_hardware_frame() {
first_bpl_vpos = -1;
next_lineno = 0;
prev_lineno = -1;
nextline_how = nln_normal;
diwstate = DIW_WAITING_START;
ddfstate = DIW_WAITING_START;
if (first_bplcon0 != first_bplcon0_old) {
vertical_changed = horizontal_changed = true;
}
first_bplcon0_old = first_bplcon0;
if (first_planes_vpos != first_planes_vpos_old ||
last_planes_vpos != last_planes_vpos_old) {
vertical_changed = true;
}
first_planes_vpos_old = first_planes_vpos;
last_planes_vpos_old = last_planes_vpos;
if (diwfirstword_total != diwfirstword_total_old ||
diwlastword_total != diwlastword_total_old ||
ddffirstword_total != ddffirstword_total_old ||
ddflastword_total != ddflastword_total_old) {
horizontal_changed = true;
}
diwfirstword_total_old = diwfirstword_total;
diwlastword_total_old = diwlastword_total;
ddffirstword_total_old = ddffirstword_total;
ddflastword_total_old = ddflastword_total;
first_planes_vpos = 0;
last_planes_vpos = 0;
diwfirstword_total = max_diwlastword();
diwlastword_total = 0;
ddffirstword_total = max_diwlastword();
ddflastword_total = 0;
plflastline_total = 0;
plffirstline_total = current_maxvpos();
first_bplcon0 = 0;
autoscale_bordercolors = 0;
for (var i = 0; i < MAX_SPRITES; i++) {
spr[i].ptxhpos = MAXHPOS;
spr[i].ptxvpos2 = -1;
}
plf_state = plf_end;
}
function init_hardware_for_drawing_frame() { //global
/* Avoid this code in the first frame after a customreset. */
if (prev_sprite_entries) {
var first_pixel = prev_sprite_entries[0].first_pixel;
var npixels = prev_sprite_entries[prev_next_sprite_entry].first_pixel - first_pixel;
for (var i = 0; i < npixels; i++) {
spixels[first_pixel + i] = 0;
spixstate.bytes[first_pixel + i] = 0;
}
}
prev_next_sprite_entry = next_sprite_entry;
next_color_change = 0;
next_sprite_entry = 0;
next_color_entry = 0;
remembered_color_entry = -1;
prev_sprite_entries = sprite_entries[current_change_set];
curr_sprite_entries = sprite_entries[current_change_set ^ 1];
prev_color_changes = color_changes[current_change_set];
curr_color_changes = color_changes[current_change_set ^ 1];
prev_color_tables = color_tables[current_change_set];
curr_color_tables = color_tables[current_change_set ^ 1];
prev_drawinfo = line_drawinfo[current_change_set];
curr_drawinfo = line_drawinfo[current_change_set ^ 1];
current_change_set ^= 1;
color_src_match = color_dest_match = -1;
/* Use both halves of the array in alternating fashion. */
curr_sprite_entries[0].first_pixel = current_change_set * MAX_SPR_PIXELS;
next_sprite_forced = 1;
}
function finish_drawing_frame() {
var didflush = false;
var vb = gfxvidinfo.drawbuffer;
gfxvidinfo.outbuffer = vb;
if (!SAER.video.lockscr(vb, false)) {
notice_screen_contents_lost();
return;
}
if (!SMART_UPDATE) {
/* This isn't exactly right yet. FIXME */
if (!interlace_seen)
do_flush_screen(vb, first_drawn_line, last_drawn_line);
else
SAER.video.unlockscr();
return;
}
draw_frame2(vb, vb);
/*if (currprefs.leds_on_screen && ((currprefs.leds_on_screen & STATUSLINE_CHIPSET) && !(currprefs.leds_on_screen & STATUSLINE_TARGET))) {
int slx, sly;
statusline_getpos(&slx, &sly, vb->outwidth, vb->outheight);
statusbar_y1 = sly + min_ypos_for_screen - 1;
statusbar_y2 = statusbar_y1 + TD_TOTAL_HEIGHT + 1;
draw_status_line(sly, -1);
for (var i = 0; i < TD_TOTAL_HEIGHT; i++) {
int line = sly + i;
draw_status_line (line, i);
do_flush_line(vb, line);
}
}*/
//if (lightpen_active) lightpen_update(vb);
if (refresh_indicator_buffer !== null) refresh_indicator_update(vb);
/*if (currprefs.monitoremu && gfxvidinfo.tempbuffer.bufmem_allocated) {
setspecialmonitorpos(&gfxvidinfo.tempbuffer);
if (init_genlock_data != specialmonitor_need_genlock()) {
init_genlock_data = specialmonitor_need_genlock();
init_row_map();
}
if (emulate_specialmonitors (vb, &gfxvidinfo.tempbuffer)) {
vb = gfxvidinfo.outbuffer = &gfxvidinfo.tempbuffer;
if (vb->nativepositioning)
setnativeposition(vb);
gfxvidinfo.drawbuffer.tempbufferinuse = true;
need_genlock_data = specialmonitor_need_genlock();
if (!specialmonitoron) {
compute_framesync();
}
specialmonitoron = true;
pfield_set_linetoscr();
do_flush_screen(vb, 0, vb->outheight);
didflush = true;
} else {
pfield_set_linetoscr();
need_genlock_data = false;
if (specialmonitoron || gfxvidinfo.drawbuffer.tempbufferinuse) {
gfxvidinfo.drawbuffer.tempbufferinuse = false;
specialmonitoron = false;
compute_framesync();
}
}
}*/
/*if (!currprefs.monitoremu && gfxvidinfo.tempbuffer.bufmem_allocated && ((!bplcolorburst_field && currprefs.cs_color_burst) || (currprefs.gfx_grayscale))) {
setspecialmonitorpos(&gfxvidinfo.tempbuffer);
emulate_grayscale(vb, &gfxvidinfo.tempbuffer);
vb = gfxvidinfo.outbuffer = &gfxvidinfo.tempbuffer;
if (vb->nativepositioning)
setnativeposition(vb);
gfxvidinfo.drawbuffer.tempbufferinuse = true;
do_flush_screen(vb, 0, vb->outheight);
didflush = true;
}*/
/*if (currprefs.genlock_image && !currprefs.monitoremu && !currprefs.cs_color_burst && gfxvidinfo.tempbuffer.bufmem_allocated && SAEV_config.chipset.genlock) {
setspecialmonitorpos(&gfxvidinfo.tempbuffer);
if (init_genlock_data != specialmonitor_need_genlock()) {
need_genlock_data = init_genlock_data = specialmonitor_need_genlock();
init_row_map();
}
emulate_genlock(vb, &gfxvidinfo.tempbuffer);
vb = gfxvidinfo.outbuffer = &gfxvidinfo.tempbuffer;
if (vb->nativepositioning)
setnativeposition(vb);
gfxvidinfo.drawbuffer.tempbufferinuse = true;
do_flush_screen(vb, 0, vb->outheight);
didflush = true;
}*/
/*if (!currprefs.monitoremu && gfxvidinfo.tempbuffer.bufmem_allocated && currprefs.cs_cd32fmv) {
if (cd32_fmv_active) {
cd32_fmv_genlock(vb, &gfxvidinfo.tempbuffer);
vb = gfxvidinfo.outbuffer = &gfxvidinfo.tempbuffer;
setnativeposition(vb);
gfxvidinfo.drawbuffer.tempbufferinuse = true;
do_flush_screen(vb, 0, vb->outheight);
didflush = true;
} else {
gfxvidinfo.drawbuffer.tempbufferinuse = false;
}
}*/
if (!didflush)
do_flush_screen(vb, first_drawn_line, last_drawn_line);
}
function hardware_line_completed(lineno) {
if (!SMART_UPDATE) {
var i = lineno - thisframe_y_adjust_real;
if (i >= 0 && i < max_ypos_thisframe) {
var where = amiga2aspect_line_map[i + min_ypos_for_screen];
if (where < gfxvidinfo.drawbuffer.outheight && where >= 0)
pfield_draw_line(gfxvidinfo.drawbuffer, lineno, where, amiga2aspect_line_map[i + min_ypos_for_screen + 1]);
}
}
}
/*function check_picasso() {
#ifdef PICASSO96
if (SAEV_Playfield_picasso_on && picasso_redraw_necessary)
picasso_refresh();
picasso_redraw_necessary = 0;
if (SAEV_Playfield_picasso_requested_on == SAEV_Playfield_picasso_on)
return;
SAEV_Playfield_picasso_on = SAEV_Playfield_picasso_requested_on;
if (!SAEV_Playfield_picasso_on)
clear_inhibit_frame(IHF_PICASSO);
else
set_inhibit_frame(IHF_PICASSO);
gfx_set_picasso_state(SAEV_Playfield_picasso_on);
picasso_enablescreen(SAEV_Playfield_picasso_requested_on);
notice_screen_contents_lost();
notice_new_xcolors();
count_frame();
#endif
}*/
function redraw_frame() { //global
last_drawn_line = 0;
first_drawn_line = 32767;
finish_drawing_frame();
/* OWN flush_screen() is not used
SAER.video.flush_screen(gfxvidinfo.inbuffer, 0, 0);*/
}
function vsync_handle_check() { //global
/*var changed = check_prefs_changed_gfx();
if (changed > 0) {
reset_drawing();
init_row_map();
init_aspect_maps();
notice_screen_contents_lost();
notice_new_xcolors();
} else if (changed < 0) {
reset_drawing();
init_row_map();
init_aspect_maps();
notice_screen_contents_lost();
notice_new_xcolors();
}
check_prefs_changed_cd();
check_prefs_changed_audio();
check_prefs_changed_custom();
check_prefs_changed_cpu();
check_picasso();
return changed != 0;*/
return false;
}
function vsync_handle_redraw(long_field, lof_changed, bplcon0p, bplcon3p) { //global
last_redraw_point++;
if (lof_changed || interlace_seen <= 0 || (SAEV_config.video.iscanlines && interlace_seen > 0) || last_redraw_point >= 2 || long_field || doublescan < 0) {
last_redraw_point = 0;
if (framecnt == 0)
finish_drawing_frame();
/*#if 0
if (interlace_seen > 0) {
interlace_seen = -1;
} else if (interlace_seen == -1) {
interlace_seen = 0;
if (SAEV_config.video.scandoubler && SAEV_config.video.vresolution)
notice_screen_contents_lost();
}
#endif*/
if (SAEV_command < 0) {
SAEV_command = -SAEV_command;
set_inhibit_frame(IHF_QUIT_PROGRAM);
SAEF_setSpcFlags(SAEC_spcflag_BRK | SAEC_spcflag_MODE_CHANGE);
return;
}
count_frame();
if (framecnt == 0)
init_drawing_frame();
}
/* OWN flush_screen() is not used
else {
if (isvsync_chipset())
SAER.video.flush_screen(gfxvidinfo.inbuffer, 0, 0); //vsync mode
}*/
SAER.gui.flicker_led(-1, 0, 0);
/*#ifdef AVIOUTPUT
if (!SAEV_Playfield_picasso_on) frame_drawn();
#endif*/
}
function hsync_record_line_state(lineno, how, changed) { //global
//uae_u8 *state = linestate + lineno;
if (framecnt != 0)
return;
//changed |= frame_redraw_necessary != 0 || refresh_indicator_buffer !== null || ((lineno >= lightpen_y1 && lineno < lightpen_y2) || (lineno >= statusbar_y1 && lineno < statusbar_y2));
changed |= (frame_redraw_necessary != 0 || refresh_indicator_buffer !== null) ? 1 : 0;
//changed |= (frame_redraw_necessary != 0 ? 1 : 0);
switch (how) {
case nln_normal:
linestate[lineno] = changed ? LINE_DECIDED : LINE_DONE;
break;
case nln_doubled:
linestate[lineno] = changed ? LINE_DECIDED_DOUBLE : LINE_DONE;
changed |= (linestate[lineno + 1] != LINE_REMEMBERED_AS_PREVIOUS ? 1 : 0);
linestate[lineno + 1] = changed ? LINE_AS_PREVIOUS : LINE_DONE_AS_PREVIOUS;
break;
case nln_nblack:
linestate[lineno] = changed ? LINE_DECIDED : LINE_DONE;
if (linestate[lineno + 1] != LINE_REMEMBERED_AS_BLACK) {
linestate[lineno + 1] = LINE_BLACK;
}
break;
case nln_lower:
if (lineno > 0 && linestate[lineno - 1] == LINE_UNDECIDED) {
linestate[lineno - 1] = LINE_DECIDED; //LINE_BLACK;
}
linestate[lineno] = changed ? LINE_DECIDED : LINE_DONE;
break;
case nln_upper:
linestate[lineno] = changed ? LINE_DECIDED : LINE_DONE;
if (linestate[lineno + 1] == LINE_UNDECIDED ||
linestate[lineno + 1] == LINE_REMEMBERED_AS_PREVIOUS ||
linestate[lineno + 1] == LINE_AS_PREVIOUS)
linestate[lineno + 1] = LINE_DECIDED; //LINE_BLACK;
break;
case nln_lower_black_always:
linestate[lineno + 1] = LINE_BLACK;
linestate[lineno] = LINE_DECIDED;
//if (lineno == (maxvpos + lof_store) * 2 - 1)
// linestate[lineno] = LINE_BLACK;
break;
case nln_lower_black:
changed |= (linestate[lineno] != LINE_DONE ? 1 : 0);
linestate[lineno + 1] = LINE_DONE;
linestate[lineno] = changed ? LINE_DECIDED : LINE_DONE;
//if (lineno == (maxvpos + lof_store) * 2 - 1)
// linestate[lineno + 1] = LINE_BLACK;
break;
case nln_upper_black_always:
linestate[lineno] = LINE_DECIDED;
if (lineno > 0) {
linestate[lineno - 1] = LINE_BLACK;
}
if (!interlace_seen && lineno == (maxvpos + lof_store) * 2 - 2) {
linestate[lineno + 1] = LINE_BLACK;
}
break;
case nln_upper_black:
changed |= (linestate[lineno] != LINE_DONE ? 1 : 0);
linestate[lineno] = changed ? LINE_DECIDED : LINE_DONE;
if (lineno > 0) {
linestate[lineno - 1] = LINE_DONE;
}
if (!interlace_seen && lineno == (maxvpos + lof_store) * 2 - 2) {
linestate[lineno + 1] = LINE_DONE;
}
break;
}
}
function gfxbuffer_reset() {
gfxvidinfo.drawbuffer.flush_line = function(gfxinfo, vb, line_no) {};
gfxvidinfo.drawbuffer.flush_block = function(gfxinfo, vb, first_line, last_line) {};
gfxvidinfo.drawbuffer.flush_screen = function(gfxinfo, vb, first_line, last_line) {};
gfxvidinfo.drawbuffer.flush_clear_screen = function(gfxinfo, vb) {};
gfxvidinfo.drawbuffer.lockscr = function(gfxinfo, vb) { return 1; };
gfxvidinfo.drawbuffer.unlockscr = function(gfxinfo, vb) {};
}
function notice_resolution_seen(res, lace) { //global
if (res > frame_res)
frame_res = res;
if (res > 0)
can_use_lores = 0;
if (!frame_res_lace && lace)
frame_res_lace = lace;
}
function notice_interlace_seen(lace) { //global
var changed = false;
// non-lace to lace switch (non-lace active at least one frame)?
if (lace) {
if (interlace_seen == 0) {
changed = true;
//SAEF_log("playfield.notice_interlace_seen() ->lace PC=%x", SAER_CPU_getPC());
}
interlace_seen = SAEV_config.video.vresolution ? 1 : -1;
} else {
if (interlace_seen) {
changed = true;
//SAEF_log("playfield.notice_interlace_seen() ->non-lace PC=%x", SAER_CPU_getPC());
}
interlace_seen = 0;
}
return changed;
}
function reset_drawing() { //global
max_diwstop = 0;
lores_reset();
reset_decision_table();
init_aspect_maps();
oldbufmem = null; //OWN
oldheight = 0, oldpitch = 0; //OWN
oldgenlock = false; //OWN
init_row_map();
last_redraw_point = 0;
//memset(spixels, 0, sizeof spixels);
//memset(&spixstate, 0, sizeof spixstate);
SAEF_memset(spixels,0, 0, 2 * MAX_SPR_PIXELS);
SAEF_memset(spixstate.bytes,0, 0, 2 * MAX_SPR_PIXELS);
init_drawing_frame();
pfield_set_linetoscr();
notice_screen_contents_lost();
frame_res_cnt = 1; //currprefs.gfx_autoresolution_delay; //OWN
//lightpen_y1 = lightpen_y2 = -1; //OWN
reset_custom_limits();
clearbuffer(gfxvidinfo.drawbuffer);
clearbuffer(gfxvidinfo.tempbuffer);
center_reset = true;
specialmonitoron = false;
bplcolorburst_field = true;
warned_pfield_draw_line = 0; //OWN
}
function gen_direct_drawing_table() {
//#ifdef AGA
// BYPASS color table
for (var i = 0; i < 256; i++) {
var v = ((i << 16) | (i << 8) | i) >>> 0;
direct_colors_for_drawing.acolors[i] = CONVERT_RGB(v);
}
//#endif
}
function drawing_init() { //global
refresh_indicator_init();
gen_pfield_tables();
gen_direct_drawing_table();
//#ifdef PICASSO96
SAEV_Playfield_picasso_on = false;
SAEV_Playfield_picasso_requested_on = false;
//gfx_set_picasso_state(0);
//#endif
//xlinebuffer = gfxvidinfo.drawbuffer.bufmem;
//xlinebuffer_genlock = null;
if (gfxvidinfo.drawbuffer.bufmem !== null) {
if (gfxvidinfo.drawbuffer.pixbytes == 2)
xlinebuffer = new Uint16Array(gfxvidinfo.drawbuffer.bufmem);
else
xlinebuffer = new Uint32Array(gfxvidinfo.drawbuffer.bufmem);
} else
xlinebuffer = null;
inhibit_frame = 0;
gfxbuffer_reset();
reset_drawing();
}
function isvsync_chipset() { //global
var ap = SAEV_config.video.apmode[0];
if (SAEV_Playfield_picasso_on || !ap.gfx_vsync)
return 0;
if (ap.gfx_vsyncmode == 0)
return 1;
if (SAEV_config.cpu.speed >= 0)
return -1;
return -2;
}
SAER_Playfield_isvsync_chipset = isvsync_chipset;
function isvsync_rtg() { //global
var ap = SAEV_config.video.apmode[1];
if (!SAEV_Playfield_picasso_on || !ap.gfx_vsync)
return 0;
if (ap.gfx_vsyncmode == 0)
return 1;
if (SAEV_config.cpu.speed >= 0)
return -1;
return -2;
}
function isvsync() { //global
if (SAEV_Playfield_picasso_on)
return isvsync_rtg();
else
return isvsync_chipset();
}
SAER_Playfield_isvsync = isvsync;
/* drawing code */
/*-----------------------------------------------------------------------*/
/*-----------------------------------------------------------------------*/
/*-----------------------------------------------------------------------*/
/* SECT playfield defs */
const AUTOSCALE_SPRITES = true;
//const SPRBORDER = 0;
const MAXHPOS_ROWS = 256;
const MAXVPOS_LINES_ECS = 2048;
const MAXVPOS_LINES_OCS = 512;
const HPOS_SHIFT = 3;
/* PAL/NTSC values */
const MAXHPOS_PAL = 227;
const MAXHPOS_NTSC = 227;
const MAXVPOS_PAL = 312; // short field maxvpos
const MAXVPOS_NTSC = 262;
const VBLANK_ENDLINE_PAL = 26; // following endlines = first visible line
const VBLANK_ENDLINE_NTSC = 21;
const VBLANK_SPRITE_PAL = 25; // line when sprite DMA fetches first control words
const VBLANK_SPRITE_NTSC = 20;
const VBLANK_HZ_PAL = 50;
const VBLANK_HZ_NTSC = 60;
const VSYNC_ENDLINE_PAL = 5;
const VSYNC_ENDLINE_NTSC = 6;
const EQU_ENDLINE_PAL = 8;
const EQU_ENDLINE_NTSC = 10;
/* calculate shift depending on resolution (replaced "decided_hires ? 4 : 8") */
//function RES_SHIFT(res) { return res == SAEC_Config_Video_HResolution_LoRes ? 8 : (res == SAEC_Config_Video_HResolution_HiRes ? 4 : 2); }
/* get resolution from bplcon0 */
function GET_RES_DENISE(con0) {
if (!(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_DENISE))
con0 &= ~0x40; // SUPERHIRES
return (con0 & 0x40) ? SAEC_Config_Video_HResolution_SuperHiRes : ((con0 & 0x8000) ? SAEC_Config_Video_HResolution_HiRes : SAEC_Config_Video_HResolution_LoRes);
}
function GET_RES_AGNUS(con0) {
if (!(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_AGNUS))
con0 &= ~0x40; // SUPERHIRES
return (con0 & 0x40) ? SAEC_Config_Video_HResolution_SuperHiRes : ((con0 & 0x8000) ? SAEC_Config_Video_HResolution_HiRes : SAEC_Config_Video_HResolution_LoRes);
}
/* get sprite width from FMODE */
//#define GET_SPRITEWIDTH(FMODE) ((((FMODE) >> 2) & 3) == 3 ? 64 : (((FMODE) >> 2) & 3) == 0 ? 16 : 32)
function GET_SPRITEWIDTH(fm) {
fm = (fm >> 2) & 3;
return fm == 3 ? 64 : (fm == 0 ? 16 : 32);
}
/* Compute the number of bitplanes from a value written to BPLCON0 */
function GET_PLANES(bplcon0) {
if ((bplcon0 & 0x0010) && (bplcon0 & 0x7000))
return 0; // >8 planes = 0 planes
if (bplcon0 & 0x0010)
return 8; // AGA 8-planes bit
return (bplcon0 >> 12) & 7; // normal planes bits
}
/* playfield defs */
/*-----------------------------------------------------------------------*/
/*-----------------------------------------------------------------------*/
/*-----------------------------------------------------------------------*/
/* SECT playfield code */
function nocustom() {
return false; //(SAEV_Playfield_picasso_on && currprefs.picasso96_nocustom);
}
/*#if 0
struct customhack {
uae_u16 v;
int vpos, hpos;
};
void customhack_put (struct customhack *ch, uae_u16 v, int hpos)
{
ch->v = v;
ch->vpos = vpos;
ch->hpos = hpos;
}
uae_u16 customhack_get (struct customhack *ch, int hpos)
{
if (ch->vpos == vpos && ch->hpos == hpos) {
ch->vpos = -1;
return 0xffff;
}
return ch->v;
}
#endif*/
//static unsigned int n_consecutive_skipped = 0;
//static unsigned int total_skipped = 0;
var hpos_offset = 0; //global int
var vpos = 0; //global int
var vpos_count = 0, vpos_count_diff = 0; //int
var lof_store = 0; //global int, real bit in custom registers
var lof_current = 0; //int, what display device thinks
var lof_lastline = false, lof_prev_lastline = false; //bool
var lol = 0; //int
var next_lineno = 0, prev_lineno = 0; //int
var nextline_how = 0; //enum nln_how
var lof_changed = 0, lof_changing = 0, interlace_changed = 0; //int
var lof_changed_previous_field = 0; //int
var vposw_change = 0; //int
var lof_lace = false; //bool
var bplcon0_interlace_seen = false; //bool
var scandoubled_line = 0; //int
var vsync_rendered = false; //bool
//-> SAEV_Playfield_frame_rendered var frame_rendered = false; //bool
//-> SAEV_Playfield_frame_shown var frame_shown = false; //bool
var genlockhtoggle = false; //bool
var genlockvtoggle = false; //bool
var graphicsbuffer_retry = false; //bool
var scanlinecount = 0; //int
const LOF_TOGGLES_NEEDED = 3;
//const NLACE_CNT_NEEDED = 50;
var lof_togglecnt_lace = 0, lof_togglecnt_nlace = 0; //, nlace_cnt = 0; //int
/* Stupid genlock-detection prevention hack.
* We should stop calling vsync_handler() and
* hstop_handler() completely but it is not
* worth the trouble..
*/
var vpos_previous = 0, hpos_previous = 0; //int
var vpos_lpen = 0, hpos_lpen = 0, lightpen_triggered = 0; //int
var lightpen_x = -1, lightpen_y = -1, lightpen_cx = 0, lightpen_cy = 0, lightpen_active = 0, lightpen_enabled = 0; //global int
var sprtaba = null, sprtabb = null; //u32 [256]
var sprite_ab_merge = null; //u32 [256]
/* Tables for collision detection. */
var sprclx = null, clxmask = null; //u32 [16]
/* T genlock bit in ECS Denise and AGA color registers */
var color_regs_genlock = new Uint8Array(256); //u8
/*
* Hardware registers of all sorts.
*/
var cregs = new Uint16Array(256); //u16
//->custom.js var last_custom_value1 = 0; //global u32
var maxhpos = MAXHPOS_PAL; //global int
var maxhpos_short = MAXHPOS_PAL; //global int
var maxvpos = MAXVPOS_PAL; //global int
var maxvpos_nom = MAXVPOS_PAL; //global int, nominal value (same as maxvpos but "faked" maxvpos in fake 60hz modes)
var maxvpos_display = MAXVPOS_PAL; //global int, value used for display size
var hsyncendpos = 0, hsyncstartpos = 0; //global int
var maxvpos_total = 511; //int
var minfirstline = VBLANK_ENDLINE_PAL; //global int
var firstblankedline = 0; //global int
var equ_vblank_endline = EQU_ENDLINE_PAL; //int
var equ_vblank_toggle = true; //bool
var vblank_hz = VBLANK_HZ_PAL, vblank_hz_stored = 0.0, vblank_hz_nom = 0.0; //global double
//->SAEV_Playfield_fake_vblank_hz var fake_vblank_hz = 0.0; //global double
var hblank_hz = 0.0; //global double
var vblank_hz_lof = 0.0, vblank_hz_shf = 0.0, vblank_hz_lace = 0.0; //float
var vblank_hz_mult = 0, vblank_hz_state = 0; //int
var stored_chipset_refresh = null; //struct chipset_refresh *
var doublescan = 0; //global int
var programmedmode = false; //global bool
//-> events.js var syncbase = 0; //global int
var fmode_saved = 0, fmode = 0; //int
var beamcon0 = 0, new_beamcon0 = 0; //global u16
var varsync_changed = false; //bool
var vtotal = MAXVPOS_PAL, htotal = MAXHPOS_PAL; //u16
var maxvpos_stored = 0, maxhpos_stored = 0; //int
var hsstop = 0, hbstrt = 0, hbstop = 0, vsstop = 0, vbstrt = 0, vbstop = 0, hsstrt = 0, vsstrt = 0, hcenter = 0; //u16
var ciavsyncmode = 0; //int
var diw_hstrt = 0, diw_hstop = 0; //int
var diw_hcounter = 0; //int
var refptr = 0; //u16
var refptr_val = 0; //u32
function sprite() {
this.pt = 0; //uaecptr
this.xpos = 0; //all int
this.vstart = 0;
this.vstop = 0;
this.dblscan = 0; /* AGA SSCAN2 */
this.armed = 0;
this.dmastate = 0;
this.dmacycle = 0;
this.ptxhpos = 0;
this.ptxhpos2 = 0;
this.ptxvpos2 = 0;
this.ignoreverticaluntilnextline = false; //bool
this.clr = function() {
this.pt = 0;
this.xpos = 0;
this.vstart = 0;
this.vstop = 0;
this.dblscan = 0;
this.armed = 0;
this.dmastate = 0;
this.dmacycle = 0;
this.ptxhpos = 0;
this.ptxhpos2 = 0;
this.ptxvpos2 = 0;
this.ignoreverticaluntilnextline = false;
}
};
const SPR0_HPOS = 0x15;
var spr = new Array(MAX_SPRITES); //struct sprite [MAX_SPRITES]
for (var vi = 0; vi < MAX_SPRITES; vi++)
spr[vi] = new sprite();
var plfstrt_sprite = 0; //int
var sprite_ignoreverticaluntilnextline = false; //bool
var sprite_0 = 0; //global uaecptr
var sprite_0_width = 0, sprite_0_height = 0, sprite_0_doubled = 0; //global int
var sprite_0_colors = new Uint32Array(4); //global u32
var magic_sprite_mask = 0xff; //u8
var sprite_vblank_endline = VBLANK_SPRITE_PAL; //int
var sprctl = new Uint16Array(MAX_SPRITES); //u16
var sprpos = new Uint16Array(MAX_SPRITES); //u16
//#ifdef AGA
var sprdata = new Array(MAX_SPRITES); //u16 [MAX_SPRITES][4]
for (var vi = 0; vi < MAX_SPRITES; vi++) sprdata[vi] = new Uint16Array(4);
var sprdatb = new Array(MAX_SPRITES); //u16 [MAX_SPRITES][4]
for (var vi = 0; vi < MAX_SPRITES; vi++) sprdatb[vi] = new Uint16Array(4);
/*#else
var sprdata = new Array(MAX_SPRITES); //u16 [MAX_SPRITES][1]
for (var vi = 0; vi < MAX_SPRITES; vi++) sprdata[vi] = new Uint16Array(1);
var sprdatb = new Array(MAX_SPRITES); //u16 [MAX_SPRITES][1]
for (var vi = 0; vi < MAX_SPRITES; vi++) sprdatb[vi] = new Uint16Array(1);
#endif*/
//var sprite_last_drawn_at = new Int32Array(MAX_SPRITES); //int
var last_sprite_point = 0, nr_armed = 0; //int
var sprite_width = 0, sprres = 0; //int
var sprite_sprctlmask = 0; //int
var sprite_buffer_res = 0; //global int
var bpl1dat_written = false, bpl1dat_written_at_least_once = false; //bool
var bpldmawasactive = false; //bool
var bpl1mod = 0, bpl2mod = 0, dbpl1mod = 0, dbpl2mod = 0; //s16
var dbpl1mod_on = 0, dbpl2mod_on = 0; //int
var prevbpl = new Array(2); //uaecptr [2][MAXVPOS][8]
for (var vi = 0; vi < prevbpl.length; vi++) {
prevbpl[vi] = new Array(MAXVPOS);
for (var vj = 0; vj < prevbpl[vi].length; vj++) {
prevbpl[vi][vj] = new Array(8);
for (var vk = 0; vk < prevbpl[vi][vj].length; vk++) prevbpl[vi][vj][vk] = 0;
}
}
var bplpt = new Array(8); //uaecptr
var bplptx = new Array(8); //uaecptr
for (var vi = 0; vi < 8; vi++) {
bplpt[vi] = 0;
bplptx[vi] = 0;
}
/*#if 0
var dbplptl[8], dbplpth[8]; //uaecptr
var dbplptl_on[8], dbplpth_on[8], dbplptl_on2, dbplpth_on2; //int
#endif*/
var bitplane_line_crossing = 0; //int
var current_colors = new color_entry(); //struct color_entry
var bplcon0 = 0; //global uint
var bplcon1 = 0, bplcon2 = 0, bplcon3 = 0, bplcon4 = 0; //uint
var bplcon0d = 0, bplcon0dd = 0, bplcon0_res = 0, bplcon0_planes = 0, bplcon0_planes_limit = 0; //uint
var diwstrt = 0, diwstop = 0, diwhigh = 0; //uint
var diwhigh_written = 0; //int
var ddfstrt, ddfstop = 0; //uint
var line_cyclebased = 0, badmode = 0, diw_change = 0; //int
var bplcon1_fetch = 0; //int
var hpos_is_zero_bplcon1_hack = -1; //int
/* The display and data fetch windows */
var plffirstline = 0, plflastline = 0; //int
var plffirstline_total = 0, plflastline_total = 0; //global int
var autoscale_bordercolors = 0; //int
var plfstrt = 0, plfstop = 0; //int
var sprite_minx = 0, sprite_maxx = 0; //int
var first_bpl_vpos = 0; //int
var last_ddf_pix_hpos = 0; //int
var last_decide_line_hpos = 0; //int
var last_fetch_hpos = 0, last_sprite_hpos = 0; //int
var diwfirstword = 0, diwlastword = 0; //int
var last_hdiw = 0; //int
var diwstate = 0, hdiwstate = 0, ddfstate = 0; //enum diw_states
var bpl_hstart = 0; //int
var first_planes_vpos = 0, last_planes_vpos = 0; //global int
var first_bplcon0 = 0, first_bplcon0_old = 0; //int
var first_planes_vpos_old = 0, last_planes_vpos_old = 0; //int
var diwfirstword_total = 0, diwlastword_total = 0; //global int
var ddffirstword_total = 0, ddflastword_total = 0; //global int
var diwfirstword_total_old = 0, diwlastword_total_old = 0; //int
var ddffirstword_total_old = 0, ddflastword_total_old = 0; //int
var vertical_changed = 0, horizontal_changed = 0; //global bool
var firstword_bplcon1 = 0; //global int
/* Sprite collisions */
var clxdat = 0, clxcon = 0, clxcon2 = 0, clxcon_bpl_enable = 0, clxcon_bpl_match = 0; //uint
/* Recording of custom chip register changes. */
var current_change_set = 0; //int
var sprite_entries = new Array(2); //struct sprite_entry [2][MAX_SPR_PIXELS / 16];
for (var vi = 0; vi < sprite_entries.length; vi++) {
sprite_entries[vi] = new Array(MAX_SPR_PIXELS >> 4);
for (var vj = 0; vj < sprite_entries[vi].length; vj++) sprite_entries[vi][vj] = new sprite_entry();
}
var color_changes = new Array(2); //struct color_change [2][MAX_REG_CHANGE];
for (var vi = 0; vi < color_changes.length; vi++) {
color_changes[vi] = new Array(MAX_REG_CHANGE);
for (var vj = 0; vj < color_changes[vi].length; vj++) color_changes[vi][vj] = new color_change();
}
var line_drawinfo = new Array(2); //struct draw_info [2][2 * (MAXVPOS + 2) + 1];
for (var vi = 0; vi < line_drawinfo.length; vi++) {
line_drawinfo[vi] = new Array(2 * (MAXVPOS + 2) + 1);
for (var vj = 0; vj < line_drawinfo[vi].length; vj++) line_drawinfo[vi][vj] = new draw_info();
}
const COLOR_TABLE_SIZE = (MAXVPOS + 2) * 2;
var color_tables = new Array(2); //struct color_entry [2][COLOR_TABLE_SIZE];
for (var vi = 0; vi < color_tables.length; vi++) {
color_tables[vi] = new Array(COLOR_TABLE_SIZE);
for (var vj = 0; vj < color_tables[vi].length; vj++) color_tables[vi][vj] = new color_entry();
}
var line_decisions = new Array(2 * (MAXVPOS + 2) + 1); //struct decision [2 * (MAXVPOS + 2) + 1];
for (var vi = 0; vi < 2 * (MAXVPOS + 2) + 1; vi++)
line_decisions[vi] = new decision();
var next_sprite_entry = 0; //int
var prev_next_sprite_entry = 0; //int
var next_sprite_forced = 1; //int
var curr_sprite_entries = null, prev_sprite_entries = null; //struct sprite_entry *
var curr_color_changes = null, prev_color_changes = null; //struct color_change *
var curr_drawinfo = null, prev_drawinfo = null; //struct draw_info *
var curr_color_tables = null, prev_color_tables = null; //struct color_entry *
var next_color_change = 0; //int
var next_color_entry = 0, remembered_color_entry = 0; //int
var color_src_match = 0, color_dest_match = 0, color_compare_result = 0; //int
var thisline_changed = 0; //u32
/*OPT inline, ok
#ifdef SMART_UPDATE
#define MARK_LINE_CHANGED do { thisline_changed = 1; } while (0)
#else
#define MARK_LINE_CHANGED do { ; } while (0)
#endif*/
var thisline_decision = new decision(); //struct decision
var fetch_cycle = 0, fetch_modulo_cycle = 0; //int
var aga_plf_passed_stop2 = false; //bool
var plf_start_hpos = 0, plf_end_hpos = 0; //int
var ddfstop_written_hpos = 0; //int
var bitplane_off_delay = 0; //int
var ocs_agnus_ddf_enable_toggle = false; //bool
var bpl_dma_off_when_active = 0; //int
var bitplane_maybe_start_hpos = 0; //int
var ddfstop_matched = false; //bool
var cpu_accurate = true; //OWN
//enum plfstate
const plf_idle = 0;
//enable passed
const plf_passed_enable = 1;
//ddfstrt match
const plf_passed_start = 2;
//active (ddfstrt + 4 match)
const plf_active = 3;
//inactive = ; waiting
const plf_wait = 4;
//ddfstop passed
const plf_passed_stop = 5;
//ddfstop+4 passed
const plf_passed_stop_act = 6;
//last block finished
const plf_passed_stop2 = 7;
const plf_end = 8;
var plf_state = plf_idle;
//enum plfrenderstate
const plfr_idle = 0;
const plfr_active = 1;
const plfr_end = 2;
const plfr_finished = 3;
var plfr_state = plfr_idle;
//enum fetchstate
const fetch_not_started = 0;
const fetch_started_first = 1;
const fetch_started = 2;
const fetch_was_plane0 = 3;
var fetch_state = fetch_not_started;
var warned_maybe_finish_last_fetch = 20; //OWN
/*-----------------------------------------------------------------------*/
/* OWN global functions */
this.get_maxhpos = function() { return maxhpos; } //OWN
this.get_maxhpos_short = function() { return maxhpos_short; } //OWN
this.get_maxvpos = function() { return maxvpos; } //OWN
this.get_maxvpos_nom = function() { return maxvpos_nom; } //OWN
this.get_maxvpos_display = function() { return maxvpos_display; } //OWN
this.get_vpos = function() { return vpos; } //OWN
//this.set_vpos = function(v) { vpos = v; } //OWN
//this.set_vpos_count = function(v) { vpos_count = v; } //OWN
this.get_vblank_hz = function() { return vblank_hz; } //OWN
//this.get_vblank_hz_state = function() { return vblank_hz_state; } //OWN
this.get_beamcon0 = function() { return beamcon0; } //OWN
//this.get_bplcon0 = function() { return bplcon0; } //OWN input mouse fix
//this.get_bplcon0_res = function() { return bplcon0_res; } //OWN input mouse fix
//this.get_diwstate = function() { return diwstate; }; //OWN
this.set_line_cyclebased = function() { line_cyclebased = 2; }; //OWN
this.get_slowdowndata = function() { //OWN
return [
thisline_decision.plfleft,
thisline_decision.plfright - (16 << fetchmode),
cycle_diagram_total_cycles[fetchmode][GET_RES_AGNUS(bplcon0)][GET_PLANES_LIMIT(bplcon0)],
cycle_diagram_free_cycles[fetchmode][GET_RES_AGNUS(bplcon0)][GET_PLANES_LIMIT(bplcon0)]
];
};
this.set_bitplane_maybe_start_hpos = function(hpos) { //OWN used from amiga.js
line_cyclebased = 2; //SET_LINE_CYCLEBASED();
bitplane_maybe_start_hpos = hpos;
}
/*-----------------------------------------------------------------------*/
/* SECT helper functions */
//#define SET_LINE_CYCLEBASED line_cyclebased = 2;
//function SET_LINE_CYCLEBASED() { line_cyclebased = 2; } //OPT inline ok
//#define HSYNCTIME (maxhpos * SAEC_Events_CYCLE_UNIT)
//function HSYNCTIME() { return maxhpos * SAEC_Events_CYCLE_UNIT; } //OPT inline ok
this.copper_cant_read = function(hpos, alloc) {
if (hpos + 1 >= maxhpos) // first refresh slot
return 1;
if ((hpos == maxhpos - 3) && (maxhpos & 1) && alloc >= 0) {
//if (alloc) SAER.events.alloc_cycle(hpos, SAEC_Events_cycle_line_COPPER);
return -1;
}
return this.is_bitplane_dma(hpos);
}
function isecsshres() {
return bplcon0_res == SAEC_Config_Video_HResolution_SuperHiRes && (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_DENISE) && !(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA);
}
function nodraw() { //OPT inline
return framecnt != 0;
}
function doflickerfix() {
return SAEV_config.video.vresolution && doublescan < 0 && vpos < MAXVPOS;
}
/*function void setclr(*p, val) {
if (val & 0x8000)
*p |= val & 0x7FFF;
else
*p &= ~val;
}*/
function set_chipset_mode() {
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA)
fmode = fmode_saved;
else
fmode = 0;
sprite_width = GET_SPRITEWIDTH(fmode);
}
function update_mirrors() {
aga_mode = (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA) != 0;
direct_rgb = aga_mode;
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA)
sprite_sprctlmask = 0x01 | 0x08 | 0x10;
else if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_DENISE)
sprite_sprctlmask = 0x01 | 0x10;
else
sprite_sprctlmask = 0x01;
set_chipset_mode();
}
function docols(colentry) { //struct color_entry *
//#ifdef AGA
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA) {
for (var i = 0; i < 256; i++) {
var v = color_reg_get(colentry, i);
if (v < 0 || v > 16777215)
continue;
colentry.acolors[i] = getxcolor(v);
}
} else {
//#endif
for (var i = 0; i < 32; i++) {
var v = color_reg_get(colentry, i);
if (v < 0 || v > 4095)
continue;
colentry.acolors[i] = getxcolor(v);
}
//#ifdef AGA
}
//#endif
}
function notice_new_xcolors() {
update_mirrors();
docols(current_colors);
docols(colors_for_drawing);
for (var i = 0; i < (MAXVPOS + 1) * 2; i++) {
docols(color_tables[0][i]);
docols(color_tables[1][i]);
}
}
this.notice_new_xcolors_ext = function() {
notice_new_xcolors();
}
function remember_ctable() {
/* This can happen when program crashes very badly */
if (next_color_entry >= COLOR_TABLE_SIZE)
return;
if (remembered_color_entry < 0) {
/* The colors changed since we last recorded a color map. Record a new one. */
//color_reg_cpy(curr_color_tables + next_color_entry, &current_colors);
color_reg_cpy(curr_color_tables[next_color_entry], current_colors);
remembered_color_entry = next_color_entry++;
}
thisline_decision.ctable = remembered_color_entry;
if (color_src_match < 0 || color_dest_match != remembered_color_entry || line_decisions[next_lineno].ctable != color_src_match) {
/* The remembered comparison didn"t help us - need to compare again. */
var oldctable = line_decisions[next_lineno].ctable;
var changed = 0;
if (oldctable < 0) {
changed = 1;
color_src_match = color_dest_match = -1;
} else {
//color_compare_result = color_reg_cmp(&prev_color_tables[oldctable], &current_colors) != 0;
color_compare_result = color_reg_cmp(prev_color_tables[oldctable], current_colors) != 0;
if (color_compare_result)
changed = 1;
color_src_match = oldctable;
color_dest_match = remembered_color_entry;
}
thisline_changed |= changed;
} else {
/* We know the result of the comparison */
if (color_compare_result)
thisline_changed = 1;
}
}
function remember_ctable_for_border() {
remember_ctable();
}
function get_equ_vblank_endline() {
return equ_vblank_endline + (equ_vblank_toggle ? (lof_current ? 1 : 0) : 0);
}
const DDF_OFFSET = 4;
function HARD_DDF_LIMITS_DISABLED() { return ((beamcon0 & 0x80) || (beamcon0 & 0x4000) || (bplcon0 & 0x40)); }
function HARD_DDF_STOP() { return (HARD_DDF_LIMITS_DISABLED() ? maxhpos : 0xd4); } /* The HRM says 0xD8, but that can't work... */
//function HARD_DDF_START() { return (HARD_DDF_LIMITS_DISABLED() ? 0x04 : 0x14); } /* Programmed rates or superhires (!) disable normal DMA limits */
const HARD_DDF_START_REAL = 0x14;
/* Called to determine the state of the horizontal display window state
* machine at the current position. It might have changed since we last
* checked. */
function decide_diw(hpos) {
/* Last hpos = hpos + 0.5, eg. normal PAL end hpos is 227.5 * 2 = 455
OCS Denise: 9 bit hdiw counter does not reset during lines 0 to 9
(PAL) or lines 0 to 10 (NTSC). A1000 PAL: 1 to 9, NTSC: 1 to 10.
ECS Denise and AGA: no above "features"
*/
var hdiw = hpos >= maxhpos ? maxhpos * 2 + 1 : hpos * 2 + 2;
if (!(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_DENISE) && vpos <= get_equ_vblank_endline())
hdiw = diw_hcounter;
/* always mask, bad programs may have set maxhpos = 256 */
hdiw &= 511;
for (;;) {
var lhdiw = hdiw;
if (last_hdiw > lhdiw)
lhdiw = 512;
if (lhdiw >= diw_hstrt && last_hdiw < diw_hstrt && hdiwstate == DIW_WAITING_START) {
if (thisline_decision.diwfirstword < 0)
thisline_decision.diwfirstword = diwfirstword < 0 ? PIXEL_XPOS(0) : diwfirstword;
hdiwstate = DIW_WAITING_STOP;
}
if (((hpos >= maxhpos && HARD_DDF_LIMITS_DISABLED()) || (lhdiw >= diw_hstop && last_hdiw < diw_hstop)) && hdiwstate == DIW_WAITING_STOP) {
if (thisline_decision.diwlastword < 0)
thisline_decision.diwlastword = diwlastword < 0 ? 0 : diwlastword;
hdiwstate = DIW_WAITING_START;
}
if (lhdiw != 512)
break;
last_hdiw = 0 - 1;
}
last_hdiw = hdiw;
}
var fetchmode = 0, fetchmode_size = 0, fetchmode_mask = 0, fetchmode_bytes = 0; //int
var real_bitplane_number = []; //[3][3][9]; //int [3][3][9]
/* Disable bitplane DMA if planes > available DMA slots. This is needed e.g. by the Sanity WOC demo (at the "Party Effect"). */
function GET_PLANES_LIMIT(bc0) {
var res = GET_RES_AGNUS(bc0);
var planes = GET_PLANES(bc0);
return real_bitplane_number[fetchmode][res][planes];
}
/*#if 0
static void reset_dbplh(int hpos, int num) {
if (dbplpth_on[num] && hpos >= dbplpth_on[num]) {
bplpt[num] = dbplpth[num] | (bplpt[num] & 0x0000fffe);
dbplpth_on[num] = 0;
dbplpth_on2--;
}
}
static void reset_dbplh_all (int hpos) {
if (dbplpth_on2) {
for (int num = 0; num < MAX_PLANES; num++) {
reset_dbplh(hpos, num);
}
dbplpth_on2 = 0;
}
}
static void reset_dbpll (int hpos, int num) {
if (dbplptl_on[num] && hpos >= dbplptl_on[num]) {
bplpt[num] = (bplpt[num] & 0xffff0000) | dbplptl[num];
dbplptl_on[num] = 0;
dbplptl_on2--;
}
}
static void reset_dbpll_all (int hpos) {
if (dbplptl_on2) {
for (int num = 0; num < MAX_PLANES; num++) {
reset_dbpll(hpos, num);
}
dbplptl_on2 = 0;
}
}
#endif*/
function reset_moddelays() {
if (dbpl1mod_on > 0) {
bpl1mod = dbpl1mod;
dbpl1mod_on = 0;
}
if (dbpl2mod_on > 0) {
bpl2mod = dbpl2mod;
dbpl2mod_on = 0;
}
}
function add_modulo(hpos, nr) {
var mod;
if (dbpl1mod_on != hpos && dbpl1mod_on) {
bpl1mod = dbpl1mod;
dbpl1mod_on = 0;
}
if (dbpl2mod_on != hpos && dbpl2mod_on) {
bpl2mod = dbpl2mod;
dbpl2mod_on = 0;
}
if (fmode & 0x4000) {
if (((diwstrt >> 8) ^ vpos) & 1)
mod = bpl2mod;
else
mod = bpl1mod;
} else if (nr & 1)
mod = bpl2mod;
else
mod = bpl1mod;
bplpt[nr] += mod;
bplptx[nr] += mod;
reset_moddelays();
/*#if 0
reset_dbpll_all (-1);
#endif*/
}
function add_modulos() { //speedup
var m1, m2;
reset_moddelays();
/*#if 0
reset_dbpll_all(-1);
#endif*/
if (fmode & 0x4000) {
if (((diwstrt >> 8) ^ vpos) & 1)
m1 = m2 = bpl2mod;
else
m1 = m2 = bpl1mod;
} else {
m1 = bpl1mod;
m2 = bpl2mod;
}
switch (bplcon0_planes_limit) {
//#ifdef AGA
case 8: bplpt[7] += m2; bplptx[7] += m2;
case 7: bplpt[6] += m1; bplptx[6] += m1;
//#endif
case 6: bplpt[5] += m2; bplptx[5] += m2;
case 5: bplpt[4] += m1; bplptx[4] += m1;
case 4: bplpt[3] += m2; bplptx[3] += m2;
case 3: bplpt[2] += m1; bplptx[2] += m1;
case 2: bplpt[1] += m2; bplptx[1] += m2;
case 1: bplpt[0] += m1; bplptx[0] += m1;
}
}
function finish_playfield_line() {
/* The latter condition might be able to happen in interlaced frames. */
if (vpos >= minfirstline && (thisframe_first_drawn_line < 0 || vpos < thisframe_first_drawn_line))
thisframe_first_drawn_line = vpos;
thisframe_last_drawn_line = vpos;
if (SMART_UPDATE) {
if (line_decisions[next_lineno].plflinelen != thisline_decision.plflinelen
|| line_decisions[next_lineno].plfleft != thisline_decision.plfleft
|| line_decisions[next_lineno].bplcon0 != thisline_decision.bplcon0
|| line_decisions[next_lineno].bplcon2 != thisline_decision.bplcon2
//#ifdef ECS_DENISE
|| line_decisions[next_lineno].bplcon3 != thisline_decision.bplcon3
//#endif
//#ifdef AGA
|| line_decisions[next_lineno].bplcon4 != thisline_decision.bplcon4
//#endif
)
thisline_changed = 1;
} else
thisline_changed = 1;
}
this.isvga = function() {
if (!(beamcon0 & 0x80))
return false;
if (hblank_hz >= 20000)
return true;
return false;
}
this.ispal = function() {
if (beamcon0 & 0x80)
return SAEV_config.chipset.ntsc == 0;
return maxvpos_display >= MAXVPOS_NTSC + ((MAXVPOS_PAL - MAXVPOS_NTSC) >> 1);
}
/*-----------------------------------------------------------------------*/
/* SECT setup */
/* The fetch unit mainly controls ddf stop. It"s the number of cycles that
are contained in an indivisible block during which ddf is active. E.g.
if DDF starts at 0x30, and fetchunit is 8, then possible DDF stops are
0x30 + n * 8. */
var fetchunit = 0, fetchunit_mask = 0; //int
/* The delay before fetching the same bitplane again. Can be larger than
the number of bitplanes; in that case there are additional empty cycles
with no data fetch (this happens for high fetchmodes and low
resolutions). */
var fetchstart = 0, fetchstart_shift = 0, fetchstart_mask = 0; //int
/* fm_maxplane holds the maximum number of planes possible with the current
fetch mode. This selects the cycle diagram:
8 planes: 73516240
4 planes: 3120
2 planes: 10. */
var fm_maxplane = 0, fm_maxplane_shift = 0; //int
/* The corresponding values, by fetchmode and display resolution. */
const fetchunits = [8,8,8,0, 16,8,8,0, 32,16,8,0]; //int
const fetchstarts = [3,2,1,0, 4,3,2,0, 5,4,3,0]; //int
const fm_maxplanes = [3,2,1,0, 3,3,2,0, 3,3,3,0]; //int
var cycle_diagram_table = null; //int [3][3][9][32]
var cycle_diagram_free_cycles = null; //int [3][3][9]
var cycle_diagram_total_cycles = null; //int [3][3][9]
var curr_diagram = null; //int *
//const cycle_sequences = [2,1,2,1,2,1,2,1, 4,2,3,1,4,2,3,1, 8,4,6,2,7,3,5,1]; //int
const cycle_sequences = [[2,1,2,1,2,1,2,1], [4,2,3,1,4,2,3,1], [8,4,6,2,7,3,5,1]]; //int
function debug_cycle_diagram() {
var fm, res, planes, cycle, v, aa;
for (fm = 0; fm <= 2; fm++) {
var t = "";
t += sprintf("FMODE %d\n=======\n", fm);
for (res = 0; res <= 2; res++) {
for (planes = 0; planes <= 8; planes++) {
t += sprintf("%d: ",planes);
for (cycle = 0; cycle < 32; cycle++) {
v = cycle_diagram_table[fm][res][planes][cycle];
if (v == 0) aa = "-"; else if (v > 0) aa = "1"; else aa = "X";
t += aa;
}
t += sprintf("%d:%d\n", cycle_diagram_free_cycles[fm][res][planes], cycle_diagram_total_cycles[fm][res][planes]);
}
SAEF_log(t);
}
}
fm = 0;
}
function create_cycle_diagram_table() {
var fm, res, cycle, planes, rplanes, v; //int
var fetch_start, max_planes, freecycles; //int
var cycle_sequence; //const int *
if (cycle_diagram_table !== null) return;
cycle_diagram_table = new Array(3);
cycle_diagram_free_cycles = new Array(3);
cycle_diagram_total_cycles = new Array(3);
real_bitplane_number = new Array(3);
for (fm = 0; fm <= 2; fm++) {
cycle_diagram_table[fm] = new Array(3);
cycle_diagram_free_cycles[fm] = new Array(3);
cycle_diagram_total_cycles[fm] = new Array(3);
real_bitplane_number[fm] = new Array(3);
for (res = 0; res <= 2; res++) {
cycle_diagram_table[fm][res] = new Array(9);
cycle_diagram_free_cycles[fm][res] = new Array(9);
cycle_diagram_total_cycles[fm][res] = new Array(9);
real_bitplane_number[fm][res] = new Array(9);
max_planes = fm_maxplanes[fm * 4 + res];
fetch_start = 1 << fetchstarts[fm * 4 + res];
//cycle_sequence = &cycle_sequences[(max_planes - 1) * 8];
cycle_sequence = cycle_sequences[max_planes - 1];
max_planes = 1 << max_planes;
for (planes = 0; planes <= 8; planes++) {
cycle_diagram_table[fm][res][planes] = new Array(32);
freecycles = 0;
for (cycle = 0; cycle < 32; cycle++)
cycle_diagram_table[fm][res][planes][cycle] = -1;
if (planes <= max_planes) {
for (cycle = 0; cycle < fetch_start; cycle++) {
if (cycle < max_planes && planes >= cycle_sequence[cycle & 7]) {
v = cycle_sequence[cycle & 7];
} else {
v = 0;
freecycles++;
}
cycle_diagram_table[fm][res][planes][cycle] = v;
}
}
cycle_diagram_free_cycles[fm][res][planes] = freecycles;
cycle_diagram_total_cycles[fm][res][planes] = fetch_start;
rplanes = planes;
if (rplanes > max_planes)
rplanes = 0;
if (rplanes == 7 && fm == 0 && res == 0 && !(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA))
rplanes = 4;
real_bitplane_number[fm][res][planes] = rplanes;
}
}
}
//debug_cycle_diagram();
}
/* Used by the copper. */
var estimated_last_fetch_cycle = 0; //int
var cycle_diagram_shift = 0; //int
function estimate_last_fetch_cycle(hpos) {
var fetchunit = fetchunits[fetchmode * 4 + bplcon0_res];
// Last fetch is always max 8 even if fetchunit is larger.
var lastfetchunit = fetchunit >= 8 ? 8 : fetchunit;
if (plf_state < plf_passed_stop) {
var stop;
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_AGNUS) {
// ECS: stop wins if start == stop
stop = plfstop + DDF_OFFSET < hpos || plfstop > HARD_DDF_STOP() ? HARD_DDF_STOP() : plfstop;
} else {
// OCS: start wins if start == stop
stop = plfstop + DDF_OFFSET <= hpos || plfstop > HARD_DDF_STOP() ? HARD_DDF_STOP() : plfstop;
}
/* We know that fetching is up-to-date up until hpos, so we can use fetch_cycle. */
var fetch_cycle_at_stop = fetch_cycle + (stop - hpos + DDF_OFFSET);
var starting_last_block_at = (fetch_cycle_at_stop + fetchunit - 1) & ~(fetchunit - 1);
estimated_last_fetch_cycle = hpos + (starting_last_block_at - fetch_cycle) + lastfetchunit;
} else {
var starting_last_block_at = (fetch_cycle + fetchunit - 1) & ~(fetchunit - 1);
if (plf_state == plf_passed_stop2)
starting_last_block_at -= fetchunit;
estimated_last_fetch_cycle = hpos + (starting_last_block_at - fetch_cycle) + lastfetchunit;
}
}
/*-----------------------------------------------------------------------*/
/* SECT toscr */
var outword = new Uint32Array(MAX_PLANES); //u32
var out_nbits = 0, out_offs = 0; //int
var todisplay = new Uint16Array(MAX_PLANES); //u16
var todisplay2 = new Uint16Array(MAX_PLANES); //u16
var fetched = new Uint16Array(MAX_PLANES); //u16
var todisplay_fetched = new Array(2); //bool
//#ifdef AGA
//var todisplay_aga[MAX_PLANES], todisplay2_aga[MAX_PLANES], fetched_aga[MAX_PLANES]; //u64
var todisplay_aga_hi = new Uint32Array(MAX_PLANES);
var todisplay_aga_lo = new Uint32Array(MAX_PLANES);
var todisplay2_aga_hi = new Uint32Array(MAX_PLANES);
var todisplay2_aga_lo = new Uint32Array(MAX_PLANES);
var fetched_aga_hi = new Uint32Array(MAX_PLANES);
var fetched_aga_lo = new Uint32Array(MAX_PLANES);
//#endif
/* Expansions from bplcon0/bplcon1. */
var toscr_res = 0, toscr_res2p = 0; //all int
var toscr_nr_planes = 0, toscr_nr_planes2 = 0, toscr_nr_planes_agnus = 0, toscr_nr_planes_shifter = 0;
var fetchwidth = 0;
var toscr_delay = new Int32Array(2);
var toscr_delay_adjusted = new Int32Array(2);
var toscr_delay_sh = new Int32Array(2);
var delay_cycles = 0;
var delay_lastcycle = new Int32Array(2);
var bplcon1_written = false; //bool
const PLANE_RESET_HPOS = 8;
var planesactiveatresetpoint = 0; //int
/* The number of bits left from the last fetched words.
This is an optimization - conceptually, we have to make sure the result is
the same as if toscr is called in each clock cycle. However, to speed this
up, we accumulate display data; this variable keeps track of how much.
Thus, once we do call toscr_nbits (which happens at least every 16 bits),
we can do more work at once. */
var toscr_nbits = 0; //int
/*#if 0 //undocumented bitplane delay hardware feature
var delayoffset; //int
function compute_delay_offset() {
delayoffset = (16 << fetchmode) - (((plfstrt - HARD_DDF_START_REAL) & fetchstart_mask) << 1);
if (tmp == 4) delayoffset = 4; // Loons Docs
else if (tmp == 8) delayoffset = 8;
else if (tmp == 12) delayoffset = 4; //Loons Docs
else if (tmp == 16) delayoffset = 48; //Overkill AGA
else if (tmp == 24) delayoffset = 8; //AB 2
else if (tmp == 32) delayoffset = 32;
else if (tmp == 48) delayoffset = 16; //Pinball Illusions AGA, ingame
else delayoffset = 0; //what about 40 and 56?
}
#endif*/
function record_color_change2(hpos, regno, value) {
var pos = hpos * 2;
if (regno == 0x1000 + 0x10c)
pos++; // BPLCON4 change needs 1 lores pixel delay
curr_color_changes[next_color_change].linepos = pos;
curr_color_changes[next_color_change].regno = regno;
curr_color_changes[next_color_change].value = value;
next_color_change++;
curr_color_changes[next_color_change].regno = -1;
}
function isehb(bplcon0, bplcon2) {
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA)
return (bplcon0 & 0x7010) == 0x6000;
else if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_DENISE)
return (bplcon0 & 0xFC00) == 0x6000 || (bplcon0 & 0xFC00) == 0x7000;
return ((bplcon0 & 0xFC00) == 0x6000 || (bplcon0 & 0xFC00) == 0x7000) && !SAEV_config.chipset.deniseNoEHB;
}
// OCS/ECS, lores, 7 planes = 4 "real" planes + BPL5DAT and BPL6DAT as static 5th and 6th plane
function isocs7planes() {
return (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA) == 0 && bplcon0_res == 0 && bplcon0_planes == 7;
}
this.is_bitplane_dma = function(hpos) { //global
if (hpos < bpl_hstart || fetch_state == fetch_not_started || plf_state == plf_wait)
return 0;
if ((plf_state >= plf_end && hpos >= thisline_decision.plfright) || hpos >= estimated_last_fetch_cycle)
return 0;
return curr_diagram[(hpos - cycle_diagram_shift) & fetchstart_mask];
}
function islinetoggle() {
if (!(beamcon0 & 0x0800) && !(beamcon0 & 0x0020) && (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_AGNUS)) return true; // NTSC and !LOLDIS -> LOL toggles every line
else if (!(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_AGNUS) && SAEV_config.chipset.ntsc) return true; // hardwired NTSC Agnus
return false;
}
/* Expand bplcon0/bplcon1 into the toscr_xxx variables. */
function compute_toscr_delay(bplcon1) {
var delay1 = (bplcon1 & 0x0f) | ((bplcon1 & 0x0c00) >> 6);
var delay2 = ((bplcon1 >> 4) & 0x0f) | (((bplcon1 >> 4) & 0x0c00) >> 6);
var shdelay1 = (bplcon1 >> 8) & 3;
var shdelay2 = (bplcon1 >> 12) & 3;
var delaymask = fetchmode_mask >> toscr_res;
toscr_delay[0] = (delay1 & delaymask) << toscr_res;
toscr_delay[0] |= shdelay1 >> (RES_MAX - toscr_res);
toscr_delay[1] = (delay2 & delaymask) << toscr_res;
toscr_delay[1] |= shdelay2 >> (RES_MAX - toscr_res);
if (SPEEDUP) {
/* SPEEDUP code still needs this hack */
var delayoffset = fetchmode_size - (((bpl_hstart - (HARD_DDF_START_REAL + DDF_OFFSET)) & fetchstart_mask) << 1);
delay1 += delayoffset;
delay2 += delayoffset;
toscr_delay_adjusted[0] = (delay1 & delaymask) << toscr_res;
toscr_delay_adjusted[0] |= shdelay1 >> (RES_MAX - toscr_res);
toscr_delay_adjusted[1] = (delay2 & delaymask) << toscr_res;
toscr_delay_adjusted[1] |= shdelay2 >> (RES_MAX - toscr_res);
}
}
function set_delay_lastcycle() {
if (HARD_DDF_LIMITS_DISABLED()) {
delay_lastcycle[0] = (256 * 2) << bplcon0_res;
delay_lastcycle[1] = (256 * 2) << bplcon0_res;
} else {
delay_lastcycle[0] = ((maxhpos + 1) * 2 + 0) << bplcon0_res;
delay_lastcycle[1] = delay_lastcycle[0];
if (islinetoggle())
delay_lastcycle[1]++;
}
}
var bpldmasetuphpos, bpldmasetuphpos_diff; //int
var bpldmasetupphase; //int
/* set currently active Agnus bitplane DMA sequence */
function setup_fmodes(hpos) {
switch (fmode & 3) {
case 0:
fetchmode = 0;
break;
case 1:
case 2:
fetchmode = 1;
break;
case 3:
fetchmode = 2;
break;
}
badmode = GET_RES_AGNUS(bplcon0) != GET_RES_DENISE(bplcon0);
bplcon0_res = GET_RES_AGNUS(bplcon0);
bplcon0_planes = GET_PLANES(bplcon0);
bplcon0_planes_limit = GET_PLANES_LIMIT(bplcon0);
fetchunit = fetchunits[fetchmode * 4 + bplcon0_res];
fetchunit_mask = fetchunit - 1;
fetchstart_shift = fetchstarts[fetchmode * 4 + bplcon0_res];
fetchstart = 1 << fetchstart_shift;
fetchstart_mask = fetchstart - 1;
fm_maxplane_shift = fm_maxplanes[fetchmode * 4 + bplcon0_res];
fm_maxplane = 1 << fm_maxplane_shift;
fetch_modulo_cycle = fetchunit - fetchstart;
fetchmode_size = 16 << fetchmode;
fetchmode_bytes = 2 << fetchmode;
fetchmode_mask = fetchmode_size - 1;
set_delay_lastcycle();
compute_toscr_delay(bplcon1);
if (thisline_decision.plfleft < 0) {
thisline_decision.bplres = bplcon0_res;
thisline_decision.bplcon0 = bplcon0;
thisline_decision.nr_planes = bplcon0_planes;
}
curr_diagram = cycle_diagram_table[fetchmode][bplcon0_res][bplcon0_planes_limit];
//if (SAER.playfield.is_bitplane_dma(hpos - 1)) SAER_Events_cycle_line[hpos - 1] = SAEC_Events_cycle_line_REFRESH;
estimate_last_fetch_cycle(hpos);
bpldmasetuphpos = -1;
bpldmasetupphase = 0;
toscr_nr_planes_agnus = bplcon0_planes;
if (isocs7planes())
toscr_nr_planes_agnus = 6;
line_cyclebased = 2; //SET_LINE_CYCLEBASED();
}
// writing to BPLCON0 adds 4 cycle delay before Agnus bitplane DMA sequence changes
// (Note that Denise sees the change after 1 cycle)
// AGA needs extra cycle in some specific situations (Brian The Lion "dialog") but not
// in all situations (Superstardust weapon panel)
//#define BPLCON_AGNUS_DELAY (3 + (SAEV_Copper_access ? 1 : 0) + (bplcon0_planes == 8 ? 1 : 0)) //OPT inline, ok
//#define BPLCON_DENISE_DELAY (SAEV_Copper_access ? 1 : 0) //OPT inline, ok
function maybe_setup_fmodes(hpos) {
switch (bpldmasetupphase) {
case 0:
BPLCON0_Denise(hpos, bplcon0, false);
bpldmasetupphase++;
bpldmasetuphpos += bpldmasetuphpos_diff;
break;
case 1:
setup_fmodes(hpos);
break;
}
}
function maybe_check(hpos) {
if (bpldmasetuphpos > 0 && hpos >= bpldmasetuphpos)
maybe_setup_fmodes(hpos);
}
function bpldmainitdelay(hpos) {
line_cyclebased = 2; //SET_LINE_CYCLEBASED();
//if (hpos + BPLCON_AGNUS_DELAY < 0x14) { //ORG
if (hpos + 3 + (SAEV_Copper_access ? 1 : 0) + (bplcon0_planes == 8 ? 1 : 0) < 0x14) { //OWN opt inline
BPLCON0_Denise(hpos, bplcon0, false);
setup_fmodes(hpos);
return;
}
/*ORG
if (bpldmasetuphpos < 0) {
bpldmasetuphpos = hpos + BPLCON_DENISE_DELAY;
bpldmasetuphpos_diff = BPLCON_AGNUS_DELAY - BPLCON_DENISE_DELAY;
bpldmasetupphase = 0;
if (BPLCON_DENISE_DELAY == 0)
maybe_setup_fmodes(hpos);
}*/
if (bpldmasetuphpos < 0) { //OWN opt inline
bpldmasetuphpos = hpos + (SAEV_Copper_access ? 1 : 0);
//bpldmasetuphpos_diff = 3 + (SAEV_Copper_access ? 1 : 0) + (bplcon0_planes == 8 ? 1 : 0) - (SAEV_Copper_access ? 1 : 0);
bpldmasetuphpos_diff = 3 + (bplcon0_planes == 8 ? 1 : 0);
bpldmasetupphase = 0;
if (!SAEV_Copper_access)
maybe_setup_fmodes(hpos);
}
}
/*STATIC_INLINE void clear_fetchbuffer (uae_u32 *ptr, int nwords) {
if (!thisline_changed) {
for (int i = 0; i < nwords; i++) {
if (ptr[i]) {
thisline_changed = 1;
break;
}
}
}
memset(ptr, 0, nwords * 4);
}*/
function clear_fetchbuffer(data, offs, nwords) {
if (!thisline_changed) {
for (var i = offs, j = offs + nwords; i < j; i++) {
if (data[i]) {
thisline_changed = 1;
break;
}
}
}
//SAEF_memset(data,offs, 0, nwords);
for (var i = offs, j = offs + nwords; i < j; i++) data[i] = 0;
}
function update_toscr_planes(fm) {
// This must be called just before new bitplane block starts,
// not when depth value changes. Depth can change early and can leave
// 16+ pixel horizontal line of old data visible.
if (toscr_nr_planes_agnus > thisline_decision.nr_planes) {
if (out_offs) {
for (var j = thisline_decision.nr_planes; j < toscr_nr_planes_agnus; j++) {
//clear_fetchbuffer((uae_u32 *)(line_data[next_lineno] + 2 * MAX_WORDS_PER_LINE * j), out_offs);
clear_fetchbuffer(line_data[next_lineno], MAX_WORDS_PER_LINE_FULL * j, out_offs);
if (thisline_decision.plfleft >= 0) {
todisplay[j] = 0;
//#ifdef AGA
if (fm) {
//todisplay_aga[j] = 0;
todisplay_aga_hi[j] = todisplay_aga_lo[j] = 0;
}
//#endif
}
}
}
thisline_decision.nr_planes = toscr_nr_planes_agnus;
}
}
function maybe_first_bpl1dat(hpos) {
if (thisline_decision.plfleft < 0)
thisline_decision.plfleft = hpos;
}
function fetch_warn(nr, hpos) {
//static int warned1 = 30, warned2 = 30;
var add = fetchmode_bytes;
if (hpos == maxhpos - 1) {
//if (warned1 >= 0)
{
SAEF_warn("playfield.fetch_warn() BPL fetch conflicts with strobe refresh slot!");
//warned1--;
}
add = refptr_val;
} else {
//if (warned2 >= 0)
{
//warned2--;
SAEF_warn("playfield.fetch_warn() BPL fetch at hpos %d/%d", hpos, maxhpos);
}
add = refptr_val;
}
bitplane_line_crossing = hpos;
/*#if 0
line_cyclebased = vpos;
corrupt_offset = (vpos ^ (SAEV_Events_timeframes << 12)) & 0xff00;
for (var i = 0; i < bplcon0_planes_limit; i++) {
uae_u16 v;
v = bplpt[i] & 0xffff;
v += corrupt_offset;
bplpt[i] = (bplpt[i] & 0xffff0000) | v;
}
#endif*/
return add;
}
function fetch(nr, fm, hpos) {
if (nr < bplcon0_planes_limit) {
var p;
var add = fetchmode_bytes;
if (hpos > maxhpos - HPOS_SHIFT && !(beamcon0 & 0x80))
add = fetch_warn(nr, hpos);
p = bplpt[nr];
bplpt[nr] += add;
bplptx[nr] += add;
/*#if 0
if (dbplpth_on2) reset_dbplh(hpos, nr);
if (dbplptl_on2) reset_dbpll(hpos, nr);
#endif*/
if (nr == 0)
bpl1dat_written = true;
switch (fm) {
case 0: {
fetched[nr] = SAER_Memory_chipGet16_indirect(p);
SAEV_Custom_last_value = fetched[nr];
break;
}
//#ifdef AGA
case 1: {
//fetched_aga[nr] = SAER_Memory_chipGet32_indirect(p);
fetched_aga_hi[nr] = 0;
fetched_aga_lo[nr] = SAER_Memory_chipGet32_indirect(p);
SAEV_Custom_last_value = fetched_aga_lo[nr];
fetched[nr] = fetched_aga_lo[nr] & 0xffff;
break;
}
case 2: {
//fetched_aga[nr] = ((uae_u64)SAER_Memory_chipGet32_indirect(p)) << 32;
//fetched_aga[nr] |= SAER_Memory_chipGet32_indirect(p + 4);
fetched_aga_hi[nr] = SAER_Memory_chipGet32_indirect(p);
fetched_aga_lo[nr] = SAER_Memory_chipGet32_indirect(p + 4);
SAEV_Custom_last_value = fetched_aga_lo[nr];
fetched[nr] = fetched_aga_lo[nr] & 0xffff;
break;
}
//#endif
}
if (plf_state == plf_passed_stop2 && fetch_cycle >= (fetch_cycle & ~fetchunit_mask) + fetch_modulo_cycle)
add_modulo(hpos, nr);
}
}
function toscr_3_ecs(oddeven, step, nbits) {
var i, shift = 16 - nbits;
// if number of planes decrease (or go to zero), we still need to
// shift all possible remaining pixels out of Denise"s shift register
for (i = oddeven; i < thisline_decision.nr_planes; i += step)
outword[i] <<= nbits;
for (i = oddeven; i < toscr_nr_planes2; i += step) {
outword[i] |= todisplay2[i] >>> shift;
todisplay2[i] <<= nbits;
}
}
//#ifdef AGA
function toscr_3_aga(oddeven, step, nbits, fm) {
var i, shift = fetchmode_size - nbits;
var mask = 0xffff >> (16 - nbits);
for (i = oddeven; i < thisline_decision.nr_planes; i += step)
outword[i] <<= nbits;
for (i = oddeven; i < toscr_nr_planes2; i += step) {
//outword[i] |= (todisplay2_aga[i] >>> shift) & mask;
if (shift < 32)
outword[i] |= ((todisplay2_aga_hi[i] << (32 - shift)) | (todisplay2_aga_lo[i] >>> shift)) & mask; //ATT
else
outword[i] |= (todisplay2_aga_hi[i] >>> (shift - 32)) & mask;
//todisplay2_aga[i] <<= nbits;
//if (nbits < 32) {
todisplay2_aga_hi[i] = (todisplay2_aga_hi[i] << nbits) | (todisplay2_aga_lo[i] >>> (32 - nbits)); //ATT
todisplay2_aga_lo[i] <<= nbits;
/*} else {
todisplay2_aga_hi[i] = todisplay2_aga_lo[i] << (nbits - 32);
todisplay2_aga_lo[i] = 0;
}*/
}
}
//#endif
/*OPT inline, ok
function toscr_2_0(nbits) { toscr_3_ecs (0, 1, nbits); }
function toscr_2_0_oe(oddeven, step, nbits) { toscr_3_ecs (oddeven, step, nbits); }
//#ifdef AGA
function toscr_2_1(nbits) { toscr_3_aga (0, 1, nbits, 1); }
function toscr_2_1_oe(oddeven, step, nbits) { toscr_3_aga (oddeven, step, nbits, 1); }
function toscr_2_2(nbits) { toscr_3_aga (0, 1, nbits, 2); }
function toscr_2_2_oe(oddeven, step, nbits) { toscr_3_aga (oddeven, step, nbits, 2); }
//#endif
function do_tosrc(oddeven, step, nbits, fm) {
switch (fm) {
case 0:
if (step == 2)
toscr_2_0_oe(oddeven, step, nbits);
else
toscr_2_0(nbits);
break;
//#ifdef AGA
case 1:
if (step == 2)
toscr_2_1_oe(oddeven, step, nbits);
else
toscr_2_1(nbits);
break;
case 2:
if (step == 2)
toscr_2_2_oe(oddeven, step, nbits);
else
toscr_2_2(nbits);
break;
//#endif
}
}*/
function do_tosrc(oddeven, step, nbits, fm) {
if (step == 2) {
if (fm == 0)
toscr_3_ecs(oddeven, 2, nbits);
else
toscr_3_aga(oddeven, 2, nbits, fm);
} else {
if (fm == 0)
toscr_3_ecs(0, 1, nbits);
else
toscr_3_aga(0, 1, nbits, fm);
}
}
function do_delays_3_ecs(nbits) {
var delaypos = delay_cycles & fetchmode_mask;
for (var oddeven = 0; oddeven < 2; oddeven++) {
var delay = toscr_delay[oddeven];
/*#if 0
for (var j = 0; j < nbits; j++) {
var dp = (delay_cycles + j);
if (dp >= (maxhpos * 2) << toscr_res)
dp -= (maxhpos * 2) << toscr_res;
dp &= fetchmode_mask;
do_tosrc(oddeven, 2, 1, 0);
if (todisplay_fetched[oddeven] && dp == delay) {
for (var i = oddeven; i < toscr_nr_planes_shifter; i += 2) {
todisplay2[i] = todisplay[i];
}
todisplay_fetched[oddeven] = false;
}
}
#else*/
if (delaypos > delay)
delay += fetchmode_size;
var diff = delay - delaypos;
var nbits2 = nbits;
if (nbits2 > diff) {
do_tosrc(oddeven, 2, diff, 0);
nbits2 -= diff;
if (todisplay_fetched[oddeven]) {
for (var i = oddeven; i < toscr_nr_planes_shifter; i += 2)
todisplay2[i] = todisplay[i];
todisplay_fetched[oddeven] = false;
}
}
if (nbits2) do_tosrc(oddeven, 2, nbits2, 0);
//#endif
}
}
function do_delays_fast_3_ecs(nbits) {
var delaypos = delay_cycles & fetchmode_mask;
var delay = toscr_delay[0];
if (delaypos > delay)
delay += fetchmode_size;
var diff = delay - delaypos;
var nbits2 = nbits;
if (nbits2 > diff) {
do_tosrc(0, 1, diff, 0);
nbits2 -= diff;
if (todisplay_fetched[0]) {
for (var i = 0; i < toscr_nr_planes_shifter; i++)
todisplay2[i] = todisplay[i];
todisplay_fetched[0] = false;
todisplay_fetched[1] = false;
}
}
if (nbits2) do_tosrc (0, 1, nbits2, 0);
}
function do_delays_3_aga (nbits, fm) {
var delaypos = delay_cycles & fetchmode_mask;
for (var oddeven = 0; oddeven < 2; oddeven++) {
var delay = toscr_delay[oddeven];
if (delaypos > delay)
delay += fetchmode_size;
var diff = delay - delaypos;
var nbits2 = nbits;
if (nbits2 > diff) {
do_tosrc(oddeven, 2, diff, fm);
nbits2 -= diff;
if (todisplay_fetched[oddeven]) {
for (var i = oddeven; i < toscr_nr_planes_shifter; i += 2) {
//todisplay2_aga[i] = todisplay_aga[i];
todisplay2_aga_hi[i] = todisplay_aga_hi[i];
todisplay2_aga_lo[i] = todisplay_aga_lo[i];
}
todisplay_fetched[oddeven] = false;
}
}
if (nbits2) do_tosrc (oddeven, 2, nbits2, fm);
}
}
function do_delays_fast_3_aga (nbits, fm) {
var delaypos = delay_cycles & fetchmode_mask;
var delay = toscr_delay[0];
if (delaypos > delay)
delay += fetchmode_size;
var diff = delay - delaypos;
var nbits2 = nbits;
if (nbits2 > diff) {
do_tosrc(0, 1, diff, fm);
nbits2 -= diff;
if (todisplay_fetched[0]) {
for (var i = 0; i < toscr_nr_planes_shifter; i++) {
//todisplay2_aga[i] = todisplay_aga[i];
todisplay2_aga_hi[i] = todisplay_aga_hi[i];
todisplay2_aga_lo[i] = todisplay_aga_lo[i];
}
todisplay_fetched[0] = false;
todisplay_fetched[1] = false;
}
}
if (nbits2) do_tosrc(0, 1, nbits2, fm);
}
/*OPT inline, ok
function do_delays_2_0(nbits) { do_delays_3_ecs(nbits); }
//#ifdef AGA
function do_delays_2_1(nbits) { do_delays_3_aga(nbits, 1); }
function do_delays_2_2(nbits) { do_delays_3_aga(nbits, 2); }
//#endif
function do_delays_fast_2_0(nbits) { do_delays_fast_3_ecs(nbits); }
//#ifdef AGA
function do_delays_fast_2_1(nbits) { do_delays_fast_3_aga(nbits, 1); }
function do_delays_fast_2_2(nbits) { do_delays_fast_3_aga(nbits, 2); }
//#endif
// slower version, odd and even delays are different or crosses maxhpos
function do_delays(nbits, fm) {
switch (fm) {
case 0:
do_delays_2_0(nbits);
break;
//#ifdef AGA
case 1:
do_delays_2_1(nbits);
break;
case 2:
do_delays_2_2(nbits);
break;
//#endif
}
}*/
function do_delays(nbits, fm) {
if (fm == 0)
do_delays_3_ecs(nbits);
else
do_delays_3_aga(nbits, fm);
}
// common optimized case: odd delay == even delay
/*function do_delays_fast(nbits, fm) {
switch (fm) {
case 0:
do_delays_fast_2_0(nbits);
break;
//#ifdef AGA
case 1:
do_delays_fast_2_1(nbits);
break;
case 2:
do_delays_fast_2_2(nbits);
break;
//#endif
}
}
function do_delays_fast(nbits, fm) {
if (fm == 0)
do_delays_fast_3_ecs(nbits);
else
do_delays_fast_3_aga(nbits, fm);
}*/
function toscr_right_edge(nbits, fm) {
// Emulate hpos counter (delay_cycles) reseting at the end of scanline.
// (Result is ugly shift in graphics in far right overscan)
var diff = delay_lastcycle[lol] - delay_cycles;
var nbits2 = nbits;
if (nbits2 >= diff) {
do_delays(diff, fm);
nbits2 -= diff;
delay_cycles = 0;
if (hpos_is_zero_bplcon1_hack >= 0) {
compute_toscr_delay(hpos_is_zero_bplcon1_hack);
hpos_is_zero_bplcon1_hack = -1;
}
toscr_delay[0] -= 2;
toscr_delay[0] &= fetchmode_mask;
toscr_delay[1] -= 2;
toscr_delay[1] &= fetchmode_mask;
}
if (nbits2) {
do_delays(nbits2, fm);
delay_cycles += nbits2;
}
}
function toscr_1(nbits, fm) {
if (delay_cycles + nbits >= delay_lastcycle[lol]) {
toscr_right_edge(nbits, fm);
} else if (toscr_delay[0] == toscr_delay[1]) {
// Most common case.
//do_delays_fast(nbits, fm); //ORG
if (fm == 0) //OWN
do_delays_fast_3_ecs(nbits);
else
do_delays_fast_3_aga(nbits, fm);
delay_cycles += nbits;
} else {
do_delays(nbits, fm);
delay_cycles += nbits;
}
out_nbits += nbits;
if (out_nbits == 32) {
/*uae_u8 *dataptr = line_data[next_lineno] + out_offs * 4;
for (int i = 0; i < thisline_decision.nr_planes; i++) {
uae_u32 *dataptr32 = (uae_u32 *)dataptr;
if (*dataptr32 != outword[i]) {
thisline_changed = 1;
*dataptr32 = outword[i];
}
outword[i] = 0;
dataptr += MAX_WORDS_PER_LINE * 2;
}*/
var data = line_data[next_lineno];
var offs = out_offs;
for (var i = 0; i < thisline_decision.nr_planes; i++) {
if (data[offs] != outword[i]) {
data[offs] = outword[i];
thisline_changed = 1;
}
outword[i] = 0;
offs += MAX_WORDS_PER_LINE_FULL;
}
out_offs++;
out_nbits = 0;
}
}
function toscr_fm0(nbits) { toscr_0(nbits, 0); }
function toscr_fm1(nbits) { toscr_0(nbits, 1); }
function toscr_fm2(nbits) { toscr_0(nbits, 2); }
function toscr(nbits, fm) { //OPT recursive
switch (fm) {
case 0: toscr_fm0(nbits); break;
//#ifdef AGA
case 1: toscr_fm1(nbits); break;
case 2: toscr_fm2(nbits); break;
//#endif
}
}
function toscr_0(nbits, fm) {
if (nbits > 16) {
toscr(16, fm);
nbits -= 16;
}
var t = 32 - out_nbits;
if (t < nbits) {
toscr_1(t, fm);
nbits -= t;
}
toscr_1(nbits, fm);
}
function flush_plane_data(fm) {
var i = 0;
if (out_nbits <= 16) {
i += 16;
toscr_1(16, fm);
}
if (out_nbits != 0) {
i += 32 - out_nbits;
toscr_1(32 - out_nbits, fm);
}
i += 32;
toscr_1(16, fm);
toscr_1(16, fm);
if (fm == 2) {
/* flush AGA full 64-bit shift register + possible data in todisplay */
i += 32;
toscr_1(16, fm);
toscr_1(16, fm);
i += 32;
toscr_1(16, fm);
toscr_1(16, fm);
}
return i >> (1 + toscr_res);
}
function flush_display(fm) {
if (toscr_nbits > 0 && thisline_decision.plfleft >= 0)
toscr(toscr_nbits, fm);
toscr_nbits = 0;
}
/*-----------------------------------------------------------------------*/
/* SECT fetch */
function hack_shres_delay(hpos) {
if (!(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA) && !toscr_delay_sh[0] && !toscr_delay_sh[1])
return;
var o0 = toscr_delay_sh[0];
var o1 = toscr_delay_sh[1];
var shdelay1 = (bplcon1 >> 8) & 3;
var shdelay2 = (bplcon1 >> 12) & 3;
toscr_delay_sh[0] = (shdelay1 & 3) >> toscr_res;
toscr_delay_sh[1] = (shdelay2 & 3) >> toscr_res;
if (hpos >= 0 && toscr_delay_sh[0] != o0 || toscr_delay_sh[1] != o1) {
record_color_change(hpos, 0, COLOR_CHANGE_SHRES_DELAY | toscr_delay_sh[0]);
current_colors.extra &= ~(1 << CE_SHRES_DELAY);
current_colors.extra &= ~(1 << (CE_SHRES_DELAY + 1));
current_colors.extra |= toscr_delay_sh[0] << CE_SHRES_DELAY;
remembered_color_entry = -1;
}
}
function update_denise_shifter_planes(hpos) {
var np = GET_PLANES(bplcon0d);
// if DMA has ended but there is still data waiting in todisplay,
// it must be flushed out before number of planes change
if (np < toscr_nr_planes_shifter && hpos > thisline_decision.plfright && thisline_decision.plfright && (todisplay_fetched[0] || todisplay_fetched[1])) {
var diff = (hpos - thisline_decision.plfright) << (1 + toscr_res);
while (diff >= 16) {
toscr_1(16, fetchmode);
diff -= 16;
}
if (diff)
toscr_1(diff, fetchmode);
thisline_decision.plfright += hpos - thisline_decision.plfright;
}
// FIXME: Samplers / Back In 90 vs Disposable Hero title screen in fast modes
if (SAEV_config.cpu.model < SAEC_Config_CPU_Model_68020) {
toscr_nr_planes_shifter = np;
if (isocs7planes()) {
if (toscr_nr_planes_shifter < 6)
toscr_nr_planes_shifter = 6;
}
}
}
function update_denise(hpos) {
var res = GET_RES_DENISE(bplcon0d);
if (res != toscr_res)
flush_display(fetchmode);
toscr_res = GET_RES_DENISE(bplcon0d);
toscr_res2p = 2 << toscr_res;
delay_cycles = (hpos * 2) << toscr_res;
if (bplcon0dd != bplcon0d) {
record_color_change2(hpos, 0x100 + 0x1000, bplcon0d);
bplcon0dd = bplcon0d;
}
toscr_nr_planes = GET_PLANES(bplcon0d);
if (isocs7planes()) {
if (toscr_nr_planes2 < 6)
toscr_nr_planes2 = 6;
} else {
toscr_nr_planes2 = toscr_nr_planes;
}
toscr_nr_planes_shifter = toscr_nr_planes2;
hack_shres_delay(hpos);
}
/*function fetch_start(hpos) {
fetch_state = fetch_started;
}*/
function pfield_xlateptr(plpt, bytecount) {
//if (!chipmem_check_indirect(plpt, bytecount)) {
if (!SAER_Memory_chipCheck_indirect(plpt, bytecount)) {
//static int count = 0; if (!count) count++, SAEF_warn("playfield.pfield_xlateptr() bad playfield pointer %08x", plpt);
return null;
}
//return chipmem_xlate_indirect(plpt);
return SAER_Memory_chipXLate_indirect(plpt);
}
/* Called when all planes have been fetched, i.e. when a new block
of data is available to be displayed. The data in fetched[] is
moved into todisplay[]. */
function beginning_of_plane_block(hpos, fm) {
var i;
if (fm == 0)
for (i = 0; i < MAX_PLANES; i++) {
todisplay[i] = fetched[i];
}
//#ifdef AGA
else
for (i = 0; i < MAX_PLANES; i++) {
//todisplay_aga[i] = fetched_aga[i];
todisplay_aga_hi[i] = fetched_aga_hi[i];
todisplay_aga_lo[i] = fetched_aga_lo[i];
}
//#endif
todisplay_fetched[0] = todisplay_fetched[1] = true;
maybe_first_bpl1dat(hpos);
update_denise(hpos);
if (toscr_nr_planes_agnus > thisline_decision.nr_planes)
update_toscr_planes(fm);
}
/* The usual inlining tricks - don't touch unless you know what you are doing. */
//#if SPEEDUP
function long_fetch_16(plane, nwords, weird_number_of_bits, dma) {
//uae_u16 *real_pt = (uae_u16 *)pfield_xlateptr (bplpt[plane], nwords * 2);
var real_pt = pfield_xlateptr(bplpt[plane], nwords * 2);
//var real_pt2 = bplpt[plane] >>> 1;
var delay = toscr_delay_adjusted[plane & 1];
var tmp_nbits = out_nbits;
var outval = outword[plane]; //u32
var fetchval = fetched[plane]; //u32
//uae_u32 *dataptr = (uae_u32 *)(line_data[next_lineno] + 2 * plane * MAX_WORDS_PER_LINE + 4 * out_offs);
var data = line_data[next_lineno];
var offs = MAX_WORDS_PER_LINE_FULL * plane + out_offs; //OWN
if (dma) {
bplpt[plane] += nwords * 2;
bplptx[plane] += nwords * 2;
}
if (real_pt === null) //Don't do this, fall back on chipmem_wget instead.
return;
var shiftbuffer = todisplay2[plane] << delay; //u32, ATT
while (nwords > 0) {
var bits_left = 32 - tmp_nbits;
shiftbuffer = (shiftbuffer | fetchval) >>> 0;
var t = (shiftbuffer >>> delay) & 0xffff; //u32
if (weird_number_of_bits && bits_left < 16) {
outval = (outval << bits_left) & 0xffffffff;
outval = (outval | (t >>> (16 - bits_left))) >>> 0;
//thisline_changed |= *dataptr ^ outval; *dataptr++ = outval;
thisline_changed |= (data[offs] ^ outval) >>> 0; data[offs++] = outval;
outval = t;
tmp_nbits = 16 - bits_left;
} else {
outval = (((outval << 16) & 0xffffffff) | t) >>> 0;
tmp_nbits += 16;
if (tmp_nbits == 32) {
//thisline_changed |= *dataptr ^ outval; *dataptr++ = outval;
thisline_changed |= (data[offs] ^ outval) >>> 0; data[offs++] = outval;
tmp_nbits = 0;
}
}
shiftbuffer = (shiftbuffer << 16) & 0xffffffff;
nwords--;
if (dma) {
fetchval = (SAER_Memory_chipData[real_pt] << 8) | SAER_Memory_chipData[real_pt+1];
real_pt += 2;
//fetchval = do_get_mem_word(real_pt); real_pt++;
//fetchval = SAER_Memory_chipGet16_indirect[real_pt]; real_pt += 2;
//fetchval = SAER_Memory_chipData[real_pt2++]; //real_pt2++;
/*#if 0
if (plane == 0) fetchval ^= 0x55555555;
#endif*/
}
}
fetched[plane] = fetchval;
todisplay2[plane] = shiftbuffer >>> delay; //ATT
outword[plane] = outval;
}
//#ifdef AGA
function long_fetch_32(plane, nwords, weird_number_of_bits, dma) {
//uae_u32 *real_pt = (uae_u32 *)pfield_xlateptr (bplpt[plane], nwords * 2);
var real_pt = pfield_xlateptr(bplpt[plane], nwords * 2);
//var real_pt2 = bplpt[plane] >>> 1;
var delay = toscr_delay_adjusted[plane & 1];
var tmp_nbits = out_nbits;
//var shiftbuffer; //u64
var shiftbuffer_hi, shiftbuffer_lo;
var outval = outword[plane]; //u32
//var fetchval = fetched_aga[plane]; //u32
var fetchval = fetched_aga_lo[plane]; //u32
//uae_u32 *dataptr = (uae_u32 *)(line_data[next_lineno] + 2 * plane * MAX_WORDS_PER_LINE + 4 * out_offs);
var data = line_data[next_lineno];
var offs = MAX_WORDS_PER_LINE_FULL * plane + out_offs; //OWN
var shift = 16 + delay; //int
if (dma) {
bplpt[plane] += nwords * 2;
bplptx[plane] += nwords * 2;
}
if (real_pt === null) //Don't do this, fall back on chipmem_wget instead.
return;
//shiftbuffer = todisplay2_aga[plane] << delay;
shiftbuffer_hi = todisplay2_aga_hi[plane];
shiftbuffer_lo = todisplay2_aga_lo[plane];
if (delay) {
shiftbuffer_hi = (((shiftbuffer_hi << delay) & 0xffffffff) | (shiftbuffer_lo >>> (32 - delay))) >>> 0; //ATT
shiftbuffer_lo = (shiftbuffer_lo << delay) & 0xffffffff;
}
while (nwords > 0) {
//shiftbuffer |= fetchval;
shiftbuffer_lo = (shiftbuffer_lo | fetchval) >>> 0;
for (var i = 0; i < 2; i++) {
var t;
var bits_left = 32 - tmp_nbits;
//t = (shiftbuffer >> shift) & 0xffff;
if (shift < 32)
t = ((shiftbuffer_hi << (32 - shift)) | (shiftbuffer_lo >>> shift)) & 0xffff;
else
t = (shiftbuffer_hi >>> (shift - 32)) & 0xffff;
if (weird_number_of_bits && bits_left < 16) {
outval = (outval << bits_left) & 0xffffffff;
outval = (outval | (t >>> (16 - bits_left))) >>> 0;
//thisline_changed |= *dataptr ^ outval; *dataptr++ = outval;
thisline_changed |= (data[offs] ^ outval) >>> 0; data[offs++] = outval;
outval = t;
tmp_nbits = 16 - bits_left;
} else {
outval = (((outval << 16) & 0xffffffff) | t) >>> 0;
tmp_nbits += 16;
if (tmp_nbits == 32) {
//thisline_changed |= *dataptr ^ outval; *dataptr++ = outval;
thisline_changed |= (data[offs] ^ outval) >>> 0; data[offs++] = outval;
tmp_nbits = 0;
}
}
//shiftbuffer <<= 16;
shiftbuffer_hi = (((shiftbuffer_hi << 16) & 0xffffffff) | (shiftbuffer_lo >>> 16)) >>> 0;
shiftbuffer_lo = (shiftbuffer_lo << 16) & 0xffffffff;
}
nwords -= 2;
if (dma) {
fetchval = ((SAER_Memory_chipData[real_pt] << 24) | (SAER_Memory_chipData[real_pt+1] << 16) | (SAER_Memory_chipData[real_pt+2] << 8) | SAER_Memory_chipData[real_pt+3]) >>> 0;
real_pt += 4;
//fetchval = do_get_mem_long(real_pt); real_pt++;
//fetchval = ((SAER_Memory_chipData[real_pt2] << 16) | SAER_Memory_chipData[real_pt2 + 1]) >>> 0; real_pt2 += 2;
//#if 0
//if (plane == 0) fetchval ^= 0x5555555555555555;
//#endif
}
}
//fetched_aga[plane] = fetchval;
fetched_aga_lo[plane] = fetchval;
//todisplay2_aga[plane] = (shiftbuffer >> delay) & 0xffffffff;
if (delay) {
todisplay2_aga_lo[plane] = (((shiftbuffer_hi << (32 - delay)) & 0xffffffff) | (shiftbuffer_lo >>> delay)); //ATT
todisplay2_aga_hi[plane] = shiftbuffer_hi >>> delay;
} else {
todisplay2_aga_hi[plane] = shiftbuffer_hi;
todisplay2_aga_lo[plane] = shiftbuffer_lo;
}
outword[plane] = outval;
}
/*#ifdef HAVE_UAE_U128
//uae_u128 is available, custom shift functions not necessary
#else*/
/*function shift32plus(p, n) {
var t = p[1]; //u64
t = (t << n) | (p[0] >> (64 - n));
p[1] = t;
}
function aga_shift(p, n) {
if (n == 0) return;
shift32plus(p, n);
p[0] <<= n;
}
function shift32plus_n(p, n) {
var t = p[0]; //u64
t = (t >> n) | (p[1] << (64 - n));
p[0] = t;
}
function aga_shift_n(p, n) {
if (n == 0) return;
shift32plus_n(p, n);
p[1] >>= n;
}*/
//#endif
function aga_shift(p, n) {
if (n) {
//p[1] = (p[1] << n) | (p[0] >> (64 - n));
//p[0] <<= n;
n &= 31;
p[3] = (p[3] << n) | (p[2] >>> (32 - n));
p[2] = (p[2] << n) | (p[1] >>> (32 - n));
p[1] = (p[1] << n) | (p[0] >>> (32 - n));
p[0] <<= n;
}
}
function aga_shift_n(p, n) {
if (n) {
//p[0] = (p[0] >> n) | (p[1] << (64 - n));
//p[1] >>= n;
n &= 31;
p[0] = (p[1] << (32 - n)) | (p[0] >>> n);
p[1] = (p[2] << (32 - n)) | (p[1] >>> n);
p[2] = (p[3] << (32 - n)) | (p[2] >>> n);
p[3] >>>= n;
}
}
function long_fetch_64(plane, nwords, weird_number_of_bits, dma) {
//uae_u32 *real_pt = (uae_u32 *)pfield_xlateptr (bplpt[plane], nwords * 2);
var real_pt = pfield_xlateptr(bplpt[plane], nwords * 2);
//var real_pt2 = bplpt[plane] >>> 1;
var delay = toscr_delay_adjusted[plane & 1];
var tmp_nbits = out_nbits;
/*#ifdef HAVE_UAE_U128
uae_u128 shiftbuffer;
#else
uae_u64 shiftbuffer[2];
#endif*/
var shiftbuffer = new Uint32Array(4);
var outval = outword[plane]; //u32
//var fetchval = fetched_aga[plane]; //u64
var fetchval_hi = fetched_aga_hi[plane];
var fetchval_lo = fetched_aga_lo[plane];
//uae_u32 *dataptr = (uae_u32 *)(line_data[next_lineno] + 2 * plane * MAX_WORDS_PER_LINE + 4 * out_offs);
var data = line_data[next_lineno];
var offs = MAX_WORDS_PER_LINE_FULL * plane + out_offs; //OWN
//var shift = (64 - 16) + delay; //int
var shift = 48 + delay; //int
if (dma) {
bplpt[plane] += nwords * 2;
bplptx[plane] += nwords * 2;
}
if (real_pt === null) //Don't do this, fall back on chipmem_wget instead.
return;
/*#ifdef HAVE_UAE_U128
shiftbuffer = todisplay2_aga[plane] << delay;
#else
shiftbuffer[1] = 0;
shiftbuffer[0] = todisplay2_aga[plane];
aga_shift(shiftbuffer, delay);
#endif*/
shiftbuffer[3] = 0;
shiftbuffer[2] = 0;
shiftbuffer[1] = todisplay2_aga_hi[plane];
shiftbuffer[0] = todisplay2_aga_lo[plane];
aga_shift(shiftbuffer, delay);
while (nwords > 0) {
/*#ifdef HAVE_UAE_U128
shiftbuffer |= fetchval;
#else
shiftbuffer[0] |= fetchval;
#endif*/
shiftbuffer[1] |= fetchval_hi;
shiftbuffer[0] |= fetchval_lo;
for (var i = 0; i < 4; i++) {
var t; //u32
var bits_left = 32 - tmp_nbits;
/*#ifdef HAVE_UAE_U128
t = (shiftbuffer >> shift) & 0xffff;
#else
if (64 - shift > 0) {
t = (shiftbuffer[1] << (64 - shift)) | (shiftbuffer[0] >> shift);
} else {
t = shiftbuffer[1] >> (shift - 64);
}
t &= 0xffff;
#endif*/
if (shift < 32)
t = ((shiftbuffer[1] << (32 - shift)) | (shiftbuffer[0] >>> (shift - 0))) & 0xffff;
else if (shift < 64)
t = ((shiftbuffer[2] << (64 - shift)) | (shiftbuffer[1] >>> (shift - 32))) & 0xffff;
else if (shift < 96)
t = ((shiftbuffer[3] << (96 - shift)) | (shiftbuffer[2] >>> (shift - 64))) & 0xffff;
else
t = (shiftbuffer[3] >>> (shift - 96)) & 0xffff;
//t = (Math.random() * 0xffff) >>> 0;
if (weird_number_of_bits && bits_left < 16) {
outval = (outval << bits_left) & 0xffffffff;
outval = (outval | (t >>> (16 - bits_left))) >>> 0;
//thisline_changed |= *dataptr ^ outval; *dataptr++ = outval;
thisline_changed |= (data[offs] ^ outval) >>> 0; data[offs++] = outval;
outval = t;
tmp_nbits = 16 - bits_left;
} else {
outval = (((outval << 16) & 0xffffffff) | t) >>> 0;
tmp_nbits += 16;
if (tmp_nbits == 32) {
//thisline_changed |= *dataptr ^ outval; *dataptr++ = outval;
thisline_changed |= (data[offs] ^ outval) >>> 0; data[offs++] = outval;
tmp_nbits = 0;
}
}
/*#ifdef HAVE_UAE_U128
shiftbuffer <<= 16;
#else*/
aga_shift(shiftbuffer, 16);
//#endif
}
nwords -= 4;
if (dma) {
fetchval_hi = ((SAER_Memory_chipData[real_pt ] << 24) | (SAER_Memory_chipData[real_pt+1] << 16) | (SAER_Memory_chipData[real_pt+2] << 8) | SAER_Memory_chipData[real_pt+3]) >>> 0;
fetchval_lo = ((SAER_Memory_chipData[real_pt+4] << 24) | (SAER_Memory_chipData[real_pt+5] << 16) | (SAER_Memory_chipData[real_pt+6] << 8) | SAER_Memory_chipData[real_pt+7]) >>> 0;
real_pt += 8;
//fetchval = ((uae_u64)do_get_mem_long (real_pt)) << 32;
//fetchval |= do_get_mem_long (real_pt + 1);
//real_pt += 2;
//fetchval_hi = SAER_Memory_chipGet32_indirect(real_pt);
//fetchval_lo = SAER_Memory_chipGet32_indirect(real_pt + 4);
//real_pt += 8;
//fetchval_hi = ((SAER_Memory_chipData[real_pt2 ] << 16) | SAER_Memory_chipData[real_pt2 + 1]) >>> 0;
//fetchval_lo = ((SAER_Memory_chipData[real_pt2 + 2] << 16) | SAER_Memory_chipData[real_pt2 + 3]) >>> 0;
//real_pt2 += 4;
//#if 0
/*if (plane == 0) {
//fetchval ^= 0x5555555555555555;
fetchval_hi = (fetchval_hi ^ 0x55555555) >>> 0;
fetchval_lo = (fetchval_lo ^ 0x55555555) >>> 0;
}*/
//#endif
}
}
//fetched_aga[plane] = fetchval;
fetched_aga_hi[plane] = fetchval_hi;
fetched_aga_lo[plane] = fetchval_lo;
/*#ifdef HAVE_UAE_U128
todisplay2_aga[plane] = shiftbuffer >> delay;
#else*/
aga_shift_n(shiftbuffer, delay);
//todisplay2_aga[plane] = shiftbuffer[0];
todisplay2_aga_hi[plane] = shiftbuffer[1];
todisplay2_aga_lo[plane] = shiftbuffer[0];
//#endif
outword[plane] = outval;
}
//#endif //AGA*/
/*OPT inline, ok
function long_fetch_16_0(hpos, nwords, dma) { long_fetch_16(hpos, nwords, 0, dma); }
function long_fetch_16_1(hpos, nwords, dma) { long_fetch_16(hpos, nwords, 1, dma); }
//#ifdef AGA
function long_fetch_32_0(hpos, nwords, dma) { long_fetch_32(hpos, nwords, 0, dma); }
function long_fetch_32_1(hpos, nwords, dma) { long_fetch_32(hpos, nwords, 1, dma); }
function long_fetch_64_0(hpos, nwords, dma) { long_fetch_64(hpos, nwords, 0, dma); }
function long_fetch_64_1(hpos, nwords, dma) { long_fetch_64(hpos, nwords, 1, dma); }
//#endif
function do_long_fetch(hpos, nwords, dma, fm) {
var i;
flush_display (fm);
beginning_of_plane_block(hpos, fm);
switch (fm) {
case 0:
if (out_nbits & 15) {
for (i = 0; i < toscr_nr_planes; i++)
long_fetch_16_1(i, nwords, dma);
} else {
for (i = 0; i < toscr_nr_planes; i++)
long_fetch_16_0(i, nwords, dma);
}
break;
//#ifdef AGA
case 1:
if (out_nbits & 15) {
for (i = 0; i < toscr_nr_planes; i++)
long_fetch_32_1(i, nwords, dma);
} else {
for (i = 0; i < toscr_nr_planes; i++)
long_fetch_32_0(i, nwords, dma);
}
break;
case 2:
if (out_nbits & 15) {
for (i = 0; i < toscr_nr_planes; i++)
long_fetch_64_1(i, nwords, dma);
} else {
for (i = 0; i < toscr_nr_planes; i++)
long_fetch_64_0(i, nwords, dma);
}
break;
//#endif
}
out_nbits += nwords * 16;
out_offs += out_nbits >> 5;
out_nbits &= 31;
delay_cycles += nwords * 16;
if (dma && toscr_nr_planes > 0)
fetch_state = fetch_was_plane0;
}*/
function do_long_fetch(hpos, nwords, dma, fm) {
var i;
flush_display (fm);
beginning_of_plane_block(hpos, fm);
switch (fm) {
case 0:
if (out_nbits & 15) {
for (i = 0; i < toscr_nr_planes; i++)
long_fetch_16(i, nwords, 1, dma);
} else {
for (i = 0; i < toscr_nr_planes; i++)
long_fetch_16(i, nwords, 0, dma);
}
break;
//#ifdef AGA
case 1:
if (out_nbits & 15) {
for (i = 0; i < toscr_nr_planes; i++)
long_fetch_32(i, nwords, 1, dma);
} else {
for (i = 0; i < toscr_nr_planes; i++)
long_fetch_32(i, nwords, 0, dma);
}
break;
case 2:
if (out_nbits & 15) {
for (i = 0; i < toscr_nr_planes; i++)
long_fetch_64(i, nwords, 1, dma);
} else {
for (i = 0; i < toscr_nr_planes; i++)
long_fetch_64(i, nwords, 0, dma);
}
break;
//#endif
}
out_nbits += nwords * 16;
out_offs += out_nbits >> 5;
out_nbits &= 31;
delay_cycles += nwords * 16;
if (dma && toscr_nr_planes > 0)
fetch_state = fetch_was_plane0;
}
//#endif /* SPEEDUP */
function finish_last_fetch(pos, fm, reallylast) {
if (thisline_decision.plfleft < 0)
return;
if (plfr_state >= plfr_end)
return;
plfr_state = plfr_end;
flush_display(fm);
// This may not be the last fetch, store current endpos for future use.
// There is at least one demo that has two DDFSTRT-DDFSTOP horizontal sections
// Subtle Shades / Nuance.
thisline_decision.plfright = pos;
if (!reallylast) {
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_AGNUS) {
ddfstate = DIW_WAITING_START;
fetch_state = fetch_not_started;
}
}
}
/* check special case where last fetch wraps to next line
* this makes totally corrupted and flickering display on
* real hardware due to refresh cycle conflicts
*/
function maybe_finish_last_fetch(pos, fm) {
//static int warned = 20;
var done = false;
if (plf_state != plf_passed_stop2 || (fetch_state != fetch_started && fetch_state != fetch_started_first) || aga_plf_passed_stop2 || !SAEF_Custom_dmaen(SAEC_Custom_DMAF_BPLEN)) {
finish_last_fetch(pos, fm, true);
return;
}
do {
var cycle_start = fetch_cycle & fetchstart_mask;
switch (fm_maxplane) {
case 8:
switch (cycle_start) {
case 0: fetch(7, fm, pos); break;
case 1: fetch(3, fm, pos); break;
case 2: fetch(5, fm, pos); break;
case 3: fetch(1, fm, pos); break;
case 4: fetch(6, fm, pos); break;
case 5: fetch(2, fm, pos); break;
case 6: fetch(4, fm, pos); break;
case 7: fetch(0, fm, pos); break;
default: {
//goto end;
finish_last_fetch(pos, fm, true); return;
}
}
break;
case 4:
switch (cycle_start) {
case 0: fetch(3, fm, pos); break;
case 1: fetch(1, fm, pos); break;
case 2: fetch(2, fm, pos); break;
case 3: fetch(0, fm, pos); break;
default: {
//goto end;
finish_last_fetch(pos, fm, true); return;
}
}
break;
case 2:
switch (cycle_start) {
case 0: fetch(1, fm, pos); break;
case 1: fetch(0, fm, pos); break;
default: {
//goto end;
finish_last_fetch(pos, fm, true); return;
}
}
break;
}
fetch_cycle++;
toscr_nbits += toscr_res2p;
if (toscr_nbits > 16)
toscr_nbits = 0;
if (toscr_nbits == 16)
flush_display(fm);
done = true;
bitplane_line_crossing = pos;
} while ((fetch_cycle & fetchunit_mask) != 0);
if (done && warned_maybe_finish_last_fetch > 0) {
warned_maybe_finish_last_fetch--;
SAEF_warn("playfield.maybe_finish_last_fetch() bitplane DMA crossing scanlines!");
}
//end:
finish_last_fetch(pos, fm, true);
}
/* make sure fetch that goes beyond maxhpos is finished */
function finish_final_fetch() {
if (thisline_decision.plfleft < 0)
return;
if (plfr_state < plfr_end)
finish_last_fetch(maxhpos, fetchmode, true);
plfr_state = plfr_finished;
// workaround for too long fetches that don't pass plf_passed_stop2 before end of scanline
if (aga_plf_passed_stop2 && plf_state >= plf_passed_stop)
plf_state = plf_end;
// This is really the end of scanline, we can finally flush all remaining data.
thisline_decision.plfright += flush_plane_data(fetchmode);
thisline_decision.plflinelen = out_offs;
finish_playfield_line();
}
//function one_fetch_cycle_0(pos, dma, fm) { //ORG
function one_fetch_cycle(pos, dma, fm) {
var bplactive = true;
var diw = diwstate == DIW_WAITING_STOP;
if (plf_state == plf_wait && dma && diw) {
// same timings as when switching off, see below
bpl_dma_off_when_active = 0;
bplactive = false;
if (bitplane_off_delay >= 0)
bitplane_off_delay = !dma ? -4 : -5;
if (bitplane_off_delay < 0) {
bitplane_off_delay++;
if (bitplane_off_delay == 0) {
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_AGNUS) {
plf_state = plf_passed_stop;
} else {
plf_state = plf_active;
}
}
}
} else if (!dma || !diw) {
bplactive = false;
// dma off: turn off bitplane output after 4 cycles
// (yes, switching DMA off won"t disable it immediately)
// diw off: turn off bitplane output after 5 cycles
// (Starflight / Phenomena jumping scroller in ECS)
// This is not correctly emulated, there probably is
// 4+ stage shift register that causes these delays.
if (plf_state == plf_active || plf_state == plf_passed_stop || plf_state == plf_passed_stop_act) {
bpl_dma_off_when_active = 1;
if (bitplane_off_delay <= 0)
bitplane_off_delay = !dma ? 4 : 5;
}
if (bitplane_off_delay > 0) {
bplactive = true;
bitplane_off_delay--;
if (bitplane_off_delay == 0) {
bplactive = false;
plf_state = plf_wait;
}
}
}
if ((dma && diw) || (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_AGNUS)) {
if (plf_state != plf_wait) {
if (pos == plfstop && ddfstop_written_hpos != pos) {
if (plf_state < plf_passed_stop) {
plf_state = plf_passed_stop;
}
plf_end_hpos = pos + DDF_OFFSET;
} else if (pos == plf_end_hpos) {
ddfstop_matched = true;
if (plf_state < plf_passed_stop_act) {
plf_state = plf_passed_stop_act;
}
}
}
}
if ((fetch_cycle & fetchunit_mask) == 0) {
if (plf_state == plf_passed_stop2) {
finish_last_fetch(pos, fm, false);
return 1;
}
if (plf_state == plf_passed_stop_act) {
plf_state = plf_passed_stop2;
}
}
// must be after above test, otherwise same fetch
// block may pass both stop_act and stop2 tests.
if (pos == HARD_DDF_STOP()) {
if (plf_state < plf_wait) {
plf_state = plf_passed_stop_act;
}
}
maybe_check(pos);
if (bplactive) {
/* fetchstart_mask can be larger than fm_maxplane if FMODE > 0. This means
that the remaining cycles are idle; we"ll fall through the whole switch
without doing anything. */
var cycle_start = fetch_cycle & fetchstart_mask;
switch (fm_maxplane) {
case 8:
switch (cycle_start) {
case 0: fetch(7, fm, pos); break;
case 1: fetch(3, fm, pos); break;
case 2: fetch(5, fm, pos); break;
case 3: fetch(1, fm, pos); break;
case 4: fetch(6, fm, pos); break;
case 5: fetch(2, fm, pos); break;
case 6: fetch(4, fm, pos); break;
case 7: fetch(0, fm, pos); break;
//#ifdef AGA
default: {
// if AGA: consider plf_passed_stop2 already
// active when last plane has been written,
// even if there is still idle cycles left
if (plf_state == plf_passed_stop_act)
aga_plf_passed_stop2 = true;
//break;
}
//#endif
}
break;
case 4:
switch (cycle_start) {
case 0: fetch(3, fm, pos); break;
case 1: fetch(1, fm, pos); break;
case 2: fetch(2, fm, pos); break;
case 3: fetch(0, fm, pos); break;
//#ifdef AGA
default: {
if (plf_state == plf_passed_stop_act)
aga_plf_passed_stop2 = true;
//break;
}
//#endif
}
break;
case 2:
switch (cycle_start) {
case 0: fetch(1, fm, pos); break;
case 1: fetch(0, fm, pos); break;
//#ifdef AGA
default: {
if (plf_state == plf_passed_stop_act)
aga_plf_passed_stop2 = true;
//break;
}
//#endif
}
break;
}
}
if (bpl1dat_written) {
// do this here because if program plays with BPLCON0 during scanline
// it is possible that one DMA BPL1DAT write is completely missed
// and we must not draw anything at all in next dma block if this happens
// (Disposable Hero titlescreen)
fetch_state = fetch_was_plane0;
bpl1dat_written = false;
}
fetch_cycle++;
toscr_nbits += toscr_res2p;
if (bplcon1_written) {
flush_display(fm);
compute_toscr_delay(bplcon1);
bplcon1_written = false;
}
if (toscr_nbits > 16) {
SAEF_error("one_fetch_cycle() toscr_nbits > 16 (%d)", toscr_nbits);
toscr_nbits = 0;
}
if (toscr_nbits == 16)
flush_display(fm);
return 0;
}
/*OPT inline ok
function one_fetch_cycle_fm0( pos, dma) { return one_fetch_cycle_0(pos, dma, 0); }
function one_fetch_cycle_fm1( pos, dma) { return one_fetch_cycle_0(pos, dma, 1); }
function one_fetch_cycle_fm2( pos, dma) { return one_fetch_cycle_0(pos, dma, 2); }
function one_fetch_cycle(pos, dma, fm) {
switch (fm) {
case 0: return one_fetch_cycle_fm0(pos, dma);
//#ifdef AGA
case 1: return one_fetch_cycle_fm1(pos, dma);
case 2: return one_fetch_cycle_fm2(pos, dma);
//#endif
default:
SAEF_error("one_fetch_cycle() fm corrupt (%d)", fm);
return 0;
}
}
function one_fetch_cycle(pos, dma, fm) {
return one_fetch_cycle_0(pos, dma, fm);
}*/
function update_fetch_x(until, fm) {
if (nodraw())
return;
var pos = last_fetch_hpos;
update_toscr_planes(fm);
// not optimized, update_fetch_x() is extremely rarely used.
for (; pos < until; pos++) {
toscr_nbits += toscr_res2p;
if (toscr_nbits > 16) {
SAEF_error("update_fetch_x() toscr_nbits > 16 (%d)", toscr_nbits);
toscr_nbits = 0;
}
if (toscr_nbits == 16)
flush_display(fm);
}
if (until >= maxhpos) {
maybe_finish_last_fetch(pos, fm);
return;
}
flush_display(fm);
}
function update_fetch(until, fm) {
var dma = SAEF_Custom_dmaen(SAEC_Custom_DMAF_BPLEN);
if (nodraw() || plf_state >= plf_end)
return;
var pos = last_fetch_hpos;
cycle_diagram_shift = last_fetch_hpos - fetch_cycle;
/* First, a loop that prepares us for the speedup code. We want to enter
the SPEEDUP case with fetch_state == fetch_was_plane0 or it is the very
first fetch cycle (which equals to same state as fetch_was_plane0)
and then unroll whole blocks, so that we end on the same fetch_state again. */
for (; ; pos++) {
if (pos == until) {
if (until >= maxhpos) {
maybe_finish_last_fetch(pos, fm);
return;
}
return;
}
if (fetch_state == fetch_was_plane0)
break;
/*#if 0
if (fetch_state == fetch_started_first) {
#if SPEEDUP
if (until >= maxhpos) {
fetch_state = fetch_was_plane0;
break;
}
#endif
fetch_state = fetch_started;
}
#endif*/
fetch_state = fetch_started; //fetch_start(pos); OWN
if (one_fetch_cycle(pos, dma, fm))
return;
}
//Unrolled version of the for loop below.
if (SPEEDUP &&
plf_state == plf_active && !line_cyclebased && dma
&& (fetch_cycle & fetchstart_mask) == (fm_maxplane & fetchstart_mask)
&& !badmode
&& toscr_nr_planes == toscr_nr_planes_agnus)
{
var ddfstop_to_test_ddf = HARD_DDF_STOP();
if (plfstop >= last_fetch_hpos - DDF_OFFSET && plfstop < ddfstop_to_test_ddf)
ddfstop_to_test_ddf = plfstop;
var ddfstop_to_test = ddfstop_to_test_ddf + DDF_OFFSET;
var offs = (pos - fetch_cycle) & fetchunit_mask;
var ddf2 = ((ddfstop_to_test - offs + fetchunit - 1) & ~fetchunit_mask) + offs;
var ddf3 = ddf2 + fetchunit;
var stop = until < ddf2 ? until : until < ddf3 ? ddf2 : ddf3;
var count = stop - pos;
if (count >= fetchstart) {
count &= ~fetchstart_mask;
var stoppos = pos + count;
if (thisline_decision.plfleft < 0)
compute_toscr_delay(bplcon1);
do_long_fetch (pos, count >> (3 - toscr_res), dma, fm);
// This must come _after_ do_long_fetch so as not to confuse flush_display
// into thinking the first fetch has produced any output worth emitting to
// the screen. But the calculation of delay_offset must happen _before_.
maybe_first_bpl1dat (pos);
if (pos <= plfstop && stoppos > plfstop) {
plf_state = plf_passed_stop;
plf_end_hpos = plfstop + DDF_OFFSET;
}
if (pos <= plfstop + DDF_OFFSET && stoppos > plfstop + DDF_OFFSET) {
plf_state = plf_passed_stop_act;
plf_end_hpos = 256 + DDF_OFFSET;
ddfstop_matched = true;
}
if (pos <= HARD_DDF_STOP() && stoppos > HARD_DDF_STOP()) {
if (plf_state < plf_wait)
plf_state = plf_passed_stop_act;
}
if (pos <= ddfstop_to_test && stoppos > ddf2) {
plf_state = plf_passed_stop2;
}
if (pos <= ddf2 && stoppos >= ddf2 + fm_maxplane) {
add_modulos ();
}
pos += count;
fetch_cycle += count;
}
}
for (; pos < until; pos++) {
if (fetch_state == fetch_was_plane0) {
flush_display(fm);
beginning_of_plane_block(pos, fm);
}
fetch_state = fetch_started; //fetch_start(pos); OWN
if (one_fetch_cycle(pos, dma, fm))
return;
}
if (until >= maxhpos) {
maybe_finish_last_fetch(pos, fm);
return;
}
flush_display(fm);
}
/*OPT inline, ok
function update_fetch_0(hpos) { update_fetch(hpos, 0); }
function update_fetch_1(hpos) { update_fetch(hpos, 1); }
function update_fetch_2(hpos) { update_fetch(hpos, 2); }*/
this.decide_fetch = function(hpos) {
if (hpos > last_fetch_hpos) {
if (fetch_state != fetch_not_started) {
/*ORG
switch (fetchmode) {
case 0: update_fetch_0(hpos); break;
//#ifdef AGA
case 1: update_fetch_1(hpos); break;
case 2: update_fetch_2(hpos); break;
//#endif
default: SAEF_error("decide_fetch() corrupt fetchmode (%d)", fetchmode);
}*/
update_fetch(hpos, fetchmode);
} else if (bpl1dat_written_at_least_once) {
// "PIO" mode display
update_fetch_x(hpos, fetchmode);
bpl1dat_written = false;
}
maybe_check(hpos);
last_fetch_hpos = hpos;
}
}
this.decide_fetch_safe = function(hpos) {
if (!SAEV_Blitter_dangerous) {
this.decide_fetch(hpos);
SAER.blitter.decide_blitter(hpos);
} else {
while (hpos > last_fetch_hpos) {
this.decide_fetch(last_fetch_hpos + 1);
SAER.blitter.decide_blitter(last_fetch_hpos + 1);
}
}
}
function reset_bpl_vars() {
out_nbits = 0;
out_offs = 0;
toscr_nbits = 0;
thisline_decision.bplres = bplcon0_res;
}
function start_bpl_dma(hstart) {
if (first_bpl_vpos < 0)
first_bpl_vpos = vpos;
if (doflickerfix() && interlace_seen > 0 && !scandoubled_line) {
for (var i = 0; i < 8; i++) {
prevbpl[lof_current][vpos][i] = bplptx[i];
if (!lof_current && (bplcon0 & 4))
bplpt[i] = prevbpl[1 - lof_current][vpos][i];
if (!(bplcon0 & 4) || interlace_seen < 0)
prevbpl[1 - lof_current][vpos][i] = prevbpl[lof_current][vpos][i] = 0;
}
}
/*#if 0
fetch_state = (fm_maxplane == fetchstart) ? fetch_started_first : fetch_started;
#else*/
fetch_state = fetch_started;
//#endif
plfr_state = plfr_active;
ddfstate = DIW_WAITING_STOP;
bpl_hstart = hstart;
if (!bpldmawasactive) {
if (last_fetch_hpos < 0)
last_fetch_hpos = 0;
plfstrt_sprite = hstart;
// OCS Agnus needs at least 1 empty cycle between
// sprite fetch and bitplane cycle sequence start.
if (!(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_AGNUS))
plfstrt_sprite--;
fetch_cycle = 0;
update_denise(last_fetch_hpos);
if (bpl1dat_written_at_least_once && hstart > last_fetch_hpos) {
update_fetch_x(hstart, fetchmode);
bpl1dat_written_at_least_once = false;
} else {
reset_bpl_vars();
}
cycle_diagram_shift = hstart;
bpldmawasactive = true;
} else {
flush_display(fetchmode);
// Calculate difference between last end to new start
var diff = (hstart - thisline_decision.plfright) << (1 + toscr_res);
// Render all missing pixels, use toscr because previous data may still be in buffers.
while (diff >= 16) {
toscr_1(16, fetchmode);
diff -= 16;
}
if (diff) toscr_1(diff, fetchmode);
cycle_diagram_shift = hstart;
update_denise(last_fetch_hpos);
update_fetch_x(hstart, fetchmode);
}
last_fetch_hpos = hstart;
estimate_last_fetch_cycle(hstart);
}
function cant_this_last_line() {
// Last line..
// ..works normally if A1000 Agnus
if (SAEV_config.chipset.agnusDIP)
return false;
// ..inhibits bitplane and sprite DMA if later Agnus revision.
return vpos + 1 >= maxvpos + lof_store;
}
/* This function is responsible for turning on datafetch if necessary. */
this.decide_line = function(hpos) {
var ecs = (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_AGNUS) != 0;
/* Take care of the vertical DIW. */
if (vpos == plffirstline) {
// A1000 Agnus won"t start bitplane DMA if vertical diw is zero.
if (vpos > 0 || (vpos == 0 && !SAEV_config.chipset.agnusDIP)) {
diwstate = DIW_WAITING_STOP;
line_cyclebased = 2; //SET_LINE_CYCLEBASED();
}
}
// last line of field can never have bitplane dma active if not A1000 Agnus.
if (vpos == plflastline || cant_this_last_line() || (vpos == 0 && SAEV_config.chipset.agnusDIP)) {
diwstate = DIW_WAITING_START;
line_cyclebased = 2; //SET_LINE_CYCLEBASED();
}
if (hpos <= last_decide_line_hpos)
return;
var dma = SAEF_Custom_dmaen(SAEC_Custom_DMAF_BPLEN) != 0;
var diw = diwstate == DIW_WAITING_STOP;
if (ecs) {
//if (1) {
if (last_decide_line_hpos < plfstrt && hpos >= plfstrt) {
ddfstop_matched = false;
}
//}
} else {
//if (1) {
if (last_decide_line_hpos < plfstrt && hpos >= plfstrt) {
ddfstop_matched = false;
// plfstrt==0 works strangely (Nakudemo / Vision-X)
if (plfstrt > -DDF_OFFSET)
ocs_agnus_ddf_enable_toggle = false;
}
//}
}
if (fetch_state == fetch_not_started) {
var strtpassed = false;
var nextstate = plf_end;
var hstart;
hstart = last_decide_line_hpos;
if (hstart < bitplane_maybe_start_hpos)
hstart = bitplane_maybe_start_hpos;
if (hstart < HARD_DDF_START_REAL + DDF_OFFSET)
hstart = HARD_DDF_START_REAL + DDF_OFFSET;
// DMA enabled mid-line: DDF_OFFSET delay first
if (bitplane_maybe_start_hpos + DDF_OFFSET > hstart)
hstart = bitplane_maybe_start_hpos + DDF_OFFSET;
if (hstart & 1)
hstart++;
if (ecs) {
// ECS DDFSTRT/STOP matching does not require DMA or DIW.
//if (1) {
if (last_decide_line_hpos < plfstrt && hpos >= plfstrt) {
// active == already started because ddfstop was not detected in last line
if (plf_state != plf_active) {
plf_state = plf_passed_start;
strtpassed = true;
plf_start_hpos = plfstrt + DDF_OFFSET;
}
}
//}
//if (1) {
if ((strtpassed && hpos >= plf_start_hpos) || (last_decide_line_hpos < plf_start_hpos && hpos >= plf_start_hpos)) {
if (plf_state == plf_passed_start) {
plf_state = plf_active;
hstart = plf_start_hpos;
}
}
//}
} else {
//if (1) {
var start = HARD_DDF_START_REAL;
if (last_decide_line_hpos < start && hpos >= start) {
if (!ocs_agnus_ddf_enable_toggle)
plf_state = plf_passed_enable;
ocs_agnus_ddf_enable_toggle = true;
}
//}
// OCS DDFSTRT/STOP matching requires DMA and DIW enabled.
if (dma && diw) {
if (last_decide_line_hpos < plfstrt && hpos >= plfstrt) {
if (plf_state == plf_passed_enable) {
plf_state = plf_passed_start;
strtpassed = true;
plf_start_hpos = plfstrt + DDF_OFFSET;
}
ocs_agnus_ddf_enable_toggle = false;
}
}
if (dma && diw) {
if ((strtpassed && hpos >= plf_start_hpos) || (last_decide_line_hpos < plf_start_hpos && hpos >= plf_start_hpos)) {
if (plf_state == plf_passed_start) {
plf_state = plf_active;
hstart = plf_start_hpos;
}
}
}
}
if (diw && dma) {
var test = false;
if (ecs) {
test = (plf_state == plf_active && (hpos >= HARD_DDF_START_REAL + DDF_OFFSET || HARD_DDF_LIMITS_DISABLED()));
if (bpl_dma_off_when_active) {
if (plfstop < hstart) {
test = false;
}
}
} else {
test = (plf_state == plf_active);
// if DMA enabled mid-scanline but ddfstrt not matched (dma was off): start when ddfstop is matched
// (Crash Landing crack intro / Scoopex)
if (!test && last_decide_line_hpos < plfstop && hstart > plfstop) {
if (hstart == ((bitplane_maybe_start_hpos + DDF_OFFSET + 1) & ~1)) {
hstart = plfstop + DDF_OFFSET;
test = true;
nextstate = plf_passed_stop;
}
}
}
if (test) {
start_bpl_dma(hstart);
// if ECS: pre-set plf_end_hpos if we have already passed virtual ddfstop
if (ecs) {
if (last_decide_line_hpos < hstart && hstart >= plfstop && hstart - plfstop <= DDF_OFFSET) {
plf_end_hpos = plfstop + DDF_OFFSET;
nextstate = plf_passed_stop;
}
if (last_decide_line_hpos < HARD_DDF_STOP() && hstart > HARD_DDF_STOP()) {
plf_end_hpos = HARD_DDF_STOP() + DDF_OFFSET;
nextstate = plf_passed_stop;
}
if (bpl_dma_off_when_active) {
nextstate = plf_passed_stop_act;
bpl_dma_off_when_active = 0;
}
}
if (nextstate != plf_end) {
plf_state = nextstate;
estimate_last_fetch_cycle(hstart);
}
last_decide_line_hpos = hpos;
do_sprites(hpos);
return;
}
}
if (ecs) {
//if (1) {
// ddfstrt == ddfstop: ddfstrt wins.
if (plfstrt != plfstop && last_decide_line_hpos < plfstop && hpos >= plfstop && plfstop <= maxhpos - DDF_OFFSET) {
ddfstop_matched = true;
if (plf_state != plf_wait && plf_state < plf_passed_stop) {
plf_state = plf_passed_stop;
plf_end_hpos = plfstop + DDF_OFFSET;
}
}
if (last_decide_line_hpos < HARD_DDF_STOP() && hpos >= HARD_DDF_STOP()) {
plf_state = plf_passed_stop_act;
}
//}
} else {
if (dma && diw) {
if (last_decide_line_hpos < plfstop && hpos >= plfstop && plfstop <= maxhpos - DDF_OFFSET && plf_state != plf_wait) {
ddfstop_matched = true;
}
}
}
}
if (hpos > last_sprite_hpos && last_sprite_hpos < SPR0_HPOS + 4 * MAX_SPRITES)
do_sprites(hpos);
last_decide_line_hpos = hpos;
}
/*-----------------------------------------------------------------------*/
/* SECT colors */
/* Called when a color is about to be changed (write to a color register),
* but the new color has not been entered into the table yet. */
function record_color_change(hpos, regno, value) {
if (regno < 0x1000 && nodraw())
return;
/* Early positions don't appear on-screen. */
if (vpos < minfirstline)
return;
decide_diw(hpos);
SAER.playfield.decide_line(hpos);
if (thisline_decision.ctable < 0)
remember_ctable();
if ((regno < 0x1000 || regno == 0x1000 + 0x10c) && hpos < HBLANK_OFFSET && !(beamcon0 & 0x80) && prev_lineno >= 0) {
//struct draw_info *pdip = curr_drawinfo + prev_lineno;
var pdip = curr_drawinfo[prev_lineno];
var idx = pdip.last_color_change;
var extrahpos = regno == 0x1000 + 0x10c ? 1 : 0;
var lastsync = false;
/* Move color changes in horizontal cycles 0 to HBLANK_OFFSET to end of previous line.
Cycles 0 to HBLANK_OFFSET are visible in right border on real Amigas. (because of late hsync) */
if (curr_color_changes[idx - 1].regno == 0xffff) {
idx--;
lastsync = true;
}
pdip.last_color_change++;
pdip.nr_color_changes++;
curr_color_changes[idx].linepos = (hpos + maxhpos) * 2 + extrahpos;
curr_color_changes[idx].regno = regno;
curr_color_changes[idx].value = value;
if (lastsync) {
curr_color_changes[idx + 1].linepos = hsyncstartpos * 2;
curr_color_changes[idx + 1].regno = 0xffff;
curr_color_changes[idx + 2].regno = -1;
} else {
curr_color_changes[idx + 1].regno = -1;
}
}
record_color_change2(hpos, regno, value);
}
function isbrdblank(hpos, bplcon0, bplcon3) {
//#ifdef ECS_DENISE
var brdblank = (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_DENISE) && (bplcon0 & 1) && (bplcon3 & 0x20);
var brdntrans = (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_DENISE) && (bplcon0 & 1) && (bplcon3 & 0x10);
/*#else
var brdblank = false;
var brdntrans = false;
#endif*/
if (hpos >= 0 && (ce_is_borderblank(current_colors.extra) != brdblank || ce_is_borderntrans(current_colors.extra) != brdntrans)) {
record_color_change(hpos, 0, COLOR_CHANGE_BRDBLANK | (brdblank ? 1 : 0) | (ce_is_bordersprite(current_colors.extra) ? 2 : 0) | (brdntrans ? 4 : 0));
current_colors.extra &= ~(1 << CE_BORDERBLANK);
current_colors.extra &= ~(1 << CE_BORDERNTRANS);
current_colors.extra |= brdblank ? (1 << CE_BORDERBLANK) : 0;
current_colors.extra |= brdntrans ? (1 << CE_BORDERNTRANS) : 0;
remembered_color_entry = -1;
}
return brdblank;
}
function issprbrd(hpos, bplcon0, bplcon3) {
//#ifdef AGA
var brdsprt = (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA) && (bplcon0 & 1) && (bplcon3 & 0x02);
/*#else
var brdsprt = false;
#endif*/
if (hpos >= 0 && ce_is_bordersprite(current_colors.extra) != brdsprt) {
record_color_change(hpos, 0, COLOR_CHANGE_BRDBLANK | (ce_is_borderblank(current_colors.extra) ? 1 : 0) | (ce_is_borderntrans(current_colors.extra) ? 4 : 0) | (brdsprt ? 2 : 0));
current_colors.extra &= ~(1 << CE_BORDERSPRITE);
current_colors.extra |= brdsprt ? (1 << CE_BORDERSPRITE) : 0;
remembered_color_entry = -1;
if (brdsprt && !ce_is_borderblank(current_colors.extra))
thisline_decision.bordersprite_seen = true;
}
return brdsprt && !ce_is_borderblank(current_colors.extra);
}
function record_register_change(hpos, regno, value) {
if (regno == 0x100) { // BPLCON0
if (value & 0x800)
thisline_decision.ham_seen = 1;
thisline_decision.ehb_seen = isehb(value, bplcon2);
isbrdblank(hpos, value, bplcon3);
issprbrd(hpos, value, bplcon3);
} else if (regno == 0x104) { // BPLCON2
thisline_decision.ehb_seen = isehb(bplcon0, value);
} else if (regno == 0x106) { // BPLCON3
isbrdblank(hpos, bplcon0, value);
issprbrd(hpos, bplcon0, value);
}
record_color_change(hpos, regno + 0x1000, value);
}
/*-----------------------------------------------------------------------*/
/* SECT sprites */
//typedef int sprbuf_res_t, cclockres_t, hwres_t, bplres_t;
function expand_sprres(con0, con3) {
var res;
switch ((con3 >> 6) & 3) {
//#ifdef ECS_DENISE
case 0: /* ECS defaults (LORES,HIRES=LORES sprite,SHRES=HIRES sprite) */
if ((SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_DENISE) && GET_RES_DENISE(con0) == SAEC_Config_Video_HResolution_SuperHiRes)
res = SAEC_Config_Video_HResolution_HiRes;
else
res = SAEC_Config_Video_HResolution_LoRes;
break;
//#endif
//#ifdef AGA
case 1:
res = SAEC_Config_Video_HResolution_LoRes;
break;
case 2:
res = SAEC_Config_Video_HResolution_HiRes;
break;
case 3:
res = SAEC_Config_Video_HResolution_SuperHiRes;
break;
//#endif
default:
res = SAEC_Config_Video_HResolution_LoRes;
}
return res;
}
/* handle very rarely needed playfield collision (CLXDAT bit 0) */
/* only known game needing this is Rotor */
function do_playfield_collisions() {
var bplres = bplcon0_res;
var ddf_left = thisline_decision.plfleft * 2 << bplres;
var hw_diwlast = coord_window_to_diw_x(thisline_decision.diwlastword);
var hw_diwfirst = coord_window_to_diw_x(thisline_decision.diwfirstword);
var collided, minpos, maxpos;
//#ifdef AGA
var planes = (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA) ? 8 : 6;
/*#else
var planes = 6;
#endif*/
if (clxcon_bpl_enable == 0) {
clxdat |= 1;
return;
}
if (clxdat & 1)
return;
collided = false;
minpos = thisline_decision.plfleft * 2;
if (minpos < hw_diwfirst)
minpos = hw_diwfirst;
maxpos = thisline_decision.plfright * 2;
if (maxpos > hw_diwlast)
maxpos = hw_diwlast;
var ldata = line_data[next_lineno];
for (var i = minpos; i < maxpos && !collided; i += 32) {
//var offs = ((i << bplres) - ddf_left) >> 3;
var offs = ((i << bplres) - ddf_left) >> 5;
var total = 0xffffffff;
for (var j = 0; j < planes; j++) {
var ena = (clxcon_bpl_enable >> j) & 1;
var match = (clxcon_bpl_match >> j) & 1;
var t = 0xffffffff;
if (ena) {
if (j < thisline_decision.nr_planes) {
//t = *(uae_u32 *)(line_data[next_lineno] + offs + 2 * j * MAX_WORDS_PER_LINE);
t = ldata[MAX_WORDS_PER_LINE_FULL * j + offs];
t = (t ^ ((match & 1) - 1) >>> 0) >>> 0;
} else {
t = ((match & 1) - 1) >>> 0;
}
}
total &= t;
}
if (total) {
collided = true;
/*#if 0
{
for (var k = 0; k < 1; k++) {
uae_u32 *ldata = (uae_u32 *)(line_data[next_lineno] + offs + 2 * k * MAX_WORDS_PER_LINE);
*ldata ^= 0x5555555555;
}
}
#endif*/
}
}
if (collided)
clxdat |= 1;
}
/* Sprite-to-sprite collisions are taken care of in record_sprite. This one does playfield/sprite collisions. */
function do_sprite_collisions() {
var nr_sprites = curr_drawinfo[next_lineno].nr_sprites;
var first = curr_drawinfo[next_lineno].first_sprite_entry;
var collision_mask = clxmask[clxcon >> 12];
var bplres = bplcon0_res;
var ddf_left = thisline_decision.plfleft * 2 << bplres;
var hw_diwlast = coord_window_to_diw_x(thisline_decision.diwlastword);
var hw_diwfirst = coord_window_to_diw_x(thisline_decision.diwfirstword);
if (clxcon_bpl_enable == 0) {
clxdat |= 0x1FE;
return;
}
for (var i = 0; i < nr_sprites; i++) {
//struct sprite_entry *e = curr_sprite_entries + first + i;
var e = curr_sprite_entries[first + i];
var minpos = e.pos;
var maxpos = e.max;
var minp1 = minpos >> sprite_buffer_res;
var maxp1 = maxpos >> sprite_buffer_res;
if (maxp1 > hw_diwlast)
maxpos = hw_diwlast << sprite_buffer_res;
if (maxp1 > thisline_decision.plfright * 2)
maxpos = thisline_decision.plfright * 2 << sprite_buffer_res;
if (minp1 < hw_diwfirst)
minpos = hw_diwfirst << sprite_buffer_res;
if (minp1 < thisline_decision.plfleft * 2)
minpos = thisline_decision.plfleft * 2 << sprite_buffer_res;
for (var j = minpos; j < maxpos; j++) {
var sprpix = spixels[e.first_pixel + j - e.pos] & collision_mask;
var match = true;
if (sprpix == 0)
continue;
var offs = ((j << bplres) >> sprite_buffer_res) - ddf_left;
sprpix = sprite_ab_merge[sprpix & 255] | (sprite_ab_merge[sprpix >> 8] << 2);
sprpix <<= 1;
var ldata = line_data[next_lineno];
/* Loop over number of playfields. */
for (var k = 1; k >= 0; k--) {
//#ifdef AGA
var planes = (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA) ? 8 : 6;
/*#else
var planes = 6;
#endif*/
if (bplcon0 & 0x400)
match = true;
for (var l = k; match && l < planes; l += 2) {
var t = 0;
if (l < thisline_decision.nr_planes) {
//uae_u32 *ldata = (uae_u32 *)(line_data[next_lineno] + 2 * l * MAX_WORDS_PER_LINE);
//uae_u32 word = ldata[offs >> 5];
var word = ldata[MAX_WORDS_PER_LINE_FULL * l + (offs >> 5)];
t = (word >>> (31 - (offs & 31))) & 1;
/*#if 0 //debug: draw collision mask
if (1) {
for (var m = 0; m < 5; m++) {
ldata = (uae_u32 *)(line_data[next_lineno] + 2 * m * MAX_WORDS_PER_LINE);
ldata[(offs >> 5) + 1] |= 15 << (31 - (offs & 31));
}
}
#endif*/
}
if (clxcon_bpl_enable & (1 << l)) {
if (t != ((clxcon_bpl_match >> l) & 1))
match = false;
}
}
if (match) {
/*#if 0 // debug: mark lines where collisions are detected
if (0) {
for (var l = 0; l < 5; l++) {
uae_u32 *ldata = (uae_u32 *)(line_data[next_lineno] + 2 * l * MAX_WORDS_PER_LINE);
ldata[(offs >> 5) + 1] |= 15 << (31 - (offs & 31));
}
}
#endif*/
clxdat |= sprpix << (k * 4);
}
}
}
}
}
//static void record_sprite_1 (int sprxp, uae_u16 *buf, uae_u32 datab, int num, int dbl,unsigned int mask, int do_collisions, uae_u32 collision_mask)
function record_sprite_1(sprxp, buf, datab, num, dbl, mask, do_collisions, collision_mask) {
var j = 0;
while (datab) {
var col = 0;
var coltmp = 0;
if ((sprxp >= sprite_minx && sprxp < sprite_maxx) || (bplcon3 & 2))
col = (datab & 3) << (2 * num);
/*#if 0
if (sprxp == sprite_minx || sprxp == sprite_maxx - 1) col ^= (. () << 16) | . ();
#endif*/
if ((j & mask) == 0) {
//var tmp = (*buf) | col; *buf++ = tmp;
var tmp = spixels[buf] | col; spixels[buf++] = tmp;
if (do_collisions) coltmp |= tmp;
sprxp++;
}
if (dbl > 0) {
//var tmp = (*buf) | col; *buf++ = tmp;
var tmp = spixels[buf] | col; spixels[buf++] = tmp;
if (do_collisions) coltmp |= tmp;
sprxp++;
}
if (dbl > 1) {
var tmp;
//tmp = (*buf) | col; *buf++ = tmp;
tmp = spixels[buf] | col; spixels[buf++] = tmp;
if (do_collisions) coltmp |= tmp;
//tmp = (*buf) | col; *buf++ = tmp;
tmp = spixels[buf] | col; spixels[buf++] = tmp;
if (do_collisions) coltmp |= tmp;
sprxp++;
sprxp++;
}
j++;
datab >>>= 2;
if (do_collisions) {
coltmp &= collision_mask;
if (coltmp) {
var shrunk_tmp = sprite_ab_merge[coltmp & 255] | (sprite_ab_merge[coltmp >> 8] << 2);
clxdat |= sprclx[shrunk_tmp];
}
}
}
}
/* DATAB contains the sprite data; 16 pixels in two-bit packets. Bits 0/1
determine the color of the leftmost pixel, bits 2/3 the color of the next
etc.
This function assumes that for all sprites in a given line, SPRXP either
stays equal or increases between successive calls.
The data is recorded either in lores pixels (if OCS/ECS), or in hires or
superhires pixels (if AGA). */
//static void record_sprite (int line, int num, int sprxp, uae_u16 *data, uae_u16 *datb, unsigned int ctl)
function record_sprite(line, num, sprxp, data, datb, ctl) {
//struct sprite_entry *e = curr_sprite_entries + next_sprite_entry;
var e = curr_sprite_entries[next_sprite_entry];
var this_sprite_entry = next_sprite_entry; //OWN
var i;
var word_offs;
var collision_mask; //u32
var width, dbl, half;
var mask = 0; //uint
var attachment;
var nr2 = 0; //OWN
half = 0;
dbl = sprite_buffer_res - sprres;
if (dbl < 0) {
half = -dbl;
dbl = 0;
mask = 1 << half;
}
width = (sprite_width << sprite_buffer_res) >> sprres;
attachment = sprctl[num | 1] & 0x80;
/* Try to coalesce entries if they aren"t too far apart */
//if (!next_sprite_forced && e[-1].max + sprite_width >= sprxp) {
if (!next_sprite_forced && curr_sprite_entries[this_sprite_entry - 1].max + sprite_width >= sprxp) {
//e--;
e = curr_sprite_entries[--this_sprite_entry];
} else {
next_sprite_entry++;
e.pos = sprxp;
e.has_attached = 0;
}
if (sprxp < e.pos) SAEF_error("record_sprite() sprxp < e.pos (%d < %d)", sprxp, e.pos);
e.max = sprxp + width;
//e[1].first_pixel = e->first_pixel + ((e->max - e->pos + 3) & ~3);
curr_sprite_entries[this_sprite_entry + 1].first_pixel = e.first_pixel + ((e.max - e.pos + 3) & ~3);
next_sprite_forced = 0;
collision_mask = clxmask[clxcon >> 12];
word_offs = e.first_pixel + sprxp - e.pos;
for (i = 0; i < sprite_width; i += 16) {
//unsigned int da = *data;
//unsigned int db = *datb;
var da = data[nr2];
var db = datb[nr2];
var datab = ((sprtaba[da & 0xFF] << 16) | sprtaba[da >> 8] | (sprtabb[db & 0xFF] << 16) | sprtabb[db >> 8]) >>> 0; //u32
var off = (i << dbl) >> half;
//uae_u16 *buf = spixels + word_offs + off;
if (SAEV_config.chipset.colLevel > SAEC_Config_Chipset_ColLevel_None && collision_mask)
record_sprite_1(sprxp + off, word_offs + off, datab, num, dbl, mask, 1, collision_mask);
else
record_sprite_1(sprxp + off, word_offs + off, datab, num, dbl, mask, 0, collision_mask);
//data++; datb++;
nr2++;
}
/* We have 8 bits per pixel in spixstate, two for every sprite pair. The
low order bit records whether the attach bit was set for this pair. */
if (attachment && !isecsshres()) {
//uae_u32 state = 0x01010101 << (num & ~1);
var state = ((0x01010101 << (num & 0xfe)) >>> 0) & 0xff; //ATT
//uae_u8 *stb1 = spixstate.bytes + word_offs;
var stb1 = word_offs;
for (i = 0; i < width; i += 8) {
/*stb1[0] |= state;
stb1[1] |= state;
stb1[2] |= state;
stb1[3] |= state;
stb1[4] |= state;
stb1[5] |= state;
stb1[6] |= state;
stb1[7] |= state;*/
spixstate.bytes[stb1 + 0] |= state;
spixstate.bytes[stb1 + 1] |= state;
spixstate.bytes[stb1 + 2] |= state;
spixstate.bytes[stb1 + 3] |= state;
spixstate.bytes[stb1 + 4] |= state;
spixstate.bytes[stb1 + 5] |= state;
spixstate.bytes[stb1 + 6] |= state;
spixstate.bytes[stb1 + 7] |= state;
stb1 += 8;
}
e.has_attached = 1;
}
}
function add_sprite(count, num, sprxp, posns, nrs) {
var j, bestp;
/* Sort the sprites in order of ascending X position before recording them. */
for (bestp = 0; bestp < count; bestp++) {
if (posns[bestp] > sprxp)
break;
if (posns[bestp] == sprxp && nrs[bestp] < num)
break;
}
for (j = count; j > bestp; j--) {
posns[j] = posns[j - 1];
nrs[j] = nrs[j - 1];
}
posns[j] = sprxp;
nrs[j] = num;
}
function tospritexdiw(diw) {
return coord_window_to_hw_x(diw - (DIW_DDF_OFFSET << lores_shift)) << sprite_buffer_res;
}
function tospritexddf(ddf) {
return (ddf * 2 - DIW_DDF_OFFSET) << sprite_buffer_res;
}
function fromspritexdiw(ddf) {
return coord_hw_to_window_x(ddf >> sprite_buffer_res) + (DIW_DDF_OFFSET << lores_shift);
}
function calcsprite() {
sprite_maxx = 0x7fff;
sprite_minx = 0;
if (thisline_decision.diwlastword >= 0)
sprite_maxx = tospritexdiw(thisline_decision.diwlastword);
if (thisline_decision.diwfirstword >= 0)
sprite_minx = tospritexdiw(thisline_decision.diwfirstword);
if (thisline_decision.plfleft >= 0) {
var min = tospritexddf(thisline_decision.plfleft);
var max = tospritexddf(thisline_decision.plfright);
if (min > sprite_minx && min < max) { /* min < max = full line ddf */
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_DENISE) {
sprite_minx = min;
} else {
if (thisline_decision.plfleft >= 0x28 || bpldmawasactive)
sprite_minx = min;
}
}
/* sprites are visible from first BPL1DAT write to end of line
* ECS Denise/AGA: no limits
* OCS Denise: BPL1DAT write only enables sprite if hpos >= 0x28 or so.
* (undocumented feature) */
}
}
function decide_sprites(hpos, usepointx) {
if (typeof usepointx == "undefined") var usepointx = false;
var nrs = new Int32Array(MAX_SPRITES * 2);
var posns = new Int32Array(MAX_SPRITES * 2);
var width = sprite_width;
var sscanmask = 0x100 << sprite_buffer_res;
var gotdata = false;
if (thisline_decision.plfleft < 0 && !(bplcon3 & 2))
return;
// let sprite shift register empty completely if sprite is at the very edge of right border
var point = hpos * 2;
if (hpos >= maxhpos)
point += ((9 - 2) * 2) * sprite_buffer_res;
if (nodraw() || hpos < 0x14 || nr_armed == 0 || point == last_sprite_point)
return;
decide_diw(hpos);
SAER.playfield.decide_line(hpos);
calcsprite();
var i, count = 0;
for (i = 0; i < MAX_SPRITES; i++) {
var xpos = spr[i].xpos;
var sprxp = (fmode & 0x8000) ? (xpos & ~sscanmask) : xpos;
var hw_xp = sprxp >> sprite_buffer_res;
var pointx = usepointx && (sprctl[i] & sprite_sprctlmask) ? 0 : 1;
if (xpos < 0)
continue;
if (!spr[i].armed)
continue;
if (hw_xp > last_sprite_point && hw_xp <= point + pointx)
add_sprite(count++, i, sprxp, posns, nrs);
/* SSCAN2-bit is fun.. */
if ((fmode & 0x8000) && !(sprxp & sscanmask)) {
sprxp |= sscanmask;
hw_xp = sprxp >> sprite_buffer_res;
if (hw_xp > last_sprite_point && hw_xp <= point + pointx)
add_sprite(count++, MAX_SPRITES + i, sprxp, posns, nrs);
} else if (!(fmode & 0x80) && xpos >= (2 << sprite_buffer_res) && xpos <= (9 << sprite_buffer_res)) {
// right border wrap around. SPRxCTL horizontal bits do not matter.
sprxp += (maxhpos * 2) << sprite_buffer_res;
hw_xp = sprxp >> sprite_buffer_res;
if (hw_xp > last_sprite_point && hw_xp <= point + pointx)
add_sprite(count++, MAX_SPRITES + i, sprxp, posns, nrs);
// (not really mutually exclusive of SSCAN2-bit but not worth the trouble)
}
}
for (i = 0; i < count; i++) {
var nr = nrs[i] & (MAX_SPRITES - 1);
record_sprite(next_lineno, nr, posns[i], sprdata[nr], sprdatb[nr], sprctl[nr]);
if (AUTOSCALE_SPRITES) {
/* get left and right sprite edge if brdsprt enabled */
if (SAEF_Custom_dmaen(SAEC_Custom_DMAF_SPREN) && (bplcon0 & 1) && (bplcon3 & 0x02) && !(bplcon3 & 0x20) && nr > 0) {
for (var j = 0, jj = 0; j < sprite_width; j += 16, jj++) {
var nx = fromspritexdiw(posns[i] + j);
if (sprdata[nr][jj] || sprdatb[nr][jj]) {
if (diwfirstword_total > nx && nx >= (48 << SAEV_config.video.hresolution))
diwfirstword_total = nx;
if (diwlastword_total < nx + 16 && nx <= (448 << SAEV_config.video.hresolution))
diwlastword_total = nx + 16;
}
}
gotdata = true;
}
}
}
last_sprite_point = point;
if (AUTOSCALE_SPRITES) {
/* get upper and lower sprite position if brdsprt enabled */
if (gotdata) {
if (vpos < first_planes_vpos) first_planes_vpos = vpos;
if (vpos < plffirstline_total) plffirstline_total = vpos;
if (vpos > last_planes_vpos) last_planes_vpos = vpos;
if (vpos > plflastline_total) plflastline_total = vpos;
}
}
}
/*function decide_sprites(hpos) { //OWN
decide_sprites(hpos, false);
}*/
/*-----------------------------------------------------------------------*/
/* SECT decisions */
function sprites_differ(dip, dip_old) {
var this_first = curr_sprite_entries[dip.first_sprite_entry];
var this_last = curr_sprite_entries[dip.last_sprite_entry];
var prev_first = prev_sprite_entries[dip_old.first_sprite_entry];
var i;
if (dip.nr_sprites != dip_old.nr_sprites)
return 1;
if (dip.nr_sprites == 0)
return 0;
for (i = 0; i < dip.nr_sprites; i++) {
var this_first_i = curr_sprite_entries[dip.first_sprite_entry + i]; //OWN
var prev_first_i = prev_sprite_entries[dip_old.first_sprite_entry + i]; //OWN
if (
this_first_i.pos != prev_first_i.pos ||
this_first_i.max != prev_first_i.max ||
this_first_i.has_attached != prev_first_i.has_attached
) return 1;
}
var npixels = this_last.first_pixel + (this_last.max - this_last.pos) - this_first.first_pixel;
for (i = 0; i < npixels; i++) {
if (spixels[this_first.first_pixel + i] != spixels[prev_first.first_pixel + i]) return 1;
if (spixstate.bytes[this_first.first_pixel + i] != spixstate.bytes[prev_first.first_pixel + i]) return 1;
}
return 0;
}
function color_changes_differ(dip, dip_old) {
if (dip.nr_color_changes != dip_old.nr_color_changes)
return 1;
if (dip.nr_color_changes == 0)
return 0;
//if (memcmp(curr_color_changes + dip->first_color_change, prev_color_changes + dip_old->first_color_change, dip->nr_color_changes * sizeof *curr_color_changes) != 0) return 1;
for (var i = 0; i < dip.nr_color_changes; i++) {
if (cmp_color_change(curr_color_changes[dip.first_color_change], prev_color_changes[dip_old.first_color_change]) != 0) return 1;
}
return 0;
}
/* End of a horizontal scan line. Finish off all decisions that were not made yet. */
function finish_decisions() {
var dip;
var dip_old;
var dp;
var changed;
var hpos = maxhpos;
if (nodraw())
return;
decide_diw(hpos);
SAER.playfield.decide_line(hpos);
SAER.playfield.decide_fetch_safe(hpos);
finish_final_fetch();
record_color_change2(hsyncstartpos, 0xffff, 0);
if (thisline_decision.plfleft >= 0 && thisline_decision.plflinelen < 0) {
if (fetch_state != fetch_not_started)
SAEF_warn("playfield.finish_decisions() fetch_state != fetch_not_started");
thisline_decision.plfright = thisline_decision.plfleft;
thisline_decision.plflinelen = 0;
thisline_decision.bplres = SAEC_Config_Video_HResolution_LoRes;
}
/* Large DIWSTOP values can cause the stop position never to be
* reached, so the state machine always stays in the same state and
* there"s a more-or-less full-screen DIW. */
if (hdiwstate == DIW_WAITING_STOP) {
thisline_decision.diwlastword = max_diwlastword();
if (thisline_decision.diwfirstword < 0)
thisline_decision.diwfirstword = min_diwlastword;
}
if (thisline_decision.diwfirstword != line_decisions[next_lineno].diwfirstword) {
//MARK_LINE_CHANGED; //ORG
if (SMART_UPDATE) thisline_changed = 1; //OWN opt inline
}
if (thisline_decision.diwlastword != line_decisions[next_lineno].diwlastword) {
//MARK_LINE_CHANGED; //ORG
if (SMART_UPDATE) thisline_changed = 1; //OWN opt inline
}
dip = curr_drawinfo[next_lineno];
dip_old = prev_drawinfo[next_lineno];
dp = line_decisions[next_lineno];
changed = thisline_changed | custom_frame_redraw_necessary;
if (thisline_decision.plfleft >= 0 && thisline_decision.nr_planes > 0)
record_diw_line(thisline_decision.plfleft, diwfirstword, diwlastword);
decide_sprites(hpos + 1);
dip.last_sprite_entry = next_sprite_entry;
dip.last_color_change = next_color_change;
if (thisline_decision.ctable < 0) {
if (thisline_decision.plfleft < 0)
remember_ctable_for_border();
else
remember_ctable();
}
dip.nr_color_changes = next_color_change - dip.first_color_change;
dip.nr_sprites = next_sprite_entry - dip.first_sprite_entry;
if (thisline_decision.plfleft != line_decisions[next_lineno].plfleft)
changed = 1;
if (!changed && color_changes_differ(dip, dip_old))
changed = 1;
if (!changed && /* bitplane visible in this line OR border sprites enabled */
(thisline_decision.plfleft >= 0 || ((thisline_decision.bplcon0 & 1) && (thisline_decision.bplcon3 & 0x02) && !(thisline_decision.bplcon3 & 0x20))) &&
sprites_differ(dip, dip_old))
{
changed = 1;
}
if (changed) {
thisline_changed = 1;
// *dp = thisline_decision; //ORG
cpy_decision(dp, thisline_decision);
} else {
/* The only one that may differ: */
dp.ctable = thisline_decision.ctable;
}
/* leave free space for possible extra color changes at the end of line */
next_color_change += (HBLANK_OFFSET + 1) / 2; //ATT ok, (9+1)/2
diw_hcounter += maxhpos * 2;
if (!(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_DENISE) && vpos == get_equ_vblank_endline() - 1)
diw_hcounter++;
if ((SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_DENISE) || vpos > get_equ_vblank_endline() || (SAEV_config.chipset.agnusDIP && vpos == 0)) {
diw_hcounter = maxhpos * 2;
last_hdiw = 2 - 1;
}
if (next_color_change >= MAX_REG_CHANGE - 30) {
SAEF_warn("playfield.finish_decisions() color_change buffer overflow!");
next_color_change = 0;
dip.nr_color_changes = 0;
dip.first_color_change = 0;
dip.last_color_change = 0;
}
}
/* Set the state of all decisions to "undecided" for a new scanline. */
function reset_decisions() {
if (nodraw())
return;
toscr_nr_planes = toscr_nr_planes2 = 0;
thisline_decision.bplres = bplcon0_res;
thisline_decision.nr_planes = 0;
bpl1dat_written = false;
bpl1dat_written_at_least_once = false;
thisline_decision.plfleft = -1;
thisline_decision.plflinelen = -1;
thisline_decision.ham_seen = !!(bplcon0 & 0x800);
thisline_decision.ehb_seen = !!isehb(bplcon0, bplcon2);
thisline_decision.ham_at_start = !!(bplcon0 & 0x800);
thisline_decision.bordersprite_seen = issprbrd(-1, bplcon0, bplcon3);
/* decided_res shouldn"t be touched before it"s initialized by decide_line(). */
thisline_decision.diwfirstword = -1;
thisline_decision.diwlastword = -1;
if (hdiwstate == DIW_WAITING_STOP) {
thisline_decision.diwfirstword = min_diwlastword;
if (thisline_decision.diwfirstword != line_decisions[next_lineno].diwfirstword) {
//MARK_LINE_CHANGED; //ORG
if (SMART_UPDATE) thisline_changed = 1; //OWN opt inline
}
}
thisline_decision.ctable = -1;
thisline_changed = 0;
curr_drawinfo[next_lineno].first_color_change = next_color_change;
curr_drawinfo[next_lineno].first_sprite_entry = next_sprite_entry;
next_sprite_forced = 1;
last_sprite_point = 0;
fetch_state = fetch_not_started;
if (bpldmasetuphpos >= 0) {
// this can happen in "too fast" modes
BPLCON0_Denise(0, bplcon0, true);
setup_fmodes(0);
}
bpldmasetuphpos = -1;
bpldmasetupphase = 0;
bpldmawasactive = false;
reset_moddelays();
/*#if 0
reset_dbpll_all(256);
reset_dbplh_all(256);
#endif*/
delay_cycles = 0;
compute_toscr_delay(bplcon1);
if (plf_state >= plf_passed_stop2 || plf_state == plf_wait)
plf_state = plf_idle;
// Only ECS Agnus can keep DDF open between lines
if ((SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_AGNUS)) {
if (!ddfstop_matched)
plf_state = plf_active;
}
bpl_hstart = 256;
plfr_state = plfr_idle;
plf_start_hpos = 256 + DDF_OFFSET;
plf_end_hpos = 256 + DDF_OFFSET;
ddfstop_written_hpos = -1;
bitplane_maybe_start_hpos = -1;
bitplane_off_delay = -1;
if (line_cyclebased) {
line_cyclebased--;
if (!line_cyclebased)
bpl_dma_off_when_active = 0;
}
//fetched[] must not be cleared (Sony VX-90 / Royal Amiga Force)
todisplay_fetched[0] = todisplay_fetched[1] = false;
for (var i = 0; i < MAX_PLANES; i++) {
outword[i] = 0;
todisplay[i] = 0;
todisplay2[i] = 0;
}
//#ifdef AGA
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA) {
for (var i = 0; i < MAX_PLANES; i++) {
//todisplay_aga[i] = 0;
todisplay_aga_hi[i] = todisplay_aga_lo[i] = 0;
//todisplay2_aga[i] = 0;
todisplay2_aga_hi[i] = todisplay2_aga_lo[i] = 0;
}
}
aga_plf_passed_stop2 = false;
//#endif
if (bitplane_line_crossing) {
// BPL1DAT would have been written after end of last scanline.
// Set BPL1DAT "written at least once" state for new scanline.
bitplane_line_crossing -= maxhpos - HPOS_SHIFT;
if (bitplane_line_crossing > 0) {
bpl1dat_written = true;
bpl1dat_written_at_least_once = true;
reset_bpl_vars();
beginning_of_plane_block(bitplane_line_crossing, fetchmode);
}
bitplane_line_crossing = 0;
} else
reset_bpl_vars();
last_decide_line_hpos = -(DDF_OFFSET + 1);
last_ddf_pix_hpos = -1;
last_sprite_hpos = -1;
last_fetch_hpos = -1;
if (sprite_ignoreverticaluntilnextline) {
sprite_ignoreverticaluntilnextline = false;
for (var i = 0; i < MAX_SPRITES; i++)
spr[i].ignoreverticaluntilnextline = false;
}
/* These are for comparison. */
thisline_decision.bplcon0 = bplcon0;
thisline_decision.bplcon2 = bplcon2;
//#ifdef ECS_DENISE
thisline_decision.bplcon3 = bplcon3;
//#endif
//#ifdef AGA
thisline_decision.bplcon4 = bplcon4;
//#endif
scanlinecount++;
}
/*-----------------------------------------------------------------------*/
/* SECT vsync */
function compute_vsynctime() { //global
var svpos = maxvpos_nom; //double
var shpos = maxhpos_short; //double
var syncadjust = 1.0; //double
SAEV_Playfield_fake_vblank_hz = 0.0;
vblank_hz_mult = 0;
vblank_hz_state = 1;
if (Math.abs(SAEV_config.chipset.refreshRate) > 0.1) {
syncadjust = SAEV_config.chipset.refreshRate / vblank_hz_nom;
vblank_hz = SAEV_config.chipset.refreshRate;
if (isvsync_chipset()) {
var result = {};
SAEF_Playfield_getvsyncrate(vblank_hz, result);
if (result.hz != vblank_hz) {
SAEF_Playfield_getvsyncrate(vblank_hz, result);
vblank_hz = result.hz;
vblank_hz_mult = result.mult;
if (vblank_hz_mult > 0)
vblank_hz_state = 0;
}
}
}
if (!SAEV_Playfield_fake_vblank_hz)
SAEV_Playfield_fake_vblank_hz = vblank_hz;
/*if (currprefs.turbo_emulation) {
if (currprefs.turbo_emulation_limit > 0) {
SAEV_Audio_vsynctimebase_orig = SAER.events.calc_vsynctimebase(currprefs.turbo_emulation_limit);
} else {
SAEV_Audio_vsynctimebase_orig = SAER.events.calc_vsynctimebase(SAEC_Events_syncbase / 1000);
}
} else*/
SAEV_Audio_vsynctimebase_orig = SAER.events.calc_vsynctimebase(SAEV_Playfield_fake_vblank_hz);
/*#if 0
if (!SAEV_Playfield_picasso_on) updatedisplayarea();
#endif*/
if (islinetoggle())
shpos += 0.5;
if (interlace_seen)
svpos += 0.5;
else if (lof_current)
svpos += 1.0;
if (SAEV_config.audio.mode != SAEC_Config_Audio_Mode_Off) {
var clk = svpos * shpos * SAEV_Playfield_fake_vblank_hz; //double
SAEF_log("playfield.compute_vsynctime() %.1f*%.1f*%.6f=%.6f, syncadjust %f", svpos, shpos, SAEV_Playfield_fake_vblank_hz, clk, syncadjust);
SAER.devices.update_sound(clk, syncadjust);
}
//SAER.devices.update_sync(svpos, syncadjust); //OWN cd32
}
this.compute_vsynctime_ext = function() {
compute_vsynctime();
}
/*void getsyncregisters(uae_u16 *phsstrt, uae_u16 *phsstop, uae_u16 *pvsstrt, uae_u16 *pvsstop) {
*phsstrt = hsstrt;
*phsstop = hsstop;
*pvsstrt = vsstrt;
*pvsstop = vsstop;
}*/
function dumpsync() {
//static int cnt = 100; if (cnt < 0) return; cnt--;
SAEF_log("BEAMCON0=%04X VTOTAL=%04X HTOTAL=%04X", new_beamcon0, vtotal, htotal);
SAEF_log(" HSSTOP=%04X HBSTRT=%04X HBSTOP=%04X", hsstop, hbstrt, hbstop);
SAEF_log(" VSSTOP=%04X VBSTRT=%04X VBSTOP=%04X", vsstop, vbstrt, vbstop);
SAEF_log(" HSSTRT=%04X VSSTRT=%04X HCENTER=%04X", hsstrt, vsstrt, hcenter);
SAEF_log(" HSYNCSTART=%04X HSYNCEND=%04X", hsyncstartpos, hsyncendpos);
}
function current_maxvpos() { //global
return maxvpos + (lof_store ? 1 : 0);
}
/*#if 0
function checklacecount(lace) {
if (!interlace_changed) {
if (nlace_cnt >= NLACE_CNT_NEEDED && lace) {
lof_togglecnt_lace = LOF_TOGGLES_NEEDED;
lof_togglecnt_nlace = 0;
nlace_cnt = 0;
} else if (nlace_cnt <= -NLACE_CNT_NEEDED && !lace) {
lof_togglecnt_nlace = LOF_TOGGLES_NEEDED;
lof_togglecnt_lace = 0;
nlace_cnt = 0;
}
}
if (lace) {
if (nlace_cnt > 0)
nlace_cnt = 0;
nlace_cnt--;
if (nlace_cnt < -NLACE_CNT_NEEDED * 2)
nlace_cnt = -NLACE_CNT_NEEDED * 2;
} else if (!lace) {
if (nlace_cnt < 0)
nlace_cnt = 0;
nlace_cnt++;
if (nlace_cnt > NLACE_CNT_NEEDED * 2)
nlace_cnt = NLACE_CNT_NEEDED * 2;
}
}
#endif*/
function get_chipset_refresh() { //global
var islace = interlace_seen ? 1 : 0;
var isntsc = (beamcon0 & 0x20) ? 0 : 1;
if (!(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_AGNUS))
isntsc = SAEV_config.chipset.ntsc ? 1 : 0;
for (var i = 0; i < SAEV_config.chipset.refresh.length; i++) {
var cr = SAEV_config.chipset.refresh[i];
if ((cr.horiz < 0 || cr.horiz == maxhpos) &&
(cr.vert < 0 || cr.vert == maxvpos_display) &&
(cr.ntsc < 0 || (cr.ntsc > 0 && isntsc) || (cr.ntsc == 0 && !isntsc)) &&
(cr.lace < 0 || (cr.lace > 0 && islace) || (cr.lace == 0 && !islace)) &&
(cr.framelength < 0 || (cr.framelength > 0 && lof_store) || (cr.framelength == 0 && !lof_store) || (cr.framelength >= 0 && islace)) &&
((cr.rtg && SAEV_Playfield_picasso_on) || (!cr.rtg && !SAEV_Playfield_picasso_on)) &&
(cr.vsync < 0 || (cr.vsync > 0 && isvsync_chipset()) || (cr.vsync == 0 && !isvsync_chipset())))
return cr;
}
return null;
}
function changed_chipset_refresh() {
return stored_chipset_refresh != get_chipset_refresh();
}
function compute_framesync() { //global
var islace = interlace_seen ? 1 : 0;
var isntsc = (beamcon0 & 0x20) ? 0 : 1;
var found = false;
var i;
if (islace)
vblank_hz = vblank_hz_lace;
else if (lof_current)
vblank_hz = vblank_hz_lof;
else
vblank_hz = vblank_hz_shf;
var cr = get_chipset_refresh(); //struct chipset_refresh *
while (cr !== null) {
var v = -1.0;
if (!SAEV_Playfield_picasso_on && !SAEV_Playfield_picasso_requested_on) {
/*if (isvsync_chipset()) {
if (cr.index == SAEC_Config_Chipset_CR_PAL || cr.index == SAEC_Config_Chipset_CR_NTSC) {
if ((fabs (vblank_hz - 50) < 1 || fabs (vblank_hz - 60) < 1 || fabs (vblank_hz - 100) < 1 || fabs (vblank_hz - 120) < 1) && SAEV_config.video.apmode[0].gfx_vsync == 2 && SAEV_config.video.apmode[0].gfx_fullscreen > 0) {
vsync_switchmode((int)vblank_hz);
}
}
if (isvsync_chipset() < 0) {
var v2 = vblank_calibrate(cr.locked ? cr.rate : vblank_hz, cr.locked);
if (!cr.locked)
v = v2;
} else if (isvsync_chipset() > 0) {
if (SAEV_config.video.apmode[0].gfx_refreshrate)
v = abs (SAEV_config.video.apmode[0].gfx_refreshrate);
}
} else*/ {
if (cr.locked == false) {
SAEV_config.chipset.refreshRate = vblank_hz;
//changed_prefs.chipset_refreshrate = SAEV_config.chipset.refreshRate = vblank_hz; cfgfile_parse_lines (&changed_prefs, cr.commands, -1);
break;
} else
v = cr.rate;
}
if (v < 0)
v = cr.rate;
if (v > 0) {
SAEV_config.chipset.refreshRate = v;
//changed_prefs.chipset_refreshrate = SAEV_config.chipset.refreshRate = v; cfgfile_parse_lines (&changed_prefs, cr.commands, -1);
}
} else {
if (cr.locked == false)
v = vblank_hz;
else
v = cr.rate;
SAEV_config.chipset.refreshRate = v;
//changed_prefs.chipset_refreshrate = SAEV_config.chipset.refreshRate = v; cfgfile_parse_lines (&changed_prefs, cr.commands, -1);
}
found = true;
break;
}
if (!found) SAEV_config.chipset.refreshRate = vblank_hz;
//if (!found) changed_prefs.chipset_refreshrate = SAEV_config.chipset.refreshRate = vblank_hz;
stored_chipset_refresh = cr;
interlace_changed = 0;
lof_togglecnt_lace = 0;
lof_togglecnt_nlace = 0;
//nlace_cnt = NLACE_CNT_NEEDED;
lof_changing = 0;
gfxvidinfo.drawbuffer.inxoffset = -1;
gfxvidinfo.drawbuffer.inyoffset = -1;
if (beamcon0 & 0x80) {
var res = GET_RES_AGNUS(bplcon0);
var vres = islace ? 1 : 0;
var res2, vres2;
res2 = SAEV_config.video.hresolution;
if (doublescan > 0)
res2++;
if (res2 > RES_MAX)
res2 = RES_MAX;
vres2 = SAEV_config.video.vresolution;
if (doublescan > 0 && !islace)
vres2--;
if (vres2 < 0)
vres2 = 0;
if (vres2 > VRES_QUAD)
vres2 = VRES_QUAD;
var start = hsyncstartpos; //hbstrt;
var stop = hsyncendpos; //hbstop;
gfxvidinfo.drawbuffer.inwidth = ((maxhpos - (maxhpos - start + DISPLAY_LEFT_SHIFT/2) + 1) * 2) << res2; //ATT ok, DISPLAY_LEFT_SHIFT/2 == 0x38/2
gfxvidinfo.drawbuffer.inxoffset = stop * 2;
gfxvidinfo.drawbuffer.extrawidth = 0;
gfxvidinfo.drawbuffer.inwidth2 = gfxvidinfo.drawbuffer.inwidth;
gfxvidinfo.drawbuffer.inheight = ((firstblankedline < maxvpos ? firstblankedline : maxvpos) - minfirstline + 1) << vres2;
gfxvidinfo.drawbuffer.inheight2 = gfxvidinfo.drawbuffer.inheight;
} else {
gfxvidinfo.drawbuffer.inwidth = SAEC_Video_MAX_AMIGA_WIDTH << SAEV_config.video.hresolution;
gfxvidinfo.drawbuffer.extrawidth = -1; //currprefs.gfx_extrawidth ? currprefs.gfx_extrawidth : -1; //OWN
gfxvidinfo.drawbuffer.inwidth2 = gfxvidinfo.drawbuffer.inwidth;
gfxvidinfo.drawbuffer.inheight = (maxvpos_display - minfirstline + 1) << SAEV_config.video.vresolution;
gfxvidinfo.drawbuffer.inheight2 = gfxvidinfo.drawbuffer.inheight;
}
if (gfxvidinfo.drawbuffer.inwidth > gfxvidinfo.drawbuffer.width_allocated)
gfxvidinfo.drawbuffer.inwidth = gfxvidinfo.drawbuffer.width_allocated;
if (gfxvidinfo.drawbuffer.inwidth2 > gfxvidinfo.drawbuffer.width_allocated)
gfxvidinfo.drawbuffer.inwidth2 = gfxvidinfo.drawbuffer.width_allocated;
if (gfxvidinfo.drawbuffer.inheight > gfxvidinfo.drawbuffer.height_allocated)
gfxvidinfo.drawbuffer.inheight = gfxvidinfo.drawbuffer.height_allocated;
if (gfxvidinfo.drawbuffer.inheight2 > gfxvidinfo.drawbuffer.height_allocated)
gfxvidinfo.drawbuffer.inheight2 = gfxvidinfo.drawbuffer.height_allocated;
gfxvidinfo.drawbuffer.outwidth = gfxvidinfo.drawbuffer.inwidth;
gfxvidinfo.drawbuffer.outheight = gfxvidinfo.drawbuffer.inheight;
if (gfxvidinfo.drawbuffer.outwidth > gfxvidinfo.drawbuffer.width_allocated)
gfxvidinfo.drawbuffer.outwidth = gfxvidinfo.drawbuffer.width_allocated;
if (gfxvidinfo.drawbuffer.outheight > gfxvidinfo.drawbuffer.height_allocated)
gfxvidinfo.drawbuffer.outheight = gfxvidinfo.drawbuffer.height_allocated;
//memset(line_decisions, 0, sizeof line_decisions);
//for (i = 0; i < sizeof (line_decisions) / sizeof *line_decisions; i++) line_decisions[i].plfleft = -2;
for (i = 0; i < line_decisions.length; i++) {
line_decisions[i].clr();
line_decisions[i].plfleft = -2;
}
//memset(line_drawinfo, 0, sizeof line_drawinfo);
for (i = 0; i < line_drawinfo[0].length; i++) {
line_drawinfo[0][i].clr();
line_drawinfo[1][i].clr();
}
compute_vsynctime();
hblank_hz = (SAEV_config.chipset.ntsc ? SAEC_Playfield_CLOCK_NTSC : SAEC_Playfield_CLOCK_PAL) / (maxhpos + (islinetoggle() ? 0.5 : 0));
SAEF_log("playfield.compute_framesync() %s mode%s%s V=%.4fHz H=%0.4fHz (%dx%d+%d) IDX=%d (%s) DSP=%d RTG=%d/%d",
isntsc ? "NTSC" : "PAL",
islace ? " lace" : (lof_lace ? " loflace" : ""),
doublescan > 0 ? " dblscan" : "",
vblank_hz,
hblank_hz,
maxhpos, maxvpos, lof_store ? 1 : 0,
cr !== null ? cr.index : -1,
cr !== null && cr.label.length ? cr.label : "<?>",
SAEV_config.video.apmode[SAEV_Playfield_picasso_on ? 1 : 0].gfx_display,
SAEV_Playfield_picasso_on?1:0, SAEV_Playfield_picasso_requested_on?1:0
);
//set_config_changed(); //OWN
if (SAER.video.target_graphics_buffer_update())
reset_drawing();
}
/* set PAL/NTSC or custom timing variables */
function init_hz(checkvposw) {
var isntsc, islace;
var odbl = doublescan, omaxvpos = maxvpos;
var ovblank = vblank_hz;
var hzc = 0;
if (!checkvposw)
vpos_count = 0;
vpos_count_diff = vpos_count;
doublescan = 0;
programmedmode = false;
if ((beamcon0 & 0xA0) != (new_beamcon0 & 0xA0))
hzc = 1;
if (beamcon0 != new_beamcon0) {
SAEF_log("playfield.init_hz() BEAMCON0 0x%04x -> 0x%04x", beamcon0, new_beamcon0);
vpos_count_diff = vpos_count = 0;
}
beamcon0 = new_beamcon0;
isntsc = (beamcon0 & 0x20) ? 0 : 1;
islace = (interlace_seen) ? 1 : 0;
if (!(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_AGNUS))
isntsc = SAEV_config.chipset.ntsc ? 1 : 0;
var clk = SAEV_config.chipset.ntsc ? SAEC_Playfield_CLOCK_NTSC : SAEC_Playfield_CLOCK_PAL;
if (!isntsc) {
maxvpos = MAXVPOS_PAL;
maxhpos = MAXHPOS_PAL;
minfirstline = VBLANK_ENDLINE_PAL;
vblank_hz_nom = vblank_hz = VBLANK_HZ_PAL;
sprite_vblank_endline = VBLANK_SPRITE_PAL;
equ_vblank_endline = EQU_ENDLINE_PAL;
equ_vblank_toggle = true;
vblank_hz_shf = clk / ((maxvpos + 0) * maxhpos);
vblank_hz_lof = clk / ((maxvpos + 1) * maxhpos);
vblank_hz_lace = clk / ((maxvpos + 0.5) * maxhpos);
} else {
maxvpos = MAXVPOS_NTSC;
maxhpos = MAXHPOS_NTSC;
minfirstline = VBLANK_ENDLINE_NTSC;
vblank_hz_nom = vblank_hz = VBLANK_HZ_NTSC;
sprite_vblank_endline = VBLANK_SPRITE_NTSC;
equ_vblank_endline = EQU_ENDLINE_NTSC;
equ_vblank_toggle = false;
vblank_hz_shf = clk / ((maxvpos + 0) * (maxhpos + 0.5));
vblank_hz_lof = clk / ((maxvpos + 1) * (maxhpos + 0.5));
vblank_hz_lace = clk / ((maxvpos + 0.5) * (maxhpos + 0.5));
}
maxvpos_nom = maxvpos;
maxvpos_display = maxvpos;
if (vpos_count > 0) {
// we come here if vpos_count != maxvpos and beamcon0 didn"t change (someone poked VPOSW)
if (vpos_count < 10)
vpos_count = 10;
vblank_hz = (isntsc ? 15734.0 : 15625.0) / vpos_count;
vblank_hz_nom = vblank_hz_shf = vblank_hz_lof = vblank_hz_lace = vblank_hz;
maxvpos_nom = vpos_count - (lof_current ? 1 : 0);
if ((maxvpos_nom >= 256 && maxvpos_nom <= 313) || (beamcon0 & 0x80)) {
maxvpos_display = maxvpos_nom;
} else if (maxvpos_nom < 256) {
maxvpos_display = 255;
} else {
maxvpos_display = 313;
}
reset_drawing();
} else if (vpos_count == 0) {
// mode reset
vpos_count = maxvpos;
vpos_count_diff = maxvpos;
}
firstblankedline = maxvpos + 1;
if (beamcon0 & 0x80) {
// programmable scanrates (ECS Agnus)
if (vtotal >= MAXVPOS)
vtotal = MAXVPOS - 1;
maxvpos = vtotal + 1;
firstblankedline = maxvpos + 1;
if (htotal >= MAXHPOS)
htotal = MAXHPOS - 1;
maxhpos = htotal + 1;
vblank_hz_nom = vblank_hz = 227.0 * 312.0 * 50.0 / (maxvpos * maxhpos);
vblank_hz_shf = vblank_hz;
vblank_hz_lof = 227.0 * 313.0 * 50.0 / (maxvpos * maxhpos);
vblank_hz_lace = 227.0 * 312.5 * 50.0 / (maxvpos * maxhpos);
if ((beamcon0 & 0x1000) && (beamcon0 & 0x0200)) { // VARVBEN + VARVSYEN
minfirstline = vsstop > vbstop ? vsstop : vbstop;
if (minfirstline > maxvpos >> 1) //OWN / 2
minfirstline = vsstop > vbstop ? vbstop : vsstop;
firstblankedline = vbstrt;
} else if (beamcon0 & 0x0200) {
minfirstline = vsstop;
if (minfirstline > maxvpos >> 1) //OWN / 2
minfirstline = 0;
} else if (beamcon0 & 0x1000) {
minfirstline = vbstop;
if (minfirstline > maxvpos >> 1) //OWN / 2
minfirstline = 0;
firstblankedline = vbstrt;
}
if (minfirstline < 2)
minfirstline = 2;
if (minfirstline >= maxvpos)
minfirstline = maxvpos - 1;
if (firstblankedline < minfirstline)
firstblankedline = maxvpos + 1;
sprite_vblank_endline = minfirstline - 2;
maxvpos_nom = maxvpos;
maxvpos_display = maxvpos;
equ_vblank_endline = -1;
doublescan = htotal <= 164 && vtotal >= 350 ? 1 : 0;
// if superhires and wide enough: not doublescan
if (doublescan && htotal >= 140 && (bplcon0 & 0x0040))
doublescan = 0;
programmedmode = true;
varsync_changed = true;
vpos_count = maxvpos_nom;
vpos_count_diff = maxvpos_nom;
hzc = 1;
}
if (maxvpos_nom >= MAXVPOS)
maxvpos_nom = MAXVPOS;
if (maxvpos_display >= MAXVPOS)
maxvpos_display = MAXVPOS;
if (SAEV_config.video.scandoubler && doublescan == 0)
doublescan = -1;
if (doublescan != odbl || maxvpos != omaxvpos)
hzc = 1;
/* limit to sane values */
if (vblank_hz < 10)
vblank_hz = 10;
if (vblank_hz > 300)
vblank_hz = 300;
maxhpos_short = maxhpos;
set_delay_lastcycle();
if ((beamcon0 & 0x80) && (beamcon0 & 0x0100)) {
hsyncstartpos = hsstrt;
hsyncendpos = hsstop;
if ((bplcon0 & 1) && (bplcon3 & 1)) {
if (hbstrt > maxhpos >> 1) { //OWN / 2
if (hsyncstartpos < hbstrt)
hsyncstartpos = hbstrt;
} else {
if (hsyncstartpos > hbstrt)
hsyncstartpos = hbstrt;
}
if (hbstop > maxhpos >> 1) { //OWN / 2
if (hsyncendpos > hbstop)
hsyncendpos = hbstop;
} else {
if (hsyncendpos < hbstop)
hsyncendpos = hbstop;
}
}
if (hsyncstartpos < hsyncendpos)
hsyncstartpos = maxhpos + hsyncstartpos;
hsyncendpos--;
if (hsyncendpos < 2)
hsyncendpos = 2;
} else {
hsyncstartpos = maxhpos_short + 13;
hsyncendpos = 24;
}
hpos_offset = 0;
SAER_Events_eventtab[SAEC_Events_EV_HSYNC].oldcycles = SAEV_Events_currcycle;
SAER_Events_eventtab[SAEC_Events_EV_HSYNC].evtime = SAEV_Events_currcycle + maxhpos * SAEC_Events_CYCLE_UNIT; //HSYNCTIME();
SAER.events.schedule();
if (hzc) {
interlace_seen = islace;
reset_drawing();
}
maxvpos_total = (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_AGNUS) ? (MAXVPOS_LINES_ECS - 1) : (MAXVPOS_LINES_OCS - 1);
if (maxvpos_total > MAXVPOS)
maxvpos_total = MAXVPOS;
/*#ifdef PICASSO96
if (!p96refresh_active) {
maxvpos_stored = maxvpos;
maxhpos_stored = maxhpos;
vblank_hz_stored = vblank_hz;
}
#endif*/
compute_framesync();
/*#ifdef PICASSO96
init_hz_p96();
#endif*/
if (vblank_hz != ovblank)
SAER.video.updatedisplayarea();
//inputdevice_tablet_strobe(); //OWN
if (varsync_changed) {
varsync_changed = false;
//dumpsync();
}
}
function init_hz_vposw() {
init_hz(true);
}
function init_hz_normal() {
init_hz(false);
}
/*
0 0 -
1 1 --
2 2 -
3 3 --
4 4 -
5 5 --
0 x -+
1 0 --
2 1 -
3 2 --
4 3 -
5 4 --
*/
function hsync_scandoubler() {
if (lof_store && vpos >= maxvpos_nom - 1)
return;
next_lineno++;
scandoubled_line = 1;
var bpltmp = new Array(8);
var bpltmpx = new Array(8);
var i;
for (i = 0; i < 8; i++) {
bpltmp[i] = bplpt[i];
bpltmpx[i] = bplptx[i];
if (prevbpl[lof_store][vpos][i] && prevbpl[1 - lof_store][vpos][i]) {
var diff = prevbpl[lof_store][vpos][i] - prevbpl[1 - lof_store][vpos][i];
if (lof_store) {
if (bplcon0 & 4)
bplpt[i] = prevbpl[lof_store][vpos][i] - diff;
} else {
if (bplcon0 & 4)
bplpt[i] = prevbpl[lof_store][vpos][i];
else
bplpt[i] = bplpt[i] - diff;
}
}
}
reset_decisions();
plf_state = plf_idle;
plfr_state = plfr_idle;
// copy color changes
var dip1 = curr_drawinfo[next_lineno - 1];
for (var idx1 = dip1.first_color_change; idx1 < dip1.last_color_change; idx1++) {
var cs2 = curr_color_changes[idx1];
var regno = cs2.regno;
var hpos = cs2.linepos;
if (regno < 0x1000 && hpos < HBLANK_OFFSET && !(beamcon0 & 0x80) && prev_lineno >= 0) {
var pdip = curr_drawinfo[next_lineno - 1];
var idx = pdip.last_color_change;
pdip.last_color_change++;
pdip.nr_color_changes++;
curr_color_changes[idx].linepos = hpos + maxhpos + 1;
curr_color_changes[idx].regno = regno;
curr_color_changes[idx].value = cs2.value;
curr_color_changes[idx + 1].regno = -1;
} else {
var cs1 = curr_color_changes[next_color_change];
cpy_color_change(cs1, cs2); //memcpy(cs1, cs2, sizeof (struct color_change));
next_color_change++;
}
}
curr_color_changes[next_color_change].regno = -1;
finish_decisions();
hsync_record_line_state(next_lineno, nln_normal, thisline_changed);
hardware_line_completed(next_lineno);
scandoubled_line = 0;
for (i = 0; i < 8; i++) {
bplpt[i] = bpltmp[i];
bplptx[i] = bpltmpx[i];
}
}
// vsync functions that are not hardware timing related
function vsync_handler_pre() {
if (SAEV_Events_bogusframe > 0) SAEV_Events_bogusframe--;
/*while (handle_events()) {
// we are paused, do all config checks but don't do any emulation
if (vsync_handle_check()) {
redraw_frame();
SAER.video.render_screen(true);
SAER.video.show_screen(0);
}
config_check_vsync();
}*/
if (SAEV_command > 0) {
//prevent possible infinite loop at wait_cycles()
framecnt = 0;
reset_decisions();
return;
}
//config_check_vsync();
if (timehack_alive > 0) timehack_alive--;
SAER.devices.vsync_pre();
/*#ifdef PICASSO96
if (isvsync_rtg() >= 0)
rtg_vsync();
#endif*/
if (!vsync_rendered) {
var start = SAEF_now();
vsync_handle_redraw(lof_store, lof_changed, bplcon0, bplcon3);
vsync_rendered = true;
SAEV_Events_frameskiptime += SAEF_now() - start;
}
var frameok = SAER.events.framewait();
if (!SAEV_Playfield_picasso_on) {
if (!SAEV_Playfield_frame_rendered && vblank_hz_state)
SAEV_Playfield_frame_rendered = SAER.video.render_screen(false);
if (SAEV_Playfield_frame_rendered && !SAEV_Playfield_frame_shown)
SAEV_Playfield_frame_shown = SAER.video.show_screen_maybe(isvsync_chipset() >= 0);
}
SAER.events.fpscounter(frameok);
vsync_rendered = false;
SAEV_Playfield_frame_shown = false;
SAEV_Playfield_frame_rendered = false;
if (vblank_hz_mult > 0)
vblank_hz_state ^= 1;
else
vblank_hz_state = 1;
vsync_handle_check();
/*#if 0
checklacecount (bplcon0_interlace_seen || lof_lace);
#endif*/
}
// emulated hardware vsync
function vsync_handler_post() {
/*static frame_time_t prevtime;
SAEF_log("playfield.vsync_handler_post() %d %d %d", vsynctimebase, SAEF_now () - vsyncmintime, SAEF_now () - prevtime);
var prevtime = SAEF_now();*/
//if ((SAEV_Custom_intreq & 0x0020) && (SAEV_Custom_intena & 0x0020)) SAEF_warn("playfield.vsync_handler_post() vblank interrupt not cleared");
SAER.disk.vsync();
if (bplcon0 & 4) {
lof_store = lof_store ? 0 : 1;
}
if ((bplcon0 & 2) && SAEV_config.chipset.genlock) {
genlockvtoggle = lof_store ? 1 : 0;
}
if (lof_prev_lastline != lof_lastline) {
if (lof_togglecnt_lace < LOF_TOGGLES_NEEDED)
lof_togglecnt_lace++;
if (lof_togglecnt_lace >= LOF_TOGGLES_NEEDED)
lof_togglecnt_nlace = 0;
} else {
// only 1-2 vblanks with bplcon0 lace bit set?
// lets check if lof has changed
if (!(bplcon0 & 4) && lof_togglecnt_lace > 0 && lof_togglecnt_lace < LOF_TOGGLES_NEEDED && !interlace_seen) {
lof_changed = 1;
}
lof_togglecnt_nlace = LOF_TOGGLES_NEEDED;
lof_togglecnt_lace = 0;
/*#if 0
if (lof_togglecnt_nlace < LOF_TOGGLES_NEEDED)
lof_togglecnt_nlace++;
if (lof_togglecnt_nlace >= LOF_TOGGLES_NEEDED)
lof_togglecnt_lace = 0;
#endif*/
}
lof_prev_lastline = lof_lastline;
lof_current = lof_store;
if (lof_togglecnt_lace >= LOF_TOGGLES_NEEDED) {
interlace_changed = notice_interlace_seen(true);
if (interlace_changed) {
notice_screen_contents_lost();
}
} else if (lof_togglecnt_nlace >= LOF_TOGGLES_NEEDED) {
interlace_changed = notice_interlace_seen(false);
if (interlace_changed) {
notice_screen_contents_lost();
}
}
if (lof_changing) {
// still same? Trigger change now.
if ((!lof_store && lof_changing < 0) || (lof_store && lof_changing > 0)) {
lof_changed_previous_field++;
lof_changed = 1;
// lof toggling? decide as interlace.
if (lof_changed_previous_field >= LOF_TOGGLES_NEEDED) {
lof_changed_previous_field = LOF_TOGGLES_NEEDED;
if (lof_lace == false)
lof_lace = true;
else
lof_changed = 0;
}
if (bplcon0 & 4)
lof_changed = 0;
}
lof_changing = 0;
} else {
lof_changed_previous_field = 0;
lof_lace = false;
}
/*#ifdef PICASSO96
if (p96refresh_active) {
vpos_count = p96refresh_active;
vtotal = vpos_count;
}
#endif*/
SAER.devices.vsync_post();
if (varsync_changed || (beamcon0 & (0x10 | 0x20 | 0x80 | 0x100 | 0x200)) != (new_beamcon0 & (0x10 | 0x20 | 0x80 | 0x100 | 0x200)))
init_hz_normal();
else if (vpos_count > 0 && Math.abs(vpos_count - vpos_count_diff) > 1 && vposw_change < 4)
init_hz_vposw();
else if (interlace_changed || changed_chipset_refresh() || lof_changed)
compute_framesync();
lof_changed = 0;
vposw_change = 0;
bplcon0_interlace_seen = false;
SAER.copper.COPJMP(1, 1);
init_hardware_frame();
}
/*function copper_check(n) {
const COP_wait = 8;
if (SAER_Copper_cop_state.state == COP_wait) {
var vp = vpos & (((SAER_Copper_cop_state.saved_i2 >> 8) & 0x7F) | 0x80);
if (vp < SAER_Copper_cop_state.vcmp) {
if (SAEV_Copper_enabled_thisline)
SAEF_error("playfield.copper_check() bug %d: vp=%d vpos=%d vcmp=%d thisline=%d", n, vp, vpos, SAER_Copper_cop_state.vcmp, SAEV_Copper_enabled_thisline);
}
}
}*/
// OPT inline
function set_hpos() {
maxhpos = maxhpos_short + lol;
hpos_offset = 0;
SAER_Events_eventtab[SAEC_Events_EV_HSYNC].evtime = SAEV_Events_currcycle + maxhpos * SAEC_Events_CYCLE_UNIT; //HSYNCTIME();
SAER_Events_eventtab[SAEC_Events_EV_HSYNC].oldcycles = SAEV_Events_currcycle;
}
// this finishes current line
function hsync_handler_pre(onvsync) {
var hpos = SAER.events.current_hpos();
if (!nocustom()) {
SAER.copper.sync_copper_with_cpu(maxhpos, 0);
const COP_read2 = 3;
// Seven Seas scrolling quick fix hack checks if copper is going to modify BPLCON1 in next cycle.
if (SAEV_Copper_enabled_thisline && SAER_Copper_cop_state.state == COP_read2 && (SAER_Copper_cop_state.i1 & 0x1fe) == 0x102) {
// it did, pre-load value for Denise shifter emulation
hpos_is_zero_bplcon1_hack = SAER_Memory_chipGet16_indirect(SAER_Copper_cop_state.ip);
// following finish_decision() is going to finish this line it is too late when copper actually does the move
}
finish_decisions();
if (thisline_decision.plfleft >= 0) {
if (SAEV_config.chipset.colLevel > SAEC_Config_Chipset_ColLevel_Sprite_Sprite)
do_sprite_collisions();
if (SAEV_config.chipset.colLevel > SAEC_Config_Chipset_ColLevel_Sprite_Playfield)
do_playfield_collisions();
}
hsync_record_line_state(next_lineno, nextline_how, thisline_changed);
// reset light pen latch
if (vpos == sprite_vblank_endline) {
lightpen_triggered = 0;
sprite_0 = 0;
}
if (lightpen_enabled && lightpen_cx > 0 && (bplcon0 & 8) && !lightpen_triggered && lightpen_cy == vpos) {
vpos_lpen = vpos;
hpos_lpen = lightpen_cx;
lightpen_triggered = 1;
}
hardware_line_completed(next_lineno);
if (doflickerfix() && interlace_seen > 0)
hsync_scandoubler();
notice_resolution_seen(GET_RES_AGNUS(bplcon0), interlace_seen != 0);
}
SAER.devices.hsync(onvsync);
SAEV_Events_hsync_counter++;
//refptr += 0x0200 * 4;
//refptr_val += 0x0200 * 4;
refptr += 0x0800; if (refptr > 0xffff) refptr -= 0x10000;
refptr_val += 0x0800; if (refptr_val > 0xffffffff) refptr_val -= 0x100000000;
if (islinetoggle())
lol ^= 1;
else
lol = 0;
vpos++;
vpos_count++;
if (vpos >= maxvpos_total)
vpos = 0;
if (onvsync) {
vpos = 0;
SAEV_Events_vsync_counter++;
}
set_hpos();
/*{
maxhpos = maxhpos_short + lol;
hpos_offset = 0;
SAER_Events_eventtab[SAEC_Events_EV_HSYNC].evtime = SAEV_Events_currcycle + maxhpos * SAEC_Events_CYCLE_UNIT; //HSYNCTIME();
SAER_Events_eventtab[SAEC_Events_EV_HSYNC].oldcycles = SAEV_Events_currcycle;
}*/
}
function is_last_line() {
return vpos + 1 == maxvpos + lof_store;
}
// this prepares for new line
var cia_hsync = 0; //int
function hsync_handler_post(onvsync) {
SAEV_Copper_last_hpos = 0;
//#ifdef CPUEMU_13
//if (SAEV_config.chipset.blitter.cycle_exact)
// SAER_Events_cycle_line.clr();
//#endif
// genlock active:
// vertical: interlaced = toggles every other field, non-interlaced = both fields (normal)
// horizontal: PAL = every line, NTSC = every other line
genlockhtoggle = !genlockhtoggle;
var ciahsyncs = !(bplcon0 & 2) || ((bplcon0 & 2) && SAEV_config.chipset.genlock && (!SAEV_config.chipset.ntsc || genlockhtoggle));
var ciavsyncs = !(bplcon0 & 2) || ((bplcon0 & 2) && SAEV_config.chipset.genlock && genlockvtoggle);
SAER.cia.hsync_post(ciahsyncs);
if (ciahsyncs) {
if (beamcon0 & (0x80 | 0x100)) {
if (hsstop < (maxhpos & ~1) && hsstrt < maxhpos)
SAER.cia.b_tod_handler(hsstop);
} else
SAER.cia.b_tod_handler(18);
}
if (SAEV_config.chipset.cia.tod != SAEC_Config_Chipset_CIA_TOD_VSync) {
/*#if 0
static uae_s32 oldtick;
uae_s32 tick = read_system_time (); // milliseconds
int ms = 1000 / (SAEV_config.chipset.cia.tod == SAEC_Config_Chipset_CIA_TOD_60Hz ? 60 : 50);
if (tick - oldtick > 2000 || tick - oldtick < -2000) {
oldtick = tick - ms;
}
if (tick - oldtick >= ms) {
CIA_vsync_posthandler(1);
oldtick += ms;
}
#else*/
//static int cia_hsync;
if (cia_hsync < maxhpos) {
SAER.cia.a_tod_inc(cia_hsync);
var newcount = (vblank_hz * (2 * maxvpos + (interlace_seen ? 1 : 0)) * (2 * maxhpos + (islinetoggle() ? 1 : 0))) / ((SAEV_config.chipset.cia.tod == SAEC_Config_Chipset_CIA_TOD_60Hz ? 60 : 50) * 4) >>> 0;
cia_hsync += newcount;
} else
cia_hsync -= maxhpos;
//#endif
} else if (SAEV_config.chipset.cia.tod == SAEC_Config_Chipset_CIA_TOD_VSync && ciavsyncs) {
// CIA-A TOD counter increases when vsync pulse ends
if (beamcon0 & (0x80 | 0x200)) {
if (vpos == vsstop && vsstrt <= maxvpos)
SAER.cia.a_tod_inc(lof_store ? hsstop : hsstop + hcenter);
} else {
if (vpos == (SAEV_config.chipset.ntsc ? VSYNC_ENDLINE_NTSC : VSYNC_ENDLINE_PAL)) {
SAER.cia.a_tod_inc(lof_store ? 132 : 18);
}
}
}
//inputdevice_hsync();
if (!nocustom()) {
if (!SAEV_config.chipset.blitter.cycle_exact && SAEV_Blitter_bltstate != SAEC_Blitter_bltstate_DONE && SAEF_Custom_dmaen(SAEC_Custom_DMAF_BPLEN) && diwstate == DIW_WAITING_STOP) {
SAER.blitter.blitter_slowdown(thisline_decision.plfleft, thisline_decision.plfright - (16 << fetchmode),
cycle_diagram_total_cycles[fetchmode][GET_RES_AGNUS(bplcon0)][GET_PLANES_LIMIT(bplcon0)],
cycle_diagram_free_cycles[fetchmode][GET_RES_AGNUS(bplcon0)][GET_PLANES_LIMIT(bplcon0)]);
}
}
if (onvsync) {
// vpos_count >= MAXVPOS just to not crash if VPOSW writes prevent vsync completely
if ((bplcon0 & 8) && !lightpen_triggered) {
vpos_lpen = vpos - 1;
hpos_lpen = maxhpos;
lightpen_triggered = 1;
}
vpos = 0;
vsync_handler_post();
vpos_count = 0;
}
// A1000 DIP Agnus (8361): vblank interrupt is triggered on line 1!
if (SAEV_config.chipset.agnusDIP) {
if (vpos == 1)
SAER.custom.send_interrupt(SAEC_Custom_INTF_VERTB, 1 * SAEC_Events_CYCLE_UNIT);
} else {
if (vpos == 0)
SAER.custom.send_interrupt(SAEC_Custom_INTF_VERTB, 1 * SAEC_Events_CYCLE_UNIT);
}
// lastline - 1?
if (vpos + 1 == maxvpos + lof_store || vpos + 1 == maxvpos + lof_store + 1)
lof_lastline = lof_store != 0;
//#ifdef CPUEMU_13
/*if (SAEV_config.chipset.blitter.cycle_exact) {
var hp = maxhpos - 1;
for (var i = 0; i < 4; i++) {
SAER.events.alloc_cycle(hp, i == 0 ? SAEC_Events_cycle_line_STROBE : SAEC_Events_cycle_line_REFRESH);
hp += 2;
if (hp >= maxhpos)
hp -= maxhpos;
}
}*/
//#endif
SAER.events.events_dmal_hsync();
/*#if 0
// AF testing stuff
static int cnt = 0;
cnt++;
if (cnt == 500) {
int port_insert_custom (int inputmap_port, int devicetype, DWORD flags, const TCHAR *custom);
//port_insert_custom (0, 2, 0, "Left=0xCB Right=0xCD Up=0xC8 Down=0xD0 Fire=0x39 Fire.autorepeat=0xD2");
port_insert_custom (1, 2, 0, "Left=0x1E Right=0x20 Up=0x11 Down=0x1F Fire=0x38");
} else if (0 && cnt == 1000) {
TCHAR out[256];
bool port_get_custom (int inputmap_port, TCHAR *out);
port_get_custom (0, out);
port_get_custom (1, out);
}
#endif*/
if (SAEV_config.cpu.speed < 0)
SAER.events.framewait2_maximum(is_last_line());
else {
if (vpos + 1 < maxvpos + lof_store && (vpos == (maxvpos_display * 1 / 3) >>> 0 || vpos == (maxvpos_display * 2 / 3) >>> 0))
SAER.events.framewait2_normal();
}
if (!nocustom()) {
var lineno = vpos;
if (lineno >= MAXVPOS)
lineno %= MAXVPOS;
nextline_how = nln_normal;
if (doflickerfix() && interlace_seen > 0) {
lineno *= 2;
} else if (!interlace_seen && doublescan <= 0 && SAEV_config.video.vresolution && SAEV_config.video.pscanlines > 1) {
lineno *= 2;
if (SAEV_Events_timeframes & 1) {
lineno++;
nextline_how = SAEV_config.video.pscanlines == 3 ? nln_lower_black_always : nln_lower_black;
} else {
nextline_how = SAEV_config.video.pscanlines == 3 ? nln_upper_black_always : nln_upper_black;
}
} else if ((doublescan <= 0 || interlace_seen > 0) && SAEV_config.video.vresolution && SAEV_config.video.iscanlines) {
lineno *= 2;
if (interlace_seen) {
if (!lof_current) {
lineno++;
nextline_how = SAEV_config.video.iscanlines == 2 ? nln_lower_black_always : nln_lower_black;
} else {
nextline_how = SAEV_config.video.iscanlines == 2 ? nln_upper_black_always : nln_upper_black;
}
} else {
nextline_how = SAEV_config.video.vresolution > SAEC_Config_Video_VResolution_NonDouble && SAEV_config.video.pscanlines == 1 ? nln_nblack : nln_doubled;
}
} else if (SAEV_config.video.vresolution && (doublescan <= 0 || interlace_seen > 0)) {
lineno *= 2;
if (interlace_seen) {
if (!lof_current) {
lineno++;
nextline_how = nln_lower;
} else {
nextline_how = nln_upper;
}
} else {
nextline_how = SAEV_config.video.vresolution > SAEC_Config_Video_VResolution_NonDouble && SAEV_config.video.pscanlines == 1 ? nln_nblack : nln_doubled;
}
}
prev_lineno = next_lineno;
next_lineno = lineno;
reset_decisions();
}
/* Default to no bitplane DMA overriding sprite DMA */
plfstrt_sprite = 0xff;
/* See if there"s a chance of a copper wait ending this line. */
SAER_Copper_cop_state.hpos = 0;
SAER.copper.compute_spcflag_copper(maxhpos);
//copper_check(2);
if (GET_PLANES (bplcon0) > 0 && SAEF_Custom_dmaen(SAEC_Custom_DMAF_BPLEN)) {
if (first_bplcon0 == 0)
first_bplcon0 = bplcon0;
if (vpos > last_planes_vpos)
last_planes_vpos = vpos;
if (vpos >= minfirstline && first_planes_vpos == 0) {
first_planes_vpos = vpos > minfirstline ? vpos - 1 : vpos;
} else if (vpos >= current_maxvpos() - 1) {
last_planes_vpos = current_maxvpos();
}
}
if (diw_change == 0) {
if (vpos >= first_planes_vpos && vpos <= last_planes_vpos) {
if (diwlastword > diwlastword_total) {
diwlastword_total = diwlastword;
if (diwlastword_total > coord_diw_to_window_x(hsyncstartpos * 2))
diwlastword_total = coord_diw_to_window_x(hsyncstartpos * 2);
}
if (diwfirstword < diwfirstword_total) {
diwfirstword_total = diwfirstword;
if (diwfirstword_total < coord_diw_to_window_x(hsyncendpos * 2))
diwfirstword_total = coord_diw_to_window_x(hsyncendpos * 2);
firstword_bplcon1 = bplcon1;
}
}
if (diwstate == DIW_WAITING_STOP) {
var f = 8 << fetchmode;
if (plfstrt + f < ddffirstword_total + f)
ddffirstword_total = plfstrt + f;
if (plfstop + 2 * f > ddflastword_total + 2 * f)
ddflastword_total = plfstop + 2 * f;
}
if ((plffirstline < plffirstline_total || (plffirstline_total == minfirstline && vpos > minfirstline)) && plffirstline < vpos >> 1) { //ORG / 2
firstword_bplcon1 = bplcon1;
if (plffirstline < minfirstline)
plffirstline_total = minfirstline;
else
plffirstline_total = plffirstline;
}
if (plflastline > plflastline_total && plflastline > plffirstline_total && plflastline > maxvpos >> 1) //ORG / 2
plflastline_total = plflastline;
}
if (diw_change > 0)
diw_change--;
/* fastest possible + last line and no vflip wait: render the frame as early as possible */
if (is_last_line() && isvsync_chipset() <= -2 && !vsync_rendered && SAEV_config.video.apmode[0].gfx_vflip == 0) {
var start = SAEF_now();
vsync_handle_redraw(lof_store, lof_changed, bplcon0, bplcon3);
vsync_rendered = true;
if (vblank_hz_state)
SAEV_Playfield_frame_rendered = SAER.video.render_screen(true);
SAEV_Events_frameskiptime += SAEF_now() - start;
}
//rtg_vsynccheck();
}
function is_custom_vsync() {
var vp = vpos + 1;
var vpc = vpos_count + 1;
/* Agnus vpos counter keeps counting until it wraps around if VPOSW writes put it past maxvpos */
if (vp >= maxvpos_total)
vp = 0;
if (vp == maxvpos + lof_store || vp == maxvpos + lof_store + 1 || vpc >= MAXVPOS) {
/* vpos_count >= MAXVPOS just to not crash if VPOSW writes prevent vsync completely */
return true;
}
return false;
}
this.hsync_handler = function() {
var vs = is_custom_vsync();
hsync_handler_pre(vs);
if (vs) {
vsync_handler_pre();
/* OWN ATT break the mainloop every vsync for a javascript-reflow */
SAEF_setSpcFlags(SAEC_spcflag_BRK);
}
hsync_handler_post(vs);
}
/*-----------------------------------------------------------------------*/
/* SECT diw */
function calcdiw() {
var hstrt = diwstrt & 0xFF;
var hstop = diwstop & 0xFF;
var vstrt = diwstrt >> 8;
var vstop = diwstop >> 8;
// vertical in ECS Agnus
if (diwhigh_written && (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_AGNUS)) {
vstrt |= (diwhigh & 7) << 8;
vstop |= ((diwhigh >> 8) & 7) << 8;
} else {
if ((vstop & 0x80) == 0)
vstop |= 0x100;
}
// horizontal in ECS Denise
if (diwhigh_written && (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_DENISE)) {
hstrt |= ((diwhigh >> 5) & 1) << 8;
hstop |= ((diwhigh >> 13) & 1) << 8;
} else {
hstop += 0x100;
}
diw_hstrt = hstrt;
diw_hstop = hstop;
diwfirstword = coord_diw_to_window_x(hstrt);
diwlastword = coord_diw_to_window_x(hstop);
if (diwfirstword >= diwlastword) {
diwfirstword = min_diwlastword;
diwlastword = max_diwlastword();
}
if (diwfirstword < min_diwlastword)
diwfirstword = min_diwlastword;
if (vstrt == vpos && vstop != vpos && diwstate == DIW_WAITING_START) {
// This may start BPL DMA immediately.
line_cyclebased = 2; //SET_LINE_CYCLEBASED();
bitplane_maybe_start_hpos = SAER.events.current_hpos();
}
plffirstline = vstrt;
plflastline = vstop;
plfstrt = ddfstrt - DDF_OFFSET;
plfstop = ddfstop - DDF_OFFSET;
diw_change = 2;
}
/* playfield code */
/*-----------------------------------------------------------------------*/
/*-----------------------------------------------------------------------*/
/*-----------------------------------------------------------------------*/
/* SECT playfield read reg */
/*this.DENISEID = function() {
if (SAEV_config.chipset.deniseRev >= 0)
return SAEV_config.chipset.deniseRev;
//#ifdef AGA
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA) {
if (SAEV_config.chipset.ide == SAEC_Config_Chipset_IDE_A4000)
return 0xFCF8;
return 0x00F8;
}
//#endif
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_DENISE)
return 0xFFFC;
if (SAEV_config.cpu.model == SAEC_Config_CPU_Model_68000 && SAEV_config.cpu.compatible)
return false;
return 0xFFFF;
}*/
this.DENISEID = function() {
if (SAEV_config.chipset.deniseRev >= 0)
return SAEV_config.chipset.deniseRev;
//#ifdef AGA
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA) {
if (SAEV_config.chipset.ide == SAEC_Config_Chipset_IDE_A4000)
return 0xFCF8;
return 0x00F8;
}
//#endif
return 0xFFFC;
}
function islightpentriggered() {
if (beamcon0 & 0x2000) //LPENDIS
return false;
return lightpen_triggered > 0;
}
function issyncstopped() {
return (bplcon0 & 2) != 0 && !SAEV_config.chipset.genlock;
}
function GETVPOS() {
return islightpentriggered() ? vpos_lpen : (issyncstopped() ? vpos_previous : vpos);
}
function GETHPOS() {
return islightpentriggered() ? hpos_lpen : (issyncstopped() ? hpos_previous : SAER.events.current_hpos());
}
// fake changing hpos when rom genlock test runs and genlock is connected
function hsyncdelay() {
if (!SAEV_config.chipset.genlock)
return false;
if (SAEV_config.cpu.speed >= 0)
return false;
if (bplcon0 == 0x102) //(0x0100 | 0x0002))
return true;
return false;
}
// DFF006 = 0.W must be valid result but better do this only in 68000 modes (whdload black screen!)
// HPOS is shifted by 3 cycles and VPOS increases when shifted HPOS==1
//#define CPU_ACCURATE (SAEV_config.cpu.model < SAEC_Config_CPU_Model_68020) //OPT inline, ok
//#define HPOS_OFFSET (CPU_ACCURATE ? HPOS_SHIFT : 0) //OPT inline, ok
//#define VPOS_INC_DELAY (HPOS_OFFSET ? 1 : 0) //OPT inline, ok
this.VPOSR = function() {
var csbit = 0;
var vp = GETVPOS();
var hp = GETHPOS();
var lof = lof_store;
if (vp + 1 == maxvpos + lof_store && (hp == maxhpos - 1 || hp == maxhpos - 2)) {
// lof toggles 2 cycles before maxhpos, so do fake toggle here.
//if ((bplcon0 & 4) && CPU_ACCURATE)
if ((bplcon0 & 4) && cpu_accurate)
lof = lof ? 0 : 1;
}
//if (hp + HPOS_OFFSET >= maxhpos + VPOS_INC_DELAY) { //ORG
if (hp + (cpu_accurate ? HPOS_SHIFT : 0) >= maxhpos + (cpu_accurate ? 1 : 0)) { //OWN opt inline
vp++;
if (vp >= maxvpos + lof_store)
vp = 0;
}
vp = (vp >> 8) & 7;
if (SAEV_config.chipset.agnusRev >= 0) {
csbit |= SAEV_config.chipset.agnusRev << 8;
} else {
//#ifdef AGA
csbit |= (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA) ? 0x2300 : 0;
//#endif
csbit |= (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_AGNUS) ? 0x2000 : 0;
/*#if 0 //apparently "8372 (Fat-hr) (agnushr),rev 5" does not exist
if (SAEV_config.memory.chipSize > 1024 * 1024 && (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_AGNUS))
csbit |= 0x2100;
#endif*/
if (SAEV_config.chipset.ntsc)
csbit |= 0x1000;
}
if (!(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_AGNUS))
vp &= 1;
vp |= (lof ? 0x8000 : 0) | csbit;
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_AGNUS)
vp |= lol ? 0x80 : 0;
hsyncdelay();
return vp;
}
this.VPOSW = function(v) {
var oldvpos = vpos;
if (lof_store != ((v & 0x8000) ? 1 : 0)) {
lof_store = (v & 0x8000) ? 1 : 0;
lof_changing = lof_store ? 1 : -1;
}
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_AGNUS) {
lol = (v & 0x0080) ? 1 : 0;
if (!islinetoggle())
lol = 0;
}
if (lof_changing)
return;
vpos &= 0x00ff;
v &= 7;
if (!(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_AGNUS))
v &= 1;
vpos |= v << 8;
if (vpos != oldvpos)
vposw_change++;
if (vpos < oldvpos)
vpos = oldvpos;
}
/*function vposback(oldvpos) {
if (SAER_Copper_cop_state.state == COP_wait && oldvpos == SAER_Copper_cop_state.vcmp) {
SAEV_Copper_enabled_thisline = 0;
SAEF_clrSpcFlags(SAEC_spcflag_COPPER);
}
}*/
this.VHPOSW = function(v) {
var oldvpos = vpos;
var changed = false;
/* This is not that easy, need to decouple denise and paula hpos counters
* from master counter.
* All this just to fix Upfront-CoolFridge Smooth Copper part..
*/
/*#if 0
if (oldhpos != newhpos) {
oldhpos = SAER.events.current_hpos();
int newhpos = v & 0xff;
if (newhpos >= maxhpos)
newhpos = maxhpos - 1;
hpos_offset = newhpos - oldhpos;
//SAER_Events_eventtab[SAEC_Events_EV_HSYNC].evtime = SAEV_Events_currcycle + HSYNCTIME() - (newhpos * SAEC_Events_CYCLE_UNIT);
SAER_Events_eventtab[SAEC_Events_EV_HSYNC].evtime = SAEV_Events_currcycle + (maxhpos * SAEC_Events_CYCLE_UNIT) - (newhpos * SAEC_Events_CYCLE_UNIT);
SAER_Events_eventtab[SAEC_Events_EV_HSYNC].oldcycles = SAEV_Events_currcycle - newhpos * SAEC_Events_CYCLE_UNIT;
SAER.events.schedule();
newhpos2 = SAER.events.current_hpos();
#ifdef CPUEMU_13
if (SAEV_config.chipset.blitter.cycle_exact) {
//memset(cycle_line + newhpos, 0, maxhpos - newhpos);
SAEF_memset(cycle_line,newhpos, 0, maxhpos - newhpos);
for (i = newhpos; i < maxhpos; i++) SAER_Events_cycle_line[i] = 0;
int hp = maxhpos - 1, i;
for (i = 0; i < 4; i++) {
SAER.events.alloc_cycle(hp, i == 0 ? SAEC_Events_cycle_line_STROBE : SAEC_Events_cycle_line_REFRESH);
hp += 2;
if (hp >= maxhpos)
hp -= maxhpos;
}
}
#endif
vposw_change++;
changed = true;
}
#endif*/
v >>= 8;
vpos &= 0xff00;
vpos |= v;
if (vpos != oldvpos && !changed)
vposw_change++;
if (vpos < oldvpos)
vpos = oldvpos;
else if (vpos < minfirstline && oldvpos < minfirstline)
vpos = oldvpos;
/*#if 0
if (vpos < oldvpos) vposback (oldvpos);
#endif*/
}
var vhposr_oldhp = 0; //u16
this.VHPOSR = function() {
//static uae_u16 vhposr_oldhp;
var vp = GETVPOS();
var hp = GETHPOS();
//hp += HPOS_OFFSET; //ORG
if (cpu_accurate) hp += HPOS_SHIFT; //OWN opt inline
if (hp >= maxhpos) {
hp -= maxhpos;
// vpos increases when hp==1, not when hp==0
//if (hp >= VPOS_INC_DELAY) { //ORG
if (hp >= (cpu_accurate ? 1 : 0)) { //OWN opt inline
vp++;
if (vp >= maxvpos + lof_store)
vp = 0;
}
}
//if (HPOS_OFFSET) { //ORG
if (cpu_accurate) { //OWN opt inline
hp += 1;
if (hp >= maxhpos)
hp -= maxhpos;
}
vp = (vp << 8) & 0xffff;
if (hsyncdelay()) {
// fake continuously changing hpos in fastest possible modes
hp = vhposr_oldhp % maxhpos;
vhposr_oldhp++;
if (vhposr_oldhp > 0xffff) vhposr_oldhp = 0; //OWN handle overflow
}
vp |= hp;
return vp;
}
this.REFPTR = function(v) {
/*ECS Agnus:
b15 8000: R 040
b14 4000: R 020
b13 2000: R 010
b12 1000: R 008
b11 0800: R 004
b10 0400: R 002
b09 0200: R 001
b08 0100: C 080
b07 0080: C 040
b06 0040: C 020
b05 0020: C 010
b04 0010: C 008
b03 0008: C 004
b02 0004: C 002 C 100
b01 0002: C 001 R 100
b00 0001: R 080 */
refptr = v;
refptr_val = (v & 0xfe00) | ((v & 0x01fe) >> 1);
if (v & 1) {
//refptr_val |= 0x80 << 9;
refptr_val = (refptr_val | 0x10000) >>> 0;
}
if (v & 2) {
//refptr_val |= 1;
//refptr_val |= 0x100 << 9;
refptr_val = (refptr_val | 0x20001) >>> 0;
}
if (v & 4) {
//refptr_val |= 2;
//refptr_val |= 0x100;
refptr_val = (refptr_val | 0x102) >>> 0;
}
}
/* playfield read reg */
/*-----------------------------------------------------------------------*/
/*-----------------------------------------------------------------------*/
/*-----------------------------------------------------------------------*/
/* SECT playfield reg */
this.BEAMCON0 = function(v) {
//if (!(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_AGNUS)) return;
if (v != new_beamcon0) {
new_beamcon0 = v;
if (v & ~0x20) {
SAEF_warn("playfield.BEAMCON0() write 0x%04x", v);
//dumpsync();
}
}
calcdiw();
}
function varsync() {
//if (!(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_AGNUS)) return;
/*#ifdef PICASSO96
if (SAEV_Playfield_picasso_on && p96refresh_active) {
vtotal = p96refresh_active;
return;
}
#endif*/
if (!(beamcon0 & 0x80))
return;
varsync_changed = true;
}
this.HTOTAL = function(v) { if (htotal != v) { htotal = v & (MAXHPOS_ROWS - 1); varsync(); }}
this.HSSTOP = function(v) { if (hsstop != v) { hsstop = v & (MAXHPOS_ROWS - 1); varsync(); }}
this.HBSTRT = function(v) { if (hbstrt != v) { hbstrt = v & (MAXHPOS_ROWS - 1); varsync(); }}
this.HBSTOP = function(v) { if (hbstop != v) { hbstop = v & (MAXHPOS_ROWS - 1); varsync(); }}
this.VTOTAL = function(v) { if (vtotal != v) { vtotal = v & (MAXVPOS_LINES_ECS - 1); varsync(); }}
this.VSSTOP = function(v) { if (vsstop != v) { vsstop = v & (MAXVPOS_LINES_ECS - 1); varsync(); }}
this.VBSTRT = function(v) { if (vbstrt < v || vbstrt > (v & (MAXVPOS_LINES_ECS - 1)) + 1) { vbstrt = v & (MAXVPOS_LINES_ECS - 1); varsync(); }}
this.VBSTOP = function(v) { if (vbstop < v || vbstop > (v & (MAXVPOS_LINES_ECS - 1)) + 1) { vbstop = v & (MAXVPOS_LINES_ECS - 1); varsync(); }}
this.HSSTRT = function(v) { if (hsstrt != v) { hsstrt = v & (MAXHPOS_ROWS - 1); varsync(); }}
this.VSSTRT = function(v) { if (vsstrt != v) { vsstrt = v & (MAXVPOS_LINES_ECS - 1); varsync(); }}
this.HCENTER = function(v) { if (hcenter != v) { hcenter = v & (MAXHPOS_ROWS - 1); varsync(); }}
/*#ifdef PICASSO96
function set_picasso_hack_rate(hz) { //global
if (!SAEV_Playfield_picasso_on)
return;
vpos_count = 0;
p96refresh_active = (maxvpos_stored * vblank_hz_stored / hz) >>> 0;
if (SAEV_config.chipset.cia.tod == SAEC_Config_Chipset_CIA_TOD_VSync)
SAEV_config.chipset.cia.tod = SAEV_config.chipset.ntsc ? SAEC_Config_Chipset_CIA_TOD_60Hz : SAEC_Config_Chipset_CIA_TOD_50Hz;
if (p96refresh_active > 0) {
new_beamcon0 |= 0x80;
}
}
#endif*/
//"Dangerous" blitter D-channel: Writing to memory which is also currently read by bitplane DMA
this.dcheck_is_blit_dangerous = function() {
SAER.blitter.check_is_blit_dangerous(bplpt, bplcon0_planes, 50 << bplcon0_res);
}
this.BPLxPTH = function(hpos, v, num) {
this.decide_line(hpos);
this.decide_fetch_safe(hpos);
if (SAEV_Copper_access && this.is_bitplane_dma(hpos + 1) == num + 1) {
/*#if 0
if (this.is_bitplane_dma(hpos + 2)) {
dbplpth[num] = (v << 16) & 0xffff0000;
dbplpth_on[num] = hpos;
dbplpth_on2++;
}
#endif*/
line_cyclebased = 2; //SET_LINE_CYCLEBASED();
return;
}
bplpt[num] = ((bplpt[num] & 0x0000ffff) | (v << 16)) >>> 0;
bplptx[num] = ((bplptx[num] & 0x0000ffff) | (v << 16)) >>> 0;
this.dcheck_is_blit_dangerous();
}
this.BPLxPTL = function(hpos, v, num) {
this.decide_line(hpos);
this.decide_fetch_safe(hpos);
/*#if 0
reset_dbplh (hpos, num);
#endif*/
/* chipset feature:
* BPLxPTL write and next cycle doing DMA fetch using same pointer register ->
* next DMA cycle uses old value.
* (Multiscroll / Cult)
*
* If following cycle is not BPL DMA: written value is lost
*
* last fetch block does not have this side-effect, probably due to modulo adds.
* Also it seems only plane 0 fetches have this feature (because of above reason!)
* (MoreNewStuffy / PlasmaForce)
*/
/* only detect copper accesses to prevent too fast CPU mode glitches */
if (SAEV_Copper_access && this.is_bitplane_dma(hpos + 1) == num + 1) {
/*#if 0
if (num == 0 && plf_state >= plf_passed_stop) {
// modulo adds use old value! Argh! (This is wrong and disabled)
dbplptl[num] = v & 0x0000fffe;
dbplptl_on[num] = -1;
dbplptl_on2++;
} else if (this.is_bitplane_dma(hpos + 2)) {
dbplptl[num] = v & 0x0000fffe;
dbplptl_on[num] = hpos;
dbplptl_on2++;
}
#endif*/
line_cyclebased = 2; //SET_LINE_CYCLEBASED();
return;
}
bplpt[num] = ((bplpt[num] & 0xffff0000) | (v & 0x0000fffe)) >>> 0;
bplptx[num] = ((bplptx[num] & 0xffff0000) | (v & 0x0000fffe)) >>> 0;
this.dcheck_is_blit_dangerous();
}
function BPLCON0_Denise(hpos, v, immediate) {
if (!(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_DENISE))
v &= ~0x00F1;
else if (!(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA))
v &= ~0x00B0;
v &= ~(0x0200 | 0x0100 | 0x0080 | 0x0020);
/*#if SPRBORDER
v |= 1;
#endif*/
if (bplcon0d == v && !immediate)
return;
bplcon0dd = -1;
// fake unused 0x0080 bit as an EHB bit (see below)
if (isehb(bplcon0d, bplcon2))
v |= 0x80;
if (immediate)
record_register_change(hpos, 0x100, v);
else
record_register_change(hpos, 0x100, (bplcon0d & ~(0x800 | 0x400 | 0x80)) | (v & (0x0800 | 0x400 | 0x80 | 0x01)));
bplcon0d = v & ~0x80;
//#ifdef ECS_DENISE
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_DENISE) {
decide_sprites(hpos);
sprres = expand_sprres(v, bplcon3);
}
//#endif
if (thisline_decision.plfleft < 0)
update_denise(hpos);
else
update_denise_shifter_planes(hpos);
}
this.BPLCON0 = function(hpos, v) {
if (!(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_DENISE))
v &= ~0x00F1;
else if (!(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA))
v &= ~0x00B0;
v &= ~0x0080;
/*#if SPRBORDER
v |= 1;
#endif*/
if (bplcon0 == v)
return;
line_cyclebased = 2; //SET_LINE_CYCLEBASED();
decide_diw(hpos);
this.decide_line(hpos);
this.decide_fetch_safe(hpos);
if (!issyncstopped()) {
vpos_previous = vpos;
hpos_previous = hpos;
}
if (bplcon0 & 4)
bplcon0_interlace_seen = true;
bplcon0 = v;
bpldmainitdelay(hpos);
if (thisline_decision.plfleft < 0)
BPLCON0_Denise(hpos, v, true);
}
this.BPLCON1 = function(hpos, v) {
if (!(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA))
v &= 0xff;
if (bplcon1 == v)
return;
line_cyclebased = 2; //SET_LINE_CYCLEBASED();
this.decide_line(hpos);
this.decide_fetch_safe(hpos);
bplcon1_written = true;
bplcon1 = v;
hack_shres_delay(hpos);
}
this.BPLCON2 = function(hpos, v) {
if (!(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA))
v &= 0x7f;
if ((bplcon2 & 0x3fff) == (v & 0x3fff))
return;
this.decide_line(hpos);
bplcon2 = v;
record_register_change(hpos, 0x104, bplcon2);
}
//#ifdef ECS_DENISE
this.BPLCON3 = function(hpos, v) {
//if (!(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_DENISE)) return;
if (!(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA)) {
v &= 0x003f;
v |= 0x0c00;
}
/*#if SPRBORDER
v |= 2;
#endif*/
if (bplcon3 == v)
return;
this.decide_line(hpos);
decide_sprites(hpos);
bplcon3 = v;
sprres = expand_sprres(bplcon0, bplcon3);
record_register_change(hpos, 0x106, v);
}
//#endif
//#ifdef AGA
this.BPLCON4 = function(hpos, v) {
//if (!(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA)) return;
if (bplcon4 == v)
return;
this.decide_line(hpos);
bplcon4 = v;
record_register_change(hpos, 0x10c, v);
}
//#endif
function castWord(v) { //OWN ATT
return (v & 0x8000) ? (v - 0x10000) : v;
}
this.BPL1MOD = function(hpos, v) {
v &= ~1;
if (bpl1mod != castWord(v)) {
this.decide_line(hpos);
this.decide_fetch_safe(hpos);
}
// write to BPLxMOD one cycle before
// BPL fetch that also adds modulo:
// Old BPLxMOD value is added.
if (this.is_bitplane_dma(hpos + 1) & 1) {
dbpl1mod = castWord(v);
dbpl1mod_on = hpos + 1;
} else {
bpl1mod = castWord(v);
dbpl1mod_on = 0;
}
}
this.BPL2MOD = function(hpos, v) {
v &= ~1;
if (bpl2mod != castWord(v)) {
this.decide_line(hpos);
this.decide_fetch_safe(hpos);
}
if (this.is_bitplane_dma(hpos + 1) & 2) {
dbpl2mod = castWord(v);
dbpl2mod_on = hpos + 1;
} else {
bpl2mod = castWord(v);
dbpl2mod_on = 0;
}
}
//Needed in special OCS/ECS "7-plane" mode, also handles CPU generated bitplane data
this.BPLxDAT = function(hpos, num, v) {
// only BPL1DAT access can do anything visible
if (num == 0 && hpos >= 8) {
this.decide_line(hpos);
this.decide_fetch_safe(hpos);
}
flush_display(fetchmode);
fetched[num] = v;
//fetched_aga[num] = v;
fetched_aga_hi[num] = 0;
fetched_aga_lo[num] = v;
if (num == 0 && hpos >= 8) {
bpl1dat_written = true;
bpl1dat_written_at_least_once = true;
if (thisline_decision.plfleft < 0)
reset_bpl_vars();
beginning_of_plane_block(hpos, fetchmode);
}
}
this.DIWSTRT = function(hpos, v) {
if (diwstrt == v && !diwhigh_written)
return;
decide_diw(hpos);
this.decide_line(hpos);
diwhigh_written = 0;
diwstrt = v;
calcdiw();
}
this.DIWSTOP = function(hpos, v) {
if (diwstop == v && !diwhigh_written)
return;
decide_diw(hpos);
this.decide_line(hpos);
diwhigh_written = 0;
diwstop = v;
calcdiw();
}
this.DIWHIGH = function(hpos, v) {
//if (!(SAEV_config.chipset.mask & (SAEC_Config_Chipset_Mask_ECS_DENISE | SAEC_Config_Chipset_Mask_ECS_AGNUS))) return;
if (!(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA))
v &= ~(0x0008 | 0x0010 | 0x1000 | 0x0800);
v &= ~(0x8000 | 0x4000 | 0x0080 | 0x0040);
if (diwhigh_written && diwhigh == v)
return;
this.decide_line(hpos);
diwhigh_written = 1;
diwhigh = v;
calcdiw();
}
this.DDFSTRT = function(hpos, v) {
v &= 0xfe;
if (!(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_AGNUS))
v &= 0xfc;
this.decide_line(hpos);
line_cyclebased = 2; //SET_LINE_CYCLEBASED();
// Move state back to passed_enable if this DDFSTRT write was done exactly when
// it would match and start bitplane DMA.
if (hpos == ddfstrt - DDF_OFFSET && plf_state == plf_passed_start && plf_start_hpos == hpos + DDF_OFFSET) {
plf_state = plf_passed_enable;
plf_start_hpos = maxhpos;
}
ddfstrt = v;
calcdiw();
if (fetch_state != fetch_not_started)
estimate_last_fetch_cycle(hpos);
if (ddfstop > 0xD4 && (ddfstrt & 4) == 4) {
//static int last_warned; last_warned = (last_warned + 1) & 4095; if (last_warned == 0)
SAEF_warn("playfield.DDFSTRT() very strange DDF values (%x %x)", ddfstrt, ddfstop);
}
}
this.DDFSTOP = function(hpos, v) {
v &= 0xfe;
if (!(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_AGNUS))
v &= 0xfc;
this.decide_line(hpos);
this.decide_fetch_safe(hpos);
line_cyclebased = 2; //SET_LINE_CYCLEBASED();
// DDFSTOP write when old DDFSTOP value match: old value matches normally.
// Works differently than DDFSTRT which is interesting.
if (hpos == v - DDF_OFFSET) {
if (plf_state == plf_passed_stop && plf_end_hpos == hpos + DDF_OFFSET) {
plf_state = plf_active;
plf_end_hpos = 256 + DDF_OFFSET;
// don't let one_fetch_cycle_0() to do this again
ddfstop_written_hpos = hpos;
}
} else if (hpos == ddfstop - DDF_OFFSET) {
// if old ddfstop would have matched, emulate it here
if (plf_state == plf_active) {
plf_state = plf_passed_stop;
plf_end_hpos = hpos + DDF_OFFSET;
}
}
ddfstop = v;
calcdiw();
if (fetch_state != fetch_not_started)
estimate_last_fetch_cycle(hpos);
if (ddfstop > 0xD4 && (ddfstrt & 4) == 4) {
//static int last_warned; last_warned = (last_warned + 1) & 4095; if (last_warned == 0)
SAEF_warn("playfield.DDFSTOP() very strange DDF values (%x %x)", ddfstrt, ddfstop);
}
}
this.FMODE = function(hpos, v) {
/*if (!(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA)) {
//if (currprefs.monitoremu) specialmonitor_store_fmode(vpos, hpos, v);
v = 0;
}*/
v &= 0xC00F;
if (fmode == v)
return;
line_cyclebased = 2; //SET_LINE_CYCLEBASED();
fmode_saved = v;
set_chipset_mode();
bpldmainitdelay(hpos);
}
this.FNULL = function(v) {}
/* playfield reg */
/*-----------------------------------------------------------------------*/
/*-----------------------------------------------------------------------*/
/*-----------------------------------------------------------------------*/
/* SECT sprite reg */
function spr_arm(num, state) {
switch (state) {
case 0:
nr_armed -= spr[num].armed;
spr[num].armed = 0;
break;
default:
nr_armed += 1 - spr[num].armed;
spr[num].armed = 1;
}
}
function sprstartstop(s) {
if (vpos < sprite_vblank_endline || cant_this_last_line() || s.ignoreverticaluntilnextline)
return;
if (vpos == s.vstart)
s.dmastate = 1;
if (vpos == s.vstop)
s.dmastate = 0;
}
function SPRxCTLPOS(num) {
var sprxp;
var s = spr[num];
sprstartstop(s);
sprxp = (sprpos[num] & 0xFF) * 2 + (sprctl[num] & 1);
sprxp <<= sprite_buffer_res;
//#ifdef AGA
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA) {
sprxp |= ((sprctl[num] >> 3) & 3) >> (RES_MAX - sprite_buffer_res);
s.dblscan = sprpos[num] & 0x80;
}
//#endif
//#ifdef ECS_DENISE
else if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_DENISE) {
sprxp |= ((sprctl[num] >> 3) & 2) >> (RES_MAX - sprite_buffer_res);
}
//#endif
s.xpos = sprxp;
s.vstart = sprpos[num] >> 8;
s.vstart |= (sprctl[num] & 0x04) ? 0x0100 : 0;
s.vstop = sprctl[num] >> 8;
s.vstop |= (sprctl[num] & 0x02) ? 0x100 : 0;
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_AGNUS) {
s.vstart |= (sprctl[num] & 0x40) ? 0x0200 : 0;
s.vstop |= (sprctl[num] & 0x20) ? 0x0200 : 0;
}
sprstartstop(s);
}
function SPRxCTL_1(v, num, hpos) {
if (hpos >= maxhpos - 2 && sprctl[num] != v && vpos < maxvpos - 1) {
var s = spr[num];
vpos++;
sprstartstop(s);
vpos--;
s.ignoreverticaluntilnextline = true;
sprite_ignoreverticaluntilnextline = true;
}
sprctl[num] = v;
spr_arm(num, 0);
SPRxCTLPOS(num);
}
function SPRxPOS_1(v, num, hpos) {
if (hpos >= maxhpos - 2 && sprpos[num] != v && vpos < maxvpos - 1) {
var s = spr[num];
vpos++;
sprstartstop(s);
vpos--;
s.ignoreverticaluntilnextline = true;
sprite_ignoreverticaluntilnextline = true;
}
sprpos[num] = v;
SPRxCTLPOS(num);
}
function SPRxDATA_1(v, num, hpos) {
sprdata[num][0] = v;
//#ifdef AGA
sprdata[num][1] = v;
sprdata[num][2] = v;
sprdata[num][3] = v;
//#endif
spr_arm(num, 1);
}
function SPRxDATB_1(v, num, hpos) {
sprdatb[num][0] = v;
//#ifdef AGA
sprdatb[num][1] = v;
sprdatb[num][2] = v;
sprdatb[num][3] = v;
//#endif
}
/*
SPRxDATA and SPRxDATB is moved to shift register when SPRxPOS matches.
When copper writes to SPRxDATx exactly when SPRxPOS matches:
- If sprite low x bit (SPRCTL bit 0) is not set, shift register copy
is done first (previously loaded SPRxDATx value is shown) and then
new SPRxDATx gets stored for future use.
- If sprite low x bit is set, new SPRxDATx is stored, then SPRxPOS
matches and value written to SPRxDATx is visible.
- Writing to SPRxPOS when SPRxPOS matches: shift register
copy is always done first, then new SPRxPOS value is stored
for future use. (SPRxCTL not tested)
*/
this.SPRxDATA = function(hpos, v, num) {
decide_sprites(hpos, true);
SPRxDATA_1(v, num, hpos);
}
this.SPRxDATB = function(hpos, v, num) {
decide_sprites(hpos, true);
SPRxDATB_1(v, num, hpos);
}
this.SPRxCTL = function(hpos, v, num) {
decide_sprites(hpos);
SPRxCTL_1(v, num, hpos);
}
this.SPRxPOS = function(hpos, v, num) {
var s = spr[num];
var oldvpos;
decide_sprites(hpos);
oldvpos = s.vstart;
SPRxPOS_1(v, num, hpos);
// Superfrog flashing intro bees fix.
// if SPRxPOS is written one cycle before sprite"s first DMA slot and sprite"s vstart matches after
// SPRxPOS write, current line"s DMA slot"s stay idle. DMA decision seems to be done 4 cycles earlier.
if (hpos >= SPR0_HPOS + num * 4 - 4 && hpos <= SPR0_HPOS + num * 4 - 1 && oldvpos != vpos) {
s.ptxvpos2 = vpos;
s.ptxhpos2 = hpos + 4;
}
}
this.SPRxPTH = function(hpos, v, num) {
decide_sprites(hpos);
if (hpos - 1 != spr[num].ptxhpos) {
//spr[num].pt &= 0xffff;
//spr[num].pt |= (uae_u32)v << 16;
spr[num].pt = ((v << 16) | (spr[num].pt & 0xffff)) >>> 0;
}
}
this.SPRxPTL = function(hpos, v, num) {
decide_sprites(hpos);
if (hpos - 1 != spr[num].ptxhpos) {
//spr[num].pt &= ~0xffff;
//spr[num].pt |= v & ~1;
spr[num].pt = ((spr[num].pt & 0xffff0000) | (v & 0xfffe)) >>> 0;
}
}
this.CLXCON = function(v) {
clxcon = v;
clxcon_bpl_enable = (v >> 6) & 63;
clxcon_bpl_match = v & 63;
}
this.CLXCON2 = function(v) {
//if (!(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA)) return;
clxcon2 = v;
clxcon_bpl_enable |= v & (0x40 | 0x80);
clxcon_bpl_match |= (v & (0x01 | 0x02)) << 6;
clxcon_bpl_match &= 0xffffffff; //OWN
}
this.CLXDAT = function() {
var v = clxdat | 0x8000;
clxdat = 0;
return v;
}
/* sprite reg */
/*-----------------------------------------------------------------------*/
/*-----------------------------------------------------------------------*/
/*-----------------------------------------------------------------------*/
/* SECT color reg */
//#ifdef AGA
/*function dump_aga_custom() {
var c1, c2, c3, c4;
var rgb1, rgb2, rgb3, rgb4;
for (c1 = 0; c1 < 64; c1++) {
c2 = c1 + 64;
c3 = c2 + 64;
c4 = c3 + 64;
rgb1 = current_colors.color_regs_aga[c1];
rgb2 = current_colors.color_regs_aga[c2];
rgb3 = current_colors.color_regs_aga[c3];
rgb4 = current_colors.color_regs_aga[c4];
SAEF_log("playfield.dump_aga_custom() %3d %08X %3d %08X %3d %08X %3d %08X", c1, rgb1, c2, rgb2, c3, rgb3, c4, rgb4);
}
}*/
this.COLOR_READ = function(num) {
if (!(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA) || !(bplcon2 & 0x0100)) return 0xffff;
var colreg = ((bplcon3 >> 13) & 7) * 32 + num;
var cr = (current_colors.color_regs_aga[colreg] >> 16) & 0xFF;
var cg = (current_colors.color_regs_aga[colreg] >> 8) & 0xFF;
var cb = current_colors.color_regs_aga[colreg] & 0xFF;
var cval;
if (bplcon3 & 0x200) {
cval = ((cr & 15) << 8) | ((cg & 15) << 4) | ((cb & 15) << 0);
} else {
cval = ((cr >> 4) << 8) | ((cg >> 4) << 4) | ((cb >> 4) << 0);
if (color_regs_genlock[num])
cval |= 0x8000;
}
return cval;
}
//#endif
function checkautoscalecol0() {
if (!SAEV_Copper_access)
return;
if (vpos < 20)
return;
if (isbrdblank(-1, bplcon0, bplcon3))
return;
// autoscale if copper changes COLOR00 on top or bottom of screen
if (vpos >= minfirstline) {
var vpos2 = autoscale_bordercolors ? minfirstline : vpos;
if (first_planes_vpos == 0)
first_planes_vpos = vpos2 - 2;
if (plffirstline_total == current_maxvpos())
plffirstline_total = vpos2 - 2;
if (vpos2 > last_planes_vpos || vpos2 > plflastline_total)
plflastline_total = last_planes_vpos = vpos2 + 3;
autoscale_bordercolors = 0;
} else
autoscale_bordercolors++;
}
this.COLOR_WRITE = function(hpos, v, num) {
var colzero = false;
//#ifdef AGA
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA) {
/* writing is disabled when RDRAM=1 */
if (bplcon2 & 0x0100)
return;
var colreg = ((bplcon3 >> 13) & 7) * 32 + num;
var r = (v & 0xF00) >> 8;
var g = (v & 0xF0) >> 4;
var b = (v & 0xF) >> 0;
var cr = (current_colors.color_regs_aga[colreg] >> 16) & 0xFF;
var cg = (current_colors.color_regs_aga[colreg] >> 8) & 0xFF;
var cb = current_colors.color_regs_aga[colreg] & 0xFF;
if (bplcon3 & 0x200) {
cr &= 0xF0; cr |= r;
cg &= 0xF0; cg |= g;
cb &= 0xF0; cb |= b;
} else {
cr = r + (r << 4);
cg = g + (g << 4);
cb = b + (b << 4);
color_regs_genlock[colreg] = v >> 15;
}
var cval = ((cr << 16) | (cg << 8) | cb | (color_regs_genlock[colreg] ? 0x80000000 : 0)) >>> 0;
if (cval && colreg == 0)
colzero = true;
if (cval == current_colors.color_regs_aga[colreg])
return;
if (colreg == 0)
checkautoscalecol0();
/* Call this with the old table still intact. */
record_color_change(hpos, colreg, cval);
remembered_color_entry = -1;
current_colors.color_regs_aga[colreg] = cval;
current_colors.acolors[colreg] = getxcolor(cval);
} else {
//#endif
v &= 0x8fff;
if (!(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_DENISE))
v &= 0xfff;
color_regs_genlock[num] = v >> 15;
if (num && v == 0)
colzero = true;
if (current_colors.color_regs_ecs[num] == v)
return;
if (num == 0)
checkautoscalecol0();
/* Call this with the old table still intact. */
record_color_change(hpos, num, v);
remembered_color_entry = -1;
current_colors.color_regs_ecs[num] = v;
current_colors.acolors[num] = getxcolor(v);
//#ifdef AGA
}
//#endif
}
/* color reg */
/*-----------------------------------------------------------------------*/
/*-----------------------------------------------------------------------*/
/*-----------------------------------------------------------------------*/
/* SECT sprite do */
function cursorsprite() {
if (!SAEF_Custom_dmaen(SAEC_Custom_DMAF_SPREN) || first_planes_vpos == 0)
return;
sprite_0 = spr[0].pt;
sprite_0_height = spr[0].vstop - spr[0].vstart;
sprite_0_colors[0] = 0;
sprite_0_doubled = 0;
if (sprres == 0)
sprite_0_doubled = 1;
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA) {
var sbasecol = ((bplcon4 >> 4) & 15) << 4;
sprite_0_colors[1] = current_colors.color_regs_aga[sbasecol + 1];
sprite_0_colors[2] = current_colors.color_regs_aga[sbasecol + 2];
sprite_0_colors[3] = current_colors.color_regs_aga[sbasecol + 3];
} else {
sprite_0_colors[1] = xcolors[current_colors.color_regs_ecs[17]];
sprite_0_colors[2] = xcolors[current_colors.color_regs_ecs[18]];
sprite_0_colors[3] = xcolors[current_colors.color_regs_ecs[19]];
}
sprite_0_width = sprite_width;
/* OWN
if (currprefs.input_tablet && currprefs.input_magic_mouse) {
if (currprefs.input_magic_mouse_cursor == MAGICMOUSE_HOST_ONLY && mousehack_alive ())
magic_sprite_mask &= ~1;
else
magic_sprite_mask |= 1;
}*/
}
function sprite_fetch(s, dma, hpos, cycle, mode) {
var data = SAEV_Custom_last_value & 0xffff;
if (dma) {
//if (cycle && cpu_cycle_exact) s.ptxhpos = hpos;
data = SAEV_Custom_last_value = SAER_Memory_chipGet16_indirect(s.pt);
//SAER.events.alloc_cycle(hpos, SAEC_Events_cycle_line_SPRITE);
}
s.pt += 2;
return data;
}
function sprite_fetch2(s, hpos, cycle, mode) {
var data = SAER_Memory_chipGet16_indirect(s.pt);
s.pt += 2;
return data;
}
function do_sprites_1(num, cycle, hpos) {
var s = spr[num];
var dma, posctl = 0;
var data;
// fetch both sprite pairs even if DMA was switched off between sprites
var isdma = SAEF_Custom_dmaen(SAEC_Custom_DMAF_SPREN) || ((num & 1) && spr[num & ~1].dmacycle);
if (cant_this_last_line())
return;
/*#if 0 //see SPRxCTRL below
if (isdma && vpos == sprite_vblank_endline)
spr_arm (num, 0);
#endif*/
//#ifdef AGA
if (isdma && s.dblscan && (fmode & 0x8000) && (vpos & 1) != (s.vstart & 1) && s.dmastate) {
spr_arm(num, 1);
return;
}
//#endif
if (vpos == s.vstart) {
s.dmastate = 1;
if (s.ptxvpos2 == vpos && hpos < s.ptxhpos2)
return;
if (num == 0 && cycle == 0)
cursorsprite();
}
if (vpos == s.vstop || vpos == sprite_vblank_endline) {
s.dmastate = 0;
}
if (!isdma)
return;
dma = hpos < plfstrt_sprite || diwstate != DIW_WAITING_STOP;
if (vpos == s.vstop || vpos == sprite_vblank_endline) {
s.dmastate = 0;
posctl = 1;
if (dma) {
data = sprite_fetch(s, dma, hpos, cycle, 0);
switch (sprite_width) {
case 64:
sprite_fetch2(s, hpos, cycle, 0);
sprite_fetch2(s, hpos, cycle, 0);
case 32:
sprite_fetch2(s, hpos, cycle, 0);
break;
}
if (cycle == 0) {
SPRxPOS_1(data, num, hpos);
s.dmacycle = 1;
} else {
// This is needed to disarm previous field"s sprite.
// It can be seen on OCS Agnus + ECS Denise combination where
// this cycle is disabled due to weird DDFTSTR=$18 copper list
// which causes corrupted sprite to "wrap around" the display.
SPRxCTL_1(data, num, hpos);
s.dmastate = 0;
sprstartstop(s);
}
}
if (vpos == sprite_vblank_endline) {
// s.vstart == sprite_vblank_endline won"t enable the sprite.
s.dmastate = 0;
}
}
if (s.dmastate && !posctl && dma) {
var data = sprite_fetch(s, dma, hpos, cycle, 1);
if (cycle == 0) {
SPRxDATA_1(data, num, hpos);
s.dmacycle = 1;
} else {
SPRxDATB_1(data, num, hpos);
spr_arm(num, 1);
}
//#ifdef AGA
switch (sprite_width) {
case 64: {
var data32 = sprite_fetch2(s, hpos, cycle, 1);
var data641 = sprite_fetch2(s, hpos, cycle, 1);
var data642 = sprite_fetch2(s, hpos, cycle, 1);
if (dma) {
if (cycle == 0) {
sprdata[num][3] = data642;
sprdata[num][2] = data641;
sprdata[num][1] = data32;
} else {
sprdatb[num][3] = data642;
sprdatb[num][2] = data641;
sprdatb[num][1] = data32;
}
}
break;
}
case 32: {
var data32 = sprite_fetch2(s, hpos, cycle, 1);
if (dma) {
if (cycle == 0)
sprdata[num][1] = data32;
else
sprdatb[num][1] = data32;
}
break;
}
}
//#endif
}
}
function do_sprites(hpos) {
if (vpos < sprite_vblank_endline)
return;
if (doflickerfix() && interlace_seen && (next_lineno & 1))
return;
var maxspr = hpos;
var minspr = last_sprite_hpos + 1;
if (minspr >= maxspr || last_sprite_hpos == hpos)
return;
if (maxspr >= SPR0_HPOS + MAX_SPRITES * 4)
maxspr = SPR0_HPOS + MAX_SPRITES * 4 - 1;
if (minspr < SPR0_HPOS)
minspr = SPR0_HPOS;
if (minspr == maxspr)
return;
for (var i = minspr; i <= maxspr; i++) {
var cycle = -1;
var num = (i - SPR0_HPOS) >> 2; //ORG / 4
switch ((i - SPR0_HPOS) & 3) {
case 0:
cycle = 0;
spr[num].dmacycle = 0;
break;
case 2:
cycle = 1;
break;
}
if (cycle >= 0) {
spr[num].ptxhpos = MAXHPOS;
do_sprites_1(num, cycle, i);
}
}
last_sprite_hpos = hpos;
}
function setup_sprites() { //ORG gen_custom_tables()
var i;
if (sprtaba !== null)
return;
sprtaba = new Uint32Array(256);
sprtabb = new Uint32Array(256);
sprite_ab_merge = new Uint32Array(256);
for (i = 0; i < 256; i++) {
sprtaba[i] = ((((i >> 7) & 1) << 0)
| (((i >> 6) & 1) << 2)
| (((i >> 5) & 1) << 4)
| (((i >> 4) & 1) << 6)
| (((i >> 3) & 1) << 8)
| (((i >> 2) & 1) << 10)
| (((i >> 1) & 1) << 12)
| (((i >> 0) & 1) << 14));
sprtabb[i] = sprtaba[i] * 2;
sprite_ab_merge[i] = (((i & 15) ? 1 : 0) | ((i & 240) ? 2 : 0));
}
sprclx = new Uint32Array(16);
clxmask = new Uint32Array(16);
for (i = 0; i < 16; i++) {
clxmask[i] = (((i & 1) ? 0xF : 0x3)
| ((i & 2) ? 0xF0 : 0x30)
| ((i & 4) ? 0xF00 : 0x300)
| ((i & 8) ? 0xF000 : 0x3000));
sprclx[i] = (((i & 0x3) == 0x3 ? 1 : 0)
| ((i & 0x5) == 0x5 ? 2 : 0)
| ((i & 0x9) == 0x9 ? 4 : 0)
| ((i & 0x6) == 0x6 ? 8 : 0)
| ((i & 0xA) == 0xA ? 16 : 0)
| ((i & 0xC) == 0xC ? 32 : 0)) << 9;
}
}
function reset_sprites() { //ORG init_sprites()
//memset(sprpos, 0, sizeof sprpos);
//memset(sprctl, 0, sizeof sprctl);
SAEF_memset(sprpos,0, 0, MAX_SPRITES);
SAEF_memset(sprctl,0, 0, MAX_SPRITES);
}
/* sprite do */
/*-----------------------------------------------------------------------*/
/*-----------------------------------------------------------------------*/
/*-----------------------------------------------------------------------*/
/* SECT setup/reset */
/* mousehack is now in "filesys boot rom" */
function mousehack_helper_old(ctx) { //struct TrapContext *
//SAEF_log("playfield.mousehack_helper_old()");
return 0;
}
var timehack_alive = 0;
function timehack_helper(ctx) { //struct TrapContext *
//SAEF_log("playfield.timehack_helper()");
//#ifdef HAVE_GETTIMEOFDAY
if (SAER_CPU_regs.d[0] == 0)
return timehack_alive;
timehack_alive = 10;
var tv = {};
SAEF_gettimeofday(tv, null);
SAER_Memory_put32(SAER_CPU_regs.a[0], tv.tv_sec - (((365 * 8 + 2) * 24) * 60 * 60));
SAER_Memory_put32(SAER_CPU_regs.a[0] + 4, tv.tv_usec); //ATT +4, 32bit overflow
return 0;
/*#else
return 2;
#endif*/
}
this.setup = function() { //custom_init()
//#ifdef AUTOCONFIG
if (SAEV_AutoConf_boot_rom_type) {
var pos = SAER.autoconf.here();
SAER.autoconf.org(SAEV_AutoConf_base + 0xFF70);
SAER.autoconf.calltrap(SAER.autoconf.define_trap(mousehack_helper_old, 0, "mousehack_helper_old"));
SAER.autoconf.dw(SAEC_AutoConf_RTS);
SAER.autoconf.org(SAEV_AutoConf_base + 0xFFA0);
SAER.autoconf.calltrap(SAER.autoconf.define_trap(timehack_helper, 0, "timehack_helper"));
SAER.autoconf.dw(SAEC_AutoConf_RTS);
SAER.autoconf.org(pos);
}
//#endif
setup_sprites();
//build_blitfilltable(); //OWN in blitter.js
drawing_init();
create_cycle_diagram_table();
notice_new_xcolors();
return SAEE_None;
}
function reset_all_systems(hardreset) {
SAER.events.reset();
/*#ifdef PICASSO96
picasso_reset();
#endif*/
//#ifdef FILESYS
//SAER.filesys.prepare_reset(); //OWN empty
SAER.filesys.reset();
//#endif
//init_shm();
SAER.memory.reset(hardreset);
//#ifdef FILESYS
//SAER.filesys.start_threads(); //OWN empty
//SAER.hardfile.reset(); //OWN empty
//#endif
/*#ifdef PARALLEL_PORT
initparallel();
#endif
native2amiga_reset();
dongle_reset();
sampler_init();
*/
SAER.serial.reset(); //OWN
}
this.custom_reset = function(hardreset, keyboardreset) {
var i;
//target_reset();
reset_all_systems(hardreset);
SAER.memory.map_dump();
lightpen_active = -1;
lightpen_triggered = 0;
lightpen_cx = lightpen_cy = -1;
nr_armed = 0;
{
//extra_cycle = 0; //OWN in events.js
SAEV_Events_hsync_counter = 0;
SAEV_Events_vsync_counter = 0;
//SAEV_config.chipset.mask = changed_prefs.chipset_mask;
update_mirrors();
SAER.blitter.reset(); //blitter_reset();
if (hardreset) {
if (!aga_mode) {
var c = (((SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_DENISE) && !(SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA)) || SAEV_config.chipset.deniseNoEHB) ? 0xfff : 0x000;
for (i = 0; i < 32; i++) {
current_colors.color_regs_ecs[i] = c;
current_colors.acolors[i] = getxcolor(c);
}
//#ifdef AGA
} else {
var c = 0;
for (i = 0; i < 256; i++) {
current_colors.color_regs_aga[i] = c;
current_colors.acolors[i] = getxcolor(c);
}
//#endif
}
}
clxdat = 0;
/* Clear the armed flags of all sprites. */
for (i = 0; i < spr.length; i++) spr[i].clr(); //memset(spr, 0, sizeof spr);
SAER.custom.reset();
/*{
SAEV_Custom_dmacon = 0;
intreq_internal = 0;
SAEV_Custom_intena = intena_internal = 0;
}*/
SAER.copper.clr_copcon(); //copcon = 0;
SAER.disk.DSKLEN(0, 0);
bplcon0 = 0;
bplcon4 = 0x0011; /* Get AGA chipset into ECS compatibility mode */
bplcon3 = 0x0C00;
diwhigh = 0;
diwhigh_written = 0;
hdiwstate = DIW_WAITING_START; // this does not reset at vblank
refptr = 0xffff;
this.FMODE(0, 0);
this.CLXCON(0);
this.CLXCON2(0);
setup_fmodes(0);
sprite_width = GET_SPRITEWIDTH(fmode);
beamcon0 = new_beamcon0 = SAEV_config.chipset.ntsc ? 0x00 : 0x20;
SAEV_Blitter_bltstate = SAEC_Blitter_bltstate_DONE;
SAEV_Blitter_interrupt = true;
lof_store = lof_current = 0;
lof_lace = false;
reset_sprites();
}
SAER.devices.reset(hardreset);
//specialmonitor_reset();
SAEF_clrSpcFlags(~(SAEC_spcflag_BRK | SAEC_spcflag_MODE_CHANGE));
vpos = 0;
vpos_count = vpos_count_diff = 0;
SAER.input.reset(); //inputdevice_reset();
timehack_alive = 0;
curr_sprite_entries = 0;
prev_sprite_entries = 0;
sprite_entries[0][0].first_pixel = 0;
sprite_entries[1][0].first_pixel = MAX_SPR_PIXELS;
sprite_entries[0][1].first_pixel = 0;
sprite_entries[1][1].first_pixel = MAX_SPR_PIXELS;
//memset(spixels, 0, 2 * MAX_SPR_PIXELS * sizeof *spixels);
//memset(&spixstate, 0, sizeof spixstate);
SAEF_memset(spixels,0, 0, 2 * MAX_SPR_PIXELS);
SAEF_memset(spixstate.bytes,0, 0, 2 * MAX_SPR_PIXELS);
toscr_delay_sh[0] = 0;
toscr_delay_sh[1] = 0;
SAER_Copper_cop_state.state = 0; //COP_stop;
SAER_Copper_cop_state.movedelay = 0;
SAER_Copper_cop_state.strobe = 0;
SAER_Copper_cop_state.ignore_next = false;
diwstate = DIW_WAITING_START;
SAER.events.clr_dmal(); //dmal = 0;
init_hz_normal();
vpos_lpen = -1;
lof_changing = 0;
lof_togglecnt_nlace = lof_togglecnt_lace = 0;
//nlace_cnt = NLACE_CNT_NEEDED; //ORG
SAER.audio.reset();
//must be called after audio_reset
SAEV_Custom_adkcon = 0;
//serial_uartbreak(0);
SAER.audio.update_adkmasks();
init_hardware_frame();
drawing_init();
reset_decisions();
SAEV_Events_bogusframe = 1;
sprres = expand_sprres(bplcon0, bplcon3);
sprite_width = GET_SPRITEWIDTH(fmode);
setup_fmodes(0);
/*#ifdef ACTION_REPLAY
// Doing this here ensures we can use the "reset" command from within AR
action_replay_reset (hardreset, keyboardreset);
#endif*/
if (hardreset)
SAER.rtc.hardreset(); //rtc_hardreset();
/*#ifdef PICASSO96
picasso_reset();
#endif*/
hpos_is_zero_bplcon1_hack = -1; //OWN
cia_hsync = 0; //OWN
vhposr_oldhp = 0; //OWN
cpu_accurate = SAEV_config.cpu.model < SAEC_Config_CPU_Model_68020; //CPU_ACCURATE(); //OWN
warned_maybe_finish_last_fetch = 20; //OWN
}
this.custom_prepare = function() {
set_hpos();
//hsync_handler_post(true); //OWN framerate error
}
/* setup/reset */
/*-----------------------------------------------------------------------*/
/*-----------------------------------------------------------------------*/
/*-----------------------------------------------------------------------*/
/* SECT linedraw functions */
/* ECS SuperHires special cases */
function shsprite(dpix, spix_val, v, spr) {
if (!spr)
return v;
var sprcol = render_sprites(dpix, 0, spix_val, 0);
if (!sprcol)
return v;
// good enough for now..
var scol = colors_for_drawing.color_regs_ecs[sprcol] & 0xccc;
scol |= scol >> 2;
return xcolors[scol];
}
function linetoscr_16_sh_func(spix, dpix, stoppos, spr) {
var buf = xlinebuffer;
while (dpix < stoppos) {
var spix_val1, spix_val2;
var v;
var off;
spix_val1 = pixdata.apixels[spix++];
spix_val2 = pixdata.apixels[spix++];
off = ((spix_val2 & 3) * 4) + (spix_val1 & 3) + ((spix_val1 | spix_val2) & 16);
v = (colors_for_drawing.color_regs_ecs[off] & 0xccc) << 0;
v |= v >> 2;
buf[dpix + xlinebuffer_pos] = shsprite(dpix, spix_val1, xcolors[v], spr);
dpix++;
v = (colors_for_drawing.color_regs_ecs[off] & 0x333) << 2;
v |= v >> 2;
buf[dpix + xlinebuffer_pos] = shsprite(dpix, spix_val2, xcolors[v], spr);
dpix++;
}
return spix;
}
function linetoscr_16_sh_spr(spix, dpix, stoppos) {
return linetoscr_16_sh_func(spix, dpix, stoppos, true);
}
function linetoscr_16_sh(spix, dpix, stoppos) {
return linetoscr_16_sh_func(spix, dpix, stoppos, false);
}
function linetoscr_32_sh_func(spix, dpix, stoppos, spr) {
var buf = xlinebuffer;
while (dpix < stoppos) {
var spix_val1, spix_val2;
var v;
var off;
spix_val1 = pixdata.apixels[spix++];
spix_val2 = pixdata.apixels[spix++];
off = ((spix_val2 & 3) * 4) + (spix_val1 & 3) + ((spix_val1 | spix_val2) & 16);
v = (colors_for_drawing.color_regs_ecs[off] & 0xccc) << 0;
v |= v >> 2;
buf[dpix + xlinebuffer_pos] = shsprite(dpix, spix_val1, xcolors[v], spr);
dpix++;
v = (colors_for_drawing.color_regs_ecs[off] & 0x333) << 2;
v |= v >> 2;
buf[dpix + xlinebuffer_pos] = shsprite(dpix, spix_val2, xcolors[v], spr);
dpix++;
}
return spix;
}
function linetoscr_32_sh_spr(spix, dpix, stoppos) {
return linetoscr_32_sh_func(spix, dpix, stoppos, true);
}
function linetoscr_32_sh(spix, dpix, stoppos) {
return linetoscr_32_sh_func(spix, dpix, stoppos, false);
}
function linetoscr_32_shrink1_sh_func(spix, dpix, stoppos, spr) {
var buf = xlinebuffer;
while (dpix < stoppos) {
var spix_val1, spix_val2;
var v;
var off;
spix_val1 = pixdata.apixels[spix++];
spix_val2 = pixdata.apixels[spix++];
off = ((spix_val2 & 3) * 4) + (spix_val1 & 3) + ((spix_val1 | spix_val2) & 16);
v = (colors_for_drawing.color_regs_ecs[off] & 0xccc) << 0;
v |= v >> 2;
buf[dpix + xlinebuffer_pos] = shsprite(dpix, spix_val1, xcolors[v], spr);
dpix++;
}
return spix;
}
function linetoscr_32_shrink1_sh_spr(spix, dpix, stoppos) {
return linetoscr_32_shrink1_sh_func(spix, dpix, stoppos, true);
}
function linetoscr_32_shrink1_sh(spix, dpix, stoppos) {
return linetoscr_32_shrink1_sh_func(spix, dpix, stoppos, false);
}
function linetoscr_32_shrink1f_sh_func(spix, dpix, stoppos, spr) {
var buf = xlinebuffer;
while (dpix < stoppos) {
var spix_val1, spix_val2, dpix_val1, dpix_val2;
var v;
var off;
spix_val1 = pixdata.apixels[spix++];
spix_val2 = pixdata.apixels[spix++];
off = ((spix_val2 & 3) * 4) + (spix_val1 & 3) + ((spix_val1 | spix_val2) & 16);
v = (colors_for_drawing.color_regs_ecs[off] & 0xccc) << 0;
v |= v >> 2;
dpix_val1 = xcolors[v];
v = (colors_for_drawing.color_regs_ecs[off] & 0x333) << 2;
v |= v >> 2;
dpix_val2 = xcolors[v];
buf[dpix + xlinebuffer_pos] = shsprite(dpix, spix_val1, merge_2pixel32 (dpix_val1, dpix_val2), spr);
dpix++;
}
return spix;
}
function linetoscr_32_shrink1f_sh_spr(spix, dpix, stoppos) {
return linetoscr_32_shrink1f_sh_func(spix, dpix, stoppos, true);
}
function linetoscr_32_shrink1f_sh(spix, dpix, stoppos) {
return linetoscr_32_shrink1f_sh_func(spix, dpix, stoppos, false);
}
function linetoscr_16_shrink1_sh_func(spix, dpix, stoppos, spr) {
var buf = xlinebuffer;
while (dpix < stoppos) {
var spix_val1, spix_val2;
var v;
var off;
spix_val1 = pixdata.apixels[spix++];
spix_val2 = pixdata.apixels[spix++];
off = ((spix_val2 & 3) * 4) + (spix_val1 & 3) + ((spix_val1 | spix_val2) & 16);
v = (colors_for_drawing.color_regs_ecs[off] & 0xccc) << 0;
v |= v >> 2;
buf[dpix + xlinebuffer_pos] = shsprite(dpix, spix_val1, xcolors[v], spr);
dpix++;
}
return spix;
}
function linetoscr_16_shrink1_sh_spr(spix, dpix, stoppos) {
return linetoscr_16_shrink1_sh_func(spix, dpix, stoppos, true);
}
function linetoscr_16_shrink1_sh(spix, dpix, stoppos) {
return linetoscr_16_shrink1_sh_func(spix, dpix, stoppos, false);
}
function linetoscr_16_shrink1f_sh_func(spix, dpix, stoppos, spr) {
var buf = xlinebuffer;
while (dpix < stoppos) {
var spix_val1, spix_val2, dpix_val1, dpix_val2;
var v;
var off;
spix_val1 = pixdata.apixels[spix++];
spix_val2 = pixdata.apixels[spix++];
off = ((spix_val2 & 3) * 4) + (spix_val1 & 3) + ((spix_val1 | spix_val2) & 16);
v = (colors_for_drawing.color_regs_ecs[off] & 0xccc) << 0;
v |= v >> 2;
dpix_val1 = xcolors[v];
v = (colors_for_drawing.color_regs_ecs[off] & 0x333) << 2;
v |= v >> 2;
dpix_val2 = xcolors[v];
buf[dpix + xlinebuffer_pos] = shsprite(dpix, spix_val1, merge_2pixel16(dpix_val1, dpix_val2), spr);
dpix++;
}
return spix;
}
function linetoscr_16_shrink1f_sh_spr(spix, dpix, stoppos) {
return linetoscr_16_shrink1f_sh_func(spix, dpix, stoppos, true);
}
function linetoscr_16_shrink1f_sh(spix, dpix, stoppos) {
return linetoscr_16_shrink1f_sh_func(spix, dpix, stoppos, false);
}
function linetoscr_32_shrink2_sh_func(spix, dpix, stoppos, spr) {
var buf = xlinebuffer;
while (dpix < stoppos) {
var spix_val1, spix_val2;
var v;
var off;
spix_val1 = pixdata.apixels[spix++];
spix_val2 = pixdata.apixels[spix++];
off = ((spix_val2 & 3) * 4) + (spix_val1 & 3) + ((spix_val1 | spix_val2) & 16);
v = (colors_for_drawing.color_regs_ecs[off] & 0xccc) << 0;
v |= v >> 2;
buf[dpix + xlinebuffer_pos] = shsprite(dpix, spix_val1, xcolors[v], spr);
spix+=2;
dpix++;
}
return spix;
}
function linetoscr_32_shrink2_sh_spr(spix, dpix, stoppos) {
return linetoscr_32_shrink2_sh_func(spix, dpix, stoppos, true);
}
function linetoscr_32_shrink2_sh(spix, dpix, stoppos) {
return linetoscr_32_shrink2_sh_func(spix, dpix, stoppos, false);
}
function linetoscr_32_shrink2f_sh_func(spix, dpix, stoppos, spr) {
var buf = xlinebuffer;
while (dpix < stoppos) {
var spix_val1, spix_val2, dpix_val1, dpix_val2, dpix_val3, dpix_val4;
var v;
var off;
spix_val1 = pixdata.apixels[spix++];
spix_val2 = pixdata.apixels[spix++];
off = ((spix_val2 & 3) * 4) + (spix_val1 & 3) + ((spix_val1 | spix_val2) & 16);
v = (colors_for_drawing.color_regs_ecs[off] & 0xccc) << 0;
v |= v >> 2;
dpix_val1 = xcolors[v];
v = (colors_for_drawing.color_regs_ecs[off] & 0x333) << 2;
v |= v >> 2;
dpix_val2 = xcolors[v];
dpix_val3 = merge_2pixel32 (dpix_val1, dpix_val2);
spix_val1 = pixdata.apixels[spix++];
spix_val2 = pixdata.apixels[spix++];
off = ((spix_val2 & 3) * 4) + (spix_val1 & 3) + ((spix_val1 | spix_val2) & 16);
v = (colors_for_drawing.color_regs_ecs[off] & 0xccc) << 0;
v |= v >> 2;
dpix_val1 = xcolors[v];
v = (colors_for_drawing.color_regs_ecs[off] & 0x333) << 2;
v |= v >> 2;
dpix_val2 = xcolors[v];
dpix_val4 = merge_2pixel32 (dpix_val1, dpix_val2);
buf[dpix + xlinebuffer_pos] = shsprite(dpix, spix_val1, merge_2pixel32(dpix_val3, dpix_val4), spr);
dpix++;
}
return spix;
}
function linetoscr_32_shrink2f_sh_spr(spix, dpix, stoppos) {
return linetoscr_32_shrink2f_sh_func(spix, dpix, stoppos, true);
}
function linetoscr_32_shrink2f_sh(spix, dpix, stoppos) {
return linetoscr_32_shrink2f_sh_func(spix, dpix, stoppos, false);
}
function linetoscr_16_shrink2_sh_func(spix, dpix, stoppos, spr) {
var buf = xlinebuffer;
while (dpix < stoppos) {
var spix_val1, spix_val2;
var v;
var off;
spix_val1 = pixdata.apixels[spix++];
spix_val2 = pixdata.apixels[spix++];
off = ((spix_val2 & 3) * 4) + (spix_val1 & 3) + ((spix_val1 | spix_val2) & 16);
v = (colors_for_drawing.color_regs_ecs[off] & 0xccc) << 0;
v |= v >> 2;
buf[dpix + xlinebuffer_pos] = shsprite(dpix, spix_val1, xcolors[v], spr);
spix += 2;
dpix++;
}
return spix;
}
function linetoscr_16_shrink2_sh_spr(spix, dpix, stoppos) {
return linetoscr_16_shrink2_sh_func(spix, dpix, stoppos, true);
}
function linetoscr_16_shrink2_sh(spix, dpix, stoppos) {
return linetoscr_16_shrink2_sh_func(spix, dpix, stoppos, false);
}
function linetoscr_16_shrink2f_sh_func (spix, dpix, stoppos, spr) {
var buf = xlinebuffer;
while (dpix < stoppos) {
var spix_val1, spix_val2, dpix_val1, dpix_val2, dpix_val3, dpix_val4;
var v;
var off;
spix_val1 = pixdata.apixels[spix++];
spix_val2 = pixdata.apixels[spix++];
off = ((spix_val2 & 3) * 4) + (spix_val1 & 3) + ((spix_val1 | spix_val2) & 16);
v = (colors_for_drawing.color_regs_ecs[off] & 0xccc) << 0;
v |= v >> 2;
dpix_val1 = xcolors[v];
v = (colors_for_drawing.color_regs_ecs[off] & 0x333) << 2;
v |= v >> 2;
dpix_val2 = xcolors[v];
dpix_val3 = merge_2pixel32 (dpix_val1, dpix_val2);
spix_val1 = pixdata.apixels[spix++];
spix_val2 = pixdata.apixels[spix++];
off = ((spix_val2 & 3) * 4) + (spix_val1 & 3) + ((spix_val1 | spix_val2) & 16);
v = (colors_for_drawing.color_regs_ecs[off] & 0xccc) << 0;
v |= v >> 2;
dpix_val1 = xcolors[v];
v = (colors_for_drawing.color_regs_ecs[off] & 0x333) << 2;
v |= v >> 2;
dpix_val2 = xcolors[v];
dpix_val4 = merge_2pixel32 (dpix_val1, dpix_val2);
buf[dpix + xlinebuffer_pos] = shsprite(dpix, spix_val1, merge_2pixel16 (dpix_val3, dpix_val4), spr);
dpix++;
}
return spix;
}
function linetoscr_16_shrink2f_sh_spr(spix, dpix, stoppos) {
return linetoscr_16_shrink2f_sh_func(spix, dpix, stoppos, true);
}
function linetoscr_16_shrink2f_sh(spix, dpix, stoppos) {
return linetoscr_16_shrink2f_sh_func(spix, dpix, stoppos, false);
}
/*-----------------------------------------------------------------------*/
/* auto-generated functions */
function linetoscr_16(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
if (bplham) {
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
spix++;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
spix++;
out_val = dpix_val;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
spix++;
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
spix++;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1;
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
spix++;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
spix++;
out_val = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
spix++;
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
spix++;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
} else if (bplehb) {
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix++;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix++;
out_val = dpix_val;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix++;
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix++;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
} else {
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
spix++;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
spix++;
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
spix++;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
}
return spix;
}
function linetoscr_16_stretch1(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
if (bplham) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
} else {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
}
return spix;
}
function linetoscr_16_stretch2(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
if (bplham) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
} else {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
}
return spix;
}
function linetoscr_16_shrink1(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
if (bplham) {
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
spix += 2;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
spix += 2;
out_val = dpix_val;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
spix += 2;
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
spix += 2;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1;
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
spix += 2;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
spix += 2;
out_val = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
spix += 2;
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
spix += 2;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
} else if (bplehb) {
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix += 2;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix += 2;
out_val = dpix_val;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix += 2;
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix += 2;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
} else {
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
spix += 2;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
spix += 2;
out_val = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
spix += 2;
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
spix += 2;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
}
return spix;
}
function linetoscr_16_shrink1f(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
if (bplham) {
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
out_val = dpix_val;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1;
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
out_val = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
} else if (bplehb) {
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
out_val = dpix_val;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
} else {
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
out_val = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
}
return spix;
}
function linetoscr_16_shrink2(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
if (bplham) {
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
spix += 4;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
spix += 4;
out_val = dpix_val;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
spix += 4;
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
spix += 4;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1;
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
spix += 4;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
spix += 4;
out_val = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
spix += 4;
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
spix += 4;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
} else if (bplehb) {
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix += 4;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix += 4;
out_val = dpix_val;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix += 4;
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix += 4;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
} else {
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
spix += 4;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
spix += 4;
out_val = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
spix += 4;
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
spix += 4;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
}
return spix;
}
function linetoscr_16_shrink2f(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
if (bplham) {
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
spix++;
tmp_val2 = dpix_val;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
spix++;
tmp_val3 = dpix_val;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
spix++;
tmp_val2 = dpix_val;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
spix++;
tmp_val3 = dpix_val;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
out_val = dpix_val;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
spix++;
tmp_val2 = dpix_val;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
spix++;
tmp_val3 = dpix_val;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
spix++;
tmp_val2 = dpix_val;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
spix++;
tmp_val3 = dpix_val;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1;
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
spix++;
tmp_val2 = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
spix++;
tmp_val3 = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
spix++;
tmp_val2 = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
spix++;
tmp_val3 = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
out_val = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
spix++;
tmp_val2 = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
spix++;
tmp_val3 = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
spix++;
tmp_val2 = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
spix++;
tmp_val3 = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
} else if (bplehb) {
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix++;
tmp_val2 = dpix_val;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix++;
tmp_val3 = dpix_val;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix++;
tmp_val2 = dpix_val;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix++;
tmp_val3 = dpix_val;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
out_val = dpix_val;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix++;
tmp_val2 = dpix_val;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix++;
tmp_val3 = dpix_val;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix++;
tmp_val2 = dpix_val;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix++;
tmp_val3 = dpix_val;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
} else {
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
spix++;
tmp_val2 = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
spix++;
tmp_val3 = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
spix++;
tmp_val2 = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
spix++;
tmp_val3 = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
out_val = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
spix++;
tmp_val2 = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
spix++;
tmp_val3 = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
spix++;
tmp_val2 = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
spix++;
tmp_val3 = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
}
return spix;
}
function linetoscr_16_spr(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
if (bplham) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
sprpix_val = pixdata.apixels[spix];
spix++;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1;
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[lookup[spix_val]];
spix++;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 1, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix++;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_16_stretch1_spr(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
if (bplham) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
sprpix_val = pixdata.apixels[spix];
spix++;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1;
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[lookup[spix_val]];
spix++;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 1, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix++;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_16_stretch2_spr(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
if (bplham) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
sprpix_val = pixdata.apixels[spix];
spix++;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1;
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[lookup[spix_val]];
spix++;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 1, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix++;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_16_shrink1_spr(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
if (bplham) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
sprpix_val = pixdata.apixels[spix];
spix += 2;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1;
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[lookup[spix_val]];
spix += 2;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 1, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix += 2;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[spix_val];
spix += 2;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_16_shrink1f_spr(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
if (bplham) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
sprpix_val = pixdata.apixels[spix];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
sprpix_val = pixdata.apixels[spix];
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1;
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[lookup[spix_val]];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[lookup[spix_val]];
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 1, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[spix_val];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[spix_val];
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_16_shrink2_spr(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
if (bplham) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
sprpix_val = pixdata.apixels[spix];
spix += 4;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1;
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[lookup[spix_val]];
spix += 4;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 1, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix += 4;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[spix_val];
spix += 4;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_16_shrink2f_spr(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
if (bplham) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
sprpix_val = pixdata.apixels[spix];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
sprpix_val = pixdata.apixels[spix];
spix++;
tmp_val2 = dpix_val;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
sprpix_val = pixdata.apixels[spix];
spix++;
tmp_val3 = dpix_val;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
sprpix_val = pixdata.apixels[spix];
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1;
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[lookup[spix_val]];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[lookup[spix_val]];
spix++;
tmp_val2 = dpix_val;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[lookup[spix_val]];
spix++;
tmp_val3 = dpix_val;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[lookup[spix_val]];
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 1, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix++;
tmp_val2 = dpix_val;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix++;
tmp_val3 = dpix_val;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[spix_val];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[spix_val];
spix++;
tmp_val2 = dpix_val;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[spix_val];
spix++;
tmp_val3 = dpix_val;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[spix_val];
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_16_aga_spronly(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
if (1) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var out_val = 0;
spix++;
out_val = p_acolors[0];
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_16_stretch1_aga_spronly(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
if (1) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var out_val = 0;
spix++;
out_val = p_acolors[0];
{
var out_val1 = out_val;
var out_val2 = out_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 1);
if (sprcol) {
out_val1 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 1].data) {
sprcol = render_sprites(dpix + 1, 0, sprpix_val, 1);
if (sprcol) {
out_val2 = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val1; dpix++;
buf[dpix + xlinebuffer_pos] = out_val2; dpix++;
}
}
}
return spix;
}
function linetoscr_16_stretch2_aga_spronly(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
if (1) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var out_val = 0;
spix++;
out_val = p_acolors[0];
{
var out_val1 = out_val;
var out_val2 = out_val;
var out_val3 = out_val;
var out_val4 = out_val;
if (spritepixels[dpix + spritepixels_pos].data) {
var sprcol = render_sprites(dpix, 0, sprpix_val, 1);
if (sprcol) {
out_val1 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 1].data) {
sprcol = render_sprites(dpix + 1, 0, sprpix_val, 1);
if (sprcol) {
out_val2 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 2].data) {
sprcol = render_sprites(dpix + 2, 0, sprpix_val, 1);
if (sprcol) {
out_val3 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 3].data) {
sprcol = render_sprites(dpix + 3, 0, sprpix_val, 1);
if (sprcol) {
out_val4 = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val1; dpix++;
buf[dpix + xlinebuffer_pos] = out_val2; dpix++;
buf[dpix + xlinebuffer_pos] = out_val3; dpix++;
buf[dpix + xlinebuffer_pos] = out_val4; dpix++;
}
}
}
return spix;
}
function linetoscr_16_shrink1_aga_spronly(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
if (1) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var out_val = 0;
spix++;
out_val = p_acolors[0];
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_16_shrink1f_aga_spronly(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
if (1) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var out_val = 0;
spix++;
out_val = p_acolors[0];
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_16_shrink2_aga_spronly(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
if (1) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var out_val = 0;
spix++;
out_val = p_acolors[0];
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_16_shrink2f_aga_spronly(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
if (1) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var out_val = 0;
spix++;
out_val = p_acolors[0];
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_16_aga(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var xor_val = bplxor;
var and_val = bpland;
if (bplham) {
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix++;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix++;
out_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix++;
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix++;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga;
var lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1;
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix++;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix++;
out_val = dpix_val;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix++;
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix++;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
} else if (bplehb) {
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix++;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix++;
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix++;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
} else {
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix++;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix++;
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix++;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
}
return spix;
}
function linetoscr_16_stretch1_aga(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var xor_val = bplxor;
var and_val = bpland;
if (bplham) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga;
var lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
} else {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
}
return spix;
}
function linetoscr_16_stretch2_aga(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var xor_val = bplxor;
var and_val = bpland;
if (bplham) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga;
var lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
} else {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
}
return spix;
}
function linetoscr_16_shrink1_aga(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var xor_val = bplxor;
var and_val = bpland;
if (bplham) {
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix += 2;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix += 2;
out_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix += 2;
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix += 2;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga;
var lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1;
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix += 2;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix += 2;
out_val = dpix_val;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix += 2;
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix += 2;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
} else if (bplehb) {
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix += 2;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix += 2;
out_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix += 2;
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix += 2;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
} else {
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix += 2;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix += 2;
out_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix += 2;
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix += 2;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
}
return spix;
}
function linetoscr_16_shrink1f_aga(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var xor_val = bplxor;
var and_val = bpland;
if (bplham) {
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
out_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga;
var lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1;
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
out_val = dpix_val;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
} else if (bplehb) {
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
out_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
} else {
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
out_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
}
return spix;
}
function linetoscr_16_shrink2_aga(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var xor_val = bplxor;
var and_val = bpland;
if (bplham) {
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix += 4;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix += 4;
out_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix += 4;
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix += 4;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga;
var lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1;
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix += 4;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix += 4;
out_val = dpix_val;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix += 4;
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix += 4;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
} else if (bplehb) {
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix += 4;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix += 4;
out_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix += 4;
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix += 4;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
} else {
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix += 4;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix += 4;
out_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix += 4;
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix += 4;
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
}
return spix;
}
function linetoscr_16_shrink2f_aga(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var xor_val = bplxor;
var and_val = bpland;
if (bplham) {
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix++;
tmp_val2 = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix++;
tmp_val3 = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix++;
tmp_val2 = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix++;
tmp_val3 = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
out_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix++;
tmp_val2 = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix++;
tmp_val3 = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix++;
tmp_val2 = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix++;
tmp_val3 = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga;
var lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1;
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix++;
tmp_val2 = dpix_val;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix++;
tmp_val3 = dpix_val;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix++;
tmp_val2 = dpix_val;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix++;
tmp_val3 = dpix_val;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
out_val = dpix_val;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix++;
tmp_val2 = dpix_val;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix++;
tmp_val3 = dpix_val;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix++;
tmp_val2 = dpix_val;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix++;
tmp_val3 = dpix_val;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
} else if (bplehb) {
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix++;
tmp_val2 = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix++;
tmp_val3 = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix++;
tmp_val2 = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix++;
tmp_val3 = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
out_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix++;
tmp_val2 = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix++;
tmp_val3 = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix++;
tmp_val2 = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix++;
tmp_val3 = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
} else {
if ((dpix + xlinebuffer_pos) & 2) {
var spix_val = 0;
var dpix_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix++;
tmp_val2 = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix++;
tmp_val3 = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
if (dpix >= dpix_end)
return spix;
var rem = (dpix_end + xlinebuffer_pos) & 2;
if (rem)
dpix_end--;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix++;
tmp_val2 = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix++;
tmp_val3 = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
out_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix++;
tmp_val2 = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix++;
tmp_val3 = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
out_val = ((out_val << 16) | (dpix_val & 0xFFFF)) >>> 0;
buf[dpix + xlinebuffer_pos] = out_val >>> 16;
buf[dpix + xlinebuffer_pos + 1] = out_val & 0xffff;
dpix += 2;
}
if (rem) {
var spix_val = 0;
var dpix_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix++;
tmp_val2 = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix++;
tmp_val3 = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
buf[dpix + xlinebuffer_pos] = dpix_val; dpix++;
}
}
return spix;
}
function linetoscr_16_aga_spr(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
var xor_val = bplxor;
var and_val = bpland;
if (bplham) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix++;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga;
var lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1;
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix++;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 1, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_16_stretch1_aga_spr(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
var xor_val = bplxor;
var and_val = bpland;
if (bplham) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix++;
out_val = dpix_val;
{
var out_val1 = out_val;
var out_val2 = out_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 1);
if (sprcol) {
out_val1 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 1].data) {
sprcol = render_sprites(dpix + 1, 0, sprpix_val, 1);
if (sprcol) {
out_val2 = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val1; dpix++;
buf[dpix + xlinebuffer_pos] = out_val2; dpix++;
}
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga;
var lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1;
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix++;
out_val = dpix_val;
{
var out_val1 = out_val;
var out_val2 = out_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 1, sprpix_val, 1);
if (sprcol) {
out_val1 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 1].data) {
sprcol = render_sprites(dpix + 1, 1, sprpix_val, 1);
if (sprcol) {
out_val2 = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val1; dpix++;
buf[dpix + xlinebuffer_pos] = out_val2; dpix++;
}
}
} else if (bplehb) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
{
var out_val1 = out_val;
var out_val2 = out_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 1);
if (sprcol) {
out_val1 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 1].data) {
sprcol = render_sprites(dpix + 1, 0, sprpix_val, 1);
if (sprcol) {
out_val2 = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val1; dpix++;
buf[dpix + xlinebuffer_pos] = out_val2; dpix++;
}
}
} else {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
{
var out_val1 = out_val;
var out_val2 = out_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 1);
if (sprcol) {
out_val1 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 1].data) {
sprcol = render_sprites(dpix + 1, 0, sprpix_val, 1);
if (sprcol) {
out_val2 = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val1; dpix++;
buf[dpix + xlinebuffer_pos] = out_val2; dpix++;
}
}
}
return spix;
}
function linetoscr_16_stretch2_aga_spr(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
var xor_val = bplxor;
var and_val = bpland;
if (bplham) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix++;
out_val = dpix_val;
{
var out_val1 = out_val;
var out_val2 = out_val;
var out_val3 = out_val;
var out_val4 = out_val;
if (spritepixels[dpix + spritepixels_pos].data) {
var sprcol = render_sprites(dpix, 0, sprpix_val, 1);
if (sprcol) {
out_val1 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 1].data) {
sprcol = render_sprites(dpix + 1, 0, sprpix_val, 1);
if (sprcol) {
out_val2 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 2].data) {
sprcol = render_sprites(dpix + 2, 0, sprpix_val, 1);
if (sprcol) {
out_val3 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 3].data) {
sprcol = render_sprites(dpix + 3, 0, sprpix_val, 1);
if (sprcol) {
out_val4 = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val1; dpix++;
buf[dpix + xlinebuffer_pos] = out_val2; dpix++;
buf[dpix + xlinebuffer_pos] = out_val3; dpix++;
buf[dpix + xlinebuffer_pos] = out_val4; dpix++;
}
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga;
var lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1;
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix++;
out_val = dpix_val;
{
var out_val1 = out_val;
var out_val2 = out_val;
var out_val3 = out_val;
var out_val4 = out_val;
if (spritepixels[dpix + spritepixels_pos].data) {
var sprcol = render_sprites(dpix, 1, sprpix_val, 1);
if (sprcol) {
out_val1 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 1].data) {
sprcol = render_sprites(dpix + 1, 1, sprpix_val, 1);
if (sprcol) {
out_val2 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 2].data) {
sprcol = render_sprites(dpix + 2, 1, sprpix_val, 1);
if (sprcol) {
out_val3 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 3].data) {
sprcol = render_sprites(dpix + 3, 1, sprpix_val, 1);
if (sprcol) {
out_val4 = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val1; dpix++;
buf[dpix + xlinebuffer_pos] = out_val2; dpix++;
buf[dpix + xlinebuffer_pos] = out_val3; dpix++;
buf[dpix + xlinebuffer_pos] = out_val4; dpix++;
}
}
} else if (bplehb) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
{
var out_val1 = out_val;
var out_val2 = out_val;
var out_val3 = out_val;
var out_val4 = out_val;
if (spritepixels[dpix + spritepixels_pos].data) {
var sprcol = render_sprites(dpix, 0, sprpix_val, 1);
if (sprcol) {
out_val1 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 1].data) {
sprcol = render_sprites(dpix + 1, 0, sprpix_val, 1);
if (sprcol) {
out_val2 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 2].data) {
sprcol = render_sprites(dpix + 2, 0, sprpix_val, 1);
if (sprcol) {
out_val3 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 3].data) {
sprcol = render_sprites(dpix + 3, 0, sprpix_val, 1);
if (sprcol) {
out_val4 = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val1; dpix++;
buf[dpix + xlinebuffer_pos] = out_val2; dpix++;
buf[dpix + xlinebuffer_pos] = out_val3; dpix++;
buf[dpix + xlinebuffer_pos] = out_val4; dpix++;
}
}
} else {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
{
var out_val1 = out_val;
var out_val2 = out_val;
var out_val3 = out_val;
var out_val4 = out_val;
if (spritepixels[dpix + spritepixels_pos].data) {
var sprcol = render_sprites(dpix, 0, sprpix_val, 1);
if (sprcol) {
out_val1 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 1].data) {
sprcol = render_sprites(dpix + 1, 0, sprpix_val, 1);
if (sprcol) {
out_val2 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 2].data) {
sprcol = render_sprites(dpix + 2, 0, sprpix_val, 1);
if (sprcol) {
out_val3 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 3].data) {
sprcol = render_sprites(dpix + 3, 0, sprpix_val, 1);
if (sprcol) {
out_val4 = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val1; dpix++;
buf[dpix + xlinebuffer_pos] = out_val2; dpix++;
buf[dpix + xlinebuffer_pos] = out_val3; dpix++;
buf[dpix + xlinebuffer_pos] = out_val4; dpix++;
}
}
}
return spix;
}
function linetoscr_16_shrink1_aga_spr(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
var xor_val = bplxor;
var and_val = bpland;
if (bplham) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix += 2;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga;
var lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1;
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix += 2;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 1, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix += 2;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix += 2;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_16_shrink1f_aga_spr(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
var xor_val = bplxor;
var and_val = bpland;
if (bplham) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
{
var tmp_val;
spix++;
tmp_val = dpix_val;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga;
var lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1;
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 1, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
dpix_val = merge_2pixel16(dpix_val, tmp_val);
spix++;
}
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_16_shrink2_aga_spr(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
var xor_val = bplxor;
var and_val = bpland;
if (bplham) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix += 4;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga;
var lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1;
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix += 4;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 1, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix += 4;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix += 4;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_16_shrink2f_aga_spr(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
var xor_val = bplxor;
var and_val = bpland;
if (bplham) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix++;
tmp_val2 = dpix_val;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix++;
tmp_val3 = dpix_val;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga;
var lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1;
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix++;
tmp_val2 = dpix_val;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix++;
tmp_val3 = dpix_val;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 1, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix++;
tmp_val2 = dpix_val;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix++;
tmp_val3 = dpix_val;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix++;
tmp_val2 = dpix_val;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix++;
tmp_val3 = dpix_val;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
tmp_val = merge_2pixel16(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel16(tmp_val3, dpix_val);
dpix_val = merge_2pixel16(tmp_val, tmp_val2);
spix++;
}
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_32(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
if (bplham) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_32_stretch1(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
if (bplham) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_32_stretch2(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
if (bplham) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_32_shrink1(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
if (bplham) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
spix += 2;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
spix += 2;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix += 2;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
spix += 2;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_32_shrink1f(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
if (bplham) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
dpix_val = merge_2pixel32(dpix_val, tmp_val);
spix++;
}
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
dpix_val = merge_2pixel32(dpix_val, tmp_val);
spix++;
}
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
dpix_val = merge_2pixel32(dpix_val, tmp_val);
spix++;
}
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
dpix_val = merge_2pixel32(dpix_val, tmp_val);
spix++;
}
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_32_shrink2(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
if (bplham) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
spix += 4;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
spix += 4;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix += 4;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
spix += 4;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_32_shrink2f(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
if (bplham) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
spix++;
tmp_val2 = dpix_val;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
spix++;
tmp_val3 = dpix_val;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
tmp_val = merge_2pixel32(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel32(tmp_val3, dpix_val);
dpix_val = merge_2pixel32(tmp_val, tmp_val2);
spix++;
}
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
spix++;
tmp_val2 = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
spix++;
tmp_val3 = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[lookup[spix_val]];
tmp_val = merge_2pixel32(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel32(tmp_val3, dpix_val);
dpix_val = merge_2pixel32(tmp_val, tmp_val2);
spix++;
}
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix++;
tmp_val2 = dpix_val;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix++;
tmp_val3 = dpix_val;
spix_val = pixdata.apixels[spix];
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
tmp_val = merge_2pixel32(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel32(tmp_val3, dpix_val);
dpix_val = merge_2pixel32(tmp_val, tmp_val2);
spix++;
}
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
spix++;
tmp_val2 = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
spix++;
tmp_val3 = dpix_val;
spix_val = pixdata.apixels[spix];
dpix_val = p_acolors[spix_val];
tmp_val = merge_2pixel32(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel32(tmp_val3, dpix_val);
dpix_val = merge_2pixel32(tmp_val, tmp_val2);
spix++;
}
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_32_spr(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
if (bplham) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
sprpix_val = pixdata.apixels[spix];
spix++;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1;
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[lookup[spix_val]];
spix++;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 1, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix++;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_32_stretch1_spr(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
if (bplham) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
sprpix_val = pixdata.apixels[spix];
spix++;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1;
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[lookup[spix_val]];
spix++;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 1, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix++;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_32_stretch2_spr(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
if (bplham) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
sprpix_val = pixdata.apixels[spix];
spix++;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1;
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[lookup[spix_val]];
spix++;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 1, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix++;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_32_shrink1_spr(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
if (bplham) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
sprpix_val = pixdata.apixels[spix];
spix += 2;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1;
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[lookup[spix_val]];
spix += 2;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 1, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix += 2;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[spix_val];
spix += 2;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_32_shrink1f_spr(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
if (bplham) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
sprpix_val = pixdata.apixels[spix];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
sprpix_val = pixdata.apixels[spix];
dpix_val = merge_2pixel32(dpix_val, tmp_val);
spix++;
}
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1;
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[lookup[spix_val]];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[lookup[spix_val]];
dpix_val = merge_2pixel32(dpix_val, tmp_val);
spix++;
}
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 1, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
dpix_val = merge_2pixel32(dpix_val, tmp_val);
spix++;
}
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[spix_val];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[spix_val];
dpix_val = merge_2pixel32(dpix_val, tmp_val);
spix++;
}
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_32_shrink2_spr(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
if (bplham) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
sprpix_val = pixdata.apixels[spix];
spix += 4;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1;
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[lookup[spix_val]];
spix += 4;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 1, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix += 4;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[spix_val];
spix += 4;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_32_shrink2f_spr(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
if (bplham) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
sprpix_val = pixdata.apixels[spix];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
sprpix_val = pixdata.apixels[spix];
spix++;
tmp_val2 = dpix_val;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
sprpix_val = pixdata.apixels[spix];
spix++;
tmp_val3 = dpix_val;
spix_val = ham_linebuf[spix];
dpix_val = p_xcolors[spix_val];
sprpix_val = pixdata.apixels[spix];
tmp_val = merge_2pixel32(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel32(tmp_val3, dpix_val);
dpix_val = merge_2pixel32(tmp_val, tmp_val2);
spix++;
}
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1;
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[lookup[spix_val]];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[lookup[spix_val]];
spix++;
tmp_val2 = dpix_val;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[lookup[spix_val]];
spix++;
tmp_val3 = dpix_val;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[lookup[spix_val]];
tmp_val = merge_2pixel32(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel32(tmp_val3, dpix_val);
dpix_val = merge_2pixel32(tmp_val, tmp_val2);
spix++;
}
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 1, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix++;
tmp_val2 = dpix_val;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
spix++;
tmp_val3 = dpix_val;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
if (spix_val <= 31)
dpix_val = p_acolors[spix_val];
else
dpix_val = p_xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >>> 1) & 0x777];
tmp_val = merge_2pixel32(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel32(tmp_val3, dpix_val);
dpix_val = merge_2pixel32(tmp_val, tmp_val2);
spix++;
}
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[spix_val];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[spix_val];
spix++;
tmp_val2 = dpix_val;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[spix_val];
spix++;
tmp_val3 = dpix_val;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
dpix_val = p_acolors[spix_val];
tmp_val = merge_2pixel32(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel32(tmp_val3, dpix_val);
dpix_val = merge_2pixel32(tmp_val, tmp_val2);
spix++;
}
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 0);
if (sprcol) {
var spcol = p_acolors[sprcol];
out_val = spcol;
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_32_aga_spronly(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
if (1) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var out_val = 0;
spix++;
out_val = p_acolors[0];
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_32_stretch1_aga_spronly(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
if (1) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var out_val = 0;
spix++;
out_val = p_acolors[0];
{
var out_val1 = out_val;
var out_val2 = out_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 1);
if (sprcol) {
out_val1 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 1].data) {
sprcol = render_sprites(dpix + 1, 0, sprpix_val, 1);
if (sprcol) {
out_val2 = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val1; dpix++;
buf[dpix + xlinebuffer_pos] = out_val2; dpix++;
}
}
}
return spix;
}
function linetoscr_32_stretch2_aga_spronly(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
if (1) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var out_val = 0;
spix++;
out_val = p_acolors[0];
{
var out_val1 = out_val;
var out_val2 = out_val;
var out_val3 = out_val;
var out_val4 = out_val;
if (spritepixels[dpix + spritepixels_pos].data) {
var sprcol = render_sprites(dpix, 0, sprpix_val, 1);
if (sprcol) {
out_val1 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 1].data) {
sprcol = render_sprites(dpix + 1, 0, sprpix_val, 1);
if (sprcol) {
out_val2 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 2].data) {
sprcol = render_sprites(dpix + 2, 0, sprpix_val, 1);
if (sprcol) {
out_val3 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 3].data) {
sprcol = render_sprites(dpix + 3, 0, sprpix_val, 1);
if (sprcol) {
out_val4 = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val1; dpix++;
buf[dpix + xlinebuffer_pos] = out_val2; dpix++;
buf[dpix + xlinebuffer_pos] = out_val3; dpix++;
buf[dpix + xlinebuffer_pos] = out_val4; dpix++;
}
}
}
return spix;
}
function linetoscr_32_shrink1_aga_spronly(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
if (1) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var out_val = 0;
spix++;
out_val = p_acolors[0];
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_32_shrink1f_aga_spronly(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
if (1) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var out_val = 0;
spix++;
out_val = p_acolors[0];
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_32_shrink2_aga_spronly(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
if (1) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var out_val = 0;
spix++;
out_val = p_acolors[0];
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_32_shrink2f_aga_spronly(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
if (1) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var out_val = 0;
spix++;
out_val = p_acolors[0];
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_32_aga(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var xor_val = bplxor;
var and_val = bpland;
if (bplham) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga;
var lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_32_stretch1_aga(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var xor_val = bplxor;
var and_val = bpland;
if (bplham) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga;
var lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_32_stretch2_aga(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var xor_val = bplxor;
var and_val = bpland;
if (bplham) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga;
var lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_32_shrink1_aga(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var xor_val = bplxor;
var and_val = bpland;
if (bplham) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix += 2;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga;
var lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix += 2;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix += 2;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix += 2;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_32_shrink1f_aga(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var xor_val = bplxor;
var and_val = bpland;
if (bplham) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
dpix_val = merge_2pixel32(dpix_val, tmp_val);
spix++;
}
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga;
var lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
dpix_val = merge_2pixel32(dpix_val, tmp_val);
spix++;
}
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
dpix_val = merge_2pixel32(dpix_val, tmp_val);
spix++;
}
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
dpix_val = merge_2pixel32(dpix_val, tmp_val);
spix++;
}
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_32_shrink2_aga(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var xor_val = bplxor;
var and_val = bpland;
if (bplham) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix += 4;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga;
var lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix += 4;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix += 4;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix += 4;
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_32_shrink2f_aga(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var xor_val = bplxor;
var and_val = bpland;
if (bplham) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix++;
tmp_val2 = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix++;
tmp_val3 = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
tmp_val = merge_2pixel32(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel32(tmp_val3, dpix_val);
dpix_val = merge_2pixel32(tmp_val, tmp_val2);
spix++;
}
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga;
var lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1;
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix++;
tmp_val2 = dpix_val;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix++;
tmp_val3 = dpix_val;
spix_val = pixdata.apixels[spix];
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
tmp_val = merge_2pixel32(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel32(tmp_val3, dpix_val);
dpix_val = merge_2pixel32(tmp_val, tmp_val2);
spix++;
}
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix++;
tmp_val2 = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix++;
tmp_val3 = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
tmp_val = merge_2pixel32(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel32(tmp_val3, dpix_val);
dpix_val = merge_2pixel32(tmp_val, tmp_val2);
spix++;
}
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix++;
tmp_val2 = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix++;
tmp_val3 = dpix_val;
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
tmp_val = merge_2pixel32(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel32(tmp_val3, dpix_val);
dpix_val = merge_2pixel32(tmp_val, tmp_val2);
spix++;
}
out_val = dpix_val;
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_32_aga_spr(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
var xor_val = bplxor;
var and_val = bpland;
if (bplham) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix++;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga;
var lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1;
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix++;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 1, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_32_stretch1_aga_spr(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
var xor_val = bplxor;
var and_val = bpland;
if (bplham) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix++;
out_val = dpix_val;
{
var out_val1 = out_val;
var out_val2 = out_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 1);
if (sprcol) {
out_val1 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 1].data) {
sprcol = render_sprites(dpix + 1, 0, sprpix_val, 1);
if (sprcol) {
out_val2 = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val1; dpix++;
buf[dpix + xlinebuffer_pos] = out_val2; dpix++;
}
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga;
var lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1;
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix++;
out_val = dpix_val;
{
var out_val1 = out_val;
var out_val2 = out_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 1, sprpix_val, 1);
if (sprcol) {
out_val1 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 1].data) {
sprcol = render_sprites(dpix + 1, 1, sprpix_val, 1);
if (sprcol) {
out_val2 = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val1; dpix++;
buf[dpix + xlinebuffer_pos] = out_val2; dpix++;
}
}
} else if (bplehb) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
{
var out_val1 = out_val;
var out_val2 = out_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 1);
if (sprcol) {
out_val1 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 1].data) {
sprcol = render_sprites(dpix + 1, 0, sprpix_val, 1);
if (sprcol) {
out_val2 = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val1; dpix++;
buf[dpix + xlinebuffer_pos] = out_val2; dpix++;
}
}
} else {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
{
var out_val1 = out_val;
var out_val2 = out_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix, 0, sprpix_val, 1);
if (sprcol) {
out_val1 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 1].data) {
sprcol = render_sprites(dpix + 1, 0, sprpix_val, 1);
if (sprcol) {
out_val2 = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val1; dpix++;
buf[dpix + xlinebuffer_pos] = out_val2; dpix++;
}
}
}
return spix;
}
function linetoscr_32_stretch2_aga_spr(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
var xor_val = bplxor;
var and_val = bpland;
if (bplham) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix++;
out_val = dpix_val;
{
var out_val1 = out_val;
var out_val2 = out_val;
var out_val3 = out_val;
var out_val4 = out_val;
if (spritepixels[dpix + spritepixels_pos].data) {
var sprcol = render_sprites(dpix, 0, sprpix_val, 1);
if (sprcol) {
out_val1 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 1].data) {
sprcol = render_sprites(dpix + 1, 0, sprpix_val, 1);
if (sprcol) {
out_val2 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 2].data) {
sprcol = render_sprites(dpix + 2, 0, sprpix_val, 1);
if (sprcol) {
out_val3 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 3].data) {
sprcol = render_sprites(dpix + 3, 0, sprpix_val, 1);
if (sprcol) {
out_val4 = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val1; dpix++;
buf[dpix + xlinebuffer_pos] = out_val2; dpix++;
buf[dpix + xlinebuffer_pos] = out_val3; dpix++;
buf[dpix + xlinebuffer_pos] = out_val4; dpix++;
}
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga;
var lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1;
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix++;
out_val = dpix_val;
{
var out_val1 = out_val;
var out_val2 = out_val;
var out_val3 = out_val;
var out_val4 = out_val;
if (spritepixels[dpix + spritepixels_pos].data) {
var sprcol = render_sprites(dpix, 1, sprpix_val, 1);
if (sprcol) {
out_val1 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 1].data) {
sprcol = render_sprites(dpix + 1, 1, sprpix_val, 1);
if (sprcol) {
out_val2 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 2].data) {
sprcol = render_sprites(dpix + 2, 1, sprpix_val, 1);
if (sprcol) {
out_val3 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 3].data) {
sprcol = render_sprites(dpix + 3, 1, sprpix_val, 1);
if (sprcol) {
out_val4 = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val1; dpix++;
buf[dpix + xlinebuffer_pos] = out_val2; dpix++;
buf[dpix + xlinebuffer_pos] = out_val3; dpix++;
buf[dpix + xlinebuffer_pos] = out_val4; dpix++;
}
}
} else if (bplehb) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
{
var out_val1 = out_val;
var out_val2 = out_val;
var out_val3 = out_val;
var out_val4 = out_val;
if (spritepixels[dpix + spritepixels_pos].data) {
var sprcol = render_sprites(dpix, 0, sprpix_val, 1);
if (sprcol) {
out_val1 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 1].data) {
sprcol = render_sprites(dpix + 1, 0, sprpix_val, 1);
if (sprcol) {
out_val2 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 2].data) {
sprcol = render_sprites(dpix + 2, 0, sprpix_val, 1);
if (sprcol) {
out_val3 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 3].data) {
sprcol = render_sprites(dpix + 3, 0, sprpix_val, 1);
if (sprcol) {
out_val4 = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val1; dpix++;
buf[dpix + xlinebuffer_pos] = out_val2; dpix++;
buf[dpix + xlinebuffer_pos] = out_val3; dpix++;
buf[dpix + xlinebuffer_pos] = out_val4; dpix++;
}
}
} else {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix++;
out_val = dpix_val;
{
var out_val1 = out_val;
var out_val2 = out_val;
var out_val3 = out_val;
var out_val4 = out_val;
if (spritepixels[dpix + spritepixels_pos].data) {
var sprcol = render_sprites(dpix, 0, sprpix_val, 1);
if (sprcol) {
out_val1 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 1].data) {
sprcol = render_sprites(dpix + 1, 0, sprpix_val, 1);
if (sprcol) {
out_val2 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 2].data) {
sprcol = render_sprites(dpix + 2, 0, sprpix_val, 1);
if (sprcol) {
out_val3 = p_acolors[sprcol];
}
}
if (spritepixels[dpix + spritepixels_pos + 3].data) {
sprcol = render_sprites(dpix + 3, 0, sprpix_val, 1);
if (sprcol) {
out_val4 = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val1; dpix++;
buf[dpix + xlinebuffer_pos] = out_val2; dpix++;
buf[dpix + xlinebuffer_pos] = out_val3; dpix++;
buf[dpix + xlinebuffer_pos] = out_val4; dpix++;
}
}
}
return spix;
}
function linetoscr_32_shrink1_aga_spr(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
var xor_val = bplxor;
var and_val = bpland;
if (bplham) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix += 2;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga;
var lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1;
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix += 2;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 1, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix += 2;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix += 2;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_32_shrink1f_aga_spr(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
var xor_val = bplxor;
var and_val = bpland;
if (bplham) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
{
var tmp_val;
spix++;
tmp_val = dpix_val;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
dpix_val = merge_2pixel32(dpix_val, tmp_val);
spix++;
}
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga;
var lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1;
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
{
var tmp_val;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
dpix_val = merge_2pixel32(dpix_val, tmp_val);
spix++;
}
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 1, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
dpix_val = merge_2pixel32(dpix_val, tmp_val);
spix++;
}
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
{
var tmp_val;
spix++;
tmp_val = dpix_val;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
dpix_val = merge_2pixel32(dpix_val, tmp_val);
spix++;
}
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_32_shrink2_aga_spr(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
var xor_val = bplxor;
var and_val = bpland;
if (bplham) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix += 4;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga;
var lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1;
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix += 4;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 1, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix += 4;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix += 4;
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
function linetoscr_32_shrink2f_aga_spr(spix, dpix, dpix_end)
{
var buf = xlinebuffer;
var sprcol = 0;
var xor_val = bplxor;
var and_val = bpland;
if (bplham) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix++;
tmp_val2 = dpix_val;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
spix++;
tmp_val3 = dpix_val;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
spix_val = ham_linebuf[spix];
dpix_val = CONVERT_RGB(spix_val);
tmp_val = merge_2pixel32(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel32(tmp_val3, dpix_val);
dpix_val = merge_2pixel32(tmp_val, tmp_val2);
spix++;
}
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bpldualpf) {
var lookup = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga;
var lookup_no = bpldualpfpri ? dblpf_2nd2 : dblpf_2nd1;
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix++;
tmp_val2 = dpix_val;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
spix++;
tmp_val3 = dpix_val;
spix_val = pixdata.apixels[spix];
sprpix_val = spix_val;
{
var val = lookup[spix_val];
if (lookup_no[spix_val])
val += dblpfofs[bpldualpf2of];
val ^= xor_val;
dpix_val = p_acolors[val];
}
tmp_val = merge_2pixel32(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel32(tmp_val3, dpix_val);
dpix_val = merge_2pixel32(tmp_val, tmp_val2);
spix++;
}
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 1, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else if (bplehb) {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix++;
tmp_val2 = dpix_val;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
spix++;
tmp_val3 = dpix_val;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
if (spix_val >= 32 && spix_val < 64) {
var c = (colors_for_drawing.color_regs_aga[spix_val - 32] >>> 1) & 0x7F7F7F;
dpix_val = CONVERT_RGB(c);
} else
dpix_val = p_acolors[spix_val];
tmp_val = merge_2pixel32(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel32(tmp_val3, dpix_val);
dpix_val = merge_2pixel32(tmp_val, tmp_val2);
spix++;
}
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
} else {
while (dpix < dpix_end) {
var sprpix_val = 0;
var spix_val = 0;
var dpix_val = 0;
var out_val = 0;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
{
var tmp_val, tmp_val2, tmp_val3;
spix++;
tmp_val = dpix_val;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix++;
tmp_val2 = dpix_val;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
spix++;
tmp_val3 = dpix_val;
sprpix_val = pixdata.apixels[spix];
spix_val = (pixdata.apixels[spix] ^ xor_val) & and_val;
dpix_val = p_acolors[spix_val];
tmp_val = merge_2pixel32(tmp_val, tmp_val2);
tmp_val2 = merge_2pixel32(tmp_val3, dpix_val);
dpix_val = merge_2pixel32(tmp_val, tmp_val2);
spix++;
}
out_val = dpix_val;
if (spritepixels[dpix + spritepixels_pos].data) {
sprcol = render_sprites(dpix + 0, 0, sprpix_val, 1);
if (sprcol) {
out_val = p_acolors[sprcol];
}
}
buf[dpix + xlinebuffer_pos] = out_val; dpix++;
}
}
return spix;
}
}