GraphicScreen.graM4[gy1st | gx1st + 3 & 511])) != 0 ? (VideoController.vcnPal16G8[p & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 3]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : (VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[gy4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 3 & 511])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 3]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]]); XEiJ.pnlBM[da + 4] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 4 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 4 & 511])) != 0 ? (VideoController.vcnPal16G8[p & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 4]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : (VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[gy4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 4 & 511])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 4]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]]); XEiJ.pnlBM[da + 5] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 5 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 5 & 511])) != 0 ? (VideoController.vcnPal16G8[p & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 5]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : (VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[gy4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 5 & 511])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 5]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]]); XEiJ.pnlBM[da + 6] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 6 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 6 & 511])) != 0 ? (VideoController.vcnPal16G8[p & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 6]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : (VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[gy4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 6 & 511])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 6]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]]); XEiJ.pnlBM[da + 7] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 7 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 7 & 511])) != 0 ? (VideoController.vcnPal16G8[p & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 7]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : (VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[gy4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 7 & 511])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 7]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]]); sx += 8; gx1st += 8; gx2nd += 8; gx3rd += 8; gx4th += 8; da += 8; } //while da<db } //if ts==0 } //drawRaster }, //F2TS_XHCT //================================================================================ //F2TS_XHCG ($0001,$24xx,$1A6F) // 概要 // F2TS 512ドット256色2プレーン>テキスト>スプライト // XHCG 0でない1番目のパレットを偶数化したパレットのカラーが奇数のときそれと2番目のパレットを奇数化したパレットのカラーを混ぜる // 手順 // 1番目のパレットが0でないとき // 1番目のパレットを偶数化したパレットのカラーが奇数のとき // 1番目のパレットを偶数化したパレットのカラーと2番目(ONとみなす)のパレットを奇数化したパレットのカラーを混ぜたカラー(0は黒) // さもなくば(1番目のパレットを偶数化したパレットのカラーが偶数のとき) // 1番目のパレットが奇数のとき // 2番目(ONとみなす)のパレットを奇数化したパレットのカラーが0でないとき // 2番目(ONとみなす)のパレットを奇数化したパレットのカラー // さもなくば(2番目(ONとみなす)のパレットを奇数化したパレットのカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // さもなくば(1番目のパレットが偶数のとき) // 1番目のカラーが0でないとき // 1番目のカラー // さもなくば(1番目のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // さもなくば(1番目のパレットが0のとき) // 2番目のパレットを偶数化したパレットのカラーが奇数のとき // 2番目のパレットを偶数化したパレットのカラーと2番目(ONとみなす)のパレットを奇数化したパレットのカラーを混ぜたカラー(0は黒) // さもなくば(2番目のパレットを偶数化したパレットのカラーが偶数のとき) // 2番目のカラーが0でないとき // 2番目のカラー // さもなくば(2番目のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // 中間コード1 // (f1p()!=0?(ls1(fpc(tev(f1p())))!=0?mix(fpc(tev(f1p())),fpc(tod(f2q()))):(ls1(f1p())!=0?(fpc(tod(f2q()))!=0?fpc(tod(f2q())):(txp()!=0?tpc(txp()):spc(spp()))):(fpc(f1p())!=0?fpc(f1p()):(txp()!=0?tpc(txp()):spc(spp()))))):(ls1(fpc(tev(f2p())))!=0?mix(fpc(tev(f2p())),fpc(tod(f2q()))):(fpc(f2p())!=0?fpc(f2p()):(txp()!=0?tpc(txp()):spc(spp()))))) // 中間コード2 // f1p()!=0?ls1(fpc(tev(f1p())))!=0?mix(fpc(tev(f1p())),fpc(tod(f2q()))):ls1(f1p())!=0?fpc(tod(f2q()))!=0?fpc(tod(f2q())):txp()!=0?tpc(txp()):spc(spp()):fpc(f1p())!=0?fpc(f1p()):txp()!=0?tpc(txp()):spc(spp()):ls1(fpc(tev(f2p())))!=0?mix(fpc(tev(f2p())),fpc(tod(f2q()))):fpc(f2p())!=0?fpc(f2p()):txp()!=0?tpc(txp()):spc(spp()) // 中間コード3 // (v0=f1p())!=0?ls1(v2=fpc(tev(v0)))!=0?mix(v2,fpc(tod(f2q()))):ls1(v0)!=0?(v9=fpc(tod(f2q())))!=0?v9:(v12=txp())!=0?tpc(v12):spc(spp()):(v16=fpc(v0))!=0?v16:(v17=txp())!=0?tpc(v17):spc(spp()):ls1(v22=fpc(tev(v24=f2p())))!=0?mix(v22,fpc(tod(f2q()))):(v29=fpc(v24))!=0?v29:(v30=txp())!=0?tpc(v30):spc(spp()) // 中間コード4 // (p=f1p())!=0?ls1(q=fpc(tev(p)))!=0?mix(q,fpc(tod(f2q()))):ls1(p)!=0?(p=fpc(tod(f2q())))!=0?p:(p=txp())!=0?tpc(p):spc(spp()):(q=fpc(p))!=0?q:(p=txp())!=0?tpc(p):spc(spp()):ls1(p=fpc(tev(q=f2p())))!=0?mix(p,fpc(tod(f2q()))):(p=fpc(q))!=0?p:(p=txp())!=0?tpc(p):spc(spp()) // 中間コード5 // (p=f1p())!=0?((q=fpc(p&-2))&1)!=0?mix(q,fpc(f2q()|1)):(p&1)!=0?(p=fpc(f2q()|1))!=0?p:(p=txp())!=0?tpc(p):spc(spp()):(q=fpc(p))!=0?q:(p=txp())!=0?tpc(p):spc(spp()):((p=fpc((q=f2p())&-2))&1)!=0?mix(p,fpc(f2q()|1)):(p=fpc(q))!=0?p:(p=txp())!=0?tpc(p):spc(spp()) // 中間コード6 // (p=f1p())!=0?((q=fpc(p&-2))&1)!=0?cto(mix(q,fpc(f2q()|1))):(p&1)!=0?(p=fpc(f2q()|1))!=0?cto(p):(p=txp())!=0?tpo(p):spo(spp()):(q=fpc(p))!=0?cto(q):(p=txp())!=0?tpo(p):spo(spp()):((p=fpc((q=f2p())&-2))&1)!=0?cto(mix(p,fpc(f2q()|1))):(p=fpc(q))!=0?cto(p):(p=txp())!=0?tpo(p):spo(spp()) F2TS_XHCG { @Override public void drawRaster (int src, int dst, boolean rh) { SpriteScreen.sprStep3 (); int sx = 16; //スプライトx座標 int pn = VideoController.vcnReg2Curr & 3; //1番目のパレットのbit3-0のGVRAMページ番号 int gx1st = CRTC.crtR12GrXCurr[pn]; int gy1st = VideoController.vcnVisible1st + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); pn = VideoController.vcnReg2Curr >> 2 & 3; //1番目のパレットのbit7-4のGVRAMページ番号 int gx2nd = CRTC.crtR12GrXCurr[pn]; int gy2nd = VideoController.vcnVisible2nd + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); pn = VideoController.vcnReg2Curr >> 4 & 3; //2番目のパレットのbit3-0のGVRAMページ番号 int gx3rd = CRTC.crtR12GrXCurr[pn]; int gy3rd = VideoController.vcnVisible3rd + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); int gz3rd = VideoController.vcnHidden3rd + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); pn = VideoController.vcnReg2Curr >> 6 & 3; //2番目のパレットのbit7-4のGVRAMページ番号 int gx4th = CRTC.crtR12GrXCurr[pn]; int gy4th = VideoController.vcnVisible4th + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); int gz4th = VideoController.vcnHidden4th + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); int ty = CRTC.crtR11TxYZero + src & 1023; //ラスタ int tc = (ty & CRTC.crtMask3) << 7 | CRTC.crtR10TxXCurr >> 3; //テキスト桁位置 int ta0 = 0x00e00000 + ((ty & CRTC.crtMaskMinus4) << 7); //ラスタブロックアドレス int ta1 = 0x00020000 + ta0; int ta2 = 0x00040000 + ta0; int ta3 = 0x00060000 + ta0; int ts = CRTC.crtR10TxXCurr & 7; //テキスト桁境界からのずれ int da = dst << XEiJ.PNL_BM_OFFSET_BITS; //ARGB出力インデックス int db = da + XEiJ.pnlScreenWidth; //ARGB出力インデックスの終了位置 if (rh) { int half = XEiJ.pnlScreenWidth >> 4 << 3; sx += half; gx1st += half; gx2nd += half; gx3rd += half; gx4th += half; tc = tc + (half >> 3) & CRTC.crtMask511; da += half; } if (ts == 0) { //テキスト桁境界に合っているとき while (da < db) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st & 511])) != 0 ? ((q = VideoController.vcnPal16G8[p & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( q, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd & 511]) | 1])] : (p & 1) != 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd & 511]) | 1]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : ((p = VideoController.vcnPal16G8[(q = (GraphicScreen.graM4[gy4th | gx4th & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd & 511])) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd & 511]) | 1])] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); XEiJ.pnlBM[da + 1] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 1 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 1 & 511])) != 0 ? ((q = VideoController.vcnPal16G8[p & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( q, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 1 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 1 & 511]) | 1])] : (p & 1) != 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 1 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 1 & 511]) | 1]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : ((p = VideoController.vcnPal16G8[(q = (GraphicScreen.graM4[gy4th | gx4th + 1 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 1 & 511])) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 1 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 1 & 511]) | 1])] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]]); XEiJ.pnlBM[da + 2] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 2 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 2 & 511])) != 0 ? ((q = VideoController.vcnPal16G8[p & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( q, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 2 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 2 & 511]) | 1])] : (p & 1) != 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 2 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 2 & 511]) | 1]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : ((p = VideoController.vcnPal16G8[(q = (GraphicScreen.graM4[gy4th | gx4th + 2 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 2 & 511])) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 2 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 2 & 511]) | 1])] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]]); XEiJ.pnlBM[da + 3] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 3 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 3 & 511])) != 0 ? ((q = VideoController.vcnPal16G8[p & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( q, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 3 & 511]) | 1])] : (p & 1) != 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 3 & 511]) | 1]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : ((p = VideoController.vcnPal16G8[(q = (GraphicScreen.graM4[gy4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 3 & 511])) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 3 & 511]) | 1])] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]]); XEiJ.pnlBM[da + 4] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 4 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 4 & 511])) != 0 ? ((q = VideoController.vcnPal16G8[p & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( q, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 4 & 511]) | 1])] : (p & 1) != 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 4 & 511]) | 1]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : ((p = VideoController.vcnPal16G8[(q = (GraphicScreen.graM4[gy4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 4 & 511])) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 4 & 511]) | 1])] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]]); XEiJ.pnlBM[da + 5] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 5 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 5 & 511])) != 0 ? ((q = VideoController.vcnPal16G8[p & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( q, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 5 & 511]) | 1])] : (p & 1) != 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 5 & 511]) | 1]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : ((p = VideoController.vcnPal16G8[(q = (GraphicScreen.graM4[gy4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 5 & 511])) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 5 & 511]) | 1])] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]]); XEiJ.pnlBM[da + 6] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 6 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 6 & 511])) != 0 ? ((q = VideoController.vcnPal16G8[p & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( q, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 6 & 511]) | 1])] : (p & 1) != 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 6 & 511]) | 1]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : ((p = VideoController.vcnPal16G8[(q = (GraphicScreen.graM4[gy4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 6 & 511])) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 6 & 511]) | 1])] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]]); XEiJ.pnlBM[da + 7] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 7 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 7 & 511])) != 0 ? ((q = VideoController.vcnPal16G8[p & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( q, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 7 & 511]) | 1])] : (p & 1) != 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 7 & 511]) | 1]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : ((p = VideoController.vcnPal16G8[(q = (GraphicScreen.graM4[gy4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 7 & 511])) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 7 & 511]) | 1])] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]]); sx += 8; gx1st += 8; gx2nd += 8; gx3rd += 8; gx4th += 8; da += 8; } //while da<db } else { //テキスト桁境界に合っていないとき // ts=1のとき int tt = ts + 8; //tt=9 ts += 16; //ts=17 // ........ ........ ........ 01234567 m8[ta0+tc] int p0 = MainMemory.mmrM8[ta0 + tc] << ts; //.......0 1234567_ ________ ________ p0=m8[ta0+tc]<<ts int p1 = MainMemory.mmrM8[ta1 + tc] << ts; int p2 = MainMemory.mmrM8[ta2 + tc] << ts; int p3 = MainMemory.mmrM8[ta3 + tc] << ts; tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 while (da < db) { // ........ ........ .1234567 ________ p0>>tt // ........ ........ .1234567 89abcdef p0>>tt|m8[ta0+tc]&255 p0 = (p0 >> tt | MainMemory.mmrM8[ta0 + tc] & 255) << ts; //12345678 9abcdef_ ________ ________ p0=(p0>>tt|m8[ta0+tc]&255)<<ts p1 = (p1 >> tt | MainMemory.mmrM8[ta1 + tc] & 255) << ts; //~~~~~~~~ p2 = (p2 >> tt | MainMemory.mmrM8[ta2 + tc] & 255) << ts; //ここを使う p3 = (p3 >> tt | MainMemory.mmrM8[ta3 + tc] & 255) << ts; int tp = (VideoController.VCN_TXP3[p3 >>> 24] | VideoController.VCN_TXP2[p2 >>> 24] | VideoController.VCN_TXP1[p1 >>> 24] | VideoController.VCN_TXP0[p0 >>> 24]); //符号なし右シフトで&255を省略 tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st & 511])) != 0 ? ((q = VideoController.vcnPal16G8[p & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( q, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd & 511]) | 1])] : (p & 1) != 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd & 511]) | 1]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : ((p = VideoController.vcnPal16G8[(q = (GraphicScreen.graM4[gy4th | gx4th & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd & 511])) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd & 511]) | 1])] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); XEiJ.pnlBM[da + 1] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 1 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 1 & 511])) != 0 ? ((q = VideoController.vcnPal16G8[p & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( q, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 1 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 1 & 511]) | 1])] : (p & 1) != 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 1 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 1 & 511]) | 1]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : ((p = VideoController.vcnPal16G8[(q = (GraphicScreen.graM4[gy4th | gx4th + 1 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 1 & 511])) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 1 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 1 & 511]) | 1])] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]]); XEiJ.pnlBM[da + 2] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 2 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 2 & 511])) != 0 ? ((q = VideoController.vcnPal16G8[p & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( q, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 2 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 2 & 511]) | 1])] : (p & 1) != 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 2 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 2 & 511]) | 1]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : ((p = VideoController.vcnPal16G8[(q = (GraphicScreen.graM4[gy4th | gx4th + 2 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 2 & 511])) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 2 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 2 & 511]) | 1])] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]]); XEiJ.pnlBM[da + 3] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 3 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 3 & 511])) != 0 ? ((q = VideoController.vcnPal16G8[p & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( q, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 3 & 511]) | 1])] : (p & 1) != 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 3 & 511]) | 1]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : ((p = VideoController.vcnPal16G8[(q = (GraphicScreen.graM4[gy4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 3 & 511])) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 3 & 511]) | 1])] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]]); XEiJ.pnlBM[da + 4] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 4 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 4 & 511])) != 0 ? ((q = VideoController.vcnPal16G8[p & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( q, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 4 & 511]) | 1])] : (p & 1) != 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 4 & 511]) | 1]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : ((p = VideoController.vcnPal16G8[(q = (GraphicScreen.graM4[gy4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 4 & 511])) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 4 & 511]) | 1])] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]]); XEiJ.pnlBM[da + 5] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 5 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 5 & 511])) != 0 ? ((q = VideoController.vcnPal16G8[p & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( q, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 5 & 511]) | 1])] : (p & 1) != 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 5 & 511]) | 1]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : ((p = VideoController.vcnPal16G8[(q = (GraphicScreen.graM4[gy4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 5 & 511])) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 5 & 511]) | 1])] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]]); XEiJ.pnlBM[da + 6] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 6 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 6 & 511])) != 0 ? ((q = VideoController.vcnPal16G8[p & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( q, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 6 & 511]) | 1])] : (p & 1) != 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 6 & 511]) | 1]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : ((p = VideoController.vcnPal16G8[(q = (GraphicScreen.graM4[gy4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 6 & 511])) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 6 & 511]) | 1])] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]]); XEiJ.pnlBM[da + 7] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 7 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 7 & 511])) != 0 ? ((q = VideoController.vcnPal16G8[p & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( q, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 7 & 511]) | 1])] : (p & 1) != 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 7 & 511]) | 1]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : ((p = VideoController.vcnPal16G8[(q = (GraphicScreen.graM4[gy4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 7 & 511])) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 7 & 511]) | 1])] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]]); sx += 8; gx1st += 8; gx2nd += 8; gx3rd += 8; gx4th += 8; da += 8; } //while da<db } //if ts==0 } //drawRaster }, //F2TS_XHCG //================================================================================ //F2TS_XHCGT ($0001,$24xx,$1B6F) // 概要 // F2TS 512ドット256色2プレーン>テキスト>スプライト // XHCGT 0でない1番目のパレットを偶数化したパレットのカラーが奇数のときそれと2番目のパレットを奇数化したパレットのカラーを混ぜてさらに奥のスプライト・テキストのカラーを混ぜる // 手順 // 1番目のパレットが0でないとき // 1番目のパレットを偶数化したパレットのカラーが奇数のとき // 1番目のパレットを偶数化したパレットのカラーと2番目(ONとみなす)のパレットを奇数化したパレットのカラーを混ぜたカラーにさらに // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // を混ぜたカラー(0は黒) // さもなくば(1番目のパレットを偶数化したパレットのカラーが偶数のとき) // 1番目のパレットが奇数のとき // 2番目(ONとみなす)のパレットを奇数化したパレットのカラーが0でないとき // 2番目(ONとみなす)のパレットを奇数化したパレットのカラー // さもなくば(2番目(ONとみなす)のパレットを奇数化したパレットのカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // さもなくば(1番目のパレットが偶数のとき) // 1番目のカラーが0でないとき // 1番目のカラー // さもなくば(1番目のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // さもなくば(1番目のパレットが0のとき) // 2番目のパレットを偶数化したパレットのカラーが奇数のとき // 2番目のパレットを偶数化したパレットのカラーと2番目(ONとみなす)のパレットを奇数化したパレットのカラーを混ぜたカラーにさらに // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // を混ぜたカラー(0は黒) // さもなくば(2番目のパレットを偶数化したパレットのカラーが偶数のとき) // 2番目のカラーが0でないとき // 2番目のカラー // さもなくば(2番目のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // 中間コード1 // (f1p()!=0?(ls1(fpc(tev(f1p())))!=0?mix(mix(fpc(tev(f1p())),fpc(tod(f2q()))),(txp()!=0?tpc(txp()):spc(spp()))):(ls1(f1p())!=0?(fpc(tod(f2q()))!=0?fpc(tod(f2q())):(txp()!=0?tpc(txp()):spc(spp()))):(fpc(f1p())!=0?fpc(f1p()):(txp()!=0?tpc(txp()):spc(spp()))))):(ls1(fpc(tev(f2p())))!=0?mix(mix(fpc(tev(f2p())),fpc(tod(f2q()))),(txp()!=0?tpc(txp()):spc(spp()))):(fpc(f2p())!=0?fpc(f2p()):(txp()!=0?tpc(txp()):spc(spp()))))) // 中間コード2 // f1p()!=0?ls1(fpc(tev(f1p())))!=0?mix(mix(fpc(tev(f1p())),fpc(tod(f2q()))),txp()!=0?tpc(txp()):spc(spp())):ls1(f1p())!=0?fpc(tod(f2q()))!=0?fpc(tod(f2q())):txp()!=0?tpc(txp()):spc(spp()):fpc(f1p())!=0?fpc(f1p()):txp()!=0?tpc(txp()):spc(spp()):ls1(fpc(tev(f2p())))!=0?mix(mix(fpc(tev(f2p())),fpc(tod(f2q()))),txp()!=0?tpc(txp()):spc(spp())):fpc(f2p())!=0?fpc(f2p()):txp()!=0?tpc(txp()):spc(spp()) // 中間コード3 // (v0=f1p())!=0?ls1(v2=fpc(tev(v0)))!=0?mix(mix(v2,fpc(tod(f2q()))),(v9=txp())!=0?tpc(v9):spc(spp())):ls1(v0)!=0?(v14=fpc(tod(f2q())))!=0?v14:(v17=txp())!=0?tpc(v17):spc(spp()):(v21=fpc(v0))!=0?v21:(v22=txp())!=0?tpc(v22):spc(spp()):ls1(v27=fpc(tev(v29=f2p())))!=0?mix(mix(v27,fpc(tod(f2q()))),(v35=txp())!=0?tpc(v35):spc(spp())):(v39=fpc(v29))!=0?v39:(v40=txp())!=0?tpc(v40):spc(spp()) // 中間コード4 // (p=f1p())!=0?ls1(q=fpc(tev(p)))!=0?mix(mix(q,fpc(tod(f2q()))),(p=txp())!=0?tpc(p):spc(spp())):ls1(p)!=0?(p=fpc(tod(f2q())))!=0?p:(p=txp())!=0?tpc(p):spc(spp()):(q=fpc(p))!=0?q:(p=txp())!=0?tpc(p):spc(spp()):ls1(p=fpc(tev(q=f2p())))!=0?mix(mix(p,fpc(tod(f2q()))),(p=txp())!=0?tpc(p):spc(spp())):(p=fpc(q))!=0?p:(p=txp())!=0?tpc(p):spc(spp()) // 中間コード5 // (p=f1p())!=0?((q=fpc(p&-2))&1)!=0?mix(mix(q,fpc(f2q()|1)),(p=txp())!=0?tpc(p):spc(spp())):(p&1)!=0?(p=fpc(f2q()|1))!=0?p:(p=txp())!=0?tpc(p):spc(spp()):(q=fpc(p))!=0?q:(p=txp())!=0?tpc(p):spc(spp()):((p=fpc((q=f2p())&-2))&1)!=0?mix(mix(p,fpc(f2q()|1)),(p=txp())!=0?tpc(p):spc(spp())):(p=fpc(q))!=0?p:(p=txp())!=0?tpc(p):spc(spp()) // 中間コード6 // (p=f1p())!=0?((q=fpc(p&-2))&1)!=0?cto(mix(mix(q,fpc(f2q()|1)),(p=txp())!=0?tpc(p):spc(spp()))):(p&1)!=0?(p=fpc(f2q()|1))!=0?cto(p):(p=txp())!=0?tpo(p):spo(spp()):(q=fpc(p))!=0?cto(q):(p=txp())!=0?tpo(p):spo(spp()):((p=fpc((q=f2p())&-2))&1)!=0?cto(mix(mix(p,fpc(f2q()|1)),(p=txp())!=0?tpc(p):spc(spp()))):(p=fpc(q))!=0?cto(p):(p=txp())!=0?tpo(p):spo(spp()) F2TS_XHCGT { @Override public void drawRaster (int src, int dst, boolean rh) { SpriteScreen.sprStep3 (); int sx = 16; //スプライトx座標 int pn = VideoController.vcnReg2Curr & 3; //1番目のパレットのbit3-0のGVRAMページ番号 int gx1st = CRTC.crtR12GrXCurr[pn]; int gy1st = VideoController.vcnVisible1st + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); pn = VideoController.vcnReg2Curr >> 2 & 3; //1番目のパレットのbit7-4のGVRAMページ番号 int gx2nd = CRTC.crtR12GrXCurr[pn]; int gy2nd = VideoController.vcnVisible2nd + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); pn = VideoController.vcnReg2Curr >> 4 & 3; //2番目のパレットのbit3-0のGVRAMページ番号 int gx3rd = CRTC.crtR12GrXCurr[pn]; int gy3rd = VideoController.vcnVisible3rd + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); int gz3rd = VideoController.vcnHidden3rd + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); pn = VideoController.vcnReg2Curr >> 6 & 3; //2番目のパレットのbit7-4のGVRAMページ番号 int gx4th = CRTC.crtR12GrXCurr[pn]; int gy4th = VideoController.vcnVisible4th + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); int gz4th = VideoController.vcnHidden4th + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); int ty = CRTC.crtR11TxYZero + src & 1023; //ラスタ int tc = (ty & CRTC.crtMask3) << 7 | CRTC.crtR10TxXCurr >> 3; //テキスト桁位置 int ta0 = 0x00e00000 + ((ty & CRTC.crtMaskMinus4) << 7); //ラスタブロックアドレス int ta1 = 0x00020000 + ta0; int ta2 = 0x00040000 + ta0; int ta3 = 0x00060000 + ta0; int ts = CRTC.crtR10TxXCurr & 7; //テキスト桁境界からのずれ int da = dst << XEiJ.PNL_BM_OFFSET_BITS; //ARGB出力インデックス int db = da + XEiJ.pnlScreenWidth; //ARGB出力インデックスの終了位置 if (rh) { int half = XEiJ.pnlScreenWidth >> 4 << 3; sx += half; gx1st += half; gx2nd += half; gx3rd += half; gx4th += half; tc = tc + (half >> 3) & CRTC.crtMask511; da += half; } if (ts == 0) { //テキスト桁境界に合っているとき while (da < db) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st & 511])) != 0 ? ((q = VideoController.vcnPal16G8[p & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( q, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd & 511]) | 1]), (p = tp >>> 28) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx]])] : (p & 1) != 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd & 511]) | 1]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : ((p = VideoController.vcnPal16G8[(q = (GraphicScreen.graM4[gy4th | gx4th & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd & 511])) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd & 511]) | 1]), (p = tp >>> 28) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx]])] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); XEiJ.pnlBM[da + 1] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 1 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 1 & 511])) != 0 ? ((q = VideoController.vcnPal16G8[p & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( q, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 1 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 1 & 511]) | 1]), (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 1]])] : (p & 1) != 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 1 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 1 & 511]) | 1]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : ((p = VideoController.vcnPal16G8[(q = (GraphicScreen.graM4[gy4th | gx4th + 1 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 1 & 511])) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 1 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 1 & 511]) | 1]), (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 1]])] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]]); XEiJ.pnlBM[da + 2] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 2 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 2 & 511])) != 0 ? ((q = VideoController.vcnPal16G8[p & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( q, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 2 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 2 & 511]) | 1]), (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 2]])] : (p & 1) != 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 2 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 2 & 511]) | 1]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : ((p = VideoController.vcnPal16G8[(q = (GraphicScreen.graM4[gy4th | gx4th + 2 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 2 & 511])) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 2 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 2 & 511]) | 1]), (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 2]])] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]]); XEiJ.pnlBM[da + 3] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 3 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 3 & 511])) != 0 ? ((q = VideoController.vcnPal16G8[p & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( q, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 3 & 511]) | 1]), (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 3]])] : (p & 1) != 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 3 & 511]) | 1]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : ((p = VideoController.vcnPal16G8[(q = (GraphicScreen.graM4[gy4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 3 & 511])) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 3 & 511]) | 1]), (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 3]])] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]]); XEiJ.pnlBM[da + 4] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 4 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 4 & 511])) != 0 ? ((q = VideoController.vcnPal16G8[p & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( q, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 4 & 511]) | 1]), (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 4]])] : (p & 1) != 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 4 & 511]) | 1]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : ((p = VideoController.vcnPal16G8[(q = (GraphicScreen.graM4[gy4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 4 & 511])) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 4 & 511]) | 1]), (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 4]])] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]]); XEiJ.pnlBM[da + 5] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 5 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 5 & 511])) != 0 ? ((q = VideoController.vcnPal16G8[p & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( q, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 5 & 511]) | 1]), (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 5]])] : (p & 1) != 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 5 & 511]) | 1]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : ((p = VideoController.vcnPal16G8[(q = (GraphicScreen.graM4[gy4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 5 & 511])) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 5 & 511]) | 1]), (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 5]])] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]]); XEiJ.pnlBM[da + 6] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 6 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 6 & 511])) != 0 ? ((q = VideoController.vcnPal16G8[p & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( q, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 6 & 511]) | 1]), (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 6]])] : (p & 1) != 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 6 & 511]) | 1]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : ((p = VideoController.vcnPal16G8[(q = (GraphicScreen.graM4[gy4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 6 & 511])) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 6 & 511]) | 1]), (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 6]])] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]]); XEiJ.pnlBM[da + 7] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 7 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 7 & 511])) != 0 ? ((q = VideoController.vcnPal16G8[p & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( q, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 7 & 511]) | 1]), (p = tp & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 7]])] : (p & 1) != 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 7 & 511]) | 1]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : ((p = VideoController.vcnPal16G8[(q = (GraphicScreen.graM4[gy4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 7 & 511])) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 7 & 511]) | 1]), (p = tp & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 7]])] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]]); sx += 8; gx1st += 8; gx2nd += 8; gx3rd += 8; gx4th += 8; da += 8; } //while da<db } else { //テキスト桁境界に合っていないとき // ts=1のとき int tt = ts + 8; //tt=9 ts += 16; //ts=17 // ........ ........ ........ 01234567 m8[ta0+tc] int p0 = MainMemory.mmrM8[ta0 + tc] << ts; //.......0 1234567_ ________ ________ p0=m8[ta0+tc]<<ts int p1 = MainMemory.mmrM8[ta1 + tc] << ts; int p2 = MainMemory.mmrM8[ta2 + tc] << ts; int p3 = MainMemory.mmrM8[ta3 + tc] << ts; tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 while (da < db) { // ........ ........ .1234567 ________ p0>>tt // ........ ........ .1234567 89abcdef p0>>tt|m8[ta0+tc]&255 p0 = (p0 >> tt | MainMemory.mmrM8[ta0 + tc] & 255) << ts; //12345678 9abcdef_ ________ ________ p0=(p0>>tt|m8[ta0+tc]&255)<<ts p1 = (p1 >> tt | MainMemory.mmrM8[ta1 + tc] & 255) << ts; //~~~~~~~~ p2 = (p2 >> tt | MainMemory.mmrM8[ta2 + tc] & 255) << ts; //ここを使う p3 = (p3 >> tt | MainMemory.mmrM8[ta3 + tc] & 255) << ts; int tp = (VideoController.VCN_TXP3[p3 >>> 24] | VideoController.VCN_TXP2[p2 >>> 24] | VideoController.VCN_TXP1[p1 >>> 24] | VideoController.VCN_TXP0[p0 >>> 24]); //符号なし右シフトで&255を省略 tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st & 511])) != 0 ? ((q = VideoController.vcnPal16G8[p & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( q, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd & 511]) | 1]), (p = tp >>> 28) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx]])] : (p & 1) != 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd & 511]) | 1]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : ((p = VideoController.vcnPal16G8[(q = (GraphicScreen.graM4[gy4th | gx4th & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd & 511])) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd & 511]) | 1]), (p = tp >>> 28) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx]])] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); XEiJ.pnlBM[da + 1] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 1 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 1 & 511])) != 0 ? ((q = VideoController.vcnPal16G8[p & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( q, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 1 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 1 & 511]) | 1]), (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 1]])] : (p & 1) != 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 1 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 1 & 511]) | 1]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : ((p = VideoController.vcnPal16G8[(q = (GraphicScreen.graM4[gy4th | gx4th + 1 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 1 & 511])) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 1 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 1 & 511]) | 1]), (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 1]])] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]]); XEiJ.pnlBM[da + 2] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 2 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 2 & 511])) != 0 ? ((q = VideoController.vcnPal16G8[p & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( q, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 2 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 2 & 511]) | 1]), (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 2]])] : (p & 1) != 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 2 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 2 & 511]) | 1]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : ((p = VideoController.vcnPal16G8[(q = (GraphicScreen.graM4[gy4th | gx4th + 2 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 2 & 511])) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 2 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 2 & 511]) | 1]), (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 2]])] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]]); XEiJ.pnlBM[da + 3] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 3 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 3 & 511])) != 0 ? ((q = VideoController.vcnPal16G8[p & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( q, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 3 & 511]) | 1]), (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 3]])] : (p & 1) != 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 3 & 511]) | 1]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : ((p = VideoController.vcnPal16G8[(q = (GraphicScreen.graM4[gy4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 3 & 511])) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 3 & 511]) | 1]), (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 3]])] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]]); XEiJ.pnlBM[da + 4] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 4 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 4 & 511])) != 0 ? ((q = VideoController.vcnPal16G8[p & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( q, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 4 & 511]) | 1]), (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 4]])] : (p & 1) != 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 4 & 511]) | 1]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : ((p = VideoController.vcnPal16G8[(q = (GraphicScreen.graM4[gy4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 4 & 511])) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 4 & 511]) | 1]), (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 4]])] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]]); XEiJ.pnlBM[da + 5] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 5 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 5 & 511])) != 0 ? ((q = VideoController.vcnPal16G8[p & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( q, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 5 & 511]) | 1]), (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 5]])] : (p & 1) != 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 5 & 511]) | 1]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : ((p = VideoController.vcnPal16G8[(q = (GraphicScreen.graM4[gy4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 5 & 511])) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 5 & 511]) | 1]), (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 5]])] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]]); XEiJ.pnlBM[da + 6] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 6 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 6 & 511])) != 0 ? ((q = VideoController.vcnPal16G8[p & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( q, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 6 & 511]) | 1]), (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 6]])] : (p & 1) != 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 6 & 511]) | 1]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : ((p = VideoController.vcnPal16G8[(q = (GraphicScreen.graM4[gy4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 6 & 511])) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 6 & 511]) | 1]), (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 6]])] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]]); XEiJ.pnlBM[da + 7] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 7 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 7 & 511])) != 0 ? ((q = VideoController.vcnPal16G8[p & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( q, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 7 & 511]) | 1]), (p = tp & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 7]])] : (p & 1) != 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 7 & 511]) | 1]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : ((p = VideoController.vcnPal16G8[(q = (GraphicScreen.graM4[gy4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 7 & 511])) & -2]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( p, VideoController.vcnPal16G8[(GraphicScreen.graM4[gz4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gz3rd | gx3rd + 7 & 511]) | 1]), (p = tp & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 7]])] : (p = VideoController.vcnPal16G8[q]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]]); sx += 8; gx1st += 8; gx2nd += 8; gx3rd += 8; gx4th += 8; da += 8; } //while da<db } //if ts==0 } //drawRaster }, //F2TS_XHCGT //================================================================================ //F2TS_XHPT ($0001,$24xx,$1D6F) // 概要 // F2TS 512ドット256色2プレーン>テキスト>スプライト // XHPT 1番目のパレットが3以上の奇数のときそれを偶数化したパレットのカラーと奥のスプライト・テキストのカラーを混ぜる // 手順 // 1番目のパレットが0のとき // 2番目のパレットを偶数化したパレットのカラーが0でないとき // 2番目のパレットを偶数化したパレットのカラー // さもなくば(2番目のパレットを偶数化したパレットのカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // 1番目のパレットが1のとき // グラフィックパレット0のカラーが0でないとき // グラフィックパレット0のカラー // さもなくば(グラフィックパレット0のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // 1番目のパレットが2以上の偶数のとき // 1番目のカラーが0でないとき // 1番目のカラー // さもなくば(1番目のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // さもなくば(1番目のパレットが3以上の奇数のとき) // 1番目のパレットを偶数化したパレットのカラーと // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // を混ぜたカラー(0は黒) // 中間コード1 // (f1p()==0?(fpc(tev(f2p()))!=0?fpc(tev(f2p())):(txp()!=0?tpc(txp()):spc(spp()))):f1p()==1?(fpc(0)!=0?fpc(0):(txp()!=0?tpc(txp()):spc(spp()))):ls1(f1p())==0?(fpc(f1p())!=0?fpc(f1p()):(txp()!=0?tpc(txp()):spc(spp()))):mix(fpc(tev(f1p())),(txp()!=0?tpc(txp()):spc(spp())))) // 中間コード2 // f1p()==0?fpc(tev(f2p()))!=0?fpc(tev(f2p())):txp()!=0?tpc(txp()):spc(spp()):f1p()==1?fpc(0)!=0?fpc(0):txp()!=0?tpc(txp()):spc(spp()):ls1(f1p())==0?fpc(f1p())!=0?fpc(f1p()):txp()!=0?tpc(txp()):spc(spp()):mix(fpc(tev(f1p())),txp()!=0?tpc(txp()):spc(spp())) // 中間コード3 // (v0=f1p())==0?(v1=fpc(tev(f2p())))!=0?v1:(v4=txp())!=0?tpc(v4):spc(spp()):v0==1?(v8=fpc(0))!=0?v8:(v9=txp())!=0?tpc(v9):spc(spp()):ls1(v0)==0?(v14=fpc(v0))!=0?v14:(v15=txp())!=0?tpc(v15):spc(spp()):mix(fpc(tev(v0)),(v22=txp())!=0?tpc(v22):spc(spp())) // 中間コード4 // (p=f1p())==0?(p=fpc(tev(f2p())))!=0?p:(p=txp())!=0?tpc(p):spc(spp()):p==1?(p=fpc(0))!=0?p:(p=txp())!=0?tpc(p):spc(spp()):ls1(p)==0?(q=fpc(p))!=0?q:(p=txp())!=0?tpc(p):spc(spp()):mix(fpc(tev(p)),(p=txp())!=0?tpc(p):spc(spp())) // 中間コード5 // (p=f1p())==0?(p=fpc(f2p()&-2))!=0?p:(p=txp())!=0?tpc(p):spc(spp()):p==1?(p=fpc(0))!=0?p:(p=txp())!=0?tpc(p):spc(spp()):(p&1)==0?(q=fpc(p))!=0?q:(p=txp())!=0?tpc(p):spc(spp()):mix(fpc(p&-2),(p=txp())!=0?tpc(p):spc(spp())) // 中間コード6 // (p=f1p())==0?(p=fpc(f2p()&-2))!=0?cto(p):(p=txp())!=0?tpo(p):spo(spp()):p==1?(p=fpc(0))!=0?cto(p):(p=txp())!=0?tpo(p):spo(spp()):(p&1)==0?(q=fpc(p))!=0?cto(q):(p=txp())!=0?tpo(p):spo(spp()):cto(mix(fpc(p&-2),(p=txp())!=0?tpc(p):spc(spp()))) F2TS_XHPT { @Override public void drawRaster (int src, int dst, boolean rh) { SpriteScreen.sprStep3 (); int sx = 16; //スプライトx座標 int pn = VideoController.vcnReg2Curr & 3; //1番目のパレットのbit3-0のGVRAMページ番号 int gx1st = CRTC.crtR12GrXCurr[pn]; int gy1st = VideoController.vcnVisible1st + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); pn = VideoController.vcnReg2Curr >> 2 & 3; //1番目のパレットのbit7-4のGVRAMページ番号 int gx2nd = CRTC.crtR12GrXCurr[pn]; int gy2nd = VideoController.vcnVisible2nd + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); pn = VideoController.vcnReg2Curr >> 4 & 3; //2番目のパレットのbit3-0のGVRAMページ番号 int gx3rd = CRTC.crtR12GrXCurr[pn]; int gy3rd = VideoController.vcnVisible3rd + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); pn = VideoController.vcnReg2Curr >> 6 & 3; //2番目のパレットのbit7-4のGVRAMページ番号 int gx4th = CRTC.crtR12GrXCurr[pn]; int gy4th = VideoController.vcnVisible4th + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); int ty = CRTC.crtR11TxYZero + src & 1023; //ラスタ int tc = (ty & CRTC.crtMask3) << 7 | CRTC.crtR10TxXCurr >> 3; //テキスト桁位置 int ta0 = 0x00e00000 + ((ty & CRTC.crtMaskMinus4) << 7); //ラスタブロックアドレス int ta1 = 0x00020000 + ta0; int ta2 = 0x00040000 + ta0; int ta3 = 0x00060000 + ta0; int ts = CRTC.crtR10TxXCurr & 7; //テキスト桁境界からのずれ int da = dst << XEiJ.PNL_BM_OFFSET_BITS; //ARGB出力インデックス int db = da + XEiJ.pnlScreenWidth; //ARGB出力インデックスの終了位置 if (rh) { int half = XEiJ.pnlScreenWidth >> 4 << 3; sx += half; gx1st += half; gx2nd += half; gx3rd += half; gx4th += half; tc = tc + (half >> 3) & CRTC.crtMask511; da += half; } if (ts == 0) { //テキスト桁境界に合っているとき while (da < db) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 28) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx]])]); XEiJ.pnlBM[da + 1] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 1 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 1 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 1 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 1 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 1]])]); XEiJ.pnlBM[da + 2] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 2 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 2 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 2 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 2 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 2]])]); XEiJ.pnlBM[da + 3] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 3 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 3 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 3 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 3]])]); XEiJ.pnlBM[da + 4] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 4 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 4 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 4 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 4]])]); XEiJ.pnlBM[da + 5] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 5 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 5 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 5 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 5]])]); XEiJ.pnlBM[da + 6] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 6 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 6 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 6 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 6]])]); XEiJ.pnlBM[da + 7] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 7 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 7 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 7 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 7]])]); sx += 8; gx1st += 8; gx2nd += 8; gx3rd += 8; gx4th += 8; da += 8; } //while da<db } else { //テキスト桁境界に合っていないとき // ts=1のとき int tt = ts + 8; //tt=9 ts += 16; //ts=17 // ........ ........ ........ 01234567 m8[ta0+tc] int p0 = MainMemory.mmrM8[ta0 + tc] << ts; //.......0 1234567_ ________ ________ p0=m8[ta0+tc]<<ts int p1 = MainMemory.mmrM8[ta1 + tc] << ts; int p2 = MainMemory.mmrM8[ta2 + tc] << ts; int p3 = MainMemory.mmrM8[ta3 + tc] << ts; tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 while (da < db) { // ........ ........ .1234567 ________ p0>>tt // ........ ........ .1234567 89abcdef p0>>tt|m8[ta0+tc]&255 p0 = (p0 >> tt | MainMemory.mmrM8[ta0 + tc] & 255) << ts; //12345678 9abcdef_ ________ ________ p0=(p0>>tt|m8[ta0+tc]&255)<<ts p1 = (p1 >> tt | MainMemory.mmrM8[ta1 + tc] & 255) << ts; //~~~~~~~~ p2 = (p2 >> tt | MainMemory.mmrM8[ta2 + tc] & 255) << ts; //ここを使う p3 = (p3 >> tt | MainMemory.mmrM8[ta3 + tc] & 255) << ts; int tp = (VideoController.VCN_TXP3[p3 >>> 24] | VideoController.VCN_TXP2[p2 >>> 24] | VideoController.VCN_TXP1[p1 >>> 24] | VideoController.VCN_TXP0[p0 >>> 24]); //符号なし右シフトで&255を省略 tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 28) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx]])]); XEiJ.pnlBM[da + 1] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 1 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 1 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 1 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 1 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 1]])]); XEiJ.pnlBM[da + 2] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 2 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 2 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 2 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 2 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 2]])]); XEiJ.pnlBM[da + 3] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 3 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 3 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 3 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 3]])]); XEiJ.pnlBM[da + 4] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 4 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 4 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 4 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 4]])]); XEiJ.pnlBM[da + 5] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 5 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 5 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 5 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 5]])]); XEiJ.pnlBM[da + 6] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 6 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 6 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 6 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 6]])]); XEiJ.pnlBM[da + 7] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 7 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 7 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 7 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 7]])]); sx += 8; gx1st += 8; gx2nd += 8; gx3rd += 8; gx4th += 8; da += 8; } //while da<db } //if ts==0 } //drawRaster }, //F2TS_XHPT //================================================================================ //F2TS_XHPG ($0001,$24xx,$1E6F) // 概要 // F2TS 512ドット256色2プレーン>テキスト>スプライト // XHPG 1番目のパレットが3以上の奇数のときそれを偶数化したパレットのカラーと2番目のパレットを奇数化したパレットのカラーを混ぜる // 手順 // 1番目のパレットが0のとき // 2番目のパレットを偶数化したパレットのカラーが0でないとき // 2番目のパレットを偶数化したパレットのカラー // さもなくば(2番目のパレットを偶数化したパレットのカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // 1番目のパレットが1のとき // グラフィックパレット0のカラーが0でないとき // グラフィックパレット0のカラー // さもなくば(グラフィックパレット0のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // 1番目のパレットが2以上の偶数のとき // 1番目のカラーが0でないとき // 1番目のカラー // さもなくば(1番目のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // さもなくば(1番目のパレットが3以上の奇数のとき) // 1番目のパレットを偶数化したパレットのカラーと2番目のパレットを奇数化したパレットのカラーを混ぜたカラーが0でないとき // 1番目のパレットを偶数化したパレットのカラーと2番目のパレットを奇数化したパレットのカラーを混ぜたカラー // さもなくば(1番目のパレットを偶数化したパレットのカラーと2番目のパレットを奇数化したパレットのカラーを混ぜたカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // 中間コード1 // (f1p()==0?(fpc(tev(f2p()))!=0?fpc(tev(f2p())):(txp()!=0?tpc(txp()):spc(spp()))):f1p()==1?(fpc(0)!=0?fpc(0):(txp()!=0?tpc(txp()):spc(spp()))):ls1(f1p())==0?(fpc(f1p())!=0?fpc(f1p()):(txp()!=0?tpc(txp()):spc(spp()))):(mix(fpc(tev(f1p())),fpc(tod(f2p())))!=0?mix(fpc(tev(f1p())),fpc(tod(f2p()))):(txp()!=0?tpc(txp()):spc(spp())))) // 中間コード2 // f1p()==0?fpc(tev(f2p()))!=0?fpc(tev(f2p())):txp()!=0?tpc(txp()):spc(spp()):f1p()==1?fpc(0)!=0?fpc(0):txp()!=0?tpc(txp()):spc(spp()):ls1(f1p())==0?fpc(f1p())!=0?fpc(f1p()):txp()!=0?tpc(txp()):spc(spp()):mix(fpc(tev(f1p())),fpc(tod(f2p())))!=0?mix(fpc(tev(f1p())),fpc(tod(f2p()))):txp()!=0?tpc(txp()):spc(spp()) // 中間コード3 // (v0=f1p())==0?(v1=fpc(tev(f2p())))!=0?v1:(v4=txp())!=0?tpc(v4):spc(spp()):v0==1?(v8=fpc(0))!=0?v8:(v9=txp())!=0?tpc(v9):spc(spp()):ls1(v0)==0?(v14=fpc(v0))!=0?v14:(v15=txp())!=0?tpc(v15):spc(spp()):(v19=mix(fpc(tev(v0)),fpc(tod(f2p()))))!=0?v19:(v25=txp())!=0?tpc(v25):spc(spp()) // 中間コード4 // (p=f1p())==0?(p=fpc(tev(f2p())))!=0?p:(p=txp())!=0?tpc(p):spc(spp()):p==1?(p=fpc(0))!=0?p:(p=txp())!=0?tpc(p):spc(spp()):ls1(p)==0?(q=fpc(p))!=0?q:(p=txp())!=0?tpc(p):spc(spp()):(q=mix(fpc(tev(p)),fpc(tod(f2p()))))!=0?q:(p=txp())!=0?tpc(p):spc(spp()) // 中間コード5 // (p=f1p())==0?(p=fpc(f2p()&-2))!=0?p:(p=txp())!=0?tpc(p):spc(spp()):p==1?(p=fpc(0))!=0?p:(p=txp())!=0?tpc(p):spc(spp()):(p&1)==0?(q=fpc(p))!=0?q:(p=txp())!=0?tpc(p):spc(spp()):(q=mix(fpc(p&-2),fpc(f2p()|1)))!=0?q:(p=txp())!=0?tpc(p):spc(spp()) // 中間コード6 // (p=f1p())==0?(p=fpc(f2p()&-2))!=0?cto(p):(p=txp())!=0?tpo(p):spo(spp()):p==1?(p=fpc(0))!=0?cto(p):(p=txp())!=0?tpo(p):spo(spp()):(p&1)==0?(q=fpc(p))!=0?cto(q):(p=txp())!=0?tpo(p):spo(spp()):(q=mix(fpc(p&-2),fpc(f2p()|1)))!=0?cto(q):(p=txp())!=0?tpo(p):spo(spp()) F2TS_XHPG { @Override public void drawRaster (int src, int dst, boolean rh) { SpriteScreen.sprStep3 (); int sx = 16; //スプライトx座標 int pn = VideoController.vcnReg2Curr & 3; //1番目のパレットのbit3-0のGVRAMページ番号 int gx1st = CRTC.crtR12GrXCurr[pn]; int gy1st = VideoController.vcnVisible1st + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); pn = VideoController.vcnReg2Curr >> 2 & 3; //1番目のパレットのbit7-4のGVRAMページ番号 int gx2nd = CRTC.crtR12GrXCurr[pn]; int gy2nd = VideoController.vcnVisible2nd + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); pn = VideoController.vcnReg2Curr >> 4 & 3; //2番目のパレットのbit3-0のGVRAMページ番号 int gx3rd = CRTC.crtR12GrXCurr[pn]; int gy3rd = VideoController.vcnVisible3rd + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); pn = VideoController.vcnReg2Curr >> 6 & 3; //2番目のパレットのbit7-4のGVRAMページ番号 int gx4th = CRTC.crtR12GrXCurr[pn]; int gy4th = VideoController.vcnVisible4th + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); int ty = CRTC.crtR11TxYZero + src & 1023; //ラスタ int tc = (ty & CRTC.crtMask3) << 7 | CRTC.crtR10TxXCurr >> 3; //テキスト桁位置 int ta0 = 0x00e00000 + ((ty & CRTC.crtMaskMinus4) << 7); //ラスタブロックアドレス int ta1 = 0x00020000 + ta0; int ta2 = 0x00040000 + ta0; int ta3 = 0x00060000 + ta0; int ts = CRTC.crtR10TxXCurr & 7; //テキスト桁境界からのずれ int da = dst << XEiJ.PNL_BM_OFFSET_BITS; //ARGB出力インデックス int db = da + XEiJ.pnlScreenWidth; //ARGB出力インデックスの終了位置 if (rh) { int half = XEiJ.pnlScreenWidth >> 4 << 3; sx += half; gx1st += half; gx2nd += half; gx3rd += half; gx4th += half; tc = tc + (half >> 3) & CRTC.crtMask511; da += half; } if (ts == 0) { //テキスト桁境界に合っているとき while (da < db) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : (q = VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd & 511]) | 1])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); XEiJ.pnlBM[da + 1] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 1 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 1 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 1 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 1 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : (q = VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 1 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 1 & 511]) | 1])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]]); XEiJ.pnlBM[da + 2] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 2 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 2 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 2 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 2 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : (q = VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 2 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 2 & 511]) | 1])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]]); XEiJ.pnlBM[da + 3] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 3 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 3 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 3 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : (q = VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 3 & 511]) | 1])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]]); XEiJ.pnlBM[da + 4] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 4 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 4 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 4 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : (q = VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 4 & 511]) | 1])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]]); XEiJ.pnlBM[da + 5] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 5 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 5 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 5 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : (q = VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 5 & 511]) | 1])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]]); XEiJ.pnlBM[da + 6] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 6 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 6 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 6 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : (q = VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 6 & 511]) | 1])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]]); XEiJ.pnlBM[da + 7] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 7 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 7 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 7 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : (q = VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 7 & 511]) | 1])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]]); sx += 8; gx1st += 8; gx2nd += 8; gx3rd += 8; gx4th += 8; da += 8; } //while da<db } else { //テキスト桁境界に合っていないとき // ts=1のとき int tt = ts + 8; //tt=9 ts += 16; //ts=17 // ........ ........ ........ 01234567 m8[ta0+tc] int p0 = MainMemory.mmrM8[ta0 + tc] << ts; //.......0 1234567_ ________ ________ p0=m8[ta0+tc]<<ts int p1 = MainMemory.mmrM8[ta1 + tc] << ts; int p2 = MainMemory.mmrM8[ta2 + tc] << ts; int p3 = MainMemory.mmrM8[ta3 + tc] << ts; tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 while (da < db) { // ........ ........ .1234567 ________ p0>>tt // ........ ........ .1234567 89abcdef p0>>tt|m8[ta0+tc]&255 p0 = (p0 >> tt | MainMemory.mmrM8[ta0 + tc] & 255) << ts; //12345678 9abcdef_ ________ ________ p0=(p0>>tt|m8[ta0+tc]&255)<<ts p1 = (p1 >> tt | MainMemory.mmrM8[ta1 + tc] & 255) << ts; //~~~~~~~~ p2 = (p2 >> tt | MainMemory.mmrM8[ta2 + tc] & 255) << ts; //ここを使う p3 = (p3 >> tt | MainMemory.mmrM8[ta3 + tc] & 255) << ts; int tp = (VideoController.VCN_TXP3[p3 >>> 24] | VideoController.VCN_TXP2[p2 >>> 24] | VideoController.VCN_TXP1[p1 >>> 24] | VideoController.VCN_TXP0[p0 >>> 24]); //符号なし右シフトで&255を省略 tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : (q = VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd & 511]) | 1])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); XEiJ.pnlBM[da + 1] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 1 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 1 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 1 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 1 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : (q = VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 1 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 1 & 511]) | 1])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]]); XEiJ.pnlBM[da + 2] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 2 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 2 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 2 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 2 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : (q = VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 2 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 2 & 511]) | 1])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]]); XEiJ.pnlBM[da + 3] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 3 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 3 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 3 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : (q = VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 3 & 511]) | 1])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]]); XEiJ.pnlBM[da + 4] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 4 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 4 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 4 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : (q = VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 4 & 511]) | 1])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]]); XEiJ.pnlBM[da + 5] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 5 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 5 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 5 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : (q = VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 5 & 511]) | 1])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]]); XEiJ.pnlBM[da + 6] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 6 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 6 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 6 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : (q = VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 6 & 511]) | 1])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]]); XEiJ.pnlBM[da + 7] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 7 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 7 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 7 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : (q = VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 7 & 511]) | 1])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]]); sx += 8; gx1st += 8; gx2nd += 8; gx3rd += 8; gx4th += 8; da += 8; } //while da<db } //if ts==0 } //drawRaster }, //F2TS_XHPG //================================================================================ //F2TS_XHPGT ($0001,$24xx,$1F6F) // 概要 // F2TS 512ドット256色2プレーン>テキスト>スプライト // XHPGT 1番目のパレットが3以上の奇数のときそれを偶数化したパレットのカラーと2番目のパレットを奇数化したパレットのカラーを混ぜてさらに奥のスプライト・テキストのカラーを混ぜる // 手順 // 1番目のパレットが0のとき // 2番目のパレットを偶数化したパレットのカラーが0でないとき // 2番目のパレットを偶数化したパレットのカラー // さもなくば(2番目のパレットを偶数化したパレットのカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // 1番目のパレットが1のとき // グラフィックパレット0のカラーが0でないとき // グラフィックパレット0のカラー // さもなくば(グラフィックパレット0のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // 1番目のパレットが2以上の偶数のとき // 1番目のカラーが0でないとき // 1番目のカラー // さもなくば(1番目のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // さもなくば(1番目のパレットが3以上の奇数のとき) // 1番目のパレットを偶数化したパレットのカラーと2番目のパレットを奇数化したパレットのカラーを混ぜたカラーにさらに // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // を混ぜたカラー(0は黒) // 中間コード1 // (f1p()==0?(fpc(tev(f2p()))!=0?fpc(tev(f2p())):(txp()!=0?tpc(txp()):spc(spp()))):f1p()==1?(fpc(0)!=0?fpc(0):(txp()!=0?tpc(txp()):spc(spp()))):ls1(f1p())==0?(fpc(f1p())!=0?fpc(f1p()):(txp()!=0?tpc(txp()):spc(spp()))):mix(mix(fpc(tev(f1p())),fpc(tod(f2p()))),(txp()!=0?tpc(txp()):spc(spp())))) // 中間コード2 // f1p()==0?fpc(tev(f2p()))!=0?fpc(tev(f2p())):txp()!=0?tpc(txp()):spc(spp()):f1p()==1?fpc(0)!=0?fpc(0):txp()!=0?tpc(txp()):spc(spp()):ls1(f1p())==0?fpc(f1p())!=0?fpc(f1p()):txp()!=0?tpc(txp()):spc(spp()):mix(mix(fpc(tev(f1p())),fpc(tod(f2p()))),txp()!=0?tpc(txp()):spc(spp())) // 中間コード3 // (v0=f1p())==0?(v1=fpc(tev(f2p())))!=0?v1:(v4=txp())!=0?tpc(v4):spc(spp()):v0==1?(v8=fpc(0))!=0?v8:(v9=txp())!=0?tpc(v9):spc(spp()):ls1(v0)==0?(v14=fpc(v0))!=0?v14:(v15=txp())!=0?tpc(v15):spc(spp()):mix(mix(fpc(tev(v0)),fpc(tod(f2p()))),(v26=txp())!=0?tpc(v26):spc(spp())) // 中間コード4 // (p=f1p())==0?(p=fpc(tev(f2p())))!=0?p:(p=txp())!=0?tpc(p):spc(spp()):p==1?(p=fpc(0))!=0?p:(p=txp())!=0?tpc(p):spc(spp()):ls1(p)==0?(q=fpc(p))!=0?q:(p=txp())!=0?tpc(p):spc(spp()):mix(mix(fpc(tev(p)),fpc(tod(f2p()))),(p=txp())!=0?tpc(p):spc(spp())) // 中間コード5 // (p=f1p())==0?(p=fpc(f2p()&-2))!=0?p:(p=txp())!=0?tpc(p):spc(spp()):p==1?(p=fpc(0))!=0?p:(p=txp())!=0?tpc(p):spc(spp()):(p&1)==0?(q=fpc(p))!=0?q:(p=txp())!=0?tpc(p):spc(spp()):mix(mix(fpc(p&-2),fpc(f2p()|1)),(p=txp())!=0?tpc(p):spc(spp())) // 中間コード6 // (p=f1p())==0?(p=fpc(f2p()&-2))!=0?cto(p):(p=txp())!=0?tpo(p):spo(spp()):p==1?(p=fpc(0))!=0?cto(p):(p=txp())!=0?tpo(p):spo(spp()):(p&1)==0?(q=fpc(p))!=0?cto(q):(p=txp())!=0?tpo(p):spo(spp()):cto(mix(mix(fpc(p&-2),fpc(f2p()|1)),(p=txp())!=0?tpc(p):spc(spp()))) F2TS_XHPGT { @Override public void drawRaster (int src, int dst, boolean rh) { SpriteScreen.sprStep3 (); int sx = 16; //スプライトx座標 int pn = VideoController.vcnReg2Curr & 3; //1番目のパレットのbit3-0のGVRAMページ番号 int gx1st = CRTC.crtR12GrXCurr[pn]; int gy1st = VideoController.vcnVisible1st + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); pn = VideoController.vcnReg2Curr >> 2 & 3; //1番目のパレットのbit7-4のGVRAMページ番号 int gx2nd = CRTC.crtR12GrXCurr[pn]; int gy2nd = VideoController.vcnVisible2nd + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); pn = VideoController.vcnReg2Curr >> 4 & 3; //2番目のパレットのbit3-0のGVRAMページ番号 int gx3rd = CRTC.crtR12GrXCurr[pn]; int gy3rd = VideoController.vcnVisible3rd + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); pn = VideoController.vcnReg2Curr >> 6 & 3; //2番目のパレットのbit7-4のGVRAMページ番号 int gx4th = CRTC.crtR12GrXCurr[pn]; int gy4th = VideoController.vcnVisible4th + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); int ty = CRTC.crtR11TxYZero + src & 1023; //ラスタ int tc = (ty & CRTC.crtMask3) << 7 | CRTC.crtR10TxXCurr >> 3; //テキスト桁位置 int ta0 = 0x00e00000 + ((ty & CRTC.crtMaskMinus4) << 7); //ラスタブロックアドレス int ta1 = 0x00020000 + ta0; int ta2 = 0x00040000 + ta0; int ta3 = 0x00060000 + ta0; int ts = CRTC.crtR10TxXCurr & 7; //テキスト桁境界からのずれ int da = dst << XEiJ.PNL_BM_OFFSET_BITS; //ARGB出力インデックス int db = da + XEiJ.pnlScreenWidth; //ARGB出力インデックスの終了位置 if (rh) { int half = XEiJ.pnlScreenWidth >> 4 << 3; sx += half; gx1st += half; gx2nd += half; gx3rd += half; gx4th += half; tc = tc + (half >> 3) & CRTC.crtMask511; da += half; } if (ts == 0) { //テキスト桁境界に合っているとき while (da < db) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd & 511]) | 1]), (p = tp >>> 28) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx]])]); XEiJ.pnlBM[da + 1] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 1 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 1 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 1 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 1 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 1 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 1 & 511]) | 1]), (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 1]])]); XEiJ.pnlBM[da + 2] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 2 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 2 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 2 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 2 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 2 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 2 & 511]) | 1]), (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 2]])]); XEiJ.pnlBM[da + 3] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 3 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 3 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 3 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 3 & 511]) | 1]), (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 3]])]); XEiJ.pnlBM[da + 4] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 4 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 4 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 4 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 4 & 511]) | 1]), (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 4]])]); XEiJ.pnlBM[da + 5] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 5 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 5 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 5 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 5 & 511]) | 1]), (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 5]])]); XEiJ.pnlBM[da + 6] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 6 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 6 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 6 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 6 & 511]) | 1]), (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 6]])]); XEiJ.pnlBM[da + 7] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 7 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 7 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 7 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 7 & 511]) | 1]), (p = tp & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 7]])]); sx += 8; gx1st += 8; gx2nd += 8; gx3rd += 8; gx4th += 8; da += 8; } //while da<db } else { //テキスト桁境界に合っていないとき // ts=1のとき int tt = ts + 8; //tt=9 ts += 16; //ts=17 // ........ ........ ........ 01234567 m8[ta0+tc] int p0 = MainMemory.mmrM8[ta0 + tc] << ts; //.......0 1234567_ ________ ________ p0=m8[ta0+tc]<<ts int p1 = MainMemory.mmrM8[ta1 + tc] << ts; int p2 = MainMemory.mmrM8[ta2 + tc] << ts; int p3 = MainMemory.mmrM8[ta3 + tc] << ts; tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 while (da < db) { // ........ ........ .1234567 ________ p0>>tt // ........ ........ .1234567 89abcdef p0>>tt|m8[ta0+tc]&255 p0 = (p0 >> tt | MainMemory.mmrM8[ta0 + tc] & 255) << ts; //12345678 9abcdef_ ________ ________ p0=(p0>>tt|m8[ta0+tc]&255)<<ts p1 = (p1 >> tt | MainMemory.mmrM8[ta1 + tc] & 255) << ts; //~~~~~~~~ p2 = (p2 >> tt | MainMemory.mmrM8[ta2 + tc] & 255) << ts; //ここを使う p3 = (p3 >> tt | MainMemory.mmrM8[ta3 + tc] & 255) << ts; int tp = (VideoController.VCN_TXP3[p3 >>> 24] | VideoController.VCN_TXP2[p2 >>> 24] | VideoController.VCN_TXP1[p1 >>> 24] | VideoController.VCN_TXP0[p0 >>> 24]); //符号なし右シフトで&255を省略 tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd & 511]) | 1]), (p = tp >>> 28) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx]])]); XEiJ.pnlBM[da + 1] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 1 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 1 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 1 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 1 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 1 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 1 & 511]) | 1]), (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 1]])]); XEiJ.pnlBM[da + 2] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 2 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 2 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 2 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 2 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 2 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 2 & 511]) | 1]), (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 2]])]); XEiJ.pnlBM[da + 3] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 3 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 3 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 3 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 3 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 3 & 511]) | 1]), (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 3]])]); XEiJ.pnlBM[da + 4] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 4 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 4 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 4 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 4 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 4 & 511]) | 1]), (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 4]])]); XEiJ.pnlBM[da + 5] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 5 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 5 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 5 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 5 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 5 & 511]) | 1]), (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 5]])]); XEiJ.pnlBM[da + 6] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 6 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 6 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 6 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 6 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 6 & 511]) | 1]), (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 6]])]); XEiJ.pnlBM[da + 7] = ((p = (GraphicScreen.graM4[gy2nd | gx2nd + 7 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 7 & 511])) == 0 ? (p = VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 7 & 511]) & -2]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : p == 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], VideoController.vcnPal16G8[(GraphicScreen.graM4[gy4th | gx4th + 7 & 511] << 4 | GraphicScreen.graM4[gy3rd | gx3rd + 7 & 511]) | 1]), (p = tp & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 7]])]); sx += 8; gx1st += 8; gx2nd += 8; gx3rd += 8; gx4th += 8; da += 8; } //while da<db } //if ts==0 } //drawRaster }, //F2TS_XHPGT //================================================================================ //GTS ($0003,$24xx,$006F) // 概要 // GTS 512ドット65536色1プレーン>テキスト>スプライト // 拡張なし // 手順 // 1番目のカラーが0でないとき // 1番目のカラー // さもなくば(1番目のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // 中間コード1 // (gpc(g1p(),g1p())!=0?gpc(g1p(),g1p()):(txp()!=0?tpc(txp()):spc(spp()))) // 中間コード2 // gpc(g1p(),g1p())!=0?gpc(g1p(),g1p()):txp()!=0?tpc(txp()):spc(spp()) // 中間コード3 // (v0=gpc(v1=g1p(),v1))!=0?v0:(v2=txp())!=0?tpc(v2):spc(spp()) // 中間コード4 // (p=gpc(q=g1p(),q))!=0?p:(p=txp())!=0?tpc(p):spc(spp()) // 中間コード5 // (p=gpc(q=g1p(),q))!=0?p:(p=txp())!=0?tpc(p):spc(spp()) // 中間コード6 // (p=gpc(q=g1p(),q))!=0?cto(p):(p=txp())!=0?tpo(p):spo(spp()) GTS { @Override public void drawRaster (int src, int dst, boolean rh) { SpriteScreen.sprStep3 (); int sx = 16; //スプライトx座標 int pn = VideoController.vcnReg2Curr & 3; //1番目のパレットのbit3-0のGVRAMページ番号 int gx1st = CRTC.crtR12GrXCurr[pn]; int gy1st = (pn << 18) + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); pn = VideoController.vcnReg2Curr >> 2 & 3; //1番目のパレットのbit7-4のGVRAMページ番号 int gx2nd = CRTC.crtR12GrXCurr[pn]; int gy2nd = (pn << 18) + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); pn = VideoController.vcnReg2Curr >> 4 & 3; //1番目のパレットのbit11-8のGVRAMページ番号 int gx3rd = CRTC.crtR12GrXCurr[pn]; int gy3rd = (pn << 18) + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); pn = VideoController.vcnReg2Curr >> 6 & 3; //1番目のパレットのbit15-12のGVRAMページ番号 int gx4th = CRTC.crtR12GrXCurr[pn]; int gy4th = (pn << 18) + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); int ty = CRTC.crtR11TxYZero + src & 1023; //ラスタ int tc = (ty & CRTC.crtMask3) << 7 | CRTC.crtR10TxXCurr >> 3; //テキスト桁位置 int ta0 = 0x00e00000 + ((ty & CRTC.crtMaskMinus4) << 7); //ラスタブロックアドレス int ta1 = 0x00020000 + ta0; int ta2 = 0x00040000 + ta0; int ta3 = 0x00060000 + ta0; int ts = CRTC.crtR10TxXCurr & 7; //テキスト桁境界からのずれ int da = dst << XEiJ.PNL_BM_OFFSET_BITS; //ARGB出力インデックス int db = da + XEiJ.pnlScreenWidth; //ARGB出力インデックスの終了位置 if (rh) { int half = XEiJ.pnlScreenWidth >> 4 << 3; sx += half; gx1st += half; gx2nd += half; gx3rd += half; gx4th += half; tc = tc + (half >> 3) & CRTC.crtMask511; da += half; } if (ts == 0) { //テキスト桁境界に合っているとき while (da < db) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((p = (VideoController.vcnPal8G16H[(q = (GraphicScreen.graM4[gy4th | gx4th & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st & 511])) >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); XEiJ.pnlBM[da + 1] = ((p = (VideoController.vcnPal8G16H[(q = (GraphicScreen.graM4[gy4th | gx4th + 1 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 1 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 1 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 1 & 511])) >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]]); XEiJ.pnlBM[da + 2] = ((p = (VideoController.vcnPal8G16H[(q = (GraphicScreen.graM4[gy4th | gx4th + 2 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 2 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 2 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 2 & 511])) >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]]); XEiJ.pnlBM[da + 3] = ((p = (VideoController.vcnPal8G16H[(q = (GraphicScreen.graM4[gy4th | gx4th + 3 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 3 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 3 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 3 & 511])) >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]]); XEiJ.pnlBM[da + 4] = ((p = (VideoController.vcnPal8G16H[(q = (GraphicScreen.graM4[gy4th | gx4th + 4 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 4 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 4 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 4 & 511])) >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]]); XEiJ.pnlBM[da + 5] = ((p = (VideoController.vcnPal8G16H[(q = (GraphicScreen.graM4[gy4th | gx4th + 5 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 5 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 5 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 5 & 511])) >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]]); XEiJ.pnlBM[da + 6] = ((p = (VideoController.vcnPal8G16H[(q = (GraphicScreen.graM4[gy4th | gx4th + 6 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 6 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 6 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 6 & 511])) >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]]); XEiJ.pnlBM[da + 7] = ((p = (VideoController.vcnPal8G16H[(q = (GraphicScreen.graM4[gy4th | gx4th + 7 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 7 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 7 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 7 & 511])) >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]]); sx += 8; gx1st += 8; gx2nd += 8; gx3rd += 8; gx4th += 8; da += 8; } //while da<db } else { //テキスト桁境界に合っていないとき // ts=1のとき int tt = ts + 8; //tt=9 ts += 16; //ts=17 // ........ ........ ........ 01234567 m8[ta0+tc] int p0 = MainMemory.mmrM8[ta0 + tc] << ts; //.......0 1234567_ ________ ________ p0=m8[ta0+tc]<<ts int p1 = MainMemory.mmrM8[ta1 + tc] << ts; int p2 = MainMemory.mmrM8[ta2 + tc] << ts; int p3 = MainMemory.mmrM8[ta3 + tc] << ts; tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 while (da < db) { // ........ ........ .1234567 ________ p0>>tt // ........ ........ .1234567 89abcdef p0>>tt|m8[ta0+tc]&255 p0 = (p0 >> tt | MainMemory.mmrM8[ta0 + tc] & 255) << ts; //12345678 9abcdef_ ________ ________ p0=(p0>>tt|m8[ta0+tc]&255)<<ts p1 = (p1 >> tt | MainMemory.mmrM8[ta1 + tc] & 255) << ts; //~~~~~~~~ p2 = (p2 >> tt | MainMemory.mmrM8[ta2 + tc] & 255) << ts; //ここを使う p3 = (p3 >> tt | MainMemory.mmrM8[ta3 + tc] & 255) << ts; int tp = (VideoController.VCN_TXP3[p3 >>> 24] | VideoController.VCN_TXP2[p2 >>> 24] | VideoController.VCN_TXP1[p1 >>> 24] | VideoController.VCN_TXP0[p0 >>> 24]); //符号なし右シフトで&255を省略 tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((p = (VideoController.vcnPal8G16H[(q = (GraphicScreen.graM4[gy4th | gx4th & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st & 511])) >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); XEiJ.pnlBM[da + 1] = ((p = (VideoController.vcnPal8G16H[(q = (GraphicScreen.graM4[gy4th | gx4th + 1 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 1 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 1 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 1 & 511])) >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]]); XEiJ.pnlBM[da + 2] = ((p = (VideoController.vcnPal8G16H[(q = (GraphicScreen.graM4[gy4th | gx4th + 2 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 2 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 2 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 2 & 511])) >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]]); XEiJ.pnlBM[da + 3] = ((p = (VideoController.vcnPal8G16H[(q = (GraphicScreen.graM4[gy4th | gx4th + 3 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 3 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 3 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 3 & 511])) >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]]); XEiJ.pnlBM[da + 4] = ((p = (VideoController.vcnPal8G16H[(q = (GraphicScreen.graM4[gy4th | gx4th + 4 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 4 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 4 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 4 & 511])) >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]]); XEiJ.pnlBM[da + 5] = ((p = (VideoController.vcnPal8G16H[(q = (GraphicScreen.graM4[gy4th | gx4th + 5 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 5 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 5 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 5 & 511])) >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]]); XEiJ.pnlBM[da + 6] = ((p = (VideoController.vcnPal8G16H[(q = (GraphicScreen.graM4[gy4th | gx4th + 6 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 6 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 6 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 6 & 511])) >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]]); XEiJ.pnlBM[da + 7] = ((p = (VideoController.vcnPal8G16H[(q = (GraphicScreen.graM4[gy4th | gx4th + 7 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 7 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 7 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 7 & 511])) >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]]); sx += 8; gx1st += 8; gx2nd += 8; gx3rd += 8; gx4th += 8; da += 8; } //while da<db } //if ts==0 } //drawRaster }, //GTS //================================================================================ //XGTS // 概要 // GTS 512ドット65536色1プレーン>テキスト>スプライト // 拡張あり XGTS { @Override public void drawRaster (int src, int dst, boolean rh) { switch (VideoController.vcnReg3Curr >>> 8 & 0b01011111) { // .A.XHPGT case 0b00010000: //GTS_XWC case 0b00010001: //GTS_XWC case 0b00010010: //GTS_XWC case 0b00010011: //GTS_XWC GTS_XWC.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00010100: //GTS_XWP case 0b00010101: //GTS_XWP case 0b00010110: //GTS_XWP case 0b00010111: //GTS_XWP GTS_XWP.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00011000: //GTS_XHC GTS.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00011001: //GTS_XHCT GTS_XHCT.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00011101: //GTS_XHPT GTS_XHPT.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b01000000: //GTS_A case 0b01000001: //GTS_A case 0b01000010: //GTS_A case 0b01000011: //GTS_A case 0b01000100: //GTS_A case 0b01000101: //GTS_A case 0b01000110: //GTS_A case 0b01000111: //GTS_A case 0b01001000: //GTS_A case 0b01001001: //GTS_A case 0b01001010: //GTS_A case 0b01001011: //GTS_A case 0b01001100: //GTS_A case 0b01001101: //GTS_A case 0b01001110: //GTS_A case 0b01001111: //GTS_A case 0b01010000: //GTS_A case 0b01010001: //GTS_A case 0b01010010: //GTS_A case 0b01010011: //GTS_A case 0b01010100: //GTS_A case 0b01010101: //GTS_A case 0b01010110: //GTS_A case 0b01010111: //GTS_A case 0b01011000: //GTS_A case 0b01011001: //GTS_A case 0b01011010: //GTS_A case 0b01011011: //GTS_A case 0b01011100: //GTS_A case 0b01011101: //GTS_A case 0b01011110: //GTS_A case 0b01011111: //GTS_A G_A.drawRaster (src, dst, rh); break; default: GTS.drawRaster (src, dst, rh); VideoController.vcnReportUnimplemented (XGTS); } //switch } //drawRaster }, //XGTS //================================================================================ //GTS_XWC ($0003,$24xx,$106F) // 概要 // GTS 512ドット65536色1プレーン>テキスト>スプライト // XWC 優先順位に関わらず0でない1番目のパレットを偶数化(65536色は奇数化)したパレットのカラーが奇数のとき0でない1番目のパレットのカラーだけ表示する // 手順 // 1番目のパレットを奇数化したパレットのカラーが奇数のとき // 1番目のカラー(0は黒) // さもなくば(1番目のパレットを奇数化したパレットのカラーが偶数のとき) // 1番目のカラーが0でないとき // 1番目のカラー // さもなくば(1番目のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // 中間コード1 // (ls1(gpc(tod(g1p()),tod(g1p())))!=0?gpc(g1p(),g1p()):(gpc(g1p(),g1p())!=0?gpc(g1p(),g1p()):(txp()!=0?tpc(txp()):spc(spp())))) // 中間コード2 // ls1(gpc(tod(g1p()),tod(g1p())))!=0?gpc(g1p(),g1p()):gpc(g1p(),g1p())!=0?gpc(g1p(),g1p()):txp()!=0?tpc(txp()):spc(spp()) // 中間コード3 // ls1(gpc(v2=tod(v3=g1p()),v2))!=0?gpc(v3,v3):(v5=gpc(v3,v3))!=0?v5:(v6=txp())!=0?tpc(v6):spc(spp()) // 中間コード4 // ls1(gpc(p=tod(q=g1p()),p))!=0?gpc(q,q):(p=gpc(q,q))!=0?p:(p=txp())!=0?tpc(p):spc(spp()) // 中間コード5 // (gpc(p=(q=g1p())|1,p)&1)!=0?gpc(q,q):(p=gpc(q,q))!=0?p:(p=txp())!=0?tpc(p):spc(spp()) // 中間コード6 // (gpc(p=(q=g1p())|1,p)&1)!=0?gpo(q,q):(p=gpc(q,q))!=0?cto(p):(p=txp())!=0?tpo(p):spo(spp()) GTS_XWC { @Override public void drawRaster (int src, int dst, boolean rh) { SpriteScreen.sprStep3 (); int sx = 16; //スプライトx座標 int pn = VideoController.vcnReg2Curr & 3; //1番目のパレットのbit3-0のGVRAMページ番号 int gx1st = CRTC.crtR12GrXCurr[pn]; int gy1st = (pn << 18) + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); pn = VideoController.vcnReg2Curr >> 2 & 3; //1番目のパレットのbit7-4のGVRAMページ番号 int gx2nd = CRTC.crtR12GrXCurr[pn]; int gy2nd = (pn << 18) + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); pn = VideoController.vcnReg2Curr >> 4 & 3; //1番目のパレットのbit11-8のGVRAMページ番号 int gx3rd = CRTC.crtR12GrXCurr[pn]; int gy3rd = (pn << 18) + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); pn = VideoController.vcnReg2Curr >> 6 & 3; //1番目のパレットのbit15-12のGVRAMページ番号 int gx4th = CRTC.crtR12GrXCurr[pn]; int gy4th = (pn << 18) + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); int ty = CRTC.crtR11TxYZero + src & 1023; //ラスタ int tc = (ty & CRTC.crtMask3) << 7 | CRTC.crtR10TxXCurr >> 3; //テキスト桁位置 int ta0 = 0x00e00000 + ((ty & CRTC.crtMaskMinus4) << 7); //ラスタブロックアドレス int ta1 = 0x00020000 + ta0; int ta2 = 0x00040000 + ta0; int ta3 = 0x00060000 + ta0; int ts = CRTC.crtR10TxXCurr & 7; //テキスト桁境界からのずれ int da = dst << XEiJ.PNL_BM_OFFSET_BITS; //ARGB出力インデックス int db = da + XEiJ.pnlScreenWidth; //ARGB出力インデックスの終了位置 if (rh) { int half = XEiJ.pnlScreenWidth >> 4 << 3; sx += half; gx1st += half; gx2nd += half; gx3rd += half; gx4th += half; tc = tc + (half >> 3) & CRTC.crtMask511; da += half; } if (ts == 0) { //テキスト桁境界に合っているとき while (da < db) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[gy4th | gx4th & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st & 511])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); XEiJ.pnlBM[da + 1] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[gy4th | gx4th + 1 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 1 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 1 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 1 & 511])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]]); XEiJ.pnlBM[da + 2] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[gy4th | gx4th + 2 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 2 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 2 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 2 & 511])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]]); XEiJ.pnlBM[da + 3] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[gy4th | gx4th + 3 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 3 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 3 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 3 & 511])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]]); XEiJ.pnlBM[da + 4] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[gy4th | gx4th + 4 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 4 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 4 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 4 & 511])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]]); XEiJ.pnlBM[da + 5] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[gy4th | gx4th + 5 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 5 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 5 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 5 & 511])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]]); XEiJ.pnlBM[da + 6] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[gy4th | gx4th + 6 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 6 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 6 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 6 & 511])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]]); XEiJ.pnlBM[da + 7] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[gy4th | gx4th + 7 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 7 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 7 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 7 & 511])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]]); sx += 8; gx1st += 8; gx2nd += 8; gx3rd += 8; gx4th += 8; da += 8; } //while da<db } else { //テキスト桁境界に合っていないとき // ts=1のとき int tt = ts + 8; //tt=9 ts += 16; //ts=17 // ........ ........ ........ 01234567 m8[ta0+tc] int p0 = MainMemory.mmrM8[ta0 + tc] << ts; //.......0 1234567_ ________ ________ p0=m8[ta0+tc]<<ts int p1 = MainMemory.mmrM8[ta1 + tc] << ts; int p2 = MainMemory.mmrM8[ta2 + tc] << ts; int p3 = MainMemory.mmrM8[ta3 + tc] << ts; tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 while (da < db) { // ........ ........ .1234567 ________ p0>>tt // ........ ........ .1234567 89abcdef p0>>tt|m8[ta0+tc]&255 p0 = (p0 >> tt | MainMemory.mmrM8[ta0 + tc] & 255) << ts; //12345678 9abcdef_ ________ ________ p0=(p0>>tt|m8[ta0+tc]&255)<<ts p1 = (p1 >> tt | MainMemory.mmrM8[ta1 + tc] & 255) << ts; //~~~~~~~~ p2 = (p2 >> tt | MainMemory.mmrM8[ta2 + tc] & 255) << ts; //ここを使う p3 = (p3 >> tt | MainMemory.mmrM8[ta3 + tc] & 255) << ts; int tp = (VideoController.VCN_TXP3[p3 >>> 24] | VideoController.VCN_TXP2[p2 >>> 24] | VideoController.VCN_TXP1[p1 >>> 24] | VideoController.VCN_TXP0[p0 >>> 24]); //符号なし右シフトで&255を省略 tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[gy4th | gx4th & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st & 511])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); XEiJ.pnlBM[da + 1] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[gy4th | gx4th + 1 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 1 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 1 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 1 & 511])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]]); XEiJ.pnlBM[da + 2] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[gy4th | gx4th + 2 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 2 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 2 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 2 & 511])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]]); XEiJ.pnlBM[da + 3] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[gy4th | gx4th + 3 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 3 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 3 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 3 & 511])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]]); XEiJ.pnlBM[da + 4] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[gy4th | gx4th + 4 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 4 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 4 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 4 & 511])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]]); XEiJ.pnlBM[da + 5] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[gy4th | gx4th + 5 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 5 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 5 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 5 & 511])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]]); XEiJ.pnlBM[da + 6] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[gy4th | gx4th + 6 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 6 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 6 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 6 & 511])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]]); XEiJ.pnlBM[da + 7] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[gy4th | gx4th + 7 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 7 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 7 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 7 & 511])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]]); sx += 8; gx1st += 8; gx2nd += 8; gx3rd += 8; gx4th += 8; da += 8; } //while da<db } //if ts==0 } //drawRaster }, //GTS_XWC //================================================================================ //GTS_XWP ($0003,$24xx,$146F) // 概要 // GTS 512ドット65536色1プレーン>テキスト>スプライト // XWP 優先順位に関わらず1番目のパレットが3以上の奇数のときそれを偶数化したパレットのカラーだけ表示する // 手順 // 1番目のパレットが1以下のとき // グラフィックパレット0のカラーが0でないとき // グラフィックパレット0のカラー // さもなくば(グラフィックパレット0のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // 1番目のパレットが2以上の偶数のとき // 1番目のカラーが0でないとき // 1番目のカラー // さもなくば(1番目のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // さもなくば(1番目のパレットが3以上の奇数のとき) // 1番目のパレットを偶数化したパレットのカラー(0は黒) // 中間コード1 // (g1p()<=1?(gpc(0,0)!=0?gpc(0,0):(txp()!=0?tpc(txp()):spc(spp()))):ls1(g1p())==0?(gpc(g1p(),g1p())!=0?gpc(g1p(),g1p()):(txp()!=0?tpc(txp()):spc(spp()))):gpc(tev(g1p()),tev(g1p()))) // 中間コード2 // g1p()<=1?gpc(0,0)!=0?gpc(0,0):txp()!=0?tpc(txp()):spc(spp()):ls1(g1p())==0?gpc(g1p(),g1p())!=0?gpc(g1p(),g1p()):txp()!=0?tpc(txp()):spc(spp()):gpc(tev(g1p()),tev(g1p())) // 中間コード3 // (v0=g1p())<=1?(v1=gpc(0,0))!=0?v1:(v2=txp())!=0?tpc(v2):spc(spp()):ls1(v0)==0?(v7=gpc(v0,v0))!=0?v7:(v8=txp())!=0?tpc(v8):spc(spp()):gpc(v13=tev(v0),v13) // 中間コード4 // (p=g1p())<=1?(p=gpc(0,0))!=0?p:(p=txp())!=0?tpc(p):spc(spp()):ls1(p)==0?(q=gpc(p,p))!=0?q:(p=txp())!=0?tpc(p):spc(spp()):gpc(q=tev(p),q) // 中間コード5 // (p=g1p())<=1?(p=gpc(0,0))!=0?p:(p=txp())!=0?tpc(p):spc(spp()):(p&1)==0?(q=gpc(p,p))!=0?q:(p=txp())!=0?tpc(p):spc(spp()):gpc(q=p&-2,q) // 中間コード6 // (p=g1p())<=1?(p=gpc(0,0))!=0?cto(p):(p=txp())!=0?tpo(p):spo(spp()):(p&1)==0?(q=gpc(p,p))!=0?cto(q):(p=txp())!=0?tpo(p):spo(spp()):gpo(q=p&-2,q) GTS_XWP { @Override public void drawRaster (int src, int dst, boolean rh) { SpriteScreen.sprStep3 (); int sx = 16; //スプライトx座標 int pn = VideoController.vcnReg2Curr & 3; //1番目のパレットのbit3-0のGVRAMページ番号 int gx1st = CRTC.crtR12GrXCurr[pn]; int gy1st = (pn << 18) + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); pn = VideoController.vcnReg2Curr >> 2 & 3; //1番目のパレットのbit7-4のGVRAMページ番号 int gx2nd = CRTC.crtR12GrXCurr[pn]; int gy2nd = (pn << 18) + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); pn = VideoController.vcnReg2Curr >> 4 & 3; //1番目のパレットのbit11-8のGVRAMページ番号 int gx3rd = CRTC.crtR12GrXCurr[pn]; int gy3rd = (pn << 18) + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); pn = VideoController.vcnReg2Curr >> 6 & 3; //1番目のパレットのbit15-12のGVRAMページ番号 int gx4th = CRTC.crtR12GrXCurr[pn]; int gy4th = (pn << 18) + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); int ty = CRTC.crtR11TxYZero + src & 1023; //ラスタ int tc = (ty & CRTC.crtMask3) << 7 | CRTC.crtR10TxXCurr >> 3; //テキスト桁位置 int ta0 = 0x00e00000 + ((ty & CRTC.crtMaskMinus4) << 7); //ラスタブロックアドレス int ta1 = 0x00020000 + ta0; int ta2 = 0x00040000 + ta0; int ta3 = 0x00060000 + ta0; int ts = CRTC.crtR10TxXCurr & 7; //テキスト桁境界からのずれ int da = dst << XEiJ.PNL_BM_OFFSET_BITS; //ARGB出力インデックス int db = da + XEiJ.pnlScreenWidth; //ARGB出力インデックスの終了位置 if (rh) { int half = XEiJ.pnlScreenWidth >> 4 << 3; sx += half; gx1st += half; gx2nd += half; gx3rd += half; gx4th += half; tc = tc + (half >> 3) & CRTC.crtMask511; da += half; } if (ts == 0) { //テキスト桁境界に合っているとき while (da < db) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((p = (GraphicScreen.graM4[gy4th | gx4th & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st & 511])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 1] = ((p = (GraphicScreen.graM4[gy4th | gx4th + 1 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 1 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 1 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 1 & 511])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 2] = ((p = (GraphicScreen.graM4[gy4th | gx4th + 2 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 2 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 2 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 2 & 511])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 3] = ((p = (GraphicScreen.graM4[gy4th | gx4th + 3 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 3 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 3 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 3 & 511])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 4] = ((p = (GraphicScreen.graM4[gy4th | gx4th + 4 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 4 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 4 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 4 & 511])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 5] = ((p = (GraphicScreen.graM4[gy4th | gx4th + 5 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 5 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 5 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 5 & 511])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 6] = ((p = (GraphicScreen.graM4[gy4th | gx4th + 6 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 6 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 6 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 6 & 511])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 7] = ((p = (GraphicScreen.graM4[gy4th | gx4th + 7 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 7 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 7 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 7 & 511])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]); sx += 8; gx1st += 8; gx2nd += 8; gx3rd += 8; gx4th += 8; da += 8; } //while da<db } else { //テキスト桁境界に合っていないとき // ts=1のとき int tt = ts + 8; //tt=9 ts += 16; //ts=17 // ........ ........ ........ 01234567 m8[ta0+tc] int p0 = MainMemory.mmrM8[ta0 + tc] << ts; //.......0 1234567_ ________ ________ p0=m8[ta0+tc]<<ts int p1 = MainMemory.mmrM8[ta1 + tc] << ts; int p2 = MainMemory.mmrM8[ta2 + tc] << ts; int p3 = MainMemory.mmrM8[ta3 + tc] << ts; tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 while (da < db) { // ........ ........ .1234567 ________ p0>>tt // ........ ........ .1234567 89abcdef p0>>tt|m8[ta0+tc]&255 p0 = (p0 >> tt | MainMemory.mmrM8[ta0 + tc] & 255) << ts; //12345678 9abcdef_ ________ ________ p0=(p0>>tt|m8[ta0+tc]&255)<<ts p1 = (p1 >> tt | MainMemory.mmrM8[ta1 + tc] & 255) << ts; //~~~~~~~~ p2 = (p2 >> tt | MainMemory.mmrM8[ta2 + tc] & 255) << ts; //ここを使う p3 = (p3 >> tt | MainMemory.mmrM8[ta3 + tc] & 255) << ts; int tp = (VideoController.VCN_TXP3[p3 >>> 24] | VideoController.VCN_TXP2[p2 >>> 24] | VideoController.VCN_TXP1[p1 >>> 24] | VideoController.VCN_TXP0[p0 >>> 24]); //符号なし右シフトで&255を省略 tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((p = (GraphicScreen.graM4[gy4th | gx4th & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st & 511])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 1] = ((p = (GraphicScreen.graM4[gy4th | gx4th + 1 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 1 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 1 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 1 & 511])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 2] = ((p = (GraphicScreen.graM4[gy4th | gx4th + 2 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 2 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 2 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 2 & 511])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 3] = ((p = (GraphicScreen.graM4[gy4th | gx4th + 3 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 3 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 3 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 3 & 511])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 4] = ((p = (GraphicScreen.graM4[gy4th | gx4th + 4 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 4 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 4 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 4 & 511])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 5] = ((p = (GraphicScreen.graM4[gy4th | gx4th + 5 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 5 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 5 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 5 & 511])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 6] = ((p = (GraphicScreen.graM4[gy4th | gx4th + 6 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 6 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 6 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 6 & 511])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 7] = ((p = (GraphicScreen.graM4[gy4th | gx4th + 7 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 7 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 7 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 7 & 511])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]); sx += 8; gx1st += 8; gx2nd += 8; gx3rd += 8; gx4th += 8; da += 8; } //while da<db } //if ts==0 } //drawRaster }, //GTS_XWP //================================================================================ //GTS_XHCT ($0003,$24xx,$196F) // 概要 // GTS 512ドット65536色1プレーン>テキスト>スプライト // XHCT 0でない1番目のパレットを偶数化(65536色は奇数化)したパレットのカラーが奇数のとき0でない1番目のカラーと奥のスプライト・テキストのカラーを混ぜる // 手順 // 1番目のパレットを奇数化したパレットのカラーが奇数のとき // 1番目のカラーと // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // を混ぜたカラー(0は黒) // さもなくば(1番目のパレットを奇数化したパレットのカラーが偶数のとき) // 1番目のカラーが0でないとき // 1番目のカラー // さもなくば(1番目のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // 中間コード1 // (ls1(gpc(tod(g1p()),tod(g1p())))!=0?mix(gpc(g1p(),g1p()),(txp()!=0?tpc(txp()):spc(spp()))):(gpc(g1p(),g1p())!=0?gpc(g1p(),g1p()):(txp()!=0?tpc(txp()):spc(spp())))) // 中間コード2 // ls1(gpc(tod(g1p()),tod(g1p())))!=0?mix(gpc(g1p(),g1p()),txp()!=0?tpc(txp()):spc(spp())):gpc(g1p(),g1p())!=0?gpc(g1p(),g1p()):txp()!=0?tpc(txp()):spc(spp()) // 中間コード3 // ls1(gpc(v2=tod(v3=g1p()),v2))!=0?mix(gpc(v3,v3),(v6=txp())!=0?tpc(v6):spc(spp())):(v10=gpc(v3,v3))!=0?v10:(v11=txp())!=0?tpc(v11):spc(spp()) // 中間コード4 // ls1(gpc(p=tod(q=g1p()),p))!=0?mix(gpc(q,q),(p=txp())!=0?tpc(p):spc(spp())):(p=gpc(q,q))!=0?p:(p=txp())!=0?tpc(p):spc(spp()) // 中間コード5 // (gpc(p=(q=g1p())|1,p)&1)!=0?mix(gpc(q,q),(p=txp())!=0?tpc(p):spc(spp())):(p=gpc(q,q))!=0?p:(p=txp())!=0?tpc(p):spc(spp()) // 中間コード6 // (gpc(p=(q=g1p())|1,p)&1)!=0?cto(mix(gpc(q,q),(p=txp())!=0?tpc(p):spc(spp()))):(p=gpc(q,q))!=0?cto(p):(p=txp())!=0?tpo(p):spo(spp()) GTS_XHCT { @Override public void drawRaster (int src, int dst, boolean rh) { SpriteScreen.sprStep3 (); int sx = 16; //スプライトx座標 int pn = VideoController.vcnReg2Curr & 3; //1番目のパレットのbit3-0のGVRAMページ番号 int gx1st = CRTC.crtR12GrXCurr[pn]; int gy1st = (pn << 18) + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); pn = VideoController.vcnReg2Curr >> 2 & 3; //1番目のパレットのbit7-4のGVRAMページ番号 int gx2nd = CRTC.crtR12GrXCurr[pn]; int gy2nd = (pn << 18) + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); pn = VideoController.vcnReg2Curr >> 4 & 3; //1番目のパレットのbit11-8のGVRAMページ番号 int gx3rd = CRTC.crtR12GrXCurr[pn]; int gy3rd = (pn << 18) + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); pn = VideoController.vcnReg2Curr >> 6 & 3; //1番目のパレットのbit15-12のGVRAMページ番号 int gx4th = CRTC.crtR12GrXCurr[pn]; int gy4th = (pn << 18) + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); int ty = CRTC.crtR11TxYZero + src & 1023; //ラスタ int tc = (ty & CRTC.crtMask3) << 7 | CRTC.crtR10TxXCurr >> 3; //テキスト桁位置 int ta0 = 0x00e00000 + ((ty & CRTC.crtMaskMinus4) << 7); //ラスタブロックアドレス int ta1 = 0x00020000 + ta0; int ta2 = 0x00040000 + ta0; int ta3 = 0x00060000 + ta0; int ts = CRTC.crtR10TxXCurr & 7; //テキスト桁境界からのずれ int da = dst << XEiJ.PNL_BM_OFFSET_BITS; //ARGB出力インデックス int db = da + XEiJ.pnlScreenWidth; //ARGB出力インデックスの終了位置 if (rh) { int half = XEiJ.pnlScreenWidth >> 4 << 3; sx += half; gx1st += half; gx2nd += half; gx3rd += half; gx4th += half; tc = tc + (half >> 3) & CRTC.crtMask511; da += half; } if (ts == 0) { //テキスト桁境界に合っているとき while (da < db) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[gy4th | gx4th & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st & 511])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]), (p = tp >>> 28) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx]])] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); XEiJ.pnlBM[da + 1] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[gy4th | gx4th + 1 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 1 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 1 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 1 & 511])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]), (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 1]])] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]]); XEiJ.pnlBM[da + 2] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[gy4th | gx4th + 2 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 2 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 2 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 2 & 511])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]), (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 2]])] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]]); XEiJ.pnlBM[da + 3] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[gy4th | gx4th + 3 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 3 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 3 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 3 & 511])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]), (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 3]])] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]]); XEiJ.pnlBM[da + 4] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[gy4th | gx4th + 4 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 4 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 4 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 4 & 511])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]), (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 4]])] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]]); XEiJ.pnlBM[da + 5] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[gy4th | gx4th + 5 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 5 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 5 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 5 & 511])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]), (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 5]])] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]]); XEiJ.pnlBM[da + 6] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[gy4th | gx4th + 6 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 6 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 6 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 6 & 511])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]), (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 6]])] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]]); XEiJ.pnlBM[da + 7] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[gy4th | gx4th + 7 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 7 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 7 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 7 & 511])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]), (p = tp & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 7]])] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]]); sx += 8; gx1st += 8; gx2nd += 8; gx3rd += 8; gx4th += 8; da += 8; } //while da<db } else { //テキスト桁境界に合っていないとき // ts=1のとき int tt = ts + 8; //tt=9 ts += 16; //ts=17 // ........ ........ ........ 01234567 m8[ta0+tc] int p0 = MainMemory.mmrM8[ta0 + tc] << ts; //.......0 1234567_ ________ ________ p0=m8[ta0+tc]<<ts int p1 = MainMemory.mmrM8[ta1 + tc] << ts; int p2 = MainMemory.mmrM8[ta2 + tc] << ts; int p3 = MainMemory.mmrM8[ta3 + tc] << ts; tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 while (da < db) { // ........ ........ .1234567 ________ p0>>tt // ........ ........ .1234567 89abcdef p0>>tt|m8[ta0+tc]&255 p0 = (p0 >> tt | MainMemory.mmrM8[ta0 + tc] & 255) << ts; //12345678 9abcdef_ ________ ________ p0=(p0>>tt|m8[ta0+tc]&255)<<ts p1 = (p1 >> tt | MainMemory.mmrM8[ta1 + tc] & 255) << ts; //~~~~~~~~ p2 = (p2 >> tt | MainMemory.mmrM8[ta2 + tc] & 255) << ts; //ここを使う p3 = (p3 >> tt | MainMemory.mmrM8[ta3 + tc] & 255) << ts; int tp = (VideoController.VCN_TXP3[p3 >>> 24] | VideoController.VCN_TXP2[p2 >>> 24] | VideoController.VCN_TXP1[p1 >>> 24] | VideoController.VCN_TXP0[p0 >>> 24]); //符号なし右シフトで&255を省略 tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[gy4th | gx4th & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st & 511])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]), (p = tp >>> 28) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx]])] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); XEiJ.pnlBM[da + 1] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[gy4th | gx4th + 1 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 1 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 1 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 1 & 511])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]), (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 1]])] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]]); XEiJ.pnlBM[da + 2] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[gy4th | gx4th + 2 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 2 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 2 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 2 & 511])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]), (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 2]])] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]]); XEiJ.pnlBM[da + 3] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[gy4th | gx4th + 3 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 3 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 3 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 3 & 511])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]), (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 3]])] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]]); XEiJ.pnlBM[da + 4] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[gy4th | gx4th + 4 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 4 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 4 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 4 & 511])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]), (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 4]])] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]]); XEiJ.pnlBM[da + 5] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[gy4th | gx4th + 5 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 5 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 5 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 5 & 511])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]), (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 5]])] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]]); XEiJ.pnlBM[da + 6] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[gy4th | gx4th + 6 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 6 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 6 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 6 & 511])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]), (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 6]])] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]]); XEiJ.pnlBM[da + 7] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[gy4th | gx4th + 7 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 7 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 7 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 7 & 511])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]), (p = tp & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 7]])] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]]); sx += 8; gx1st += 8; gx2nd += 8; gx3rd += 8; gx4th += 8; da += 8; } //while da<db } //if ts==0 } //drawRaster }, //GTS_XHCT //================================================================================ //GTS_XHPT ($0003,$24xx,$1D6F) // 概要 // GTS 512ドット65536色1プレーン>テキスト>スプライト // XHPT 1番目のパレットが3以上の奇数のときそれを偶数化したパレットのカラーと奥のスプライト・テキストのカラーを混ぜる // 手順 // 1番目のパレットが1以下のとき // グラフィックパレット0のカラーが0でないとき // グラフィックパレット0のカラー // さもなくば(グラフィックパレット0のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // 1番目のパレットが2以上の偶数のとき // 1番目のカラーが0でないとき // 1番目のカラー // さもなくば(1番目のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // さもなくば(1番目のパレットが3以上の奇数のとき) // 1番目のパレットを偶数化したパレットのカラーと // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // を混ぜたカラー(0は黒) // 中間コード1 // (g1p()<=1?(gpc(0,0)!=0?gpc(0,0):(txp()!=0?tpc(txp()):spc(spp()))):ls1(g1p())==0?(gpc(g1p(),g1p())!=0?gpc(g1p(),g1p()):(txp()!=0?tpc(txp()):spc(spp()))):mix(gpc(tev(g1p()),tev(g1p())),(txp()!=0?tpc(txp()):spc(spp())))) // 中間コード2 // g1p()<=1?gpc(0,0)!=0?gpc(0,0):txp()!=0?tpc(txp()):spc(spp()):ls1(g1p())==0?gpc(g1p(),g1p())!=0?gpc(g1p(),g1p()):txp()!=0?tpc(txp()):spc(spp()):mix(gpc(tev(g1p()),tev(g1p())),txp()!=0?tpc(txp()):spc(spp())) // 中間コード3 // (v0=g1p())<=1?(v1=gpc(0,0))!=0?v1:(v2=txp())!=0?tpc(v2):spc(spp()):ls1(v0)==0?(v7=gpc(v0,v0))!=0?v7:(v8=txp())!=0?tpc(v8):spc(spp()):mix(gpc(v14=tev(v0),v14),(v15=txp())!=0?tpc(v15):spc(spp())) // 中間コード4 // (p=g1p())<=1?(p=gpc(0,0))!=0?p:(p=txp())!=0?tpc(p):spc(spp()):ls1(p)==0?(q=gpc(p,p))!=0?q:(p=txp())!=0?tpc(p):spc(spp()):mix(gpc(q=tev(p),q),(p=txp())!=0?tpc(p):spc(spp())) // 中間コード5 // (p=g1p())<=1?(p=gpc(0,0))!=0?p:(p=txp())!=0?tpc(p):spc(spp()):(p&1)==0?(q=gpc(p,p))!=0?q:(p=txp())!=0?tpc(p):spc(spp()):mix(gpc(q=p&-2,q),(p=txp())!=0?tpc(p):spc(spp())) // 中間コード6 // (p=g1p())<=1?(p=gpc(0,0))!=0?cto(p):(p=txp())!=0?tpo(p):spo(spp()):(p&1)==0?(q=gpc(p,p))!=0?cto(q):(p=txp())!=0?tpo(p):spo(spp()):cto(mix(gpc(q=p&-2,q),(p=txp())!=0?tpc(p):spc(spp()))) GTS_XHPT { @Override public void drawRaster (int src, int dst, boolean rh) { SpriteScreen.sprStep3 (); int sx = 16; //スプライトx座標 int pn = VideoController.vcnReg2Curr & 3; //1番目のパレットのbit3-0のGVRAMページ番号 int gx1st = CRTC.crtR12GrXCurr[pn]; int gy1st = (pn << 18) + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); pn = VideoController.vcnReg2Curr >> 2 & 3; //1番目のパレットのbit7-4のGVRAMページ番号 int gx2nd = CRTC.crtR12GrXCurr[pn]; int gy2nd = (pn << 18) + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); pn = VideoController.vcnReg2Curr >> 4 & 3; //1番目のパレットのbit11-8のGVRAMページ番号 int gx3rd = CRTC.crtR12GrXCurr[pn]; int gy3rd = (pn << 18) + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); pn = VideoController.vcnReg2Curr >> 6 & 3; //1番目のパレットのbit15-12のGVRAMページ番号 int gx4th = CRTC.crtR12GrXCurr[pn]; int gy4th = (pn << 18) + ((CRTC.crtR13GrYZero[pn] + src & 511) << 9); int ty = CRTC.crtR11TxYZero + src & 1023; //ラスタ int tc = (ty & CRTC.crtMask3) << 7 | CRTC.crtR10TxXCurr >> 3; //テキスト桁位置 int ta0 = 0x00e00000 + ((ty & CRTC.crtMaskMinus4) << 7); //ラスタブロックアドレス int ta1 = 0x00020000 + ta0; int ta2 = 0x00040000 + ta0; int ta3 = 0x00060000 + ta0; int ts = CRTC.crtR10TxXCurr & 7; //テキスト桁境界からのずれ int da = dst << XEiJ.PNL_BM_OFFSET_BITS; //ARGB出力インデックス int db = da + XEiJ.pnlScreenWidth; //ARGB出力インデックスの終了位置 if (rh) { int half = XEiJ.pnlScreenWidth >> 4 << 3; sx += half; gx1st += half; gx2nd += half; gx3rd += half; gx4th += half; tc = tc + (half >> 3) & CRTC.crtMask511; da += half; } if (ts == 0) { //テキスト桁境界に合っているとき while (da < db) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((p = (GraphicScreen.graM4[gy4th | gx4th & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st & 511])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), (p = tp >>> 28) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx]])]); XEiJ.pnlBM[da + 1] = ((p = (GraphicScreen.graM4[gy4th | gx4th + 1 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 1 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 1 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 1 & 511])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 1]])]); XEiJ.pnlBM[da + 2] = ((p = (GraphicScreen.graM4[gy4th | gx4th + 2 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 2 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 2 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 2 & 511])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 2]])]); XEiJ.pnlBM[da + 3] = ((p = (GraphicScreen.graM4[gy4th | gx4th + 3 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 3 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 3 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 3 & 511])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 3]])]); XEiJ.pnlBM[da + 4] = ((p = (GraphicScreen.graM4[gy4th | gx4th + 4 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 4 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 4 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 4 & 511])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 4]])]); XEiJ.pnlBM[da + 5] = ((p = (GraphicScreen.graM4[gy4th | gx4th + 5 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 5 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 5 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 5 & 511])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 5]])]); XEiJ.pnlBM[da + 6] = ((p = (GraphicScreen.graM4[gy4th | gx4th + 6 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 6 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 6 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 6 & 511])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 6]])]); XEiJ.pnlBM[da + 7] = ((p = (GraphicScreen.graM4[gy4th | gx4th + 7 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 7 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 7 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 7 & 511])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), (p = tp & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 7]])]); sx += 8; gx1st += 8; gx2nd += 8; gx3rd += 8; gx4th += 8; da += 8; } //while da<db } else { //テキスト桁境界に合っていないとき // ts=1のとき int tt = ts + 8; //tt=9 ts += 16; //ts=17 // ........ ........ ........ 01234567 m8[ta0+tc] int p0 = MainMemory.mmrM8[ta0 + tc] << ts; //.......0 1234567_ ________ ________ p0=m8[ta0+tc]<<ts int p1 = MainMemory.mmrM8[ta1 + tc] << ts; int p2 = MainMemory.mmrM8[ta2 + tc] << ts; int p3 = MainMemory.mmrM8[ta3 + tc] << ts; tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 while (da < db) { // ........ ........ .1234567 ________ p0>>tt // ........ ........ .1234567 89abcdef p0>>tt|m8[ta0+tc]&255 p0 = (p0 >> tt | MainMemory.mmrM8[ta0 + tc] & 255) << ts; //12345678 9abcdef_ ________ ________ p0=(p0>>tt|m8[ta0+tc]&255)<<ts p1 = (p1 >> tt | MainMemory.mmrM8[ta1 + tc] & 255) << ts; //~~~~~~~~ p2 = (p2 >> tt | MainMemory.mmrM8[ta2 + tc] & 255) << ts; //ここを使う p3 = (p3 >> tt | MainMemory.mmrM8[ta3 + tc] & 255) << ts; int tp = (VideoController.VCN_TXP3[p3 >>> 24] | VideoController.VCN_TXP2[p2 >>> 24] | VideoController.VCN_TXP1[p1 >>> 24] | VideoController.VCN_TXP0[p0 >>> 24]); //符号なし右シフトで&255を省略 tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((p = (GraphicScreen.graM4[gy4th | gx4th & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st & 511])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), (p = tp >>> 28) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx]])]); XEiJ.pnlBM[da + 1] = ((p = (GraphicScreen.graM4[gy4th | gx4th + 1 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 1 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 1 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 1 & 511])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 1]])]); XEiJ.pnlBM[da + 2] = ((p = (GraphicScreen.graM4[gy4th | gx4th + 2 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 2 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 2 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 2 & 511])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 2]])]); XEiJ.pnlBM[da + 3] = ((p = (GraphicScreen.graM4[gy4th | gx4th + 3 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 3 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 3 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 3 & 511])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 3]])]); XEiJ.pnlBM[da + 4] = ((p = (GraphicScreen.graM4[gy4th | gx4th + 4 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 4 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 4 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 4 & 511])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 4]])]); XEiJ.pnlBM[da + 5] = ((p = (GraphicScreen.graM4[gy4th | gx4th + 5 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 5 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 5 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 5 & 511])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 5]])]); XEiJ.pnlBM[da + 6] = ((p = (GraphicScreen.graM4[gy4th | gx4th + 6 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 6 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 6 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 6 & 511])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 6]])]); XEiJ.pnlBM[da + 7] = ((p = (GraphicScreen.graM4[gy4th | gx4th + 7 & 511] << 12 | GraphicScreen.graM4[gy3rd | gx3rd + 7 & 511] << 8 | GraphicScreen.graM4[gy2nd | gx2nd + 7 & 511] << 4 | GraphicScreen.graM4[gy1st | gx1st + 7 & 511])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( (VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]), (p = tp & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 7]])]); sx += 8; gx1st += 8; gx2nd += 8; gx3rd += 8; gx4th += 8; da += 8; } //while da<db } //if ts==0 } //drawRaster }, //GTS_XHPT //================================================================================ //HTS ($0004,$24xx,$0070) // 概要 // HTS 1024ドット16色1プレーン>テキスト>スプライト // 拡張なし // 手順 // 1番目のカラーが0でないとき // 1番目のカラー // さもなくば(1番目のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // 中間コード1 // (hpc(h1p())!=0?hpc(h1p()):(txp()!=0?tpc(txp()):spc(spp()))) // 中間コード2 // hpc(h1p())!=0?hpc(h1p()):txp()!=0?tpc(txp()):spc(spp()) // 中間コード3 // (v0=hpc(h1p()))!=0?v0:(v2=txp())!=0?tpc(v2):spc(spp()) // 中間コード4 // (p=hpc(h1p()))!=0?p:(p=txp())!=0?tpc(p):spc(spp()) // 中間コード5 // (p=hpc(h1p()))!=0?p:(p=txp())!=0?tpc(p):spc(spp()) // 中間コード6 // (p=hpc(h1p()))!=0?cto(p):(p=txp())!=0?tpo(p):spo(spp()) HTS { @Override public void drawRaster (int src, int dst, boolean rh) { SpriteScreen.sprStep3 (); int sx = 16; //スプライトx座標 int ty = CRTC.crtR11TxYZero + src & 1023; //ラスタ int tc = (ty & CRTC.crtMask3) << 7 | CRTC.crtR10TxXCurr >> 3; //テキスト桁位置 int ta0 = 0x00e00000 + ((ty & CRTC.crtMaskMinus4) << 7); //ラスタブロックアドレス int ta1 = 0x00020000 + ta0; int ta2 = 0x00040000 + ta0; int ta3 = 0x00060000 + ta0; int ts = CRTC.crtR10TxXCurr & 7; //テキスト桁境界からのずれ int gx = CRTC.crtR12GrXCurr[0]; //1024ドットx座標。溢れは無視する int gy = CRTC.crtR13GrYZero[0] + src; //1024ドットy座標。溢れは無視する int ga0 = ((gy & 511) << 9); //x=0,y&=511の1024ドットアドレス int gt = VideoController.vcnReg2Curr >> (gy >> 7 & 4); //y<512?G2nd|G1st:G4th|G3rd int da = dst << XEiJ.PNL_BM_OFFSET_BITS; //ARGB出力インデックス int db = da + XEiJ.pnlScreenWidth; //ARGB出力インデックスの終了位置 if (rh) { int half = XEiJ.pnlScreenWidth >> 4 << 3; sx += half; tc = tc + (half >> 3) & CRTC.crtMask511; gx += half; da += half; } int ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18) + (gx & 511); //1024ドットアドレス if (ts == 0) { //テキスト桁境界に合っているとき while (da < db) { int dw = Math.min (db - da, (512 - (gx & 511)) & -8); //今回の幅。8の倍数 gx += dw; //次回の1024ドットx座標 int dc = da + dw; //今回のARGB出力インデックスの終了位置 while (da < dc) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p; XEiJ.pnlBM[da] = ((p = VideoController.vcnPal16G8[GraphicScreen.graM4[ga]]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16G8[GraphicScreen.graM4[ga + 1]]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16G8[GraphicScreen.graM4[ga + 2]]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16G8[GraphicScreen.graM4[ga + 3]]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16G8[GraphicScreen.graM4[ga + 4]]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16G8[GraphicScreen.graM4[ga + 5]]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16G8[GraphicScreen.graM4[ga + 6]]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16G8[GraphicScreen.graM4[ga + 7]]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]]); sx += 8; ga += 8; da += 8; } //while da<dc if (da < db) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 for (int k = 0; k < 8; k++) { if ((gx & 511) == 0) { //gxが512の倍数のとき ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18); //gaを再計算する } gx++; int p; XEiJ.pnlBM[da] = ((p = VideoController.vcnPal16G8[GraphicScreen.graM4[ga]]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); sx++; tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db } else { //テキスト桁境界に合っていないとき // ts=1のとき int tt = ts + 8; //tt=9 ts += 16; //ts=17 // ........ ........ ........ 01234567 m8[ta0+tc] int p0 = MainMemory.mmrM8[ta0 + tc] << ts; //.......0 1234567_ ________ ________ p0=m8[ta0+tc]<<ts int p1 = MainMemory.mmrM8[ta1 + tc] << ts; int p2 = MainMemory.mmrM8[ta2 + tc] << ts; int p3 = MainMemory.mmrM8[ta3 + tc] << ts; tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 while (da < db) { int dw = Math.min (db - da, (512 - (gx & 511)) & -8); //今回の幅。8の倍数 gx += dw; //次回の1024ドットx座標 int dc = da + dw; //今回のARGB出力インデックスの終了位置 while (da < dc) { // ........ ........ .1234567 ________ p0>>tt // ........ ........ .1234567 89abcdef p0>>tt|m8[ta0+tc]&255 p0 = (p0 >> tt | MainMemory.mmrM8[ta0 + tc] & 255) << ts; //12345678 9abcdef_ ________ ________ p0=(p0>>tt|m8[ta0+tc]&255)<<ts p1 = (p1 >> tt | MainMemory.mmrM8[ta1 + tc] & 255) << ts; //~~~~~~~~ p2 = (p2 >> tt | MainMemory.mmrM8[ta2 + tc] & 255) << ts; //ここを使う p3 = (p3 >> tt | MainMemory.mmrM8[ta3 + tc] & 255) << ts; int tp = (VideoController.VCN_TXP3[p3 >>> 24] | VideoController.VCN_TXP2[p2 >>> 24] | VideoController.VCN_TXP1[p1 >>> 24] | VideoController.VCN_TXP0[p0 >>> 24]); //符号なし右シフトで&255を省略 tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p; XEiJ.pnlBM[da] = ((p = VideoController.vcnPal16G8[GraphicScreen.graM4[ga]]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16G8[GraphicScreen.graM4[ga + 1]]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16G8[GraphicScreen.graM4[ga + 2]]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16G8[GraphicScreen.graM4[ga + 3]]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16G8[GraphicScreen.graM4[ga + 4]]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16G8[GraphicScreen.graM4[ga + 5]]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16G8[GraphicScreen.graM4[ga + 6]]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16G8[GraphicScreen.graM4[ga + 7]]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]]); sx += 8; ga += 8; da += 8; } //while da<dc if (da < db) { // ........ ........ .1234567 ________ p0>>tt // ........ ........ .1234567 89abcdef p0>>tt|m8[ta0+tc]&255 p0 = (p0 >> tt | MainMemory.mmrM8[ta0 + tc] & 255) << ts; //12345678 9abcdef_ ________ ________ p0=(p0>>tt|m8[ta0+tc]&255)<<ts p1 = (p1 >> tt | MainMemory.mmrM8[ta1 + tc] & 255) << ts; //~~~~~~~~ p2 = (p2 >> tt | MainMemory.mmrM8[ta2 + tc] & 255) << ts; //ここを使う p3 = (p3 >> tt | MainMemory.mmrM8[ta3 + tc] & 255) << ts; int tp = (VideoController.VCN_TXP3[p3 >>> 24] | VideoController.VCN_TXP2[p2 >>> 24] | VideoController.VCN_TXP1[p1 >>> 24] | VideoController.VCN_TXP0[p0 >>> 24]); //符号なし右シフトで&255を省略 tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 for (int k = 0; k < 8; k++) { if ((gx & 511) == 0) { //gxが512の倍数のとき ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18); //gaを再計算する } gx++; int p; XEiJ.pnlBM[da] = ((p = VideoController.vcnPal16G8[GraphicScreen.graM4[ga]]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); sx++; tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db ts -= 16; //ts=1 } //if ts==0 } //drawRaster }, //HTS //================================================================================ //XHTS // 概要 // HTS 1024ドット16色1プレーン>テキスト>スプライト // 拡張あり XHTS { @Override public void drawRaster (int src, int dst, boolean rh) { switch (VideoController.vcnReg3Curr >>> 8 & 0b01011111) { // .A.XHPGT case 0b00010000: //HTS_XWC case 0b00010001: //HTS_XWC case 0b00010010: //HTS_XWC case 0b00010011: //HTS_XWC HTS_XWC.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00010100: //HTS_XWP case 0b00010101: //HTS_XWP case 0b00010110: //HTS_XWP case 0b00010111: //HTS_XWP HTS_XWP.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00011000: //HTS_XHC HTS.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00011001: //HTS_XHCT HTS_XHCT.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00011101: //HTS_XHPT HTS_XHPT.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b01000000: //HTS_A case 0b01000001: //HTS_A case 0b01000010: //HTS_A case 0b01000011: //HTS_A case 0b01000100: //HTS_A case 0b01000101: //HTS_A case 0b01000110: //HTS_A case 0b01000111: //HTS_A case 0b01001000: //HTS_A case 0b01001001: //HTS_A case 0b01001010: //HTS_A case 0b01001011: //HTS_A case 0b01001100: //HTS_A case 0b01001101: //HTS_A case 0b01001110: //HTS_A case 0b01001111: //HTS_A case 0b01010000: //HTS_A case 0b01010001: //HTS_A case 0b01010010: //HTS_A case 0b01010011: //HTS_A case 0b01010100: //HTS_A case 0b01010101: //HTS_A case 0b01010110: //HTS_A case 0b01010111: //HTS_A case 0b01011000: //HTS_A case 0b01011001: //HTS_A case 0b01011010: //HTS_A case 0b01011011: //HTS_A case 0b01011100: //HTS_A case 0b01011101: //HTS_A case 0b01011110: //HTS_A case 0b01011111: //HTS_A H_A.drawRaster (src, dst, rh); break; default: HTS.drawRaster (src, dst, rh); VideoController.vcnReportUnimplemented (XHTS); } //switch } //drawRaster }, //XHTS //================================================================================ //HTS_XWC ($0004,$24xx,$1070) // 概要 // HTS 1024ドット16色1プレーン>テキスト>スプライト // XWC 優先順位に関わらず0でない1番目のパレットを偶数化(65536色は奇数化)したパレットのカラーが奇数のとき0でない1番目のパレットのカラーだけ表示する // 手順 // 1番目のパレットを偶数化したパレットのカラーが奇数のとき // 1番目のカラー(0は黒) // さもなくば(1番目のパレットを偶数化したパレットのカラーが偶数のとき) // 1番目のカラーが0でないとき // 1番目のカラー // さもなくば(1番目のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // 中間コード1 // (ls1(hpc(tev(h1p())))!=0?hpc(h1p()):(hpc(h1p())!=0?hpc(h1p()):(txp()!=0?tpc(txp()):spc(spp())))) // 中間コード2 // ls1(hpc(tev(h1p())))!=0?hpc(h1p()):hpc(h1p())!=0?hpc(h1p()):txp()!=0?tpc(txp()):spc(spp()) // 中間コード3 // ls1(hpc(tev(v3=h1p())))!=0?hpc(v3):(v5=hpc(v3))!=0?v5:(v6=txp())!=0?tpc(v6):spc(spp()) // 中間コード4 // ls1(hpc(tev(p=h1p())))!=0?hpc(p):(q=hpc(p))!=0?q:(p=txp())!=0?tpc(p):spc(spp()) // 中間コード5 // (hpc((p=h1p())&-2)&1)!=0?hpc(p):(q=hpc(p))!=0?q:(p=txp())!=0?tpc(p):spc(spp()) // 中間コード6 // (hpc((p=h1p())&-2)&1)!=0?hpo(p):(q=hpc(p))!=0?cto(q):(p=txp())!=0?tpo(p):spo(spp()) HTS_XWC { @Override public void drawRaster (int src, int dst, boolean rh) { SpriteScreen.sprStep3 (); int sx = 16; //スプライトx座標 int ty = CRTC.crtR11TxYZero + src & 1023; //ラスタ int tc = (ty & CRTC.crtMask3) << 7 | CRTC.crtR10TxXCurr >> 3; //テキスト桁位置 int ta0 = 0x00e00000 + ((ty & CRTC.crtMaskMinus4) << 7); //ラスタブロックアドレス int ta1 = 0x00020000 + ta0; int ta2 = 0x00040000 + ta0; int ta3 = 0x00060000 + ta0; int ts = CRTC.crtR10TxXCurr & 7; //テキスト桁境界からのずれ int gx = CRTC.crtR12GrXCurr[0]; //1024ドットx座標。溢れは無視する int gy = CRTC.crtR13GrYZero[0] + src; //1024ドットy座標。溢れは無視する int ga0 = ((gy & 511) << 9); //x=0,y&=511の1024ドットアドレス int gt = VideoController.vcnReg2Curr >> (gy >> 7 & 4); //y<512?G2nd|G1st:G4th|G3rd int da = dst << XEiJ.PNL_BM_OFFSET_BITS; //ARGB出力インデックス int db = da + XEiJ.pnlScreenWidth; //ARGB出力インデックスの終了位置 if (rh) { int half = XEiJ.pnlScreenWidth >> 4 << 3; sx += half; tc = tc + (half >> 3) & CRTC.crtMask511; gx += half; da += half; } int ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18) + (gx & 511); //1024ドットアドレス if (ts == 0) { //テキスト桁境界に合っているとき while (da < db) { int dw = Math.min (db - da, (512 - (gx & 511)) & -8); //今回の幅。8の倍数 gx += dw; //次回の1024ドットx座標 int dc = da + dw; //今回のARGB出力インデックスの終了位置 while (da < dc) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); XEiJ.pnlBM[da + 1] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 1]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]]); XEiJ.pnlBM[da + 2] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 2]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]]); XEiJ.pnlBM[da + 3] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 3]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]]); XEiJ.pnlBM[da + 4] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 4]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]]); XEiJ.pnlBM[da + 5] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 5]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]]); XEiJ.pnlBM[da + 6] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 6]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]]); XEiJ.pnlBM[da + 7] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 7]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]]); sx += 8; ga += 8; da += 8; } //while da<dc if (da < db) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 for (int k = 0; k < 8; k++) { if ((gx & 511) == 0) { //gxが512の倍数のとき ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18); //gaを再計算する } gx++; int p, q; XEiJ.pnlBM[da] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); sx++; tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db } else { //テキスト桁境界に合っていないとき // ts=1のとき int tt = ts + 8; //tt=9 ts += 16; //ts=17 // ........ ........ ........ 01234567 m8[ta0+tc] int p0 = MainMemory.mmrM8[ta0 + tc] << ts; //.......0 1234567_ ________ ________ p0=m8[ta0+tc]<<ts int p1 = MainMemory.mmrM8[ta1 + tc] << ts; int p2 = MainMemory.mmrM8[ta2 + tc] << ts; int p3 = MainMemory.mmrM8[ta3 + tc] << ts; tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 while (da < db) { int dw = Math.min (db - da, (512 - (gx & 511)) & -8); //今回の幅。8の倍数 gx += dw; //次回の1024ドットx座標 int dc = da + dw; //今回のARGB出力インデックスの終了位置 while (da < dc) { // ........ ........ .1234567 ________ p0>>tt // ........ ........ .1234567 89abcdef p0>>tt|m8[ta0+tc]&255 p0 = (p0 >> tt | MainMemory.mmrM8[ta0 + tc] & 255) << ts; //12345678 9abcdef_ ________ ________ p0=(p0>>tt|m8[ta0+tc]&255)<<ts p1 = (p1 >> tt | MainMemory.mmrM8[ta1 + tc] & 255) << ts; //~~~~~~~~ p2 = (p2 >> tt | MainMemory.mmrM8[ta2 + tc] & 255) << ts; //ここを使う p3 = (p3 >> tt | MainMemory.mmrM8[ta3 + tc] & 255) << ts; int tp = (VideoController.VCN_TXP3[p3 >>> 24] | VideoController.VCN_TXP2[p2 >>> 24] | VideoController.VCN_TXP1[p1 >>> 24] | VideoController.VCN_TXP0[p0 >>> 24]); //符号なし右シフトで&255を省略 tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); XEiJ.pnlBM[da + 1] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 1]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]]); XEiJ.pnlBM[da + 2] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 2]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]]); XEiJ.pnlBM[da + 3] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 3]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]]); XEiJ.pnlBM[da + 4] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 4]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]]); XEiJ.pnlBM[da + 5] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 5]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]]); XEiJ.pnlBM[da + 6] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 6]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]]); XEiJ.pnlBM[da + 7] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 7]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]]); sx += 8; ga += 8; da += 8; } //while da<dc if (da < db) { // ........ ........ .1234567 ________ p0>>tt // ........ ........ .1234567 89abcdef p0>>tt|m8[ta0+tc]&255 p0 = (p0 >> tt | MainMemory.mmrM8[ta0 + tc] & 255) << ts; //12345678 9abcdef_ ________ ________ p0=(p0>>tt|m8[ta0+tc]&255)<<ts p1 = (p1 >> tt | MainMemory.mmrM8[ta1 + tc] & 255) << ts; //~~~~~~~~ p2 = (p2 >> tt | MainMemory.mmrM8[ta2 + tc] & 255) << ts; //ここを使う p3 = (p3 >> tt | MainMemory.mmrM8[ta3 + tc] & 255) << ts; int tp = (VideoController.VCN_TXP3[p3 >>> 24] | VideoController.VCN_TXP2[p2 >>> 24] | VideoController.VCN_TXP1[p1 >>> 24] | VideoController.VCN_TXP0[p0 >>> 24]); //符号なし右シフトで&255を省略 tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 for (int k = 0; k < 8; k++) { if ((gx & 511) == 0) { //gxが512の倍数のとき ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18); //gaを再計算する } gx++; int p, q; XEiJ.pnlBM[da] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga]) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); sx++; tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db ts -= 16; //ts=1 } //if ts==0 } //drawRaster }, //HTS_XWC //================================================================================ //HTS_XWP ($0004,$24xx,$1470) // 概要 // HTS 1024ドット16色1プレーン>テキスト>スプライト // XWP 優先順位に関わらず1番目のパレットが3以上の奇数のときそれを偶数化したパレットのカラーだけ表示する // 手順 // 1番目のパレットが1以下のとき // グラフィックパレット0のカラーが0でないとき // グラフィックパレット0のカラー // さもなくば(グラフィックパレット0のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // 1番目のパレットが2以上の偶数のとき // 1番目のカラーが0でないとき // 1番目のカラー // さもなくば(1番目のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // さもなくば(1番目のパレットが3以上の奇数のとき) // 1番目のパレットを偶数化したパレットのカラー(0は黒) // 中間コード1 // (h1p()<=1?(hpc(0)!=0?hpc(0):(txp()!=0?tpc(txp()):spc(spp()))):ls1(h1p())==0?(hpc(h1p())!=0?hpc(h1p()):(txp()!=0?tpc(txp()):spc(spp()))):hpc(tev(h1p()))) // 中間コード2 // h1p()<=1?hpc(0)!=0?hpc(0):txp()!=0?tpc(txp()):spc(spp()):ls1(h1p())==0?hpc(h1p())!=0?hpc(h1p()):txp()!=0?tpc(txp()):spc(spp()):hpc(tev(h1p())) // 中間コード3 // (v0=h1p())<=1?(v1=hpc(0))!=0?v1:(v2=txp())!=0?tpc(v2):spc(spp()):ls1(v0)==0?(v7=hpc(v0))!=0?v7:(v8=txp())!=0?tpc(v8):spc(spp()):hpc(tev(v0)) // 中間コード4 // (p=h1p())<=1?(p=hpc(0))!=0?p:(p=txp())!=0?tpc(p):spc(spp()):ls1(p)==0?(q=hpc(p))!=0?q:(p=txp())!=0?tpc(p):spc(spp()):hpc(tev(p)) // 中間コード5 // (p=h1p())<=1?(p=hpc(0))!=0?p:(p=txp())!=0?tpc(p):spc(spp()):(p&1)==0?(q=hpc(p))!=0?q:(p=txp())!=0?tpc(p):spc(spp()):hpc(p&-2) // 中間コード6 // (p=h1p())<=1?(p=hpc(0))!=0?cto(p):(p=txp())!=0?tpo(p):spo(spp()):(p&1)==0?(q=hpc(p))!=0?cto(q):(p=txp())!=0?tpo(p):spo(spp()):hpo(p&-2) HTS_XWP { @Override public void drawRaster (int src, int dst, boolean rh) { SpriteScreen.sprStep3 (); int sx = 16; //スプライトx座標 int ty = CRTC.crtR11TxYZero + src & 1023; //ラスタ int tc = (ty & CRTC.crtMask3) << 7 | CRTC.crtR10TxXCurr >> 3; //テキスト桁位置 int ta0 = 0x00e00000 + ((ty & CRTC.crtMaskMinus4) << 7); //ラスタブロックアドレス int ta1 = 0x00020000 + ta0; int ta2 = 0x00040000 + ta0; int ta3 = 0x00060000 + ta0; int ts = CRTC.crtR10TxXCurr & 7; //テキスト桁境界からのずれ int gx = CRTC.crtR12GrXCurr[0]; //1024ドットx座標。溢れは無視する int gy = CRTC.crtR13GrYZero[0] + src; //1024ドットy座標。溢れは無視する int ga0 = ((gy & 511) << 9); //x=0,y&=511の1024ドットアドレス int gt = VideoController.vcnReg2Curr >> (gy >> 7 & 4); //y<512?G2nd|G1st:G4th|G3rd int da = dst << XEiJ.PNL_BM_OFFSET_BITS; //ARGB出力インデックス int db = da + XEiJ.pnlScreenWidth; //ARGB出力インデックスの終了位置 if (rh) { int half = XEiJ.pnlScreenWidth >> 4 << 3; sx += half; tc = tc + (half >> 3) & CRTC.crtMask511; gx += half; da += half; } int ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18) + (gx & 511); //1024ドットアドレス if (ts == 0) { //テキスト桁境界に合っているとき while (da < db) { int dw = Math.min (db - da, (512 - (gx & 511)) & -8); //今回の幅。8の倍数 gx += dw; //次回の1024ドットx座標 int dc = da + dw; //今回のARGB出力インデックスの終了位置 while (da < dc) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((p = GraphicScreen.graM4[ga]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 1] = ((p = GraphicScreen.graM4[ga + 1]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 2] = ((p = GraphicScreen.graM4[ga + 2]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 3] = ((p = GraphicScreen.graM4[ga + 3]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 4] = ((p = GraphicScreen.graM4[ga + 4]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 5] = ((p = GraphicScreen.graM4[ga + 5]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 6] = ((p = GraphicScreen.graM4[ga + 6]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 7] = ((p = GraphicScreen.graM4[ga + 7]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : VideoController.vcnPal32G8[p & -2]); sx += 8; ga += 8; da += 8; } //while da<dc if (da < db) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 for (int k = 0; k < 8; k++) { if ((gx & 511) == 0) { //gxが512の倍数のとき ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18); //gaを再計算する } gx++; int p, q; XEiJ.pnlBM[da] = ((p = GraphicScreen.graM4[ga]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : VideoController.vcnPal32G8[p & -2]); sx++; tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db } else { //テキスト桁境界に合っていないとき // ts=1のとき int tt = ts + 8; //tt=9 ts += 16; //ts=17 // ........ ........ ........ 01234567 m8[ta0+tc] int p0 = MainMemory.mmrM8[ta0 + tc] << ts; //.......0 1234567_ ________ ________ p0=m8[ta0+tc]<<ts int p1 = MainMemory.mmrM8[ta1 + tc] << ts; int p2 = MainMemory.mmrM8[ta2 + tc] << ts; int p3 = MainMemory.mmrM8[ta3 + tc] << ts; tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 while (da < db) { int dw = Math.min (db - da, (512 - (gx & 511)) & -8); //今回の幅。8の倍数 gx += dw; //次回の1024ドットx座標 int dc = da + dw; //今回のARGB出力インデックスの終了位置 while (da < dc) { // ........ ........ .1234567 ________ p0>>tt // ........ ........ .1234567 89abcdef p0>>tt|m8[ta0+tc]&255 p0 = (p0 >> tt | MainMemory.mmrM8[ta0 + tc] & 255) << ts; //12345678 9abcdef_ ________ ________ p0=(p0>>tt|m8[ta0+tc]&255)<<ts p1 = (p1 >> tt | MainMemory.mmrM8[ta1 + tc] & 255) << ts; //~~~~~~~~ p2 = (p2 >> tt | MainMemory.mmrM8[ta2 + tc] & 255) << ts; //ここを使う p3 = (p3 >> tt | MainMemory.mmrM8[ta3 + tc] & 255) << ts; int tp = (VideoController.VCN_TXP3[p3 >>> 24] | VideoController.VCN_TXP2[p2 >>> 24] | VideoController.VCN_TXP1[p1 >>> 24] | VideoController.VCN_TXP0[p0 >>> 24]); //符号なし右シフトで&255を省略 tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((p = GraphicScreen.graM4[ga]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 1] = ((p = GraphicScreen.graM4[ga + 1]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 2] = ((p = GraphicScreen.graM4[ga + 2]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 3] = ((p = GraphicScreen.graM4[ga + 3]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 4] = ((p = GraphicScreen.graM4[ga + 4]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 5] = ((p = GraphicScreen.graM4[ga + 5]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 6] = ((p = GraphicScreen.graM4[ga + 6]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 7] = ((p = GraphicScreen.graM4[ga + 7]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : VideoController.vcnPal32G8[p & -2]); sx += 8; ga += 8; da += 8; } //while da<dc if (da < db) { // ........ ........ .1234567 ________ p0>>tt // ........ ........ .1234567 89abcdef p0>>tt|m8[ta0+tc]&255 p0 = (p0 >> tt | MainMemory.mmrM8[ta0 + tc] & 255) << ts; //12345678 9abcdef_ ________ ________ p0=(p0>>tt|m8[ta0+tc]&255)<<ts p1 = (p1 >> tt | MainMemory.mmrM8[ta1 + tc] & 255) << ts; //~~~~~~~~ p2 = (p2 >> tt | MainMemory.mmrM8[ta2 + tc] & 255) << ts; //ここを使う p3 = (p3 >> tt | MainMemory.mmrM8[ta3 + tc] & 255) << ts; int tp = (VideoController.VCN_TXP3[p3 >>> 24] | VideoController.VCN_TXP2[p2 >>> 24] | VideoController.VCN_TXP1[p1 >>> 24] | VideoController.VCN_TXP0[p0 >>> 24]); //符号なし右シフトで&255を省略 tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 for (int k = 0; k < 8; k++) { if ((gx & 511) == 0) { //gxが512の倍数のとき ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18); //gaを再計算する } gx++; int p, q; XEiJ.pnlBM[da] = ((p = GraphicScreen.graM4[ga]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : VideoController.vcnPal32G8[p & -2]); sx++; tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db ts -= 16; //ts=1 } //if ts==0 } //drawRaster }, //HTS_XWP //================================================================================ //HTS_XHCT ($0004,$24xx,$1970) // 概要 // HTS 1024ドット16色1プレーン>テキスト>スプライト // XHCT 0でない1番目のパレットを偶数化(65536色は奇数化)したパレットのカラーが奇数のとき0でない1番目のカラーと奥のスプライト・テキストのカラーを混ぜる // 手順 // 1番目のパレットを偶数化したパレットのカラーが奇数のとき // 1番目のカラーと // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // を混ぜたカラー(0は黒) // さもなくば(1番目のパレットを偶数化したパレットのカラーが偶数のとき) // 1番目のカラーが0でないとき // 1番目のカラー // さもなくば(1番目のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // 中間コード1 // (ls1(hpc(tev(h1p())))!=0?mix(hpc(h1p()),(txp()!=0?tpc(txp()):spc(spp()))):(hpc(h1p())!=0?hpc(h1p()):(txp()!=0?tpc(txp()):spc(spp())))) // 中間コード2 // ls1(hpc(tev(h1p())))!=0?mix(hpc(h1p()),txp()!=0?tpc(txp()):spc(spp())):hpc(h1p())!=0?hpc(h1p()):txp()!=0?tpc(txp()):spc(spp()) // 中間コード3 // ls1(hpc(tev(v3=h1p())))!=0?mix(hpc(v3),(v6=txp())!=0?tpc(v6):spc(spp())):(v10=hpc(v3))!=0?v10:(v11=txp())!=0?tpc(v11):spc(spp()) // 中間コード4 // ls1(hpc(tev(p=h1p())))!=0?mix(hpc(p),(p=txp())!=0?tpc(p):spc(spp())):(q=hpc(p))!=0?q:(p=txp())!=0?tpc(p):spc(spp()) // 中間コード5 // (hpc((p=h1p())&-2)&1)!=0?mix(hpc(p),(p=txp())!=0?tpc(p):spc(spp())):(q=hpc(p))!=0?q:(p=txp())!=0?tpc(p):spc(spp()) // 中間コード6 // (hpc((p=h1p())&-2)&1)!=0?cto(mix(hpc(p),(p=txp())!=0?tpc(p):spc(spp()))):(q=hpc(p))!=0?cto(q):(p=txp())!=0?tpo(p):spo(spp()) HTS_XHCT { @Override public void drawRaster (int src, int dst, boolean rh) { SpriteScreen.sprStep3 (); int sx = 16; //スプライトx座標 int ty = CRTC.crtR11TxYZero + src & 1023; //ラスタ int tc = (ty & CRTC.crtMask3) << 7 | CRTC.crtR10TxXCurr >> 3; //テキスト桁位置 int ta0 = 0x00e00000 + ((ty & CRTC.crtMaskMinus4) << 7); //ラスタブロックアドレス int ta1 = 0x00020000 + ta0; int ta2 = 0x00040000 + ta0; int ta3 = 0x00060000 + ta0; int ts = CRTC.crtR10TxXCurr & 7; //テキスト桁境界からのずれ int gx = CRTC.crtR12GrXCurr[0]; //1024ドットx座標。溢れは無視する int gy = CRTC.crtR13GrYZero[0] + src; //1024ドットy座標。溢れは無視する int ga0 = ((gy & 511) << 9); //x=0,y&=511の1024ドットアドレス int gt = VideoController.vcnReg2Curr >> (gy >> 7 & 4); //y<512?G2nd|G1st:G4th|G3rd int da = dst << XEiJ.PNL_BM_OFFSET_BITS; //ARGB出力インデックス int db = da + XEiJ.pnlScreenWidth; //ARGB出力インデックスの終了位置 if (rh) { int half = XEiJ.pnlScreenWidth >> 4 << 3; sx += half; tc = tc + (half >> 3) & CRTC.crtMask511; gx += half; da += half; } int ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18) + (gx & 511); //1024ドットアドレス if (ts == 0) { //テキスト桁境界に合っているとき while (da < db) { int dw = Math.min (db - da, (512 - (gx & 511)) & -8); //今回の幅。8の倍数 gx += dw; //次回の1024ドットx座標 int dc = da + dw; //今回のARGB出力インデックスの終了位置 while (da < dc) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 28) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); XEiJ.pnlBM[da + 1] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 1]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 1]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]]); XEiJ.pnlBM[da + 2] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 2]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 2]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]]); XEiJ.pnlBM[da + 3] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 3]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 3]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]]); XEiJ.pnlBM[da + 4] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 4]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 4]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]]); XEiJ.pnlBM[da + 5] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 5]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 5]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]]); XEiJ.pnlBM[da + 6] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 6]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 6]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]]); XEiJ.pnlBM[da + 7] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 7]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 7]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]]); sx += 8; ga += 8; da += 8; } //while da<dc if (da < db) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 for (int k = 0; k < 8; k++) { if ((gx & 511) == 0) { //gxが512の倍数のとき ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18); //gaを再計算する } gx++; int p, q; XEiJ.pnlBM[da] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 28) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); sx++; tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db } else { //テキスト桁境界に合っていないとき // ts=1のとき int tt = ts + 8; //tt=9 ts += 16; //ts=17 // ........ ........ ........ 01234567 m8[ta0+tc] int p0 = MainMemory.mmrM8[ta0 + tc] << ts; //.......0 1234567_ ________ ________ p0=m8[ta0+tc]<<ts int p1 = MainMemory.mmrM8[ta1 + tc] << ts; int p2 = MainMemory.mmrM8[ta2 + tc] << ts; int p3 = MainMemory.mmrM8[ta3 + tc] << ts; tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 while (da < db) { int dw = Math.min (db - da, (512 - (gx & 511)) & -8); //今回の幅。8の倍数 gx += dw; //次回の1024ドットx座標 int dc = da + dw; //今回のARGB出力インデックスの終了位置 while (da < dc) { // ........ ........ .1234567 ________ p0>>tt // ........ ........ .1234567 89abcdef p0>>tt|m8[ta0+tc]&255 p0 = (p0 >> tt | MainMemory.mmrM8[ta0 + tc] & 255) << ts; //12345678 9abcdef_ ________ ________ p0=(p0>>tt|m8[ta0+tc]&255)<<ts p1 = (p1 >> tt | MainMemory.mmrM8[ta1 + tc] & 255) << ts; //~~~~~~~~ p2 = (p2 >> tt | MainMemory.mmrM8[ta2 + tc] & 255) << ts; //ここを使う p3 = (p3 >> tt | MainMemory.mmrM8[ta3 + tc] & 255) << ts; int tp = (VideoController.VCN_TXP3[p3 >>> 24] | VideoController.VCN_TXP2[p2 >>> 24] | VideoController.VCN_TXP1[p1 >>> 24] | VideoController.VCN_TXP0[p0 >>> 24]); //符号なし右シフトで&255を省略 tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 28) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); XEiJ.pnlBM[da + 1] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 1]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 1]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]]); XEiJ.pnlBM[da + 2] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 2]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 2]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]]); XEiJ.pnlBM[da + 3] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 3]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 3]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]]); XEiJ.pnlBM[da + 4] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 4]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 4]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]]); XEiJ.pnlBM[da + 5] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 5]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 5]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]]); XEiJ.pnlBM[da + 6] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 6]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 6]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]]); XEiJ.pnlBM[da + 7] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga + 7]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 7]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]]); sx += 8; ga += 8; da += 8; } //while da<dc if (da < db) { // ........ ........ .1234567 ________ p0>>tt // ........ ........ .1234567 89abcdef p0>>tt|m8[ta0+tc]&255 p0 = (p0 >> tt | MainMemory.mmrM8[ta0 + tc] & 255) << ts; //12345678 9abcdef_ ________ ________ p0=(p0>>tt|m8[ta0+tc]&255)<<ts p1 = (p1 >> tt | MainMemory.mmrM8[ta1 + tc] & 255) << ts; //~~~~~~~~ p2 = (p2 >> tt | MainMemory.mmrM8[ta2 + tc] & 255) << ts; //ここを使う p3 = (p3 >> tt | MainMemory.mmrM8[ta3 + tc] & 255) << ts; int tp = (VideoController.VCN_TXP3[p3 >>> 24] | VideoController.VCN_TXP2[p2 >>> 24] | VideoController.VCN_TXP1[p1 >>> 24] | VideoController.VCN_TXP0[p0 >>> 24]); //符号なし右シフトで&255を省略 tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 for (int k = 0; k < 8; k++) { if ((gx & 511) == 0) { //gxが512の倍数のとき ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18); //gaを再計算する } gx++; int p, q; XEiJ.pnlBM[da] = ((VideoController.vcnPal16G8[(p = GraphicScreen.graM4[ga]) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 28) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); sx++; tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db ts -= 16; //ts=1 } //if ts==0 } //drawRaster }, //HTS_XHCT //================================================================================ //HTS_XHPT ($0004,$24xx,$1D70) // 概要 // HTS 1024ドット16色1プレーン>テキスト>スプライト // XHPT 1番目のパレットが3以上の奇数のときそれを偶数化したパレットのカラーと奥のスプライト・テキストのカラーを混ぜる // 手順 // 1番目のパレットが1以下のとき // グラフィックパレット0のカラーが0でないとき // グラフィックパレット0のカラー // さもなくば(グラフィックパレット0のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // 1番目のパレットが2以上の偶数のとき // 1番目のカラーが0でないとき // 1番目のカラー // さもなくば(1番目のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // さもなくば(1番目のパレットが3以上の奇数のとき) // 1番目のパレットを偶数化したパレットのカラーと // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // を混ぜたカラー(0は黒) // 中間コード1 // (h1p()<=1?(hpc(0)!=0?hpc(0):(txp()!=0?tpc(txp()):spc(spp()))):ls1(h1p())==0?(hpc(h1p())!=0?hpc(h1p()):(txp()!=0?tpc(txp()):spc(spp()))):mix(hpc(tev(h1p())),(txp()!=0?tpc(txp()):spc(spp())))) // 中間コード2 // h1p()<=1?hpc(0)!=0?hpc(0):txp()!=0?tpc(txp()):spc(spp()):ls1(h1p())==0?hpc(h1p())!=0?hpc(h1p()):txp()!=0?tpc(txp()):spc(spp()):mix(hpc(tev(h1p())),txp()!=0?tpc(txp()):spc(spp())) // 中間コード3 // (v0=h1p())<=1?(v1=hpc(0))!=0?v1:(v2=txp())!=0?tpc(v2):spc(spp()):ls1(v0)==0?(v7=hpc(v0))!=0?v7:(v8=txp())!=0?tpc(v8):spc(spp()):mix(hpc(tev(v0)),(v15=txp())!=0?tpc(v15):spc(spp())) // 中間コード4 // (p=h1p())<=1?(p=hpc(0))!=0?p:(p=txp())!=0?tpc(p):spc(spp()):ls1(p)==0?(q=hpc(p))!=0?q:(p=txp())!=0?tpc(p):spc(spp()):mix(hpc(tev(p)),(p=txp())!=0?tpc(p):spc(spp())) // 中間コード5 // (p=h1p())<=1?(p=hpc(0))!=0?p:(p=txp())!=0?tpc(p):spc(spp()):(p&1)==0?(q=hpc(p))!=0?q:(p=txp())!=0?tpc(p):spc(spp()):mix(hpc(p&-2),(p=txp())!=0?tpc(p):spc(spp())) // 中間コード6 // (p=h1p())<=1?(p=hpc(0))!=0?cto(p):(p=txp())!=0?tpo(p):spo(spp()):(p&1)==0?(q=hpc(p))!=0?cto(q):(p=txp())!=0?tpo(p):spo(spp()):cto(mix(hpc(p&-2),(p=txp())!=0?tpc(p):spc(spp()))) HTS_XHPT { @Override public void drawRaster (int src, int dst, boolean rh) { SpriteScreen.sprStep3 (); int sx = 16; //スプライトx座標 int ty = CRTC.crtR11TxYZero + src & 1023; //ラスタ int tc = (ty & CRTC.crtMask3) << 7 | CRTC.crtR10TxXCurr >> 3; //テキスト桁位置 int ta0 = 0x00e00000 + ((ty & CRTC.crtMaskMinus4) << 7); //ラスタブロックアドレス int ta1 = 0x00020000 + ta0; int ta2 = 0x00040000 + ta0; int ta3 = 0x00060000 + ta0; int ts = CRTC.crtR10TxXCurr & 7; //テキスト桁境界からのずれ int gx = CRTC.crtR12GrXCurr[0]; //1024ドットx座標。溢れは無視する int gy = CRTC.crtR13GrYZero[0] + src; //1024ドットy座標。溢れは無視する int ga0 = ((gy & 511) << 9); //x=0,y&=511の1024ドットアドレス int gt = VideoController.vcnReg2Curr >> (gy >> 7 & 4); //y<512?G2nd|G1st:G4th|G3rd int da = dst << XEiJ.PNL_BM_OFFSET_BITS; //ARGB出力インデックス int db = da + XEiJ.pnlScreenWidth; //ARGB出力インデックスの終了位置 if (rh) { int half = XEiJ.pnlScreenWidth >> 4 << 3; sx += half; tc = tc + (half >> 3) & CRTC.crtMask511; gx += half; da += half; } int ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18) + (gx & 511); //1024ドットアドレス if (ts == 0) { //テキスト桁境界に合っているとき while (da < db) { int dw = Math.min (db - da, (512 - (gx & 511)) & -8); //今回の幅。8の倍数 gx += dw; //次回の1024ドットx座標 int dc = da + dw; //今回のARGB出力インデックスの終了位置 while (da < dc) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((p = GraphicScreen.graM4[ga]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 28) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx]])]); XEiJ.pnlBM[da + 1] = ((p = GraphicScreen.graM4[ga + 1]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 1]])]); XEiJ.pnlBM[da + 2] = ((p = GraphicScreen.graM4[ga + 2]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 2]])]); XEiJ.pnlBM[da + 3] = ((p = GraphicScreen.graM4[ga + 3]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 3]])]); XEiJ.pnlBM[da + 4] = ((p = GraphicScreen.graM4[ga + 4]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 4]])]); XEiJ.pnlBM[da + 5] = ((p = GraphicScreen.graM4[ga + 5]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 5]])]); XEiJ.pnlBM[da + 6] = ((p = GraphicScreen.graM4[ga + 6]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 6]])]); XEiJ.pnlBM[da + 7] = ((p = GraphicScreen.graM4[ga + 7]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 7]])]); sx += 8; ga += 8; da += 8; } //while da<dc if (da < db) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 for (int k = 0; k < 8; k++) { if ((gx & 511) == 0) { //gxが512の倍数のとき ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18); //gaを再計算する } gx++; int p, q; XEiJ.pnlBM[da] = ((p = GraphicScreen.graM4[ga]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 28) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx]])]); sx++; tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db } else { //テキスト桁境界に合っていないとき // ts=1のとき int tt = ts + 8; //tt=9 ts += 16; //ts=17 // ........ ........ ........ 01234567 m8[ta0+tc] int p0 = MainMemory.mmrM8[ta0 + tc] << ts; //.......0 1234567_ ________ ________ p0=m8[ta0+tc]<<ts int p1 = MainMemory.mmrM8[ta1 + tc] << ts; int p2 = MainMemory.mmrM8[ta2 + tc] << ts; int p3 = MainMemory.mmrM8[ta3 + tc] << ts; tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 while (da < db) { int dw = Math.min (db - da, (512 - (gx & 511)) & -8); //今回の幅。8の倍数 gx += dw; //次回の1024ドットx座標 int dc = da + dw; //今回のARGB出力インデックスの終了位置 while (da < dc) { // ........ ........ .1234567 ________ p0>>tt // ........ ........ .1234567 89abcdef p0>>tt|m8[ta0+tc]&255 p0 = (p0 >> tt | MainMemory.mmrM8[ta0 + tc] & 255) << ts; //12345678 9abcdef_ ________ ________ p0=(p0>>tt|m8[ta0+tc]&255)<<ts p1 = (p1 >> tt | MainMemory.mmrM8[ta1 + tc] & 255) << ts; //~~~~~~~~ p2 = (p2 >> tt | MainMemory.mmrM8[ta2 + tc] & 255) << ts; //ここを使う p3 = (p3 >> tt | MainMemory.mmrM8[ta3 + tc] & 255) << ts; int tp = (VideoController.VCN_TXP3[p3 >>> 24] | VideoController.VCN_TXP2[p2 >>> 24] | VideoController.VCN_TXP1[p1 >>> 24] | VideoController.VCN_TXP0[p0 >>> 24]); //符号なし右シフトで&255を省略 tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((p = GraphicScreen.graM4[ga]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 28) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx]])]); XEiJ.pnlBM[da + 1] = ((p = GraphicScreen.graM4[ga + 1]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 1]])]); XEiJ.pnlBM[da + 2] = ((p = GraphicScreen.graM4[ga + 2]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 2]])]); XEiJ.pnlBM[da + 3] = ((p = GraphicScreen.graM4[ga + 3]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 3]])]); XEiJ.pnlBM[da + 4] = ((p = GraphicScreen.graM4[ga + 4]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 4]])]); XEiJ.pnlBM[da + 5] = ((p = GraphicScreen.graM4[ga + 5]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 5]])]); XEiJ.pnlBM[da + 6] = ((p = GraphicScreen.graM4[ga + 6]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 6]])]); XEiJ.pnlBM[da + 7] = ((p = GraphicScreen.graM4[ga + 7]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 7]])]); sx += 8; ga += 8; da += 8; } //while da<dc if (da < db) { // ........ ........ .1234567 ________ p0>>tt // ........ ........ .1234567 89abcdef p0>>tt|m8[ta0+tc]&255 p0 = (p0 >> tt | MainMemory.mmrM8[ta0 + tc] & 255) << ts; //12345678 9abcdef_ ________ ________ p0=(p0>>tt|m8[ta0+tc]&255)<<ts p1 = (p1 >> tt | MainMemory.mmrM8[ta1 + tc] & 255) << ts; //~~~~~~~~ p2 = (p2 >> tt | MainMemory.mmrM8[ta2 + tc] & 255) << ts; //ここを使う p3 = (p3 >> tt | MainMemory.mmrM8[ta3 + tc] & 255) << ts; int tp = (VideoController.VCN_TXP3[p3 >>> 24] | VideoController.VCN_TXP2[p2 >>> 24] | VideoController.VCN_TXP1[p1 >>> 24] | VideoController.VCN_TXP0[p0 >>> 24]); //符号なし右シフトで&255を省略 tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 for (int k = 0; k < 8; k++) { if ((gx & 511) == 0) { //gxが512の倍数のとき ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18); //gaを再計算する } gx++; int p, q; XEiJ.pnlBM[da] = ((p = GraphicScreen.graM4[ga]) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 28) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx]])]); sx++; tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db ts -= 16; //ts=1 } //if ts==0 } //drawRaster }, //HTS_XHPT //================================================================================ //ITS ($0005,$24xx,$0070) // 概要 // ITS 1024ドット256色1プレーン>テキスト>スプライト // 拡張なし // 手順 // 1番目のカラーが0でないとき // 1番目のカラー // さもなくば(1番目のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // 中間コード1 // (ipc(i1p())!=0?ipc(i1p()):(txp()!=0?tpc(txp()):spc(spp()))) // 中間コード2 // ipc(i1p())!=0?ipc(i1p()):txp()!=0?tpc(txp()):spc(spp()) // 中間コード3 // (v0=ipc(i1p()))!=0?v0:(v2=txp())!=0?tpc(v2):spc(spp()) // 中間コード4 // (p=ipc(i1p()))!=0?p:(p=txp())!=0?tpc(p):spc(spp()) // 中間コード5 // (p=ipc(i1p()))!=0?p:(p=txp())!=0?tpc(p):spc(spp()) // 中間コード6 // (p=ipc(i1p()))!=0?cto(p):(p=txp())!=0?tpo(p):spo(spp()) ITS { @Override public void drawRaster (int src, int dst, boolean rh) { SpriteScreen.sprStep3 (); int sx = 16; //スプライトx座標 int ty = CRTC.crtR11TxYZero + src & 1023; //ラスタ int tc = (ty & CRTC.crtMask3) << 7 | CRTC.crtR10TxXCurr >> 3; //テキスト桁位置 int ta0 = 0x00e00000 + ((ty & CRTC.crtMaskMinus4) << 7); //ラスタブロックアドレス int ta1 = 0x00020000 + ta0; int ta2 = 0x00040000 + ta0; int ta3 = 0x00060000 + ta0; int ts = CRTC.crtR10TxXCurr & 7; //テキスト桁境界からのずれ int gx = CRTC.crtR12GrXCurr[0]; //1024ドットx座標。溢れは無視する int gy = CRTC.crtR13GrYZero[0] + src; //1024ドットy座標。溢れは無視する int ga0 = ((gy & 511) << 9); //x=0,y&=511の1024ドットアドレス int gt = VideoController.vcnReg2Curr >> (gy >> 7 & 4); //y<512?G2nd|G1st:G4th|G3rd int da = dst << XEiJ.PNL_BM_OFFSET_BITS; //ARGB出力インデックス int db = da + XEiJ.pnlScreenWidth; //ARGB出力インデックスの終了位置 if (rh) { int half = XEiJ.pnlScreenWidth >> 4 << 3; sx += half; tc = tc + (half >> 3) & CRTC.crtMask511; gx += half; da += half; } int ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18) + (gx & 511); //1024ドットアドレス if (ts == 0) { //テキスト桁境界に合っているとき while (da < db) { int dw = Math.min (db - da, (512 - (gx & 511)) & -8); //今回の幅。8の倍数 gx += dw; //次回の1024ドットx座標 int dc = da + dw; //今回のARGB出力インデックスの終了位置 while (da < dc) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p; XEiJ.pnlBM[da] = ((p = VideoController.vcnPal16G8[(GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16G8[(GraphicScreen.graM4[ga + 1048577] << 4 | GraphicScreen.graM4[ga + 1])]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16G8[(GraphicScreen.graM4[ga + 1048578] << 4 | GraphicScreen.graM4[ga + 2])]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16G8[(GraphicScreen.graM4[ga + 1048579] << 4 | GraphicScreen.graM4[ga + 3])]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16G8[(GraphicScreen.graM4[ga + 1048580] << 4 | GraphicScreen.graM4[ga + 4])]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16G8[(GraphicScreen.graM4[ga + 1048581] << 4 | GraphicScreen.graM4[ga + 5])]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16G8[(GraphicScreen.graM4[ga + 1048582] << 4 | GraphicScreen.graM4[ga + 6])]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16G8[(GraphicScreen.graM4[ga + 1048583] << 4 | GraphicScreen.graM4[ga + 7])]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]]); sx += 8; ga += 8; da += 8; } //while da<dc if (da < db) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 for (int k = 0; k < 8; k++) { if ((gx & 511) == 0) { //gxが512の倍数のとき ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18); //gaを再計算する } gx++; int p; XEiJ.pnlBM[da] = ((p = VideoController.vcnPal16G8[(GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); sx++; tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db } else { //テキスト桁境界に合っていないとき // ts=1のとき int tt = ts + 8; //tt=9 ts += 16; //ts=17 // ........ ........ ........ 01234567 m8[ta0+tc] int p0 = MainMemory.mmrM8[ta0 + tc] << ts; //.......0 1234567_ ________ ________ p0=m8[ta0+tc]<<ts int p1 = MainMemory.mmrM8[ta1 + tc] << ts; int p2 = MainMemory.mmrM8[ta2 + tc] << ts; int p3 = MainMemory.mmrM8[ta3 + tc] << ts; tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 while (da < db) { int dw = Math.min (db - da, (512 - (gx & 511)) & -8); //今回の幅。8の倍数 gx += dw; //次回の1024ドットx座標 int dc = da + dw; //今回のARGB出力インデックスの終了位置 while (da < dc) { // ........ ........ .1234567 ________ p0>>tt // ........ ........ .1234567 89abcdef p0>>tt|m8[ta0+tc]&255 p0 = (p0 >> tt | MainMemory.mmrM8[ta0 + tc] & 255) << ts; //12345678 9abcdef_ ________ ________ p0=(p0>>tt|m8[ta0+tc]&255)<<ts p1 = (p1 >> tt | MainMemory.mmrM8[ta1 + tc] & 255) << ts; //~~~~~~~~ p2 = (p2 >> tt | MainMemory.mmrM8[ta2 + tc] & 255) << ts; //ここを使う p3 = (p3 >> tt | MainMemory.mmrM8[ta3 + tc] & 255) << ts; int tp = (VideoController.VCN_TXP3[p3 >>> 24] | VideoController.VCN_TXP2[p2 >>> 24] | VideoController.VCN_TXP1[p1 >>> 24] | VideoController.VCN_TXP0[p0 >>> 24]); //符号なし右シフトで&255を省略 tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p; XEiJ.pnlBM[da] = ((p = VideoController.vcnPal16G8[(GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); XEiJ.pnlBM[da + 1] = ((p = VideoController.vcnPal16G8[(GraphicScreen.graM4[ga + 1048577] << 4 | GraphicScreen.graM4[ga + 1])]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]]); XEiJ.pnlBM[da + 2] = ((p = VideoController.vcnPal16G8[(GraphicScreen.graM4[ga + 1048578] << 4 | GraphicScreen.graM4[ga + 2])]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]]); XEiJ.pnlBM[da + 3] = ((p = VideoController.vcnPal16G8[(GraphicScreen.graM4[ga + 1048579] << 4 | GraphicScreen.graM4[ga + 3])]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]]); XEiJ.pnlBM[da + 4] = ((p = VideoController.vcnPal16G8[(GraphicScreen.graM4[ga + 1048580] << 4 | GraphicScreen.graM4[ga + 4])]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]]); XEiJ.pnlBM[da + 5] = ((p = VideoController.vcnPal16G8[(GraphicScreen.graM4[ga + 1048581] << 4 | GraphicScreen.graM4[ga + 5])]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]]); XEiJ.pnlBM[da + 6] = ((p = VideoController.vcnPal16G8[(GraphicScreen.graM4[ga + 1048582] << 4 | GraphicScreen.graM4[ga + 6])]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]]); XEiJ.pnlBM[da + 7] = ((p = VideoController.vcnPal16G8[(GraphicScreen.graM4[ga + 1048583] << 4 | GraphicScreen.graM4[ga + 7])]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]]); sx += 8; ga += 8; da += 8; } //while da<dc if (da < db) { // ........ ........ .1234567 ________ p0>>tt // ........ ........ .1234567 89abcdef p0>>tt|m8[ta0+tc]&255 p0 = (p0 >> tt | MainMemory.mmrM8[ta0 + tc] & 255) << ts; //12345678 9abcdef_ ________ ________ p0=(p0>>tt|m8[ta0+tc]&255)<<ts p1 = (p1 >> tt | MainMemory.mmrM8[ta1 + tc] & 255) << ts; //~~~~~~~~ p2 = (p2 >> tt | MainMemory.mmrM8[ta2 + tc] & 255) << ts; //ここを使う p3 = (p3 >> tt | MainMemory.mmrM8[ta3 + tc] & 255) << ts; int tp = (VideoController.VCN_TXP3[p3 >>> 24] | VideoController.VCN_TXP2[p2 >>> 24] | VideoController.VCN_TXP1[p1 >>> 24] | VideoController.VCN_TXP0[p0 >>> 24]); //符号なし右シフトで&255を省略 tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 for (int k = 0; k < 8; k++) { if ((gx & 511) == 0) { //gxが512の倍数のとき ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18); //gaを再計算する } gx++; int p; XEiJ.pnlBM[da] = ((p = VideoController.vcnPal16G8[(GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); sx++; tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db ts -= 16; //ts=1 } //if ts==0 } //drawRaster }, //ITS //================================================================================ //XITS // 概要 // ITS 1024ドット256色1プレーン>テキスト>スプライト // 拡張あり XITS { @Override public void drawRaster (int src, int dst, boolean rh) { switch (VideoController.vcnReg3Curr >>> 8 & 0b01011111) { // .A.XHPGT case 0b00010000: //ITS_XWC case 0b00010001: //ITS_XWC case 0b00010010: //ITS_XWC case 0b00010011: //ITS_XWC ITS_XWC.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00010100: //ITS_XWP case 0b00010101: //ITS_XWP case 0b00010110: //ITS_XWP case 0b00010111: //ITS_XWP ITS_XWP.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00011000: //ITS_XHC ITS.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00011001: //ITS_XHCT ITS_XHCT.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00011101: //ITS_XHPT ITS_XHPT.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b01000000: //ITS_A case 0b01000001: //ITS_A case 0b01000010: //ITS_A case 0b01000011: //ITS_A case 0b01000100: //ITS_A case 0b01000101: //ITS_A case 0b01000110: //ITS_A case 0b01000111: //ITS_A case 0b01001000: //ITS_A case 0b01001001: //ITS_A case 0b01001010: //ITS_A case 0b01001011: //ITS_A case 0b01001100: //ITS_A case 0b01001101: //ITS_A case 0b01001110: //ITS_A case 0b01001111: //ITS_A case 0b01010000: //ITS_A case 0b01010001: //ITS_A case 0b01010010: //ITS_A case 0b01010011: //ITS_A case 0b01010100: //ITS_A case 0b01010101: //ITS_A case 0b01010110: //ITS_A case 0b01010111: //ITS_A case 0b01011000: //ITS_A case 0b01011001: //ITS_A case 0b01011010: //ITS_A case 0b01011011: //ITS_A case 0b01011100: //ITS_A case 0b01011101: //ITS_A case 0b01011110: //ITS_A case 0b01011111: //ITS_A I_A.drawRaster (src, dst, rh); break; default: ITS.drawRaster (src, dst, rh); VideoController.vcnReportUnimplemented (XITS); } //switch } //drawRaster }, //XITS //================================================================================ //ITS_XWC ($0005,$24xx,$1070) // 概要 // ITS 1024ドット256色1プレーン>テキスト>スプライト // XWC 優先順位に関わらず0でない1番目のパレットを偶数化(65536色は奇数化)したパレットのカラーが奇数のとき0でない1番目のパレットのカラーだけ表示する // 手順 // 1番目のパレットを偶数化したパレットのカラーが奇数のとき // 1番目のカラー(0は黒) // さもなくば(1番目のパレットを偶数化したパレットのカラーが偶数のとき) // 1番目のカラーが0でないとき // 1番目のカラー // さもなくば(1番目のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // 中間コード1 // (ls1(ipc(tev(i1p())))!=0?ipc(i1p()):(ipc(i1p())!=0?ipc(i1p()):(txp()!=0?tpc(txp()):spc(spp())))) // 中間コード2 // ls1(ipc(tev(i1p())))!=0?ipc(i1p()):ipc(i1p())!=0?ipc(i1p()):txp()!=0?tpc(txp()):spc(spp()) // 中間コード3 // ls1(ipc(tev(v3=i1p())))!=0?ipc(v3):(v5=ipc(v3))!=0?v5:(v6=txp())!=0?tpc(v6):spc(spp()) // 中間コード4 // ls1(ipc(tev(p=i1p())))!=0?ipc(p):(q=ipc(p))!=0?q:(p=txp())!=0?tpc(p):spc(spp()) // 中間コード5 // (ipc((p=i1p())&-2)&1)!=0?ipc(p):(q=ipc(p))!=0?q:(p=txp())!=0?tpc(p):spc(spp()) // 中間コード6 // (ipc((p=i1p())&-2)&1)!=0?ipo(p):(q=ipc(p))!=0?cto(q):(p=txp())!=0?tpo(p):spo(spp()) ITS_XWC { @Override public void drawRaster (int src, int dst, boolean rh) { SpriteScreen.sprStep3 (); int sx = 16; //スプライトx座標 int ty = CRTC.crtR11TxYZero + src & 1023; //ラスタ int tc = (ty & CRTC.crtMask3) << 7 | CRTC.crtR10TxXCurr >> 3; //テキスト桁位置 int ta0 = 0x00e00000 + ((ty & CRTC.crtMaskMinus4) << 7); //ラスタブロックアドレス int ta1 = 0x00020000 + ta0; int ta2 = 0x00040000 + ta0; int ta3 = 0x00060000 + ta0; int ts = CRTC.crtR10TxXCurr & 7; //テキスト桁境界からのずれ int gx = CRTC.crtR12GrXCurr[0]; //1024ドットx座標。溢れは無視する int gy = CRTC.crtR13GrYZero[0] + src; //1024ドットy座標。溢れは無視する int ga0 = ((gy & 511) << 9); //x=0,y&=511の1024ドットアドレス int gt = VideoController.vcnReg2Curr >> (gy >> 7 & 4); //y<512?G2nd|G1st:G4th|G3rd int da = dst << XEiJ.PNL_BM_OFFSET_BITS; //ARGB出力インデックス int db = da + XEiJ.pnlScreenWidth; //ARGB出力インデックスの終了位置 if (rh) { int half = XEiJ.pnlScreenWidth >> 4 << 3; sx += half; tc = tc + (half >> 3) & CRTC.crtMask511; gx += half; da += half; } int ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18) + (gx & 511); //1024ドットアドレス if (ts == 0) { //テキスト桁境界に合っているとき while (da < db) { int dw = Math.min (db - da, (512 - (gx & 511)) & -8); //今回の幅。8の倍数 gx += dw; //次回の1024ドットx座標 int dc = da + dw; //今回のARGB出力インデックスの終了位置 while (da < dc) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); XEiJ.pnlBM[da + 1] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048577] << 4 | GraphicScreen.graM4[ga + 1])) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]]); XEiJ.pnlBM[da + 2] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048578] << 4 | GraphicScreen.graM4[ga + 2])) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]]); XEiJ.pnlBM[da + 3] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048579] << 4 | GraphicScreen.graM4[ga + 3])) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]]); XEiJ.pnlBM[da + 4] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048580] << 4 | GraphicScreen.graM4[ga + 4])) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]]); XEiJ.pnlBM[da + 5] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048581] << 4 | GraphicScreen.graM4[ga + 5])) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]]); XEiJ.pnlBM[da + 6] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048582] << 4 | GraphicScreen.graM4[ga + 6])) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]]); XEiJ.pnlBM[da + 7] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048583] << 4 | GraphicScreen.graM4[ga + 7])) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]]); sx += 8; ga += 8; da += 8; } //while da<dc if (da < db) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 for (int k = 0; k < 8; k++) { if ((gx & 511) == 0) { //gxが512の倍数のとき ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18); //gaを再計算する } gx++; int p, q; XEiJ.pnlBM[da] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); sx++; tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db } else { //テキスト桁境界に合っていないとき // ts=1のとき int tt = ts + 8; //tt=9 ts += 16; //ts=17 // ........ ........ ........ 01234567 m8[ta0+tc] int p0 = MainMemory.mmrM8[ta0 + tc] << ts; //.......0 1234567_ ________ ________ p0=m8[ta0+tc]<<ts int p1 = MainMemory.mmrM8[ta1 + tc] << ts; int p2 = MainMemory.mmrM8[ta2 + tc] << ts; int p3 = MainMemory.mmrM8[ta3 + tc] << ts; tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 while (da < db) { int dw = Math.min (db - da, (512 - (gx & 511)) & -8); //今回の幅。8の倍数 gx += dw; //次回の1024ドットx座標 int dc = da + dw; //今回のARGB出力インデックスの終了位置 while (da < dc) { // ........ ........ .1234567 ________ p0>>tt // ........ ........ .1234567 89abcdef p0>>tt|m8[ta0+tc]&255 p0 = (p0 >> tt | MainMemory.mmrM8[ta0 + tc] & 255) << ts; //12345678 9abcdef_ ________ ________ p0=(p0>>tt|m8[ta0+tc]&255)<<ts p1 = (p1 >> tt | MainMemory.mmrM8[ta1 + tc] & 255) << ts; //~~~~~~~~ p2 = (p2 >> tt | MainMemory.mmrM8[ta2 + tc] & 255) << ts; //ここを使う p3 = (p3 >> tt | MainMemory.mmrM8[ta3 + tc] & 255) << ts; int tp = (VideoController.VCN_TXP3[p3 >>> 24] | VideoController.VCN_TXP2[p2 >>> 24] | VideoController.VCN_TXP1[p1 >>> 24] | VideoController.VCN_TXP0[p0 >>> 24]); //符号なし右シフトで&255を省略 tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); XEiJ.pnlBM[da + 1] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048577] << 4 | GraphicScreen.graM4[ga + 1])) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]]); XEiJ.pnlBM[da + 2] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048578] << 4 | GraphicScreen.graM4[ga + 2])) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]]); XEiJ.pnlBM[da + 3] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048579] << 4 | GraphicScreen.graM4[ga + 3])) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]]); XEiJ.pnlBM[da + 4] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048580] << 4 | GraphicScreen.graM4[ga + 4])) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]]); XEiJ.pnlBM[da + 5] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048581] << 4 | GraphicScreen.graM4[ga + 5])) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]]); XEiJ.pnlBM[da + 6] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048582] << 4 | GraphicScreen.graM4[ga + 6])) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]]); XEiJ.pnlBM[da + 7] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048583] << 4 | GraphicScreen.graM4[ga + 7])) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]]); sx += 8; ga += 8; da += 8; } //while da<dc if (da < db) { // ........ ........ .1234567 ________ p0>>tt // ........ ........ .1234567 89abcdef p0>>tt|m8[ta0+tc]&255 p0 = (p0 >> tt | MainMemory.mmrM8[ta0 + tc] & 255) << ts; //12345678 9abcdef_ ________ ________ p0=(p0>>tt|m8[ta0+tc]&255)<<ts p1 = (p1 >> tt | MainMemory.mmrM8[ta1 + tc] & 255) << ts; //~~~~~~~~ p2 = (p2 >> tt | MainMemory.mmrM8[ta2 + tc] & 255) << ts; //ここを使う p3 = (p3 >> tt | MainMemory.mmrM8[ta3 + tc] & 255) << ts; int tp = (VideoController.VCN_TXP3[p3 >>> 24] | VideoController.VCN_TXP2[p2 >>> 24] | VideoController.VCN_TXP1[p1 >>> 24] | VideoController.VCN_TXP0[p0 >>> 24]); //符号なし右シフトで&255を省略 tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 for (int k = 0; k < 8; k++) { if ((gx & 511) == 0) { //gxが512の倍数のとき ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18); //gaを再計算する } gx++; int p, q; XEiJ.pnlBM[da] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) & -2] & 1) != 0 ? VideoController.vcnPal32G8[p] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); sx++; tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db ts -= 16; //ts=1 } //if ts==0 } //drawRaster }, //ITS_XWC //================================================================================ //ITS_XWP ($0005,$24xx,$1470) // 概要 // ITS 1024ドット256色1プレーン>テキスト>スプライト // XWP 優先順位に関わらず1番目のパレットが3以上の奇数のときそれを偶数化したパレットのカラーだけ表示する // 手順 // 1番目のパレットが1以下のとき // グラフィックパレット0のカラーが0でないとき // グラフィックパレット0のカラー // さもなくば(グラフィックパレット0のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // 1番目のパレットが2以上の偶数のとき // 1番目のカラーが0でないとき // 1番目のカラー // さもなくば(1番目のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // さもなくば(1番目のパレットが3以上の奇数のとき) // 1番目のパレットを偶数化したパレットのカラー(0は黒) // 中間コード1 // (i1p()<=1?(ipc(0)!=0?ipc(0):(txp()!=0?tpc(txp()):spc(spp()))):ls1(i1p())==0?(ipc(i1p())!=0?ipc(i1p()):(txp()!=0?tpc(txp()):spc(spp()))):ipc(tev(i1p()))) // 中間コード2 // i1p()<=1?ipc(0)!=0?ipc(0):txp()!=0?tpc(txp()):spc(spp()):ls1(i1p())==0?ipc(i1p())!=0?ipc(i1p()):txp()!=0?tpc(txp()):spc(spp()):ipc(tev(i1p())) // 中間コード3 // (v0=i1p())<=1?(v1=ipc(0))!=0?v1:(v2=txp())!=0?tpc(v2):spc(spp()):ls1(v0)==0?(v7=ipc(v0))!=0?v7:(v8=txp())!=0?tpc(v8):spc(spp()):ipc(tev(v0)) // 中間コード4 // (p=i1p())<=1?(p=ipc(0))!=0?p:(p=txp())!=0?tpc(p):spc(spp()):ls1(p)==0?(q=ipc(p))!=0?q:(p=txp())!=0?tpc(p):spc(spp()):ipc(tev(p)) // 中間コード5 // (p=i1p())<=1?(p=ipc(0))!=0?p:(p=txp())!=0?tpc(p):spc(spp()):(p&1)==0?(q=ipc(p))!=0?q:(p=txp())!=0?tpc(p):spc(spp()):ipc(p&-2) // 中間コード6 // (p=i1p())<=1?(p=ipc(0))!=0?cto(p):(p=txp())!=0?tpo(p):spo(spp()):(p&1)==0?(q=ipc(p))!=0?cto(q):(p=txp())!=0?tpo(p):spo(spp()):ipo(p&-2) ITS_XWP { @Override public void drawRaster (int src, int dst, boolean rh) { SpriteScreen.sprStep3 (); int sx = 16; //スプライトx座標 int ty = CRTC.crtR11TxYZero + src & 1023; //ラスタ int tc = (ty & CRTC.crtMask3) << 7 | CRTC.crtR10TxXCurr >> 3; //テキスト桁位置 int ta0 = 0x00e00000 + ((ty & CRTC.crtMaskMinus4) << 7); //ラスタブロックアドレス int ta1 = 0x00020000 + ta0; int ta2 = 0x00040000 + ta0; int ta3 = 0x00060000 + ta0; int ts = CRTC.crtR10TxXCurr & 7; //テキスト桁境界からのずれ int gx = CRTC.crtR12GrXCurr[0]; //1024ドットx座標。溢れは無視する int gy = CRTC.crtR13GrYZero[0] + src; //1024ドットy座標。溢れは無視する int ga0 = ((gy & 511) << 9); //x=0,y&=511の1024ドットアドレス int gt = VideoController.vcnReg2Curr >> (gy >> 7 & 4); //y<512?G2nd|G1st:G4th|G3rd int da = dst << XEiJ.PNL_BM_OFFSET_BITS; //ARGB出力インデックス int db = da + XEiJ.pnlScreenWidth; //ARGB出力インデックスの終了位置 if (rh) { int half = XEiJ.pnlScreenWidth >> 4 << 3; sx += half; tc = tc + (half >> 3) & CRTC.crtMask511; gx += half; da += half; } int ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18) + (gx & 511); //1024ドットアドレス if (ts == 0) { //テキスト桁境界に合っているとき while (da < db) { int dw = Math.min (db - da, (512 - (gx & 511)) & -8); //今回の幅。8の倍数 gx += dw; //次回の1024ドットx座標 int dc = da + dw; //今回のARGB出力インデックスの終了位置 while (da < dc) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((p = (GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 1] = ((p = (GraphicScreen.graM4[ga + 1048577] << 4 | GraphicScreen.graM4[ga + 1])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 2] = ((p = (GraphicScreen.graM4[ga + 1048578] << 4 | GraphicScreen.graM4[ga + 2])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 3] = ((p = (GraphicScreen.graM4[ga + 1048579] << 4 | GraphicScreen.graM4[ga + 3])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 4] = ((p = (GraphicScreen.graM4[ga + 1048580] << 4 | GraphicScreen.graM4[ga + 4])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 5] = ((p = (GraphicScreen.graM4[ga + 1048581] << 4 | GraphicScreen.graM4[ga + 5])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 6] = ((p = (GraphicScreen.graM4[ga + 1048582] << 4 | GraphicScreen.graM4[ga + 6])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 7] = ((p = (GraphicScreen.graM4[ga + 1048583] << 4 | GraphicScreen.graM4[ga + 7])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : VideoController.vcnPal32G8[p & -2]); sx += 8; ga += 8; da += 8; } //while da<dc if (da < db) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 for (int k = 0; k < 8; k++) { if ((gx & 511) == 0) { //gxが512の倍数のとき ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18); //gaを再計算する } gx++; int p, q; XEiJ.pnlBM[da] = ((p = (GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : VideoController.vcnPal32G8[p & -2]); sx++; tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db } else { //テキスト桁境界に合っていないとき // ts=1のとき int tt = ts + 8; //tt=9 ts += 16; //ts=17 // ........ ........ ........ 01234567 m8[ta0+tc] int p0 = MainMemory.mmrM8[ta0 + tc] << ts; //.......0 1234567_ ________ ________ p0=m8[ta0+tc]<<ts int p1 = MainMemory.mmrM8[ta1 + tc] << ts; int p2 = MainMemory.mmrM8[ta2 + tc] << ts; int p3 = MainMemory.mmrM8[ta3 + tc] << ts; tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 while (da < db) { int dw = Math.min (db - da, (512 - (gx & 511)) & -8); //今回の幅。8の倍数 gx += dw; //次回の1024ドットx座標 int dc = da + dw; //今回のARGB出力インデックスの終了位置 while (da < dc) { // ........ ........ .1234567 ________ p0>>tt // ........ ........ .1234567 89abcdef p0>>tt|m8[ta0+tc]&255 p0 = (p0 >> tt | MainMemory.mmrM8[ta0 + tc] & 255) << ts; //12345678 9abcdef_ ________ ________ p0=(p0>>tt|m8[ta0+tc]&255)<<ts p1 = (p1 >> tt | MainMemory.mmrM8[ta1 + tc] & 255) << ts; //~~~~~~~~ p2 = (p2 >> tt | MainMemory.mmrM8[ta2 + tc] & 255) << ts; //ここを使う p3 = (p3 >> tt | MainMemory.mmrM8[ta3 + tc] & 255) << ts; int tp = (VideoController.VCN_TXP3[p3 >>> 24] | VideoController.VCN_TXP2[p2 >>> 24] | VideoController.VCN_TXP1[p1 >>> 24] | VideoController.VCN_TXP0[p0 >>> 24]); //符号なし右シフトで&255を省略 tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((p = (GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 1] = ((p = (GraphicScreen.graM4[ga + 1048577] << 4 | GraphicScreen.graM4[ga + 1])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 2] = ((p = (GraphicScreen.graM4[ga + 1048578] << 4 | GraphicScreen.graM4[ga + 2])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 3] = ((p = (GraphicScreen.graM4[ga + 1048579] << 4 | GraphicScreen.graM4[ga + 3])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 4] = ((p = (GraphicScreen.graM4[ga + 1048580] << 4 | GraphicScreen.graM4[ga + 4])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 5] = ((p = (GraphicScreen.graM4[ga + 1048581] << 4 | GraphicScreen.graM4[ga + 5])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 6] = ((p = (GraphicScreen.graM4[ga + 1048582] << 4 | GraphicScreen.graM4[ga + 6])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : VideoController.vcnPal32G8[p & -2]); XEiJ.pnlBM[da + 7] = ((p = (GraphicScreen.graM4[ga + 1048583] << 4 | GraphicScreen.graM4[ga + 7])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : VideoController.vcnPal32G8[p & -2]); sx += 8; ga += 8; da += 8; } //while da<dc if (da < db) { // ........ ........ .1234567 ________ p0>>tt // ........ ........ .1234567 89abcdef p0>>tt|m8[ta0+tc]&255 p0 = (p0 >> tt | MainMemory.mmrM8[ta0 + tc] & 255) << ts; //12345678 9abcdef_ ________ ________ p0=(p0>>tt|m8[ta0+tc]&255)<<ts p1 = (p1 >> tt | MainMemory.mmrM8[ta1 + tc] & 255) << ts; //~~~~~~~~ p2 = (p2 >> tt | MainMemory.mmrM8[ta2 + tc] & 255) << ts; //ここを使う p3 = (p3 >> tt | MainMemory.mmrM8[ta3 + tc] & 255) << ts; int tp = (VideoController.VCN_TXP3[p3 >>> 24] | VideoController.VCN_TXP2[p2 >>> 24] | VideoController.VCN_TXP1[p1 >>> 24] | VideoController.VCN_TXP0[p0 >>> 24]); //符号なし右シフトで&255を省略 tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 for (int k = 0; k < 8; k++) { if ((gx & 511) == 0) { //gxが512の倍数のとき ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18); //gaを再計算する } gx++; int p, q; XEiJ.pnlBM[da] = ((p = (GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : VideoController.vcnPal32G8[p & -2]); sx++; tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db ts -= 16; //ts=1 } //if ts==0 } //drawRaster }, //ITS_XWP //================================================================================ //ITS_XHCT ($0005,$24xx,$1970) // 概要 // ITS 1024ドット256色1プレーン>テキスト>スプライト // XHCT 0でない1番目のパレットを偶数化(65536色は奇数化)したパレットのカラーが奇数のとき0でない1番目のカラーと奥のスプライト・テキストのカラーを混ぜる // 手順 // 1番目のパレットを偶数化したパレットのカラーが奇数のとき // 1番目のカラーと // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // を混ぜたカラー(0は黒) // さもなくば(1番目のパレットを偶数化したパレットのカラーが偶数のとき) // 1番目のカラーが0でないとき // 1番目のカラー // さもなくば(1番目のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // 中間コード1 // (ls1(ipc(tev(i1p())))!=0?mix(ipc(i1p()),(txp()!=0?tpc(txp()):spc(spp()))):(ipc(i1p())!=0?ipc(i1p()):(txp()!=0?tpc(txp()):spc(spp())))) // 中間コード2 // ls1(ipc(tev(i1p())))!=0?mix(ipc(i1p()),txp()!=0?tpc(txp()):spc(spp())):ipc(i1p())!=0?ipc(i1p()):txp()!=0?tpc(txp()):spc(spp()) // 中間コード3 // ls1(ipc(tev(v3=i1p())))!=0?mix(ipc(v3),(v6=txp())!=0?tpc(v6):spc(spp())):(v10=ipc(v3))!=0?v10:(v11=txp())!=0?tpc(v11):spc(spp()) // 中間コード4 // ls1(ipc(tev(p=i1p())))!=0?mix(ipc(p),(p=txp())!=0?tpc(p):spc(spp())):(q=ipc(p))!=0?q:(p=txp())!=0?tpc(p):spc(spp()) // 中間コード5 // (ipc((p=i1p())&-2)&1)!=0?mix(ipc(p),(p=txp())!=0?tpc(p):spc(spp())):(q=ipc(p))!=0?q:(p=txp())!=0?tpc(p):spc(spp()) // 中間コード6 // (ipc((p=i1p())&-2)&1)!=0?cto(mix(ipc(p),(p=txp())!=0?tpc(p):spc(spp()))):(q=ipc(p))!=0?cto(q):(p=txp())!=0?tpo(p):spo(spp()) ITS_XHCT { @Override public void drawRaster (int src, int dst, boolean rh) { SpriteScreen.sprStep3 (); int sx = 16; //スプライトx座標 int ty = CRTC.crtR11TxYZero + src & 1023; //ラスタ int tc = (ty & CRTC.crtMask3) << 7 | CRTC.crtR10TxXCurr >> 3; //テキスト桁位置 int ta0 = 0x00e00000 + ((ty & CRTC.crtMaskMinus4) << 7); //ラスタブロックアドレス int ta1 = 0x00020000 + ta0; int ta2 = 0x00040000 + ta0; int ta3 = 0x00060000 + ta0; int ts = CRTC.crtR10TxXCurr & 7; //テキスト桁境界からのずれ int gx = CRTC.crtR12GrXCurr[0]; //1024ドットx座標。溢れは無視する int gy = CRTC.crtR13GrYZero[0] + src; //1024ドットy座標。溢れは無視する int ga0 = ((gy & 511) << 9); //x=0,y&=511の1024ドットアドレス int gt = VideoController.vcnReg2Curr >> (gy >> 7 & 4); //y<512?G2nd|G1st:G4th|G3rd int da = dst << XEiJ.PNL_BM_OFFSET_BITS; //ARGB出力インデックス int db = da + XEiJ.pnlScreenWidth; //ARGB出力インデックスの終了位置 if (rh) { int half = XEiJ.pnlScreenWidth >> 4 << 3; sx += half; tc = tc + (half >> 3) & CRTC.crtMask511; gx += half; da += half; } int ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18) + (gx & 511); //1024ドットアドレス if (ts == 0) { //テキスト桁境界に合っているとき while (da < db) { int dw = Math.min (db - da, (512 - (gx & 511)) & -8); //今回の幅。8の倍数 gx += dw; //次回の1024ドットx座標 int dc = da + dw; //今回のARGB出力インデックスの終了位置 while (da < dc) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 28) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); XEiJ.pnlBM[da + 1] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048577] << 4 | GraphicScreen.graM4[ga + 1])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 1]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]]); XEiJ.pnlBM[da + 2] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048578] << 4 | GraphicScreen.graM4[ga + 2])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 2]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]]); XEiJ.pnlBM[da + 3] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048579] << 4 | GraphicScreen.graM4[ga + 3])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 3]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]]); XEiJ.pnlBM[da + 4] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048580] << 4 | GraphicScreen.graM4[ga + 4])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 4]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]]); XEiJ.pnlBM[da + 5] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048581] << 4 | GraphicScreen.graM4[ga + 5])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 5]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]]); XEiJ.pnlBM[da + 6] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048582] << 4 | GraphicScreen.graM4[ga + 6])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 6]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]]); XEiJ.pnlBM[da + 7] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048583] << 4 | GraphicScreen.graM4[ga + 7])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 7]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]]); sx += 8; ga += 8; da += 8; } //while da<dc if (da < db) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 for (int k = 0; k < 8; k++) { if ((gx & 511) == 0) { //gxが512の倍数のとき ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18); //gaを再計算する } gx++; int p, q; XEiJ.pnlBM[da] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 28) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); sx++; tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db } else { //テキスト桁境界に合っていないとき // ts=1のとき int tt = ts + 8; //tt=9 ts += 16; //ts=17 // ........ ........ ........ 01234567 m8[ta0+tc] int p0 = MainMemory.mmrM8[ta0 + tc] << ts; //.......0 1234567_ ________ ________ p0=m8[ta0+tc]<<ts int p1 = MainMemory.mmrM8[ta1 + tc] << ts; int p2 = MainMemory.mmrM8[ta2 + tc] << ts; int p3 = MainMemory.mmrM8[ta3 + tc] << ts; tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 while (da < db) { int dw = Math.min (db - da, (512 - (gx & 511)) & -8); //今回の幅。8の倍数 gx += dw; //次回の1024ドットx座標 int dc = da + dw; //今回のARGB出力インデックスの終了位置 while (da < dc) { // ........ ........ .1234567 ________ p0>>tt // ........ ........ .1234567 89abcdef p0>>tt|m8[ta0+tc]&255 p0 = (p0 >> tt | MainMemory.mmrM8[ta0 + tc] & 255) << ts; //12345678 9abcdef_ ________ ________ p0=(p0>>tt|m8[ta0+tc]&255)<<ts p1 = (p1 >> tt | MainMemory.mmrM8[ta1 + tc] & 255) << ts; //~~~~~~~~ p2 = (p2 >> tt | MainMemory.mmrM8[ta2 + tc] & 255) << ts; //ここを使う p3 = (p3 >> tt | MainMemory.mmrM8[ta3 + tc] & 255) << ts; int tp = (VideoController.VCN_TXP3[p3 >>> 24] | VideoController.VCN_TXP2[p2 >>> 24] | VideoController.VCN_TXP1[p1 >>> 24] | VideoController.VCN_TXP0[p0 >>> 24]); //符号なし右シフトで&255を省略 tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 28) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); XEiJ.pnlBM[da + 1] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048577] << 4 | GraphicScreen.graM4[ga + 1])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 1]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]]); XEiJ.pnlBM[da + 2] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048578] << 4 | GraphicScreen.graM4[ga + 2])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 2]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]]); XEiJ.pnlBM[da + 3] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048579] << 4 | GraphicScreen.graM4[ga + 3])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 3]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]]); XEiJ.pnlBM[da + 4] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048580] << 4 | GraphicScreen.graM4[ga + 4])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 4]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]]); XEiJ.pnlBM[da + 5] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048581] << 4 | GraphicScreen.graM4[ga + 5])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 5]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]]); XEiJ.pnlBM[da + 6] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048582] << 4 | GraphicScreen.graM4[ga + 6])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 6]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]]); XEiJ.pnlBM[da + 7] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048583] << 4 | GraphicScreen.graM4[ga + 7])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 7]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]]); sx += 8; ga += 8; da += 8; } //while da<dc if (da < db) { // ........ ........ .1234567 ________ p0>>tt // ........ ........ .1234567 89abcdef p0>>tt|m8[ta0+tc]&255 p0 = (p0 >> tt | MainMemory.mmrM8[ta0 + tc] & 255) << ts; //12345678 9abcdef_ ________ ________ p0=(p0>>tt|m8[ta0+tc]&255)<<ts p1 = (p1 >> tt | MainMemory.mmrM8[ta1 + tc] & 255) << ts; //~~~~~~~~ p2 = (p2 >> tt | MainMemory.mmrM8[ta2 + tc] & 255) << ts; //ここを使う p3 = (p3 >> tt | MainMemory.mmrM8[ta3 + tc] & 255) << ts; int tp = (VideoController.VCN_TXP3[p3 >>> 24] | VideoController.VCN_TXP2[p2 >>> 24] | VideoController.VCN_TXP1[p1 >>> 24] | VideoController.VCN_TXP0[p0 >>> 24]); //符号なし右シフトで&255を省略 tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 for (int k = 0; k < 8; k++) { if ((gx & 511) == 0) { //gxが512の倍数のとき ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18); //gaを再計算する } gx++; int p, q; XEiJ.pnlBM[da] = ((VideoController.vcnPal16G8[(p = (GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) & -2] & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p], (p = tp >>> 28) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx]])] : (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); sx++; tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db ts -= 16; //ts=1 } //if ts==0 } //drawRaster }, //ITS_XHCT //================================================================================ //ITS_XHPT ($0005,$24xx,$1D70) // 概要 // ITS 1024ドット256色1プレーン>テキスト>スプライト // XHPT 1番目のパレットが3以上の奇数のときそれを偶数化したパレットのカラーと奥のスプライト・テキストのカラーを混ぜる // 手順 // 1番目のパレットが1以下のとき // グラフィックパレット0のカラーが0でないとき // グラフィックパレット0のカラー // さもなくば(グラフィックパレット0のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // 1番目のパレットが2以上の偶数のとき // 1番目のカラーが0でないとき // 1番目のカラー // さもなくば(1番目のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // さもなくば(1番目のパレットが3以上の奇数のとき) // 1番目のパレットを偶数化したパレットのカラーと // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // を混ぜたカラー(0は黒) // 中間コード1 // (i1p()<=1?(ipc(0)!=0?ipc(0):(txp()!=0?tpc(txp()):spc(spp()))):ls1(i1p())==0?(ipc(i1p())!=0?ipc(i1p()):(txp()!=0?tpc(txp()):spc(spp()))):mix(ipc(tev(i1p())),(txp()!=0?tpc(txp()):spc(spp())))) // 中間コード2 // i1p()<=1?ipc(0)!=0?ipc(0):txp()!=0?tpc(txp()):spc(spp()):ls1(i1p())==0?ipc(i1p())!=0?ipc(i1p()):txp()!=0?tpc(txp()):spc(spp()):mix(ipc(tev(i1p())),txp()!=0?tpc(txp()):spc(spp())) // 中間コード3 // (v0=i1p())<=1?(v1=ipc(0))!=0?v1:(v2=txp())!=0?tpc(v2):spc(spp()):ls1(v0)==0?(v7=ipc(v0))!=0?v7:(v8=txp())!=0?tpc(v8):spc(spp()):mix(ipc(tev(v0)),(v15=txp())!=0?tpc(v15):spc(spp())) // 中間コード4 // (p=i1p())<=1?(p=ipc(0))!=0?p:(p=txp())!=0?tpc(p):spc(spp()):ls1(p)==0?(q=ipc(p))!=0?q:(p=txp())!=0?tpc(p):spc(spp()):mix(ipc(tev(p)),(p=txp())!=0?tpc(p):spc(spp())) // 中間コード5 // (p=i1p())<=1?(p=ipc(0))!=0?p:(p=txp())!=0?tpc(p):spc(spp()):(p&1)==0?(q=ipc(p))!=0?q:(p=txp())!=0?tpc(p):spc(spp()):mix(ipc(p&-2),(p=txp())!=0?tpc(p):spc(spp())) // 中間コード6 // (p=i1p())<=1?(p=ipc(0))!=0?cto(p):(p=txp())!=0?tpo(p):spo(spp()):(p&1)==0?(q=ipc(p))!=0?cto(q):(p=txp())!=0?tpo(p):spo(spp()):cto(mix(ipc(p&-2),(p=txp())!=0?tpc(p):spc(spp()))) ITS_XHPT { @Override public void drawRaster (int src, int dst, boolean rh) { SpriteScreen.sprStep3 (); int sx = 16; //スプライトx座標 int ty = CRTC.crtR11TxYZero + src & 1023; //ラスタ int tc = (ty & CRTC.crtMask3) << 7 | CRTC.crtR10TxXCurr >> 3; //テキスト桁位置 int ta0 = 0x00e00000 + ((ty & CRTC.crtMaskMinus4) << 7); //ラスタブロックアドレス int ta1 = 0x00020000 + ta0; int ta2 = 0x00040000 + ta0; int ta3 = 0x00060000 + ta0; int ts = CRTC.crtR10TxXCurr & 7; //テキスト桁境界からのずれ int gx = CRTC.crtR12GrXCurr[0]; //1024ドットx座標。溢れは無視する int gy = CRTC.crtR13GrYZero[0] + src; //1024ドットy座標。溢れは無視する int ga0 = ((gy & 511) << 9); //x=0,y&=511の1024ドットアドレス int gt = VideoController.vcnReg2Curr >> (gy >> 7 & 4); //y<512?G2nd|G1st:G4th|G3rd int da = dst << XEiJ.PNL_BM_OFFSET_BITS; //ARGB出力インデックス int db = da + XEiJ.pnlScreenWidth; //ARGB出力インデックスの終了位置 if (rh) { int half = XEiJ.pnlScreenWidth >> 4 << 3; sx += half; tc = tc + (half >> 3) & CRTC.crtMask511; gx += half; da += half; } int ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18) + (gx & 511); //1024ドットアドレス if (ts == 0) { //テキスト桁境界に合っているとき while (da < db) { int dw = Math.min (db - da, (512 - (gx & 511)) & -8); //今回の幅。8の倍数 gx += dw; //次回の1024ドットx座標 int dc = da + dw; //今回のARGB出力インデックスの終了位置 while (da < dc) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((p = (GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 28) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx]])]); XEiJ.pnlBM[da + 1] = ((p = (GraphicScreen.graM4[ga + 1048577] << 4 | GraphicScreen.graM4[ga + 1])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 1]])]); XEiJ.pnlBM[da + 2] = ((p = (GraphicScreen.graM4[ga + 1048578] << 4 | GraphicScreen.graM4[ga + 2])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 2]])]); XEiJ.pnlBM[da + 3] = ((p = (GraphicScreen.graM4[ga + 1048579] << 4 | GraphicScreen.graM4[ga + 3])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 3]])]); XEiJ.pnlBM[da + 4] = ((p = (GraphicScreen.graM4[ga + 1048580] << 4 | GraphicScreen.graM4[ga + 4])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 4]])]); XEiJ.pnlBM[da + 5] = ((p = (GraphicScreen.graM4[ga + 1048581] << 4 | GraphicScreen.graM4[ga + 5])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 5]])]); XEiJ.pnlBM[da + 6] = ((p = (GraphicScreen.graM4[ga + 1048582] << 4 | GraphicScreen.graM4[ga + 6])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 6]])]); XEiJ.pnlBM[da + 7] = ((p = (GraphicScreen.graM4[ga + 1048583] << 4 | GraphicScreen.graM4[ga + 7])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 7]])]); sx += 8; ga += 8; da += 8; } //while da<dc if (da < db) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 for (int k = 0; k < 8; k++) { if ((gx & 511) == 0) { //gxが512の倍数のとき ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18); //gaを再計算する } gx++; int p, q; XEiJ.pnlBM[da] = ((p = (GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 28) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx]])]); sx++; tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db } else { //テキスト桁境界に合っていないとき // ts=1のとき int tt = ts + 8; //tt=9 ts += 16; //ts=17 // ........ ........ ........ 01234567 m8[ta0+tc] int p0 = MainMemory.mmrM8[ta0 + tc] << ts; //.......0 1234567_ ________ ________ p0=m8[ta0+tc]<<ts int p1 = MainMemory.mmrM8[ta1 + tc] << ts; int p2 = MainMemory.mmrM8[ta2 + tc] << ts; int p3 = MainMemory.mmrM8[ta3 + tc] << ts; tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 while (da < db) { int dw = Math.min (db - da, (512 - (gx & 511)) & -8); //今回の幅。8の倍数 gx += dw; //次回の1024ドットx座標 int dc = da + dw; //今回のARGB出力インデックスの終了位置 while (da < dc) { // ........ ........ .1234567 ________ p0>>tt // ........ ........ .1234567 89abcdef p0>>tt|m8[ta0+tc]&255 p0 = (p0 >> tt | MainMemory.mmrM8[ta0 + tc] & 255) << ts; //12345678 9abcdef_ ________ ________ p0=(p0>>tt|m8[ta0+tc]&255)<<ts p1 = (p1 >> tt | MainMemory.mmrM8[ta1 + tc] & 255) << ts; //~~~~~~~~ p2 = (p2 >> tt | MainMemory.mmrM8[ta2 + tc] & 255) << ts; //ここを使う p3 = (p3 >> tt | MainMemory.mmrM8[ta3 + tc] & 255) << ts; int tp = (VideoController.VCN_TXP3[p3 >>> 24] | VideoController.VCN_TXP2[p2 >>> 24] | VideoController.VCN_TXP1[p1 >>> 24] | VideoController.VCN_TXP0[p0 >>> 24]); //符号なし右シフトで&255を省略 tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((p = (GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 28) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx]])]); XEiJ.pnlBM[da + 1] = ((p = (GraphicScreen.graM4[ga + 1048577] << 4 | GraphicScreen.graM4[ga + 1])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 1]])]); XEiJ.pnlBM[da + 2] = ((p = (GraphicScreen.graM4[ga + 1048578] << 4 | GraphicScreen.graM4[ga + 2])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 2]])]); XEiJ.pnlBM[da + 3] = ((p = (GraphicScreen.graM4[ga + 1048579] << 4 | GraphicScreen.graM4[ga + 3])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 3]])]); XEiJ.pnlBM[da + 4] = ((p = (GraphicScreen.graM4[ga + 1048580] << 4 | GraphicScreen.graM4[ga + 4])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 4]])]); XEiJ.pnlBM[da + 5] = ((p = (GraphicScreen.graM4[ga + 1048581] << 4 | GraphicScreen.graM4[ga + 5])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 5]])]); XEiJ.pnlBM[da + 6] = ((p = (GraphicScreen.graM4[ga + 1048582] << 4 | GraphicScreen.graM4[ga + 6])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 6]])]); XEiJ.pnlBM[da + 7] = ((p = (GraphicScreen.graM4[ga + 1048583] << 4 | GraphicScreen.graM4[ga + 7])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp & 15) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx + 7]])]); sx += 8; ga += 8; da += 8; } //while da<dc if (da < db) { // ........ ........ .1234567 ________ p0>>tt // ........ ........ .1234567 89abcdef p0>>tt|m8[ta0+tc]&255 p0 = (p0 >> tt | MainMemory.mmrM8[ta0 + tc] & 255) << ts; //12345678 9abcdef_ ________ ________ p0=(p0>>tt|m8[ta0+tc]&255)<<ts p1 = (p1 >> tt | MainMemory.mmrM8[ta1 + tc] & 255) << ts; //~~~~~~~~ p2 = (p2 >> tt | MainMemory.mmrM8[ta2 + tc] & 255) << ts; //ここを使う p3 = (p3 >> tt | MainMemory.mmrM8[ta3 + tc] & 255) << ts; int tp = (VideoController.VCN_TXP3[p3 >>> 24] | VideoController.VCN_TXP2[p2 >>> 24] | VideoController.VCN_TXP1[p1 >>> 24] | VideoController.VCN_TXP0[p0 >>> 24]); //符号なし右シフトで&255を省略 tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 for (int k = 0; k < 8; k++) { if ((gx & 511) == 0) { //gxが512の倍数のとき ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18); //gaを再計算する } gx++; int p, q; XEiJ.pnlBM[da] = ((p = (GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) <= 1 ? (p = VideoController.vcnPal16G8[0]) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : (p & 1) == 0 ? (q = VideoController.vcnPal16G8[p]) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : VideoController.vcnPalTbl[ VideoController.vcnMix2 ( VideoController.vcnPal16G8[p & -2], (p = tp >>> 28) != 0 ? VideoController.vcnPal16TS[p] : VideoController.vcnPal16TS[SpriteScreen.sprBuffer[sx]])]); sx++; tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db ts -= 16; //ts=1 } //if ts==0 } //drawRaster }, //ITS_XHPT //================================================================================ //JTS ($0007,$24xx,$0070) // 概要 // JTS 1024ドット65536色1プレーン>テキスト>スプライト // 拡張なし // 手順 // 1番目のカラーが0でないとき // 1番目のカラー // さもなくば(1番目のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // 中間コード1 // (jpc(j1p(),j1p())!=0?jpc(j1p(),j1p()):(txp()!=0?tpc(txp()):spc(spp()))) // 中間コード2 // jpc(j1p(),j1p())!=0?jpc(j1p(),j1p()):txp()!=0?tpc(txp()):spc(spp()) // 中間コード3 // (v0=jpc(v1=j1p(),v1))!=0?v0:(v2=txp())!=0?tpc(v2):spc(spp()) // 中間コード4 // (p=jpc(q=j1p(),q))!=0?p:(p=txp())!=0?tpc(p):spc(spp()) // 中間コード5 // (p=jpc(q=j1p(),q))!=0?p:(p=txp())!=0?tpc(p):spc(spp()) // 中間コード6 // (p=jpc(q=j1p(),q))!=0?cto(p):(p=txp())!=0?tpo(p):spo(spp()) JTS { @Override public void drawRaster (int src, int dst, boolean rh) { SpriteScreen.sprStep3 (); int sx = 16; //スプライトx座標 int ty = CRTC.crtR11TxYZero + src & 1023; //ラスタ int tc = (ty & CRTC.crtMask3) << 7 | CRTC.crtR10TxXCurr >> 3; //テキスト桁位置 int ta0 = 0x00e00000 + ((ty & CRTC.crtMaskMinus4) << 7); //ラスタブロックアドレス int ta1 = 0x00020000 + ta0; int ta2 = 0x00040000 + ta0; int ta3 = 0x00060000 + ta0; int ts = CRTC.crtR10TxXCurr & 7; //テキスト桁境界からのずれ int gx = CRTC.crtR12GrXCurr[0]; //1024ドットx座標。溢れは無視する int gy = CRTC.crtR13GrYZero[0] + src; //1024ドットy座標。溢れは無視する int ga0 = ((gy & 511) << 9); //x=0,y&=511の1024ドットアドレス int gt = VideoController.vcnReg2Curr >> (gy >> 7 & 4); //y<512?G2nd|G1st:G4th|G3rd int da = dst << XEiJ.PNL_BM_OFFSET_BITS; //ARGB出力インデックス int db = da + XEiJ.pnlScreenWidth; //ARGB出力インデックスの終了位置 if (rh) { int half = XEiJ.pnlScreenWidth >> 4 << 3; sx += half; tc = tc + (half >> 3) & CRTC.crtMask511; gx += half; da += half; } int ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18) + (gx & 511); //1024ドットアドレス if (ts == 0) { //テキスト桁境界に合っているとき while (da < db) { int dw = Math.min (db - da, (512 - (gx & 511)) & -8); //今回の幅。8の倍数 gx += dw; //次回の1024ドットx座標 int dc = da + dw; //今回のARGB出力インデックスの終了位置 while (da < dc) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((p = (VideoController.vcnPal8G16H[(q = (GraphicScreen.graM4[ga + 3145728] << 12 | GraphicScreen.graM4[ga + 2097152] << 8 | GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); XEiJ.pnlBM[da + 1] = ((p = (VideoController.vcnPal8G16H[(q = (GraphicScreen.graM4[ga + 3145729] << 12 | GraphicScreen.graM4[ga + 2097153] << 8 | GraphicScreen.graM4[ga + 1048577] << 4 | GraphicScreen.graM4[ga + 1])) >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]]); XEiJ.pnlBM[da + 2] = ((p = (VideoController.vcnPal8G16H[(q = (GraphicScreen.graM4[ga + 3145730] << 12 | GraphicScreen.graM4[ga + 2097154] << 8 | GraphicScreen.graM4[ga + 1048578] << 4 | GraphicScreen.graM4[ga + 2])) >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]]); XEiJ.pnlBM[da + 3] = ((p = (VideoController.vcnPal8G16H[(q = (GraphicScreen.graM4[ga + 3145731] << 12 | GraphicScreen.graM4[ga + 2097155] << 8 | GraphicScreen.graM4[ga + 1048579] << 4 | GraphicScreen.graM4[ga + 3])) >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]]); XEiJ.pnlBM[da + 4] = ((p = (VideoController.vcnPal8G16H[(q = (GraphicScreen.graM4[ga + 3145732] << 12 | GraphicScreen.graM4[ga + 2097156] << 8 | GraphicScreen.graM4[ga + 1048580] << 4 | GraphicScreen.graM4[ga + 4])) >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]]); XEiJ.pnlBM[da + 5] = ((p = (VideoController.vcnPal8G16H[(q = (GraphicScreen.graM4[ga + 3145733] << 12 | GraphicScreen.graM4[ga + 2097157] << 8 | GraphicScreen.graM4[ga + 1048581] << 4 | GraphicScreen.graM4[ga + 5])) >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]]); XEiJ.pnlBM[da + 6] = ((p = (VideoController.vcnPal8G16H[(q = (GraphicScreen.graM4[ga + 3145734] << 12 | GraphicScreen.graM4[ga + 2097158] << 8 | GraphicScreen.graM4[ga + 1048582] << 4 | GraphicScreen.graM4[ga + 6])) >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]]); XEiJ.pnlBM[da + 7] = ((p = (VideoController.vcnPal8G16H[(q = (GraphicScreen.graM4[ga + 3145735] << 12 | GraphicScreen.graM4[ga + 2097159] << 8 | GraphicScreen.graM4[ga + 1048583] << 4 | GraphicScreen.graM4[ga + 7])) >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]]); sx += 8; ga += 8; da += 8; } //while da<dc if (da < db) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 for (int k = 0; k < 8; k++) { if ((gx & 511) == 0) { //gxが512の倍数のとき ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18); //gaを再計算する } gx++; int p, q; XEiJ.pnlBM[da] = ((p = (VideoController.vcnPal8G16H[(q = (GraphicScreen.graM4[ga + 3145728] << 12 | GraphicScreen.graM4[ga + 2097152] << 8 | GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); sx++; tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db } else { //テキスト桁境界に合っていないとき // ts=1のとき int tt = ts + 8; //tt=9 ts += 16; //ts=17 // ........ ........ ........ 01234567 m8[ta0+tc] int p0 = MainMemory.mmrM8[ta0 + tc] << ts; //.......0 1234567_ ________ ________ p0=m8[ta0+tc]<<ts int p1 = MainMemory.mmrM8[ta1 + tc] << ts; int p2 = MainMemory.mmrM8[ta2 + tc] << ts; int p3 = MainMemory.mmrM8[ta3 + tc] << ts; tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 while (da < db) { int dw = Math.min (db - da, (512 - (gx & 511)) & -8); //今回の幅。8の倍数 gx += dw; //次回の1024ドットx座標 int dc = da + dw; //今回のARGB出力インデックスの終了位置 while (da < dc) { // ........ ........ .1234567 ________ p0>>tt // ........ ........ .1234567 89abcdef p0>>tt|m8[ta0+tc]&255 p0 = (p0 >> tt | MainMemory.mmrM8[ta0 + tc] & 255) << ts; //12345678 9abcdef_ ________ ________ p0=(p0>>tt|m8[ta0+tc]&255)<<ts p1 = (p1 >> tt | MainMemory.mmrM8[ta1 + tc] & 255) << ts; //~~~~~~~~ p2 = (p2 >> tt | MainMemory.mmrM8[ta2 + tc] & 255) << ts; //ここを使う p3 = (p3 >> tt | MainMemory.mmrM8[ta3 + tc] & 255) << ts; int tp = (VideoController.VCN_TXP3[p3 >>> 24] | VideoController.VCN_TXP2[p2 >>> 24] | VideoController.VCN_TXP1[p1 >>> 24] | VideoController.VCN_TXP0[p0 >>> 24]); //符号なし右シフトで&255を省略 tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((p = (VideoController.vcnPal8G16H[(q = (GraphicScreen.graM4[ga + 3145728] << 12 | GraphicScreen.graM4[ga + 2097152] << 8 | GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); XEiJ.pnlBM[da + 1] = ((p = (VideoController.vcnPal8G16H[(q = (GraphicScreen.graM4[ga + 3145729] << 12 | GraphicScreen.graM4[ga + 2097153] << 8 | GraphicScreen.graM4[ga + 1048577] << 4 | GraphicScreen.graM4[ga + 1])) >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]]); XEiJ.pnlBM[da + 2] = ((p = (VideoController.vcnPal8G16H[(q = (GraphicScreen.graM4[ga + 3145730] << 12 | GraphicScreen.graM4[ga + 2097154] << 8 | GraphicScreen.graM4[ga + 1048578] << 4 | GraphicScreen.graM4[ga + 2])) >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]]); XEiJ.pnlBM[da + 3] = ((p = (VideoController.vcnPal8G16H[(q = (GraphicScreen.graM4[ga + 3145731] << 12 | GraphicScreen.graM4[ga + 2097155] << 8 | GraphicScreen.graM4[ga + 1048579] << 4 | GraphicScreen.graM4[ga + 3])) >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]]); XEiJ.pnlBM[da + 4] = ((p = (VideoController.vcnPal8G16H[(q = (GraphicScreen.graM4[ga + 3145732] << 12 | GraphicScreen.graM4[ga + 2097156] << 8 | GraphicScreen.graM4[ga + 1048580] << 4 | GraphicScreen.graM4[ga + 4])) >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]]); XEiJ.pnlBM[da + 5] = ((p = (VideoController.vcnPal8G16H[(q = (GraphicScreen.graM4[ga + 3145733] << 12 | GraphicScreen.graM4[ga + 2097157] << 8 | GraphicScreen.graM4[ga + 1048581] << 4 | GraphicScreen.graM4[ga + 5])) >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]]); XEiJ.pnlBM[da + 6] = ((p = (VideoController.vcnPal8G16H[(q = (GraphicScreen.graM4[ga + 3145734] << 12 | GraphicScreen.graM4[ga + 2097158] << 8 | GraphicScreen.graM4[ga + 1048582] << 4 | GraphicScreen.graM4[ga + 6])) >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]]); XEiJ.pnlBM[da + 7] = ((p = (VideoController.vcnPal8G16H[(q = (GraphicScreen.graM4[ga + 3145735] << 12 | GraphicScreen.graM4[ga + 2097159] << 8 | GraphicScreen.graM4[ga + 1048583] << 4 | GraphicScreen.graM4[ga + 7])) >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]]); sx += 8; ga += 8; da += 8; } //while da<dc if (da < db) { // ........ ........ .1234567 ________ p0>>tt // ........ ........ .1234567 89abcdef p0>>tt|m8[ta0+tc]&255 p0 = (p0 >> tt | MainMemory.mmrM8[ta0 + tc] & 255) << ts; //12345678 9abcdef_ ________ ________ p0=(p0>>tt|m8[ta0+tc]&255)<<ts p1 = (p1 >> tt | MainMemory.mmrM8[ta1 + tc] & 255) << ts; //~~~~~~~~ p2 = (p2 >> tt | MainMemory.mmrM8[ta2 + tc] & 255) << ts; //ここを使う p3 = (p3 >> tt | MainMemory.mmrM8[ta3 + tc] & 255) << ts; int tp = (VideoController.VCN_TXP3[p3 >>> 24] | VideoController.VCN_TXP2[p2 >>> 24] | VideoController.VCN_TXP1[p1 >>> 24] | VideoController.VCN_TXP0[p0 >>> 24]); //符号なし右シフトで&255を省略 tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 for (int k = 0; k < 8; k++) { if ((gx & 511) == 0) { //gxが512の倍数のとき ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18); //gaを再計算する } gx++; int p, q; XEiJ.pnlBM[da] = ((p = (VideoController.vcnPal8G16H[(q = (GraphicScreen.graM4[ga + 3145728] << 12 | GraphicScreen.graM4[ga + 2097152] << 8 | GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); sx++; tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db ts -= 16; //ts=1 } //if ts==0 } //drawRaster }, //JTS //================================================================================ //XJTS // 概要 // JTS 1024ドット65536色1プレーン>テキスト>スプライト // 拡張あり XJTS { @Override public void drawRaster (int src, int dst, boolean rh) { switch (VideoController.vcnReg3Curr >>> 8 & 0b01011111) { // .A.XHPGT case 0b00010000: //JTS_XWC case 0b00010001: //JTS_XWC case 0b00010010: //JTS_XWC case 0b00010011: //JTS_XWC JTS_XWC.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00010100: //JTS_XWP case 0b00010101: //JTS_XWP case 0b00010110: //JTS_XWP case 0b00010111: //JTS_XWP JTS_XWP.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00011000: //JTS_XHC JTS.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00011001: //JTS_XHCT JTS_XHCT.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b00011101: //JTS_XHPT JTS_XHPT.drawRaster (src, dst, rh); break; // .A.XHPGT case 0b01000000: //JTS_A case 0b01000001: //JTS_A case 0b01000010: //JTS_A case 0b01000011: //JTS_A case 0b01000100: //JTS_A case 0b01000101: //JTS_A case 0b01000110: //JTS_A case 0b01000111: //JTS_A case 0b01001000: //JTS_A case 0b01001001: //JTS_A case 0b01001010: //JTS_A case 0b01001011: //JTS_A case 0b01001100: //JTS_A case 0b01001101: //JTS_A case 0b01001110: //JTS_A case 0b01001111: //JTS_A case 0b01010000: //JTS_A case 0b01010001: //JTS_A case 0b01010010: //JTS_A case 0b01010011: //JTS_A case 0b01010100: //JTS_A case 0b01010101: //JTS_A case 0b01010110: //JTS_A case 0b01010111: //JTS_A case 0b01011000: //JTS_A case 0b01011001: //JTS_A case 0b01011010: //JTS_A case 0b01011011: //JTS_A case 0b01011100: //JTS_A case 0b01011101: //JTS_A case 0b01011110: //JTS_A case 0b01011111: //JTS_A J_A.drawRaster (src, dst, rh); break; default: JTS.drawRaster (src, dst, rh); VideoController.vcnReportUnimplemented (XJTS); } //switch } //drawRaster }, //XJTS //================================================================================ //JTS_XWC ($0007,$24xx,$1070) // 概要 // JTS 1024ドット65536色1プレーン>テキスト>スプライト // XWC 優先順位に関わらず0でない1番目のパレットを偶数化(65536色は奇数化)したパレットのカラーが奇数のとき0でない1番目のパレットのカラーだけ表示する // 手順 // 1番目のパレットを奇数化したパレットのカラーが奇数のとき // 1番目のカラー(0は黒) // さもなくば(1番目のパレットを奇数化したパレットのカラーが偶数のとき) // 1番目のカラーが0でないとき // 1番目のカラー // さもなくば(1番目のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // 中間コード1 // (ls1(jpc(tod(j1p()),tod(j1p())))!=0?jpc(j1p(),j1p()):(jpc(j1p(),j1p())!=0?jpc(j1p(),j1p()):(txp()!=0?tpc(txp()):spc(spp())))) // 中間コード2 // ls1(jpc(tod(j1p()),tod(j1p())))!=0?jpc(j1p(),j1p()):jpc(j1p(),j1p())!=0?jpc(j1p(),j1p()):txp()!=0?tpc(txp()):spc(spp()) // 中間コード3 // ls1(jpc(v2=tod(v3=j1p()),v2))!=0?jpc(v3,v3):(v5=jpc(v3,v3))!=0?v5:(v6=txp())!=0?tpc(v6):spc(spp()) // 中間コード4 // ls1(jpc(p=tod(q=j1p()),p))!=0?jpc(q,q):(p=jpc(q,q))!=0?p:(p=txp())!=0?tpc(p):spc(spp()) // 中間コード5 // (jpc(p=(q=j1p())|1,p)&1)!=0?jpc(q,q):(p=jpc(q,q))!=0?p:(p=txp())!=0?tpc(p):spc(spp()) // 中間コード6 // (jpc(p=(q=j1p())|1,p)&1)!=0?jpo(q,q):(p=jpc(q,q))!=0?cto(p):(p=txp())!=0?tpo(p):spo(spp()) JTS_XWC { @Override public void drawRaster (int src, int dst, boolean rh) { SpriteScreen.sprStep3 (); int sx = 16; //スプライトx座標 int ty = CRTC.crtR11TxYZero + src & 1023; //ラスタ int tc = (ty & CRTC.crtMask3) << 7 | CRTC.crtR10TxXCurr >> 3; //テキスト桁位置 int ta0 = 0x00e00000 + ((ty & CRTC.crtMaskMinus4) << 7); //ラスタブロックアドレス int ta1 = 0x00020000 + ta0; int ta2 = 0x00040000 + ta0; int ta3 = 0x00060000 + ta0; int ts = CRTC.crtR10TxXCurr & 7; //テキスト桁境界からのずれ int gx = CRTC.crtR12GrXCurr[0]; //1024ドットx座標。溢れは無視する int gy = CRTC.crtR13GrYZero[0] + src; //1024ドットy座標。溢れは無視する int ga0 = ((gy & 511) << 9); //x=0,y&=511の1024ドットアドレス int gt = VideoController.vcnReg2Curr >> (gy >> 7 & 4); //y<512?G2nd|G1st:G4th|G3rd int da = dst << XEiJ.PNL_BM_OFFSET_BITS; //ARGB出力インデックス int db = da + XEiJ.pnlScreenWidth; //ARGB出力インデックスの終了位置 if (rh) { int half = XEiJ.pnlScreenWidth >> 4 << 3; sx += half; tc = tc + (half >> 3) & CRTC.crtMask511; gx += half; da += half; } int ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18) + (gx & 511); //1024ドットアドレス if (ts == 0) { //テキスト桁境界に合っているとき while (da < db) { int dw = Math.min (db - da, (512 - (gx & 511)) & -8); //今回の幅。8の倍数 gx += dw; //次回の1024ドットx座標 int dc = da + dw; //今回のARGB出力インデックスの終了位置 while (da < dc) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[ga + 3145728] << 12 | GraphicScreen.graM4[ga + 2097152] << 8 | GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); XEiJ.pnlBM[da + 1] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[ga + 3145729] << 12 | GraphicScreen.graM4[ga + 2097153] << 8 | GraphicScreen.graM4[ga + 1048577] << 4 | GraphicScreen.graM4[ga + 1])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]]); XEiJ.pnlBM[da + 2] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[ga + 3145730] << 12 | GraphicScreen.graM4[ga + 2097154] << 8 | GraphicScreen.graM4[ga + 1048578] << 4 | GraphicScreen.graM4[ga + 2])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]]); XEiJ.pnlBM[da + 3] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[ga + 3145731] << 12 | GraphicScreen.graM4[ga + 2097155] << 8 | GraphicScreen.graM4[ga + 1048579] << 4 | GraphicScreen.graM4[ga + 3])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]]); XEiJ.pnlBM[da + 4] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[ga + 3145732] << 12 | GraphicScreen.graM4[ga + 2097156] << 8 | GraphicScreen.graM4[ga + 1048580] << 4 | GraphicScreen.graM4[ga + 4])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]]); XEiJ.pnlBM[da + 5] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[ga + 3145733] << 12 | GraphicScreen.graM4[ga + 2097157] << 8 | GraphicScreen.graM4[ga + 1048581] << 4 | GraphicScreen.graM4[ga + 5])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]]); XEiJ.pnlBM[da + 6] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[ga + 3145734] << 12 | GraphicScreen.graM4[ga + 2097158] << 8 | GraphicScreen.graM4[ga + 1048582] << 4 | GraphicScreen.graM4[ga + 6])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]]); XEiJ.pnlBM[da + 7] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[ga + 3145735] << 12 | GraphicScreen.graM4[ga + 2097159] << 8 | GraphicScreen.graM4[ga + 1048583] << 4 | GraphicScreen.graM4[ga + 7])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]]); sx += 8; ga += 8; da += 8; } //while da<dc if (da < db) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 for (int k = 0; k < 8; k++) { if ((gx & 511) == 0) { //gxが512の倍数のとき ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18); //gaを再計算する } gx++; int p, q; XEiJ.pnlBM[da] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[ga + 3145728] << 12 | GraphicScreen.graM4[ga + 2097152] << 8 | GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); sx++; tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db } else { //テキスト桁境界に合っていないとき // ts=1のとき int tt = ts + 8; //tt=9 ts += 16; //ts=17 // ........ ........ ........ 01234567 m8[ta0+tc] int p0 = MainMemory.mmrM8[ta0 + tc] << ts; //.......0 1234567_ ________ ________ p0=m8[ta0+tc]<<ts int p1 = MainMemory.mmrM8[ta1 + tc] << ts; int p2 = MainMemory.mmrM8[ta2 + tc] << ts; int p3 = MainMemory.mmrM8[ta3 + tc] << ts; tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 while (da < db) { int dw = Math.min (db - da, (512 - (gx & 511)) & -8); //今回の幅。8の倍数 gx += dw; //次回の1024ドットx座標 int dc = da + dw; //今回のARGB出力インデックスの終了位置 while (da < dc) { // ........ ........ .1234567 ________ p0>>tt // ........ ........ .1234567 89abcdef p0>>tt|m8[ta0+tc]&255 p0 = (p0 >> tt | MainMemory.mmrM8[ta0 + tc] & 255) << ts; //12345678 9abcdef_ ________ ________ p0=(p0>>tt|m8[ta0+tc]&255)<<ts p1 = (p1 >> tt | MainMemory.mmrM8[ta1 + tc] & 255) << ts; //~~~~~~~~ p2 = (p2 >> tt | MainMemory.mmrM8[ta2 + tc] & 255) << ts; //ここを使う p3 = (p3 >> tt | MainMemory.mmrM8[ta3 + tc] & 255) << ts; int tp = (VideoController.VCN_TXP3[p3 >>> 24] | VideoController.VCN_TXP2[p2 >>> 24] | VideoController.VCN_TXP1[p1 >>> 24] | VideoController.VCN_TXP0[p0 >>> 24]); //符号なし右シフトで&255を省略 tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[ga + 3145728] << 12 | GraphicScreen.graM4[ga + 2097152] << 8 | GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); XEiJ.pnlBM[da + 1] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[ga + 3145729] << 12 | GraphicScreen.graM4[ga + 2097153] << 8 | GraphicScreen.graM4[ga + 1048577] << 4 | GraphicScreen.graM4[ga + 1])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]]); XEiJ.pnlBM[da + 2] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[ga + 3145730] << 12 | GraphicScreen.graM4[ga + 2097154] << 8 | GraphicScreen.graM4[ga + 1048578] << 4 | GraphicScreen.graM4[ga + 2])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]]); XEiJ.pnlBM[da + 3] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[ga + 3145731] << 12 | GraphicScreen.graM4[ga + 2097155] << 8 | GraphicScreen.graM4[ga + 1048579] << 4 | GraphicScreen.graM4[ga + 3])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 16 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 3]]); XEiJ.pnlBM[da + 4] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[ga + 3145732] << 12 | GraphicScreen.graM4[ga + 2097156] << 8 | GraphicScreen.graM4[ga + 1048580] << 4 | GraphicScreen.graM4[ga + 4])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 12 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 4]]); XEiJ.pnlBM[da + 5] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[ga + 3145733] << 12 | GraphicScreen.graM4[ga + 2097157] << 8 | GraphicScreen.graM4[ga + 1048581] << 4 | GraphicScreen.graM4[ga + 5])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 8 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 5]]); XEiJ.pnlBM[da + 6] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[ga + 3145734] << 12 | GraphicScreen.graM4[ga + 2097158] << 8 | GraphicScreen.graM4[ga + 1048582] << 4 | GraphicScreen.graM4[ga + 6])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 4 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 6]]); XEiJ.pnlBM[da + 7] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[ga + 3145735] << 12 | GraphicScreen.graM4[ga + 2097159] << 8 | GraphicScreen.graM4[ga + 1048583] << 4 | GraphicScreen.graM4[ga + 7])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 7]]); sx += 8; ga += 8; da += 8; } //while da<dc if (da < db) { // ........ ........ .1234567 ________ p0>>tt // ........ ........ .1234567 89abcdef p0>>tt|m8[ta0+tc]&255 p0 = (p0 >> tt | MainMemory.mmrM8[ta0 + tc] & 255) << ts; //12345678 9abcdef_ ________ ________ p0=(p0>>tt|m8[ta0+tc]&255)<<ts p1 = (p1 >> tt | MainMemory.mmrM8[ta1 + tc] & 255) << ts; //~~~~~~~~ p2 = (p2 >> tt | MainMemory.mmrM8[ta2 + tc] & 255) << ts; //ここを使う p3 = (p3 >> tt | MainMemory.mmrM8[ta3 + tc] & 255) << ts; int tp = (VideoController.VCN_TXP3[p3 >>> 24] | VideoController.VCN_TXP2[p2 >>> 24] | VideoController.VCN_TXP1[p1 >>> 24] | VideoController.VCN_TXP0[p0 >>> 24]); //符号なし右シフトで&255を省略 tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 for (int k = 0; k < 8; k++) { if ((gx & 511) == 0) { //gxが512の倍数のとき ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18); //gaを再計算する } gx++; int p, q; XEiJ.pnlBM[da] = (((VideoController.vcnPal8G16H[(p = (q = (GraphicScreen.graM4[ga + 3145728] << 12 | GraphicScreen.graM4[ga + 2097152] << 8 | GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) | 1) >> 8] | VideoController.vcnPal8G16L[p & 255]) & 1) != 0 ? VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255]] : (p = (VideoController.vcnPal8G16H[q >> 8] | VideoController.vcnPal8G16L[q & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]]); sx++; tp <<= 4; ga++; da++; } //for k } //if da<db } //while da<db ts -= 16; //ts=1 } //if ts==0 } //drawRaster }, //JTS_XWC //================================================================================ //JTS_XWP ($0007,$24xx,$1470) // 概要 // JTS 1024ドット65536色1プレーン>テキスト>スプライト // XWP 優先順位に関わらず1番目のパレットが3以上の奇数のときそれを偶数化したパレットのカラーだけ表示する // 手順 // 1番目のパレットが1以下のとき // グラフィックパレット0のカラーが0でないとき // グラフィックパレット0のカラー // さもなくば(グラフィックパレット0のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // 1番目のパレットが2以上の偶数のとき // 1番目のカラーが0でないとき // 1番目のカラー // さもなくば(1番目のカラーが0のとき) // テキストパレットが0でないとき // テキストカラー(0は黒) // さもなくば(テキストパレットが0のとき) // スプライトカラー(0は黒) // さもなくば(1番目のパレットが3以上の奇数のとき) // 1番目のパレットを偶数化したパレットのカラー(0は黒) // 中間コード1 // (j1p()<=1?(jpc(0,0)!=0?jpc(0,0):(txp()!=0?tpc(txp()):spc(spp()))):ls1(j1p())==0?(jpc(j1p(),j1p())!=0?jpc(j1p(),j1p()):(txp()!=0?tpc(txp()):spc(spp()))):jpc(tev(j1p()),tev(j1p()))) // 中間コード2 // j1p()<=1?jpc(0,0)!=0?jpc(0,0):txp()!=0?tpc(txp()):spc(spp()):ls1(j1p())==0?jpc(j1p(),j1p())!=0?jpc(j1p(),j1p()):txp()!=0?tpc(txp()):spc(spp()):jpc(tev(j1p()),tev(j1p())) // 中間コード3 // (v0=j1p())<=1?(v1=jpc(0,0))!=0?v1:(v2=txp())!=0?tpc(v2):spc(spp()):ls1(v0)==0?(v7=jpc(v0,v0))!=0?v7:(v8=txp())!=0?tpc(v8):spc(spp()):jpc(v13=tev(v0),v13) // 中間コード4 // (p=j1p())<=1?(p=jpc(0,0))!=0?p:(p=txp())!=0?tpc(p):spc(spp()):ls1(p)==0?(q=jpc(p,p))!=0?q:(p=txp())!=0?tpc(p):spc(spp()):jpc(q=tev(p),q) // 中間コード5 // (p=j1p())<=1?(p=jpc(0,0))!=0?p:(p=txp())!=0?tpc(p):spc(spp()):(p&1)==0?(q=jpc(p,p))!=0?q:(p=txp())!=0?tpc(p):spc(spp()):jpc(q=p&-2,q) // 中間コード6 // (p=j1p())<=1?(p=jpc(0,0))!=0?cto(p):(p=txp())!=0?tpo(p):spo(spp()):(p&1)==0?(q=jpc(p,p))!=0?cto(q):(p=txp())!=0?tpo(p):spo(spp()):jpo(q=p&-2,q) JTS_XWP { @Override public void drawRaster (int src, int dst, boolean rh) { SpriteScreen.sprStep3 (); int sx = 16; //スプライトx座標 int ty = CRTC.crtR11TxYZero + src & 1023; //ラスタ int tc = (ty & CRTC.crtMask3) << 7 | CRTC.crtR10TxXCurr >> 3; //テキスト桁位置 int ta0 = 0x00e00000 + ((ty & CRTC.crtMaskMinus4) << 7); //ラスタブロックアドレス int ta1 = 0x00020000 + ta0; int ta2 = 0x00040000 + ta0; int ta3 = 0x00060000 + ta0; int ts = CRTC.crtR10TxXCurr & 7; //テキスト桁境界からのずれ int gx = CRTC.crtR12GrXCurr[0]; //1024ドットx座標。溢れは無視する int gy = CRTC.crtR13GrYZero[0] + src; //1024ドットy座標。溢れは無視する int ga0 = ((gy & 511) << 9); //x=0,y&=511の1024ドットアドレス int gt = VideoController.vcnReg2Curr >> (gy >> 7 & 4); //y<512?G2nd|G1st:G4th|G3rd int da = dst << XEiJ.PNL_BM_OFFSET_BITS; //ARGB出力インデックス int db = da + XEiJ.pnlScreenWidth; //ARGB出力インデックスの終了位置 if (rh) { int half = XEiJ.pnlScreenWidth >> 4 << 3; sx += half; tc = tc + (half >> 3) & CRTC.crtMask511; gx += half; da += half; } int ga = ga0 + ((gt >> (gx >> 8 & 2) & 3) << 18) + (gx & 511); //1024ドットアドレス if (ts == 0) { //テキスト桁境界に合っているとき while (da < db) { int dw = Math.min (db - da, (512 - (gx & 511)) & -8); //今回の幅。8の倍数 gx += dw; //次回の1024ドットx座標 int dc = da + dw; //今回のARGB出力インデックスの終了位置 while (da < dc) { int tp = (VideoController.VCN_TXP3[MainMemory.mmrM8[ta3 + tc] & 255] | VideoController.VCN_TXP2[MainMemory.mmrM8[ta2 + tc] & 255] | VideoController.VCN_TXP1[MainMemory.mmrM8[ta1 + tc] & 255] | VideoController.VCN_TXP0[MainMemory.mmrM8[ta0 + tc] & 255]); tc = tc + 1 & CRTC.crtMask511; //次回のテキスト桁位置 int p, q; XEiJ.pnlBM[da] = ((p = (GraphicScreen.graM4[ga + 3145728] << 12 | GraphicScreen.graM4[ga + 2097152] << 8 | GraphicScreen.graM4[ga + 1048576] << 4 | GraphicScreen.graM4[ga])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 28) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 1] = ((p = (GraphicScreen.graM4[ga + 3145729] << 12 | GraphicScreen.graM4[ga + 2097153] << 8 | GraphicScreen.graM4[ga + 1048577] << 4 | GraphicScreen.graM4[ga + 1])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 24 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 1]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]); XEiJ.pnlBM[da + 2] = ((p = (GraphicScreen.graM4[ga + 3145730] << 12 | GraphicScreen.graM4[ga + 2097154] << 8 | GraphicScreen.graM4[ga + 1048578] << 4 | GraphicScreen.graM4[ga + 2])) <= 1 ? (p = (VideoController.vcnPal8G16H[0 >> 8] | VideoController.vcnPal8G16L[0 & 255])) != 0 ? VideoController.vcnPalTbl[p] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : (p & 1) == 0 ? (q = (VideoController.vcnPal8G16H[p >> 8] | VideoController.vcnPal8G16L[p & 255])) != 0 ? VideoController.vcnPalTbl[q] : (p = tp >>> 20 & 15) != 0 ? VideoController.vcnPal32TS[p] : VideoController.vcnPal32TS[SpriteScreen.sprBuffer[sx + 2]] : VideoController.vcnPalTbl[ VideoController.vcnPal8G16H[(q = p & -2) >> 8] | VideoController.vcnPal8G16L[q & 255]]);